diff --git a/src/Archive/Redirect.coffee b/src/Archive/Redirect.coffee
index 851213c05..be7075234 100644
--- a/src/Archive/Redirect.coffee
+++ b/src/Archive/Redirect.coffee
@@ -18,20 +18,18 @@ Redirect =
thread: {}
post: {}
file: {}
- report: {}
archives = {}
for data in Conf['archives']
for key in ['boards', 'files']
data[key] = [] unless data[key] instanceof Array
- {uid, name, boards, files, software, report} = data
+ {uid, name, boards, files, software} = data
continue unless software in ['fuuka', 'foolfuuka']
archives[JSON.stringify(uid ? name)] = data
for boardID in boards
o.thread[boardID] = data unless boardID of o.thread
o.post[boardID] = data unless boardID of o.post or software isnt 'foolfuuka'
o.file[boardID] = data unless boardID of o.file or boardID not in files
- o.report[boardID] = data unless boardID of o.report or not report
for boardID, record of Conf['selectedArchives']
for type, id of record when (archive = archives[JSON.stringify id])
@@ -154,10 +152,13 @@ Redirect =
"#{boardID}/?task=search2&search_#{type}=#{value}"
"#{Redirect.protocol archive}#{archive.domain}/#{path}"
- report: (archive, {boardID, postID}) ->
- {report} = archive
- return '' unless /^https?:\/\//.test(report)
- report.replace(/%board/g, boardID).replace(/%post/g, postID)
+ report: (boardID) ->
+ urls = []
+ for archive in Conf['archives']
+ {software, https, reports, boards, name, domain} = archive
+ if software is 'foolfuuka' and https and reports and boards instanceof Array and boardID in boards
+ urls.push [name, "https://#{domain}/_/api/chan/offsite_report/"]
+ urls
securityCheck: (url) ->
/^https:\/\//.test(url) or
diff --git a/src/Menu/ReportLink.coffee b/src/Menu/ReportLink.coffee
index cb666a535..42b927826 100644
--- a/src/Menu/ReportLink.coffee
+++ b/src/Menu/ReportLink.coffee
@@ -5,27 +5,20 @@ ReportLink =
a = $.el 'a',
className: 'report-link'
href: 'javascript:;'
+ textContent: 'Report'
$.on a, 'click', ReportLink.report
Menu.menu.addEntry
el: a
order: 10
open: (post) ->
- unless post.isDead or (post.thread.isDead and not post.thread.isArchived)
- a.textContent = 'Report'
- ReportLink.url = "//sys.4chan.org/#{post.board}/imgboard.php?mode=report&no=#{post}"
- if (Conf['Use Recaptcha v1 in Reports'] and Main.jsEnabled) or d.cookie.indexOf('pass_enabled=1') >= 0
- ReportLink.url += '&altc=1'
- ReportLink.dims = 'width=350,height=275'
- else
- ReportLink.dims = 'width=400,height=550'
- else if Conf['Archive Report']
- a.textContent = 'Report to archive'
- ReportLink.url = Redirect.to 'report', {boardID: post.board.ID, postID: post.ID}
- ReportLink.dims = 'width=700,height=475'
+ ReportLink.url = "//sys.4chan.org/#{post.board}/imgboard.php?mode=report&no=#{post}"
+ if (Conf['Use Recaptcha v1 in Reports'] and Main.jsEnabled) or d.cookie.indexOf('pass_enabled=1') >= 0
+ ReportLink.url += '&altc=1'
+ ReportLink.dims = 'width=350,height=275'
else
- ReportLink.url = ''
- !!ReportLink.url
+ ReportLink.dims = 'width=400,height=550'
+ true
report: ->
{url, dims} = ReportLink
diff --git a/src/Miscellaneous/Report.coffee b/src/Miscellaneous/Report.coffee
index 429bac735..8a6ff5680 100644
--- a/src/Miscellaneous/Report.coffee
+++ b/src/Miscellaneous/Report.coffee
@@ -10,16 +10,14 @@ Report =
Report.archive() if Conf['Archive Report']
- if not Conf['Use Recaptcha v1 in Reports'] and not Conf['Force Noscript Captcha'] and Main.jsEnabled
- new MutationObserver(->
- Report.fit 'iframe[src^="https://www.google.com/recaptcha/api2/frame"]'
- Report.fit 'body'
- ).observe d.body,
- childList: true
- attributes: true
- subtree: true
- else
+ new MutationObserver(->
+ Report.fit 'iframe[src^="https://www.google.com/recaptcha/api2/frame"]'
Report.fit 'body'
+ ).observe d.body,
+ childList: true
+ attributes: true
+ subtree: true
+ Report.fit 'body'
fit: (selector) ->
return if not ((el = $ selector, doc) and getComputedStyle(el).visibility isnt 'hidden')
@@ -27,24 +25,78 @@ Report =
window.resizeBy 0, dy if dy > 0
archive: ->
- Redirect.init()
- return unless (url = Redirect.to 'report', {boardID: g.BOARD.ID, postID: Report.postID})
+ return unless (urls = Redirect.report g.BOARD.ID).length
- if (message = $ 'h3') and /Report submitted!/.test(message.textContent)
- if location.hash is '#redirect'
- $.globalEval 'self.close = function(){};'
- window.resizeTo 700, 475
- Redirect.navigate 'report', {boardID: g.BOARD.ID, postID: Report.postID}
- return
+ form = $ 'form'
+ types = $.id 'reportTypes'
+ message = $ 'h3'
- link = $.el 'a',
- href: url
- textContent: 'Report to archive'
- $.on link, 'click', (e) ->
- unless e.shiftKey or e.altKey or e.ctrlKey or e.metaKey or e.button isnt 0
- window.resizeTo 700, 475
- $.add d.body, [$.tn(' ['), link, $.tn(']')]
+ fieldset = $.el 'fieldset',
+ id: 'archive-report'
+ hidden: true
+ ,
+ <%= readHTML('ArchiveReport.html') %>
+ enabled = $ '#archive-report-enabled', fieldset
+ reason = $ '#archive-report-reason', fieldset
+ submit = $ '#archive-report-submit', fieldset
- if types = $.id('reportTypes')
+ if form and types
+ fieldset.hidden = !$('[value=illegal]', types).checked
$.on types, 'change', (e) ->
- $('form').action = if e.target.value is 'illegal' then '#redirect' else ''
+ fieldset.hidden = (e.target.value isnt 'illegal')
+ Report.fit 'body'
+ $.after types, fieldset
+ Report.fit 'body'
+ $.one form, 'submit', (e) ->
+ if !fieldset.hidden and enabled.checked
+ e.preventDefault()
+ Report.archiveSubmit urls, reason.value, (results) =>
+ @action = '#archiveresults=' + encodeURIComponent JSON.stringify results
+ @submit()
+ else if message
+ enabled.checked = false
+ fieldset.hidden = false
+ $.on enabled, 'change', ->
+ submit.hidden = !@checked
+ $.after message, fieldset
+ $.on submit, 'click', ->
+ Report.archiveSubmit urls, reason.value, Report.archiveResults
+
+ if (match = location.hash.match /^#archiveresults=(.*)$/)
+ try
+ Report.archiveResults JSON.parse decodeURIComponent match[1]
+
+ archiveSubmit: (urls, reason, cb) ->
+ form = $.formData
+ board: g.BOARD.ID
+ num: Report.postID
+ reason: reason
+ results = []
+ for [name, url] in urls
+ do (name, url) ->
+ $.ajax url,
+ responseType: 'json'
+ onloadend: ->
+ results.push [name, @response or {error: ''}]
+ if results.length is urls.length
+ cb results
+ ,
+ {form}
+ return
+
+ archiveResults: (results) ->
+ fieldset = $.id 'archive-report'
+ for [name, response] in results
+ line = $.el 'h3',
+ className: 'archive-report-response'
+ if 'success' of response
+ $.addClass line, 'archive-report-success'
+ line.textContent = "#{name}: #{response.success}"
+ else
+ $.addClass line, 'archive-report-error'
+ line.textContent = "#{name}: #{response.error or 'Error reporting post.'}"
+ if fieldset
+ $.before fieldset, line
+ else
+ $.add d.body, line
+ return
diff --git a/src/Miscellaneous/Report/ArchiveReport.html b/src/Miscellaneous/Report/ArchiveReport.html
new file mode 100644
index 000000000..7fddd4620
--- /dev/null
+++ b/src/Miscellaneous/Report/ArchiveReport.html
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/css/report.css b/src/css/report.css
index 30b1402c6..e72ded8dd 100644
--- a/src/css/report.css
+++ b/src/css/report.css
@@ -5,3 +5,24 @@
#captchaContainerAlt td:nth-child(2) {
display: table-cell !important;
}
+
+/* Archive reports */
+#archive-report {
+ padding: 3px;
+}
+#archive-report-enabled {
+ vertical-align: middle;
+}
+#archive-report > label {
+ display: block;
+}
+#archive-report-reason {
+ display: block;
+ width: 98%;
+}
+.archive-report-success {
+ color: green;
+}
+.archive-report-error {
+ color: red;
+}
\ No newline at end of file