diff --git a/ui/widgets/nuxeo-selectivity.js b/ui/widgets/nuxeo-selectivity.js index 02c10b81fa..aecf1fe21d 100644 --- a/ui/widgets/nuxeo-selectivity.js +++ b/ui/widgets/nuxeo-selectivity.js @@ -25,6 +25,8 @@ import { html } from '@polymer/polymer/lib/utils/html-tag.js'; import { mixinBehaviors } from '@polymer/polymer/lib/legacy/class.js'; import {I18nBehavior} from "../nuxeo-i18n-behavior"; import '@polymer/iron-icon/iron-icon.js'; +import { IronResizableBehavior } from '@polymer/iron-resizable-behavior/iron-resizable-behavior.js'; +import './nuxeo-tooltip.js'; /** * @license @@ -2440,7 +2442,6 @@ typedArrayTags[weakMapTag] = false; } else if (!resultsHtml && !options.add) { resultsHtml = this.selectivity.template('noResults', { term: options.term }); } - if (resultsHtml) { this.resultsContainer.innerHTML = ''; removeElement(this.$('.selectivity-loading')); @@ -3429,10 +3430,40 @@ typedArrayTags[weakMapTag] = false; item, ), )); - + this.input.parentNode.insertBefore(el, this.input); + const textElement = el.querySelector('.selectivity-multiple-selected-item.selectivity-text-container') + const containerElement = this._getHTMLRootNode(textElement) + let containerElementWidth = this._calculateElementWidth(containerElement) + const childNodes = Array.from(textElement.children); + const otherElementWidth = childNodes.reduce((totalWidth, currentValue) => { + if (currentValue !== this && !currentValue.shadowRoot) { + totalWidth += currentValue.offsetWidth; + } + return totalWidth; + }, 1); + containerElementWidth -= otherElementWidth ; + textElement.setAttribute('style', `max-width:${containerElementWidth}px`); + }, + + _getHTMLRootNode(element){ + let currentElement = element; + const parentElement = currentElement.closest(".selectivity-multiple-input-container") + return parentElement; + }, + + + + _calculateElementWidth(element){ + const currrentElement = getComputedStyle(element); + const paddingX = parseFloat(currrentElement.paddingLeft) + parseFloat(currrentElement.paddingRight); + const borderX = parseFloat(currrentElement.borderLeftWidth) + parseFloat(currrentElement.borderRightWidth); + const scrollBarWidth = element.offsetWidth - element.clientWidth; + const elementWidth = (element .offsetWidth - paddingX - borderX - scrollBarWidth -2) ; + return elementWidth }, + /** * @private */ @@ -6583,7 +6614,7 @@ typedArrayTags[weakMapTag] = false; * @demo demo/nuxeo-selectivity/index.html */ class SelectivityElement - extends mixinBehaviors([I18nBehavior, IronFormElementBehavior, IronValidatableBehavior], Nuxeo.Element) { + extends mixinBehaviors([I18nBehavior, IronFormElementBehavior, IronValidatableBehavior, IronResizableBehavior], Nuxeo.Element) { static get is() { return 'nuxeo-selectivity'; @@ -7108,6 +7139,14 @@ typedArrayTags[weakMapTag] = false; height: 2px; background-color: var(--nuxeo-primary-color, #0066ff); } + .selectivity-text-container { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .multipleSelectedItemText { + display:inline-block; + } @@ -7171,10 +7210,16 @@ typedArrayTags[weakMapTag] = false; multipleSelectedItem: (opts) => { const extraClass = opts.highlighted ? ' highlighted' : ''; - return ` + ${this.selectionFormatter(opts.item || opts)} + `; + return (`${opts.removable ? `` - : ``}${this.selectionFormatter(opts.item || opts)}` + : ``}${this.selectionFormatter(opts.item || opts)} + ${toolTipElement} + + `) }, }, }; @@ -7265,8 +7310,12 @@ typedArrayTags[weakMapTag] = false; }); this._visibilityObserver.observe(this); this._readonlyChanged(); + document.addEventListener('dialog-opened',this._reCalculateWidth.bind(this)) + this.addEventListener('iron-resize', this._reCalculateWidth); } + + disconnectedCallback() { this.$.input.removeEventListener('selectivity-change', this._updateSelectionHandler); this._updateSelectionHandler = null; @@ -7274,9 +7323,21 @@ typedArrayTags[weakMapTag] = false; this._selectivity = null; this._visibilityObserver.unobserve(this); this._scrollParent.removeEventListener('scroll', this._updateDropdownPosition.bind(this)); + this.removeEventListener('iron-resize', this._resize); super.disconnectedCallback(); } + + _reCalculateWidth(){ + setTimeout(() => { + this.multiple && + this._selectivity && + this._selectivity._reset() && + this._selectivity.rerenderSelection(); + }, 0); + + } + _updateDropdownPosition() { if (this._selectivity) { this._selectivity.positionDropdown(); @@ -7506,4 +7567,4 @@ export function escapeHTML(markup) { } return String(markup).replace(/[&<>"'/\\]/g, (match) => replaceMap[match]); -}; +}; \ No newline at end of file