From a5823967dab45e65e96a41ffe5f308e16a7442f8 Mon Sep 17 00:00:00 2001 From: "Julia.Radzhabova" Date: Tue, 9 Dec 2025 22:14:34 +0300 Subject: [PATCH 01/10] Fix Bug 78904 --- apps/documenteditor/main/app/view/ListSettingsDialog.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/documenteditor/main/app/view/ListSettingsDialog.js b/apps/documenteditor/main/app/view/ListSettingsDialog.js index 36fecb94a7..af6bd7cbda 100644 --- a/apps/documenteditor/main/app/view/ListSettingsDialog.js +++ b/apps/documenteditor/main/app/view/ListSettingsDialog.js @@ -319,7 +319,7 @@ define([ [ '<% _.each(items, function(item) { %>', '
  • ', - '<%= item.displayValue %><% if (item.value === Asc.c_oAscNumberingFormat.Bullet) { %><%=item.symbol%><% } %>', + '<%= item.displayValue %><% if (item.value === Asc.c_oAscNumberingFormat.Bullet) { %><%=item.symbol%><% } %>', '
  • ', '<% }); %>' ]; @@ -372,7 +372,7 @@ define([ var formcontrol = $(this.el).find('.form-control'); if (record) { if (record.get('value')==Asc.c_oAscNumberingFormat.Bullet) - formcontrol[0].innerHTML = record.get('displayValue') + '' + record.get('symbol') + ''; + formcontrol[0].innerHTML = record.get('displayValue') + '' + record.get('symbol') + ''; else formcontrol[0].innerHTML = record.get('displayValue'); } else From 948d4f26c1f2a56a58e7bbbd602ea7321b52454f Mon Sep 17 00:00:00 2001 From: "Julia.Radzhabova" Date: Tue, 9 Dec 2025 22:43:44 +0300 Subject: [PATCH 02/10] Fix Bug 79022 --- apps/documenteditor/main/app/view/Toolbar.js | 2 +- apps/presentationeditor/main/app/view/Toolbar.js | 2 +- apps/spreadsheeteditor/main/app/view/Toolbar.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index a6e8c0e2c2..5932aaab4e 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -3601,7 +3601,7 @@ define([ '', '<% }) %>', '', - '<%= caption %>', + '<%- caption %>', '' ].join('')); diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index 33c1894339..f595b5d33d 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -2139,7 +2139,7 @@ define([ '', '<% }) %>', '', - '<%= caption %>', + '<%- caption %>', '' ].join('')); diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index 922ed13f1f..a5004d3969 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -3356,7 +3356,7 @@ define([ '', '<% }) %>', '', - '<%= caption %>', + '<%- caption %>', '' ].join('')); From b0872c6eb77a9f70b9f2f31c00efacc59b99df64 Mon Sep 17 00:00:00 2001 From: "Julia.Radzhabova" Date: Thu, 11 Dec 2025 16:20:58 +0300 Subject: [PATCH 03/10] Fix Bug 78901 --- apps/common/main/lib/template/Comments.template | 4 ++-- apps/common/main/lib/template/CommentsPopover.template | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/common/main/lib/template/Comments.template b/apps/common/main/lib/template/Comments.template index eec227f93a..74a632ccc9 100644 --- a/apps/common/main/lib/template/Comments.template +++ b/apps/common/main/lib/template/Comments.template @@ -25,7 +25,7 @@
    <%=scope.pickLink(comment)%>
    <% } else { %>
    - +
    @@ -68,7 +68,7 @@ <%}%> <% } else { %>
    - +
    diff --git a/apps/common/main/lib/template/CommentsPopover.template b/apps/common/main/lib/template/CommentsPopover.template index 1fb1734c2e..194075fdbe 100644 --- a/apps/common/main/lib/template/CommentsPopover.template +++ b/apps/common/main/lib/template/CommentsPopover.template @@ -20,7 +20,7 @@
    <%=scope.pickLink(comment)%>
    <% } else { %>
    - + <% if (hideAddReply) { %> <% } else { %> @@ -67,7 +67,7 @@ <%}%> <% } else { %>
    - +
    From 8dfe5c65ae5658ca0478f21f195c1ebfcabc6b48 Mon Sep 17 00:00:00 2001 From: "Julia.Radzhabova" Date: Fri, 12 Dec 2025 15:20:40 +0300 Subject: [PATCH 04/10] Fix bug: remove first custom group with separator in the tab --- apps/common/main/lib/component/Mixtbar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/common/main/lib/component/Mixtbar.js b/apps/common/main/lib/component/Mixtbar.js index a255399e87..20a64a713d 100644 --- a/apps/common/main/lib/component/Mixtbar.js +++ b/apps/common/main/lib/component/Mixtbar.js @@ -716,7 +716,7 @@ define([ button.cmpEl.closest('.btn-slot').remove(); if (group.children().length<1) { var in_more = group.closest('.more-container').length>0; - in_more ? group.next('.separator').remove() : group.prev('.separator').remove(); + (in_more || group.prev().length===0) ? group.next('.separator').remove() : group.prev('.separator').remove(); // remove separator before empty group or after first empty group group.remove(); if (in_more && $morepanel.children().filter('.group').length === 0) { btnsMore[tab.action] && btnsMore[tab.action].isActive() && btnsMore[tab.action].toggle(false); From cd4d5b180e4a8493425c6cdf665efb4e0137b497 Mon Sep 17 00:00:00 2001 From: Evgeniy Antonyuk Date: Thu, 18 Dec 2025 12:39:58 +0000 Subject: [PATCH 05/10] Replace CloudFront invalidation with API Gateway endpoint --- .github/workflows/ci-build-upload.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-build-upload.yml b/.github/workflows/ci-build-upload.yml index 2a8e7370a5..b66ca51db2 100644 --- a/.github/workflows/ci-build-upload.yml +++ b/.github/workflows/ci-build-upload.yml @@ -119,7 +119,7 @@ jobs: env: URI: ${{steps.tag-dir.outputs.URI}} run: | - aws cloudfront create-invalidation \ - --distribution-id ${{ secrets.AWS_DISTRIBUTION_ID }} \ - --paths \ - "${URI}/*" + API_STATUS=$(aws apigateway test-invoke-method --rest-api-id ${{ secrets.AWS_REST_API_ID }} --resource-id "${{ secrets.AWS_RESOURCE_ID }}" \ + --http-method PUT --path-with-query-string "/prod/download-oo-com" --body "$(jq -c -n '.paths = $ARGS.positional' --args "${URI}/*")" \ + --region us-east-1 --query 'status' --output text || :) + echo "API Gateway test-invoke status: ${API_STATUS:-}" From 22bea25014902cbfc3d8a5831db36c9ee61f5e1e Mon Sep 17 00:00:00 2001 From: Hendrik Leidinger Date: Wed, 14 Jan 2026 17:00:59 -0800 Subject: [PATCH 06/10] feat: smartpicker button first version Signed-off-by: Hendrik Leidinger --- apps/api/documents/api.js | 9 ++++++++ apps/common/Gateway.js | 8 +++++++ .../main/app/controller/Toolbar.js | 21 +++++++++++++++++++ .../main/app/template/Toolbar.template | 1 + apps/documenteditor/main/app/view/Toolbar.js | 14 +++++++++++++ apps/documenteditor/main/locale/en.json | 1 + 6 files changed, 54 insertions(+) diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js index fb57b05dc8..0b375104ac 100644 --- a/apps/api/documents/api.js +++ b/apps/api/documents/api.js @@ -332,6 +332,7 @@ 'onRequestRefreshFile': // send when file version is updated. use instead of onOutdatedVersion 'onUserActionRequired': // send if the user needs to enter a password or select encoding/delimiters when opening a file 'onRequestFillingStatus': // used in pdf-form fill forms mode + 'onRequestSmartPicker': 'onStartFilling': // send after startFilling method, used in pdf-form editing } } @@ -773,6 +774,13 @@ }); }; + var _insertLink = function(data) { + _sendCommand({ + command: 'insertLink', + data: data + }); + }; + var _setMailMergeRecipients = function(data) { _sendCommand({ command: 'setMailMergeRecipients', @@ -909,6 +917,7 @@ showSharingSettings : _showSharingSettings, setSharingSettings : _setSharingSettings, insertImage : _insertImage, + insertLink : _insertLink, setMailMergeRecipients: _setMailMergeRecipients, setRevisedFile : _setRevisedFile, setFavorite : _setFavorite, diff --git a/apps/common/Gateway.js b/apps/common/Gateway.js index 9a39cb5c6a..eb55a5f491 100644 --- a/apps/common/Gateway.js +++ b/apps/common/Gateway.js @@ -115,6 +115,10 @@ if (window.Common === undefined) { $me.trigger('insertimage', data); }, + 'insertLink': function(data) { + $me.trigger('insertlink', data); + }, + 'setMailMergeRecipients': function(data) { $me.trigger('setmailmergerecipients', data); }, @@ -447,6 +451,10 @@ if (window.Common === undefined) { _postMessage({event: 'onSubmit'}); }, + requestSmartPicker: function() { + _postMessage({event: 'onRequestSmartPicker'}); + }, + on: function(event, handler){ var localHandler = function(event, data){ handler.call(me, data) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index b5d8da7ea0..d027521dc6 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -305,6 +305,7 @@ define([ this.onBtnChangeState('redo:disabled', toolbar.btnRedo, toolbar.btnRedo.isDisabled()); this.onBtnChangeState('save:disabled', toolbar.btnSave, toolbar.btnSave.isDisabled()); Common.Gateway.on('insertimage', _.bind(this.insertImage, this)); + Common.Gateway.on('insertlink', _.bind(this.insertLink, this)); }, attachUIEvents: function(toolbar) { @@ -424,6 +425,7 @@ define([ toolbar.mnuPageNumCurrentPos.on('click', _.bind(this.onPageNumCurrentPosClick, this)); toolbar.mnuInsertPageCount.on('click', _.bind(this.onInsertPageCountClick, this)); toolbar.btnBlankPage.on('click', _.bind(this.onBtnBlankPageClick, this)); + toolbar.btnSmartPicker.on('click', _.bind(this.onBtnSmartPickerClick, this)); toolbar.listStyles.on('click', _.bind(this.onListStyleSelect, this)); toolbar.listStyles.on('contextmenu', _.bind(this.onListStyleContextMenu, this)); toolbar.styleMenu.on('hide:before', _.bind(this.onListStyleBeforeHide, this)); @@ -437,6 +439,7 @@ define([ toolbar.btnHyphenation.menu.on('item:click', _.bind(this.onHyphenationSelect, this)); toolbar.btnHyphenation.menu.on('show:after', _.bind(this.onHyphenationShow, this)); Common.Gateway.on('insertimage', _.bind(this.insertImage, this)); + Common.Gateway.on('insertlink', _.bind(this.insertLink, this)); Common.Gateway.on('setmailmergerecipients', _.bind(this.setMailMergeRecipients, this)); Common.Gateway.on('setrequestedspreadsheet', _.bind(this.setRequestedSpreadsheet, this)); Common.NotificationCenter.on('storage:spreadsheet-load', _.bind(this.openSpreadsheetFromStorage, this)); @@ -2027,6 +2030,17 @@ define([ Common.NotificationCenter.trigger('storage:image-insert', data); }, + insertLink: function(data) { // gateway + + var props = new Asc.CHyperlinkProperty(); + props.put_Value(data); + props.put_Bookmark(null); + props.put_Text(data); + this.api.add_Hyperlink(props); + + Common.NotificationCenter.trigger('storage:link-insert', data); + }, + onBtnInsertTextClick: function(btn, e) { btn.menu.getItems(true).forEach(function(item) { if(item.value == btn.options.textboxType) @@ -2681,6 +2695,13 @@ define([ Common.component.Analytics.trackEvent('ToolBar', 'Blank Page'); }, + onBtnSmartPickerClick: function(btn) { + Common.Gateway.requestSmartPicker() + + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + Common.component.Analytics.trackEvent('ToolBar', 'Smart Picker'); + }, + onWatermarkSelect: function(menu, item) { if (this.api) { if (item.value == 'remove') diff --git a/apps/documenteditor/main/app/template/Toolbar.template b/apps/documenteditor/main/app/template/Toolbar.template index 494761c178..3ba4aea7dd 100644 --- a/apps/documenteditor/main/app/template/Toolbar.template +++ b/apps/documenteditor/main/app/template/Toolbar.template @@ -109,6 +109,7 @@
    +
    diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index a6e8c0e2c2..bb4a76576d 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -1040,6 +1040,19 @@ define([ }); this.paragraphControls.push(this.btnInsField); + this.btnSmartPicker = new Common.UI.Button({ + id: 'id-toolbar-btn-smartpicker', + cls: 'btn-toolbar x-huge icon-top', + iconCls: 'toolbar__icon btn-blankpage', + lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.richDelLock, _set.plainDelLock, _set.inHeader, _set.inFootnote, _set.inControl, + _set.cantPageBreak, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockViewIns, _set.docLockForms, _set.docLockCommentsIns, _set.viewMode], + caption: me.capBtnSmartPicker, + dataHint: '1', + dataHintDirection: 'bottom', + dataHintOffset: 'small' + }); + this.paragraphControls.push(this.btnSmartPicker); + this.btnBlankPage = new Common.UI.Button({ id: 'id-toolbar-btn-blankpage', cls: 'btn-toolbar x-huge icon-top', @@ -2288,6 +2301,7 @@ define([ _injectComponent('#slot-btn-datetime', this.btnInsDateTime); _injectComponent('#slot-btn-insfield', this.btnInsField); _injectComponent('#slot-btn-blankpage', this.btnBlankPage); + _injectComponent('#slot-btn-smartpicker', this.btnSmartPicker); _injectComponent('#slot-btn-insshape', this.btnInsertShape); _injectComponent('#slot-btn-inssmartart', this.btnInsertSmartArt); _injectComponent('#slot-btn-insequation', this.btnInsertEquation); diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 43f1ff0a51..68b14d0678 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -3935,6 +3935,7 @@ "DE.Views.TextToTableDialog.txtAutoText": "Auto", "DE.Views.Toolbar.capBtnAddComment": "Add Comment", "DE.Views.Toolbar.capBtnBlankPage": "Blank Page", + "DE.Views.Toolbar.capBtnSmartPicker": "Smart Picker", "DE.Views.Toolbar.capBtnColumns": "Columns", "DE.Views.Toolbar.capBtnComment": "Comment", "DE.Views.Toolbar.capBtnDateTime": "Date & Time", From a9328df4202d0397855d8b9c35b969b70cfe74e6 Mon Sep 17 00:00:00 2001 From: Hendrik Leidinger Date: Thu, 15 Jan 2026 10:49:59 -0800 Subject: [PATCH 07/10] first try with new api command Signed-off-by: Hendrik Leidinger --- apps/documenteditor/main/app/controller/Toolbar.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index d027521dc6..f0d587ef36 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -2037,6 +2037,7 @@ define([ props.put_Bookmark(null); props.put_Text(data); this.api.add_Hyperlink(props); + this.api.PastePlainText("This is an example text that should be pasted") Common.NotificationCenter.trigger('storage:link-insert', data); }, From ae50a135892ad03048ebf32fdf0fd0b93cbe8664 Mon Sep 17 00:00:00 2001 From: Hendrik Leidinger Date: Thu, 22 Jan 2026 11:42:34 -0800 Subject: [PATCH 08/10] support for plain text insertion Signed-off-by: Hendrik Leidinger --- apps/api/documents/api.js | 8 ++++++++ apps/common/Gateway.js | 4 ++++ apps/documenteditor/main/app/controller/Toolbar.js | 9 ++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js index 0b375104ac..c952f33604 100644 --- a/apps/api/documents/api.js +++ b/apps/api/documents/api.js @@ -781,6 +781,13 @@ }); }; + var _insertPlainText = function(data) { + _sendCommand({ + command: 'insertPlainText', + data: data + }); + }; + var _setMailMergeRecipients = function(data) { _sendCommand({ command: 'setMailMergeRecipients', @@ -918,6 +925,7 @@ setSharingSettings : _setSharingSettings, insertImage : _insertImage, insertLink : _insertLink, + insertPlainText : _insertPlainText, setMailMergeRecipients: _setMailMergeRecipients, setRevisedFile : _setRevisedFile, setFavorite : _setFavorite, diff --git a/apps/common/Gateway.js b/apps/common/Gateway.js index eb55a5f491..98cda9673b 100644 --- a/apps/common/Gateway.js +++ b/apps/common/Gateway.js @@ -119,6 +119,10 @@ if (window.Common === undefined) { $me.trigger('insertlink', data); }, + 'insertPlainText': function(data) { + $me.trigger('insertplaintext', data); + }, + 'setMailMergeRecipients': function(data) { $me.trigger('setmailmergerecipients', data); }, diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index f0d587ef36..dd1c79fa1a 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -306,6 +306,7 @@ define([ this.onBtnChangeState('save:disabled', toolbar.btnSave, toolbar.btnSave.isDisabled()); Common.Gateway.on('insertimage', _.bind(this.insertImage, this)); Common.Gateway.on('insertlink', _.bind(this.insertLink, this)); + Common.Gateway.on('insertplaintext', _.bind(this.insertPlainText, this)); }, attachUIEvents: function(toolbar) { @@ -440,6 +441,7 @@ define([ toolbar.btnHyphenation.menu.on('show:after', _.bind(this.onHyphenationShow, this)); Common.Gateway.on('insertimage', _.bind(this.insertImage, this)); Common.Gateway.on('insertlink', _.bind(this.insertLink, this)); + Common.Gateway.on('insertplaintext', _.bind(this.insertPlainText, this)); Common.Gateway.on('setmailmergerecipients', _.bind(this.setMailMergeRecipients, this)); Common.Gateway.on('setrequestedspreadsheet', _.bind(this.setRequestedSpreadsheet, this)); Common.NotificationCenter.on('storage:spreadsheet-load', _.bind(this.openSpreadsheetFromStorage, this)); @@ -2037,11 +2039,16 @@ define([ props.put_Bookmark(null); props.put_Text(data); this.api.add_Hyperlink(props); - this.api.PastePlainText("This is an example text that should be pasted") Common.NotificationCenter.trigger('storage:link-insert', data); }, + insertPlainText: function(data) { + + this.api.PastePlainText(data) + Common.NotificationCenter.trigger('storage:plain-text-insert', data); + }, + onBtnInsertTextClick: function(btn, e) { btn.menu.getItems(true).forEach(function(item) { if(item.value == btn.options.textboxType) From a5982440bfd783dc85b8dee7b05130d934f8bfad Mon Sep 17 00:00:00 2001 From: Hendrik Leidinger Date: Thu, 22 Jan 2026 15:04:45 -0800 Subject: [PATCH 09/10] smart picker extension for spreadsheet and presentation editor Signed-off-by: Hendrik Leidinger --- .../main/app/controller/Toolbar.js | 27 +++++++++++++++++ .../main/app/template/Toolbar.template | 1 + .../main/app/view/Toolbar.js | 18 +++++++++++ apps/presentationeditor/main/locale/en.json | 1 + .../main/app/controller/Toolbar.js | 30 ++++++++++++++++++- .../main/app/template/Toolbar.template | 1 + .../main/app/view/Toolbar.js | 16 ++++++++++ apps/spreadsheeteditor/main/locale/en.json | 1 + 8 files changed, 94 insertions(+), 1 deletion(-) diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 576110174a..6c2a28e4c2 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -388,6 +388,7 @@ define([ toolbar.btnShapesMerge.menu.on('item:click', _.bind(this.onClickMenuShapesMerge, this)); toolbar.btnShapesMerge.menu.on('show:before', _.bind(this.onBeforeShapesMerge, this)); toolbar.btnInsertHyperlink.on('click', _.bind(this.onHyperlinkClick, this)); + toolbar.btnSmartPicker.on('click', _.bind(this.onBtnSmartPickerClick, this)); toolbar.mnuTablePicker.on('select', _.bind(this.onTablePickerSelect, this)); toolbar.btnInsertTable.menu.on('item:click', _.bind(this.onInsertTableClick, this)); toolbar.btnClearStyle.on('click', _.bind(this.onClearStyleClick, this)); @@ -403,6 +404,8 @@ define([ toolbar.btnInsDateTime.on('click', _.bind(this.onEditHeaderClick, this, 'datetime')); toolbar.btnInsSlideNum.on('click', _.bind(this.onEditHeaderClick, this, 'slidenum')); Common.Gateway.on('insertimage', _.bind(this.insertImage, this)); + Common.Gateway.on('insertlink', _.bind(this.insertLink, this)); + Common.Gateway.on('insertplaintext', _.bind(this.insertPlainText, this)); toolbar.btnInsAudio && toolbar.btnInsAudio.on('click', _.bind(this.onAddAudio, this)); toolbar.btnInsVideo && toolbar.btnInsVideo.on('click', _.bind(this.onAddVideo, this)); @@ -1848,6 +1851,13 @@ define([ Common.component.Analytics.trackEvent('ToolBar', 'Add Hyperlink'); }, + onBtnSmartPickerClick: function(btn) { + Common.Gateway.requestSmartPicker() + + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + Common.component.Analytics.trackEvent('ToolBar', 'Smart Picker'); + }, + onTablePickerSelect: function(picker, columns, rows, e) { if (this.api) { this.toolbar.fireEvent('inserttable', this.toolbar); @@ -1958,6 +1968,23 @@ define([ Common.NotificationCenter.trigger('storage:image-insert', data); }, + insertLink: function(data) { // gateway + + var props = new Asc.CHyperlinkProperty(); + props.put_Value(data); + props.put_Bookmark(null); + props.put_Text(data); + this.api.add_Hyperlink(props); + + Common.NotificationCenter.trigger('storage:link-insert', data); + }, + + insertPlainText: function(data) { + + this.api.PastePlainText(data) + Common.NotificationCenter.trigger('storage:plain-text-insert', data); + }, + onBtnInsertTextClick: function(btn, e) { btn.menu.getItems(true).forEach(function(item) { if(item.value == btn.options.textboxType) diff --git a/apps/presentationeditor/main/app/template/Toolbar.template b/apps/presentationeditor/main/app/template/Toolbar.template index 9b7b3a5007..516b7ed4e9 100644 --- a/apps/presentationeditor/main/app/template/Toolbar.template +++ b/apps/presentationeditor/main/app/template/Toolbar.template @@ -132,6 +132,7 @@
    +
    diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index f595b5d33d..9a30387ec6 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -1041,6 +1041,23 @@ define([ label: me.tipInsertHyperlink }; + me.btnSmartPicker = new Common.UI.Button({ + id: 'tlbtn-smartpicker', + cls: 'btn-toolbar x-huge icon-top', + iconCls: 'toolbar__icon btn-big-inserthyperlink', + caption: me.capBtnSmartPicker, + lock: [_set.hyperlinkLock, _set.slideDeleted, _set.paragraphLock, _set.lostConnect, _set.noSlides, _set.noParagraphSelected, _set.slideMasterMode], + dataHint: '1', + dataHintDirection: 'bottom', + dataHintOffset: 'small' + }); + me.paragraphControls.push(me.btnSmartPicker); + me.lockControls.push(me.btnSmartPicker); + me.shortcutHints.SmartPicker = { + btn: me.btnSmartPicker, + label: me.tipBtnSmartPicker + }; + me.btnInsertTextArt = new Common.UI.Button({ id: 'tlbtn-inserttextart', cls: 'btn-toolbar x-huge icon-top', @@ -1556,6 +1573,7 @@ define([ _injectComponent('#slot-btn-insertequation', this.btnInsertEquation); _injectComponent('#slot-btn-inssymbol', this.btnInsertSymbol); _injectComponent('#slot-btn-insertlink', this.btnInsertHyperlink); + _injectComponent('#slot-btn-smartpicker', this.btnSmartPicker); _injectComponent('#slot-btn-inserttable', this.btnInsertTable); _injectComponent('#slot-btn-insertchart', this.btnInsertChart); _injectComponent('#slot-btn-instextart', this.btnInsertTextArt); diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index 219e5e2239..a521c096fc 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -3283,6 +3283,7 @@ "PE.Views.Toolbar.capInsertChart": "Chart", "PE.Views.Toolbar.capInsertEquation": "Equation", "PE.Views.Toolbar.capInsertHyperlink": "Hyperlink", + "PE.Views.Toolbar.capBtnSmartPicker": "Smart Picker", "PE.Views.Toolbar.capInsertImage": "Image", "PE.Views.Toolbar.capInsertShape": "Shape", "PE.Views.Toolbar.capInsertTable": "Table", diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 0b5a023059..dfa47154ec 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -437,6 +437,7 @@ define([ toolbar.btnInsertTable.on('click', _.bind(this.onBtnInsertTableClick, this)); toolbar.btnInsertImage.menu.on('item:click', _.bind(this.onInsertImageMenu, this)); toolbar.btnInsertHyperlink.on('click', _.bind(this.onHyperlink, this)); + toolbar.btnSmartPicker.on('click', _.bind(this.onBtnSmartPickerClick, this)); toolbar.btnInsertText.on('click', _.bind(this.onBtnInsertTextClick, this)); toolbar.btnInsertText.menu.on('item:click', _.bind(this.onMenuInsertTextClick, this)); toolbar.btnInsertShape.menu.on('hide:after', _.bind(this.onInsertShapeHide, this)); @@ -511,7 +512,9 @@ define([ toolbar.btnInsertChartRecommend.on('click', _.bind(this.onChartRecommendedClick, this)); toolbar.btnFillNumbers.menu.on('item:click', _.bind(this.onFillNumMenu, this)); toolbar.btnFillNumbers.menu.on('show:before', _.bind(this.onShowBeforeFillNumMenu, this)); - Common.Gateway.on('insertimage', _.bind(this.insertImage, this)); + Common.Gateway.on('insertimage', _.bind(this.insertImage, this)); + Common.Gateway.on('insertlink', _.bind(this.insertLink, this)); + Common.Gateway.on('insertplaintext', _.bind(this.insertPlainText, this)); this.onSetupCopyStyleButton(); this.onBtnChangeState('undo:disabled', toolbar.btnUndo, toolbar.btnUndo.isDisabled()); @@ -1027,6 +1030,13 @@ define([ Common.component.Analytics.trackEvent('ToolBar', 'Table'); }, + onBtnSmartPickerClick: function(btn) { + Common.Gateway.requestSmartPicker() + + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + Common.component.Analytics.trackEvent('ToolBar', 'Smart Picker'); + }, + onInsertImageMenu: function(menu, item, e) { var me = this; if (item.value === 'file') { @@ -1100,6 +1110,24 @@ define([ Common.NotificationCenter.trigger('storage:image-insert', data); }, + + insertLink: function(data) { // gateway + + var props = new Asc.asc_CHyperlink(); + props.asc_setHyperlinkUrl(data); + props.asc_setText(data); + this.api.asc_insertHyperlink(props); + + Common.NotificationCenter.trigger('storage:link-insert', data); + }, + + insertPlainText: function(data) { + + this.api.PastePlainText(data) + Common.NotificationCenter.trigger('storage:plain-text-insert', data); + }, + + onHyperlink: function(btn) { Common.NotificationCenter.trigger('protect:check', this.onHyperlinkCallback, this, [btn]); }, diff --git a/apps/spreadsheeteditor/main/app/template/Toolbar.template b/apps/spreadsheeteditor/main/app/template/Toolbar.template index 962a85b6e1..53eb63ab31 100644 --- a/apps/spreadsheeteditor/main/app/template/Toolbar.template +++ b/apps/spreadsheeteditor/main/app/template/Toolbar.template @@ -159,6 +159,7 @@
    +
    diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index a5004d3969..38435a9dea 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -1362,6 +1362,21 @@ define([ label: me.tipInsertHyperlink }; + me.btnSmartPicker = new Common.UI.Button({ + id : 'tlbtn-smartpicker', + cls : 'btn-toolbar x-huge icon-top', + iconCls : 'toolbar__icon btn-big-inserthyperlink', + caption : me.capBtnSmartPicker, + lock : [_set.editCell, _set.selChart, _set.selChartText, _set.selImage, _set.selShape, _set.cantHyperlink, _set.selSlicer, _set.multiselect, _set.lostConnect, _set.coAuth, _set.editPivot, _set['InsertHyperlinks'], _set.userProtected], + dataHint : '1', + dataHintDirection: 'bottom', + dataHintOffset: 'small' + }); + me.shortcutHints.SmartPicker = { + btn: me.btnSmartPicker, + label: me.tipSmartPicker + }; + me.btnInsertChart = new Common.UI.Button({ id : 'tlbtn-insertchart', cls : 'btn-toolbar x-huge icon-top', @@ -2585,6 +2600,7 @@ define([ _injectComponent('#slot-btn-insimage', this.btnInsertImage); _injectComponent('#slot-btn-instable', this.btnInsertTable); _injectComponent('#slot-btn-inshyperlink', this.btnInsertHyperlink); + _injectComponent('#slot-btn-smartpicker', this.btnSmartPicker); _injectComponent('#slot-btn-insshape', this.btnInsertShape); _injectComponent('#slot-btn-instext', this.btnInsertText); _injectComponent('#slot-btn-instextart', this.btnInsertTextArt); diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index a19f571617..dc5652a387 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -4711,6 +4711,7 @@ "SSE.Views.Toolbar.capInsertChartRecommend": "Recommended Chart", "SSE.Views.Toolbar.capInsertEquation": "Equation", "SSE.Views.Toolbar.capInsertHyperlink": "Hyperlink", + "SSE.Views.Toolbar.capBtnSmartPicker": "Smart Picker", "SSE.Views.Toolbar.capInsertImage": "Image", "SSE.Views.Toolbar.capInsertShape": "Shape", "SSE.Views.Toolbar.capInsertSpark": "Sparkline", From 25559928a992fb5f94e74d600f1a2855c010bbd6 Mon Sep 17 00:00:00 2001 From: Hendrik Leidinger Date: Fri, 23 Jan 2026 10:16:09 -0800 Subject: [PATCH 10/10] fixed lock conditions, added tips when hovering Signed-off-by: Hendrik Leidinger --- apps/documenteditor/main/app/view/Toolbar.js | 9 ++++++--- apps/documenteditor/main/locale/en.json | 1 + apps/presentationeditor/main/locale/en.json | 1 + apps/spreadsheeteditor/main/locale/en.json | 1 + 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 30e0544125..2d41a26b46 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -1043,15 +1043,18 @@ define([ this.btnSmartPicker = new Common.UI.Button({ id: 'id-toolbar-btn-smartpicker', cls: 'btn-toolbar x-huge icon-top', - iconCls: 'toolbar__icon btn-blankpage', - lock: [_set.paragraphLock, _set.headerLock, _set.richEditLock, _set.plainEditLock, _set.inEquation, _set.richDelLock, _set.plainDelLock, _set.inHeader, _set.inFootnote, _set.inControl, - _set.cantPageBreak, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockViewIns, _set.docLockForms, _set.docLockCommentsIns, _set.viewMode], + iconCls: 'toolbar__icon btn-big-inserthyperlink', + lock: [_set.paragraphLock, _set.headerLock, _set.hyperlinkLock, _set.previewReviewMode, _set.viewFormMode, _set.lostConnect, _set.disableOnStart, _set.docLockViewIns, _set.docLockForms, _set.docLockCommentsIns, _set.viewMode], caption: me.capBtnSmartPicker, dataHint: '1', dataHintDirection: 'bottom', dataHintOffset: 'small' }); this.paragraphControls.push(this.btnSmartPicker); + this.shortcutHints.SmartPicker = { + btn: this.btnSmartPicker, + label: this.tipSmartPicker + }; this.btnBlankPage = new Common.UI.Button({ id: 'id-toolbar-btn-blankpage', diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 68b14d0678..4afc0ad735 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -3221,6 +3221,7 @@ "DE.Views.Links.tipContentsUpdate": "Update table of contents", "DE.Views.Links.tipCrossRef": "Insert cross-reference", "DE.Views.Links.tipInsertHyperlink": "Add hyperlink", + "DE.Views.Links.tipSmartPicker": "Open the Smart Picker", "DE.Views.Links.tipNotes": "Insert or edit footnotes", "DE.Views.Links.tipTableFigures": "Insert table of figures", "DE.Views.Links.tipTableFiguresUpdate": "Update table of figures", diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index a521c096fc..53fb579bf4 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -3413,6 +3413,7 @@ "PE.Views.Toolbar.tipInsertEquation": "Insert equation", "PE.Views.Toolbar.tipInsertHorizontalText": "Insert horizontal text box", "PE.Views.Toolbar.tipInsertHyperlink": "Add hyperlink", + "PE.Views.Toolbar.tipBtnSmartPicker": "Open the Smart Picker", "PE.Views.Toolbar.tipInsertImage": "Insert image", "PE.Views.Toolbar.tipInsertShape": "Insert shape", "PE.Views.Toolbar.tipInsertSmartArt": "Insert SmartArt", diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index dc5652a387..569c140618 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -4914,6 +4914,7 @@ "SSE.Views.Toolbar.tipInsertEquation": "Insert equation", "SSE.Views.Toolbar.tipInsertHorizontalText": "Insert horizontal text box", "SSE.Views.Toolbar.tipInsertHyperlink": "Add hyperlink", + "SSE.Views.Toolbar.tipSmartPicker": "Open the Smart Picker", "SSE.Views.Toolbar.tipInsertImage": "Insert image", "SSE.Views.Toolbar.tipInsertOpt": "Insert cells", "SSE.Views.Toolbar.tipInsertShape": "Insert shape",