From 4de7c7f35a491e88a39d22b895dea720a9f84d1a Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 5 Nov 2021 13:01:11 +0100 Subject: [PATCH 1/9] Check migration with OnlyOffice tables --- www/common/onlyoffice/inner.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/www/common/onlyoffice/inner.js b/www/common/onlyoffice/inner.js index 306b166dd..288e47774 100644 --- a/www/common/onlyoffice/inner.js +++ b/www/common/onlyoffice/inner.js @@ -1638,13 +1638,15 @@ define([ var d, hasChart; if (app === 'doc') { d = getEditor().GetDocument(); - hasChart = d.GetAllCharts().length; + hasChart = d.GetAllCharts().length || d.Document.Content.some(function (obj) { + return obj instanceof AscCommonWord.CTable; + }); if (hasChart) { Feedback.send('OO_DOC_CHART', true); } } else if (app === 'presentation') { d = getEditor().GetPresentation().Presentation; hasChart = d.Slides.some(function (slide) { return slide.getDrawingObjects().some(function (obj) { - return obj instanceof getWindow().AscFormat.CChartSpace; + return obj instanceof getWindow().AscFormat.CChartSpace || obj instanceof getWindow().AscFormat.CGraphicFrame; }); }); if (hasChart) { Feedback.send('OO_SLIDE_CHART', true); } From 6895fe06506a16dbc69aced9e72dd4bc8fd4f581 Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 5 Nov 2021 13:04:30 +0100 Subject: [PATCH 2/9] Disable tables in doc and presentations --- www/common/onlyoffice/inner.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/www/common/onlyoffice/inner.js b/www/common/onlyoffice/inner.js index 288e47774..e399900ae 100644 --- a/www/common/onlyoffice/inner.js +++ b/www/common/onlyoffice/inner.js @@ -1588,6 +1588,8 @@ define([ //'#id-toolbar-full .toolbar-group:nth-child(2), #id-toolbar-full .separator:nth-child(3) { display: none; }' + '#slot-btn-inschart { display: none !important; }' + // XXX XXX '#slot-btn-insertchart { display: none !important; }' + // XXX XXX + '#slot-btn-instable { display: none !important; }' + // XXX XXX + '#slot-btn-inserttable { display: none !important; }' + // XXX XXX //'#fm-btn-save { display: none !important; }' + //'#panel-settings-general tr.autosave { display: none !important; }' + //'#panel-settings-general tr.coauth { display: none !important; }' + From 90fc5ae4f1356ecbf608fd05fcb9e3d7d7f7c6bd Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 5 Nov 2021 13:06:11 +0100 Subject: [PATCH 3/9] lint compliance --- www/common/onlyoffice/inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/onlyoffice/inner.js b/www/common/onlyoffice/inner.js index e399900ae..d2d6e8c07 100644 --- a/www/common/onlyoffice/inner.js +++ b/www/common/onlyoffice/inner.js @@ -1641,7 +1641,7 @@ define([ if (app === 'doc') { d = getEditor().GetDocument(); hasChart = d.GetAllCharts().length || d.Document.Content.some(function (obj) { - return obj instanceof AscCommonWord.CTable; + return obj instanceof getWindow().AscCommonWord.CTable; }); if (hasChart) { Feedback.send('OO_DOC_CHART', true); } } else if (app === 'presentation') { From b4bb28ef19bf3a4dd64cadcb37598dd9959aef93 Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 8 Nov 2021 12:44:45 +0100 Subject: [PATCH 4/9] Fix type error in calendar import --- www/calendar/export.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/calendar/export.js b/www/calendar/export.js index 5967e2027..307abad33 100644 --- a/www/calendar/export.js +++ b/www/calendar/export.js @@ -188,7 +188,7 @@ define([ hidden.push(al.toString()); } var trigger = al.getFirstPropertyValue('trigger'); - var minutes = trigger ? (-trigger.toSeconds() / 60) : 0; + var minutes = trigger && trigger.toSeconds ? (-trigger.toSeconds() / 60) : 0; if (reminders.indexOf(minutes) === -1) { reminders.push(minutes); } }); From ca0bde068e2c44534f1dd0648a3ace74fb1867ac Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 8 Nov 2021 12:45:20 +0100 Subject: [PATCH 5/9] Fix issue with Choice grids in forms (#827) --- www/form/inner.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/www/form/inner.js b/www/form/inner.js index c3835f934..2f7cdf7b1 100644 --- a/www/form/inner.js +++ b/www/form/inner.js @@ -1815,7 +1815,7 @@ define([ defaultOpts: { items: [1,2].map(function (i) { return { - uid: Util.uid(), + //uid: Util.uid(), v: Messages._getKey('form_defaultItem', [i]) }; }), @@ -1831,6 +1831,10 @@ define([ if (!opts) { opts = Util.clone(TYPES.multiradio.defaultOpts); } if (!Array.isArray(opts.items) || !Array.isArray(opts.values)) { return; } var lines = opts.items.map(function (itemData) { + if (!itemData.uid) { + itemData.uid = Util.uid(); + if (APP.isEditor) { APP.framework.localChange(); } + } var name = itemData.uid; var item = itemData.v; var els = extractValues(opts.values).map(function (data, i) { @@ -3340,9 +3344,11 @@ define([ // Make sure we can't create a section inside another one if (type === 'section' && arr !== content.order) { return; } + var model = TYPES[type] || STATIC_TYPES[type]; + if (!model) { return; } content.form[_uid] = { //q: Messages.form_default, - //opts: opts + opts: Util.clone(model.defaultOpts), type: type, }; if (full || inSection) { From 9d4368e8cd2f8deb6f4dd3f83f2c590ebb19b967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Mon, 8 Nov 2021 15:04:50 +0000 Subject: [PATCH 6/9] Display full text of Form responses --- www/form/app-form.less | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/www/form/app-form.less b/www/form/app-form.less index 7a8e1ece1..43e534e63 100644 --- a/www/form/app-form.less +++ b/www/form/app-form.less @@ -854,6 +854,13 @@ } } } + &.cp-text-table { + .cp-charts-row { + .cp-value { + white-space: normal; + } + } + } } .cp-form-results-contained { From 528fd4ff9723826bfd2cfcad54b183c5625ee71c Mon Sep 17 00:00:00 2001 From: yflory Date: Tue, 9 Nov 2021 13:47:20 +0100 Subject: [PATCH 7/9] Update form anonymity options --- www/form/app-form.less | 8 +++- www/form/inner.js | 101 +++++++++++++++++++++++++---------------- 2 files changed, 68 insertions(+), 41 deletions(-) diff --git a/www/form/app-form.less b/www/form/app-form.less index 43e534e63..d1ca4da88 100644 --- a/www/form/app-form.less +++ b/www/form/app-form.less @@ -477,13 +477,19 @@ .cp-form-anon-answer { text-align: center; margin: 20px 0 30px 0; + .cp-form-required-radio.cp-radio-required { + background: fade(@cryptpad_text_col, 15%); + padding: 3px; + border: 2px solid @cryptpad_color_red; + color: @cp_form-invalid; + } .cp-form-anon-answer-input { - margin-top: 20px; display: flex; white-space: nowrap; align-items: center; input { margin-left: 10px; + display: inline-block; } } .cp-form-anon-answer-registered { diff --git a/www/form/inner.js b/www/form/inner.js index 2f7cdf7b1..e6e2af133 100644 --- a/www/form/inner.js +++ b/www/form/inner.js @@ -2723,7 +2723,7 @@ define([ var answer = obj.msg; var date = new Date(obj.time).toLocaleString(); var text, warning, badge; - if (!answer._userdata || !answer._userdata.name) { + if (!answer._userdata || (!answer._userdata.name && !answer._userdata.curvePublic)) { text = Messages._getKey('form_answerAnonymous', [date]); } else { var ud = answer._userdata; @@ -3022,69 +3022,81 @@ define([ if (!loggedIn && !content.answers.anonymous) { return; } - var cbox; - var anonName, $anonName; - cbox = UI.createCheckbox('cp-form-anonymous', - Messages.form_anonymousBox, true, {}); - var $cbox = $(cbox); - var $anonBox = $cbox.find('input'); + var $anonName; + var anonRadioOn = UI.createRadio('cp-form-anon', 'cp-form-anon-on', + Messages.form_anonymousBox, false, { + input: { value: 1 }, + }); + var anonOffContent = h('span'); + var anonRadioOff = UI.createRadio('cp-form-anon', 'cp-form-anon-off', + anonOffContent, false, { + input: { value: 0 }, + }); + var radioContainer = h('div.cp-form-required-radio', [ + anonRadioOn, + anonRadioOff, + ]); + var $radio = $(radioContainer); + + if (content.answers.makeAnonymous) { // If we make all answers anonymous, hide the checkbox and display a message - $cbox.hide(); - $anonBox.attr('disabled', 'disabled').prop('checked', true); + $radio.hide(); + $(anonRadioOn).find('input').prop('checked', true); setTimeout(function () { // We need to wait for cbox to be added into the DOM before using .after() - $cbox.after(h('div.alert.alert-info', Messages.form_anonAnswer)); + $radio.after(h('div.alert.alert-info', Messages.form_anonAnswer)); }); } else if (content.answers.anonymous) { // Answers aren't anonymous and guests are allowed // Guests can set a username and logged in users can answer anonymously - var $anon; if (!loggedIn) { - anonName = h('div.cp-form-anon-answer-input', [ + $(anonOffContent).append(h('span.cp-form-anon-answer-input', [ Messages.form_answerAs, h('input', { value: user.name || '', placeholder: Messages.form_anonName }) - ]); - $anonName = $(anonName).hide(); + ])); + $anonName = $(anonOffContent).find('input'); + var $off = $(anonRadioOff).find('input[type="radio"]'); + $anonName.on('click input', function () { + if (!Util.isChecked($off)) { $off.prop('checked', true); } + }); } else if (APP.cantAnon) { // You've already answered with your credentials - $cbox.hide(); - $anonBox.attr('disabled', 'disabled').prop('checked', false); + $(anonRadioOn).find('input').attr('disabled', 'disabled'); + $(anonRadioOff).find('input[type="radio"]').prop('checked', true); } - if (!anonName) { - anonName = h('div.cp-form-anon-answer-input', [ + if (!$anonName) { + $(anonOffContent).append(h('div.cp-form-anon-answer-input', [ Messages.form_answerAs, h('span.cp-form-anon-answer-registered', user.name || Messages.anonymous) - ]); + ])); } - if (!APP.cantAnon) { - $anon = $(anonName).hide(); - $anonBox.on('change', function () { - if (Util.isChecked($anonBox)) { $anon.hide(); } - else { $anon.show(); } + if (!$radio.find('input[type="radio"]:checked').length) { + $radio.addClass('cp-radio-required'); + $radio.find('input[type="radio"]').on('change', function () { + $radio.removeClass('cp-radio-required'); }); } } else { // Answers don't have to be anonymous and only logged in users can answer // ==> they have to answer with their keys so we know their name too - $cbox.hide(); - $anonBox.attr('disabled', 'disabled').prop('checked', false); + $(anonRadioOn).find('input').attr('disabled', 'disabled'); + $(anonRadioOff).find('input[type="radio"]').prop('checked', true); setTimeout(function () { // We need to wait for cbox to be added into the DOM before using .after() if (content.answers.cantEdit) { return; } - $cbox.after(h('div.alert.alert-info', Messages.form_authAnswer)); + $radio.after(h('div.alert.alert-info', Messages.form_authAnswer)); }); - anonName = h('div.cp-form-anon-answer-input', [ + $(anonOffContent).append(h('div.cp-form-anon-answer-input', [ Messages.form_answerAs, h('span.cp-form-anon-answer-registered', user.name || Messages.anonymous) - ]); + ])); } if (APP.hasAnswered && content.answers.cantEdit || APP.isClosed) { - $cbox.hide(); - anonName = undefined; + $radio.hide(); } var send = h('button.cp-open.btn.btn-primary', APP.hasAnswered ? Messages.form_update : Messages.form_submit); @@ -3098,12 +3110,18 @@ define([ evOnChange.fire(); }); var $send = $(send).click(function () { + if (!$radio.find('input[type="radio"]:checked').length) { + return UI.warn(Messages.error); + } + $send.attr('disabled', 'disabled'); var results = getFormResults(); if (!results) { return; } + var wantName = Util.isChecked($(anonRadioOff).find('input[type="radio"]')); + var user = metadataMgr.getUserData(); - if (!Util.isChecked($anonBox) && !content.answers.makeAnonymous) { + if (wantName && !content.answers.makeAnonymous) { results._userdata = loggedIn ? { avatar: user.avatar, name: user.name, @@ -3111,7 +3129,7 @@ define([ curvePublic: user.curvePublic, profile: user.profile } : { - name: $anonName ? $anonName.find('input').val() : user.name + name: $anonName ? $anonName.val() : user.name }; } @@ -3120,7 +3138,7 @@ define([ mailbox: content.answers, results: results, anonymous: content.answers.makeAnonymous || !loggedIn - || (Util.isChecked($anonBox) && !APP.cantAnon) // use ephemeral keys + || (!wantName && !APP.cantAnon) // use ephemeral keys }, function (err, data) { $send.attr('disabled', 'disabled'); if (err || (data && data.error)) { @@ -3130,6 +3148,11 @@ define([ console.error(err || data.error); return void UI.warn(Messages.error); } + if (results._userdata && loggedIn) { + $(anonRadioOn).find('input').attr('disabled', 'disabled'); + $(anonRadioOff).find('input[type="radio"]').prop('checked', true); + APP.cantAnon = true; + } evOnChange.fire(false, true); window.onbeforeunload = undefined; @@ -3139,8 +3162,7 @@ define([ APP.answeredInForm = false; showAnsweredPage(framework, content, { '_time': +new Date() }); if (content.answers.cantEdit) { - $cbox.hide(); - if ($anonName) { $anonName.hide(); } + $(radioContainer).hide(); } }); }); @@ -3248,10 +3270,9 @@ define([ return h('div.cp-form-send-container', [ invalid, errors, - cbox ? h('div.cp-form-anon-answer', [ - cbox, - anonName - ]) : undefined, + h('div.cp-form-anon-answer', [ + radioContainer + ]), reset, send ]); }; From e6073c5684713d34aad1ed91ad6bced338204308 Mon Sep 17 00:00:00 2001 From: yflory Date: Tue, 9 Nov 2021 16:26:27 +0100 Subject: [PATCH 8/9] Update version --- customize.dist/pages.js | 2 +- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/customize.dist/pages.js b/customize.dist/pages.js index c53a7a78a..a493f8997 100644 --- a/customize.dist/pages.js +++ b/customize.dist/pages.js @@ -105,7 +105,7 @@ define([ var imprintUrl = AppConfig.imprint && (typeof(AppConfig.imprint) === "boolean" ? '/imprint.html' : AppConfig.imprint); - Pages.versionString = "v4.12.0"; + Pages.versionString = "v4.12.1"; // used for the about menu diff --git a/package-lock.json b/package-lock.json index 4e31acb53..5697225c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "cryptpad", - "version": "4.12.0", + "version": "4.12.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 343353bb6..39bb0a312 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cryptpad", "description": "realtime collaborative visual editor with zero knowlege server", - "version": "4.12.0", + "version": "4.12.1", "license": "AGPL-3.0+", "repository": { "type": "git", From 40d92a5423e279233eb8ffbee09d74a7e89c8c2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Tue, 9 Nov 2021 15:11:43 +0000 Subject: [PATCH 9/9] Adjust UI for anon/name answer choice in forms --- customize.dist/src/less2/include/colortheme.less | 2 +- www/form/app-form.less | 7 +++---- www/form/inner.js | 4 +++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/customize.dist/src/less2/include/colortheme.less b/customize.dist/src/less2/include/colortheme.less index dd6115ea1..8817f9312 100644 --- a/customize.dist/src/less2/include/colortheme.less +++ b/customize.dist/src/less2/include/colortheme.less @@ -447,6 +447,6 @@ @cp_form-poll-yes: fade(@cryptpad_color_light_green, 75%); @cp_form-poll-maybe: @cryptpad_color_grey_300; @cp_form-poll-yes-color: @cryptpad_color_green; -@cp_form-invalid: @cryptpad_color_red; +@cp_form-invalid: @cp_alerts-danger-text; @cp_form-palette: @cp_palette; @cp_form-palette2: @cp_palette-dark; diff --git a/www/form/app-form.less b/www/form/app-form.less index d1ca4da88..4e873575e 100644 --- a/www/form/app-form.less +++ b/www/form/app-form.less @@ -477,10 +477,10 @@ .cp-form-anon-answer { text-align: center; margin: 20px 0 30px 0; + .cp-radio { + margin-top: 10px; + } .cp-form-required-radio.cp-radio-required { - background: fade(@cryptpad_text_col, 15%); - padding: 3px; - border: 2px solid @cryptpad_color_red; color: @cp_form-invalid; } .cp-form-anon-answer-input { @@ -575,7 +575,6 @@ flex: 1; } .cp-form-required-tag { - background: fade(@cryptpad_text_col, 15%); padding: 5px; margin-top: -10px; margin-right: -10px; diff --git a/www/form/inner.js b/www/form/inner.js index e6e2af133..d9e731937 100644 --- a/www/form/inner.js +++ b/www/form/inner.js @@ -3032,7 +3032,9 @@ define([ anonOffContent, false, { input: { value: 0 }, }); + Messages.form_answerChoice = "Please choose how you would like to answer this form: "; // XXX var radioContainer = h('div.cp-form-required-radio', [ + Messages.form_answerChoice, anonRadioOn, anonRadioOff, ]); @@ -3268,8 +3270,8 @@ define([ } return h('div.cp-form-send-container', [ - invalid, errors, + invalid, h('div.cp-form-anon-answer', [ radioContainer ]),