Skip to content

Commit 52ab56d

Browse files
authored
IBX-9981: Added go to and edit image (#264)
1 parent 772b124 commit 52ab56d

File tree

6 files changed

+147
-0
lines changed

6 files changed

+147
-0
lines changed

src/bundle/Resources/public/js/CKEditor/core/base-ckeditor.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,13 @@ const VIEWPORT_TOP_OFFSET_DISTRACTION_FREE_MODE = 0;
203203
embedImage: {
204204
toolbar: [
205205
'imageVarations',
206+
'|',
206207
'ibexaBlockLeftAlignment',
207208
'ibexaBlockCenterAlignment',
208209
'ibexaBlockRightAlignment',
210+
'|',
211+
'imageGoTo',
212+
'imageGoToEdit',
209213
'ibexaRemoveElement',
210214
],
211215
},

src/bundle/Resources/public/js/CKEditor/embed/embed.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import IbexaEmbedContentInlineUI from './content-inline/embed-inline-ui';
88
import IbexaEmbedImageUI from './image/embed-image-ui';
99
import IbexaEmbedImageToolbar from './image/embed-image-toolbar';
1010
import IbexaEmbedImageVariationsUI from './image/embed-image-variations-ui';
11+
import IbexaEmbedImageGoToUI from './image/embed-image-go-to-ui';
12+
import IbexaEmbedImageGoToEditUI from './image/embed-image-go-to-edit-ui';
1113

1214
class IbexaEmbed extends Plugin {
1315
static get requires() {
@@ -20,6 +22,8 @@ class IbexaEmbed extends Plugin {
2022
IbexaEmbedImageUI,
2123
IbexaEmbedImageToolbar,
2224
IbexaEmbedImageVariationsUI,
25+
IbexaEmbedImageGoToUI,
26+
IbexaEmbedImageGoToEditUI,
2327
];
2428
}
2529
}

src/bundle/Resources/public/js/CKEditor/embed/image/embed-image-editing.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,14 @@ class IbexaEmbedImageEditing extends Plugin {
102102
'data-ezview': 'embed',
103103
class: CONTAINER_CLASS,
104104
});
105+
const emdedItemsUpdateChannel = new BroadcastChannel('ibexa-emded-item-live-update');
105106

106107
this.loadImagePreview(modelElement);
107108

109+
emdedItemsUpdateChannel.addEventListener('message', () => {
110+
this.loadImagePreview(modelElement);
111+
});
112+
108113
return toWidget(container, downcastWriter);
109114
},
110115
})
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
2+
import { createDropdown, addListToDropdown } from '@ckeditor/ckeditor5-ui/src/dropdown/utils';
3+
import Model from '@ckeditor/ckeditor5-ui/src/model';
4+
import Collection from '@ckeditor/ckeditor5-utils/src/collection';
5+
6+
import IbexaButtonView from '../../common/button-view/button-view';
7+
import { findContent } from '../../services/content-service';
8+
9+
const { Translator, ibexa } = window;
10+
11+
class IbexaEmbedImageGoToEditUI extends Plugin {
12+
constructor(props) {
13+
super(props);
14+
}
15+
16+
editContent({ contentId, languageCode }) {
17+
const editEmbeddedItemForm = document.querySelector('[name="embedded_item_edit"]');
18+
19+
const contentInfoInput = editEmbeddedItemForm.querySelector('[name="embedded_item_edit[content_info]"]');
20+
const languageInput = editEmbeddedItemForm.querySelector(`[name="embedded_item_edit[language]"][value="${languageCode}"]`);
21+
22+
contentInfoInput.value = contentId;
23+
languageInput.click();
24+
25+
editEmbeddedItemForm.submit();
26+
}
27+
28+
init() {
29+
this.editor.ui.componentFactory.add('imageGoToEdit', (locale) => {
30+
const dropdownView = createDropdown(locale, IbexaButtonView);
31+
const { buttonView } = dropdownView;
32+
33+
buttonView.set({
34+
label: Translator.trans(/*@Desc("Edit")*/ 'image_btn.edit.label', {}, 'ck_editor'),
35+
icon: ibexa.helpers.icon.getIconPath('edit'),
36+
tooltip: true,
37+
isEnabled: true,
38+
});
39+
40+
this.listenTo(buttonView, 'execute', () => {
41+
const selectedElement = this.editor.model.document.selection.getSelectedElement();
42+
const contentId = selectedElement.getAttribute('contentId');
43+
const token = document.querySelector('meta[name="CSRF-Token"]').content;
44+
const siteaccess = document.querySelector('meta[name="SiteAccess"]').content;
45+
46+
findContent({ token, siteaccess, contentId }, (contents) => {
47+
const languages = contents[0].CurrentVersion.Version.VersionInfo.VersionTranslationInfo.Language;
48+
const itemDefinitions = new Collection();
49+
50+
languages.forEach((language) => {
51+
itemDefinitions.add({
52+
type: 'button',
53+
model: new Model({
54+
label: window.ibexa.adminUiConfig.languages.mappings[language.languageCode].name,
55+
value: language.languageCode,
56+
withText: true,
57+
}),
58+
});
59+
});
60+
61+
if (languages.length === 1) {
62+
this.editContent({ contentId, languageCode: languages[0].languageCode });
63+
} else {
64+
dropdownView.panelView.children.clear();
65+
66+
addListToDropdown(dropdownView, itemDefinitions);
67+
68+
this.listenTo(dropdownView, 'execute', (event) => {
69+
const languageCode = event.source.value;
70+
71+
this.editContent({ contentId, languageCode });
72+
});
73+
74+
dropdownView.isOpen = true;
75+
}
76+
});
77+
});
78+
79+
return dropdownView;
80+
});
81+
}
82+
}
83+
84+
export default IbexaEmbedImageGoToEditUI;
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
2+
3+
import IbexaButtonView from '../../common/button-view/button-view';
4+
5+
const { Translator, Routing, ibexa } = window;
6+
const metaLanguageCode = document.querySelector('meta[name="LanguageCode"]')?.content;
7+
const previewLanguageCode = metaLanguageCode ?? ibexa.adminUiConfig.languages.priority[0];
8+
9+
class IbexaEmbedImageGoToUI extends Plugin {
10+
constructor(props) {
11+
super(props);
12+
}
13+
14+
init() {
15+
this.editor.ui.componentFactory.add('imageGoTo', (locale) => {
16+
const buttonView = new IbexaButtonView(locale);
17+
18+
buttonView.set({
19+
label: Translator.trans(/*@Desc("Go to image")*/ 'image_btn.go_to.label', {}, 'ck_editor'),
20+
icon: ibexa.helpers.icon.getIconPath('file-arrow'),
21+
tooltip: true,
22+
});
23+
24+
this.listenTo(buttonView, 'execute', () => {
25+
const modelElement = this.editor.model.document.selection.getSelectedElement();
26+
27+
const route = Routing.generate('ibexa.content.translation.view', {
28+
contentId: modelElement.getAttribute('contentId'),
29+
languageCode: previewLanguageCode,
30+
});
31+
32+
window.open(route);
33+
});
34+
35+
return buttonView;
36+
});
37+
}
38+
}
39+
40+
export default IbexaEmbedImageGoToUI;

src/bundle/Resources/translations/ck_editor.en.xliff

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,16 @@
8181
<target state="new">Formatted</target>
8282
<note>key: formatted_btn.label</note>
8383
</trans-unit>
84+
<trans-unit id="590b85bd86144a6c872dcff6475c451319782fc7" resname="image_btn.edit.label">
85+
<source>Edit</source>
86+
<target state="new">Edit</target>
87+
<note>key: image_btn.edit.label</note>
88+
</trans-unit>
89+
<trans-unit id="f0e038e4fa3206fe5b1c9b6366f88d335409cb1c" resname="image_btn.go_to.label">
90+
<source>Go to image</source>
91+
<target state="new">Go to image</target>
92+
<note>key: image_btn.go_to.label</note>
93+
</trans-unit>
8494
<trans-unit id="13cd849924dc9b21defaf1d6905241a4eb74e71a" resname="image_btn.label">
8595
<source>Image</source>
8696
<target state="new">Image</target>

0 commit comments

Comments
 (0)