|
7 | 7 | }; |
8 | 8 | const token = document.querySelector('meta[name="CSRF-Token"]').content; |
9 | 9 | const siteaccess = document.querySelector('meta[name="SiteAccess"]').content; |
| 10 | + const metaLanguageCode = document.querySelector('meta[name="LanguageCode"]')?.content; |
| 11 | + const previewLanguageCode = metaLanguageCode ?? ibexa.adminUiConfig.languages.priority[0]; |
10 | 12 | const adminUiLanguages = ibexa.adminUiConfig.languages.mappings; |
11 | 13 | const channel = new BroadcastChannel('ibexa-emded-item-live-update'); |
12 | 14 | const editEmbeddedItemForm = doc.querySelector('[name="embedded_item_edit"]'); |
13 | 15 | const actionsMenuTriggerBtns = doc.querySelectorAll('.ibexa-embedded-item-actions__menu-trigger-btn'); |
| 16 | + const updateNode = ({ node, value, isMiddleEllipsis }) => { |
| 17 | + if (!isMiddleEllipsis) { |
| 18 | + node.innerHTML = value; |
| 19 | + |
| 20 | + return; |
| 21 | + } |
| 22 | + |
| 23 | + const middleEllipsisNode = node.querySelector('.ibexa-middle-ellipsis'); |
| 24 | + const middleEllipsisNameStartNode = node.querySelector( |
| 25 | + '.ibexa-middle-ellipsis__name--start .ibexa-middle-ellipsis__name-ellipsized', |
| 26 | + ); |
| 27 | + const middleEllipsisNameEndNode = node.querySelector('.ibexa-middle-ellipsis__name--end .ibexa-middle-ellipsis__name-ellipsized'); |
| 28 | + |
| 29 | + middleEllipsisNode.title = value; |
| 30 | + middleEllipsisNameStartNode.innerHTML = value; |
| 31 | + middleEllipsisNameEndNode.innerHTML = value; |
| 32 | + |
| 33 | + ibexa.helpers.ellipsis.middle.parse(node); |
| 34 | + }; |
14 | 35 | const updateNodes = (contentData) => { |
15 | 36 | const { mainLanguageCode } = contentData.Content; |
16 | 37 |
|
|
39 | 60 | } |
40 | 61 |
|
41 | 62 | if (sourceValue) { |
42 | | - nodeToUpdate.innerHTML = sourceValue; |
| 63 | + const { ibexaUpdateMiddleEllipsis } = nodeToUpdate.dataset; |
| 64 | + |
| 65 | + updateNode({ |
| 66 | + node: nodeToUpdate, |
| 67 | + value: sourceValue, |
| 68 | + isMiddleEllipsis: ibexaUpdateMiddleEllipsis, |
| 69 | + }); |
43 | 70 | } |
44 | 71 | }); |
45 | 72 | }; |
|
77 | 104 |
|
78 | 105 | editEmbeddedItemForm.submit(); |
79 | 106 | }; |
80 | | - const generateMultiLanguagesMenuTreeItems = ({ contentId, locationId, languages }) => { |
| 107 | + const generateGoToActionItem = ({ contentId, locationId, productCode }) => { |
| 108 | + const href = productCode |
| 109 | + ? Routing.generate('ibexa.product_catalog.product.view', { |
| 110 | + productCode, |
| 111 | + languageCode: previewLanguageCode, |
| 112 | + }) |
| 113 | + : Routing.generate('ibexa.content.translation.view', { |
| 114 | + contentId, |
| 115 | + locationId, |
| 116 | + languageCode: previewLanguageCode, |
| 117 | + }); |
| 118 | + |
81 | 119 | return { |
82 | | - groups: [ |
83 | | - { |
84 | | - id: 'default', |
85 | | - items: [ |
86 | | - { |
87 | | - label: Translator.trans(/*@Desc("Go to content")*/ 'embedded_items.action.go_to_label', {}, 'content'), |
88 | | - branch: { |
89 | | - groups: [ |
90 | | - { |
91 | | - id: 'edit-group', |
92 | | - items: languages.map(({ languageCode, name }) => ({ |
93 | | - label: name, |
94 | | - href: Routing.generate('ibexa.content.translation.view', { |
95 | | - contentId, |
96 | | - locationId, |
97 | | - languageCode, |
98 | | - }), |
99 | | - })), |
100 | | - }, |
101 | | - ], |
102 | | - }, |
103 | | - }, |
| 120 | + label: Translator.trans(/*@Desc("Go to content")*/ 'embedded_items.action.go_to_label', {}, 'content'), |
| 121 | + href, |
| 122 | + }; |
| 123 | + }; |
| 124 | + const generateEditActionItem = ({ contentId, locationId, productCode, languages }) => { |
| 125 | + if (languages.length > 1) { |
| 126 | + return { |
| 127 | + label: Translator.trans(/*@Desc("Edit")*/ 'embedded_items.action.edit', {}, 'content'), |
| 128 | + branch: { |
| 129 | + groups: [ |
104 | 130 | { |
105 | | - label: Translator.trans(/*@Desc("Edit")*/ 'embedded_items.action.edit', {}, 'content'), |
106 | | - branch: { |
107 | | - groups: [ |
108 | | - { |
109 | | - id: 'edit-group', |
110 | | - items: languages.map(({ languageCode, name }) => ({ |
111 | | - label: name, |
112 | | - onClick: () => editContent({ contentId, locationId, languageCode }), |
113 | | - })), |
114 | | - }, |
115 | | - ], |
116 | | - }, |
| 131 | + id: 'edit-group', |
| 132 | + items: languages.map(({ languageCode, name }) => { |
| 133 | + const languageEditAction = productCode |
| 134 | + ? { |
| 135 | + href: Routing.generate('ibexa.product_catalog.product.edit', { |
| 136 | + productCode, |
| 137 | + languageCode, |
| 138 | + }), |
| 139 | + } |
| 140 | + : { |
| 141 | + onClick: () => editContent({ contentId, locationId, languageCode }), |
| 142 | + }; |
| 143 | + |
| 144 | + return { |
| 145 | + label: name, |
| 146 | + ...languageEditAction, |
| 147 | + }; |
| 148 | + }), |
117 | 149 | }, |
118 | 150 | ], |
119 | 151 | }, |
120 | | - ], |
| 152 | + }; |
| 153 | + } |
| 154 | + |
| 155 | + const editAction = productCode |
| 156 | + ? { |
| 157 | + href: Routing.generate('ibexa.product_catalog.product.edit', { |
| 158 | + productCode, |
| 159 | + languageCode: languages.languageCode, |
| 160 | + }), |
| 161 | + } |
| 162 | + : { onClick: () => editContent({ contentId, locationId, languageCode: languages.languageCode }) }; |
| 163 | + |
| 164 | + return { |
| 165 | + label: Translator.trans(/*@Desc("Edit")*/ 'embedded_items.action.edit', {}, 'content'), |
| 166 | + ...editAction, |
121 | 167 | }; |
122 | 168 | }; |
123 | | - const generateSingleLanguageMenuTreeItems = ({ contentId, locationId, language }) => { |
| 169 | + const generateMenuTreeItems = ({ contentId, locationId, productCode, languages }) => { |
| 170 | + const goToItem = generateGoToActionItem({ contentId, locationId, productCode }); |
| 171 | + const editItem = generateEditActionItem({ contentId, locationId, productCode, languages }); |
| 172 | + |
124 | 173 | return { |
125 | 174 | groups: [ |
126 | 175 | { |
127 | 176 | id: 'default', |
128 | | - items: [ |
129 | | - { |
130 | | - label: Translator.trans(/*@Desc("Go to content")*/ 'embedded_items.action.go_to_label', {}, 'content'), |
131 | | - href: Routing.generate('ibexa.content.view', { contentId, locationId }), |
132 | | - }, |
133 | | - { |
134 | | - label: Translator.trans(/*@Desc("Edit")*/ 'embedded_items.action.edit', {}, 'content'), |
135 | | - onClick: () => editContent({ contentId, locationId, languageCode: language.languageCode }), |
136 | | - }, |
137 | | - ], |
| 177 | + items: [goToItem, editItem], |
138 | 178 | }, |
139 | 179 | ], |
140 | 180 | }; |
141 | 181 | }; |
142 | | - const generateMenuTreeItems = ({ contentId, locationId, languages }) => { |
143 | | - if (languages.length > 1) { |
144 | | - return generateMultiLanguagesMenuTreeItems({ contentId, locationId, languages }); |
145 | | - } |
146 | | - |
147 | | - return generateSingleLanguageMenuTreeItems({ |
148 | | - contentId, |
149 | | - locationId, |
150 | | - language: languages[0], |
151 | | - }); |
152 | | - }; |
153 | | - const getLanguagesData = async ({ contentId, locationId, versionNo, initialFunc = () => {}, callbackFunc = () => {} }) => { |
| 182 | + const getLanguagesData = async ({ contentId, locationId, initialFunc = () => {}, callbackFunc = () => {} }) => { |
154 | 183 | try { |
155 | 184 | initialFunc(); |
156 | 185 |
|
157 | 186 | const url = window.Routing.generate('ibexa.permission.limitation.language', { |
158 | 187 | contentId, |
159 | 188 | locationId, |
160 | | - versionNo, |
| 189 | + versionNo: 0, |
161 | 190 | }); |
162 | 191 | const request = new Request(url, { |
163 | 192 | method: 'GET', |
|
176 | 205 | } |
177 | 206 | }; |
178 | 207 | const getMenuData = ({ container, event }) => { |
179 | | - const { contentId, locationId, versionNo, languageCodes } = container ? container.dataset : event.detail; |
| 208 | + const { contentId, locationId, productCode, languageCodes } = container ? container.dataset : event.detail; |
180 | 209 | const parsedLanguageCodes = typeof languageCodes === 'string' ? JSON.parse(languageCodes) : languageCodes; |
181 | 210 | const languages = parsedLanguageCodes |
182 | 211 | ? parsedLanguageCodes.map((languageCode) => ({ |
|
188 | 217 | return { |
189 | 218 | contentId: parseInt(contentId, 10), |
190 | 219 | locationId: parseInt(locationId, 10), |
191 | | - versionNo: parseInt(versionNo, 10), |
| 220 | + productCode, |
192 | 221 | languages, |
193 | 222 | }; |
194 | 223 | }; |
195 | | - const createMenu = async ({ triggerElement, container, contentId, locationId, versionNo, languages, preventAutoClick }) => { |
| 224 | + const createMenu = async ({ triggerElement, container, contentId, locationId, productCode, languages }) => { |
196 | 225 | triggerElement.dataset.isMenuAttached = 1; |
197 | 226 |
|
198 | 227 | const mainContainer = container.closest('.ibexa-embedded-item-actions'); |
|
202 | 231 | ? await getLanguagesData({ |
203 | 232 | contentId, |
204 | 233 | locationId, |
205 | | - versionNo, |
206 | 234 | initialFunc: showLoader.bind(null, { triggerElement, menuLoader }), |
207 | 235 | callbackFunc: hideLoader.bind(null, { menuLoader }), |
208 | 236 | }) |
209 | 237 | : languages; |
210 | | - const menuItems = generateMenuTreeItems({ contentId, locationId, languages: languagesData }); |
| 238 | + const menuItems = generateMenuTreeItems({ contentId, locationId, productCode, languages: languagesData }); |
211 | 239 | const menuInstance = new ibexa.core.MultilevelPopupMenu({ |
212 | 240 | container, |
213 | 241 | triggerElement, |
|
219 | 247 | ...menuItems, |
220 | 248 | }); |
221 | 249 |
|
222 | | - if (!preventAutoClick) { |
223 | | - triggerElement.click(); |
224 | | - } |
| 250 | + triggerElement.click(); |
225 | 251 | }; |
226 | 252 | const showLoader = ({ triggerElement, menuLoader }) => { |
227 | 253 | Popper.createPopper(triggerElement, menuLoader, { |
|
271 | 297 | const menuData = getMenuData({ event }); |
272 | 298 | const { menuTriggerElement, menuContainer } = event.detail; |
273 | 299 |
|
274 | | - createMenu({ |
275 | | - triggerElement: menuTriggerElement, |
276 | | - container: menuContainer, |
277 | | - preventAutoClick: true, |
278 | | - ...menuData, |
279 | | - }); |
| 300 | + menuTriggerElement.addEventListener( |
| 301 | + 'click', |
| 302 | + () => { |
| 303 | + const isMenuAttached = !!parseInt(menuTriggerElement.dataset.isMenuAttached, 10); |
| 304 | + |
| 305 | + if (!isMenuAttached) { |
| 306 | + event.preventDefault(); |
| 307 | + |
| 308 | + createMenu({ |
| 309 | + triggerElement: menuTriggerElement, |
| 310 | + container: menuContainer, |
| 311 | + ...menuData, |
| 312 | + }); |
| 313 | + } |
| 314 | + }, |
| 315 | + false, |
| 316 | + ); |
280 | 317 | }); |
281 | 318 |
|
282 | 319 | channel.addEventListener('message', async (event) => { |
|
0 commit comments