@coreui/coreui 5.4.3 → 5.6.0
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/LICENSE +1 -1
- package/README.md +5 -3
- package/dist/css/coreui-grid.css +2 -2
- package/dist/css/coreui-grid.css.map +1 -1
- package/dist/css/coreui-grid.min.css +2 -2
- package/dist/css/coreui-grid.min.css.map +1 -1
- package/dist/css/coreui-grid.rtl.css +2 -2
- package/dist/css/coreui-grid.rtl.css.map +1 -1
- package/dist/css/coreui-grid.rtl.min.css +2 -2
- package/dist/css/coreui-grid.rtl.min.css.map +1 -1
- package/dist/css/coreui-reboot.css +11 -2
- package/dist/css/coreui-reboot.css.map +1 -1
- package/dist/css/coreui-reboot.min.css +3 -3
- package/dist/css/coreui-reboot.min.css.map +1 -1
- package/dist/css/coreui-reboot.rtl.css +11 -2
- package/dist/css/coreui-reboot.rtl.css.map +1 -1
- package/dist/css/coreui-reboot.rtl.min.css +3 -3
- package/dist/css/coreui-reboot.rtl.min.css.map +1 -1
- package/dist/css/coreui-utilities.css +11 -2
- package/dist/css/coreui-utilities.css.map +1 -1
- package/dist/css/coreui-utilities.min.css +3 -3
- package/dist/css/coreui-utilities.min.css.map +1 -1
- package/dist/css/coreui-utilities.rtl.css +11 -2
- package/dist/css/coreui-utilities.rtl.css.map +1 -1
- package/dist/css/coreui-utilities.rtl.min.css +3 -3
- package/dist/css/coreui-utilities.rtl.min.css.map +1 -1
- package/dist/css/coreui.css +337 -2
- package/dist/css/coreui.css.map +1 -1
- package/dist/css/coreui.min.css +3 -3
- package/dist/css/coreui.min.css.map +1 -1
- package/dist/css/coreui.rtl.css +332 -2
- package/dist/css/coreui.rtl.css.map +1 -1
- package/dist/css/coreui.rtl.min.css +3 -3
- package/dist/css/coreui.rtl.min.css.map +1 -1
- package/dist/css/themes/bootstrap/bootstrap.css +337 -2
- package/dist/css/themes/bootstrap/bootstrap.css.map +1 -1
- package/dist/css/themes/bootstrap/bootstrap.min.css +3 -3
- package/dist/css/themes/bootstrap/bootstrap.min.css.map +1 -1
- package/dist/css/themes/bootstrap/bootstrap.rtl.css +332 -2
- package/dist/css/themes/bootstrap/bootstrap.rtl.css.map +1 -1
- package/dist/css/themes/bootstrap/bootstrap.rtl.min.css +3 -3
- package/dist/css/themes/bootstrap/bootstrap.rtl.min.css.map +1 -1
- package/dist/js/bootstrap.bundle.js +874 -60
- package/dist/js/bootstrap.bundle.js.map +1 -1
- package/dist/js/bootstrap.bundle.min.js +3 -3
- package/dist/js/bootstrap.bundle.min.js.map +1 -1
- package/dist/js/bootstrap.esm.js +873 -53
- package/dist/js/bootstrap.esm.js.map +1 -1
- package/dist/js/bootstrap.esm.min.js +3 -3
- package/dist/js/bootstrap.esm.min.js.map +1 -1
- package/dist/js/bootstrap.js +874 -52
- package/dist/js/bootstrap.js.map +1 -1
- package/dist/js/bootstrap.min.js +3 -3
- package/dist/js/bootstrap.min.js.map +1 -1
- package/dist/js/coreui.bundle.js +874 -60
- package/dist/js/coreui.bundle.js.map +1 -1
- package/dist/js/coreui.bundle.min.js +3 -3
- package/dist/js/coreui.bundle.min.js.map +1 -1
- package/dist/js/coreui.esm.js +873 -53
- package/dist/js/coreui.esm.js.map +1 -1
- package/dist/js/coreui.esm.min.js +3 -3
- package/dist/js/coreui.esm.min.js.map +1 -1
- package/dist/js/coreui.js +874 -52
- package/dist/js/coreui.js.map +1 -1
- package/dist/js/coreui.min.js +3 -3
- package/dist/js/coreui.min.js.map +1 -1
- package/js/dist/alert.js +2 -2
- package/js/dist/base-component.js +3 -3
- package/js/dist/base-component.js.map +1 -1
- package/js/dist/button.js +2 -2
- package/js/dist/carousel.js +2 -2
- package/js/dist/chip-input.js +528 -0
- package/js/dist/chip-input.js.map +1 -0
- package/js/dist/chip.js +322 -0
- package/js/dist/chip.js.map +1 -0
- package/js/dist/collapse.js +2 -2
- package/js/dist/dom/data.js +2 -2
- package/js/dist/dom/event-handler.js +2 -2
- package/js/dist/dom/manipulator.js +2 -2
- package/js/dist/dom/selector-engine.js +2 -2
- package/js/dist/dropdown.js +2 -2
- package/js/dist/modal.js +2 -2
- package/js/dist/navigation.js +2 -2
- package/js/dist/offcanvas.js +2 -2
- package/js/dist/popover.js +2 -2
- package/js/dist/scrollspy.js +2 -2
- package/js/dist/sidebar.js +2 -2
- package/js/dist/tab.js +2 -2
- package/js/dist/toast.js +2 -2
- package/js/dist/tooltip.js +2 -2
- package/js/dist/util/backdrop.js +2 -2
- package/js/dist/util/component-functions.js +2 -2
- package/js/dist/util/config.js +2 -2
- package/js/dist/util/focustrap.js +2 -2
- package/js/dist/util/index.js +2 -2
- package/js/dist/util/sanitizer.js +2 -2
- package/js/dist/util/scrollbar.js +2 -2
- package/js/dist/util/swipe.js +2 -2
- package/js/dist/util/template-factory.js +2 -2
- package/js/index.esm.js +2 -0
- package/js/index.umd.js +4 -0
- package/js/src/base-component.js +1 -1
- package/js/src/chip-input.js +595 -0
- package/js/src/chip.js +365 -0
- package/package.json +34 -33
- package/scss/_banner.scss +2 -2
- package/scss/_buttons.scss +9 -5
- package/scss/_card.scss +2 -1
- package/scss/_carousel.scss +4 -2
- package/scss/_chip.import.scss +1 -0
- package/scss/_chip.scss +261 -0
- package/scss/_dropdown.scss +5 -3
- package/scss/_forms.scss +1 -0
- package/scss/_header.scss +3 -2
- package/scss/_list-group.scss +1 -1
- package/scss/_maps.scss +16 -1
- package/scss/_modal.scss +2 -1
- package/scss/_nav.scss +3 -2
- package/scss/_navbar.scss +5 -3
- package/scss/_pagination.scss +3 -2
- package/scss/_root.scss +5 -0
- package/scss/coreui.scss +1 -0
- package/scss/forms/_chip-input.import.scss +1 -0
- package/scss/forms/_chip-input.scss +109 -0
- package/scss/forms/_form-control.scss +2 -1
- package/scss/functions/_color.scss +5 -1
- package/scss/functions/_contrast-ratio.scss +3 -2
- package/scss/functions/_maps.scss +9 -1
- package/scss/functions/_math.scss +4 -3
- package/scss/helpers/_color-bg.scss +8 -4
- package/scss/helpers/_colored-links.scss +18 -9
- package/scss/mixins/_breakpoints.scss +9 -4
- package/scss/mixins/_buttons.scss +4 -4
- package/scss/mixins/_chip.scss +14 -0
- package/scss/mixins/_focus-ring.scss +9 -0
- package/scss/mixins/_forms.scss +3 -3
- package/scss/mixins/_grid.scss +4 -2
- package/scss/mixins/_ltr-rtl.scss +24 -12
- package/scss/mixins/_table-variants.scss +6 -4
- package/scss/mixins/_utilities.scss +22 -12
- package/scss/vendor/_rfs.scss +27 -19
package/dist/js/coreui.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* CoreUI v5.
|
|
3
|
-
* Copyright
|
|
2
|
+
* CoreUI v5.6.0 (https://coreui.io)
|
|
3
|
+
* Copyright 2026 The CoreUI Team (https://github.com/orgs/coreui/people)
|
|
4
4
|
* Licensed under MIT (https://github.com/coreui/coreui/blob/main/LICENSE)
|
|
5
5
|
*/
|
|
6
6
|
(function (global, factory) {
|
|
@@ -684,7 +684,7 @@
|
|
|
684
684
|
* Constants
|
|
685
685
|
*/
|
|
686
686
|
|
|
687
|
-
const VERSION = '5.
|
|
687
|
+
const VERSION = '5.6.0';
|
|
688
688
|
|
|
689
689
|
/**
|
|
690
690
|
* Class definition
|
|
@@ -878,11 +878,11 @@
|
|
|
878
878
|
* Constants
|
|
879
879
|
*/
|
|
880
880
|
|
|
881
|
-
const NAME$
|
|
882
|
-
const DATA_KEY$
|
|
883
|
-
const EVENT_KEY$
|
|
884
|
-
const EVENT_CLOSE = `close${EVENT_KEY$
|
|
885
|
-
const EVENT_CLOSED = `closed${EVENT_KEY$
|
|
881
|
+
const NAME$j = 'alert';
|
|
882
|
+
const DATA_KEY$e = 'coreui.alert';
|
|
883
|
+
const EVENT_KEY$f = `.${DATA_KEY$e}`;
|
|
884
|
+
const EVENT_CLOSE = `close${EVENT_KEY$f}`;
|
|
885
|
+
const EVENT_CLOSED = `closed${EVENT_KEY$f}`;
|
|
886
886
|
const CLASS_NAME_FADE$5 = 'fade';
|
|
887
887
|
const CLASS_NAME_SHOW$a = 'show';
|
|
888
888
|
|
|
@@ -893,7 +893,7 @@
|
|
|
893
893
|
class Alert extends BaseComponent {
|
|
894
894
|
// Getters
|
|
895
895
|
static get NAME() {
|
|
896
|
-
return NAME$
|
|
896
|
+
return NAME$j;
|
|
897
897
|
}
|
|
898
898
|
|
|
899
899
|
// Public
|
|
@@ -956,13 +956,13 @@
|
|
|
956
956
|
* Constants
|
|
957
957
|
*/
|
|
958
958
|
|
|
959
|
-
const NAME$
|
|
960
|
-
const DATA_KEY$
|
|
961
|
-
const EVENT_KEY$
|
|
962
|
-
const DATA_API_KEY$
|
|
963
|
-
const CLASS_NAME_ACTIVE$
|
|
959
|
+
const NAME$i = 'button';
|
|
960
|
+
const DATA_KEY$d = 'coreui.button';
|
|
961
|
+
const EVENT_KEY$e = `.${DATA_KEY$d}`;
|
|
962
|
+
const DATA_API_KEY$a = '.data-api';
|
|
963
|
+
const CLASS_NAME_ACTIVE$5 = 'active';
|
|
964
964
|
const SELECTOR_DATA_TOGGLE$6 = '[data-coreui-toggle="button"]';
|
|
965
|
-
const EVENT_CLICK_DATA_API$8 = `click${EVENT_KEY$
|
|
965
|
+
const EVENT_CLICK_DATA_API$8 = `click${EVENT_KEY$e}${DATA_API_KEY$a}`;
|
|
966
966
|
|
|
967
967
|
/**
|
|
968
968
|
* Class definition
|
|
@@ -971,13 +971,13 @@
|
|
|
971
971
|
class Button extends BaseComponent {
|
|
972
972
|
// Getters
|
|
973
973
|
static get NAME() {
|
|
974
|
-
return NAME$
|
|
974
|
+
return NAME$i;
|
|
975
975
|
}
|
|
976
976
|
|
|
977
977
|
// Public
|
|
978
978
|
toggle() {
|
|
979
979
|
// Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method
|
|
980
|
-
this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$
|
|
980
|
+
this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$5));
|
|
981
981
|
}
|
|
982
982
|
|
|
983
983
|
// Static
|
|
@@ -1023,23 +1023,23 @@
|
|
|
1023
1023
|
* Constants
|
|
1024
1024
|
*/
|
|
1025
1025
|
|
|
1026
|
-
const NAME$
|
|
1027
|
-
const EVENT_KEY$
|
|
1028
|
-
const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$
|
|
1029
|
-
const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$
|
|
1030
|
-
const EVENT_TOUCHEND = `touchend${EVENT_KEY$
|
|
1031
|
-
const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$
|
|
1032
|
-
const EVENT_POINTERUP = `pointerup${EVENT_KEY$
|
|
1026
|
+
const NAME$h = 'swipe';
|
|
1027
|
+
const EVENT_KEY$d = '.coreui.swipe';
|
|
1028
|
+
const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$d}`;
|
|
1029
|
+
const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$d}`;
|
|
1030
|
+
const EVENT_TOUCHEND = `touchend${EVENT_KEY$d}`;
|
|
1031
|
+
const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$d}`;
|
|
1032
|
+
const EVENT_POINTERUP = `pointerup${EVENT_KEY$d}`;
|
|
1033
1033
|
const POINTER_TYPE_TOUCH = 'touch';
|
|
1034
1034
|
const POINTER_TYPE_PEN = 'pen';
|
|
1035
1035
|
const CLASS_NAME_POINTER_EVENT = 'pointer-event';
|
|
1036
1036
|
const SWIPE_THRESHOLD = 40;
|
|
1037
|
-
const Default$
|
|
1037
|
+
const Default$g = {
|
|
1038
1038
|
endCallback: null,
|
|
1039
1039
|
leftCallback: null,
|
|
1040
1040
|
rightCallback: null
|
|
1041
1041
|
};
|
|
1042
|
-
const DefaultType$
|
|
1042
|
+
const DefaultType$g = {
|
|
1043
1043
|
endCallback: '(function|null)',
|
|
1044
1044
|
leftCallback: '(function|null)',
|
|
1045
1045
|
rightCallback: '(function|null)'
|
|
@@ -1064,18 +1064,18 @@
|
|
|
1064
1064
|
|
|
1065
1065
|
// Getters
|
|
1066
1066
|
static get Default() {
|
|
1067
|
-
return Default$
|
|
1067
|
+
return Default$g;
|
|
1068
1068
|
}
|
|
1069
1069
|
static get DefaultType() {
|
|
1070
|
-
return DefaultType$
|
|
1070
|
+
return DefaultType$g;
|
|
1071
1071
|
}
|
|
1072
1072
|
static get NAME() {
|
|
1073
|
-
return NAME$
|
|
1073
|
+
return NAME$h;
|
|
1074
1074
|
}
|
|
1075
1075
|
|
|
1076
1076
|
// Public
|
|
1077
1077
|
dispose() {
|
|
1078
|
-
EventHandler.off(this._element, EVENT_KEY$
|
|
1078
|
+
EventHandler.off(this._element, EVENT_KEY$d);
|
|
1079
1079
|
}
|
|
1080
1080
|
|
|
1081
1081
|
// Private
|
|
@@ -1146,10 +1146,10 @@
|
|
|
1146
1146
|
* Constants
|
|
1147
1147
|
*/
|
|
1148
1148
|
|
|
1149
|
-
const NAME$
|
|
1150
|
-
const DATA_KEY$
|
|
1151
|
-
const EVENT_KEY$
|
|
1152
|
-
const DATA_API_KEY$
|
|
1149
|
+
const NAME$g = 'carousel';
|
|
1150
|
+
const DATA_KEY$c = 'coreui.carousel';
|
|
1151
|
+
const EVENT_KEY$c = `.${DATA_KEY$c}`;
|
|
1152
|
+
const DATA_API_KEY$9 = '.data-api';
|
|
1153
1153
|
const ARROW_LEFT_KEY$1 = 'ArrowLeft';
|
|
1154
1154
|
const ARROW_RIGHT_KEY$1 = 'ArrowRight';
|
|
1155
1155
|
const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
|
|
@@ -1158,16 +1158,16 @@
|
|
|
1158
1158
|
const ORDER_PREV = 'prev';
|
|
1159
1159
|
const DIRECTION_LEFT = 'left';
|
|
1160
1160
|
const DIRECTION_RIGHT = 'right';
|
|
1161
|
-
const EVENT_SLIDE = `slide${EVENT_KEY$
|
|
1162
|
-
const EVENT_SLID = `slid${EVENT_KEY$
|
|
1163
|
-
const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$
|
|
1164
|
-
const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$
|
|
1165
|
-
const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$
|
|
1166
|
-
const EVENT_DRAG_START = `dragstart${EVENT_KEY$
|
|
1167
|
-
const EVENT_LOAD_DATA_API$5 = `load${EVENT_KEY$
|
|
1168
|
-
const EVENT_CLICK_DATA_API$7 = `click${EVENT_KEY$
|
|
1161
|
+
const EVENT_SLIDE = `slide${EVENT_KEY$c}`;
|
|
1162
|
+
const EVENT_SLID = `slid${EVENT_KEY$c}`;
|
|
1163
|
+
const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$c}`;
|
|
1164
|
+
const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$c}`;
|
|
1165
|
+
const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$c}`;
|
|
1166
|
+
const EVENT_DRAG_START = `dragstart${EVENT_KEY$c}`;
|
|
1167
|
+
const EVENT_LOAD_DATA_API$5 = `load${EVENT_KEY$c}${DATA_API_KEY$9}`;
|
|
1168
|
+
const EVENT_CLICK_DATA_API$7 = `click${EVENT_KEY$c}${DATA_API_KEY$9}`;
|
|
1169
1169
|
const CLASS_NAME_CAROUSEL = 'carousel';
|
|
1170
|
-
const CLASS_NAME_ACTIVE$
|
|
1170
|
+
const CLASS_NAME_ACTIVE$4 = 'active';
|
|
1171
1171
|
const CLASS_NAME_SLIDE = 'slide';
|
|
1172
1172
|
const CLASS_NAME_END = 'carousel-item-end';
|
|
1173
1173
|
const CLASS_NAME_START = 'carousel-item-start';
|
|
@@ -1184,7 +1184,7 @@
|
|
|
1184
1184
|
[ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,
|
|
1185
1185
|
[ARROW_RIGHT_KEY$1]: DIRECTION_LEFT
|
|
1186
1186
|
};
|
|
1187
|
-
const Default$
|
|
1187
|
+
const Default$f = {
|
|
1188
1188
|
interval: 5000,
|
|
1189
1189
|
keyboard: true,
|
|
1190
1190
|
pause: 'hover',
|
|
@@ -1192,7 +1192,7 @@
|
|
|
1192
1192
|
touch: true,
|
|
1193
1193
|
wrap: true
|
|
1194
1194
|
};
|
|
1195
|
-
const DefaultType$
|
|
1195
|
+
const DefaultType$f = {
|
|
1196
1196
|
interval: '(number|boolean)',
|
|
1197
1197
|
// TODO:v6 remove boolean support
|
|
1198
1198
|
keyboard: 'boolean',
|
|
@@ -1223,13 +1223,13 @@
|
|
|
1223
1223
|
|
|
1224
1224
|
// Getters
|
|
1225
1225
|
static get Default() {
|
|
1226
|
-
return Default$
|
|
1226
|
+
return Default$f;
|
|
1227
1227
|
}
|
|
1228
1228
|
static get DefaultType() {
|
|
1229
|
-
return DefaultType$
|
|
1229
|
+
return DefaultType$f;
|
|
1230
1230
|
}
|
|
1231
1231
|
static get NAME() {
|
|
1232
|
-
return NAME$
|
|
1232
|
+
return NAME$g;
|
|
1233
1233
|
}
|
|
1234
1234
|
|
|
1235
1235
|
// Public
|
|
@@ -1356,11 +1356,11 @@
|
|
|
1356
1356
|
return;
|
|
1357
1357
|
}
|
|
1358
1358
|
const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);
|
|
1359
|
-
activeIndicator.classList.remove(CLASS_NAME_ACTIVE$
|
|
1359
|
+
activeIndicator.classList.remove(CLASS_NAME_ACTIVE$4);
|
|
1360
1360
|
activeIndicator.removeAttribute('aria-current');
|
|
1361
1361
|
const newActiveIndicator = SelectorEngine.findOne(`[data-coreui-slide-to="${index}"]`, this._indicatorsElement);
|
|
1362
1362
|
if (newActiveIndicator) {
|
|
1363
|
-
newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$
|
|
1363
|
+
newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$4);
|
|
1364
1364
|
newActiveIndicator.setAttribute('aria-current', 'true');
|
|
1365
1365
|
}
|
|
1366
1366
|
}
|
|
@@ -1413,8 +1413,8 @@
|
|
|
1413
1413
|
nextElement.classList.add(directionalClassName);
|
|
1414
1414
|
const completeCallBack = () => {
|
|
1415
1415
|
nextElement.classList.remove(directionalClassName, orderClassName);
|
|
1416
|
-
nextElement.classList.add(CLASS_NAME_ACTIVE$
|
|
1417
|
-
activeElement.classList.remove(CLASS_NAME_ACTIVE$
|
|
1416
|
+
nextElement.classList.add(CLASS_NAME_ACTIVE$4);
|
|
1417
|
+
activeElement.classList.remove(CLASS_NAME_ACTIVE$4, orderClassName, directionalClassName);
|
|
1418
1418
|
this._isSliding = false;
|
|
1419
1419
|
triggerEvent(EVENT_SLID);
|
|
1420
1420
|
};
|
|
@@ -1507,6 +1507,826 @@
|
|
|
1507
1507
|
|
|
1508
1508
|
defineJQueryPlugin(Carousel);
|
|
1509
1509
|
|
|
1510
|
+
/**
|
|
1511
|
+
* --------------------------------------------------------------------------
|
|
1512
|
+
* CoreUI chip.js
|
|
1513
|
+
* Licensed under MIT (https://github.com/coreui/coreui/blob/main/LICENSE)
|
|
1514
|
+
* --------------------------------------------------------------------------
|
|
1515
|
+
*/
|
|
1516
|
+
|
|
1517
|
+
|
|
1518
|
+
/**
|
|
1519
|
+
* Constants
|
|
1520
|
+
*/
|
|
1521
|
+
|
|
1522
|
+
const NAME$f = 'chip';
|
|
1523
|
+
const DATA_KEY$b = 'coreui.chip';
|
|
1524
|
+
const EVENT_KEY$b = `.${DATA_KEY$b}`;
|
|
1525
|
+
const DATA_API_KEY$8 = '.data-api';
|
|
1526
|
+
const EVENT_REMOVE$1 = `remove${EVENT_KEY$b}`;
|
|
1527
|
+
const EVENT_REMOVED = `removed${EVENT_KEY$b}`;
|
|
1528
|
+
const EVENT_SELECT$1 = `select${EVENT_KEY$b}`;
|
|
1529
|
+
const EVENT_SELECTED = `selected${EVENT_KEY$b}`;
|
|
1530
|
+
const EVENT_DESELECT = `deselect${EVENT_KEY$b}`;
|
|
1531
|
+
const EVENT_DESELECTED = `deselected${EVENT_KEY$b}`;
|
|
1532
|
+
const SELECTOR_CHIP_REMOVE$1 = '.chip-remove';
|
|
1533
|
+
const SELECTOR_DATA_CHIP = '[data-coreui-chip]';
|
|
1534
|
+
const SELECTOR_FOCUSABLE_ITEMS$1 = '.chip:not(.disabled)';
|
|
1535
|
+
const CLASS_NAME_CHIP_CLICKABLE = 'chip-clickable';
|
|
1536
|
+
const CLASS_NAME_CHIP_REMOVE = 'chip-remove';
|
|
1537
|
+
const CLASS_NAME_ACTIVE$3 = 'active';
|
|
1538
|
+
const CLASS_NAME_DISABLED$1 = 'disabled';
|
|
1539
|
+
const DEFAULT_REMOVE_ICON$1 = '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="4" y1="4" x2="12" y2="12"/><line x1="12" y1="4" x2="4" y2="12"/></svg>';
|
|
1540
|
+
const Default$e = {
|
|
1541
|
+
ariaRemoveLabel: 'Remove',
|
|
1542
|
+
disabled: false,
|
|
1543
|
+
removable: false,
|
|
1544
|
+
removeIcon: DEFAULT_REMOVE_ICON$1,
|
|
1545
|
+
selectable: false,
|
|
1546
|
+
selected: false
|
|
1547
|
+
};
|
|
1548
|
+
const DefaultType$e = {
|
|
1549
|
+
ariaRemoveLabel: 'string',
|
|
1550
|
+
disabled: 'boolean',
|
|
1551
|
+
removable: 'boolean',
|
|
1552
|
+
removeIcon: 'string',
|
|
1553
|
+
selectable: 'boolean',
|
|
1554
|
+
selected: 'boolean'
|
|
1555
|
+
};
|
|
1556
|
+
|
|
1557
|
+
/**
|
|
1558
|
+
* Class definition
|
|
1559
|
+
*/
|
|
1560
|
+
|
|
1561
|
+
class Chip extends BaseComponent {
|
|
1562
|
+
constructor(element, config) {
|
|
1563
|
+
super(element, config);
|
|
1564
|
+
this._disabled = this._config.disabled || this._element.classList.contains(CLASS_NAME_DISABLED$1);
|
|
1565
|
+
this._selected = this._config.selected || this._element.classList.contains(CLASS_NAME_ACTIVE$3);
|
|
1566
|
+
this._ensureRemoveButton();
|
|
1567
|
+
this._applyState();
|
|
1568
|
+
if (this._config.selectable || this._config.removable) {
|
|
1569
|
+
this._makeFocusable();
|
|
1570
|
+
}
|
|
1571
|
+
this._addEventListeners();
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
// Getters
|
|
1575
|
+
static get Default() {
|
|
1576
|
+
return Default$e;
|
|
1577
|
+
}
|
|
1578
|
+
static get DefaultType() {
|
|
1579
|
+
return DefaultType$e;
|
|
1580
|
+
}
|
|
1581
|
+
static get NAME() {
|
|
1582
|
+
return NAME$f;
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
// Public
|
|
1586
|
+
remove() {
|
|
1587
|
+
const removeEvent = EventHandler.trigger(this._element, EVENT_REMOVE$1);
|
|
1588
|
+
if (removeEvent.defaultPrevented) {
|
|
1589
|
+
return;
|
|
1590
|
+
}
|
|
1591
|
+
this._destroyElement();
|
|
1592
|
+
}
|
|
1593
|
+
toggle() {
|
|
1594
|
+
if (!this._config.selectable) {
|
|
1595
|
+
return;
|
|
1596
|
+
}
|
|
1597
|
+
if (this._selected) {
|
|
1598
|
+
this.deselect();
|
|
1599
|
+
return;
|
|
1600
|
+
}
|
|
1601
|
+
this.select();
|
|
1602
|
+
}
|
|
1603
|
+
select() {
|
|
1604
|
+
if (!this._config.selectable) {
|
|
1605
|
+
return;
|
|
1606
|
+
}
|
|
1607
|
+
if (this._selected) {
|
|
1608
|
+
return;
|
|
1609
|
+
}
|
|
1610
|
+
const selectEvent = EventHandler.trigger(this._element, EVENT_SELECT$1);
|
|
1611
|
+
if (selectEvent.defaultPrevented) {
|
|
1612
|
+
return;
|
|
1613
|
+
}
|
|
1614
|
+
this._selected = true;
|
|
1615
|
+
this._applyState();
|
|
1616
|
+
EventHandler.trigger(this._element, EVENT_SELECTED);
|
|
1617
|
+
}
|
|
1618
|
+
deselect() {
|
|
1619
|
+
if (!this._config.selectable) {
|
|
1620
|
+
return;
|
|
1621
|
+
}
|
|
1622
|
+
if (!this._selected) {
|
|
1623
|
+
return;
|
|
1624
|
+
}
|
|
1625
|
+
const deselectEvent = EventHandler.trigger(this._element, EVENT_DESELECT);
|
|
1626
|
+
if (deselectEvent.defaultPrevented) {
|
|
1627
|
+
return;
|
|
1628
|
+
}
|
|
1629
|
+
this._selected = false;
|
|
1630
|
+
this._applyState();
|
|
1631
|
+
EventHandler.trigger(this._element, EVENT_DESELECTED);
|
|
1632
|
+
}
|
|
1633
|
+
|
|
1634
|
+
// Private
|
|
1635
|
+
_addEventListeners() {
|
|
1636
|
+
EventHandler.on(this._element, 'keydown', event => this._handleKeydown(event));
|
|
1637
|
+
EventHandler.on(this._element, 'click', event => {
|
|
1638
|
+
if (this._disabled) {
|
|
1639
|
+
return;
|
|
1640
|
+
}
|
|
1641
|
+
if (event.target.closest(SELECTOR_CHIP_REMOVE$1)) {
|
|
1642
|
+
return;
|
|
1643
|
+
}
|
|
1644
|
+
this.toggle();
|
|
1645
|
+
});
|
|
1646
|
+
EventHandler.on(this._element, 'click', SELECTOR_CHIP_REMOVE$1, event => {
|
|
1647
|
+
event.stopPropagation();
|
|
1648
|
+
this.remove();
|
|
1649
|
+
});
|
|
1650
|
+
}
|
|
1651
|
+
_applyState() {
|
|
1652
|
+
if (!this._disabled && (this._config.clickable || this._config.selectable)) {
|
|
1653
|
+
this._element.classList.add(CLASS_NAME_CHIP_CLICKABLE);
|
|
1654
|
+
}
|
|
1655
|
+
if (this._disabled) {
|
|
1656
|
+
this._element.classList.add(CLASS_NAME_DISABLED$1);
|
|
1657
|
+
this._element.setAttribute('aria-disabled', 'true');
|
|
1658
|
+
} else {
|
|
1659
|
+
this._element.classList.remove(CLASS_NAME_DISABLED$1);
|
|
1660
|
+
if (this._element.getAttribute('aria-disabled') === 'true') {
|
|
1661
|
+
this._element.setAttribute('aria-disabled', 'false');
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
1664
|
+
if (this._config.selectable) {
|
|
1665
|
+
this._element.classList.toggle(CLASS_NAME_ACTIVE$3, this._selected);
|
|
1666
|
+
this._element.setAttribute('aria-selected', this._selected ? 'true' : 'false');
|
|
1667
|
+
} else {
|
|
1668
|
+
this._element.classList.remove(CLASS_NAME_ACTIVE$3);
|
|
1669
|
+
if (this._element.getAttribute('aria-selected') === 'true') {
|
|
1670
|
+
this._element.setAttribute('aria-selected', 'false');
|
|
1671
|
+
}
|
|
1672
|
+
}
|
|
1673
|
+
}
|
|
1674
|
+
_createRemoveButton() {
|
|
1675
|
+
const button = document.createElement('button');
|
|
1676
|
+
button.type = 'button';
|
|
1677
|
+
button.className = CLASS_NAME_CHIP_REMOVE;
|
|
1678
|
+
button.setAttribute('aria-label', this._config.ariaRemoveLabel);
|
|
1679
|
+
button.setAttribute('tabindex', '-1'); // Not in tab order, chips handle keyboard
|
|
1680
|
+
button.innerHTML = this._config.removeIcon;
|
|
1681
|
+
return button;
|
|
1682
|
+
}
|
|
1683
|
+
_ensureRemoveButton() {
|
|
1684
|
+
if (!this._config.removable) {
|
|
1685
|
+
return;
|
|
1686
|
+
}
|
|
1687
|
+
if (SelectorEngine.findOne(SELECTOR_CHIP_REMOVE$1, this._element)) {
|
|
1688
|
+
return;
|
|
1689
|
+
}
|
|
1690
|
+
this._element.append(this._createRemoveButton());
|
|
1691
|
+
}
|
|
1692
|
+
_makeFocusable() {
|
|
1693
|
+
if (this._element.hasAttribute('tabindex') || this._disabled) {
|
|
1694
|
+
return;
|
|
1695
|
+
}
|
|
1696
|
+
this._element.setAttribute('tabindex', '0');
|
|
1697
|
+
}
|
|
1698
|
+
_handleKeydown(event) {
|
|
1699
|
+
const {
|
|
1700
|
+
key
|
|
1701
|
+
} = event;
|
|
1702
|
+
if (this._disabled) {
|
|
1703
|
+
return;
|
|
1704
|
+
}
|
|
1705
|
+
switch (key) {
|
|
1706
|
+
case 'Enter':
|
|
1707
|
+
case ' ':
|
|
1708
|
+
case 'Spacebar':
|
|
1709
|
+
{
|
|
1710
|
+
if (!this._config.selectable) {
|
|
1711
|
+
return;
|
|
1712
|
+
}
|
|
1713
|
+
event.preventDefault();
|
|
1714
|
+
this.toggle();
|
|
1715
|
+
break;
|
|
1716
|
+
}
|
|
1717
|
+
case 'Backspace':
|
|
1718
|
+
case 'Delete':
|
|
1719
|
+
{
|
|
1720
|
+
if (this._config.removable) {
|
|
1721
|
+
event.preventDefault();
|
|
1722
|
+
const sibling = this._getFocusableSibling(false) || this._getFocusableSibling(true);
|
|
1723
|
+
sibling == null || sibling.focus();
|
|
1724
|
+
this.remove();
|
|
1725
|
+
}
|
|
1726
|
+
break;
|
|
1727
|
+
}
|
|
1728
|
+
case 'ArrowLeft':
|
|
1729
|
+
{
|
|
1730
|
+
event.preventDefault();
|
|
1731
|
+
const chip = this._getFocusableSibling(false);
|
|
1732
|
+
chip == null || chip.focus();
|
|
1733
|
+
break;
|
|
1734
|
+
}
|
|
1735
|
+
case 'ArrowRight':
|
|
1736
|
+
{
|
|
1737
|
+
event.preventDefault();
|
|
1738
|
+
const chip = this._getFocusableSibling(true);
|
|
1739
|
+
chip == null || chip.focus();
|
|
1740
|
+
break;
|
|
1741
|
+
}
|
|
1742
|
+
case 'Home':
|
|
1743
|
+
{
|
|
1744
|
+
event.preventDefault();
|
|
1745
|
+
this._navigateToEdge(0);
|
|
1746
|
+
break;
|
|
1747
|
+
}
|
|
1748
|
+
case 'End':
|
|
1749
|
+
{
|
|
1750
|
+
event.preventDefault();
|
|
1751
|
+
this._navigateToEdge(-1);
|
|
1752
|
+
break;
|
|
1753
|
+
}
|
|
1754
|
+
|
|
1755
|
+
// No default
|
|
1756
|
+
}
|
|
1757
|
+
}
|
|
1758
|
+
_getFocusableSibling(shouldGetNext) {
|
|
1759
|
+
const chips = SelectorEngine.find(SELECTOR_FOCUSABLE_ITEMS$1, this._element.parentElement);
|
|
1760
|
+
const sibling = getNextActiveElement(chips, this._element, shouldGetNext, !chips.includes(this._element));
|
|
1761
|
+
return sibling === this._element ? null : sibling;
|
|
1762
|
+
}
|
|
1763
|
+
_navigateToEdge(targetIndex) {
|
|
1764
|
+
const chips = SelectorEngine.find(SELECTOR_FOCUSABLE_ITEMS$1, this._element.parentElement);
|
|
1765
|
+
if (chips.length === 0) {
|
|
1766
|
+
return;
|
|
1767
|
+
}
|
|
1768
|
+
const targetChip = chips.at(targetIndex);
|
|
1769
|
+
targetChip == null || targetChip.focus();
|
|
1770
|
+
}
|
|
1771
|
+
_destroyElement() {
|
|
1772
|
+
EventHandler.trigger(this._element, EVENT_REMOVED);
|
|
1773
|
+
this._element.remove();
|
|
1774
|
+
this.dispose();
|
|
1775
|
+
}
|
|
1776
|
+
|
|
1777
|
+
// Static
|
|
1778
|
+
static chipInterface(element, config) {
|
|
1779
|
+
const data = Chip.getOrCreateInstance(element, config);
|
|
1780
|
+
if (typeof config === 'string') {
|
|
1781
|
+
if (typeof data[config] === 'undefined') {
|
|
1782
|
+
throw new TypeError(`No method named "${config}"`);
|
|
1783
|
+
}
|
|
1784
|
+
data[config]();
|
|
1785
|
+
}
|
|
1786
|
+
}
|
|
1787
|
+
static jQueryInterface(config) {
|
|
1788
|
+
return this.each(function () {
|
|
1789
|
+
const data = Chip.getOrCreateInstance(this);
|
|
1790
|
+
if (typeof config !== 'string') {
|
|
1791
|
+
return;
|
|
1792
|
+
}
|
|
1793
|
+
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
|
|
1794
|
+
throw new TypeError(`No method named "${config}"`);
|
|
1795
|
+
}
|
|
1796
|
+
data[config](this);
|
|
1797
|
+
});
|
|
1798
|
+
}
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1801
|
+
/**
|
|
1802
|
+
* Data API implementation
|
|
1803
|
+
*/
|
|
1804
|
+
|
|
1805
|
+
EventHandler.on(document, `DOMContentLoaded${EVENT_KEY$b}${DATA_API_KEY$8}`, () => {
|
|
1806
|
+
for (const element of SelectorEngine.find(SELECTOR_DATA_CHIP)) {
|
|
1807
|
+
Chip.chipInterface(element);
|
|
1808
|
+
}
|
|
1809
|
+
});
|
|
1810
|
+
|
|
1811
|
+
/**
|
|
1812
|
+
* jQuery
|
|
1813
|
+
*/
|
|
1814
|
+
|
|
1815
|
+
defineJQueryPlugin(Chip);
|
|
1816
|
+
|
|
1817
|
+
/**
|
|
1818
|
+
* --------------------------------------------------------------------------
|
|
1819
|
+
* CoreUI chip-input.js
|
|
1820
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
1821
|
+
*
|
|
1822
|
+
* This component is a highly modified version of the Bootstrap's chip-input.js
|
|
1823
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
1824
|
+
* --------------------------------------------------------------------------
|
|
1825
|
+
*/
|
|
1826
|
+
|
|
1827
|
+
|
|
1828
|
+
/**
|
|
1829
|
+
* Constants
|
|
1830
|
+
*/
|
|
1831
|
+
|
|
1832
|
+
const NAME$e = 'chip-input';
|
|
1833
|
+
const DATA_KEY$a = 'coreui.chip-input';
|
|
1834
|
+
const EVENT_KEY$a = `.${DATA_KEY$a}`;
|
|
1835
|
+
const DATA_API_KEY$7 = '.data-api';
|
|
1836
|
+
const EVENT_ADD = `add${EVENT_KEY$a}`;
|
|
1837
|
+
const EVENT_REMOVE = `remove${EVENT_KEY$a}`;
|
|
1838
|
+
const EVENT_CHANGE = `change${EVENT_KEY$a}`;
|
|
1839
|
+
const EVENT_SELECT = `select${EVENT_KEY$a}`;
|
|
1840
|
+
const EVENT_INPUT = `input${EVENT_KEY$a}`;
|
|
1841
|
+
const SELECTOR_DATA_CHIP_INPUT = '[data-coreui-chip-input]';
|
|
1842
|
+
const SELECTOR_CHIP = '.chip';
|
|
1843
|
+
const SELECTOR_CHIP_ACTIVE = `${SELECTOR_CHIP}.active`;
|
|
1844
|
+
const SELECTOR_CHIP_INPUT_LABEL = '.chip-input-label';
|
|
1845
|
+
const SELECTOR_CHIP_REMOVE = '.chip-remove';
|
|
1846
|
+
const SELECTOR_FOCUSABLE_ITEMS = '.chip:not(.disabled)';
|
|
1847
|
+
const CLASS_NAME_CHIP = 'chip';
|
|
1848
|
+
const CLASS_NAME_DISABLED = 'disabled';
|
|
1849
|
+
const CLASS_NAME_CHIP_INPUT_FIELD = 'chip-input-field';
|
|
1850
|
+
const DEFAULT_REMOVE_ICON = '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="4" y1="4" x2="12" y2="12"/><line x1="12" y1="4" x2="4" y2="12"/></svg>';
|
|
1851
|
+
const Default$d = {
|
|
1852
|
+
chipClassName: null,
|
|
1853
|
+
createOnBlur: true,
|
|
1854
|
+
disabled: false,
|
|
1855
|
+
id: null,
|
|
1856
|
+
maxChips: null,
|
|
1857
|
+
name: null,
|
|
1858
|
+
placeholder: '',
|
|
1859
|
+
readonly: false,
|
|
1860
|
+
removable: true,
|
|
1861
|
+
removeIcon: DEFAULT_REMOVE_ICON,
|
|
1862
|
+
selectable: false,
|
|
1863
|
+
separator: ','
|
|
1864
|
+
};
|
|
1865
|
+
const DefaultType$d = {
|
|
1866
|
+
chipClassName: '(string|function|null)',
|
|
1867
|
+
createOnBlur: 'boolean',
|
|
1868
|
+
disabled: 'boolean',
|
|
1869
|
+
maxChips: '(number|null)',
|
|
1870
|
+
id: '(string|null)',
|
|
1871
|
+
name: '(string|null)',
|
|
1872
|
+
placeholder: 'string',
|
|
1873
|
+
readonly: 'boolean',
|
|
1874
|
+
removable: 'boolean',
|
|
1875
|
+
removeIcon: 'string',
|
|
1876
|
+
selectable: 'boolean',
|
|
1877
|
+
separator: '(string|null)'
|
|
1878
|
+
};
|
|
1879
|
+
|
|
1880
|
+
/**
|
|
1881
|
+
* Class definition
|
|
1882
|
+
*/
|
|
1883
|
+
|
|
1884
|
+
class ChipInput extends BaseComponent {
|
|
1885
|
+
constructor(element, config) {
|
|
1886
|
+
var _this$_config$id;
|
|
1887
|
+
super(element, config);
|
|
1888
|
+
this._uniqueId = (_this$_config$id = this._config.id) != null ? _this$_config$id : getUID(`${this.constructor.NAME}`);
|
|
1889
|
+
this._disabled = this._config.disabled || this._element.classList.contains(CLASS_NAME_DISABLED);
|
|
1890
|
+
this._readonly = this._config.readonly;
|
|
1891
|
+
this._chips = [];
|
|
1892
|
+
this._input = SelectorEngine.findOne('input', this._element);
|
|
1893
|
+
this._hiddenInput = null;
|
|
1894
|
+
if (this._input) {
|
|
1895
|
+
this._setInputSize();
|
|
1896
|
+
} else {
|
|
1897
|
+
this._createInput();
|
|
1898
|
+
}
|
|
1899
|
+
this._applyInteractionState();
|
|
1900
|
+
this._initializeExistingChips();
|
|
1901
|
+
this._createHiddenInput();
|
|
1902
|
+
this._addEventListeners();
|
|
1903
|
+
}
|
|
1904
|
+
|
|
1905
|
+
// Getters
|
|
1906
|
+
static get Default() {
|
|
1907
|
+
return Default$d;
|
|
1908
|
+
}
|
|
1909
|
+
static get DefaultType() {
|
|
1910
|
+
return DefaultType$d;
|
|
1911
|
+
}
|
|
1912
|
+
static get NAME() {
|
|
1913
|
+
return NAME$e;
|
|
1914
|
+
}
|
|
1915
|
+
|
|
1916
|
+
// Public
|
|
1917
|
+
add(value) {
|
|
1918
|
+
if (this._disabled || this._readonly) {
|
|
1919
|
+
return null;
|
|
1920
|
+
}
|
|
1921
|
+
const trimmedValue = String(value).trim();
|
|
1922
|
+
if (!trimmedValue) {
|
|
1923
|
+
return null;
|
|
1924
|
+
}
|
|
1925
|
+
|
|
1926
|
+
// Chips are unique by value
|
|
1927
|
+
if (this._chips.includes(trimmedValue)) {
|
|
1928
|
+
return null;
|
|
1929
|
+
}
|
|
1930
|
+
|
|
1931
|
+
// Check max chips limit
|
|
1932
|
+
if (this._config.maxChips !== null && this._chips.length >= this._config.maxChips) {
|
|
1933
|
+
return null;
|
|
1934
|
+
}
|
|
1935
|
+
const addEvent = EventHandler.trigger(this._element, EVENT_ADD, {
|
|
1936
|
+
value: trimmedValue,
|
|
1937
|
+
relatedTarget: this._input
|
|
1938
|
+
});
|
|
1939
|
+
if (addEvent.defaultPrevented) {
|
|
1940
|
+
return null;
|
|
1941
|
+
}
|
|
1942
|
+
const chip = this._createChip(trimmedValue);
|
|
1943
|
+
this._element.insertBefore(chip, this._input);
|
|
1944
|
+
this._chips.push(trimmedValue);
|
|
1945
|
+
const values = this.getValues();
|
|
1946
|
+
this._hiddenInput.value = values.join(',');
|
|
1947
|
+
EventHandler.trigger(this._element, EVENT_CHANGE, {
|
|
1948
|
+
values
|
|
1949
|
+
});
|
|
1950
|
+
return chip;
|
|
1951
|
+
}
|
|
1952
|
+
remove(chipOrValue) {
|
|
1953
|
+
if (this._disabled || this._readonly) {
|
|
1954
|
+
return false;
|
|
1955
|
+
}
|
|
1956
|
+
let chip;
|
|
1957
|
+
let value;
|
|
1958
|
+
if (typeof chipOrValue === 'string') {
|
|
1959
|
+
value = chipOrValue;
|
|
1960
|
+
chip = this._findChipByValue(value);
|
|
1961
|
+
} else {
|
|
1962
|
+
chip = chipOrValue;
|
|
1963
|
+
value = this._getChipValue(chip);
|
|
1964
|
+
}
|
|
1965
|
+
if (!chip || !value) {
|
|
1966
|
+
return false;
|
|
1967
|
+
}
|
|
1968
|
+
const removeEvent = EventHandler.trigger(this._element, EVENT_REMOVE, {
|
|
1969
|
+
value,
|
|
1970
|
+
chip,
|
|
1971
|
+
relatedTarget: this._input
|
|
1972
|
+
});
|
|
1973
|
+
if (removeEvent.defaultPrevented) {
|
|
1974
|
+
return false;
|
|
1975
|
+
}
|
|
1976
|
+
const chipInstance = Chip.getInstance(chip);
|
|
1977
|
+
if (chipInstance) {
|
|
1978
|
+
chipInstance.remove();
|
|
1979
|
+
} else {
|
|
1980
|
+
chip.remove();
|
|
1981
|
+
this._handleChipRemoved(chip, value);
|
|
1982
|
+
}
|
|
1983
|
+
return !chip.isConnected;
|
|
1984
|
+
}
|
|
1985
|
+
removeSelected() {
|
|
1986
|
+
var _this$_input;
|
|
1987
|
+
const chipsToRemove = this._getSelectedChipElements();
|
|
1988
|
+
for (const chip of chipsToRemove) {
|
|
1989
|
+
this.remove(chip);
|
|
1990
|
+
}
|
|
1991
|
+
(_this$_input = this._input) == null || _this$_input.focus();
|
|
1992
|
+
}
|
|
1993
|
+
getValues() {
|
|
1994
|
+
return [...this._chips];
|
|
1995
|
+
}
|
|
1996
|
+
getSelectedValues() {
|
|
1997
|
+
return this._getSelectedChipElements().map(chip => this._getChipValue(chip));
|
|
1998
|
+
}
|
|
1999
|
+
clear() {
|
|
2000
|
+
const chips = SelectorEngine.find(SELECTOR_CHIP, this._element);
|
|
2001
|
+
for (const chip of chips) {
|
|
2002
|
+
this.remove(chip);
|
|
2003
|
+
}
|
|
2004
|
+
}
|
|
2005
|
+
clearSelection() {
|
|
2006
|
+
for (const chip of this._getSelectedChipElements()) {
|
|
2007
|
+
var _Chip$getInstance;
|
|
2008
|
+
(_Chip$getInstance = Chip.getInstance(chip)) == null || _Chip$getInstance.deselect();
|
|
2009
|
+
}
|
|
2010
|
+
EventHandler.trigger(this._element, EVENT_SELECT, {
|
|
2011
|
+
selected: []
|
|
2012
|
+
});
|
|
2013
|
+
}
|
|
2014
|
+
selectChip(chip) {
|
|
2015
|
+
const chipElements = this._getChipElements();
|
|
2016
|
+
if (!chipElements.includes(chip)) {
|
|
2017
|
+
return;
|
|
2018
|
+
}
|
|
2019
|
+
const chipInstance = Chip.getInstance(chip);
|
|
2020
|
+
if (!chipInstance) {
|
|
2021
|
+
return;
|
|
2022
|
+
}
|
|
2023
|
+
chipInstance.select();
|
|
2024
|
+
}
|
|
2025
|
+
focus() {
|
|
2026
|
+
var _this$_input2;
|
|
2027
|
+
(_this$_input2 = this._input) == null || _this$_input2.focus();
|
|
2028
|
+
}
|
|
2029
|
+
|
|
2030
|
+
// Private
|
|
2031
|
+
_emitSelectionChange() {
|
|
2032
|
+
EventHandler.trigger(this._element, EVENT_SELECT, {
|
|
2033
|
+
selected: this.getSelectedValues()
|
|
2034
|
+
});
|
|
2035
|
+
}
|
|
2036
|
+
_getChipElements() {
|
|
2037
|
+
return SelectorEngine.find(SELECTOR_CHIP, this._element);
|
|
2038
|
+
}
|
|
2039
|
+
_getSelectedChipElements() {
|
|
2040
|
+
return SelectorEngine.find(SELECTOR_CHIP_ACTIVE, this._element);
|
|
2041
|
+
}
|
|
2042
|
+
_createInput() {
|
|
2043
|
+
const input = document.createElement('input');
|
|
2044
|
+
const label = SelectorEngine.findOne(SELECTOR_CHIP_INPUT_LABEL, this._element);
|
|
2045
|
+
const labelFor = label == null ? void 0 : label.getAttribute('for');
|
|
2046
|
+
const generatedInputId = labelFor || getUID(`${this.constructor.NAME}-input`);
|
|
2047
|
+
input.type = 'text';
|
|
2048
|
+
input.className = CLASS_NAME_CHIP_INPUT_FIELD;
|
|
2049
|
+
input.id = generatedInputId;
|
|
2050
|
+
if (this._config.placeholder) {
|
|
2051
|
+
input.placeholder = this._config.placeholder;
|
|
2052
|
+
}
|
|
2053
|
+
if (label && !labelFor) {
|
|
2054
|
+
label.setAttribute('for', generatedInputId);
|
|
2055
|
+
}
|
|
2056
|
+
this._input = input;
|
|
2057
|
+
this._setInputSize();
|
|
2058
|
+
this._element.append(input);
|
|
2059
|
+
}
|
|
2060
|
+
_createHiddenInput() {
|
|
2061
|
+
const hiddenInput = document.createElement('input');
|
|
2062
|
+
hiddenInput.type = 'hidden';
|
|
2063
|
+
hiddenInput.id = this._uniqueId;
|
|
2064
|
+
hiddenInput.name = this._config.name || this._uniqueId;
|
|
2065
|
+
this._element.append(hiddenInput);
|
|
2066
|
+
this._hiddenInput = hiddenInput;
|
|
2067
|
+
this._hiddenInput.value = this.getValues().join(',');
|
|
2068
|
+
}
|
|
2069
|
+
_createChip(value) {
|
|
2070
|
+
const chip = document.createElement('span');
|
|
2071
|
+
chip.className = CLASS_NAME_CHIP;
|
|
2072
|
+
chip.dataset.coreuiChipValue = value;
|
|
2073
|
+
chip.append(document.createTextNode(value));
|
|
2074
|
+
this._applyChipClassName(chip, value);
|
|
2075
|
+
this._setupChip(chip);
|
|
2076
|
+
return chip;
|
|
2077
|
+
}
|
|
2078
|
+
_createChipFromInput() {
|
|
2079
|
+
if (this._disabled || this._readonly) {
|
|
2080
|
+
return;
|
|
2081
|
+
}
|
|
2082
|
+
const value = this._input.value.trim();
|
|
2083
|
+
if (value) {
|
|
2084
|
+
this.add(value);
|
|
2085
|
+
this._input.value = '';
|
|
2086
|
+
this._setInputSize();
|
|
2087
|
+
}
|
|
2088
|
+
}
|
|
2089
|
+
_findChipByValue(value) {
|
|
2090
|
+
const chips = this._getChipElements();
|
|
2091
|
+
return chips.find(chip => this._getChipValue(chip) === value);
|
|
2092
|
+
}
|
|
2093
|
+
_getChipValue(chip) {
|
|
2094
|
+
var _clone$textContent;
|
|
2095
|
+
if (chip.dataset.coreuiChipValue) {
|
|
2096
|
+
return chip.dataset.coreuiChipValue;
|
|
2097
|
+
}
|
|
2098
|
+
const clone = chip.cloneNode(true);
|
|
2099
|
+
const remove = SelectorEngine.findOne(SELECTOR_CHIP_REMOVE, clone);
|
|
2100
|
+
if (remove) {
|
|
2101
|
+
remove.remove();
|
|
2102
|
+
}
|
|
2103
|
+
return ((_clone$textContent = clone.textContent) == null ? void 0 : _clone$textContent.trim()) || '';
|
|
2104
|
+
}
|
|
2105
|
+
_initializeExistingChips() {
|
|
2106
|
+
const existingChips = SelectorEngine.find(SELECTOR_CHIP, this._element);
|
|
2107
|
+
for (const chip of existingChips) {
|
|
2108
|
+
const value = this._getChipValue(chip);
|
|
2109
|
+
if (value) {
|
|
2110
|
+
this._chips.push(value);
|
|
2111
|
+
this._applyChipClassName(chip, value);
|
|
2112
|
+
this._setupChip(chip);
|
|
2113
|
+
}
|
|
2114
|
+
}
|
|
2115
|
+
}
|
|
2116
|
+
_applyChipClassName(chip, value) {
|
|
2117
|
+
const className = this._resolveChipClassName(value);
|
|
2118
|
+
if (!className) {
|
|
2119
|
+
return;
|
|
2120
|
+
}
|
|
2121
|
+
chip.classList.add(...className.split(/\s+/).filter(Boolean));
|
|
2122
|
+
}
|
|
2123
|
+
_resolveChipClassName(value) {
|
|
2124
|
+
const {
|
|
2125
|
+
chipClassName
|
|
2126
|
+
} = this._config;
|
|
2127
|
+
if (!chipClassName) {
|
|
2128
|
+
return '';
|
|
2129
|
+
}
|
|
2130
|
+
if (typeof chipClassName === 'function') {
|
|
2131
|
+
const resolvedClassName = chipClassName(value);
|
|
2132
|
+
return typeof resolvedClassName === 'string' ? resolvedClassName : '';
|
|
2133
|
+
}
|
|
2134
|
+
return typeof chipClassName === 'string' ? chipClassName : '';
|
|
2135
|
+
}
|
|
2136
|
+
_setupChip(chip) {
|
|
2137
|
+
Chip.getOrCreateInstance(chip, {
|
|
2138
|
+
ariaRemoveLabel: `Remove ${this._getChipValue(chip)}`,
|
|
2139
|
+
disabled: this._disabled,
|
|
2140
|
+
removable: this._config.removable && !this._readonly && !this._disabled,
|
|
2141
|
+
removeIcon: this._config.removeIcon,
|
|
2142
|
+
selectable: this._config.selectable
|
|
2143
|
+
});
|
|
2144
|
+
const removeButton = SelectorEngine.findOne(SELECTOR_CHIP_REMOVE, chip);
|
|
2145
|
+
if (removeButton) {
|
|
2146
|
+
removeButton.disabled = this._disabled || this._readonly;
|
|
2147
|
+
}
|
|
2148
|
+
}
|
|
2149
|
+
_applyInteractionState() {
|
|
2150
|
+
this._element.classList.toggle(CLASS_NAME_DISABLED, this._disabled);
|
|
2151
|
+
this._input.disabled = this._disabled;
|
|
2152
|
+
this._input.readOnly = !this._disabled && this._readonly;
|
|
2153
|
+
this._element.setAttribute('aria-disabled', this._disabled ? 'true' : 'false');
|
|
2154
|
+
this._element.setAttribute('aria-readonly', this._readonly ? 'true' : 'false');
|
|
2155
|
+
}
|
|
2156
|
+
_addEventListeners() {
|
|
2157
|
+
EventHandler.on(this._element, 'keydown', event => {
|
|
2158
|
+
if (event.target === this._input) {
|
|
2159
|
+
return;
|
|
2160
|
+
}
|
|
2161
|
+
if (event.key.length === 1) {
|
|
2162
|
+
// eslint-disable-next-line no-console
|
|
2163
|
+
console.log(event.key.length);
|
|
2164
|
+
this._input.focus();
|
|
2165
|
+
}
|
|
2166
|
+
});
|
|
2167
|
+
EventHandler.on(this._input, 'keydown', event => this._handleInputKeydown(event));
|
|
2168
|
+
EventHandler.on(this._input, 'input', event => this._handleInput(event));
|
|
2169
|
+
EventHandler.on(this._input, 'paste', event => this._handlePaste(event));
|
|
2170
|
+
EventHandler.on(this._input, 'focus', () => this.clearSelection());
|
|
2171
|
+
if (this._config.createOnBlur) {
|
|
2172
|
+
EventHandler.on(this._input, 'blur', event => {
|
|
2173
|
+
var _event$relatedTarget;
|
|
2174
|
+
// Don't create chip if clicking on a chip
|
|
2175
|
+
if (!((_event$relatedTarget = event.relatedTarget) != null && _event$relatedTarget.closest(SELECTOR_CHIP))) {
|
|
2176
|
+
this._createChipFromInput();
|
|
2177
|
+
}
|
|
2178
|
+
});
|
|
2179
|
+
}
|
|
2180
|
+
EventHandler.on(this._element, 'selected.coreui.chip', SELECTOR_CHIP, () => {
|
|
2181
|
+
this._emitSelectionChange();
|
|
2182
|
+
});
|
|
2183
|
+
EventHandler.on(this._element, 'deselected.coreui.chip', SELECTOR_CHIP, () => {
|
|
2184
|
+
this._emitSelectionChange();
|
|
2185
|
+
});
|
|
2186
|
+
EventHandler.on(this._element, 'remove.coreui.chip', SELECTOR_CHIP, event => {
|
|
2187
|
+
if (this._disabled || this._readonly) {
|
|
2188
|
+
event.preventDefault();
|
|
2189
|
+
}
|
|
2190
|
+
});
|
|
2191
|
+
EventHandler.on(this._element, 'removed.coreui.chip', SELECTOR_CHIP, event => {
|
|
2192
|
+
const chip = event.target.closest(SELECTOR_CHIP);
|
|
2193
|
+
if (chip) {
|
|
2194
|
+
this._handleChipRemoved(chip);
|
|
2195
|
+
const focusableChips = SelectorEngine.find(SELECTOR_FOCUSABLE_ITEMS, this._element);
|
|
2196
|
+
if (focusableChips.length > 0) {
|
|
2197
|
+
var _this$_input3;
|
|
2198
|
+
(_this$_input3 = this._input) == null || _this$_input3.focus();
|
|
2199
|
+
}
|
|
2200
|
+
this._emitSelectionChange();
|
|
2201
|
+
}
|
|
2202
|
+
});
|
|
2203
|
+
|
|
2204
|
+
// Focus input when clicking container background
|
|
2205
|
+
EventHandler.on(this._element, 'click', event => {
|
|
2206
|
+
if (event.target === this._element) {
|
|
2207
|
+
var _this$_input4;
|
|
2208
|
+
(_this$_input4 = this._input) == null || _this$_input4.focus();
|
|
2209
|
+
}
|
|
2210
|
+
});
|
|
2211
|
+
}
|
|
2212
|
+
_handleInputKeydown(event) {
|
|
2213
|
+
const {
|
|
2214
|
+
key
|
|
2215
|
+
} = event;
|
|
2216
|
+
switch (key) {
|
|
2217
|
+
case 'Enter':
|
|
2218
|
+
{
|
|
2219
|
+
event.preventDefault();
|
|
2220
|
+
this._createChipFromInput();
|
|
2221
|
+
break;
|
|
2222
|
+
}
|
|
2223
|
+
case 'Backspace':
|
|
2224
|
+
case 'Delete':
|
|
2225
|
+
{
|
|
2226
|
+
if (this._input.value === '') {
|
|
2227
|
+
event.preventDefault();
|
|
2228
|
+
const chips = this._getChipElements();
|
|
2229
|
+
if (chips.length > 0) {
|
|
2230
|
+
const lastChip = chips.at(-1);
|
|
2231
|
+
lastChip.focus();
|
|
2232
|
+
}
|
|
2233
|
+
}
|
|
2234
|
+
break;
|
|
2235
|
+
}
|
|
2236
|
+
case 'ArrowLeft':
|
|
2237
|
+
{
|
|
2238
|
+
if (this._input.selectionStart === 0 && this._input.selectionEnd === 0) {
|
|
2239
|
+
event.preventDefault();
|
|
2240
|
+
const chips = this._getChipElements();
|
|
2241
|
+
if (chips.length > 0) {
|
|
2242
|
+
const lastChip = chips.at(-1);
|
|
2243
|
+
lastChip.focus();
|
|
2244
|
+
}
|
|
2245
|
+
}
|
|
2246
|
+
break;
|
|
2247
|
+
}
|
|
2248
|
+
case 'Escape':
|
|
2249
|
+
{
|
|
2250
|
+
this._input.value = '';
|
|
2251
|
+
this._input.blur();
|
|
2252
|
+
break;
|
|
2253
|
+
}
|
|
2254
|
+
|
|
2255
|
+
// No default
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
_handleChipRemoved(chip, value = null) {
|
|
2259
|
+
const chipValue = value || this._getChipValue(chip);
|
|
2260
|
+
const valueIndex = this._chips.indexOf(chipValue);
|
|
2261
|
+
if (valueIndex !== -1) {
|
|
2262
|
+
this._chips.splice(valueIndex, 1);
|
|
2263
|
+
}
|
|
2264
|
+
const values = this.getValues();
|
|
2265
|
+
this._hiddenInput.value = values.join(',');
|
|
2266
|
+
EventHandler.trigger(this._element, EVENT_CHANGE, {
|
|
2267
|
+
values
|
|
2268
|
+
});
|
|
2269
|
+
}
|
|
2270
|
+
_handleInput(event) {
|
|
2271
|
+
if (this._disabled || this._readonly) {
|
|
2272
|
+
return;
|
|
2273
|
+
}
|
|
2274
|
+
const {
|
|
2275
|
+
value
|
|
2276
|
+
} = event.target;
|
|
2277
|
+
const {
|
|
2278
|
+
separator
|
|
2279
|
+
} = this._config;
|
|
2280
|
+
if (separator && value.includes(separator)) {
|
|
2281
|
+
const parts = value.split(separator);
|
|
2282
|
+
for (const part of parts.slice(0, -1)) {
|
|
2283
|
+
this.add(part.trim());
|
|
2284
|
+
}
|
|
2285
|
+
this._input.value = parts.at(-1);
|
|
2286
|
+
}
|
|
2287
|
+
this._setInputSize();
|
|
2288
|
+
EventHandler.trigger(this._element, EVENT_INPUT, {
|
|
2289
|
+
value: this._input.value,
|
|
2290
|
+
relatedTarget: this._input
|
|
2291
|
+
});
|
|
2292
|
+
}
|
|
2293
|
+
_handlePaste(event) {
|
|
2294
|
+
if (this._disabled || this._readonly) {
|
|
2295
|
+
return;
|
|
2296
|
+
}
|
|
2297
|
+
const {
|
|
2298
|
+
separator
|
|
2299
|
+
} = this._config;
|
|
2300
|
+
if (!separator) {
|
|
2301
|
+
return;
|
|
2302
|
+
}
|
|
2303
|
+
const pastedData = (event.clipboardData || window.clipboardData).getData('text');
|
|
2304
|
+
if (pastedData.includes(separator)) {
|
|
2305
|
+
event.preventDefault();
|
|
2306
|
+
const parts = pastedData.split(separator);
|
|
2307
|
+
for (const part of parts) {
|
|
2308
|
+
this.add(part.trim());
|
|
2309
|
+
}
|
|
2310
|
+
}
|
|
2311
|
+
}
|
|
2312
|
+
_setInputSize() {
|
|
2313
|
+
if (!this._input) {
|
|
2314
|
+
return;
|
|
2315
|
+
}
|
|
2316
|
+
this._input.size = Math.max(this._input.placeholder.length, this._input.value.length) || 1;
|
|
2317
|
+
}
|
|
2318
|
+
}
|
|
2319
|
+
|
|
2320
|
+
/**
|
|
2321
|
+
* Data API implementation
|
|
2322
|
+
*/
|
|
2323
|
+
|
|
2324
|
+
EventHandler.on(document, `DOMContentLoaded${EVENT_KEY$a}${DATA_API_KEY$7}`, () => {
|
|
2325
|
+
for (const element of SelectorEngine.find(SELECTOR_DATA_CHIP_INPUT)) {
|
|
2326
|
+
ChipInput.getOrCreateInstance(element);
|
|
2327
|
+
}
|
|
2328
|
+
});
|
|
2329
|
+
|
|
1510
2330
|
/**
|
|
1511
2331
|
* --------------------------------------------------------------------------
|
|
1512
2332
|
* CoreUI collapse.js
|
|
@@ -5077,6 +5897,8 @@
|
|
|
5077
5897
|
Alert,
|
|
5078
5898
|
Button,
|
|
5079
5899
|
Carousel,
|
|
5900
|
+
Chip,
|
|
5901
|
+
ChipInput,
|
|
5080
5902
|
Collapse,
|
|
5081
5903
|
Dropdown,
|
|
5082
5904
|
Modal,
|