PageSourceSearch

https://valtioneuvosto.fi/o/frontend-js-web/liferay/portlet.js

js valtioneuvosto.fi collected 2026-09-24 08:38:52 UTC 16,083 bytes, 487 lines download raw bytes

1function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
2
3function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
4
5function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
7/**
8 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
9 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
10 */
11(function (A) {
12  var Lang = A.Lang;
13  var Util = Liferay.Util;
14  var STR_HEAD = 'head';
15  var TPL_NOT_AJAXABLE = '<div class="alert alert-info">{0}</div>';
16
17  var Portlet = _objectSpread(_objectSpread({}, Liferay.Portlet), {}, {
18    _defCloseFn: function _defCloseFn(event) {
19      event.portlet.remove(true);
20
21      if (!event.nestedPortlet) {
22        var formData = Liferay.Util.objectToFormData({
23          cmd: 'delete',
24          doAsUserId: event.doAsUserId,
25          p_auth: Liferay.authToken,
26          p_l_id: event.plid,
27          p_p_id: event.portletId,
28          p_v_l_s_g_id: themeDisplay.getSiteGroupId()
29        });
30        Liferay.Util.fetch(themeDisplay.getPathMain() + '/portal/update_layout', {
31          body: formData,
32          method: 'POST'
33        }).then(function (response) {
34          if (response.ok) {
35            Liferay.fire('updatedLayout');
36          }
37        });
38      }
39    },
40    _loadMarkupHeadElements: function _loadMarkupHeadElements(response) {
41      var markupHeadElements = response.markupHeadElements;
42
43      if (markupHeadElements && markupHeadElements.length) {
44        var head = A.one(STR_HEAD);
45        head.append(markupHeadElements);
46        var container = A.Node.create('<div />');
47        container.plug(A.Plugin.ParseContent);
48        container.setContent(markupHeadElements);
49      }
50    },
51    _loadPortletFiles: function _loadPortletFiles(response, loadHTML) {
52      var footerCssPaths = response.footerCssPaths || [];
53      var headerCssPaths = response.headerCssPaths || [];
54      var javascriptPaths = response.headerJavaScriptPaths || [];
55      javascriptPaths = javascriptPaths.concat(response.footerJavaScriptPaths || []);
56      var body = A.getBody();
57      var head = A.one(STR_HEAD);
58
59      if (headerCssPaths.length) {
60        A.Get.css(headerCssPaths, {
61          insertBefore: head.get('firstChild').getDOM()
62        });
63      }
64
65      var lastChild = body.get('lastChild').getDOM();
66
67      if (footerCssPaths.length) {
68        A.Get.css(footerCssPaths, {
69          insertBefore: lastChild
70        });
71      }
72
73      var responseHTML = response.portletHTML;
74
75      if (javascriptPaths.length) {
76        A.Get.script(javascriptPaths, {
77          onEnd: function onEnd() {
78            loadHTML(responseHTML);
79          }
80        });
81      } else {
82        loadHTML(responseHTML);
83      }
84    },
85    _mergeOptions: function _mergeOptions(portlet, options) {
86      options = options || {};
87      options.doAsUserId = options.doAsUserId || themeDisplay.getDoAsUserIdEncoded();
88      options.plid = options.plid || themeDisplay.getPlid();
89      options.portlet = portlet;
90      options.portletId = portlet.portletId;
91      return options;
92    },
93    _staticPortlets: {},
94    destroyComponents: function destroyComponents(portletId) {
95      Liferay.destroyComponents(function (_component, componentConfig) {
96        return portletId === componentConfig.portletId;
97      });
98    },
99    isStatic: function isStatic(portletId) {
100      var instance = this;
101      var id = Util.getPortletId(portletId.id || portletId);
102      return id in instance._staticPortlets;
103    },
104    list: [],
105    readyCounter: 0,
106    refreshLayout: function refreshLayout(_portletBoundary) {},
107    register: function register(portletId) {
108      var instance = this;
109
110      if (instance.list.indexOf(portletId) < 0) {
111        instance.list.push(portletId);
112      }
113    }
114  });
115
116  Liferay.provide(Portlet, 'add', function (options) {
117    var instance = this;
118    Liferay.fire('initLayout');
119    var doAsUserId = options.doAsUserId || themeDisplay.getDoAsUserIdEncoded();
120    var plid = options.plid || themeDisplay.getPlid();
121    var portletData = options.portletData;
122    var portletId = options.portletId;
123    var portletItemId = options.portletItemId;
124    var placeHolder = options.placeHolder;
125
126    if (!placeHolder) {
127      placeHolder = A.Node.create('<div class="loading-animation" />');
128    } else {
129      placeHolder = A.one(placeHolder);
130    }
131
132    var beforePortletLoaded = options.beforePortletLoaded;
133    var onCompleteFn = options.onComplete;
134
135    var onComplete = function onComplete(portlet, portletId) {
136      if (onCompleteFn) {
137        onCompleteFn(portlet, portletId);
138      }
139
140      instance.list.push(portlet.portletId);
141
142      if (portlet) {
143        portlet.attr('data-qa-id', 'app-loaded');
144      }
145
146      Liferay.fire('addPortlet', {
147        portlet: portlet
148      });
149    };
150
151    var container = null;
152
153    if (Liferay.Layout && Liferay.Layout.INITIALIZED) {
154      container = Liferay.Layout.getActiveDropContainer();
155    }
156
157    if (!container) {
158      return;
159    }
160
161    var currentColumnId = Util.getColumnId(container.attr('id'));
162    var portletPosition = 0;
163
164    if (options.placeHolder) {
165      var column = placeHolder.get('parentNode');
166
167      if (!column) {
168        return;
169      }
170
171      placeHolder.addClass('portlet-boundary');
172      var columnPortlets = column.all('.portlet-boundary');
173      var nestedPortlets = column.all('.portlet-nested-portlets');
174      portletPosition = columnPortlets.indexOf(placeHolder);
175      var nestedPortletOffset = 0;
176      nestedPortlets.some(function (nestedPortlet) {
177        var nestedPortletIndex = columnPortlets.indexOf(nestedPortlet);
178
179        if (nestedPortletIndex !== -1 && nestedPortletIndex < portletPosition) {
180          nestedPortletOffset += nestedPortlet.all('.portlet-boundary').size();
181        } else if (nestedPortletIndex >= portletPosition) {
182          return true;
183        }
184      });
185      portletPosition -= nestedPortletOffset;
186      currentColumnId = Util.getColumnId(column.attr('id'));
187    }
188
189    var url = themeDisplay.getPathMain() + '/portal/update_layout';
190    var data = {
191      cmd: 'add',
192      dataType: 'JSON',
193      doAsUserId: doAsUserId,
194      p_auth: Liferay.authToken,
195      p_l_id: plid,
196      p_p_col_id: currentColumnId,
197      p_p_col_pos: portletPosition,
198      p_p_i_id: portletItemId,
199      p_p_id: portletId,
200      p_p_isolated: true,
201      p_v_l_s_g_id: themeDisplay.getSiteGroupId(),
202      portletData: portletData
203    };
204    var firstPortlet = container.one('.portlet-boundary');
205    var hasStaticPortlet = firstPortlet && firstPortlet.isStatic;
206
207    if (!options.placeHolder && !options.plid) {
208      if (!hasStaticPortlet) {
209        container.prepend(placeHolder);
210      } else {
211        firstPortlet.placeAfter(placeHolder);
212      }
213    }
214
215    data.currentURL = Liferay.currentURL;
216    instance.addHTML({
217      beforePortletLoaded: beforePortletLoaded,
218      data: data,
219      onComplete: onComplete,
220      placeHolder: placeHolder,
221      url: url
222    });
223  }, ['aui-base']);
224  Liferay.provide(Portlet, 'addHTML', function (options) {
225    var instance = this;
226    var portletBoundary = null;
227    var beforePortletLoaded = options.beforePortletLoaded;
228    var data = options.data;
229    var dataType = 'HTML';
230    var onComplete = options.onComplete;
231    var placeHolder = options.placeHolder;
232    var url = options.url;
233
234    if (data && Lang.isString(data.dataType)) {
235      dataType = data.dataType;
236    }
237
238    dataType = dataType.toUpperCase();
239
240    var addPortletReturn = function addPortletReturn(html) {
241      var container = placeHolder.get('parentNode');
242      var portletBound = A.Node.create('<div></div>');
243      portletBound.plug(A.Plugin.ParseContent);
244      portletBound.setContent(html);
245      portletBound = portletBound.one('> *');
246      var portletId;
247
248      if (portletBound) {
249        var id = portletBound.attr('id');
250        portletId = Util.getPortletId(id);
251        portletBound.portletId = portletId;
252        placeHolder.hide();
253        placeHolder.placeAfter(portletBound);
254        placeHolder.remove();
255        instance.refreshLayout(portletBound);
256
257        if (window.location.hash) {
258          window.location.href = encodeURI(window.location.hash);
259        }
260
261        portletBoundary = portletBound;
262        var Layout = Liferay.Layout;
263
264        if (Layout && Layout.INITIALIZED) {
265          Layout.updateCurrentPortletInfo(portletBoundary);
266
267          if (container) {
268            Layout.syncEmptyColumnClassUI(container);
269          }
270
271          Layout.syncDraggableClassUI();
272          Layout.updatePortletDropZones(portletBoundary);
273        }
274
275        if (onComplete) {
276          onComplete(portletBoundary, portletId);
277        }
278      } else {
279        placeHolder.remove();
280      }
281
282      return portletId;
283    };
284
285    if (beforePortletLoaded) {
286      beforePortletLoaded(placeHolder);
287    }
288
289    Liferay.Util.fetch(url, {
290      body: Liferay.Util.objectToURLSearchParams(data),
291      method: 'POST'
292    }).then(function (response) {
293      if (dataType === 'JSON') {
294        return response.json();
295      } else {
296        return response.text();
297      }
298    }).then(function (response) {
299      if (dataType === 'HTML') {
300        addPortletReturn(response);
301      } else if (response.refresh) {
302        addPortletReturn(response.portletHTML);
303      } else {
304        Portlet._loadMarkupHeadElements(response);
305
306        Portlet._loadPortletFiles(response, addPortletReturn);
307      }
308
309      if (!data || !data.preventNotification) {
310        Liferay.fire('updatedLayout');
311      }
312    }).catch(function (error) {
313      var message = typeof error === 'string' ? error : 'Tapahtui\x20odottamaton\x20virhe\x2e\x20Ole\x20hyvä\x20ja\x20päivitä\x20sivu\x2e';
314      Liferay.Util.openToast({
315        message: message,
316        type: 'danger'
317      });
318    });
319  }, ['aui-parse-content']);
320  Liferay.provide(Portlet, 'close', function (portlet, skipConfirm, options) {
321    var instance = this;
322    portlet = A.one(portlet);
323
324    if (portlet && (skipConfirm || confirm('Oletko\x20varma\x2c\x20että\x20haluat\x20poistaa\x20tämän\x20komponentin\x3f'))) {
325      var portletId = portlet.portletId;
326      var portletIndex = instance.list.indexOf(portletId);
327
328      if (portletIndex >= 0) {
329        instance.list.splice(portletIndex, 1);
330      }
331
332      options = Portlet._mergeOptions(portlet, options);
333      Portlet.destroyComponents(portletId);
334      Liferay.fire('destroyPortlet', options);
335      Liferay.fire('closePortlet', options);
336    } else {
337      A.config.win.focus();
338    }
339  }, []);
340  Liferay.provide(Portlet, 'destroy', function (portlet, options) {
341    portlet = A.one(portlet);
342
343    if (portlet) {
344      var portletId = portlet.portletId || Util.getPortletId(portlet.attr('id'));
345      Portlet.destroyComponents(portletId);
346      Liferay.fire('destroyPortlet', Portlet._mergeOptions(portlet, options));
347    }
348  }, ['aui-node-base']);
349  Liferay.provide(Portlet, 'onLoad', function (options) {
350    var instance = this;
351    var canEditTitle = options.canEditTitle;
352    var columnPos = options.columnPos;
353    var isStatic = options.isStatic == 'no' ? null : options.isStatic;
354    var namespacedId = options.namespacedId;
355    var portletId = options.portletId;
356    var refreshURL = options.refreshURL;
357    var refreshURLData = options.refreshURLData;
358
359    if (isStatic) {
360      instance.registerStatic(portletId);
361    }
362
363    var portlet = A.one('#' + namespacedId);
364
365    if (portlet && !portlet.portletProcessed) {
366      portlet.portletProcessed = true;
367      portlet.portletId = portletId;
368      portlet.columnPos = columnPos;
369      portlet.isStatic = isStatic;
370      portlet.refreshURL = refreshURL;
371      portlet.refreshURLData = refreshURLData; // Functions to run on portlet load
372
373      if (canEditTitle) {
374        // https://github.com/yui/yui3/issues/1808
375        var events = 'focus';
376
377        if (!A.UA.touchEnabled) {
378          events = ['focus', 'mousemove'];
379        }
380
381        var handle = portlet.on(events, function () {
382          Util.portletTitleEdit({
383            doAsUserId: themeDisplay.getDoAsUserIdEncoded(),
384            obj: portlet,
385            plid: themeDisplay.getPlid(),
386            portletId: portletId
387          });
388          handle.detach();
389        });
390      }
391    }
392
393    Liferay.fire('portletReady', {
394      portlet: portlet,
395      portletId: portletId
396    });
397    instance.readyCounter++;
398
399    if (instance.readyCounter === instance.list.length) {
400      Liferay.fire('allPortletsReady', {
401        portletId: portletId
402      });
403    }
404  }, ['aui-base', 'aui-timer', 'event-move']);
405  Liferay.provide(Portlet, 'refresh', function (portlet, data) {
406    var instance = this;
407    portlet = A.one(portlet);
408
409    if (portlet) {
410      data = data || portlet.refreshURLData || {};
411
412      if (!Object.prototype.hasOwnProperty.call(data, 'portletAjaxable')) {
413        data.portletAjaxable = true;
414      }
415
416      var id = portlet.attr('portlet');
417      var url = portlet.refreshURL;
418      var placeHolder = A.Node.create('<div class="loading-animation" id="p_p_id' + id + '" />');
419
420      if (data.portletAjaxable && url) {
421        portlet.placeBefore(placeHolder);
422        portlet.remove(true);
423        Portlet.destroyComponents(portlet.portletId);
424        var params = {};
425        var urlPieces = url.split('?');
426
427        if (urlPieces.length > 1) {
428          params = A.QueryString.parse(urlPieces[1]);
429          delete params.dataType;
430          url = urlPieces[0];
431        }
432
433        instance.addHTML({
434          data: A.mix(params, data, true),
435          onComplete: function onComplete(portlet, portletId) {
436            portlet.refreshURL = url;
437
438            if (portlet) {
439              portlet.attr('data-qa-id', 'app-refreshed');
440            }
441
442            Liferay.fire(portlet.portletId + ':portletRefreshed', {
443              portlet: portlet,
444              portletId: portletId
445            });
446          },
447          placeHolder: placeHolder,
448          url: url
449        });
450      } else if (!portlet.getData('pendingRefresh')) {
451        portlet.setData('pendingRefresh', true);
452        var nonAjaxableContentMessage = Lang.sub(TPL_NOT_AJAXABLE, ['Tämä\x20muutos\x20näkyy\x20vasta\x20kun\x20lataa\x20uudelleen\x20tämän\x20sivun\x2e']);
453        var portletBody = portlet.one('.portlet-body');
454        portletBody.placeBefore(nonAjaxableContentMessage);
455        portletBody.hide();
456      }
457    }
458  }, ['aui-base', 'querystring-parse']);
459  Liferay.provide(Portlet, 'registerStatic', function (portletId) {
460    var instance = this;
461    var Node = A.Node;
462
463    if (Node && portletId instanceof Node) {
464      portletId = portletId.attr('id');
465    } else if (portletId.id) {
466      portletId = portletId.id;
467    }
468
469    var id = Util.getPortletId(portletId);
470    instance._staticPortlets[id] = true;
471  }, ['aui-base']);
472  Liferay.publish('closePortlet', {
473    defaultFn: Portlet._defCloseFn
474  });
475  Liferay.publish('allPortletsReady', {
476    fireOnce: true
477  }); // Backwards compatability
478
479  Portlet.ready = function (fn) {
480    Liferay.on('portletReady', function (event) {
481      fn(event.portletId, event.portlet);
482    });
483  };
484
485  Liferay.Portlet = Portlet;
486})(AUI());
487//# sourceMappingURL=portlet.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.