{
"version":3,
"file":"xwiki-livedata.min.js",
"lineCount":36,
"mappings":"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",
"sources":["Logic.js","displayerXObjectPropertyHelper.js","editBus.js","jsonMerge.js","liveDataSource.js","polyfills.js"],
"sourcesContent":["/*\n * See the NOTICE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\n\ndefine('xwiki-livedata', [\n  \"vue\",\n  \"vue-i18n\",\n  \"xwiki-livedata-vue\",\n  \"xwiki-livedata-source\",\n  \"xwiki-json-merge\",\n  \"edit-bus\",\n  \"xwiki-livedata-polyfills\"\n], function(\n  Vue,\n  VueI18n,\n  XWikiLivedata,\n  liveDataSourceModule,\n  jsonMerge,\n  editBus\n) {\n  /**\n   * Make vue use the i18n plugin\n   */\n  Vue.use(VueI18n);\n\n\n  /**\n   * Map the element to its data object\n   * So that each instance of the livedata on the page handle there own data\n   */\n  const instancesMap = new WeakMap();\n\n\n\n  /**\n   * The init function of the logic script\n   * For each livedata element on the page, returns its corresponding data / API\n   * If the data does not exists yet, create it from the element\n   * @param {HTMLElement} element The HTML Element corresponding to the Livedata component\n   */\n  const init = function (element) {\n\n    if (!instancesMap.has(element)) {\n      // create a new logic object associated to the element\n      const logic = new Logic(element);\n      instancesMap.set(element, logic);\n    }\n\n    return instancesMap.get(element);\n  };\n\n  /**\n   * A service providing footnotes related operations. \n   */\n  class FootnotesService {\n    constructor() {\n      this._footnotes = [];\n    }\n\n    /**\n     * Register a new footnote. If a footnote with the same translationKey is already registered this method has no\n     * effect on the list of registered footnotes.\n     * @param symbol the symbol to identify the entries related to the footnote \n     * @param translationKey the translation key of the footnote text \n     */\n    put(symbol, translationKey) {\n      if (!this._footnotes.some(footnote => footnote.translationKey === translationKey)) {\n        this._footnotes.push({symbol, translationKey});\n      }\n    }\n    \n    reset() {\n      this._footnotes.splice(0);\n    }\n    \n    list() {\n      return this._footnotes;\n    }\n  }\n\n  // Initializes a promise to be resolved once the translations loading is done.\n  var translationsLoadedResolve;\n  const translationsLoaded = new Promise((resolve) => {\n    translationsLoadedResolve = resolve;\n  });\n\n  /**\n   * Class for a logic element\n   * Contains the Livedata data object and methods to mutate it\n   * Can be used in the layouts to display the data, and call its API\n   * @param {HTMLElement} element The HTML Element corresponding to the Livedata\n   */\n  const Logic = function (element) {\n    // Make sure to have one Live Data source instance per Live Data instance. \n    this.liveDataSource = liveDataSourceModule.init();\n    this.element = element;\n    this.data = JSON.parse(element.getAttribute(\"data-config\") || \"{}\");\n    this.contentTrusted = element.getAttribute(\"data-config-content-trusted\") === \"true\"; \n    this.data.entries = Object.freeze(this.data.entries);\n\n    // Reactive properties must be initialized before Vue is instantiated.\n    this.firstEntriesLoading = true;\n    this.currentLayoutId = \"\";\n    this.changeLayout(this.data.meta.defaultLayout);\n    this.entrySelection = {\n      selected: [],\n      deselected: [],\n      isGlobal: false,\n    };\n    this.openedPanels = [];\n    this.footnotes = new FootnotesService();\n    this.panels = [];\n\n    element.removeAttribute(\"data-config\");\n\n    const locale = document.documentElement.getAttribute('lang');\n\n    const i18n = new VueI18n({\n      locale: locale,\n      messages: {},\n      silentFallbackWarn: true,\n    });\n\n    // Vue.js replaces the container - prevent this by creating a placeholder for Vue.js to replace.\n    const placeholderElement = document.createElement('div');\n    this.element.appendChild(placeholderElement);\n\n    // create Vuejs instance\n    const vue = new Vue({\n      el: placeholderElement,\n      components: {\n        \"XWikiLivedata\": XWikiLivedata,\n      },\n      template: \"<XWikiLivedata :logic='logic'/>\",\n      i18n: i18n,\n      data: {\n        logic: this\n      },\n      mounted()\n      {\n        element.classList.remove('loading');\n        // Trigger the \"instanceCreated\" event on the next tick to ensure that the constructor has returned and thus\n        // all references to the logic instance have been initialized.\n        this.$nextTick(function () {\n          this.logic.triggerEvent('instanceCreated', {});\n        });\n      }\n    });\n\n    // Fetch the data if we don't have any. This call must be made just after the main Vue component is initialized as \n    // LivedataPersistentConfiguration must be mounted for the persisted filters to be loaded and applied when fetching \n    // the entries.\n    // We use a dedicated field (firstEntriesLoading) for the first load as the fetch start/end events can be triggered \n    // before the loader components is loaded (and in this case the loader is never hidden even once the entries are\n    // displayed).\n    if (!this.data.data.entries.length) {\n      this.updateEntries()\n        // Mark the loader as finished, even if it fails as the loader should stop and a message be displayed to the \n        // user in this case.\n        .finally(() => this.firstEntriesLoading = false);\n    } else {\n      this.firstEntriesLoading = false;\n    }\n\n    this.setEditBus(editBus.init(this));\n\n    /**\n     * Load given translations from the server\n     *\n     * @param {object} parameters\n     * @param {string} componentName The name component who needs the translations\n     * Used to avoid loading the same translations several times\n     * @param {string} prefix The translation keys prefix\n     * @param {string[]} keys\n     */\n    this.loadTranslations = async function ({ componentName, prefix, keys }) {\n      // If translations were already loaded, return.\n      if (this.loadTranslations[componentName]) return;\n      this.loadTranslations[componentName] = true;\n      // Fetch translation and load them.\n      try {\n        const translations = await this.liveDataSource.getTranslations(locale, prefix, keys);\n        i18n.mergeLocaleMessage(locale, translations)\n      } catch (error) {\n        console.error(error);\n      }\n    }\n\n    // Load needed translations for the Livedata\n    const translationsPromise = this.loadTranslations({\n      prefix: \"livedata.\",\n      keys: [\n        \"dropdownMenu.title\",\n        \"dropdownMenu.actions\",\n        \"dropdownMenu.layouts\",\n        \"dropdownMenu.panels\",\n        \"dropdownMenu.panels.properties\",\n        \"dropdownMenu.panels.sort\",\n        \"dropdownMenu.panels.filter\",\n        \"selection.selectInAllPages\",\n        \"selection.infoBar.selectedCount\",\n        \"selection.infoBar.allSelected\",\n        \"selection.infoBar.allSelectedBut\",\n        \"pagination.label\",\n        \"pagination.label.empty\",\n        \"pagination.currentEntries\",\n        \"pagination.pageSize\",\n        \"pagination.selectPageSize\",\n        \"pagination.page\",\n        \"pagination.first\",\n        \"pagination.previous\",\n        \"pagination.next\",\n        \"pagination.last\",\n        \"action.refresh\",\n        \"action.addEntry\",\n        \"action.reorder.hint\",\n        \"action.resizeColumn.hint\",\n        \"panel.filter.title\",\n        \"panel.filter.noneFilterable\",\n        \"panel.filter.addConstraint\",\n        \"panel.filter.addProperty\",\n        \"panel.filter.delete\",\n        \"panel.filter.deleteAll\",\n        \"panel.properties.title\",\n        \"panel.sort.title\",\n        \"panel.sort.noneSortable\",\n        \"panel.sort.direction.ascending\",\n        \"panel.sort.direction.descending\",\n        \"panel.sort.add\",\n        \"panel.sort.delete\",\n        \"displayer.emptyValue\",\n        \"displayer.link.noValue\",\n        \"displayer.boolean.true\",\n        \"displayer.boolean.false\",\n        \"displayer.xObjectProperty.missingDocumentName.errorMessage\",\n        \"displayer.xObjectProperty.failedToRetrieveField.errorMessage\",\n        \"displayer.actions.edit\",\n        \"displayer.actions.followLink\",\n        \"filter.boolean.label\",\n        \"filter.date.label\",\n        \"filter.list.label\",\n        \"filter.list.emptyLabel\",\n        \"filter.number.label\",\n        \"filter.text.label\",\n        \"footnotes.computedTitle\",\n        \"footnotes.propertyNotViewable\",\n        \"bottombar.noEntries\",\n        \"error.updateEntriesFailed\"\n      ],\n    }).then(() => {\n      translationsLoadedResolve(true);\n    });\n\n    // Return a translation only once the translations have been loaded from the server.\n    this.translate = async (key, ...args) => {\n      // Make sure that the translations are loaded from the server before translating.\n      await translationsPromise;\n      return vue.$t(key, args);\n    }\n    \n    // Waits for the translations to be loaded before continuing.\n    this.translationsLoaded = async() => {\n      await translationsPromise;\n    }\n\n    // Registers panels once the translations have been loadded as they are otherwise hard to update.\n    this.translationsLoaded().finally(() => {\n      this.registerPanel({\n        id: 'propertiesPanel',\n        title: vue.$t('livedata.panel.properties.title'),\n        name: vue.$t('livedata.dropdownMenu.panels.properties'),\n        icon: 'list-bullets',\n        component: 'LivedataAdvancedPanelProperties',\n        order: 1000\n      });\n      this.registerPanel({\n        id: 'sortPanel',\n        title: vue.$t('livedata.panel.sort.title'),\n        name: vue.$t('livedata.dropdownMenu.panels.sort'),\n        icon: 'table_sort',\n        component: 'LivedataAdvancedPanelSort',\n        order: 2000\n      });\n      this.registerPanel({\n        id: 'filterPanel',\n        title: vue.$t('livedata.panel.filter.title'),\n        name: vue.$t('livedata.dropdownMenu.panels.filter'),\n        icon: 'filter',\n        component: 'LivedataAdvancedPanelFilter',\n        order: 3000\n      });\n    });\n  };\n\n\n\n\n  /**\n   * THE LOGIC API\n   */\n  Logic.prototype = {\n\n\n    /**\n     * ---------------------------------------------------------------\n     * EVENTS\n     */\n\n\n    /**\n     * Send custom events\n     * @param {String} eventName The name of the event, without the prefix \"xwiki:livedata\"\n     * @param {Object} eventData The data associated with the event.\n     *  The livedata object reference is automatically added\n     */\n    triggerEvent (eventName, eventData) {\n      // configure event\n      const defaultData = {\n        livedata: this,\n      };\n      eventName = \"xwiki:livedata:\" + eventName;\n      eventData = {\n        bubbles: true,\n        detail: Object.assign(defaultData, eventData),\n      };\n      const event = new CustomEvent(eventName, eventData);\n      // dispatch event\n      this.element.dispatchEvent(event);\n    },\n\n    /**\n     * Listen for custom events\n     * @param {String} eventName The name of the event, without the prefix \"xwiki:livedata\"\n     * @param {Function} callback Function to call we the event is triggered: e => { ... }\n     */\n    onEvent (eventName, callback) {\n      eventName = \"xwiki:livedata:\" + eventName;\n      this.element.addEventListener(eventName, function (e) {\n        callback(e);\n      });\n    },\n\n\n    /**\n     * Listen for custom events, mathching certain conditions\n     * @param {String} eventName The name of the event, without the prefix \"xwiki:livedata\"\n     * @param {Object|Function} condition The condition to execute the callback\n     *  if Object, values of object properties must match e.detail properties values\n     *  if Function, the function must return true. e.detail is passed as argument\n     * @param {Function} callback Function to call we the event is triggered: e => { ... }\n     */\n    onEventWhere (eventName, condition, callback) {\n      eventName = \"xwiki:livedata:\" + eventName;\n      this.element.addEventListener(eventName, function (e) {\n        // Object check\n        if (typeof condition === \"object\") {\n          const isDetailMatching = (data, detail) => Object.keys(data).every(key => {\n            return typeof data[key] === \"object\"\n              ? isDetailMatching(data[key], detail?.[key])\n              : Object.is(data[key], detail?.[key]);\n          });\n          if (!isDetailMatching(condition, e.detail)) { return; }\n        }\n        // Function check\n        if (typeof condition === \"function\") {\n          if (!condition(e.detail)) { return; }\n        }\n        // call callback\n        callback(e);\n      });\n    },\n\n\n\n\n    /**\n     * ---------------------------------------------------------------\n     * UTILS\n     */\n\n\n    /**\n     * Return the list of layout ids\n     * @returns {Array}\n     */\n    getLayoutIds () {\n      return this.data.meta.layouts.map(layoutDescriptor => layoutDescriptor.id);\n    },\n\n\n    /**\n     * Return the id of the given entry\n     * @param {Object} entry\n     * @returns {String}\n     */\n    getEntryId (entry) {\n      const idProperty = this.data.meta.entryDescriptor.idProperty || \"id\";\n      if (entry[idProperty] === undefined) {\n        console.warn(\"Entry has no id (at property [\" + idProperty + \"]\", entry);\n        return;\n      }\n      return entry[idProperty];\n    },\n\n    /*\n      As Sets are not reactive in Vue 2.x, if we want to create\n      a reactive collection of unique objects, we have to use arrays.\n      So here are some handy functions to do what Sets do, but with arrays\n    */\n\n    /**\n     * Return whether the array has the given item\n     * @param {Array} uniqueArray An array of unique items\n     * @param {Any} item\n     */\n    uniqueArrayHas (uniqueArray, item) {\n      return uniqueArray.includes(item);\n    },\n\n\n    /**\n     * Add the given item if not present in the array, or does nothing\n     * @param {Array} uniqueArray An array of unique items\n     * @param {Any} item\n     */\n    uniqueArrayAdd (uniqueArray, item) {\n      if (this.uniqueArrayHas(uniqueArray, item)) { return; }\n      uniqueArray.push(item);\n    },\n\n\n    /**\n     * Remove the given item from the array if present, or does nothing\n     * @param {Array} uniqueArray An array of unique items\n     * @param {Any} item\n     */\n    uniqueArrayRemove (uniqueArray, item) {\n      const index = uniqueArray.indexOf(item);\n      if (index === -1) { return; }\n      uniqueArray.splice(index, 1);\n    },\n\n\n    /**\n     * Toggle the given item from the array, ensuring its uniqueness\n     * @param {Array} uniqueArray An array of unique items\n     * @param {Any} item\n     * @param {Boolean} force Optional: true force add / false force remove\n     */\n    uniqueArrayToggle (uniqueArray, item, force) {\n      if (force === undefined) {\n        force = !this.uniqueArrayHas(uniqueArray, item);\n      }\n      if (force) {\n        this.uniqueArrayAdd(uniqueArray, item);\n      } else {\n        this.uniqueArrayRemove(uniqueArray, item);\n      }\n    },\n\n\n\n\n    /**\n     * ---------------------------------------------------------------\n     * DESCRIPTORS\n     */\n\n\n    /**\n     * Returns the property descriptors of displayable properties\n     * @returns {Array}\n     */\n    getPropertyDescriptors () {\n      return this.data.query.properties.map(propertyId => this.getPropertyDescriptor(propertyId));\n    },\n\n\n    /**\n     * Return the property descriptor corresponding to a property id\n     * @param {String} propertyId\n     * @returns {Object}\n     */\n    getPropertyDescriptor (propertyId) {\n      const propertyDescriptor = this.data.meta.propertyDescriptors\n        .find(propertyDescriptor => propertyDescriptor.id === propertyId);\n      if (!propertyDescriptor) {\n        console.error(\"Property descriptor of property `\" + propertyId + \"` does not exists\");\n      }\n      return propertyDescriptor;\n    },\n\n\n    /**\n     * Return the property type descriptor corresponding to a property id\n     * @param {String} propertyId\n     * @returns {Object}\n     */\n    getPropertyTypeDescriptor (propertyId) {\n      const propertyDescriptor = this.getPropertyDescriptor(propertyId);\n      if (!propertyDescriptor) { return; }\n      return this.data.meta.propertyTypes\n        .find(typeDescriptor => typeDescriptor.id === propertyDescriptor.type);\n    },\n\n\n    /**\n     * Return the layout descriptor corresponding to a layout id\n     * @param {String} propertyId\n     * @returns {Object}\n     */\n    getLayoutDescriptor (layoutId) {\n      return this.data.meta.layouts\n        .find(layoutDescriptor => layoutDescriptor.id === layoutId);\n    },\n\n\n    /**\n     * Get the displayer descriptor associated to a property id\n     * @param {String} propertyId\n     * @returns {Object}\n     */\n    getDisplayerDescriptor (propertyId) {\n      // Property descriptor config\n      const propertyDescriptor = this.getPropertyDescriptor(propertyId);\n      // Property type descriptor config\n      const typeDescriptor = this.getPropertyTypeDescriptor(propertyId);\n      // Merge the property and type displayer descriptors.\n      const customDisplayerDescriptor = jsonMerge({}, typeDescriptor?.displayer, propertyDescriptor?.displayer);\n      // Get the default displayer descriptor.\n      const displayerId = customDisplayerDescriptor.id || this.data.meta.defaultDisplayer;\n      const defaultDisplayerDescriptor = this.data.meta.displayers.find(displayer => displayer.id === displayerId);\n      // Merge displayer descriptors.\n      return jsonMerge({}, defaultDisplayerDescriptor, customDisplayerDescriptor);\n    },\n\n\n    /**\n     * Get the filter descriptor associated to a property id\n     * @param {String} propertyId\n     * @returns {Object}\n     */\n    getFilterDescriptor(propertyId) {\n      // Property descriptor config\n      const propertyDescriptor = this.getPropertyDescriptor(propertyId);\n      // Property type descriptor config\n      const typeDescriptor = this.getPropertyTypeDescriptor(propertyId);\n      // Merge the property and type filter descriptors.\n      const customFilterDescriptor = jsonMerge({}, typeDescriptor?.filter, propertyDescriptor?.filter);\n      // Get the default filter descriptor.\n      const filterId = customFilterDescriptor.id || this.data.meta.defaultFilter;\n      const defaultFilterDescriptor = this.data.meta.filters.find(filter => filter.id === filterId);\n      // Merge filter descriptors.\n      return jsonMerge({}, defaultFilterDescriptor, customFilterDescriptor);\n    },\n\n\n\n\n    /**\n     * ---------------------------------------------------------------\n     * LAYOUT\n     */\n\n\n    /**\n     * Fetch the entries of the current page according to the query configuration.\n     * @returns the fetched entries\n     */\n    fetchEntries() {\n      // Before fetch event\n      this.triggerEvent(\"beforeEntryFetch\");\n      // Fetch entries from data source\n      return this.liveDataSource.getEntries(this.data.query)\n        .then(data => {\n          // After fetch event\n          return data\n        })\n        .finally(() => this.triggerEvent(\"afterEntryFetch\"));\n    },\n\n\n    updateEntries () {\n      return this.fetchEntries()\n        .then(data => {\n          this.data.data = Object.freeze(data);\n          Vue.nextTick(() => this.triggerEvent('entriesUpdated', {}));\n          // Remove the outdated footnotes, they will be recomputed by the new entries.\n          this.footnotes.reset()\n        })\n        .catch(err => {\n          // Prevent undesired notifications of the end user for non business related errors (for instance, the user\n          // left the page before the request was completed).\n          // See https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState\n          if (err.readyState === 4) {\n            this.translate('livedata.error.updateEntriesFailed')\n              .then(value => new XWiki.widgets.Notification(value, 'error'));\n          }\n          \n          // Do not log if the request has been aborted (e.g., because a second request was started for the same LD with\n          // new criteria).\n          if(err.statusText !== 'abort') {\n            console.error('Failed to fetch the entries', err);\n          }\n        });\n    },\n\n\n    /**\n     * Return whether the Livedata is editable or not\n     * if entry given, return whether it is editable\n     * if property given, return whether it is editable (for any entries)\n     * If entry and property given, return whether specific value is editable\n     * @param {Object} [parameters]\n     * @param {Object} [parameters.entry] The entry object\n     * @param {Number} [parameters.propertyId] The property id of the entry\n     */\n    isEditable ({ entry, propertyId } = {}) {\n      // TODO: Ensure entry is valid (need other current PR)\n      // TODO: Ensure property is valid (need other current PR)\n\n      // Check if the edit entry action is available.\n      if (!this.data.meta.actions.find(action => action.id === \"edit\")) {\n        return false;\n      }\n\n      // Check if we are allowed to edit the given entry.\n      if (entry && !this.isEntryEditable(entry)) {\n        return false;\n      }\n\n      // Check if the specified property is editable.\n      return !propertyId || this.isPropertyEditable(propertyId);\n    },\n\n    /**\n     * Returns whether the given entry is editable or not.\n     *\n     * @param {Object} entry\n     * @returns {Boolean}\n     */\n    isEntryEditable (entry) {\n      return this.isActionAllowed('edit', entry);\n    },\n\n    /**\n     * Returns whether a certain property is editable or not.\n     *\n     * @param {String} propertyId\n     * @returns {Boolean}\n     */\n    isPropertyEditable (propertyId) {\n      const propertyDescriptor = this.getPropertyDescriptor(propertyId);\n      const propertyTypeDescriptor = this.getPropertyTypeDescriptor(propertyId);\n      return propertyDescriptor && (propertyDescriptor.editable !== undefined ? propertyDescriptor.editable :\n        (propertyTypeDescriptor && propertyTypeDescriptor.editable));\n    },\n\n    /**\n     * Set the value of the given entry property\n     * @param {Object} parameters\n     * @param {Object} parameters.entry The entry we want to modify\n     * @param {number} parameters.propertyId The property id we want to modify in the entry\n     * @param {string} parameters.value The new value of entry property\n     */\n    setValue({entry, propertyId, value}) {\n      // TODO: Ensure entry is valid (need other current PR)\n      // TODO: Ensure property is valid (need other current PR)\n      if (!this.isEditable({entry, propertyId})) {\n        return;\n      }\n      entry[propertyId] = value;\n      const source = this.data.query.source;\n      const entryId = this.getEntryId(entry);\n      // Once the entry updated, reload the whole livedata because changing a single entry can have an impact on other \n      // properties of the entry, but also possibly on other entriers, or in the way they are sorted.\n      this.liveDataSource.updateEntryProperty(source, entryId, propertyId, entry[propertyId])\n        .then(() => this.updateEntries());\n    },\n\n    /**\n     * Update the entry with the values object passed in parameter and s\n     * @param {Object} entry the current entry\n     * @param {Object} values the entry's values to update\n     */\n    setValues({entryId, values}) {\n      const source = this.data.query.source;\n      return this.liveDataSource.updateEntry(source, entryId, values)\n        .then(() => this.updateEntries());\n\n    },\n\n\n    /**\n     * Return whether adding new entries is enabled.\n     */\n    canAddEntry () {\n      // Check if the add entry action is available.\n      return this.data.meta.actions.find(action => action.id === \"addEntry\");\n    },\n\n    addEntry () {\n      if (!this.canAddEntry()) { return; }\n      const mockNewUrl = () => this.getEntryId(this.data.data.entries.slice(-1)[0]) + \"0\";\n      // TODO: CALL FUNCTION TO CREATE NEW DATA HERE\n      Promise.resolve({ /* MOCK DATA */\n        \"doc_url\": mockNewUrl(),\n        \"doc_name\": undefined,\n        \"doc_date\": \"1585311660000\",\n        \"doc_title\": undefined,\n        \"doc_author\": \"Author 1\",\n        \"doc_creationDate\": \"1585311660000\",\n        \"doc_creator\": \"Creator 1\",\n        \"age\": undefined,\n        \"tags\": undefined,\n        \"country\": undefined,\n        \"other\": undefined,\n      })\n      .then(newEntry => {\n        this.data.data.entries.push(newEntry);\n        this.data.data.count++; // TODO: remove when merging with backend\n      });\n    },\n\n\n\n\n    /**\n     * ---------------------------------------------------------------\n     * LAYOUT\n     */\n\n\n    /**\n     * Load a layout, or default layout if none specified\n     * @param {String} layoutId The id of the layout to load with requireJS\n     * @returns {Promise}\n     */\n    changeLayout (layoutId) {\n      // bad layout\n      if (!this.getLayoutDescriptor(layoutId)) {\n        console.error(\"Layout of id `\" + layoutId + \"` does not have a descriptor\");\n        return;\n      }\n      // set layout\n      const previousLayoutId = this.currentLayoutId;\n      this.currentLayoutId = layoutId;\n      // dispatch events\n      this.triggerEvent(\"layoutChange\", {\n        layoutId: layoutId,\n        previousLayoutId: previousLayoutId,\n      });\n    },\n\n\n\n\n    /**\n     * ---------------------------------------------------------------\n     * PAGINATION\n     */\n\n\n    /**\n     * Get total number of pages\n     * @returns {Number}\n     */\n    getPageCount () {\n      return Math.ceil(this.data.data.count / this.data.query.limit);\n    },\n\n\n    /**\n     * Get the page corresponding to the specified entry (0-based index)\n     * @param {Number} entryIndex The index of the entry. Uses current entry if undefined.\n     * @returns {Number}\n     */\n    getPageIndex (entryIndex) {\n      if (entryIndex === undefined) {\n        entryIndex = this.data.query.offset;\n      }\n      return Math.floor(entryIndex / this.data.query.limit);\n    },\n\n\n    /**\n     * Set page index (0-based index), then fetch new data\n     * @param {Number} pageIndex\n     * @returns {Promise}\n     */\n    setPageIndex (pageIndex) {\n      return new Promise ((resolve, reject) => {\n        if (pageIndex < 0 || pageIndex >= this.getPageCount()) { return void reject(); }\n        const previousPageIndex = this.getPageIndex();\n        this.data.query.offset = this.getFirstIndexOfPage(pageIndex);\n        this.triggerEvent(\"pageChange\", {\n          pageIndex: pageIndex,\n          previousPageIndex: previousPageIndex,\n        });\n        this.updateEntries().then(resolve, reject);\n      });\n    },\n\n\n    /**\n     * Get the first entry index of the given page index\n     * @param {Number} pageIndex The page index. Uses current page if undefined.\n     * @returns {Number}\n     */\n    getFirstIndexOfPage (pageIndex) {\n      if (pageIndex === undefined) {\n        pageIndex = this.getPageIndex();\n      }\n      if (0 <= pageIndex && pageIndex < this.getPageCount()) {\n        return pageIndex * this.data.query.limit;\n      } else {\n        return -1;\n      }\n    },\n\n\n    /**\n     * Get the last entry index of the given page index\n     * @param {Number} pageIndex The page index. Uses current page if undefined.\n     * @returns {Number}\n     */\n    getLastIndexOfPage (pageIndex) {\n      if (pageIndex === undefined) {\n        pageIndex = this.getPageIndex();\n      }\n      if (0 <= pageIndex && pageIndex < this.getPageCount()) {\n        return Math.min(this.getFirstIndexOfPage(pageIndex) + this.data.query.limit, this.data.data.count) - 1;\n      } else {\n        return -1;\n      }\n    },\n\n\n    /**\n     * Set the pagination page size, then fetch new data\n     * @param {Number} pageSize\n     * @returns {Promise}\n     */\n    setPageSize (pageSize) {\n      return new Promise ((resolve, reject) => {\n        if (pageSize < 0) { return void reject(); }\n        const previousPageSize = this.data.query.limit;\n        if (pageSize === previousPageSize) { return void resolve(); }\n        this.data.query.limit = pageSize;\n        // Reset the offset whenever the page size changes.\n        this.data.query.offset = 0;\n        this.triggerEvent(\"pageSizeChange\", {\n          pageSize: pageSize,\n          previousPageSize: previousPageSize,\n        });\n        this.updateEntries().then(resolve, reject);\n      });\n    },\n\n\n\n\n    /**\n     * ---------------------------------------------------------------\n     * DISPLAY\n     */\n\n\n    /**\n     * Returns whether a certain property is visible\n     * @param {String} propertyId\n     * @returns {Boolean}\n     */\n    isPropertyVisible (propertyId) {\n      const propertyDescriptor = this.getPropertyDescriptor(propertyId);\n      return propertyDescriptor.visible;\n    },\n\n\n    /**\n     * Set whether the given property should be visible\n     * @param {String} propertyId\n     * @param {Boolean} visible\n     */\n    setPropertyVisible (propertyId, visible) {\n      const propertyDescriptor = this.getPropertyDescriptor(propertyId);\n      propertyDescriptor.visible = visible;\n    },\n\n\n    /**\n     * Move a property to a certain index in the property order list\n     * @param {String|Number} from The id or index of the property to move\n     * @param {Number} toIndex\n     */\n    reorderProperty (from, toIndex) {\n      let fromIndex;\n      if (typeof from === \"number\") {\n        fromIndex = from;\n      } else if (typeof from === \"string\") {\n        fromIndex = this.data.query.properties.indexOf(from);\n      } else {\n        return;\n      }\n      if (fromIndex < 0 || toIndex < 0) { return; }\n      this.data.query.properties.splice(toIndex, 0, this.data.query.properties.splice(fromIndex, 1)[0]);\n    },\n\n\n\n\n    /**\n     * ---------------------------------------------------------------\n     * SELECTION\n     */\n\n\n    /**\n     * Return whether selecting entries is enabled. If an entry is given, return whether that entry can be selected.\n     *\n     * @param {Object} [parameters]\n     * @param {Object} [parameters.entry]\n     */\n    isSelectionEnabled ({ entry } = {}) {\n      // An entry is selectable if it has an id specified.\n      return this.data.meta.selection.enabled && (!entry || this.getEntryId(entry));\n    },\n\n\n    /**\n     * Return whether the entry is currently selected\n     * @param {Object} entry\n     * @returns {Boolean}\n     */\n    isEntrySelected (entry) {\n      const entryId = this.getEntryId(entry);\n      if (this.entrySelection.isGlobal) {\n        return !this.uniqueArrayHas(this.entrySelection.deselected, entryId);\n      } else {\n        return this.uniqueArrayHas(this.entrySelection.selected, entryId);\n      }\n    },\n\n\n    /**\n     * Select the specified entries\n     * @param {Object|Array} entries\n     */\n    selectEntries (entries) {\n      if (!this.isSelectionEnabled()) { return; }\n      const entryArray = (entries instanceof Array) ? entries : [entries];\n      entryArray.forEach(entry => {\n        if (!this.isSelectionEnabled({ entry })) { return; }\n        const entryId = this.getEntryId(entry);\n        if (this.entrySelection.isGlobal) {\n          this.uniqueArrayRemove(this.entrySelection.deselected, entryId);\n        }\n        else {\n          this.uniqueArrayAdd(this.entrySelection.selected, entryId);\n        }\n        this.triggerEvent(\"select\", {\n          entry: entry,\n        });\n      });\n    },\n\n\n    /**\n     * Deselect the specified entries\n     * @param {Object|Array} entries\n     */\n    deselectEntries (entries) {\n      if (!this.isSelectionEnabled()) { return; }\n      const entryArray = (entries instanceof Array) ? entries : [entries];\n      entryArray.forEach(entry => {\n        if (!this.isSelectionEnabled({ entry })) { return; }\n        const entryId = this.getEntryId(entry);\n        if (this.entrySelection.isGlobal) {\n          this.uniqueArrayAdd(this.entrySelection.deselected, entryId);\n        }\n        else {\n          this.uniqueArrayRemove(this.entrySelection.selected, entryId);\n        }\n        this.triggerEvent(\"deselect\", {\n          entry: entry,\n        });\n      });\n    },\n\n\n    /**\n     * Toggle the selection of the specified entries\n     * @param {Object|Array} entries\n     * @param {Boolean} select Whether to select or not the entries. Undefined toggle current state\n     */\n    toggleSelectEntries (entries, select) {\n      if (!this.isSelectionEnabled()) { return; }\n      const entryArray = (entries instanceof Array) ? entries : [entries];\n      entryArray.forEach(entry => {\n        if (!this.isSelectionEnabled({ entry })) { return; }\n        if (select === undefined) {\n          select = !this.isEntrySelected(entry);\n        }\n        if (select) {\n          this.selectEntries(entry);\n        } else {\n          this.deselectEntries(entry);\n        }\n      });\n    },\n\n\n    /**\n     * Get number of selectable entries in page\n     * @returns {Number}\n     */\n    selectableCountInPage () {\n      if (!this.isSelectionEnabled()) { return 0; }\n      return this.data.data.entries\n        .filter(entry => this.isSelectionEnabled({ entry }))\n        .length;\n    },\n\n\n    /**\n     * Set the entry selection globally accross pages\n     * @param {Boolean} global\n     */\n    setEntrySelectGlobal (global) {\n      if (!this.isSelectionEnabled()) { return; }\n      this.entrySelection.isGlobal = global;\n      this.entrySelection.selected.splice(0);\n      this.entrySelection.deselected.splice(0);\n      this.triggerEvent(\"selectGlobal\", {\n        state: global,\n      });\n    },\n\n\n\n    /**\n     * ---------------------------------------------------------------\n     * ACTIONS\n     */\n\n\n    /**\n     * @param {String|Object} specifies the action\n     * @returns {Object} the descriptor of the specified live data action\n     */\n    getActionDescriptor(action) {\n      const descriptor = typeof action === 'string' ? {id: action} : action;\n      const baseDescriptor = this.data.meta.actions.find(baseDescriptor => baseDescriptor.id === descriptor.id);\n      return jsonMerge({}, baseDescriptor, descriptor);\n    },\n\n\n    /**\n     * @param {String|Object} specifies the action\n     * @param {Object} the live data entry that is the target of the action\n     * @returns {Boolean} whether the specified action is allowed to target the specified live data entry\n     */\n    isActionAllowed(action, entry) {\n      const actionDescriptor = this.getActionDescriptor(action);\n      return !actionDescriptor.allowProperty || entry[actionDescriptor.allowProperty];\n    },\n\n\n    /**\n     * ---------------------------------------------------------------\n     * SORT\n     */\n\n\n    /**\n     * Returns whether a certain property is sortable or not\n     * @param {String} propertyId\n     * @returns {Boolean}\n     */\n    isPropertySortable (propertyId) {\n      const propertyDescriptor = this.getPropertyDescriptor(propertyId);\n      const propertyTypeDescriptor = this.getPropertyTypeDescriptor(propertyId);\n      return propertyDescriptor && (propertyDescriptor.sortable !== undefined ? propertyDescriptor.sortable :\n        (propertyTypeDescriptor && propertyTypeDescriptor.sortable));\n    },\n\n\n    /**\n     * Returns the sortable properties from the live data query.\n     *\n     * @returns {Array}\n     */\n    getSortableProperties () {\n      return this.data.query.properties.filter(property => this.isPropertySortable(property));\n    },\n\n\n    /**\n     * Returns the sortable properties that don't have a sort entry in the live data query.\n     *\n     * @returns {Array}\n     */\n    getUnsortedProperties () {\n      return this.getSortableProperties().filter(property => !this.getQuerySort(property));\n    },\n\n\n    /**\n     * Get the sort query associated to a property id\n     * @param {String} propertyId\n     */\n    getQuerySort (propertyId) {\n      return this.data.query.sort.find(sort => sort.property === propertyId);\n    },\n\n\n    /**\n     * Update sort configuration based on parameters, then fetch new data\n     * @param {String} property The property to sort according to\n     * @param {String} level The sort level for the property (0 is the highest).\n     *   Undefined means keep current. Negative value removes property sort.\n     * @param {String} descending Specify whether the sort should be descending or not.\n     *   Undefined means toggle current direction\n     * @returns {Promise}\n     */\n    sort (property, level, descending) {\n      const err = new Error(\"Property `\" + property + \"` is not sortable\");\n      return new Promise ((resolve, reject) => {\n        // Allow the user to remove a sort entry (level < 0) even if the property is not sortable.\n        if (!(level < 0 || this.isPropertySortable(property))) {\n          return void reject(err);\n        }\n        // find property current sort level\n        const currentLevel = this.data.query.sort.findIndex(sortObject => sortObject.property === property);\n        // default level\n        if (level === undefined) {\n          level = (currentLevel !== -1) ? currentLevel : 0;\n        } else if (level < 0) {\n          level = -1;\n        }\n        // default descending\n        if (descending === undefined) {\n          descending = (currentLevel !== -1) ? !this.data.query.sort[currentLevel].descending : false;\n        }\n        // create sort object\n        const sortObject = {\n          property: property,\n          descending: descending,\n        };\n        // apply sort\n        if (level !== -1) {\n          this.data.query.sort.splice(level, 1, sortObject);\n        }\n        if (currentLevel !== -1 && currentLevel !== level) {\n          this.data.query.sort.splice(currentLevel, 1);\n        }\n        // dispatch events\n        this.triggerEvent(\"sort\", {\n          property: property,\n          level: level,\n          descending: descending,\n        });\n\n        this.updateEntries().then(resolve, reject);\n      });\n    },\n\n\n    /**\n     * Add new sort entry, shorthand of sort:\n     * If the property is already sorting, does nothing\n     * @param {String} property The property to add to the sort\n     * @param {String} descending Specify whether the sort should be descending or not.\n     *   Undefined means toggle current direction\n     * @returns {Promise}\n     */\n    addSort (property, descending) {\n      const err = new Error(\"Property `\" + property + \"` is already sorting\");\n      const propertyQuerySort = this.data.query.sort.find(sortObject => sortObject.property === property);\n      if (propertyQuerySort) { return Promise.reject(err); }\n      return this.sort(property, this.data.query.sort.length, descending);\n    },\n\n\n    /**\n     * Remove a sort entry, shorthand of sort:\n     * @param {String} property The property to remove to the sort\n     * @returns {Promise}\n     */\n    removeSort (property) {\n      return this.sort(property, -1);\n    },\n\n\n    /**\n     * Move a sort entry to a certain index in the query sort list\n     * @param {String} property The property to reorder the sort\n     * @param {Number} toIndex\n     */\n    reorderSort (propertyId, toIndex) {\n      const err = new Error(\"Property `\" + propertyId + \"` is not sortable\");\n      return new Promise ((resolve, reject) => {\n        const fromIndex = this.data.query.sort.findIndex(querySort => querySort.property === propertyId);\n        if (fromIndex < 0 || toIndex < 0) { return void reject(err); }\n        this.data.query.sort.splice(toIndex, 0, this.data.query.sort.splice(fromIndex, 1)[0]);\n\n        // dispatch events\n        this.triggerEvent(\"sort\", {\n          type: \"move\",\n          property: propertyId,\n          level: toIndex,\n        });\n\n        this.updateEntries().then(resolve, reject);\n      });\n    },\n\n\n\n\n    /**\n     * ---------------------------------------------------------------\n     * FILTER\n     */\n\n\n    /**\n     * Returns whether a certain property is filterable or not\n     * @param {String} propertyId\n     * @returns {Boolean}\n     */\n    isPropertyFilterable (propertyId) {\n      const propertyDescriptor = this.getPropertyDescriptor(propertyId);\n      const propertyTypeDescriptor = this.getPropertyTypeDescriptor(propertyId);\n      return propertyDescriptor && (propertyDescriptor.filterable !== undefined ? propertyDescriptor.filterable :\n        (propertyTypeDescriptor && propertyTypeDescriptor.filterable));\n    },\n\n\n    /**\n     * Returns the filterable properties from the live data query.\n     *\n     * @returns {Array}\n     */\n    getFilterableProperties () {\n      return this.data.query.properties.filter(property => this.isPropertyFilterable(property));\n    },\n\n\n    /**\n     * Returns the filterable properties that don't have constraints in the live data query.\n     *\n     * @returns {Array}\n     */\n    getUnfilteredProperties () {\n      return this.getFilterableProperties().filter(property => {\n        const filter = this.getQueryFilterGroup(property);\n        return !filter || filter.constraints.length === 0;\n      });\n    },\n\n\n    /**\n     * Get the filter in the query data object associated to a property id\n     * @param {String} propertyId\n     * @returns {Object}\n     */\n    getQueryFilterGroup (propertyId) {\n      return this.data.query.filters.find(filter => filter.property === propertyId);\n    },\n\n\n    /**\n     * Get the filters in the query data object associated to a property id\n     * @param {String} propertyId\n     * @returns {Array} The constraints array of the filter group, or empty array if it does not exist\n     */\n    getQueryFilters (propertyId) {\n      const queryFilterGroup = this.getQueryFilterGroup(propertyId);\n      return queryFilterGroup && queryFilterGroup.constraints || [];\n    },\n\n\n    /**\n     * Get the default filter operator associated to a property id\n     * @param {String} propertyId\n     * @returns {String}\n     */\n    getFilterDefaultOperator (propertyId) {\n      // get valid operator descriptor\n      const filterDescriptor = this.getFilterDescriptor(propertyId);\n      if (!filterDescriptor) { return; }\n      const filterOperators = filterDescriptor.operators;\n      if (!(filterOperators instanceof Array)) { return; }\n      if (filterOperators.length === 0) { return; }\n      // get default operator\n      const defaultOperator = filterDescriptor.defaultOperator;\n      const isDefaultOperatorValid = !!filterOperators.find(operator => operator.id === defaultOperator);\n      if (defaultOperator && isDefaultOperatorValid) {\n        return defaultOperator;\n      } else {\n        return filterOperators[0].id;\n      }\n    },\n\n\n    /**\n     * Return an object containing the new and old filter entries corresponding to parameters\n     *  oldEntry: the filter entry to be modified\n     *  newEntry: what this entry should be modified to\n     * @param {String} property The property to filter according to\n     * @param {String} index The index of the filter entry\n     * @param {String} filterEntry The filter data used to update the filter configuration\n     *  (see Logic.prototype.filter for more)\n     * @returns {Object} {oldEntry, newEntry}\n     *  with oldEntry / newEntry being {property, index, operator, value}\n     */\n    _computeFilterEntries (property, index, filterEntry, {filterOperator} = {}) {\n      if (!this.isPropertyFilterable(property)) { return; }\n      // default indexes\n      index = index || 0;\n      if (index < 0) { index = -1; }\n      if (filterEntry.index < 0) { filterEntry.index = -1; }\n      // old entry\n      let oldEntry = {\n        property: property,\n        index: index,\n      };\n      const queryFilters = this.getQueryFilters(property);\n      const currentEntry = queryFilters[index] || {};\n      oldEntry = Object.assign({}, currentEntry, oldEntry);\n      // new entry (copy properties that are not undefined from filterEntry)\n      let newEntry = Object.fromEntries(Object.entries(filterEntry || {})\n        .filter(entry => entry[1] !== undefined));\n      const self = this;\n      const defaultEntry = {\n        property: property,\n        value: \"\",\n        operator: self.getFilterDefaultOperator(property),\n        index: 0,\n      };\n      newEntry = Object.assign({}, defaultEntry, oldEntry, newEntry);\n      if (filterOperator) {\n        newEntry.operator = filterOperator;\n      }\n      // check newEntry operator\n      const newEntryValidOperator = this.getFilterDescriptor(newEntry.property).operators\n        .some(operator => operator.id === newEntry.operator);\n      if (!newEntryValidOperator) {\n        newEntry.operator = self.getFilterDefaultOperator(newEntry.property);\n      }\n      return {\n        oldEntry: oldEntry,\n        newEntry: newEntry,\n      };\n    },\n\n\n    /**\n     * Return the filtering type, based on oldEntry and newEntry\n     * @param {Object} oldEntry\n     * @param {Oject} newEntry\n     * @returns {String} \"add\" | \"remove\" | \"move\" | \"modify\"\n     */\n    _getFilteringType (oldEntry, newEntry) {\n      const queryFilter = this.getQueryFilterGroup(oldEntry.property);\n      if (queryFilter && oldEntry.index === -1) {\n        return \"add\";\n      }\n      if (newEntry.index === -1) {\n        return \"remove\";\n      }\n      if (oldEntry.index !== newEntry.index) {\n        return \"move\";\n      }\n      return \"modify\";\n    },\n\n\n    /**\n     * Update filter configuration based on parameters, then fetch new data\n     * @param {String} property The property to filter according to\n     * @param {String} index The index of the filter entry\n     * @param {String} filterEntry The filter data used to update the filter configuration\n     *  filterEntry = {property, operator, value}\n     *  undefined values are defaulted to current values, then to default values.\n     * @param {String} filterEntry.property The new property to filter according to\n     * @param {String} filterEntry.index The new index the filter should go. -1 delete filter\n     * @param {String} filterEntry.operator The operator of the filter.\n     *  Should match the filter descriptor of the filter property\n     * @param {String} filterEntry.value Value for the new filter entry\n     * @returns {Promise}\n     */\n    filter(property, index, filterEntry, {filterOperator} = {}) {\n      const err = new Error(\"Property `\" + property + \"` is not filterable\");\n      return new Promise ((resolve, reject) => {\n        const filterEntries = this._computeFilterEntries(property, index, filterEntry, {filterOperator});\n        if (!filterEntries) { return void reject(err); }\n        const oldEntry = filterEntries.oldEntry;\n        const newEntry = filterEntries.newEntry;\n        const filteringType = this._getFilteringType(oldEntry, newEntry);\n        // remove filter at current property and index\n        if (oldEntry.index !== -1) {\n          this.getQueryFilters(oldEntry.property).splice(index, 1);\n        }\n        // add filter at new property and index\n        if (newEntry.index !== -1) {\n          // create filterGroup if not exists\n          if (!this.getQueryFilterGroup(newEntry.property)) {\n            this.data.query.filters.push({\n              property: newEntry.property,\n              // We use by default AND between filter groups (different properties) and OR inside a filter group (same\n              // property)\n              matchAll: false,\n              constraints: [],\n            });\n          }\n          // add entry\n          this.getQueryFilterGroup(newEntry.property).constraints.splice(newEntry.index, 0, {\n            operator: newEntry.operator,\n            value: newEntry.value,\n          });\n        }\n        // remove filter group if empty\n        if (this.getQueryFilters(oldEntry.property).length === 0) {\n          this.removeAllFilters(oldEntry.property);\n        }\n        // Reset the offset whenever the filters are updated.\n        this.data.query.offset = 0;\n        // dispatch events\n        this.triggerEvent(\"filter\", {\n          type: filteringType,\n          oldEntry: oldEntry,\n          newEntry: newEntry,\n        });\n\n        this.updateEntries().then(resolve, reject);\n      });\n    },\n\n\n    /**\n     * Add new filter entry, shorthand of filter:\n     * @param {String} property Which property to add the filter to\n     * @param {String} operator The operator of the filter. Should match the filter descriptor of the property\n     * @param {String} value Default value for the new filter entry\n     * @param {Number} index Index of new filter entry. Undefined means last\n     * @returns {Promise}\n     */\n    addFilter (property, operator, value, index) {\n      if (index === undefined) {\n        index = ((this.getQueryFilterGroup(property) || {}).constraints || []).length;\n      }\n      return this.filter(property, -1, {\n        property: property,\n        operator: operator,\n        value: value,\n        index: index,\n      });\n    },\n\n\n    /**\n     * Remove a filter entry in the configuration, then fetch new data\n     * @param {String} property Property to remove the filter to\n     * @param {String} index The index of the filter to remove. Undefined means last.\n     * @returns {Promise}\n     */\n    removeFilter (property, index) {\n      return this.filter(property, index, {index: -1});\n    },\n\n\n    /**\n     * Remove all the filters associated to a property\n     * @param {String} property Property to remove the filters to\n     * @returns {Promise}\n     */\n    removeAllFilters (property) {\n      return new Promise ((resolve, reject) => {\n        const filterIndex = this.data.query.filters\n          .findIndex(filterGroup => filterGroup.property === property);\n        if (filterIndex < 0) { return void reject(); }\n        const removedFilterGroups = this.data.query.filters.splice(filterIndex, 1);\n        // Reset the offset whenever the filters are updated.\n        this.data.query.offset = 0;\n        // dispatch events\n        this.triggerEvent(\"filter\", {\n          type: \"removeAll\",\n          property: property,\n          removedFilters: removedFilterGroups[0].constraints,\n        });\n        this.updateEntries().then(resolve, reject);\n      });\n    },\n    \n    //\n    // Translations\n    //\n\n    /**\n     * @returns {Promise<boolean>} the promise is resolved to true once the translations are loaded\n     */\n    translationsLoaded() {\n      return translationsLoaded;\n    },\n    \n    //\n    // Edit Bus\n    //\n\n    setEditBus(editBusInstance) {\n      this.editBusInstance = editBusInstance;\n    },\n\n    getEditBus() {\n      return this.editBusInstance;\n    },\n\n    /**\n     * Registers a panel.\n     *\n     * The panel must have the following attributes:\n     * * id: the id of the panel, must be unique among all panels, also used as suffix of the class on the panel\n     * * name: the name that shall be shown in the menu\n     * * title: the title that shall be displayed in the title bar of the panel\n     * * icon: the name of the icon for the menu and the title of the panel\n     * * container: the Element that shall be attached to the extension panel's body, this should contain the main UI\n     * * component: the component of the panel, should be \"LiveDataAdvancedPanelExtension\" for extension panels\n     * * order: the ordering number, panels are sorted by this number in ascending order\n     *\n     * @param {Object} panel the panel to add\n     */\n    registerPanel(panel)\n    {\n      // Basic insertion sorting to avoid shuffling the (reactive) array.\n      const index = this.panels.findIndex(p => p.order > panel.order);\n      if (index === -1) {\n        this.panels.push(panel);\n      } else {\n        this.panels.splice(index, 0, panel);\n      }\n    },\n\n    //\n    // Content status\n    //\n\n    /**\n     * @returns {boolean} when false, the content is not trusted will be sanitized whenever Vue integrated escaping\n     * is not enough. When true, the content is never sanitized\n     */\n    isContentTrusted() {\n      return this.contentTrusted;\n    }\n  };\n\n\n\n\n\n  // return the init function to be used in the layouts\n  return init;\n\n});\n\n\n\n","/*\n * See the NOTICE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\ndefine('xwiki-livedata-xObjectPropertyHelper', ['jquery', 'xwiki-meta', 'xwiki-entityReference'], function($, xcontext, XWiki) {\n  'use strict';\n\n  /**\n   * Pass the vue-i18n helper to the module to allow error messages to be localized.\n   * @param $t the vue-i18n localization helper\n   */\n  function setLocalization($t) {\n    this.$t = $t;\n  }\n\n  /**\n   * Resolve the url of the document reference in the given mode.\n   * @param documentReference the document reference\n   * @param mode the mode\n   * @returns {*} the computed relative url\n   */\n  function computeTargetURL(documentReference, mode) {\n    return new XWiki.Document(XWiki.Model.resolve(documentReference, XWiki.EntityType.DOCUMENT)).getURL(mode);\n  }\n\n  function getPropertyReference(propertyName, className) {\n    if (propertyName.startsWith('doc.')) {\n      return propertyName.substring('doc.'.length);\n    } else {\n      // We target the first object of the specified type (class name).\n      return className + '[0].' + propertyName;\n    }\n  }\n\n  function load(mode, documentReference, property, className) {\n    const targetUrl = computeTargetURL(documentReference, 'get');\n    return Promise.resolve($.get(targetUrl, {\n      xpage: 'display',\n      mode: mode,\n      // TODO: handle the object index when provided\n      property: getPropertyReference(property, className),\n      type: property.startsWith('doc.') ? 'document' : 'object',\n      language: xcontext.locale\n    })).catch(() => {\n      new XWiki.widgets.Notification(\n        this.$t('livedata.displayer.xObjectProperty.failedToRetrieveField.errorMessage', [mode]), 'error');\n      return Promise.reject();\n    });\n  }\n\n  /**\n   * Load an XObject property field in edit mode.\n   * @param documentReference the reference of the document containing the XObject\n   * @param className the class name of the XObject\n   * @param property the XObject property to display\n   * @returns {*} the XObject property field html content in edit mode\n   */\n  function edit(documentReference, className, property) {\n    return load('edit', documentReference, property, className);\n  }\n\n  /**\n   * Load an XObject property field in view mode.\n   * @param documentReference the reference of the document containing the XObject\n   * @param className the class name of the XObject\n   * @param property the XObject property to display\n   * @returns {*} the XObject property field html content in view mode\n   */\n  function view(documentReference, className, property) {\n    return load('view', documentReference, property, className);\n  }\n\n  return {edit, view, setLocalization};\n});\n","/*\n * See the NOTICE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\n\n/**\n * Vue event bus for the edit action states.\n * Sent events:\n * - start-editing-entry({entryId, propertyId}): when an entry passes in edit mode\n * - cancel-editing-entry({entryId, propertyId}): when an entry goes out of edit mode without saving its edits\n * - save-editing-entry({entryId, propertyId, content}): when an entry goes out of edit model and wants to save its\n *   edits. The content is an object mapping the keys and values of the cell form attributes.\n */\ndefine('edit-bus', ['vue'], (Vue) => {\n\n  /**\n   * Initialize the edit bus view and services.\n   * @param logic the live data logic instance\n   */\n  function init(logic) {\n\n    /**\n     * Centralizes the edition event listeners and maintain a centralized state of the edition states and results for\n     * the live data. This is useful to know when to save the table, and to know which cells can be edited according to\n     * the current edit state\n     */\n    class EditBusService {\n\n      /**\n       * Default constructor.\n       * @param editBus an edit bus Vue object\n       * @param logic the live data logic instance\n       */\n      constructor(editBus, logic) {\n        this.editBus = editBus;\n        this.editStates = {};\n        this.logic = logic;\n      }\n\n      /**\n       * Initializes the Vue events listeners.\n       */\n      init() {\n        this.editBus.$on('start-editing-entry', ({entryId, propertyId}) => {\n          const entryState = this.editStates[entryId] || {};\n          const propertyState = entryState[propertyId] || {};\n          propertyState.editing = true;\n          entryState[propertyId] = propertyState;\n          this.editStates[entryId] = entryState;\n        })\n\n        this.editBus.$on('cancel-editing-entry', ({entryId, propertyId}) => {\n          const entryState = this.editStates[entryId];\n          const propertyState = entryState[propertyId];\n\n          // The entry is not edited anymore.\n          // The content is not edited, and should be `undefined` if the property was edited for the first time.\n          // If the property was edited and saved a first time, then edited and cancelled, the content must stay to one\n          // from the first edit.\n          propertyState.editing = false;\n\n        })\n\n        this.editBus.$on('save-editing-entry', ({entryId, propertyId, content}) => {\n          const entryState = this.editStates[entryId];\n          const propertyState = entryState[propertyId];\n          // The entry is not edited anymore but its content will need to be saved once the rest of the properties of\n          // the  entry are not in edit mode. \n          propertyState.editing = false;\n          propertyState.tosave = true;\n          propertyState.content = content;\n          this.save(entryId);\n        })\n      }\n\n      /**\n       * Save the changed values of an entry server side.\n       * @param entryId the entry id of the entry to save\n       */\n      save(entryId) {\n        const values = this.editStates[entryId];\n        var canBeSaved = false;\n        var keyEntry = undefined;\n\n\n        // Look for the single cell to save.\n        for (keyEntry in values) {\n          const entryValue = values[keyEntry];\n\n          const editing = entryValue.editing;\n          const tosave = entryValue.tosave;\n          canBeSaved = !editing && tosave;\n\n          if (canBeSaved) {\n            break;\n          }\n        }\n\n        // If a cell to save is found, we get its content and save it. \n        if (canBeSaved && keyEntry) {\n          const vals = values[keyEntry].content;\n\n          this.logic.setValues({entryId, values: vals})\n            .then(() => {\n              this.editStates[entryId] = {};\n            })\n            .catch(() => {\n              new XWiki.widgets.Notification(`The row save action failed.`, 'error');\n            });\n        }\n      }\n\n      isEditable() {\n        for (const editStatesKey in this.editStates) {\n          const editStates = this.editStates[editStatesKey];\n          for (const editStateKey in editStates) {\n            const editState = editStates[editStateKey];\n            if (editState.editing) {\n              return false;\n            }\n          }\n        }\n        return true;\n      }\n\n      onAnyEvent(callback) {\n        this.editBus.$on(['save-editing-entry', 'start-editing-entry', 'cancel-editing-entry'], () => callback())\n      }\n    }\n\n    /**\n     * Notifies the start of a cell modification. After this event, the cell is considered as edited unless it is\n     * canceled.\n     * @param entry the entry of the edited row\n     * @param propertyId the property id of the edited cell.\n     */\n    function start(entry, propertyId) {\n      _editBus.$emit('start-editing-entry', {\n        entryId: _logic.getEntryId(entry),\n        propertyId\n      });\n\n    }\n\n    /**\n     * Notifies the cancellation of the edition of a cell. The cell rollback to a non modified state.\n     * @param entry the entry of the edited row\n     * @param propertyId the property id of the edited cell\n     */\n    function cancel(entry, propertyId) {\n      _editBus.$emit('cancel-editing-entry', {\n        entryId: _logic.getEntryId(entry),\n        propertyId\n      })\n\n    }\n\n    /**\n     * Notifies the save of the a cell. With the current save strategy, the cell is directly save and the table is\n     * reload after this notification.\n     * @param entry the entry of the edit row\n     * @param propertyId the property id of the edited cell\n     * @param content the attributes of the edit cell form, in the form of an object\n     `\n     */\n    function save(entry, propertyId, content) {\n      _editBus.$emit('save-editing-entry', {\n        entryId: _logic.getEntryId(entry),\n        propertyId: propertyId,\n        content: content\n      });\n    }\n\n    /**\n     * Indicated if cells are allowed to switch to edit mode. For instance, a cell is not allowed to be edited if\n     * another cell is already in edit mode. In this case the currently edited cell must be saved or cancelled before\n     * another one can be edited.\n     * @returns {*} true if the cells are allowed to switch to edit mode, false otherwise\n     */\n    function isEditable() {\n      return _editBusService.isEditable();\n    }\n\n    function onAnyEvent(callback) {\n      _editBusService.onAnyEvent(callback);\n    }\n\n    const _editBus = new Vue();\n    const _logic = logic\n    const _editBusService = new EditBusService(_editBus, logic);\n    _editBusService.init()\n    return {start, cancel, save, isEditable, onAnyEvent};\n  }\n\n  return {init};\n})\n","/*\n * See the NOTICE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\ndefine('xwiki-json-merge', function() {\n  let merge = function(left, right) {\n    if (left?.constructor === Object && right?.constructor === Object) {\n      return mergeObject(left, right);\n    } else if (Array.isArray(left) && Array.isArray(right)) {\n      return mergeArray(left, right);\n    } else if (right == null) {\n      // Keep the left value.\n      return left;\n    } else {\n      // Overwrite the left value because either it's null or we cannot merge.\n      return deepCopy(right);\n    }\n  };\n\n  let mergeArray = function(left, right) {\n    // Take the items from the right, merging them with the corresponding item from the left.\n    const fromRight = right.map(rightItem => merge(findById(rightItem.id, left), rightItem));\n    // Take the items from the left that are identifiable and that are not present on the right.\n    const fromLeft = deepCopy(left.filter(leftItem => leftItem.id != null && findById(leftItem.id, right) == null));\n    return fromRight.concat(fromLeft);\n  };\n\n  let mergeObject = function(left, right) {\n    // Don't merge if the right object has an identifier different than the one of the left object.\n    if (right.hasOwnProperty('id') && left.id !== right.id) {\n      return deepCopy(right);\n    }\n    Object.keys(right).forEach(key => {\n      left[key] = merge(left[key], right[key]);\n    });\n    return left;\n  };\n\n  let deepCopy = function(value) {\n    return JSON.parse(JSON.stringify(value));\n  };\n\n  let findById = function(id, array) {\n    if (id != null) {\n      return array.find(item => item.id === id);\n    }\n  };\n\n  return function(...objects) {\n    return objects?.reduce(merge, null);\n  };\n});\n","/*\n * See the NOTICE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\ndefine('xwiki-livedata-source', ['module', 'jquery'], function(module, $) {\n  'use strict';\n\n  function init() {\n    var baseURL = module.config().contextPath + '/rest/liveData/sources/';\n\n    // Hold the most recent request to update the Live Data entries. It can be aborted. For instance, if some criteria \n    // (e.g., filtering or sorting) are changed before the previous request is completed. \n    let entriesRequest;\n\n    var getEntries = function(liveDataQuery) {\n      var entriesURL = getEntriesURL(liveDataQuery.source);\n\n      var parameters = {\n        properties: liveDataQuery.properties,\n        offset: liveDataQuery.offset,\n        limit: liveDataQuery.limit\n      };\n      // Add filters.\n      parameters.matchAll = [];\n      liveDataQuery.filters.forEach(filter => {\n        if (filter.matchAll) {\n          parameters.matchAll.push(filter.property);\n        }\n        parameters['filters.' + filter.property] = filter.constraints\n          .filter(constraint => constraint.value !== undefined)\n          .map(constraint => {\n            if (constraint.operator === undefined) {\n              constraint.operator = \"\";\n            }\n            return constraint;\n          })\n          .map(constraint => constraint.operator + ':' + constraint.value);\n      });\n      // Add sort.\n      parameters.sort = liveDataQuery.sort.map(sort => sort.property);\n      parameters.descending = liveDataQuery.sort.map(sort => sort.descending);\n\n      // We abort previous requests to avoid a race condition. It can happen that getEntries is called twice in a short\n      // time (when the user is typing in a filter field for instance, quickly changing sorting, or just if the network \n      // is slow) and that the first request succeeds after the second request, and its results would replace the\n      // \"fresher\" state.\n      entriesRequest?.abort();\n      entriesRequest = $.getJSON(entriesURL, $.param(parameters, true));\n\n      return Promise.resolve(entriesRequest.then(toLiveData))\n        .finally(cleanupRequest.bind(null, entriesRequest));\n    };\n\n    function cleanupRequest(requestToClean) {\n      // We reset the request object to null for two reasons:\n      // - avoid keeping an object we don't need anymore in memory, preventing it from being GC'd\n      // - make sure we don't attempt to abort a request that already terminated.\n      //\n      // We only nullify the request if it is the request we just handled.\n      // Otherwise, this means that a fresher request is in flight. In which case\n      // we need to be able to abort this fresher one if yet another request is\n      // fired before it succeeds.\n      if (requestToClean === entriesRequest) {\n        entriesRequest = null;\n      }\n    }\n\n    var getEntriesURL = function(source) {\n      var entriesURL = baseURL + encodeURIComponent(source.id) + '/entries';\n      return addSourcePathParameters(source, entriesURL);\n    };\n\n    function addSourcePathParameters(source, url) {\n      var parameters = {\n        // Make sure the response is not retrieved from cache (IE11 doesn't obey the caching HTTP headers).\n        timestamp: new Date().getTime(),\n        namespace: `wiki:${XWiki.currentWiki}`\n      };\n      addSourceParameters(parameters, source);\n      return `${url}?${$.param(parameters, true)}`;\n    }\n\n    function getEntryPropertyURL(source, entryId, propertyId) {\n      const encodedSourceId = encodeURIComponent(source.id);\n      const encodedEntryId = encodeURIComponent(entryId);\n      const encodedPropertyId = encodeURIComponent(propertyId);\n      const url = `${baseURL}${encodedSourceId}/entries/${encodedEntryId}/properties/${encodedPropertyId}`\n      return addSourcePathParameters(source, url);\n    }\n\n    function getEntryURL(source, entryId) {\n      const encodedSourceId = encodeURIComponent(source.id);\n      const encodedEntryId = encodeURIComponent(entryId);\n      const url = `${baseURL}${encodedSourceId}/entries/${encodedEntryId}`\n      return addSourcePathParameters(source, url);\n    }\n\n    var addSourceParameters = function(parameters, source) {\n      $.each(source, (key, value) => {\n        if (key !== 'id') {\n          parameters['sourceParams.' + key] = value;\n        }\n      });\n    };\n\n    var toLiveData = function(data) {\n      return {\n        count: data.count,\n        entries: data.entries.map(entry => entry.values)\n      };\n    };\n\n    var addEntry = function(source, entry) {\n      return Promise.resolve($.post(getEntriesURL(source), entry).then(e => e.values));\n    };\n\n    function updateEntry(source, entryId, values) {\n      return Promise.resolve($.ajax({\n        type: 'PUT',\n        url: getEntryURL(source, entryId),\n        contentType: 'application/json',\n        data: JSON.stringify({values})\n      }));\n    }\n\n    var getTranslations = function(locale, prefix, keys) {\n      const translationsURL = `${module.config().contextPath}/rest/wikis/${XWiki.currentWiki}/localization/translations`;\n      return Promise.resolve($.getJSON(translationsURL, $.param({\n        locale: locale,\n        prefix: prefix,\n        key: keys\n      }, true)).then(toTranslationsMap));\n    };\n\n    var toTranslationsMap = function(responseJSON) {\n      var translationsMap = {};\n      responseJSON.translations?.forEach(translation => translationsMap[translation.key] = translation.rawSource);\n      return translationsMap;\n    };\n\n    function updateEntryProperty(source, entryId, propertyId, propertyValue) {\n      return Promise.resolve($.ajax({\n        type: 'PUT',\n        url: getEntryPropertyURL(source, entryId, propertyId),\n        contentType: 'text/plain',\n        data: `${propertyValue}`\n      }))\n    }\n\n    return {\n      getEntries,\n      addEntry,\n      updateEntry,\n      updateEntryProperty,\n      getTranslations\n    };\n  }\n\n  return {init};\n});\n","/*\n * See the NOTICE file distributed with this work for additional\n * information regarding copyright ownership.\n *\n * This is free software; you can redistribute it and/or modify it\n * under the terms of the GNU Lesser General Public License as\n * published by the Free Software Foundation; either version 2.1 of\n * the License, or (at your option) any later version.\n *\n * This software is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this software; if not, write to the Free\n * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n */\n\n/**\n * Polyfills that are not yet provided by Closure Compiler.\n * See https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/js/polyfills.txt\n */\ndefine('xwiki-livedata-polyfills', function () {\n});\n"],
"names":["define","Vue","VueI18n","XWikiLivedata","liveDataSourceModule","jsonMerge","editBus","use","instancesMap","WeakMap","FootnotesService","constructor","_footnotes","put","symbol","translationKey","some","footnote","push","reset","splice","list","translationsLoadedResolve","translationsLoaded","Promise","resolve","Logic","element","liveDataSource","init","data","JSON","parse","getAttribute","contentTrusted","entries","Object","freeze","firstEntriesLoading","currentLayoutId","changeLayout","meta","defaultLayout","entrySelection","selected","deselected","isGlobal","openedPanels","footnotes","panels","removeAttribute","locale","document","documentElement","i18n","messages","silentFallbackWarn","placeholderElement","createElement","appendChild","vue","el","components","template","logic","mounted","classList","remove","$nextTick","triggerEvent","length","updateEntries","finally","setEditBus","loadTranslations","this.loadTranslations","componentName","prefix","keys","translations","getTranslations","mergeLocaleMessage","error","console","translationsPromise","then","translate","this.translate","key","args","$t","this.translationsLoaded","registerPanel","id","title","name","icon","component","order","prototype","eventName","eventData","defaultData","livedata","bubbles","detail","assign","event","CustomEvent","dispatchEvent","onEvent","callback","addEventListener","e","onEventWhere","condition","isDetailMatching","every","is","getLayoutIds","layouts","map","layoutDescriptor","getEntryId","entry","idProperty","entryDescriptor","undefined","warn","uniqueArrayHas","uniqueArray","item","includes","uniqueArrayAdd","uniqueArrayRemove","index","indexOf","uniqueArrayToggle","force","getPropertyDescriptors","query","properties","propertyId","getPropertyDescriptor","propertyDescriptor","propertyDescriptors","find","getPropertyTypeDescriptor","propertyTypes","typeDescriptor","type","getLayoutDescriptor","layoutId","getDisplayerDescriptor","customDisplayerDescriptor","displayer","displayerId","defaultDisplayer","defaultDisplayerDescriptor","displayers","getFilterDescriptor","customFilterDescriptor","filter","filterId","defaultFilter","defaultFilterDescriptor","filters","fetchEntries","getEntries","nextTick","catch","err","readyState","value","XWiki","widgets","Notification","statusText","isEditable","actions","action","isEntryEditable","isPropertyEditable","isActionAllowed","propertyTypeDescriptor","editable","setValue","source","entryId","updateEntryProperty","setValues","values","updateEntry","canAddEntry","addEntry","mockNewUrl","slice","newEntry","count","previousLayoutId","getPageCount","Math","ceil","limit","getPageIndex","entryIndex","offset","floor","setPageIndex","pageIndex","reject","previousPageIndex","getFirstIndexOfPage","getLastIndexOfPage","min","setPageSize","pageSize","previousPageSize","isPropertyVisible","visible","setPropertyVisible","reorderProperty","from","toIndex","fromIndex","isSelectionEnabled","selection","enabled","isEntrySelected","selectEntries","forEach","entryArray","Array","deselectEntries","toggleSelectEntries","select","selectableCountInPage","setEntrySelectGlobal","global","state","getActionDescriptor","descriptor","baseDescriptor","actionDescriptor","allowProperty","isPropertySortable","sortable","getSortableProperties","property","getUnsortedProperties","getQuerySort","sort","level","descending","Error","currentLevel","findIndex","sortObject","addSort","propertyQuerySort","removeSort","reorderSort","querySort","isPropertyFilterable","filterable","getFilterableProperties","getUnfilteredProperties","getQueryFilterGroup","constraints","getQueryFilters","queryFilterGroup","getFilterDefaultOperator","filterDescriptor","filterOperators","operators","defaultOperator","isDefaultOperatorValid","operator","_computeFilterEntries","filterEntry","filterOperator","oldEntry","currentEntry","queryFilters","fromEntries","defaultEntry","self","newEntryValidOperator","_getFilteringType","queryFilter","filterEntries","filteringType","matchAll","removeAllFilters","addFilter","removeFilter","filterIndex","filterGroup","removedFilterGroups","removedFilters","editBusInstance","getEditBus","panel","p","isContentTrusted","has","set","get","$","xcontext","getPropertyReference","propertyName","className","startsWith","substring","load","mode","documentReference","targetUrl","getURL","Document","Model","EntityType","DOCUMENT","xpage","language","edit","view","setLocalization","EditBusService","editStates","$on","entryState","propertyState","editing","content","tosave","save","canBeSaved","keyEntry","entryValue","editStatesKey","editStateKey","editState","onAnyEvent","_editBus","_editBusService","start","$emit","cancel","merge","left","right","mergeObject","isArray","mergeArray","stringify","fromRight","rightItem","findById","fromLeft","leftItem","concat","hasOwnProperty","array","objects","reduce","module","cleanupRequest","requestToClean","entriesRequest","addSourcePathParameters","url","parameters","timestamp","getTime","Date","namespace","currentWiki","addSourceParameters","param","baseURL","config","contextPath","getEntriesURL","entriesURL","encodeURIComponent","each","toLiveData","toTranslationsMap","responseJSON","translationsMap","translation","rawSource","liveDataQuery","constraint","abort","getJSON","bind","post","ajax","encodedSourceId","encodedEntryId","contentType","propertyValue","encodedPropertyId","translationsURL"]
}