From aafd624e22316fa8c0320991f862bce7e27663cd Mon Sep 17 00:00:00 2001 From: Dmitry-Ilyushechkin Date: Thu, 5 Feb 2026 18:01:57 +0300 Subject: [PATCH 1/3] fix bug 79647 --- .../main/app/controller/DocumentHolderExt.js | 3 ++ .../main/app/view/DocumentHolderExt.js | 50 +++++++++++++++++++ .../main/app/controller/DocumentHolderExt.js | 3 ++ .../main/app/view/DocumentHolderExt.js | 50 +++++++++++++++++++ 4 files changed, 106 insertions(+) diff --git a/apps/documenteditor/main/app/controller/DocumentHolderExt.js b/apps/documenteditor/main/app/controller/DocumentHolderExt.js index 2bdbe2488c..d8764c5c58 100644 --- a/apps/documenteditor/main/app/controller/DocumentHolderExt.js +++ b/apps/documenteditor/main/app/controller/DocumentHolderExt.js @@ -245,10 +245,13 @@ define([], function () { view.menuStyleSaveInTable.on('click', _.bind(me.onMenuSaveStyle, me)); view.menuStyleUpdateInTable.on('click', _.bind(me.onMenuUpdateStyle, me)); view.menuParagraphAdvanced.on('click', _.bind(me.advancedParagraphClick, me)); + view.menuEditHyperlinkPic.on('click', _.bind(me.editHyperlink, me)); view.menuEditHyperlinkTable.on('click', _.bind(me.editHyperlink, me)); view.menuEditHyperlinkPara.on('click', _.bind(me.editHyperlink, me)); + view.menuRemoveHyperlinkPic.on('click', _.bind(me.onRemoveHyperlink, me)); view.menuRemoveHyperlinkTable.on('click', _.bind(me.onRemoveHyperlink, me)); view.menuRemoveHyperlinkPara.on('click', _.bind(me.onRemoveHyperlink, me)); + view.menuAddHyperlinkPic.on('click', _.bind(me.addHyperlink, me)); view.menuAddHyperlinkTable.on('click', _.bind(me.addHyperlink, me)); view.menuAddHyperlinkPara.on('click', _.bind(me.addHyperlink, me)); view.menuAddCommentTable.on('click', _.bind(me.addComment, me)); diff --git a/apps/documenteditor/main/app/view/DocumentHolderExt.js b/apps/documenteditor/main/app/view/DocumentHolderExt.js index bac20ab99c..2e6b66871b 100644 --- a/apps/documenteditor/main/app/view/DocumentHolderExt.js +++ b/apps/documenteditor/main/app/view/DocumentHolderExt.js @@ -831,6 +831,36 @@ define([], function () { caption: me.textEditObject }); + var menuHyperlinkPicSeparator = new Common.UI.MenuItem({ + caption : '--' + }); + + me.menuAddHyperlinkPic = new Common.UI.MenuItem({ + iconCls: 'menu__icon btn-inserthyperlink', + caption : me.hyperlinkText + }); + + me.menuEditHyperlinkPic = new Common.UI.MenuItem({ + caption : me.editHyperlinkText + }); + + me.menuRemoveHyperlinkPic = new Common.UI.MenuItem({ + caption : me.removeHyperlinkText + }); + + var menuHyperlinkPic = new Common.UI.MenuItem({ + iconCls: 'menu__icon btn-inserthyperlink', + caption : me.hyperlinkText, + menu : new Common.UI.Menu({ + cls: 'shifted-right', + menuAlign: 'tl-tr', + items : [ + me.menuEditHyperlinkPic, + me.menuRemoveHyperlinkPic + ] + }) + }); + this.pictureMenu = new Common.UI.Menu({ cls: 'shifted-right', restoreHeightAndTop: true, @@ -1011,6 +1041,23 @@ define([], function () { var canEditPoints = me.api && me.api.asc_canEditGeometry(); me.menuImgEditPoints.setVisible(canEditPoints); canEditPoints && me.menuImgEditPoints.setDisabled(islocked); + + var text = null; + if (me.api) { + text = me.api.can_AddHyperlink(); + } + me.menuAddHyperlinkPic.setVisible(value.hyperProps===undefined && text!==false); + menuHyperlinkPic.setVisible(value.hyperProps!==undefined); + menuHyperlinkPicSeparator.setVisible(me.menuAddHyperlinkPic.isVisible() || menuHyperlinkPic.isVisible()); + me.menuEditHyperlinkPic.hyperProps = value.hyperProps; + me.menuRemoveHyperlinkPic.hyperProps = value.hyperProps; + if (text !== false) { + me.menuAddHyperlinkPic.hyperProps = {}; + me.menuAddHyperlinkPic.hyperProps.value = new Asc.CHyperlinkProperty(); + me.menuAddHyperlinkPic.hyperProps.value.put_Text(text); + } + me.menuAddHyperlinkPic.setDisabled(islocked); + menuHyperlinkPic.setDisabled(islocked || (value.hyperProps!==undefined && value.hyperProps.isSeveralLinks===true)); }, items: [ me.menuImgCut, @@ -1039,6 +1086,9 @@ define([], function () { menuInsertCaptionSeparator, me.menuSaveAsPicture, menuSaveAsPictureSeparator, + me.menuAddHyperlinkPic, + menuHyperlinkPic, + menuHyperlinkPicSeparator, me.menuImgCrop, me.menuImgResetCrop, me.menuOriginalSize, diff --git a/apps/presentationeditor/main/app/controller/DocumentHolderExt.js b/apps/presentationeditor/main/app/controller/DocumentHolderExt.js index 4116c8f836..e6a0c261e0 100644 --- a/apps/presentationeditor/main/app/controller/DocumentHolderExt.js +++ b/apps/presentationeditor/main/app/controller/DocumentHolderExt.js @@ -187,10 +187,13 @@ define([], function () { view.menuTableCut.on('click', _.bind(me.onCutCopyPaste, me)); view.menuAddHyperlinkPara.on('click', _.bind(me.addHyperlink, me)); view.menuAddHyperlinkTable.on('click', _.bind(me.addHyperlink, me)); + view.menuAddHyperlinkPic.on('click', _.bind(me.addHyperlink, me)); view.menuEditHyperlinkPara.on('click', _.bind(me.editHyperlink, me)); view.menuEditHyperlinkTable.on('click', _.bind(me.editHyperlink, me)); + view.menuEditHyperlinkPic.on('click', _.bind(me.editHyperlink, me)); view.menuRemoveHyperlinkPara.on('click', _.bind(me.removeHyperlink, me)); view.menuRemoveHyperlinkTable.on('click', _.bind(me.removeHyperlink, me)); + view.menuRemoveHyperlinkPic.on('click', _.bind(me.removeHyperlink, me)); view.menuChartEdit.on('click', _.bind(me.editChartClick, me, undefined)); view.menuImgSaveAsPicture.on('click', _.bind(me.saveAsPicture, me)); view.menuTableSaveAsPicture.on('click', _.bind(me.saveAsPicture, me)); diff --git a/apps/presentationeditor/main/app/view/DocumentHolderExt.js b/apps/presentationeditor/main/app/view/DocumentHolderExt.js index 0828b85653..5c450a69a6 100644 --- a/apps/presentationeditor/main/app/view/DocumentHolderExt.js +++ b/apps/presentationeditor/main/app/view/DocumentHolderExt.js @@ -2194,6 +2194,36 @@ define([], function () { caption: me.textEditObject }); + var menuHyperlinkPicSeparator = new Common.UI.MenuItem({ + caption : '--' + }); + + me.menuAddHyperlinkPic = new Common.UI.MenuItem({ + iconCls: 'menu__icon btn-inserthyperlink', + caption : me.hyperlinkText + }); + + me.menuEditHyperlinkPic = new Common.UI.MenuItem({ + caption : me.editHyperlinkText + }); + + me.menuRemoveHyperlinkPic = new Common.UI.MenuItem({ + caption : me.removeHyperlinkText + }); + + var menuHyperlinkPic = new Common.UI.MenuItem({ + iconCls: 'menu__icon btn-inserthyperlink', + caption : me.hyperlinkText, + menu : new Common.UI.Menu({ + cls: 'shifted-right', + menuAlign: 'tl-tr', + items : [ + me.menuEditHyperlinkPic, + me.menuRemoveHyperlinkPic + ] + }) + }); + me.pictureMenu = new Common.UI.Menu({ cls: 'shifted-right', restoreHeightAndTop: true, @@ -2296,6 +2326,23 @@ define([], function () { me.menuImgCut.setDisabled(disabled || !cancopy); me.menuImgPaste.setDisabled(disabled); menuImgShapeArrange.setDisabled(disabled); + + var text = null; + if (me.api) { + text = me.api.can_AddHyperlink(); + } + me.menuAddHyperlinkPic.setVisible(value.hyperProps===undefined && text!==false); + menuHyperlinkPic.setVisible(value.hyperProps!==undefined); + menuHyperlinkPicSeparator.setVisible(me.menuAddHyperlinkPic.isVisible() || menuHyperlinkPic.isVisible()); + me.menuEditHyperlinkPic.hyperProps = value.hyperProps; + me.menuRemoveHyperlinkPic.hyperProps = value.hyperProps; + if (text !== false) { + me.menuAddHyperlinkPic.hyperProps = {}; + me.menuAddHyperlinkPic.hyperProps.value = new Asc.CHyperlinkProperty(); + me.menuAddHyperlinkPic.hyperProps.value.put_Text(text); + } + me.menuAddHyperlinkPic.setDisabled(disabled); + menuHyperlinkPic.setDisabled(disabled || (value.hyperProps!==undefined && value.hyperProps.isSeveralLinks===true)); }, items: [ me.menuImgCut, @@ -2311,6 +2358,9 @@ define([], function () { menuImgShapeSeparator, //Separator me.menuImgSaveAsPicture, menuImgSaveAsPictureSeparator, //Separator + me.menuAddHyperlinkPic, + menuHyperlinkPic, + menuHyperlinkPicSeparator, me.menuImgCrop, me.menuImgResetCrop, me.menuImgOriginalSize, From 79882fa0848c4b8e0160d1d7b11437b76b0ecd84 Mon Sep 17 00:00:00 2001 From: Dmitry-Ilyushechkin Date: Fri, 6 Feb 2026 13:07:30 +0300 Subject: [PATCH 2/3] =?UTF-8?q?[SSE]=20Added=20=E2=80=9Clink=E2=80=9D=20it?= =?UTF-8?q?em=20to=20the=20context=20menu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/app/controller/DocumentHolderExt.js | 11 +++++++ .../main/app/view/DocumentHolderExt.js | 32 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolderExt.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolderExt.js index 291e36e4a5..9f37be0f34 100644 --- a/apps/spreadsheeteditor/main/app/controller/DocumentHolderExt.js +++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolderExt.js @@ -185,6 +185,9 @@ define([], function () { view.menuParagraphBullets.menu.on('show:after', _.bind(me.onBulletMenuShowAfter, me)); view.menuAddHyperlinkShape.on('click', _.bind(me.onInsHyperlink, me)); view.menuEditHyperlinkShape.on('click', _.bind(me.onInsHyperlink, me)); + view.menuAddHyperlinkPic.on('click', _.bind(me.onInsHyperlink, me)); + view.menuEditHyperlinkPic.on('click', _.bind(me.onInsHyperlink, me)); + view.menuRemoveHyperlinkPic.on('click', _.bind(me.onDelHyperlink, me)) view.menuRemoveHyperlinkShape.on('click', _.bind(me.onDelHyperlink, me)); view.pmiTextAdvanced.on('click', _.bind(me.onTextAdvanced, me)); view.mnuShapeAdvanced.on('click', _.bind(me.onShapeAdvanced, me)); @@ -2314,6 +2317,14 @@ define([], function () { }); } + var hyperinfo = cellinfo.asc_getHyperlink(), + can_add_hyperlink = this.api.asc_canAddShapeHyperlink(); + documentHolder.menuHyperlinkPic.setVisible((isimagemenu || isshapemenu) && can_add_hyperlink!==false && hyperinfo); + documentHolder.menuAddHyperlinkPic.setVisible((isimagemenu || isshapemenu) && can_add_hyperlink!==false && !hyperinfo); + documentHolder.menuHyperlinkPicSeparator.setVisible((isimagemenu || isshapemenu) && can_add_hyperlink!==false); + documentHolder.menuHyperlinkPic.setDisabled(isObjLocked || this._state.wsProps['InsertHyperlinks']); + documentHolder.menuAddHyperlinkPic.setDisabled(isObjLocked || this._state.wsProps['InsertHyperlinks']); + var objcount = this.api.asc_getSelectedDrawingObjectsCount(); documentHolder.menuImageAlign.menu.items[7].setDisabled(objcount<3); documentHolder.menuImageAlign.menu.items[8].setDisabled(objcount<3); diff --git a/apps/spreadsheeteditor/main/app/view/DocumentHolderExt.js b/apps/spreadsheeteditor/main/app/view/DocumentHolderExt.js index b6c7c4f20a..81803dc831 100644 --- a/apps/spreadsheeteditor/main/app/view/DocumentHolderExt.js +++ b/apps/spreadsheeteditor/main/app/view/DocumentHolderExt.js @@ -1572,6 +1572,35 @@ define([], function () { caption: '--' }); + me.menuHyperlinkPicSeparator = new Common.UI.MenuItem({ + caption: '--' + }); + + me.menuAddHyperlinkPic = new Common.UI.MenuItem({ + caption: me.txtInsHyperlink + }); + + me.menuEditHyperlinkPic = new Common.UI.MenuItem({ + caption: me.editHyperlinkText + }); + + me.menuRemoveHyperlinkPic = new Common.UI.MenuItem({ + caption: me.removeHyperlinkText + }); + + me.menuHyperlinkPic = new Common.UI.MenuItem({ + iconCls: 'menu__icon btn-inserthyperlink', + caption: me.txtInsHyperlink, + menu: new Common.UI.Menu({ + cls: 'shifted-right', + menuAlign: 'tl-tr', + items: [ + me.menuEditHyperlinkPic, + me.menuRemoveHyperlinkPic + ] + }) + }); + this.imgMenu = new Common.UI.Menu({ cls: 'shifted-right', restoreHeightAndTop: true, @@ -1594,6 +1623,9 @@ define([], function () { menuSaveAsPictureSeparator, me.menuSaveAsPicture, me.mnuShapeSeparator, + me.menuAddHyperlinkPic, + me.menuHyperlinkPic, + me.menuHyperlinkPicSeparator, me.menuImgCrop, me.menuImgResetCrop, me.mnuChartData, From f5520671510195c102a9c611c9efd806dc023b80 Mon Sep 17 00:00:00 2001 From: Dmitry-Ilyushechkin Date: Mon, 9 Feb 2026 16:04:37 +0300 Subject: [PATCH 3/3] Fix: missing hyperlink props in picture context menu --- apps/documenteditor/main/app/controller/DocumentHolderExt.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/documenteditor/main/app/controller/DocumentHolderExt.js b/apps/documenteditor/main/app/controller/DocumentHolderExt.js index d8764c5c58..27b19c180a 100644 --- a/apps/documenteditor/main/app/controller/DocumentHolderExt.js +++ b/apps/documenteditor/main/app/controller/DocumentHolderExt.js @@ -364,8 +364,7 @@ define([], function () { menu_props.imgProps.locked = (elValue) ? elValue.get_Locked() : false; noobject = false; - if ( (shapeprops===undefined || shapeprops===null) && (chartprops===undefined || chartprops===null) ) // not shape and chart - break; + } else if (Asc.c_oAscTypeSelectElement.Table == elType) { menu_to_show = documentHolder.tableMenu;