Get image spoiler support done.

This commit is contained in:
Nicolas Stepien 2012-01-19 02:14:44 +01:00
parent 8b780c9f94
commit 53dc2d6cd3
2 changed files with 67 additions and 18 deletions

View File

@ -1201,6 +1201,7 @@
qr = { qr = {
init: function() { init: function() {
if (!$('form[name=post]')) return; if (!$('form[name=post]')) return;
qr.spoiler = !!$('#com_submit + label');
g.callbacks.push(function(root) { g.callbacks.push(function(root) {
return $.on($('.quotejs + .quotejs', root), 'click', qr.quote); return $.on($('.quotejs + .quotejs', root), 'click', qr.quote);
}); });
@ -1221,7 +1222,7 @@
} }
}, },
close: function() { close: function() {
var i, _i, _len, _ref; var i, spoiler, _i, _len, _ref;
qr.el.hidden = true; qr.el.hidden = true;
d.activeElement.blur(); d.activeElement.blur();
$.removeClass(qr.el, 'dump'); $.removeClass(qr.el, 'dump');
@ -1231,6 +1232,7 @@
qr.replies[0].rm(); qr.replies[0].rm();
} }
qr.resetFileInput(); qr.resetFileInput();
if ((spoiler = $.id('spoiler')).checked) spoiler.click();
return qr.cleanError(); return qr.cleanError();
}, },
hide: function() { hide: function() {
@ -1328,12 +1330,12 @@
function _Class(file) { function _Class(file) {
var previous, _ref, var previous, _ref,
_this = this; _this = this;
_ref = (previous = qr.replies[qr.replies.length - 1]) ? [previous.name, /^sage$/.test(previous.email) ? null : previous.email, conf['Remember Subject'] ? previous.sub : null] : [$.get("qr_name", null), $.get("qr_email", null), conf['Remember Subject'] ? $.get("qr_sub", null) : null], this.name = _ref[0], this.email = _ref[1], this.sub = _ref[2];
this.com = null; this.com = null;
_ref = (previous = qr.replies[qr.replies.length - 1]) ? [previous.name, /^sage$/.test(previous.email) ? null : previous.email, conf['Remember Subject'] ? previous.sub : null, conf['Remember Spoiler'] ? previous.spoiler : false] : [$.get("qr_name", null), $.get("qr_email", null), conf['Remember Subject'] ? $.get("qr_sub", null) : null, false], this.name = _ref[0], this.email = _ref[1], this.sub = _ref[2], this.spoiler = _ref[3];
this.el = $.el('a', { this.el = $.el('a', {
className: 'preview', className: 'preview',
href: 'javascript:;', href: 'javascript:;',
innerHTML: '<a class=remove>x</a><label hidden><input type=checkbox></label><span></span>' innerHTML: "<a class=remove>x</a><label hidden><input type=checkbox" + (this.spoiler ? ' checked' : '') + "> Spoiler</label><span></span>"
}); });
$.on(this.el, 'click', function() { $.on(this.el, 'click', function() {
return _this.select(); return _this.select();
@ -1342,6 +1344,15 @@
e.stopPropagation(); e.stopPropagation();
return _this.rm(); return _this.rm();
}); });
$.on($('label', this.el), 'click', function(e) {
return e.stopPropagation();
});
$.on($('input', this.el), 'change', function(e) {
_this.spoiler = e.target.checked;
if (_this.el.id === 'selected') {
return $.id('spoiler').checked = _this.spoiler;
}
});
if (file) this.setFile(file); if (file) this.setFile(file);
$.before($('#addReply', qr.el), this.el); $.before($('#addReply', qr.el), this.el);
qr.replies.push(this); qr.replies.push(this);
@ -1355,6 +1366,7 @@
this.el.style.backgroundImage = null; this.el.style.backgroundImage = null;
return; return;
} }
if (qr.spoiler) $('label', this.el).hidden = false;
url = window.URL || window.webkitURL; url = window.URL || window.webkitURL;
url.revokeObjectURL(this.url); url.revokeObjectURL(this.url);
this.url = url.createObjectURL(file); this.url = url.createObjectURL(file);
@ -1362,17 +1374,16 @@
}; };
_Class.prototype.select = function() { _Class.prototype.select = function() {
var data, _i, _len, _ref, _ref2, _results; var data, _i, _len, _ref, _ref2;
if ((_ref = qr.selected) != null) _ref.el.id = null; if ((_ref = qr.selected) != null) _ref.el.id = null;
qr.selected = this; qr.selected = this;
this.el.id = 'selected'; this.el.id = 'selected';
_ref2 = ['name', 'email', 'sub', 'com']; _ref2 = ['name', 'email', 'sub', 'com'];
_results = [];
for (_i = 0, _len = _ref2.length; _i < _len; _i++) { for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
data = _ref2[_i]; data = _ref2[_i];
_results.push($("[name=" + data + "]", qr.el).value = this[data]); $("[name=" + data + "]", qr.el).value = this[data];
} }
return _results; return $('#spoiler', qr.el).checked = this.spoiler;
}; };
_Class.prototype.rm = function() { _Class.prototype.rm = function() {
@ -1415,7 +1426,7 @@
} }
}); });
qr.mimeTypes = mimeTypes.split(', '); qr.mimeTypes = mimeTypes.split(', ');
qr.el = ui.dialog('qr', 'top:0;right:0;', "<div class=move> Quick Reply <input type=checkbox name=autohide id=autohide title=Auto-hide> <span>" + (g.REPLY ? '' : threads) + " <a class=close>x</a></span></div><form> <div><input id=dump class=field type=button title='Dump mode' value=+><input name=name title=Name placeholder=Name class=field size=1><input name=email title=E-mail placeholder=E-mail class=field size=1><input name=sub title=Subject placeholder=Subject class=field size=1></div> <output id=replies><div><a id=addReply href=javascript:;>+</a></div></output> <div><textarea name=com title=Comment placeholder=Comment class=field></textarea></div> <div class=captcha><img></div> <div><input name=captcha title=Verification placeholder=Verification class=field size=1></div> <div><input type=file name=upfile max=" + ($('[name=MAX_FILE_SIZE]').value) + " accept='" + mimeTypes + "' multiple><input type=submit value=" + (g.dead ? '404 disabled' : 'Submit') + "></div> <div class=error></div></form>"); qr.el = ui.dialog('qr', 'top:0;right:0;', "<div class=move> Quick Reply <input type=checkbox name=autohide id=autohide title=Auto-hide> <span>" + (g.REPLY ? '' : threads) + " <a class=close>x</a></span></div><form> <div><input id=dump class=field type=button title='Dump mode' value=+><input name=name title=Name placeholder=Name class=field size=1><input name=email title=E-mail placeholder=E-mail class=field size=1><input name=sub title=Subject placeholder=Subject class=field size=1></div> <output id=replies><div><a id=addReply href=javascript:;>+</a></div></output> <div><textarea name=com title=Comment placeholder=Comment class=field></textarea></div> <div class=captcha><img></div> <div><input name=captcha title=Verification placeholder=Verification class=field size=1></div> <div><input type=file name=upfile max=" + ($('[name=MAX_FILE_SIZE]').value) + " accept='" + mimeTypes + "' multiple><input type=submit value=" + (g.dead ? '404 disabled' : 'Submit') + "></div> <label" + (qr.spoiler ? '' : ' hidden') + "><input type=checkbox id=spoiler> Spoiler Image?</label> <div class=error></div></form>");
if (!g.REPLY) { if (!g.REPLY) {
$.on($('select', qr.el), 'mousedown', function(e) { $.on($('select', qr.el), 'mousedown', function(e) {
return e.stopPropagation(); return e.stopPropagation();
@ -1434,6 +1445,9 @@
return qr.selected.el.lastChild.textContent = this.value; return qr.selected.el.lastChild.textContent = this.value;
}); });
$.on($('[type=file]', qr.el), 'change', qr.fileInput); $.on($('[type=file]', qr.el), 'change', qr.fileInput);
$.on($('#spoiler', qr.el), 'change', function() {
return $('input', qr.selected.el).click();
});
new qr.reply().select(); new qr.reply().select();
_ref2 = ['name', 'email', 'sub', 'com']; _ref2 = ['name', 'email', 'sub', 'com'];
for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) { for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
@ -3144,7 +3158,7 @@ a[href="javascript:;"] {\
background: -o-linear-gradient(#CCC, #DDD);\ background: -o-linear-gradient(#CCC, #DDD);\
background: linear-gradient(#CCC, #DDD);\ background: linear-gradient(#CCC, #DDD);\
}\ }\
#qr:not(.dump) output {\ #qr:not(.dump) output, .dump > form > label {\
display: none;\ display: none;\
}\ }\
#replies {\ #replies {\
@ -3174,6 +3188,7 @@ a[href="javascript:;"] {\
margin: 5px; padding: 2px;\ margin: 5px; padding: 2px;\
opacity: .5;\ opacity: .5;\
overflow: hidden;\ overflow: hidden;\
position: relative;\
text-shadow: 0 1px 1px #000;\ text-shadow: 0 1px 1px #000;\
-webkit-transition: opacity .25s;\ -webkit-transition: opacity .25s;\
-moz-transition: opacity .25s;\ -moz-transition: opacity .25s;\
@ -3198,6 +3213,16 @@ a[href="javascript:;"] {\
.remove:hover::after {\ .remove:hover::after {\
content: " Remove";\ content: " Remove";\
}\ }\
.preview > label {\
background: rgba(0,0,0,.5);\
color: #FFF;\
right: 0; bottom: 0; left: 0;\
position: absolute;\
text-align: center;\
}\
.preview > label > input {\
margin: 0;\
}\
#addReply {\ #addReply {\
color: #333;\ color: #333;\
font-size: 3.5em;\ font-size: 3.5em;\

View File

@ -875,6 +875,7 @@ nav =
qr = qr =
init: -> init: ->
return unless $ 'form[name=post]' return unless $ 'form[name=post]'
qr.spoiler = !!$ '#com_submit + label'
g.callbacks.push (root) -> g.callbacks.push (root) ->
$.on $('.quotejs + .quotejs', root), 'click', qr.quote $.on $('.quotejs + .quotejs', root), 'click', qr.quote
if conf['Persistent QR'] if conf['Persistent QR']
@ -897,6 +898,7 @@ qr =
for i in qr.replies for i in qr.replies
qr.replies[0].rm() qr.replies[0].rm()
qr.resetFileInput() qr.resetFileInput()
spoiler.click() if (spoiler = $.id 'spoiler').checked
qr.cleanError() qr.cleanError()
hide: -> hide: ->
if $.id('autohide').checked if $.id('autohide').checked
@ -978,41 +980,49 @@ qr =
resetFileInput: -> resetFileInput: ->
$('[type=file]', qr.el).value = null $('[type=file]', qr.el).value = null
replies: [] replies: []
reply: class reply: class
constructor: (file) -> constructor: (file) ->
# set values, or null, to avoid 'undefined' values in inputs # set values, or null, to avoid 'undefined' values in inputs
[@name, @email, @sub] = @com = null
[@name, @email, @sub, @spoiler] =
if previous = qr.replies[qr.replies.length-1] if previous = qr.replies[qr.replies.length-1]
[ [
previous.name, previous.name,
if /^sage$/.test(previous.email) then null else previous.email, if /^sage$/.test(previous.email) then null else previous.email,
if conf['Remember Subject'] then previous.sub else null if conf['Remember Subject'] then previous.sub else null,
if conf['Remember Spoiler'] then previous.spoiler else false
] ]
else else
[ [
$.get("qr_name", null), $.get("qr_name", null),
$.get("qr_email", null), $.get("qr_email", null),
if conf['Remember Subject'] then $.get("qr_sub", null) else null if conf['Remember Subject'] then $.get("qr_sub", null) else null,
false
] ]
@com = null
@el = $.el 'a', @el = $.el 'a',
className: 'preview' className: 'preview'
href: 'javascript:;' href: 'javascript:;'
innerHTML: '<a class=remove>x</a><label hidden><input type=checkbox></label><span></span>' innerHTML: "<a class=remove>x</a><label hidden><input type=checkbox#{if @spoiler then ' checked' else ''}> Spoiler</label><span></span>"
$.on @el, 'click', => @select() $.on @el, 'click', => @select()
$.on $('.remove', @el), 'click', (e) => $.on $('.remove', @el), 'click', (e) =>
e.stopPropagation() e.stopPropagation()
@rm() @rm()
$.on $('label', @el), 'click', (e) -> e.stopPropagation()
$.on $('input', @el), 'change', (e) =>
@spoiler = e.target.checked
$.id('spoiler').checked = @spoiler if @el.id is 'selected'
@setFile file if file @setFile file if file
$.before $('#addReply', qr.el), @el $.before $('#addReply', qr.el), @el
qr.replies.push @ qr.replies.push @
setFile: (@file) -> setFile: (@file) ->
@el.title = file.name @el.title = file.name
if file.type is 'application/pdf' if file.type is 'application/pdf'
@el.style.backgroundImage = null @el.style.backgroundImage = null
return return
$('label', @el).hidden = false if qr.spoiler
url = window.URL or window.webkitURL url = window.URL or window.webkitURL
url.revokeObjectURL @url url.revokeObjectURL @url
@url = url.createObjectURL file @url = url.createObjectURL file
@ -1023,6 +1033,7 @@ qr =
@el.id = 'selected' @el.id = 'selected'
for data in ['name', 'email', 'sub', 'com'] for data in ['name', 'email', 'sub', 'com']
$("[name=#{data}]", qr.el).value = @[data] $("[name=#{data}]", qr.el).value = @[data]
$('#spoiler', qr.el).checked = @spoiler
rm: -> rm: ->
$.rm @el $.rm @el
index = qr.replies.indexOf @ index = qr.replies.indexOf @
@ -1065,6 +1076,7 @@ qr =
<div class=captcha><img></div> <div class=captcha><img></div>
<div><input name=captcha title=Verification placeholder=Verification class=field size=1></div> <div><input name=captcha title=Verification placeholder=Verification class=field size=1></div>
<div><input type=file name=upfile max=#{$('[name=MAX_FILE_SIZE]').value} accept='#{mimeTypes}' multiple><input type=submit value=#{if g.dead then '404 disabled' else 'Submit'}></div> <div><input type=file name=upfile max=#{$('[name=MAX_FILE_SIZE]').value} accept='#{mimeTypes}' multiple><input type=submit value=#{if g.dead then '404 disabled' else 'Submit'}></div>
<label#{if qr.spoiler then '' else ' hidden'}><input type=checkbox id=spoiler> Spoiler Image?</label>
<div class=error></div> <div class=error></div>
</form>" </form>"
unless g.REPLY unless g.REPLY
@ -1076,6 +1088,7 @@ qr =
$.on $('form', qr.el), 'submit', qr.submit $.on $('form', qr.el), 'submit', qr.submit
$.on $('textarea', qr.el), 'change', -> qr.selected.el.lastChild.textContent = @value $.on $('textarea', qr.el), 'change', -> qr.selected.el.lastChild.textContent = @value
$.on $('[type=file]', qr.el), 'change', qr.fileInput $.on $('[type=file]', qr.el), 'change', qr.fileInput
$.on $('#spoiler', qr.el), 'change', -> $('input', qr.selected.el).click()
new qr.reply().select() new qr.reply().select()
# save selected reply's data # save selected reply's data
@ -2489,7 +2502,7 @@ a[href="javascript:;"] {
background: -o-linear-gradient(#CCC, #DDD); background: -o-linear-gradient(#CCC, #DDD);
background: linear-gradient(#CCC, #DDD); background: linear-gradient(#CCC, #DDD);
} }
#qr:not(.dump) output { #qr:not(.dump) output, .dump > form > label {
display: none; display: none;
} }
#replies { #replies {
@ -2519,6 +2532,7 @@ a[href="javascript:;"] {
margin: 5px; padding: 2px; margin: 5px; padding: 2px;
opacity: .5; opacity: .5;
overflow: hidden; overflow: hidden;
position: relative;
text-shadow: 0 1px 1px #000; text-shadow: 0 1px 1px #000;
-webkit-transition: opacity .25s; -webkit-transition: opacity .25s;
-moz-transition: opacity .25s; -moz-transition: opacity .25s;
@ -2543,6 +2557,16 @@ a[href="javascript:;"] {
.remove:hover::after { .remove:hover::after {
content: " Remove"; content: " Remove";
} }
.preview > label {
background: rgba(0,0,0,.5);
color: #FFF;
right: 0; bottom: 0; left: 0;
position: absolute;
text-align: center;
}
.preview > label > input {
margin: 0;
}
#addReply { #addReply {
color: #333; color: #333;
font-size: 3.5em; font-size: 3.5em;