selectic 3.0.18 → 3.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/selectic.common.js +49 -16
- package/dist/selectic.esm.js +49 -16
- package/package.json +2 -2
- package/src/ExtendedList.tsx +54 -16
- package/src/css/selectic.css +8 -0
- package/types/ExtendedList.d.ts +4 -0
package/dist/selectic.common.js
CHANGED
|
@@ -32,7 +32,7 @@ function styleInject(css, ref) {
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
var css_248z = "/* {{{ Variables */\n\n:root {\n --selectic-font-size: 14px;\n --selectic-cursor-disabled: not-allowed;\n\n /* The main element */\n --selectic-color: #555555;\n --selectic-bg: #ffffff;\n\n /* The main element (when disabled) */\n --selectic-color-disabled: #787878;\n --selectic-bg-disabled: #eeeeee;\n\n /* The list */\n --selectic-panel-bg: #f0f0f0;\n --selectic-separator-bordercolor: #cccccc;\n /* --selectic-item-color: var(--selectic-color); /* Can be set in any CSS configuration */\n\n /* The current selected item */\n --selectic-selected-item-color: #428bca;\n\n /* When mouse is over items or by selecting with key arrows */\n --selectic-active-item-color: #ffffff;\n --selectic-active-item-bg: #66afe9;\n\n /* Selected values in main element */\n --selectic-value-bg: #f0f0f0;\n /* --selectic-more-items-bg: var(--selectic-info-bg); /* can be set in any CSS configuration */\n /* --selectic-more-items-color: var(--selectic-info-color); /* can be set in any CSS configuration */\n --selectic-more-items-bg-disabled: #cccccc;\n\n /* Information message */\n --selectic-info-bg: #5bc0de;\n --selectic-info-color: #ffffff;\n\n /* Error message */\n --selectic-error-bg: #b72c29;\n --selectic-error-color: #ffffff;\n\n /* XXX: Currently it is important to keep this size for a correct scroll\n * height estimation */\n --selectic-input-height: 30px;\n}\n\n/* }}} */\n/* {{{ Bootstrap equivalent style */\n\n.selectic .form-control {\n display: block;\n width: 100%;\n height: calc(var(--selectic-input-height) - 2px);\n font-size: var(--selectic-font-size);\n line-height: 1.42857143;\n color: var(--selectic-color);\n background-color: var(--selectic-bg);\n background-image: none;\n border: 1px solid var(--selectic-separator-bordercolor); /* should use a better variable */\n border-radius: 4px;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n.selectic .has-feedback {\n position: relative;\n}\n.selectic .has-feedback .form-control {\n padding-right: calc(var(--selectic-input-height) + 4px);\n}\n\n.selectic .form-control-feedback.fa,\n.selectic .form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: calc(var(--selectic-input-height) + 4px);\n height: calc(var(--selectic-input-height) + 4px);\n line-height: var(--selectic-input-height);\n text-align: center;\n pointer-events: none;\n}\n\n.selectic .alert-info {\n background-color: var(--selectic-info-bg);\n color: var(--selectic-info-color);\n}\n\n.selectic .alert-danger {\n background-color: var(--selectic-error-bg);\n color: var(--selectic-error-color);\n}\n\n/* }}} */\n\n.selectic * {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n.selectic.form-control {\n display: inline-block;\n padding: 0;\n cursor: pointer;\n border: unset;\n}\n\n.has-feedback .selectic__icon-container.form-control-feedback {\n right: 0;\n}\n\n/* The input which contains the selected value\n * XXX: This input should stay hidden behind other elements, but is \"visible\"\n * (in term of DOM point of view) in order to get and to trigger the `focus`\n * DOM event. */\n.selectic__input-value {\n position: fixed;\n opacity: 0;\n z-index: -1000;\n top: -100px;\n}\n\n/* XXX: .form-control has been added to this selector to improve priority and\n * override some rules of the original .form-control */\n.selectic-input.form-control {\n display: inline-flex;\n justify-content: space-between;\n overflow: hidden;\n width: 100%;\n min-height: var(--selectic-input-height);\n padding-top: 0;\n padding-bottom: 0;\n padding-left: 5px;\n line-height: calc(var(--selectic-input-height) - 4px);\n color: var(--selectic-color);\n}\n\n.selectic-input__reverse-icon {\n align-self: center;\n margin-right: 3px;\n cursor: default;\n}\n.selectic-input__clear-icon {\n align-self: center;\n margin-left: 3px;\n cursor: pointer;\n}\n.selectic-input__clear-icon:hover {\n color: var(--selectic-selected-item-color);\n}\n\n.selectic-input.focused {\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n}\n\n.selectic-input.disabled {\n cursor: var(--selectic-cursor-disabled);\n background-color: var(--selectic-bg-disabled);\n}\n.selectic-input.disabled .more-items {\n\tbackground-color: var(--selectic-more-items-bg-disabled);\n}\n\n.selectic-input__selected-items {\n display: inline-flex;\n flex-wrap: nowrap;\n align-items: center;\n white-space: nowrap;\n}\n\n.selectic-input__selected-items__placeholder {\n font-style: italic;\n opacity: 0.7;\n white-space: nowrap;\n}\n\n.selectic-icon {\n color: var(--selectic-color);\n text-align: center;\n vertical-align: middle;\n}\n\n.selectic__extended-list {\n position: fixed;\n z-index: 2000;\n height: auto;\n background-color: var(--selectic-bg, #ffffff);\n box-shadow: 2px 5px 12px 0px #888888;\n border-radius: 0 0 4px 4px;\n padding: 0;\n min-width: 200px;\n}\n.selectic__extended-list__list-container{\n overflow: auto;\n}\n.selectic__extended-list__list-items {\n max-height: calc(var(--selectic-input-height) * 10);\n min-width: max-content;\n padding-left: 0;\n}\n\n.selectic-item {\n display: block;\n position: relative;\n box-sizing: border-box;\n padding: 2px 8px;\n color: var(--selectic-item-color, var(--selectic-color));\n min-height: calc(var(--selectic-input-height) - 3px);\n list-style-type: none;\n white-space: nowrap;\n cursor: pointer;\n}\n\n.selectic-item_text {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.selectic-item:not(.selected) .selectic-item_icon {\n opacity: 0;\n}\n\n.selectic-item_text {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.selectic-item__active {\n background-color: var(--selectic-active-item-bg);\n color: var(--selectic-active-item-color);\n}\n.selectic-item__active:not(.selected) .selectic-item_icon {\n opacity: 0.2;\n}\n\n.selectic-item__disabled {\n color: var(--selectic-color-disabled);\n background-color: var(--selectic-bg-disabled);\n}\n\n.selectic-item__is-in-group {\n padding-left: 2em;\n}\n\n.selectic-item__is-group {\n font-weight: bold;\n cursor: default;\n}\n\n.selectic-item.selected {\n color: var(--selectic-selected-item-color);\n}\n.selectic-search-scope {\n color: #e0e0e0;\n left: auto;\n right: 10px;\n}\n.selectic .form-control-feedback.fa.selectic-search-scope {\n width: calc(var(--selectic-input-height) * 0.75);\n height: calc(var(--selectic-input-height) * 0.75);\n line-height: calc(var(--selectic-input-height) * 0.75);\n}\n\n.selectic__message {\n text-align: center;\n padding: 3px;\n}\n\n.selectic .filter-panel {\n padding: 3px;\n margin-left: 0px;\n margin-right: 0px;\n background-color: var(--selectic-panel-bg);\n border-bottom: 1px solid var(--selectic-separator-bordercolor);\n}\n\n.selectic .panelclosed {\n max-height: 0px;\n transition: max-height 0.3s ease-out;\n overflow: hidden;\n}\n\n.panelopened {\n max-height: 200px;\n transition: max-height 0.3s ease-in;\n overflow: hidden;\n}\n\n.selectic .filter-panel__input {\n padding-left: 0px;\n padding-right: 0px;\n padding-bottom: 10px;\n margin-bottom: 0px;\n}\n.selectic .filter-input {\n height: calc(var(--selectic-input-height) * 0.75);\n}\n\n.selectic .checkbox-filter {\n padding: 5px;\n text-align: center;\n}\n\n.selectic .curtain-handler {\n text-align: center;\n}\n\n.selectic .toggle-selectic {\n margin: 5px;\n padding-left: 0px;\n padding-right: 0px;\n}\n\n.selectic .toggle-boolean-select-all-toggle {\n display: inline;\n margin-right: 15px;\n}\n\n.selectic .toggle-boolean-excluding-toggle {\n display: inline;\n margin-right: 15px;\n}\n\n.selectic .single-value {\n display: grid;\n grid-template: \"value icon\" 1fr / max-content max-content;\n\n padding: 2px;\n padding-left: 5px;\n margin-left: 0;\n margin-right: 5px;\n /* margin top/bottom are mainly to create a gutter in multilines */\n margin-top: 2px;\n margin-bottom: 2px;\n\n border-radius: 3px;\n background-color: var(--selectic-value-bg);\n max-height: calc(var(--selectic-input-height) - 10px);\n max-width: 100%;\n min-width: 30px;\n\n overflow: hidden;\n white-space: nowrap;\n line-height: initial;\n vertical-align: middle;\n}\n\n.selectic .more-items {\n display: inline-block;\n\n padding-left: 5px;\n padding-right: 5px;\n border-radius: 10px;\n\n background-color: var(--selectic-more-items-bg, var(--selectic-info-bg));\n color: var(--selectic-more-items-color, var(--selectic-info-color));\n cursor: help;\n}\n.selectic-input__selected-items__value {\n grid-area: value;\n align-self: center;\n justify-self: normal;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n}\n\n.selectic-input__selected-items__icon {\n grid-area: icon;\n align-self: center;\n justify-self: center;\n margin-left: 5px;\n}\n.selectic-input__selected-items__icon:hover {\n color: var(--selectic-selected-item-color);\n}\n\n.selectic__label-disabled {\n opacity: 0.5;\n transition: opacity 400ms;\n}\n\n/* XXX: override padding of bootstrap input-sm.\n * This padding introduce a line shift. */\n.selectic.input-sm {\n padding: 0;\n}\n\n/* {{{ overflow multiline */\n\n.selectic--overflow-multiline,\n.selectic--overflow-multiline.form-control,\n.selectic--overflow-multiline .form-control {\n height: unset;\n}\n\n.selectic--overflow-multiline .selectic-input {\n overflow: unset;\n}\n\n.selectic--overflow-multiline .selectic-input__selected-items {\n flex-wrap: wrap;\n}\n\n/* }}} */\n";
|
|
35
|
+
var css_248z = "/* {{{ Variables */\n\n:root {\n --selectic-font-size: 14px;\n --selectic-cursor-disabled: not-allowed;\n\n /* The main element */\n --selectic-color: #555555;\n --selectic-bg: #ffffff;\n\n /* The main element (when disabled) */\n --selectic-color-disabled: #787878;\n --selectic-bg-disabled: #eeeeee;\n\n /* The list */\n --selectic-panel-bg: #f0f0f0;\n --selectic-separator-bordercolor: #cccccc;\n /* --selectic-item-color: var(--selectic-color); /* Can be set in any CSS configuration */\n\n /* The current selected item */\n --selectic-selected-item-color: #428bca;\n\n /* When mouse is over items or by selecting with key arrows */\n --selectic-active-item-color: #ffffff;\n --selectic-active-item-bg: #66afe9;\n\n /* Selected values in main element */\n --selectic-value-bg: #f0f0f0;\n /* --selectic-more-items-bg: var(--selectic-info-bg); /* can be set in any CSS configuration */\n /* --selectic-more-items-color: var(--selectic-info-color); /* can be set in any CSS configuration */\n --selectic-more-items-bg-disabled: #cccccc;\n\n /* Information message */\n --selectic-info-bg: #5bc0de;\n --selectic-info-color: #ffffff;\n\n /* Error message */\n --selectic-error-bg: #b72c29;\n --selectic-error-color: #ffffff;\n\n /* XXX: Currently it is important to keep this size for a correct scroll\n * height estimation */\n --selectic-input-height: 30px;\n}\n\n/* }}} */\n/* {{{ Bootstrap equivalent style */\n\n.selectic .form-control {\n display: block;\n width: 100%;\n height: calc(var(--selectic-input-height) - 2px);\n font-size: var(--selectic-font-size);\n line-height: 1.42857143;\n color: var(--selectic-color);\n background-color: var(--selectic-bg);\n background-image: none;\n border: 1px solid var(--selectic-separator-bordercolor); /* should use a better variable */\n border-radius: 4px;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n.selectic .has-feedback {\n position: relative;\n}\n.selectic .has-feedback .form-control {\n padding-right: calc(var(--selectic-input-height) + 4px);\n}\n\n.selectic .form-control-feedback.fa,\n.selectic .form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: calc(var(--selectic-input-height) + 4px);\n height: calc(var(--selectic-input-height) + 4px);\n line-height: var(--selectic-input-height);\n text-align: center;\n pointer-events: none;\n}\n\n.selectic .alert-info {\n background-color: var(--selectic-info-bg);\n color: var(--selectic-info-color);\n}\n\n.selectic .alert-danger {\n background-color: var(--selectic-error-bg);\n color: var(--selectic-error-color);\n}\n\n/* }}} */\n\n.selectic * {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n.selectic.form-control {\n display: inline-block;\n padding: 0;\n cursor: pointer;\n border: unset;\n}\n\n.has-feedback .selectic__icon-container.form-control-feedback {\n right: 0;\n}\n\n/* The input which contains the selected value\n * XXX: This input should stay hidden behind other elements, but is \"visible\"\n * (in term of DOM point of view) in order to get and to trigger the `focus`\n * DOM event. */\n.selectic__input-value {\n position: fixed;\n opacity: 0;\n z-index: -1000;\n top: -100px;\n}\n\n/* XXX: .form-control has been added to this selector to improve priority and\n * override some rules of the original .form-control */\n.selectic-input.form-control {\n display: inline-flex;\n justify-content: space-between;\n overflow: hidden;\n width: 100%;\n min-height: var(--selectic-input-height);\n padding-top: 0;\n padding-bottom: 0;\n padding-left: 5px;\n line-height: calc(var(--selectic-input-height) - 4px);\n color: var(--selectic-color);\n}\n\n.selectic-input__reverse-icon {\n align-self: center;\n margin-right: 3px;\n cursor: default;\n}\n.selectic-input__clear-icon {\n align-self: center;\n margin-left: 3px;\n cursor: pointer;\n}\n.selectic-input__clear-icon:hover {\n color: var(--selectic-selected-item-color);\n}\n\n.selectic-input.focused {\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n}\n\n.selectic-input.disabled {\n cursor: var(--selectic-cursor-disabled);\n background-color: var(--selectic-bg-disabled);\n}\n.selectic-input.disabled .more-items {\n\tbackground-color: var(--selectic-more-items-bg-disabled);\n}\n\n.selectic-input__selected-items {\n display: inline-flex;\n flex-wrap: nowrap;\n align-items: center;\n white-space: nowrap;\n}\n\n.selectic-input__selected-items__placeholder {\n font-style: italic;\n opacity: 0.7;\n white-space: nowrap;\n}\n\n.selectic-icon {\n color: var(--selectic-color);\n text-align: center;\n vertical-align: middle;\n}\n\n.selectic__extended-list {\n position: fixed;\n top: var(--top-position, 0);\n z-index: 2000;\n height: auto;\n max-height: var(--availableSpace);\n background-color: var(--selectic-bg, #ffffff);\n box-shadow: 2px 5px 12px 0px #888888;\n border-radius: 0 0 4px 4px;\n padding: 0;\n width: var(--list-width, 200px);\n min-width: 200px;\n display: grid;\n grid-template-rows: minmax(0, max-content) 1fr;\n}\n.selectic__extended-list.selectic-position-top {\n box-shadow: 2px -3px 12px 0px #888888;\n}\n.selectic__extended-list__list-container{\n overflow: auto;\n}\n.selectic__extended-list__list-items {\n max-height: calc(var(--selectic-input-height) * 10);\n min-width: max-content;\n padding-left: 0;\n}\n\n.selectic-item {\n display: block;\n position: relative;\n box-sizing: border-box;\n padding: 2px 8px;\n color: var(--selectic-item-color, var(--selectic-color));\n min-height: calc(var(--selectic-input-height) - 3px);\n list-style-type: none;\n white-space: nowrap;\n cursor: pointer;\n}\n\n.selectic-item_text {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.selectic-item:not(.selected) .selectic-item_icon {\n opacity: 0;\n}\n\n.selectic-item_text {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.selectic-item__active {\n background-color: var(--selectic-active-item-bg);\n color: var(--selectic-active-item-color);\n}\n.selectic-item__active:not(.selected) .selectic-item_icon {\n opacity: 0.2;\n}\n\n.selectic-item__disabled {\n color: var(--selectic-color-disabled);\n background-color: var(--selectic-bg-disabled);\n}\n\n.selectic-item__is-in-group {\n padding-left: 2em;\n}\n\n.selectic-item__is-group {\n font-weight: bold;\n cursor: default;\n}\n\n.selectic-item.selected {\n color: var(--selectic-selected-item-color);\n}\n.selectic-search-scope {\n color: #e0e0e0;\n left: auto;\n right: 10px;\n}\n.selectic .form-control-feedback.fa.selectic-search-scope {\n width: calc(var(--selectic-input-height) * 0.75);\n height: calc(var(--selectic-input-height) * 0.75);\n line-height: calc(var(--selectic-input-height) * 0.75);\n}\n\n.selectic__message {\n text-align: center;\n padding: 3px;\n}\n\n.selectic .filter-panel {\n padding: 3px;\n margin-left: 0px;\n margin-right: 0px;\n background-color: var(--selectic-panel-bg);\n border-bottom: 1px solid var(--selectic-separator-bordercolor);\n}\n\n.selectic .panelclosed {\n max-height: 0px;\n transition: max-height 0.3s ease-out;\n overflow: hidden;\n}\n\n.panelopened {\n max-height: 200px;\n transition: max-height 0.3s ease-in;\n overflow: hidden;\n}\n\n.selectic .filter-panel__input {\n padding-left: 0px;\n padding-right: 0px;\n padding-bottom: 10px;\n margin-bottom: 0px;\n}\n.selectic .filter-input {\n height: calc(var(--selectic-input-height) * 0.75);\n}\n\n.selectic .checkbox-filter {\n padding: 5px;\n text-align: center;\n}\n\n.selectic .curtain-handler {\n text-align: center;\n}\n\n.selectic .toggle-selectic {\n margin: 5px;\n padding-left: 0px;\n padding-right: 0px;\n}\n\n.selectic .toggle-boolean-select-all-toggle {\n display: inline;\n margin-right: 15px;\n}\n\n.selectic .toggle-boolean-excluding-toggle {\n display: inline;\n margin-right: 15px;\n}\n\n.selectic .single-value {\n display: grid;\n grid-template: \"value icon\" 1fr / max-content max-content;\n\n padding: 2px;\n padding-left: 5px;\n margin-left: 0;\n margin-right: 5px;\n /* margin top/bottom are mainly to create a gutter in multilines */\n margin-top: 2px;\n margin-bottom: 2px;\n\n border-radius: 3px;\n background-color: var(--selectic-value-bg);\n max-height: calc(var(--selectic-input-height) - 10px);\n max-width: 100%;\n min-width: 30px;\n\n overflow: hidden;\n white-space: nowrap;\n line-height: initial;\n vertical-align: middle;\n}\n\n.selectic .more-items {\n display: inline-block;\n\n padding-left: 5px;\n padding-right: 5px;\n border-radius: 10px;\n\n background-color: var(--selectic-more-items-bg, var(--selectic-info-bg));\n color: var(--selectic-more-items-color, var(--selectic-info-color));\n cursor: help;\n}\n.selectic-input__selected-items__value {\n grid-area: value;\n align-self: center;\n justify-self: normal;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n}\n\n.selectic-input__selected-items__icon {\n grid-area: icon;\n align-self: center;\n justify-self: center;\n margin-left: 5px;\n}\n.selectic-input__selected-items__icon:hover {\n color: var(--selectic-selected-item-color);\n}\n\n.selectic__label-disabled {\n opacity: 0.5;\n transition: opacity 400ms;\n}\n\n/* XXX: override padding of bootstrap input-sm.\n * This padding introduce a line shift. */\n.selectic.input-sm {\n padding: 0;\n}\n\n/* {{{ overflow multiline */\n\n.selectic--overflow-multiline,\n.selectic--overflow-multiline.form-control,\n.selectic--overflow-multiline .form-control {\n height: unset;\n}\n\n.selectic--overflow-multiline .selectic-input {\n overflow: unset;\n}\n\n.selectic--overflow-multiline .selectic-input__selected-items {\n flex-wrap: wrap;\n}\n\n/* }}} */\n";
|
|
36
36
|
styleInject(css_248z);
|
|
37
37
|
|
|
38
38
|
/**
|
|
@@ -1851,6 +1851,10 @@ var __decorate$1 = (this && this.__decorate) || function (decorators, target, ke
|
|
|
1851
1851
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1852
1852
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1853
1853
|
};
|
|
1854
|
+
/* list estimation height
|
|
1855
|
+
* 30px × 10 + 20px (for panel header)
|
|
1856
|
+
*/
|
|
1857
|
+
const DEFAULT_LIST_HEIGHT = 320;
|
|
1854
1858
|
let ExtendedList = class ExtendedList extends vtyx.Vue {
|
|
1855
1859
|
constructor() {
|
|
1856
1860
|
/* {{{ props */
|
|
@@ -1858,11 +1862,18 @@ let ExtendedList = class ExtendedList extends vtyx.Vue {
|
|
|
1858
1862
|
/* }}} */
|
|
1859
1863
|
/* {{{ data */
|
|
1860
1864
|
this.topGroup = ' ';
|
|
1861
|
-
this.listHeight =
|
|
1865
|
+
this.listHeight = 0;
|
|
1862
1866
|
this.listWidth = 200;
|
|
1867
|
+
this.availableSpace = 0;
|
|
1863
1868
|
}
|
|
1864
1869
|
/* }}} */
|
|
1865
1870
|
/* {{{ computed */
|
|
1871
|
+
/** check if the height of the box has been completely estimated. */
|
|
1872
|
+
get isFullyEstimated() {
|
|
1873
|
+
const listHeight = this.listHeight;
|
|
1874
|
+
const availableSpace = this.availableSpace;
|
|
1875
|
+
return listHeight !== 0 && listHeight < availableSpace;
|
|
1876
|
+
}
|
|
1866
1877
|
get searchingLabel() {
|
|
1867
1878
|
return this.store.data.labels.searching;
|
|
1868
1879
|
}
|
|
@@ -1923,17 +1934,30 @@ let ExtendedList = class ExtendedList extends vtyx.Vue {
|
|
|
1923
1934
|
}
|
|
1924
1935
|
get bestPosition() {
|
|
1925
1936
|
const windowHeight = window.innerHeight;
|
|
1926
|
-
const
|
|
1937
|
+
const isFullyEstimated = this.isFullyEstimated;
|
|
1938
|
+
/* XXX: The max() is because if listHeight is greater than default,
|
|
1939
|
+
* it means that the value is more accurate than the default. */
|
|
1940
|
+
const listHeight = isFullyEstimated ? this.listHeight
|
|
1941
|
+
: Math.max(DEFAULT_LIST_HEIGHT, this.listHeight);
|
|
1927
1942
|
const inputTop = this.elementTop;
|
|
1928
1943
|
const inputBottom = this.elementBottom;
|
|
1929
|
-
|
|
1944
|
+
const availableTop = inputTop;
|
|
1945
|
+
const availableBottom = windowHeight - inputBottom;
|
|
1946
|
+
if (listHeight < availableBottom) {
|
|
1930
1947
|
return 'bottom';
|
|
1931
1948
|
}
|
|
1932
|
-
if (listHeight <
|
|
1949
|
+
if (listHeight < availableTop) {
|
|
1933
1950
|
return 'top';
|
|
1934
1951
|
}
|
|
1935
1952
|
/* There are not enough space neither at bottom nor at top */
|
|
1936
|
-
return
|
|
1953
|
+
return availableBottom < availableTop ? 'top' : 'bottom';
|
|
1954
|
+
}
|
|
1955
|
+
get position() {
|
|
1956
|
+
const listPosition = this.store.state.listPosition;
|
|
1957
|
+
if (listPosition === 'auto') {
|
|
1958
|
+
return this.bestPosition;
|
|
1959
|
+
}
|
|
1960
|
+
return listPosition;
|
|
1937
1961
|
}
|
|
1938
1962
|
get horizontalStyle() {
|
|
1939
1963
|
const windowWidth = window.innerWidth;
|
|
@@ -1953,26 +1977,32 @@ let ExtendedList = class ExtendedList extends vtyx.Vue {
|
|
|
1953
1977
|
return `left: ${inputLeft}px; min-width: unset;`;
|
|
1954
1978
|
}
|
|
1955
1979
|
get positionStyle() {
|
|
1956
|
-
|
|
1980
|
+
const listPosition = this.position;
|
|
1957
1981
|
const horizontalStyle = this.horizontalStyle;
|
|
1958
|
-
|
|
1959
|
-
listPosition = this.bestPosition;
|
|
1960
|
-
}
|
|
1982
|
+
const width = this.width;
|
|
1961
1983
|
if (listPosition === 'top') {
|
|
1962
1984
|
const transform = horizontalStyle.includes('transform')
|
|
1963
1985
|
? 'transform: translateX(-100%) translateY(-100%);'
|
|
1964
1986
|
: 'transform: translateY(-100%);';
|
|
1987
|
+
const elementTop = this.elementTop;
|
|
1988
|
+
const availableSpace = this.elementTop;
|
|
1989
|
+
this.availableSpace = availableSpace;
|
|
1965
1990
|
return `
|
|
1966
|
-
top: ${
|
|
1991
|
+
--top-position: ${elementTop}px;
|
|
1967
1992
|
${horizontalStyle}
|
|
1968
|
-
width: ${
|
|
1969
|
-
${transform}
|
|
1993
|
+
--list-width: ${width}px;
|
|
1994
|
+
${transform};
|
|
1995
|
+
--availableSpace: ${availableSpace}px;
|
|
1970
1996
|
`;
|
|
1971
1997
|
}
|
|
1998
|
+
const elementBottom = this.elementBottom;
|
|
1999
|
+
const availableSpace = window.innerHeight - elementBottom;
|
|
2000
|
+
this.availableSpace = availableSpace;
|
|
1972
2001
|
return `
|
|
1973
|
-
top: ${
|
|
2002
|
+
--top-position: ${elementBottom}px;
|
|
1974
2003
|
${horizontalStyle}
|
|
1975
|
-
width: ${
|
|
2004
|
+
--list-width: ${width}px;
|
|
2005
|
+
--availableSpace: ${availableSpace}px;
|
|
1976
2006
|
`;
|
|
1977
2007
|
}
|
|
1978
2008
|
/* }}} */
|
|
@@ -2015,7 +2045,10 @@ let ExtendedList = class ExtendedList extends vtyx.Vue {
|
|
|
2015
2045
|
const state = store.state;
|
|
2016
2046
|
const isGroup = state.groups.size > 0 &&
|
|
2017
2047
|
state.totalFilteredOptions > store.data.itemsPerPage;
|
|
2018
|
-
return (vtyx.h("div", { style: this.positionStyle, class:
|
|
2048
|
+
return (vtyx.h("div", { style: this.positionStyle, class: [
|
|
2049
|
+
'selectic selectic__extended-list',
|
|
2050
|
+
`selectic-position-${this.position}`,
|
|
2051
|
+
] },
|
|
2019
2052
|
!state.hideFilter && (vtyx.h(Filter, { store: this.store })),
|
|
2020
2053
|
isGroup && (vtyx.h("span", { class: "selectic-item selectic-item--header selectic-item__is-group" }, this.topGroup)),
|
|
2021
2054
|
vtyx.h(List$1, { store: store, on: {
|
package/dist/selectic.esm.js
CHANGED
|
@@ -28,7 +28,7 @@ function styleInject(css, ref) {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
var css_248z = "/* {{{ Variables */\n\n:root {\n --selectic-font-size: 14px;\n --selectic-cursor-disabled: not-allowed;\n\n /* The main element */\n --selectic-color: #555555;\n --selectic-bg: #ffffff;\n\n /* The main element (when disabled) */\n --selectic-color-disabled: #787878;\n --selectic-bg-disabled: #eeeeee;\n\n /* The list */\n --selectic-panel-bg: #f0f0f0;\n --selectic-separator-bordercolor: #cccccc;\n /* --selectic-item-color: var(--selectic-color); /* Can be set in any CSS configuration */\n\n /* The current selected item */\n --selectic-selected-item-color: #428bca;\n\n /* When mouse is over items or by selecting with key arrows */\n --selectic-active-item-color: #ffffff;\n --selectic-active-item-bg: #66afe9;\n\n /* Selected values in main element */\n --selectic-value-bg: #f0f0f0;\n /* --selectic-more-items-bg: var(--selectic-info-bg); /* can be set in any CSS configuration */\n /* --selectic-more-items-color: var(--selectic-info-color); /* can be set in any CSS configuration */\n --selectic-more-items-bg-disabled: #cccccc;\n\n /* Information message */\n --selectic-info-bg: #5bc0de;\n --selectic-info-color: #ffffff;\n\n /* Error message */\n --selectic-error-bg: #b72c29;\n --selectic-error-color: #ffffff;\n\n /* XXX: Currently it is important to keep this size for a correct scroll\n * height estimation */\n --selectic-input-height: 30px;\n}\n\n/* }}} */\n/* {{{ Bootstrap equivalent style */\n\n.selectic .form-control {\n display: block;\n width: 100%;\n height: calc(var(--selectic-input-height) - 2px);\n font-size: var(--selectic-font-size);\n line-height: 1.42857143;\n color: var(--selectic-color);\n background-color: var(--selectic-bg);\n background-image: none;\n border: 1px solid var(--selectic-separator-bordercolor); /* should use a better variable */\n border-radius: 4px;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n.selectic .has-feedback {\n position: relative;\n}\n.selectic .has-feedback .form-control {\n padding-right: calc(var(--selectic-input-height) + 4px);\n}\n\n.selectic .form-control-feedback.fa,\n.selectic .form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: calc(var(--selectic-input-height) + 4px);\n height: calc(var(--selectic-input-height) + 4px);\n line-height: var(--selectic-input-height);\n text-align: center;\n pointer-events: none;\n}\n\n.selectic .alert-info {\n background-color: var(--selectic-info-bg);\n color: var(--selectic-info-color);\n}\n\n.selectic .alert-danger {\n background-color: var(--selectic-error-bg);\n color: var(--selectic-error-color);\n}\n\n/* }}} */\n\n.selectic * {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n.selectic.form-control {\n display: inline-block;\n padding: 0;\n cursor: pointer;\n border: unset;\n}\n\n.has-feedback .selectic__icon-container.form-control-feedback {\n right: 0;\n}\n\n/* The input which contains the selected value\n * XXX: This input should stay hidden behind other elements, but is \"visible\"\n * (in term of DOM point of view) in order to get and to trigger the `focus`\n * DOM event. */\n.selectic__input-value {\n position: fixed;\n opacity: 0;\n z-index: -1000;\n top: -100px;\n}\n\n/* XXX: .form-control has been added to this selector to improve priority and\n * override some rules of the original .form-control */\n.selectic-input.form-control {\n display: inline-flex;\n justify-content: space-between;\n overflow: hidden;\n width: 100%;\n min-height: var(--selectic-input-height);\n padding-top: 0;\n padding-bottom: 0;\n padding-left: 5px;\n line-height: calc(var(--selectic-input-height) - 4px);\n color: var(--selectic-color);\n}\n\n.selectic-input__reverse-icon {\n align-self: center;\n margin-right: 3px;\n cursor: default;\n}\n.selectic-input__clear-icon {\n align-self: center;\n margin-left: 3px;\n cursor: pointer;\n}\n.selectic-input__clear-icon:hover {\n color: var(--selectic-selected-item-color);\n}\n\n.selectic-input.focused {\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n}\n\n.selectic-input.disabled {\n cursor: var(--selectic-cursor-disabled);\n background-color: var(--selectic-bg-disabled);\n}\n.selectic-input.disabled .more-items {\n\tbackground-color: var(--selectic-more-items-bg-disabled);\n}\n\n.selectic-input__selected-items {\n display: inline-flex;\n flex-wrap: nowrap;\n align-items: center;\n white-space: nowrap;\n}\n\n.selectic-input__selected-items__placeholder {\n font-style: italic;\n opacity: 0.7;\n white-space: nowrap;\n}\n\n.selectic-icon {\n color: var(--selectic-color);\n text-align: center;\n vertical-align: middle;\n}\n\n.selectic__extended-list {\n position: fixed;\n z-index: 2000;\n height: auto;\n background-color: var(--selectic-bg, #ffffff);\n box-shadow: 2px 5px 12px 0px #888888;\n border-radius: 0 0 4px 4px;\n padding: 0;\n min-width: 200px;\n}\n.selectic__extended-list__list-container{\n overflow: auto;\n}\n.selectic__extended-list__list-items {\n max-height: calc(var(--selectic-input-height) * 10);\n min-width: max-content;\n padding-left: 0;\n}\n\n.selectic-item {\n display: block;\n position: relative;\n box-sizing: border-box;\n padding: 2px 8px;\n color: var(--selectic-item-color, var(--selectic-color));\n min-height: calc(var(--selectic-input-height) - 3px);\n list-style-type: none;\n white-space: nowrap;\n cursor: pointer;\n}\n\n.selectic-item_text {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.selectic-item:not(.selected) .selectic-item_icon {\n opacity: 0;\n}\n\n.selectic-item_text {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.selectic-item__active {\n background-color: var(--selectic-active-item-bg);\n color: var(--selectic-active-item-color);\n}\n.selectic-item__active:not(.selected) .selectic-item_icon {\n opacity: 0.2;\n}\n\n.selectic-item__disabled {\n color: var(--selectic-color-disabled);\n background-color: var(--selectic-bg-disabled);\n}\n\n.selectic-item__is-in-group {\n padding-left: 2em;\n}\n\n.selectic-item__is-group {\n font-weight: bold;\n cursor: default;\n}\n\n.selectic-item.selected {\n color: var(--selectic-selected-item-color);\n}\n.selectic-search-scope {\n color: #e0e0e0;\n left: auto;\n right: 10px;\n}\n.selectic .form-control-feedback.fa.selectic-search-scope {\n width: calc(var(--selectic-input-height) * 0.75);\n height: calc(var(--selectic-input-height) * 0.75);\n line-height: calc(var(--selectic-input-height) * 0.75);\n}\n\n.selectic__message {\n text-align: center;\n padding: 3px;\n}\n\n.selectic .filter-panel {\n padding: 3px;\n margin-left: 0px;\n margin-right: 0px;\n background-color: var(--selectic-panel-bg);\n border-bottom: 1px solid var(--selectic-separator-bordercolor);\n}\n\n.selectic .panelclosed {\n max-height: 0px;\n transition: max-height 0.3s ease-out;\n overflow: hidden;\n}\n\n.panelopened {\n max-height: 200px;\n transition: max-height 0.3s ease-in;\n overflow: hidden;\n}\n\n.selectic .filter-panel__input {\n padding-left: 0px;\n padding-right: 0px;\n padding-bottom: 10px;\n margin-bottom: 0px;\n}\n.selectic .filter-input {\n height: calc(var(--selectic-input-height) * 0.75);\n}\n\n.selectic .checkbox-filter {\n padding: 5px;\n text-align: center;\n}\n\n.selectic .curtain-handler {\n text-align: center;\n}\n\n.selectic .toggle-selectic {\n margin: 5px;\n padding-left: 0px;\n padding-right: 0px;\n}\n\n.selectic .toggle-boolean-select-all-toggle {\n display: inline;\n margin-right: 15px;\n}\n\n.selectic .toggle-boolean-excluding-toggle {\n display: inline;\n margin-right: 15px;\n}\n\n.selectic .single-value {\n display: grid;\n grid-template: \"value icon\" 1fr / max-content max-content;\n\n padding: 2px;\n padding-left: 5px;\n margin-left: 0;\n margin-right: 5px;\n /* margin top/bottom are mainly to create a gutter in multilines */\n margin-top: 2px;\n margin-bottom: 2px;\n\n border-radius: 3px;\n background-color: var(--selectic-value-bg);\n max-height: calc(var(--selectic-input-height) - 10px);\n max-width: 100%;\n min-width: 30px;\n\n overflow: hidden;\n white-space: nowrap;\n line-height: initial;\n vertical-align: middle;\n}\n\n.selectic .more-items {\n display: inline-block;\n\n padding-left: 5px;\n padding-right: 5px;\n border-radius: 10px;\n\n background-color: var(--selectic-more-items-bg, var(--selectic-info-bg));\n color: var(--selectic-more-items-color, var(--selectic-info-color));\n cursor: help;\n}\n.selectic-input__selected-items__value {\n grid-area: value;\n align-self: center;\n justify-self: normal;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n}\n\n.selectic-input__selected-items__icon {\n grid-area: icon;\n align-self: center;\n justify-self: center;\n margin-left: 5px;\n}\n.selectic-input__selected-items__icon:hover {\n color: var(--selectic-selected-item-color);\n}\n\n.selectic__label-disabled {\n opacity: 0.5;\n transition: opacity 400ms;\n}\n\n/* XXX: override padding of bootstrap input-sm.\n * This padding introduce a line shift. */\n.selectic.input-sm {\n padding: 0;\n}\n\n/* {{{ overflow multiline */\n\n.selectic--overflow-multiline,\n.selectic--overflow-multiline.form-control,\n.selectic--overflow-multiline .form-control {\n height: unset;\n}\n\n.selectic--overflow-multiline .selectic-input {\n overflow: unset;\n}\n\n.selectic--overflow-multiline .selectic-input__selected-items {\n flex-wrap: wrap;\n}\n\n/* }}} */\n";
|
|
31
|
+
var css_248z = "/* {{{ Variables */\n\n:root {\n --selectic-font-size: 14px;\n --selectic-cursor-disabled: not-allowed;\n\n /* The main element */\n --selectic-color: #555555;\n --selectic-bg: #ffffff;\n\n /* The main element (when disabled) */\n --selectic-color-disabled: #787878;\n --selectic-bg-disabled: #eeeeee;\n\n /* The list */\n --selectic-panel-bg: #f0f0f0;\n --selectic-separator-bordercolor: #cccccc;\n /* --selectic-item-color: var(--selectic-color); /* Can be set in any CSS configuration */\n\n /* The current selected item */\n --selectic-selected-item-color: #428bca;\n\n /* When mouse is over items or by selecting with key arrows */\n --selectic-active-item-color: #ffffff;\n --selectic-active-item-bg: #66afe9;\n\n /* Selected values in main element */\n --selectic-value-bg: #f0f0f0;\n /* --selectic-more-items-bg: var(--selectic-info-bg); /* can be set in any CSS configuration */\n /* --selectic-more-items-color: var(--selectic-info-color); /* can be set in any CSS configuration */\n --selectic-more-items-bg-disabled: #cccccc;\n\n /* Information message */\n --selectic-info-bg: #5bc0de;\n --selectic-info-color: #ffffff;\n\n /* Error message */\n --selectic-error-bg: #b72c29;\n --selectic-error-color: #ffffff;\n\n /* XXX: Currently it is important to keep this size for a correct scroll\n * height estimation */\n --selectic-input-height: 30px;\n}\n\n/* }}} */\n/* {{{ Bootstrap equivalent style */\n\n.selectic .form-control {\n display: block;\n width: 100%;\n height: calc(var(--selectic-input-height) - 2px);\n font-size: var(--selectic-font-size);\n line-height: 1.42857143;\n color: var(--selectic-color);\n background-color: var(--selectic-bg);\n background-image: none;\n border: 1px solid var(--selectic-separator-bordercolor); /* should use a better variable */\n border-radius: 4px;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n.selectic .has-feedback {\n position: relative;\n}\n.selectic .has-feedback .form-control {\n padding-right: calc(var(--selectic-input-height) + 4px);\n}\n\n.selectic .form-control-feedback.fa,\n.selectic .form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: calc(var(--selectic-input-height) + 4px);\n height: calc(var(--selectic-input-height) + 4px);\n line-height: var(--selectic-input-height);\n text-align: center;\n pointer-events: none;\n}\n\n.selectic .alert-info {\n background-color: var(--selectic-info-bg);\n color: var(--selectic-info-color);\n}\n\n.selectic .alert-danger {\n background-color: var(--selectic-error-bg);\n color: var(--selectic-error-color);\n}\n\n/* }}} */\n\n.selectic * {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n.selectic.form-control {\n display: inline-block;\n padding: 0;\n cursor: pointer;\n border: unset;\n}\n\n.has-feedback .selectic__icon-container.form-control-feedback {\n right: 0;\n}\n\n/* The input which contains the selected value\n * XXX: This input should stay hidden behind other elements, but is \"visible\"\n * (in term of DOM point of view) in order to get and to trigger the `focus`\n * DOM event. */\n.selectic__input-value {\n position: fixed;\n opacity: 0;\n z-index: -1000;\n top: -100px;\n}\n\n/* XXX: .form-control has been added to this selector to improve priority and\n * override some rules of the original .form-control */\n.selectic-input.form-control {\n display: inline-flex;\n justify-content: space-between;\n overflow: hidden;\n width: 100%;\n min-height: var(--selectic-input-height);\n padding-top: 0;\n padding-bottom: 0;\n padding-left: 5px;\n line-height: calc(var(--selectic-input-height) - 4px);\n color: var(--selectic-color);\n}\n\n.selectic-input__reverse-icon {\n align-self: center;\n margin-right: 3px;\n cursor: default;\n}\n.selectic-input__clear-icon {\n align-self: center;\n margin-left: 3px;\n cursor: pointer;\n}\n.selectic-input__clear-icon:hover {\n color: var(--selectic-selected-item-color);\n}\n\n.selectic-input.focused {\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n}\n\n.selectic-input.disabled {\n cursor: var(--selectic-cursor-disabled);\n background-color: var(--selectic-bg-disabled);\n}\n.selectic-input.disabled .more-items {\n\tbackground-color: var(--selectic-more-items-bg-disabled);\n}\n\n.selectic-input__selected-items {\n display: inline-flex;\n flex-wrap: nowrap;\n align-items: center;\n white-space: nowrap;\n}\n\n.selectic-input__selected-items__placeholder {\n font-style: italic;\n opacity: 0.7;\n white-space: nowrap;\n}\n\n.selectic-icon {\n color: var(--selectic-color);\n text-align: center;\n vertical-align: middle;\n}\n\n.selectic__extended-list {\n position: fixed;\n top: var(--top-position, 0);\n z-index: 2000;\n height: auto;\n max-height: var(--availableSpace);\n background-color: var(--selectic-bg, #ffffff);\n box-shadow: 2px 5px 12px 0px #888888;\n border-radius: 0 0 4px 4px;\n padding: 0;\n width: var(--list-width, 200px);\n min-width: 200px;\n display: grid;\n grid-template-rows: minmax(0, max-content) 1fr;\n}\n.selectic__extended-list.selectic-position-top {\n box-shadow: 2px -3px 12px 0px #888888;\n}\n.selectic__extended-list__list-container{\n overflow: auto;\n}\n.selectic__extended-list__list-items {\n max-height: calc(var(--selectic-input-height) * 10);\n min-width: max-content;\n padding-left: 0;\n}\n\n.selectic-item {\n display: block;\n position: relative;\n box-sizing: border-box;\n padding: 2px 8px;\n color: var(--selectic-item-color, var(--selectic-color));\n min-height: calc(var(--selectic-input-height) - 3px);\n list-style-type: none;\n white-space: nowrap;\n cursor: pointer;\n}\n\n.selectic-item_text {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.selectic-item:not(.selected) .selectic-item_icon {\n opacity: 0;\n}\n\n.selectic-item_text {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.selectic-item__active {\n background-color: var(--selectic-active-item-bg);\n color: var(--selectic-active-item-color);\n}\n.selectic-item__active:not(.selected) .selectic-item_icon {\n opacity: 0.2;\n}\n\n.selectic-item__disabled {\n color: var(--selectic-color-disabled);\n background-color: var(--selectic-bg-disabled);\n}\n\n.selectic-item__is-in-group {\n padding-left: 2em;\n}\n\n.selectic-item__is-group {\n font-weight: bold;\n cursor: default;\n}\n\n.selectic-item.selected {\n color: var(--selectic-selected-item-color);\n}\n.selectic-search-scope {\n color: #e0e0e0;\n left: auto;\n right: 10px;\n}\n.selectic .form-control-feedback.fa.selectic-search-scope {\n width: calc(var(--selectic-input-height) * 0.75);\n height: calc(var(--selectic-input-height) * 0.75);\n line-height: calc(var(--selectic-input-height) * 0.75);\n}\n\n.selectic__message {\n text-align: center;\n padding: 3px;\n}\n\n.selectic .filter-panel {\n padding: 3px;\n margin-left: 0px;\n margin-right: 0px;\n background-color: var(--selectic-panel-bg);\n border-bottom: 1px solid var(--selectic-separator-bordercolor);\n}\n\n.selectic .panelclosed {\n max-height: 0px;\n transition: max-height 0.3s ease-out;\n overflow: hidden;\n}\n\n.panelopened {\n max-height: 200px;\n transition: max-height 0.3s ease-in;\n overflow: hidden;\n}\n\n.selectic .filter-panel__input {\n padding-left: 0px;\n padding-right: 0px;\n padding-bottom: 10px;\n margin-bottom: 0px;\n}\n.selectic .filter-input {\n height: calc(var(--selectic-input-height) * 0.75);\n}\n\n.selectic .checkbox-filter {\n padding: 5px;\n text-align: center;\n}\n\n.selectic .curtain-handler {\n text-align: center;\n}\n\n.selectic .toggle-selectic {\n margin: 5px;\n padding-left: 0px;\n padding-right: 0px;\n}\n\n.selectic .toggle-boolean-select-all-toggle {\n display: inline;\n margin-right: 15px;\n}\n\n.selectic .toggle-boolean-excluding-toggle {\n display: inline;\n margin-right: 15px;\n}\n\n.selectic .single-value {\n display: grid;\n grid-template: \"value icon\" 1fr / max-content max-content;\n\n padding: 2px;\n padding-left: 5px;\n margin-left: 0;\n margin-right: 5px;\n /* margin top/bottom are mainly to create a gutter in multilines */\n margin-top: 2px;\n margin-bottom: 2px;\n\n border-radius: 3px;\n background-color: var(--selectic-value-bg);\n max-height: calc(var(--selectic-input-height) - 10px);\n max-width: 100%;\n min-width: 30px;\n\n overflow: hidden;\n white-space: nowrap;\n line-height: initial;\n vertical-align: middle;\n}\n\n.selectic .more-items {\n display: inline-block;\n\n padding-left: 5px;\n padding-right: 5px;\n border-radius: 10px;\n\n background-color: var(--selectic-more-items-bg, var(--selectic-info-bg));\n color: var(--selectic-more-items-color, var(--selectic-info-color));\n cursor: help;\n}\n.selectic-input__selected-items__value {\n grid-area: value;\n align-self: center;\n justify-self: normal;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n}\n\n.selectic-input__selected-items__icon {\n grid-area: icon;\n align-self: center;\n justify-self: center;\n margin-left: 5px;\n}\n.selectic-input__selected-items__icon:hover {\n color: var(--selectic-selected-item-color);\n}\n\n.selectic__label-disabled {\n opacity: 0.5;\n transition: opacity 400ms;\n}\n\n/* XXX: override padding of bootstrap input-sm.\n * This padding introduce a line shift. */\n.selectic.input-sm {\n padding: 0;\n}\n\n/* {{{ overflow multiline */\n\n.selectic--overflow-multiline,\n.selectic--overflow-multiline.form-control,\n.selectic--overflow-multiline .form-control {\n height: unset;\n}\n\n.selectic--overflow-multiline .selectic-input {\n overflow: unset;\n}\n\n.selectic--overflow-multiline .selectic-input__selected-items {\n flex-wrap: wrap;\n}\n\n/* }}} */\n";
|
|
32
32
|
styleInject(css_248z);
|
|
33
33
|
|
|
34
34
|
/**
|
|
@@ -1847,6 +1847,10 @@ var __decorate$1 = (this && this.__decorate) || function (decorators, target, ke
|
|
|
1847
1847
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1848
1848
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1849
1849
|
};
|
|
1850
|
+
/* list estimation height
|
|
1851
|
+
* 30px × 10 + 20px (for panel header)
|
|
1852
|
+
*/
|
|
1853
|
+
const DEFAULT_LIST_HEIGHT = 320;
|
|
1850
1854
|
let ExtendedList = class ExtendedList extends Vue {
|
|
1851
1855
|
constructor() {
|
|
1852
1856
|
/* {{{ props */
|
|
@@ -1854,11 +1858,18 @@ let ExtendedList = class ExtendedList extends Vue {
|
|
|
1854
1858
|
/* }}} */
|
|
1855
1859
|
/* {{{ data */
|
|
1856
1860
|
this.topGroup = ' ';
|
|
1857
|
-
this.listHeight =
|
|
1861
|
+
this.listHeight = 0;
|
|
1858
1862
|
this.listWidth = 200;
|
|
1863
|
+
this.availableSpace = 0;
|
|
1859
1864
|
}
|
|
1860
1865
|
/* }}} */
|
|
1861
1866
|
/* {{{ computed */
|
|
1867
|
+
/** check if the height of the box has been completely estimated. */
|
|
1868
|
+
get isFullyEstimated() {
|
|
1869
|
+
const listHeight = this.listHeight;
|
|
1870
|
+
const availableSpace = this.availableSpace;
|
|
1871
|
+
return listHeight !== 0 && listHeight < availableSpace;
|
|
1872
|
+
}
|
|
1862
1873
|
get searchingLabel() {
|
|
1863
1874
|
return this.store.data.labels.searching;
|
|
1864
1875
|
}
|
|
@@ -1919,17 +1930,30 @@ let ExtendedList = class ExtendedList extends Vue {
|
|
|
1919
1930
|
}
|
|
1920
1931
|
get bestPosition() {
|
|
1921
1932
|
const windowHeight = window.innerHeight;
|
|
1922
|
-
const
|
|
1933
|
+
const isFullyEstimated = this.isFullyEstimated;
|
|
1934
|
+
/* XXX: The max() is because if listHeight is greater than default,
|
|
1935
|
+
* it means that the value is more accurate than the default. */
|
|
1936
|
+
const listHeight = isFullyEstimated ? this.listHeight
|
|
1937
|
+
: Math.max(DEFAULT_LIST_HEIGHT, this.listHeight);
|
|
1923
1938
|
const inputTop = this.elementTop;
|
|
1924
1939
|
const inputBottom = this.elementBottom;
|
|
1925
|
-
|
|
1940
|
+
const availableTop = inputTop;
|
|
1941
|
+
const availableBottom = windowHeight - inputBottom;
|
|
1942
|
+
if (listHeight < availableBottom) {
|
|
1926
1943
|
return 'bottom';
|
|
1927
1944
|
}
|
|
1928
|
-
if (listHeight <
|
|
1945
|
+
if (listHeight < availableTop) {
|
|
1929
1946
|
return 'top';
|
|
1930
1947
|
}
|
|
1931
1948
|
/* There are not enough space neither at bottom nor at top */
|
|
1932
|
-
return
|
|
1949
|
+
return availableBottom < availableTop ? 'top' : 'bottom';
|
|
1950
|
+
}
|
|
1951
|
+
get position() {
|
|
1952
|
+
const listPosition = this.store.state.listPosition;
|
|
1953
|
+
if (listPosition === 'auto') {
|
|
1954
|
+
return this.bestPosition;
|
|
1955
|
+
}
|
|
1956
|
+
return listPosition;
|
|
1933
1957
|
}
|
|
1934
1958
|
get horizontalStyle() {
|
|
1935
1959
|
const windowWidth = window.innerWidth;
|
|
@@ -1949,26 +1973,32 @@ let ExtendedList = class ExtendedList extends Vue {
|
|
|
1949
1973
|
return `left: ${inputLeft}px; min-width: unset;`;
|
|
1950
1974
|
}
|
|
1951
1975
|
get positionStyle() {
|
|
1952
|
-
|
|
1976
|
+
const listPosition = this.position;
|
|
1953
1977
|
const horizontalStyle = this.horizontalStyle;
|
|
1954
|
-
|
|
1955
|
-
listPosition = this.bestPosition;
|
|
1956
|
-
}
|
|
1978
|
+
const width = this.width;
|
|
1957
1979
|
if (listPosition === 'top') {
|
|
1958
1980
|
const transform = horizontalStyle.includes('transform')
|
|
1959
1981
|
? 'transform: translateX(-100%) translateY(-100%);'
|
|
1960
1982
|
: 'transform: translateY(-100%);';
|
|
1983
|
+
const elementTop = this.elementTop;
|
|
1984
|
+
const availableSpace = this.elementTop;
|
|
1985
|
+
this.availableSpace = availableSpace;
|
|
1961
1986
|
return `
|
|
1962
|
-
top: ${
|
|
1987
|
+
--top-position: ${elementTop}px;
|
|
1963
1988
|
${horizontalStyle}
|
|
1964
|
-
width: ${
|
|
1965
|
-
${transform}
|
|
1989
|
+
--list-width: ${width}px;
|
|
1990
|
+
${transform};
|
|
1991
|
+
--availableSpace: ${availableSpace}px;
|
|
1966
1992
|
`;
|
|
1967
1993
|
}
|
|
1994
|
+
const elementBottom = this.elementBottom;
|
|
1995
|
+
const availableSpace = window.innerHeight - elementBottom;
|
|
1996
|
+
this.availableSpace = availableSpace;
|
|
1968
1997
|
return `
|
|
1969
|
-
top: ${
|
|
1998
|
+
--top-position: ${elementBottom}px;
|
|
1970
1999
|
${horizontalStyle}
|
|
1971
|
-
width: ${
|
|
2000
|
+
--list-width: ${width}px;
|
|
2001
|
+
--availableSpace: ${availableSpace}px;
|
|
1972
2002
|
`;
|
|
1973
2003
|
}
|
|
1974
2004
|
/* }}} */
|
|
@@ -2011,7 +2041,10 @@ let ExtendedList = class ExtendedList extends Vue {
|
|
|
2011
2041
|
const state = store.state;
|
|
2012
2042
|
const isGroup = state.groups.size > 0 &&
|
|
2013
2043
|
state.totalFilteredOptions > store.data.itemsPerPage;
|
|
2014
|
-
return (h("div", { style: this.positionStyle, class:
|
|
2044
|
+
return (h("div", { style: this.positionStyle, class: [
|
|
2045
|
+
'selectic selectic__extended-list',
|
|
2046
|
+
`selectic-position-${this.position}`,
|
|
2047
|
+
] },
|
|
2015
2048
|
!state.hideFilter && (h(Filter, { store: this.store })),
|
|
2016
2049
|
isGroup && (h("span", { class: "selectic-item selectic-item--header selectic-item__is-group" }, this.topGroup)),
|
|
2017
2050
|
h(List$1, { store: store, on: {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "selectic",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.19",
|
|
4
4
|
"description": "Smart Select for VueJS 3.x",
|
|
5
5
|
"main": "dist/selectic.common.js",
|
|
6
6
|
"module": "dist/selectic.esm.js",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"vtyx": "4.0.5"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@babel/types": "^7.
|
|
44
|
+
"@babel/types": "^7.21.2",
|
|
45
45
|
"rollup": "^2.79.1",
|
|
46
46
|
"rollup-plugin-postcss": "^4.0.2",
|
|
47
47
|
"tape": "^4.16.2",
|
package/src/ExtendedList.tsx
CHANGED
|
@@ -20,6 +20,11 @@ export interface Props {
|
|
|
20
20
|
elementRight: number;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
/* list estimation height
|
|
24
|
+
* 30px × 10 + 20px (for panel header)
|
|
25
|
+
*/
|
|
26
|
+
const DEFAULT_LIST_HEIGHT = 320;
|
|
27
|
+
|
|
23
28
|
@Component
|
|
24
29
|
export default class ExtendedList extends Vue<Props> {
|
|
25
30
|
/* {{{ props */
|
|
@@ -46,12 +51,21 @@ export default class ExtendedList extends Vue<Props> {
|
|
|
46
51
|
/* {{{ data */
|
|
47
52
|
|
|
48
53
|
private topGroup = ' ';
|
|
49
|
-
private listHeight =
|
|
54
|
+
private listHeight = 0;
|
|
50
55
|
private listWidth = 200;
|
|
56
|
+
private availableSpace = 0;
|
|
51
57
|
|
|
52
58
|
/* }}} */
|
|
53
59
|
/* {{{ computed */
|
|
54
60
|
|
|
61
|
+
/** check if the height of the box has been completely estimated. */
|
|
62
|
+
get isFullyEstimated(): boolean {
|
|
63
|
+
const listHeight = this.listHeight;
|
|
64
|
+
const availableSpace = this.availableSpace;
|
|
65
|
+
|
|
66
|
+
return listHeight !== 0 && listHeight < availableSpace;
|
|
67
|
+
}
|
|
68
|
+
|
|
55
69
|
get searchingLabel() {
|
|
56
70
|
return this.store.data.labels.searching;
|
|
57
71
|
}
|
|
@@ -124,20 +138,36 @@ export default class ExtendedList extends Vue<Props> {
|
|
|
124
138
|
|
|
125
139
|
get bestPosition(): 'top' | 'bottom' {
|
|
126
140
|
const windowHeight = window.innerHeight;
|
|
127
|
-
const
|
|
141
|
+
const isFullyEstimated = this.isFullyEstimated;
|
|
142
|
+
/* XXX: The max() is because if listHeight is greater than default,
|
|
143
|
+
* it means that the value is more accurate than the default. */
|
|
144
|
+
const listHeight = isFullyEstimated ? this.listHeight
|
|
145
|
+
: Math.max(DEFAULT_LIST_HEIGHT, this.listHeight);
|
|
128
146
|
const inputTop = this.elementTop;
|
|
129
147
|
const inputBottom = this.elementBottom;
|
|
148
|
+
const availableTop = inputTop;
|
|
149
|
+
const availableBottom = windowHeight - inputBottom;
|
|
130
150
|
|
|
131
|
-
if (
|
|
151
|
+
if (listHeight < availableBottom) {
|
|
132
152
|
return 'bottom';
|
|
133
153
|
}
|
|
134
154
|
|
|
135
|
-
if (listHeight <
|
|
155
|
+
if (listHeight < availableTop) {
|
|
136
156
|
return 'top';
|
|
137
157
|
}
|
|
138
158
|
|
|
139
159
|
/* There are not enough space neither at bottom nor at top */
|
|
140
|
-
return
|
|
160
|
+
return availableBottom < availableTop ? 'top' : 'bottom';
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
get position(): 'top' | 'bottom' {
|
|
164
|
+
const listPosition = this.store.state.listPosition;
|
|
165
|
+
|
|
166
|
+
if (listPosition === 'auto') {
|
|
167
|
+
return this.bestPosition;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return listPosition;
|
|
141
171
|
}
|
|
142
172
|
|
|
143
173
|
get horizontalStyle(): string {
|
|
@@ -162,30 +192,35 @@ export default class ExtendedList extends Vue<Props> {
|
|
|
162
192
|
}
|
|
163
193
|
|
|
164
194
|
get positionStyle() {
|
|
165
|
-
|
|
195
|
+
const listPosition = this.position;
|
|
166
196
|
const horizontalStyle = this.horizontalStyle;
|
|
167
|
-
|
|
168
|
-
if (listPosition === 'auto') {
|
|
169
|
-
listPosition = this.bestPosition;
|
|
170
|
-
}
|
|
197
|
+
const width = this.width;
|
|
171
198
|
|
|
172
199
|
if (listPosition === 'top') {
|
|
173
200
|
const transform = horizontalStyle.includes('transform')
|
|
174
201
|
? 'transform: translateX(-100%) translateY(-100%);'
|
|
175
202
|
: 'transform: translateY(-100%);';
|
|
203
|
+
const elementTop = this.elementTop;
|
|
204
|
+
const availableSpace = this.elementTop;
|
|
205
|
+
this.availableSpace = availableSpace;
|
|
176
206
|
|
|
177
207
|
return `
|
|
178
|
-
top: ${
|
|
208
|
+
--top-position: ${elementTop}px;
|
|
179
209
|
${horizontalStyle}
|
|
180
|
-
width: ${
|
|
181
|
-
${transform}
|
|
210
|
+
--list-width: ${width}px;
|
|
211
|
+
${transform};
|
|
212
|
+
--availableSpace: ${availableSpace}px;
|
|
182
213
|
`;
|
|
183
214
|
}
|
|
215
|
+
const elementBottom = this.elementBottom;
|
|
216
|
+
const availableSpace = window.innerHeight - elementBottom;
|
|
217
|
+
this.availableSpace = availableSpace;
|
|
184
218
|
|
|
185
219
|
return `
|
|
186
|
-
top: ${
|
|
220
|
+
--top-position: ${elementBottom}px;
|
|
187
221
|
${horizontalStyle}
|
|
188
|
-
width: ${
|
|
222
|
+
--list-width: ${width}px;
|
|
223
|
+
--availableSpace: ${availableSpace}px;
|
|
189
224
|
`;
|
|
190
225
|
}
|
|
191
226
|
|
|
@@ -248,7 +283,10 @@ export default class ExtendedList extends Vue<Props> {
|
|
|
248
283
|
return (
|
|
249
284
|
<div
|
|
250
285
|
style={this.positionStyle}
|
|
251
|
-
class=
|
|
286
|
+
class={[
|
|
287
|
+
'selectic selectic__extended-list',
|
|
288
|
+
`selectic-position-${this.position}`,
|
|
289
|
+
]}
|
|
252
290
|
>
|
|
253
291
|
{!state.hideFilter && (
|
|
254
292
|
<Filter
|
package/src/css/selectic.css
CHANGED
|
@@ -184,13 +184,21 @@
|
|
|
184
184
|
|
|
185
185
|
.selectic__extended-list {
|
|
186
186
|
position: fixed;
|
|
187
|
+
top: var(--top-position, 0);
|
|
187
188
|
z-index: 2000;
|
|
188
189
|
height: auto;
|
|
190
|
+
max-height: var(--availableSpace);
|
|
189
191
|
background-color: var(--selectic-bg, #ffffff);
|
|
190
192
|
box-shadow: 2px 5px 12px 0px #888888;
|
|
191
193
|
border-radius: 0 0 4px 4px;
|
|
192
194
|
padding: 0;
|
|
195
|
+
width: var(--list-width, 200px);
|
|
193
196
|
min-width: 200px;
|
|
197
|
+
display: grid;
|
|
198
|
+
grid-template-rows: minmax(0, max-content) 1fr;
|
|
199
|
+
}
|
|
200
|
+
.selectic__extended-list.selectic-position-top {
|
|
201
|
+
box-shadow: 2px -3px 12px 0px #888888;
|
|
194
202
|
}
|
|
195
203
|
.selectic__extended-list__list-container{
|
|
196
204
|
overflow: auto;
|
package/types/ExtendedList.d.ts
CHANGED
|
@@ -18,12 +18,16 @@ export default class ExtendedList extends Vue<Props> {
|
|
|
18
18
|
private topGroup;
|
|
19
19
|
private listHeight;
|
|
20
20
|
private listWidth;
|
|
21
|
+
private availableSpace;
|
|
22
|
+
/** check if the height of the box has been completely estimated. */
|
|
23
|
+
get isFullyEstimated(): boolean;
|
|
21
24
|
get searchingLabel(): string;
|
|
22
25
|
get searching(): boolean;
|
|
23
26
|
get errorMessage(): string;
|
|
24
27
|
get infoMessage(): string;
|
|
25
28
|
get onKeyDown(): (evt: KeyboardEvent) => void;
|
|
26
29
|
get bestPosition(): 'top' | 'bottom';
|
|
30
|
+
get position(): 'top' | 'bottom';
|
|
27
31
|
get horizontalStyle(): string;
|
|
28
32
|
get positionStyle(): string;
|
|
29
33
|
onFilteredOptionsChange(): void;
|