From 6dd80c26b18ca8b0e0bfeffe622f4bdc19d24a5f Mon Sep 17 00:00:00 2001 From: Pierre Bondoerffer Date: Mon, 12 Jun 2017 12:00:39 +0200 Subject: [PATCH 01/12] Make editing more visible --- www/poll/main.js | 10 ++++++++-- www/poll/poll.css | 8 ++++++-- www/poll/poll.less | 10 +++++++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/www/poll/main.js b/www/poll/main.js index eb0edef26..1ff7638d5 100644 --- a/www/poll/main.js +++ b/www/poll/main.js @@ -107,12 +107,15 @@ define([ }; var unlockElements = function () { + var $input; APP.editable.row.forEach(function (id) { - $('input[type="text"][disabled="disabled"][data-rt-id="' + id + '"]').removeAttr('disabled'); + $input = $('input[type="text"][disabled="disabled"][data-rt-id="' + id + '"]').removeAttr('disabled'); + $input.parent().parent().addClass('editing'); $('span.edit[data-rt-id="' + id + '"]').css('visibility', 'hidden'); }); APP.editable.col.forEach(function (id) { - $('input[disabled="disabled"][data-rt-id^="' + id + '"]').removeAttr('disabled'); + $input = $('input[disabled="disabled"][data-rt-id^="' + id + '"]').removeAttr('disabled'); + $input.parent().addClass('editing'); $('input[type="checkbox"][data-rt-id^="' + id + '"]').addClass('enabled'); $('.lock[data-rt-id="' + id + '"]').addClass('fa-unlock').removeClass('fa-lock').attr('title', Messages.poll_unlocked); }); @@ -296,6 +299,7 @@ define([ $('.lock[data-rt-id!="' + APP.userid + '"]').addClass('fa-lock').removeClass('fa-unlock').attr('title', Messages.poll_locked); var $cells = APP.$table.find('thead td:not(.uncommitted), tbody td'); $cells.find('[type="text"][data-rt-id!="' + APP.userid + '"]').attr('disabled', true); + $cells.removeClass('editing'); $('.edit[data-rt-id!="' + APP.userid + '"]').css('visibility', 'visible'); APP.editable.col = [APP.userid]; APP.editable.row = []; @@ -352,6 +356,8 @@ define([ e.stopPropagation(); if (!APP.ready) { return; } + if (e.which !== 1) { return; } + var target = e && e.target; if (!target) { return void debug("NO TARGET"); } diff --git a/www/poll/poll.css b/www/poll/poll.css index 3e534d5e2..a019dabe3 100644 --- a/www/poll/poll.css +++ b/www/poll/poll.css @@ -170,6 +170,10 @@ div.realtime table { border-collapse: collapse; width: calc(100% - 1px); } +form.realtime table .editing, +div.realtime table .editing { + background-color: #88b8cc; +} form.realtime table tr td:first-child, div.realtime table tr td:first-child { position: absolute; @@ -298,8 +302,8 @@ div.realtime table thead td input[type="text"][disabled] { color: #000; border: 1px solid transparent; } -form.realtime table tbody .text-cell, -div.realtime table tbody .text-cell { +form.realtime table tbody td:not(.editing) .text-cell, +div.realtime table tbody td:not(.editing) .text-cell { background: #aaa; } form.realtime table tbody .text-cell input[type="text"], diff --git a/www/poll/poll.less b/www/poll/poll.less index 699e96e03..d1979a958 100644 --- a/www/poll/poll.less +++ b/www/poll/poll.less @@ -4,6 +4,7 @@ @poll-th-bg: #aaa; @poll-th-user-bg: #999; @poll-td-bg: #aaa; +@poll-editing: #88b8cc; @poll-placeholder: #666; @poll-border-color: #555; @poll-cover-color: #000; @@ -195,6 +196,9 @@ form.realtime, div.realtime { table { border-collapse: collapse; width: ~"calc(100% - 1px)"; + .editing { + background-color: @poll-editing; + } tr { td:first-child { position:absolute; @@ -327,8 +331,12 @@ form.realtime, div.realtime { } tbody { + td:not(.editing) { + .text-cell { + background: @poll-td-bg; + } + } .text-cell { - background: @poll-td-bg; //border-radius: 20px 0 0 20px; input[type="text"] { width: ~"calc(100% - 50px)"; From 6bc191725ff232e79885d85d3e5fa35161d9f956 Mon Sep 17 00:00:00 2001 From: Pierre Bondoerffer Date: Mon, 12 Jun 2017 12:37:07 +0200 Subject: [PATCH 02/12] poll: support disconnect and fix trash button --- www/poll/main.js | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/www/poll/main.js b/www/poll/main.js index 1ff7638d5..2d848f17d 100644 --- a/www/poll/main.js +++ b/www/poll/main.js @@ -46,7 +46,8 @@ define([ editable: { row: [], col: [] - } + }, + locked: false }; var sortColumns = function (order, firstcol) { @@ -293,6 +294,7 @@ define([ }; var hideInputs = function (target, isKeyup) { + if (APP.locked) { return; } if (!isKeyup && $(target).is('[type="text"]')) { return; } @@ -353,10 +355,13 @@ define([ }; var handleClick = function (e, isKeyup) { + if (APP.locked) { return; } + e.stopPropagation(); if (!APP.ready) { return; } - if (e.which !== 1) { return; } + if (!isKeyup && e.which !== 1) { return; } + var target = e && e.target; @@ -533,7 +538,10 @@ var ready = function (info, userid, readOnly) { .click(handleClick) .on('keyup', function (e) { handleClick(e, true); }); - $(window).click(hideInputs); + $(window).click(function(e) { + if (e.which !== 1) { return; } + hideInputs(); + }); proxy .on('change', ['info'], function (o, n, p) { @@ -576,14 +584,33 @@ var ready = function (info, userid, readOnly) { UserList.getLastName(APP.toolbar.$userNameButton, isNew); }; +var setEditable = function (editable) { + APP.locked = !editable; + + if (editable === false) { + // disable all the things + $('.realtime input, .realtime button').attr('disabled', APP.locked); + $('span.edit, span.remove').hide(); + $('span.lock').addClass('fa-lock').removeClass('fa-unlock') + .attr('title', Messages.poll_locked) + .css({'cursor': 'default'}); + } else { + // enable + $('span.edit, span.remove').show(); + $('span.lock').css({'cursor': ''}); + $('.realtime button').attr('disabled', APP.locked); + unlockElements(); + } +}; + var disconnect = function () { - //setEditable(false); // TODO + setEditable(false); APP.toolbar.failed(); Cryptpad.alert(Messages.common_connectionLost, undefined, true); }; var reconnect = function (info) { - //setEditable(true); // TODO + setEditable(true); APP.toolbar.reconnecting(info.myId); Cryptpad.findOKButton().click(); }; @@ -638,7 +665,7 @@ var create = function (info) { /* add a forget button */ var forgetCb = function (err) { if (err) { return; } - disconnect(); + setEditable(false); }; var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb); $rightside.append($forgetPad); @@ -709,7 +736,7 @@ var create = function (info) { } }); - //Cryptpad.onLogout(function () { setEditable(false); }); TODO + Cryptpad.onLogout(function () { setEditable(false); }); }); Cryptpad.onError(function (info) { if (info) { From 5d565660a9c5c035269ba3b1b757455c795fb458 Mon Sep 17 00:00:00 2001 From: Pierre Bondoerffer Date: Mon, 12 Jun 2017 12:41:03 +0200 Subject: [PATCH 03/12] tiny fixes --- www/poll/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/poll/main.js b/www/poll/main.js index 2d848f17d..0ff5dc0e0 100644 --- a/www/poll/main.js +++ b/www/poll/main.js @@ -589,7 +589,7 @@ var setEditable = function (editable) { if (editable === false) { // disable all the things - $('.realtime input, .realtime button').attr('disabled', APP.locked); + $('.realtime input, .realtime button, .upper button, .realtime textarea').attr('disabled', APP.locked); $('span.edit, span.remove').hide(); $('span.lock').addClass('fa-lock').removeClass('fa-unlock') .attr('title', Messages.poll_locked) @@ -598,7 +598,7 @@ var setEditable = function (editable) { // enable $('span.edit, span.remove').show(); $('span.lock').css({'cursor': ''}); - $('.realtime button').attr('disabled', APP.locked); + $('.realtime button, .upper button, .realtime textarea').attr('disabled', APP.locked); unlockElements(); } }; From 685b352db8b614658775de363673795207a494c9 Mon Sep 17 00:00:00 2001 From: Pierre Bondoerffer Date: Mon, 12 Jun 2017 14:25:10 +0200 Subject: [PATCH 04/12] poll: Add show help button --- customize.dist/translations/messages.es.js | 3 +++ customize.dist/translations/messages.fr.js | 3 +++ customize.dist/translations/messages.js | 3 +++ www/poll/index.html | 2 +- www/poll/main.js | 19 +++++++++++++------ 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/customize.dist/translations/messages.es.js b/customize.dist/translations/messages.es.js index 57eb41f9e..ce4bcb788 100644 --- a/customize.dist/translations/messages.es.js +++ b/customize.dist/translations/messages.es.js @@ -452,6 +452,9 @@ define(function () { out.poll_locked = "Cerrado"; out.poll_unlocked = "Abierto"; + out.poll_show_help_button = "Mostrar ayuda"; + out.poll_hide_help_button = "Esconder ayuda"; + // 1.8.0 - Idopogo out.common_connectionLost = "Connexión perdida
El documento está ahora en modo solo lectura hasta que la conexión vuelva."; diff --git a/customize.dist/translations/messages.fr.js b/customize.dist/translations/messages.fr.js index 70d804652..0372d6081 100644 --- a/customize.dist/translations/messages.fr.js +++ b/customize.dist/translations/messages.fr.js @@ -202,6 +202,9 @@ define(function () { out.poll_locked = "Verrouillé"; out.poll_unlocked = "Déverrouillé"; + out.poll_show_help_button = "Afficher l'aide"; + out.poll_hide_help_button = "Cacher l'aide"; + // Canvas out.canvas_clear = "Nettoyer"; out.canvas_delete = "Supprimer la sélection"; diff --git a/customize.dist/translations/messages.js b/customize.dist/translations/messages.js index 6d4f07c02..dd14ad8da 100644 --- a/customize.dist/translations/messages.js +++ b/customize.dist/translations/messages.js @@ -204,6 +204,9 @@ define(function () { out.poll_locked = "Locked"; out.poll_unlocked = "Unlocked"; + out.poll_show_help_button = "Show help"; + out.poll_hide_help_button = "Hide help"; + // Canvas out.canvas_clear = "Clear"; out.canvas_delete = "Delete selection"; diff --git a/www/poll/index.html b/www/poll/index.html index 31226d989..22280e8a9 100644 --- a/www/poll/index.html +++ b/www/poll/index.html @@ -28,7 +28,7 @@
- +
diff --git a/www/poll/main.js b/www/poll/main.js index 0ff5dc0e0..05009b5b1 100644 --- a/www/poll/main.js +++ b/www/poll/main.js @@ -142,12 +142,10 @@ define([ var setTablePublished = function (bool) { if (bool) { if (APP.$publish) { APP.$publish.hide(); } - if (APP.$admin) { APP.$admin.show(); } $('#create-option').hide(); $('.remove[data-rt-id^="y"], .edit[data-rt-id^="y"]').hide(); } else { if (APP.$publish) { APP.$publish.show(); } - if (APP.$admin) { APP.$admin.hide(); } $('#create-option').show(); $('.remove[data-rt-id^="y"], .edit[data-rt-id^="y"]').show(); } @@ -432,6 +430,15 @@ define([ }); }; + var showHelp = function(help) { + if (typeof help === 'undefined') { help = !$('#howItWorks').is(':visible'); } + + var msg = (help ? Messages.poll_hide_help_button : Messages.poll_show_help_button); + + $('#howItWorks').toggle(help); + $('#help').text(msg).attr('title', msg); + }; + var Title; var UserList; @@ -498,9 +505,9 @@ var ready = function (info, userid, readOnly) { }); // #publish button is removed in readonly - APP.$admin = $('#admin') + APP.$help = $('#help') .click(function () { - publish(false); + showHelp(); }); // Title @@ -702,7 +709,7 @@ var create = function (info) { }; if (readOnly) { - $('#commit, #create-user, #create-option, #publish, #admin').remove(); + $('#commit, #create-user, #create-option, #publish').remove(); } var parsedHash = Cryptpad.parsePadUrl(window.location.href); @@ -732,7 +739,7 @@ var create = function (info) { if (e) { console.error(e); } }); } else if (value === "1") { - $('#howItWorks').hide(); + showHelp(false); } }); From b8e394db671e55ae11e6ada2063963b1fa1a04c4 Mon Sep 17 00:00:00 2001 From: Pierre Bondoerffer Date: Mon, 12 Jun 2017 18:01:51 +0200 Subject: [PATCH 05/12] poll: Implement multiple choices --- www/poll/main.js | 20 ++++++++++----- www/poll/poll.css | 61 +++++++++++++++++++++++++++++++--------------- www/poll/poll.less | 34 +++++++++++++++++++++----- www/poll/render.js | 24 +++++++++++------- 4 files changed, 99 insertions(+), 40 deletions(-) diff --git a/www/poll/main.js b/www/poll/main.js index 05009b5b1..a805b4c02 100644 --- a/www/poll/main.js +++ b/www/poll/main.js @@ -98,7 +98,7 @@ define([ // Enable the checkboxes for the user's column (committed or not) $('input[disabled="disabled"][data-rt-id^="' + id + '"]').removeAttr('disabled'); - $('input[type="checkbox"][data-rt-id^="' + id + '"]').addClass('enabled'); + $('input[type="number"][data-rt-id^="' + id + '"]').addClass('enabled'); $('.lock[data-rt-id="' + id + '"]').addClass('fa-unlock').removeClass('fa-lock').attr('title', Messages.poll_unlocked); if (isOwnColumnCommitted()) { return; } @@ -117,7 +117,7 @@ define([ APP.editable.col.forEach(function (id) { $input = $('input[disabled="disabled"][data-rt-id^="' + id + '"]').removeAttr('disabled'); $input.parent().addClass('editing'); - $('input[type="checkbox"][data-rt-id^="' + id + '"]').addClass('enabled'); + $('input[type="number"][data-rt-id^="' + id + '"]').addClass('enabled'); $('.lock[data-rt-id="' + id + '"]').addClass('fa-unlock').removeClass('fa-lock').attr('title', Messages.poll_unlocked); }); }; @@ -276,10 +276,10 @@ define([ Render.setValue(object, id, input.value); change(null, null, null, 50); break; - case 'checkbox': - debug("checkbox[tr-id='%s'] %s", id, input.checked); + case 'number': + debug("checkbox[tr-id='%s'] %s", id, input.value); if (APP.editable.col.indexOf(x) >= 0 || x === APP.userid) { - Render.setValue(object, id, input.checked); + Render.setValue(object, id, parseInt(input.value)); change(); } else { debug('checkbox locked'); @@ -378,10 +378,18 @@ define([ hideInputs(target, isKeyup); break; } + if ($(target).is('input[type="number"]')) { break; } + handleInput(target); break; + case 'LABEL': + var input = $('input[type="number"][id=' + $(target).attr('for') + ']'); + var value = parseInt(input.val()); + input.val((value + 1) % 4); + + handleInput(input[0]); + break; case 'SPAN': - //case 'LABEL': if (shouldLock) { break; } diff --git a/www/poll/poll.css b/www/poll/poll.css index a019dabe3..979f7f2b8 100644 --- a/www/poll/poll.css +++ b/www/poll/poll.css @@ -229,40 +229,63 @@ div.realtime table tr td.checkbox-cell div.checkbox-contain label { height: 100%; width: 100%; } -form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable), -div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) { +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"]:not(.editable), +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"]:not(.editable) { display: none; } -form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover, -div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover { +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"]:not(.editable) ~ .cover, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"]:not(.editable) ~ .cover { font-weight: bold; - background-color: #FA5858; color: #000; display: block; } -form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover:after, -div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover:after { +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"]:not(.editable) ~ .cover:after, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"]:not(.editable) ~ .cover:after { height: 100%; } -form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover:after, -div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover:after { +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"]:not(.editable) ~ .cover.yes, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"]:not(.editable) ~ .cover.yes { + background-color: #46E981; +} +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"]:not(.editable) ~ .cover.uncommitted, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"]:not(.editable) ~ .cover.uncommitted { + background: #ddd; +} +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"]:not(.editable) ~ .cover.mine, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"]:not(.editable) ~ .cover.mine { + display: none; +} +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="0"] ~ .cover, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="0"] ~ .cover { + background-color: #FA5858; +} +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="0"] ~ .cover:after, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="0"] ~ .cover:after { content: "✖"; } -form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.yes, -div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.yes { +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="1"] ~ .cover, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="1"] ~ .cover { background-color: #46E981; } -form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.yes:after, -div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.yes:after { +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="1"] ~ .cover:after, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="1"] ~ .cover:after { content: "✔"; } -form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.uncommitted, -div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.uncommitted { - background: #ddd; +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="2"] ~ .cover, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="2"] ~ .cover { + background-color: #ff5; } -form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.mine, -div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.mine { - display: none; +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="2"] ~ .cover:after, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="2"] ~ .cover:after { + content: "~"; +} +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="3"] ~ .cover, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="3"] ~ .cover { + background-color: #ccc; +} +form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="3"] ~ .cover:after, +div.realtime table tr td.checkbox-cell div.checkbox-contain input[type="number"][value="3"] ~ .cover:after { + content: "?"; } form.realtime table input[type="text"], div.realtime table input[type="text"] { diff --git a/www/poll/poll.less b/www/poll/poll.less index d1979a958..95b5cfa52 100644 --- a/www/poll/poll.less +++ b/www/poll/poll.less @@ -9,6 +9,8 @@ @poll-border-color: #555; @poll-cover-color: #000; @poll-fg: #000; +@poll-option-yellow: #ff5; +@poll-option-gray: #ccc; html, body { width: 100%; @@ -251,7 +253,7 @@ form.realtime, div.realtime { } input { - &[type="checkbox"] { + &[type="number"] { &:not(.editable) { display: none; @@ -259,26 +261,21 @@ form.realtime, div.realtime { display: block; font-weight: bold; - background-color: @cp-red; color: @poll-cover-color; &:after { height: 100%; } - &:after { content: "✖"; } - display: block; &.yes { background-color: @cp-green; - &:after { content: "✔"; } } &.uncommitted { background: #ddd; } - &.mine { display: none; } @@ -286,6 +283,31 @@ form.realtime, div.realtime { } } } + + input[type="number"][value="0"] { + ~ .cover { + background-color: @cp-red; + &:after { content: "✖"; } + } + } + input[type="number"][value="1"] { + ~ .cover { + background-color: @cp-green; + &:after { content: "✔"; } + } + } + input[type="number"][value="2"] { + ~ .cover { + background-color: @poll-option-yellow; + &:after { content: "~"; } + } + } + input[type="number"][value="3"] { + ~ .cover { + background-color: @poll-option-gray; + &:after { content: "?"; } + } + } } } } diff --git a/www/poll/render.js b/www/poll/render.js index 8399d5b71..08b91962a 100644 --- a/www/poll/render.js +++ b/www/poll/render.js @@ -70,7 +70,12 @@ var Renderer = function (Cryptpad) { }; var getCellValue = Render.getCellValue = function (obj, cellId) { - return Cryptpad.find(obj, ['table', 'cells'].concat([cellId])); + var value = Cryptpad.find(obj, ['table', 'cells'].concat([cellId])); + if (typeof value === 'boolean') { + return (value === true ? '1' : '0'); + } else { + return value; + } }; var setRowValue = Render.setRowValue = function (obj, rowId, value) { @@ -234,16 +239,20 @@ var Renderer = function (Cryptpad) { disabled: 'disabled' }].concat(cols.map(function (col) { var id = [col, rows[i-1]].join('_'); - var val = cells[id] || false; + var val = cells[id]; var result = { 'data-rt-id': id, - type: 'checkbox', + type: 'number', autocomplete: 'nope', + value: '3', }; if (readOnly) { result.disabled = "disabled"; } - if (val) { result.checked = true; } + if (typeof val !== 'undefined') { + if (typeof val === 'boolean') { val = (val ? '1' : '0'); } + result.value = val; + } return result; })); }); @@ -297,9 +306,6 @@ var Renderer = function (Cryptpad) { attrs.id = cell['data-rt-id']; var labelClass = 'cover'; - if (cell.checked) { - labelClass += ' yes'; - } // TODO implement Yes/No/Maybe/Undecided return ['TD', {class:"checkbox-cell"}, [ @@ -326,7 +332,7 @@ var Renderer = function (Cryptpad) { ]]; } - if (cell && cell.type === 'checkbox') { + if (cell && cell.type === 'number') { return makeCheckbox(cell); } return ['TD', cell, []]; @@ -399,7 +405,7 @@ var Renderer = function (Cryptpad) { preDiffApply: function (info) { if (!diffIsInput(info)) { return; } switch (getInputType(info)) { - case 'checkbox': + case 'number': //console.log('checkbox'); //console.log("[preDiffApply]", info); break; From 0118fdbd0036c7a7c4dfc3e17e653d91580f2629 Mon Sep 17 00:00:00 2001 From: Pierre Bondoerffer Date: Mon, 12 Jun 2017 18:16:11 +0200 Subject: [PATCH 06/12] use a local variable --- www/poll/main.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/www/poll/main.js b/www/poll/main.js index a805b4c02..400811537 100644 --- a/www/poll/main.js +++ b/www/poll/main.js @@ -108,14 +108,13 @@ define([ }; var unlockElements = function () { - var $input; APP.editable.row.forEach(function (id) { - $input = $('input[type="text"][disabled="disabled"][data-rt-id="' + id + '"]').removeAttr('disabled'); + var $input = $('input[type="text"][disabled="disabled"][data-rt-id="' + id + '"]').removeAttr('disabled'); $input.parent().parent().addClass('editing'); $('span.edit[data-rt-id="' + id + '"]').css('visibility', 'hidden'); }); APP.editable.col.forEach(function (id) { - $input = $('input[disabled="disabled"][data-rt-id^="' + id + '"]').removeAttr('disabled'); + var $input = $('input[disabled="disabled"][data-rt-id^="' + id + '"]').removeAttr('disabled'); $input.parent().addClass('editing'); $('input[type="number"][data-rt-id^="' + id + '"]').addClass('enabled'); $('.lock[data-rt-id="' + id + '"]').addClass('fa-unlock').removeClass('fa-lock').attr('title', Messages.poll_unlocked); From cd1c95792997e1ff13af090a5944f64c643cf8e5 Mon Sep 17 00:00:00 2001 From: Pierre Bondoerffer Date: Mon, 12 Jun 2017 18:23:17 +0200 Subject: [PATCH 07/12] NaN safety --- www/poll/main.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/www/poll/main.js b/www/poll/main.js index 400811537..35bc4ffb2 100644 --- a/www/poll/main.js +++ b/www/poll/main.js @@ -278,7 +278,14 @@ define([ case 'number': debug("checkbox[tr-id='%s'] %s", id, input.value); if (APP.editable.col.indexOf(x) >= 0 || x === APP.userid) { - Render.setValue(object, id, parseInt(input.value)); + var value = parseInt(input.value); + + if (isNaN(value)) { + console.error("Got NaN?!"); + break; + } + + Render.setValue(object, id, value); change(); } else { debug('checkbox locked'); @@ -359,7 +366,6 @@ define([ if (!APP.ready) { return; } if (!isKeyup && e.which !== 1) { return; } - var target = e && e.target; if (!target) { return void debug("NO TARGET"); } @@ -384,6 +390,7 @@ define([ case 'LABEL': var input = $('input[type="number"][id=' + $(target).attr('for') + ']'); var value = parseInt(input.val()); + input.val((value + 1) % 4); handleInput(input[0]); From 56f2c46c755b649d55bbd473f4f0086f29176fe7 Mon Sep 17 00:00:00 2001 From: Pierre Bondoerffer Date: Mon, 12 Jun 2017 18:25:06 +0200 Subject: [PATCH 08/12] document a line --- www/poll/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/poll/main.js b/www/poll/main.js index 35bc4ffb2..59d1fb2e4 100644 --- a/www/poll/main.js +++ b/www/poll/main.js @@ -364,7 +364,7 @@ define([ e.stopPropagation(); if (!APP.ready) { return; } - if (!isKeyup && e.which !== 1) { return; } + if (!isKeyup && e.which !== 1) { return; } // only allow left clicks var target = e && e.target; From 848010842f7a034fa1d0fba07d78c96841471ae5 Mon Sep 17 00:00:00 2001 From: Pierre Bondoerffer Date: Mon, 12 Jun 2017 18:26:27 +0200 Subject: [PATCH 09/12] dont sanity check silently --- www/poll/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/poll/main.js b/www/poll/main.js index 59d1fb2e4..99419eb22 100644 --- a/www/poll/main.js +++ b/www/poll/main.js @@ -383,7 +383,7 @@ define([ hideInputs(target, isKeyup); break; } - if ($(target).is('input[type="number"]')) { break; } + if ($(target).is('input[type="number"]')) { console.error("number input focused?"); break; } handleInput(target); break; From b2eef94232a53f9f74114ccdbc12615bfb09345e Mon Sep 17 00:00:00 2001 From: Pierre Bondoerffer Date: Mon, 12 Jun 2017 18:35:13 +0200 Subject: [PATCH 10/12] use numbers, not strings --- www/poll/render.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/poll/render.js b/www/poll/render.js index 08b91962a..f84fdc964 100644 --- a/www/poll/render.js +++ b/www/poll/render.js @@ -72,7 +72,7 @@ var Renderer = function (Cryptpad) { var getCellValue = Render.getCellValue = function (obj, cellId) { var value = Cryptpad.find(obj, ['table', 'cells'].concat([cellId])); if (typeof value === 'boolean') { - return (value === true ? '1' : '0'); + return (value === true ? 1 : 0); } else { return value; } From 2b5339193c5f801f01c8977984d664d812e222a2 Mon Sep 17 00:00:00 2001 From: Pierre Bondoerffer Date: Mon, 12 Jun 2017 18:45:04 +0200 Subject: [PATCH 11/12] bring admin back --- www/poll/index.html | 1 + www/poll/main.js | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/www/poll/index.html b/www/poll/index.html index 22280e8a9..091086f5c 100644 --- a/www/poll/index.html +++ b/www/poll/index.html @@ -28,6 +28,7 @@
+
diff --git a/www/poll/main.js b/www/poll/main.js index 99419eb22..8043da3fc 100644 --- a/www/poll/main.js +++ b/www/poll/main.js @@ -141,10 +141,12 @@ define([ var setTablePublished = function (bool) { if (bool) { if (APP.$publish) { APP.$publish.hide(); } + if (APP.$admin) { APP.$admin.show(); } $('#create-option').hide(); $('.remove[data-rt-id^="y"], .edit[data-rt-id^="y"]').hide(); } else { if (APP.$publish) { APP.$publish.show(); } + if (APP.$admin) { APP.$admin.hide(); } $('#create-option').show(); $('.remove[data-rt-id^="y"], .edit[data-rt-id^="y"]').show(); } @@ -518,7 +520,11 @@ var ready = function (info, userid, readOnly) { publish(true); }); - // #publish button is removed in readonly + APP.$admin = $('#admin') + .click(function () { + publish(false); + }); + APP.$help = $('#help') .click(function () { showHelp(); @@ -723,7 +729,7 @@ var create = function (info) { }; if (readOnly) { - $('#commit, #create-user, #create-option, #publish').remove(); + $('#commit, #create-user, #create-option, #publish, #admin').remove(); } var parsedHash = Cryptpad.parsePadUrl(window.location.href); From d344f0377853cb64c2503cb2768527c887c5a8d5 Mon Sep 17 00:00:00 2001 From: Pierre Bondoerffer Date: Mon, 12 Jun 2017 18:57:07 +0200 Subject: [PATCH 12/12] proper button text --- www/poll/main.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/www/poll/main.js b/www/poll/main.js index 8043da3fc..4878b60a6 100644 --- a/www/poll/main.js +++ b/www/poll/main.js @@ -758,7 +758,8 @@ var create = function (info) { Cryptpad.setAttribute(HIDE_INTRODUCTION_TEXT, "1", function (e) { if (e) { console.error(e); } }); - } else if (value === "1") { + showHelp(true); + } else { showHelp(false); } });