wj-elements 0.7.6 → 0.8.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/dist/animations.js +28 -51
- package/dist/animations.js.map +1 -1
- package/dist/base-path.js +19 -31
- package/dist/base-path.js.map +1 -1
- package/dist/custom-elements.json +9053 -9048
- package/dist/dark.css +1 -302
- package/dist/date.js +16 -36
- package/dist/date.js.map +1 -1
- package/dist/element-utils.js +20 -81
- package/dist/element-utils.js.map +1 -1
- package/dist/event.js +49 -165
- package/dist/event.js.map +1 -1
- package/dist/form-associated-element-BjeJn7j8.js +101 -0
- package/dist/{form-associated-element-DEQ4y-jn.js.map → form-associated-element-BjeJn7j8.js.map} +1 -1
- package/dist/icon-DmsqtDpL.js +102 -0
- package/dist/{icon-CReYMzAK.js.map → icon-DmsqtDpL.js.map} +1 -1
- package/dist/light.css +1 -731
- package/dist/localize.js +36 -111
- package/dist/localize.js.map +1 -1
- package/dist/packages/wje-accordion-item/accordion-item.element.d.ts +3 -2
- package/dist/packages/wje-img/img.element.d.ts +4 -4
- package/dist/permissions.js +14 -41
- package/dist/permissions.js.map +1 -1
- package/dist/popup.element-CbkhthPP.js +806 -0
- package/dist/{popup.element-CwXvVFK7.js.map → popup.element-CbkhthPP.js.map} +1 -1
- package/dist/router-links-CNsJ-elb.js +105 -0
- package/dist/{router-links-wjqCnncc.js.map → router-links-CNsJ-elb.js.map} +1 -1
- package/dist/skeleton.css +1 -197
- package/dist/styles.css +1 -866
- package/dist/universal-service.js +48 -109
- package/dist/universal-service.js.map +1 -1
- package/dist/utils.js +11 -18
- package/dist/utils.js.map +1 -1
- package/dist/web-types.json +698 -698
- package/dist/wje-accordion-item.js +33 -106
- package/dist/wje-accordion-item.js.map +1 -1
- package/dist/wje-accordion.js +19 -84
- package/dist/wje-accordion.js.map +1 -1
- package/dist/wje-animation.js +37 -4258
- package/dist/wje-animation.js.map +1 -1
- package/dist/wje-aside.js +9 -34
- package/dist/wje-aside.js.map +1 -1
- package/dist/wje-avatar.js +36 -126
- package/dist/wje-avatar.js.map +1 -1
- package/dist/wje-badge.js +10 -52
- package/dist/wje-badge.js.map +1 -1
- package/dist/wje-breadcrumb.js +205 -668
- package/dist/wje-breadcrumb.js.map +1 -1
- package/dist/wje-breadcrumbs.js +177 -633
- package/dist/wje-breadcrumbs.js.map +1 -1
- package/dist/wje-button-group.js +48 -153
- package/dist/wje-button-group.js.map +1 -1
- package/dist/wje-button.js +92 -413
- package/dist/wje-button.js.map +1 -1
- package/dist/wje-card-content.js +7 -30
- package/dist/wje-card-content.js.map +1 -1
- package/dist/wje-card-controls.js +7 -30
- package/dist/wje-card-controls.js.map +1 -1
- package/dist/wje-card-header.js +7 -30
- package/dist/wje-card-header.js.map +1 -1
- package/dist/wje-card-subtitle.js +7 -34
- package/dist/wje-card-subtitle.js.map +1 -1
- package/dist/wje-card-title.js +7 -34
- package/dist/wje-card-title.js.map +1 -1
- package/dist/wje-card.js +15 -71
- package/dist/wje-card.js.map +1 -1
- package/dist/wje-carousel-item.js +12 -56
- package/dist/wje-carousel-item.js.map +1 -1
- package/dist/wje-carousel.js +154 -509
- package/dist/wje-carousel.js.map +1 -1
- package/dist/wje-checkbox.js +50 -227
- package/dist/wje-checkbox.js.map +1 -1
- package/dist/wje-chip.js +43 -160
- package/dist/wje-chip.js.map +1 -1
- package/dist/wje-col.js +7 -20
- package/dist/wje-col.js.map +1 -1
- package/dist/wje-color-picker.js +445 -1464
- package/dist/wje-color-picker.js.map +1 -1
- package/dist/wje-container.js +9 -35
- package/dist/wje-container.js.map +1 -1
- package/dist/wje-copy-button.js +64 -204
- package/dist/wje-copy-button.js.map +1 -1
- package/dist/wje-dialog.js +85 -553
- package/dist/wje-dialog.js.map +1 -1
- package/dist/wje-divider.js +7 -34
- package/dist/wje-divider.js.map +1 -1
- package/dist/wje-dropdown.js +78 -305
- package/dist/wje-dropdown.js.map +1 -1
- package/dist/wje-element.js +191 -700
- package/dist/wje-element.js.map +1 -1
- package/dist/wje-file-upload-item.js +51 -156
- package/dist/wje-file-upload-item.js.map +1 -1
- package/dist/wje-file-upload.js +181 -619
- package/dist/wje-file-upload.js.map +1 -1
- package/dist/wje-footer.js +7 -31
- package/dist/wje-footer.js.map +1 -1
- package/dist/wje-form.js +7 -32
- package/dist/wje-form.js.map +1 -1
- package/dist/wje-format-digital.js +26 -118
- package/dist/wje-format-digital.js.map +1 -1
- package/dist/wje-grid.js +7 -33
- package/dist/wje-grid.js.map +1 -1
- package/dist/wje-header.js +9 -35
- package/dist/wje-header.js.map +1 -1
- package/dist/wje-icon-library.js +12 -18
- package/dist/wje-icon-library.js.map +1 -1
- package/dist/wje-icon-picker.js +65 -320
- package/dist/wje-icon-picker.js.map +1 -1
- package/dist/wje-icon.js +1 -1
- package/dist/wje-img-comparer.js +37 -114
- package/dist/wje-img-comparer.js.map +1 -1
- package/dist/wje-img.js +50 -197
- package/dist/wje-img.js.map +1 -1
- package/dist/wje-infinite-scroll.js +94 -346
- package/dist/wje-infinite-scroll.js.map +1 -1
- package/dist/wje-input-file.js +23 -84
- package/dist/wje-input-file.js.map +1 -1
- package/dist/wje-input.js +78 -392
- package/dist/wje-input.js.map +1 -1
- package/dist/wje-item.js +11 -64
- package/dist/wje-item.js.map +1 -1
- package/dist/wje-kanban.js +124 -401
- package/dist/wje-kanban.js.map +1 -1
- package/dist/wje-label.js +9 -32
- package/dist/wje-label.js.map +1 -1
- package/dist/wje-level-indicator.js +38 -157
- package/dist/wje-level-indicator.js.map +1 -1
- package/dist/wje-list.js +10 -40
- package/dist/wje-list.js.map +1 -1
- package/dist/wje-main.js +7 -31
- package/dist/wje-main.js.map +1 -1
- package/dist/wje-masonry.js +66 -211
- package/dist/wje-masonry.js.map +1 -1
- package/dist/wje-master.js +45 -161
- package/dist/wje-master.js.map +1 -1
- package/dist/wje-menu-button.js +10 -38
- package/dist/wje-menu-button.js.map +1 -1
- package/dist/wje-menu-item.js +127 -577
- package/dist/wje-menu-item.js.map +1 -1
- package/dist/wje-menu-label.js +9 -35
- package/dist/wje-menu-label.js.map +1 -1
- package/dist/wje-menu.js +14 -49
- package/dist/wje-menu.js.map +1 -1
- package/dist/wje-option.js +48 -279
- package/dist/wje-option.js.map +1 -1
- package/dist/wje-options.js +130 -384
- package/dist/wje-options.js.map +1 -1
- package/dist/wje-orgchart-group.js +16 -52
- package/dist/wje-orgchart-group.js.map +1 -1
- package/dist/wje-orgchart-item.js +24 -93
- package/dist/wje-orgchart-item.js.map +1 -1
- package/dist/wje-orgchart.js +18 -68
- package/dist/wje-orgchart.js.map +1 -1
- package/dist/wje-pagination.js +113 -397
- package/dist/wje-pagination.js.map +1 -1
- package/dist/wje-popup.js +3 -3
- package/dist/wje-popup.js.map +1 -1
- package/dist/wje-progress-bar.js +53 -205
- package/dist/wje-progress-bar.js.map +1 -1
- package/dist/wje-qr-code.js +398 -2980
- package/dist/wje-qr-code.js.map +1 -1
- package/dist/wje-radio-group.js +52 -190
- package/dist/wje-radio-group.js.map +1 -1
- package/dist/wje-radio.js +24 -118
- package/dist/wje-radio.js.map +1 -1
- package/dist/wje-rate.js +62 -266
- package/dist/wje-rate.js.map +1 -1
- package/dist/wje-relative-time.js +24 -99
- package/dist/wje-relative-time.js.map +1 -1
- package/dist/wje-reorder-dropzone.js +9 -31
- package/dist/wje-reorder-dropzone.js.map +1 -1
- package/dist/wje-reorder-handle.js +67 -204
- package/dist/wje-reorder-handle.js.map +1 -1
- package/dist/wje-reorder-item.js +14 -44
- package/dist/wje-reorder-item.js.map +1 -1
- package/dist/wje-reorder.js +61 -246
- package/dist/wje-reorder.js.map +1 -1
- package/dist/wje-route.js +6 -24
- package/dist/wje-route.js.map +1 -1
- package/dist/wje-router-link.js +11 -39
- package/dist/wje-router-link.js.map +1 -1
- package/dist/wje-router-outlet.js +76 -172
- package/dist/wje-router-outlet.js.map +1 -1
- package/dist/wje-routerx.js +537 -1331
- package/dist/wje-routerx.js.map +1 -1
- package/dist/wje-row.js +9 -31
- package/dist/wje-row.js.map +1 -1
- package/dist/wje-select.js +326 -1152
- package/dist/wje-select.js.map +1 -1
- package/dist/wje-slider.js +44 -225
- package/dist/wje-slider.js.map +1 -1
- package/dist/wje-sliding-container.js +295 -1319
- package/dist/wje-sliding-container.js.map +1 -1
- package/dist/wje-split-view.js +35 -121
- package/dist/wje-split-view.js.map +1 -1
- package/dist/wje-status.js +14 -45
- package/dist/wje-status.js.map +1 -1
- package/dist/wje-step.js +9 -32
- package/dist/wje-step.js.map +1 -1
- package/dist/wje-stepper.js +109 -357
- package/dist/wje-stepper.js.map +1 -1
- package/dist/wje-store.js +67 -360
- package/dist/wje-store.js.map +1 -1
- package/dist/wje-tab-group.js +85 -314
- package/dist/wje-tab-group.js.map +1 -1
- package/dist/wje-tab-panel.js +7 -28
- package/dist/wje-tab-panel.js.map +1 -1
- package/dist/wje-tab.js +21 -198
- package/dist/wje-tab.js.map +1 -1
- package/dist/wje-textarea.js +64 -264
- package/dist/wje-textarea.js.map +1 -1
- package/dist/wje-thumbnail.js +10 -51
- package/dist/wje-thumbnail.js.map +1 -1
- package/dist/wje-toast.js +127 -632
- package/dist/wje-toast.js.map +1 -1
- package/dist/wje-toggle.js +52 -177
- package/dist/wje-toggle.js.map +1 -1
- package/dist/wje-toolbar-action.js +128 -456
- package/dist/wje-toolbar-action.js.map +1 -1
- package/dist/wje-toolbar.js +75 -270
- package/dist/wje-toolbar.js.map +1 -1
- package/dist/wje-tooltip.js +50 -161
- package/dist/wje-tooltip.js.map +1 -1
- package/dist/wje-tree-item.js +70 -301
- package/dist/wje-tree-item.js.map +1 -1
- package/dist/wje-tree.js +145 -489
- package/dist/wje-tree.js.map +1 -1
- package/dist/wje-visually-hidden.js +7 -34
- package/dist/wje-visually-hidden.js.map +1 -1
- package/package.json +4 -2
- package/dist/form-associated-element-DEQ4y-jn.js +0 -245
- package/dist/icon-CReYMzAK.js +0 -245
- package/dist/popup.element-CwXvVFK7.js +0 -2133
- package/dist/router-links-wjqCnncc.js +0 -156
package/dist/wje-icon-picker.js
CHANGED
|
@@ -1,381 +1,126 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
3
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
-
import
|
|
5
|
-
import { getBasePath } from "./base-path.js";
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import { event } from "./event.js";
|
|
10
|
-
|
|
11
|
-
class IconPicker extends WJElement {
|
|
12
|
-
/**
|
|
13
|
-
* Creates an instance of IconPicker.
|
|
14
|
-
* @class
|
|
15
|
-
*/
|
|
4
|
+
import e from "./wje-element.js";
|
|
5
|
+
import { getBasePath as t } from "./base-path.js";
|
|
6
|
+
import i from "./wje-infinite-scroll.js";
|
|
7
|
+
import r from "./wje-input.js";
|
|
8
|
+
import s from "./wje-tooltip.js";
|
|
9
|
+
import { event as n } from "./event.js";
|
|
10
|
+
class o extends e {
|
|
16
11
|
constructor() {
|
|
17
12
|
super();
|
|
18
|
-
|
|
19
|
-
* Dependencies of the IconPicker component.
|
|
20
|
-
* @property {object} dependencies
|
|
21
|
-
*/
|
|
22
|
-
__publicField(this, "dependencies", {
|
|
23
|
-
"wje-input": Input,
|
|
24
|
-
"wje-infinite-scroll": InfiniteScroll,
|
|
25
|
-
"wje-tooltip": Tooltip
|
|
26
|
-
});
|
|
13
|
+
__publicField(this, "dependencies", { "wje-input": r, "wje-infinite-scroll": i, "wje-tooltip": s });
|
|
27
14
|
__publicField(this, "className", "IconPicker");
|
|
28
|
-
|
|
29
|
-
* Handles the selection of an icon from a given input element and updates the relevant properties and events.
|
|
30
|
-
* @function selectIcon
|
|
31
|
-
* @param {HTMLElement} icon The icon element that was selected. It must have a 'name' attribute and may optionally have a 'filled' attribute.
|
|
32
|
-
* The function performs the following actions:
|
|
33
|
-
* - Retrieves the name of the selected icon from its 'name' attribute.
|
|
34
|
-
* - Determines the style type ('filled' or 'outline') based on the presence of the 'filled' attribute.
|
|
35
|
-
* - Searches for a matching object in the `transformedObjects` array based on name and style.
|
|
36
|
-
* - Creates a new `wje-icon` element and assigns its attributes based on the selected icon's properties.
|
|
37
|
-
* - Updates the selected object's properties and assigns it to the `value`, `icon`, and `type` properties of the class.
|
|
38
|
-
* - Dispatches a custom event (`wje-icon-picker:select`) to signal a change in the selected icon.
|
|
39
|
-
*/
|
|
40
|
-
__publicField(this, "selectIcon", (icon) => {
|
|
15
|
+
__publicField(this, "selectIcon", (e2) => {
|
|
41
16
|
var _a, _b;
|
|
42
|
-
let
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
(i) => i.name === name && Object.keys(i.styles)[0] === stylesType
|
|
46
|
-
);
|
|
47
|
-
const iconElement = document.createElement("wje-icon");
|
|
48
|
-
iconElement.setAttribute("name", name);
|
|
49
|
-
if ((_a = uniqueObject.styles) == null ? void 0 : _a.hasOwnProperty("filled")) iconElement.setAttribute("filled", "");
|
|
50
|
-
uniqueObject.icon = iconElement;
|
|
51
|
-
this.value = uniqueObject;
|
|
52
|
-
this.icon = uniqueObject.name;
|
|
53
|
-
this.type = ((_b = uniqueObject.styles) == null ? void 0 : _b.hasOwnProperty("filled")) ? "filled" : "outline";
|
|
54
|
-
event.dispatchCustomEvent(this, "wje-icon-picker:select", uniqueObject);
|
|
17
|
+
let t2 = e2.getAttribute("name"), i2 = e2.hasAttribute("filled") ? "filled" : "outline", r2 = this.transformedObjects.find((e3) => e3.name === t2 && Object.keys(e3.styles)[0] === i2);
|
|
18
|
+
const s2 = document.createElement("wje-icon");
|
|
19
|
+
s2.setAttribute("name", t2), ((_a = r2.styles) == null ? void 0 : _a.hasOwnProperty("filled")) && s2.setAttribute("filled", ""), r2.icon = s2, this.value = r2, this.icon = r2.name, this.type = ((_b = r2.styles) == null ? void 0 : _b.hasOwnProperty("filled")) ? "filled" : "outline", n.dispatchCustomEvent(this, "wje-icon-picker:select", r2);
|
|
55
20
|
});
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
* @param {object} tags The input object containing tags as properties. Each property is an object with a `styles` key.
|
|
62
|
-
* @param {object} tags[].styles The styles object containing `filled` and/or `outline` styles.
|
|
63
|
-
* @param {object} [tags[].styles.outline] The outline style object, if present.
|
|
64
|
-
* @param {object} [tags[].styles.filled] The filled style object, if present.
|
|
65
|
-
* @returns {Array<object>} An array of transformed objects. Objects with both `filled` and `outline` styles are split into separate objects, each containing only one style.
|
|
66
|
-
* @example
|
|
67
|
-
* const tags = {
|
|
68
|
-
* hourglass: {
|
|
69
|
-
* styles: {
|
|
70
|
-
* outline: { ... },
|
|
71
|
-
* filled: { ... },
|
|
72
|
-
* }
|
|
73
|
-
* },
|
|
74
|
-
* clock: {
|
|
75
|
-
* styles: {
|
|
76
|
-
* outline: { ... },
|
|
77
|
-
* }
|
|
78
|
-
* }
|
|
79
|
-
* };
|
|
80
|
-
* const result = convertObject(tags);
|
|
81
|
-
* console.log(result);
|
|
82
|
-
* // [
|
|
83
|
-
* // { styles: { outline: { ... } } },
|
|
84
|
-
* // { styles: { filled: { ... } } },
|
|
85
|
-
* // { styles: { outline: { ... } } }
|
|
86
|
-
* // ]
|
|
87
|
-
*/
|
|
88
|
-
__publicField(this, "convertObject", (tags = {}) => {
|
|
89
|
-
let originalObjects = Object.values(tags);
|
|
90
|
-
let transformedObjects = [];
|
|
91
|
-
for (let i = 0; i < originalObjects.length; i++) {
|
|
92
|
-
const obj = originalObjects[i];
|
|
93
|
-
if (obj.styles.filled) {
|
|
94
|
-
transformedObjects.push(
|
|
95
|
-
{ ...obj, styles: { outline: obj.styles.outline } },
|
|
96
|
-
{ ...obj, styles: { filled: obj.styles.filled } }
|
|
97
|
-
);
|
|
98
|
-
} else {
|
|
99
|
-
transformedObjects.push(obj);
|
|
100
|
-
}
|
|
21
|
+
__publicField(this, "convertObject", (e2 = {}) => {
|
|
22
|
+
let t2 = Object.values(e2), i2 = [];
|
|
23
|
+
for (let e3 = 0; e3 < t2.length; e3++) {
|
|
24
|
+
const r2 = t2[e3];
|
|
25
|
+
r2.styles.filled ? i2.push({ ...r2, styles: { outline: r2.styles.outline } }, { ...r2, styles: { filled: r2.styles.filled } }) : i2.push(r2);
|
|
101
26
|
}
|
|
102
|
-
return
|
|
27
|
+
return i2;
|
|
103
28
|
});
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
* @example
|
|
112
|
-
* const iconData = {
|
|
113
|
-
* name: "hourglass",
|
|
114
|
-
* styles: {
|
|
115
|
-
* filled: { ... }
|
|
116
|
-
* }
|
|
117
|
-
* };
|
|
118
|
-
* const htmlElement = dataToHtml(iconData);
|
|
119
|
-
* document.body.appendChild(htmlElement);
|
|
120
|
-
*
|
|
121
|
-
* // The resulting structure:
|
|
122
|
-
* // <div class="icon-item">
|
|
123
|
-
* // <wje-tooltip content="hourglass">
|
|
124
|
-
* // <wje-icon name="hourglass" size="large" filled></wje-icon></wje-icon>
|
|
125
|
-
* // </wje-tooltip>
|
|
126
|
-
* // </div>
|
|
127
|
-
*/
|
|
128
|
-
__publicField(this, "dataToHtml", (data) => {
|
|
129
|
-
let iconItem = document.createElement("div");
|
|
130
|
-
iconItem.classList.add("icon-item");
|
|
131
|
-
let tooltip = document.createElement("wje-tooltip");
|
|
132
|
-
tooltip.setAttribute("content", data.name);
|
|
133
|
-
let icon = document.createElement("wje-icon");
|
|
134
|
-
icon.setAttribute("name", data.name);
|
|
135
|
-
icon.setAttribute("size", "large");
|
|
136
|
-
if (data.styles.hasOwnProperty("filled")) icon.setAttribute("filled", "");
|
|
137
|
-
tooltip.appendChild(icon);
|
|
138
|
-
iconItem.appendChild(tooltip);
|
|
139
|
-
return iconItem;
|
|
29
|
+
__publicField(this, "dataToHtml", (e2) => {
|
|
30
|
+
let t2 = document.createElement("div");
|
|
31
|
+
t2.classList.add("icon-item");
|
|
32
|
+
let i2 = document.createElement("wje-tooltip");
|
|
33
|
+
i2.setAttribute("content", e2.name);
|
|
34
|
+
let r2 = document.createElement("wje-icon");
|
|
35
|
+
return r2.setAttribute("name", e2.name), r2.setAttribute("size", "large"), e2.styles.hasOwnProperty("filled") && r2.setAttribute("filled", ""), i2.appendChild(r2), t2.appendChild(i2), t2;
|
|
140
36
|
});
|
|
141
|
-
|
|
142
|
-
* Searches icons based on user input.
|
|
143
|
-
* This method handles the input event and filters the available icons based on the provided search string.
|
|
144
|
-
* The filtering is performed on an index that combines icon names and their tags.
|
|
145
|
-
* The results are then adjusted for infinite scrolling.
|
|
146
|
-
* @param {Event} e The input event (e.g., `wje-input:input`) containing the search query details.
|
|
147
|
-
*/
|
|
148
|
-
__publicField(this, "searchIcon", (e) => {
|
|
37
|
+
__publicField(this, "searchIcon", (e2) => {
|
|
149
38
|
var _a;
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
if (results.length === 0) {
|
|
39
|
+
const t2 = ((_a = e2.detail) == null ? void 0 : _a.value) ? e2.detail.value.toLowerCase() : "", i2 = this.index.filter((e3) => e3.searchText.includes(t2));
|
|
40
|
+
if (0 === i2.length) {
|
|
153
41
|
this.clearIconsContainer();
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
noResultsDiv.classList.add("no-results");
|
|
157
|
-
noResultsDiv.textContent = "No icons found";
|
|
158
|
-
this.infiniteScroll.querySelector(".icon-items").append(noResultsDiv);
|
|
159
|
-
return;
|
|
42
|
+
const e3 = document.createElement("div");
|
|
43
|
+
return e3.setAttribute("part", "no-results"), e3.classList.add("no-results"), e3.textContent = "No icons found", void this.infiniteScroll.querySelector(".icon-items").append(e3);
|
|
160
44
|
}
|
|
161
|
-
this.infiniteScroll.unScrollEvent();
|
|
162
|
-
this.infiniteScroll.setCustomData = (page = 0) => {
|
|
163
|
-
const data = results.slice(page * this.size, page * this.size + this.size);
|
|
164
|
-
return {
|
|
165
|
-
data,
|
|
166
|
-
page,
|
|
167
|
-
size: this.size,
|
|
168
|
-
totalPages: Math.ceil(results.length / this.size)
|
|
169
|
-
};
|
|
170
|
-
};
|
|
171
|
-
this.infiniteScroll.reset();
|
|
172
|
-
this.infiniteScroll.scrollEvent();
|
|
173
|
-
this.infiniteScroll.loadPages(0);
|
|
45
|
+
this.infiniteScroll.unScrollEvent(), this.infiniteScroll.setCustomData = (e3 = 0) => ({ data: i2.slice(e3 * this.size, e3 * this.size + this.size), page: e3, size: this.size, totalPages: Math.ceil(i2.length / this.size) }), this.infiniteScroll.reset(), this.infiniteScroll.scrollEvent(), this.infiniteScroll.loadPages(0);
|
|
174
46
|
});
|
|
175
47
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
* @param {any} value The value to set.
|
|
179
|
-
*/
|
|
180
|
-
set size(value) {
|
|
181
|
-
this.setAttribute("size", value);
|
|
48
|
+
set size(e2) {
|
|
49
|
+
this.setAttribute("size", e2);
|
|
182
50
|
}
|
|
183
|
-
/**
|
|
184
|
-
* Getter for the markerPosition property.
|
|
185
|
-
* @returns {any} size The value of the markerPosition property.
|
|
186
|
-
*/
|
|
187
51
|
get size() {
|
|
188
52
|
return this.getAttribute("size") || 60;
|
|
189
53
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
* @param value
|
|
193
|
-
*/
|
|
194
|
-
set icon(value) {
|
|
195
|
-
this.setAttribute("icon", value);
|
|
54
|
+
set icon(e2) {
|
|
55
|
+
this.setAttribute("icon", e2);
|
|
196
56
|
}
|
|
197
|
-
/**
|
|
198
|
-
* Getter for the value property.
|
|
199
|
-
* @returns {string}
|
|
200
|
-
*/
|
|
201
57
|
get icon() {
|
|
202
58
|
return this.getAttribute("icon");
|
|
203
59
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
* @param value
|
|
207
|
-
*/
|
|
208
|
-
set type(value) {
|
|
209
|
-
this.setAttribute("type", value);
|
|
60
|
+
set type(e2) {
|
|
61
|
+
this.setAttribute("type", e2);
|
|
210
62
|
}
|
|
211
|
-
/**
|
|
212
|
-
* Getter for the value property.
|
|
213
|
-
* @returns {string}
|
|
214
|
-
*/
|
|
215
63
|
get type() {
|
|
216
64
|
return this.getAttribute("type");
|
|
217
65
|
}
|
|
218
|
-
/**
|
|
219
|
-
* Returns the CSS styles for the component.
|
|
220
|
-
* @static
|
|
221
|
-
* @returns {CSSStyleSheet}
|
|
222
|
-
*/
|
|
223
66
|
static get cssStyleSheet() {
|
|
224
|
-
return
|
|
67
|
+
return ".anchor{width:var(--wje-icon-picker-icon-size);height:var(--wje-icon-picker-icon-size);padding:var(--wje-icon-picker-padding);border-width:var(--wje-icon-picker-border-width);border-style:var(--wje-icon-picker-border-style);border-color:var(--wje-icon-picker-border-color);box-sizing:border-box;border-radius:var(--wje-icon-picker-radius)}.picker{width:320px;height:271px;box-shadow:var(--wje-icon-picker-shadow);border-radius:var(--wje-icon-picker-radius);border-width:var(--wje-icon-picker-border-width);border-style:var(--wje-icon-picker-border-style);border-color:var(--wje-icon-picker-border-color);overflow:auto;padding:1rem;background:var(--wje-icon-picker-background)}.icon-items{--icon-min-width: 2rem;display:grid;grid-gap:.5rem;grid-template-columns:repeat(auto-fit,minmax(var(--icon-min-width),1fr))}.icon-item{box-sizing:border-box;display:flex;align-items:center;justify-content:center;text-align:center;color:inherit;padding:.25rem;min-height:var(--wje-icon-picker-icon-size);min-width:var(--wje-icon-picker-icon-size);text-decoration:none}.icon-item:hover{border-radius:.25rem;background:var(--wje-border-color)}.wje-size{--wje-icon-size: 24px !important}icon-item svg{width:var(--wje-icon-picker-icon-size);height:var(--wje-icon-picker-icon-size)}wje-input{--wje-input-border-radius: 4px;--wje-input-margin-bottom: 0}wje-infinite-scroll{margin-top:1rem}wje-select{--wje-select-border-width: 0 0 1px 0 !important;--wje-select-border-radius: 0 !important;margin-bottom:1rem}.anchor wje-icon{--wje-icon-size: 100% !important}";
|
|
225
68
|
}
|
|
226
|
-
/**
|
|
227
|
-
* Returns the list of attributes to observe for changes.
|
|
228
|
-
* @static
|
|
229
|
-
* @returns {Array<string>}
|
|
230
|
-
*/
|
|
231
69
|
static get observedAttributes() {
|
|
232
70
|
return [];
|
|
233
71
|
}
|
|
234
|
-
/**
|
|
235
|
-
* Sets up the attributes for the component.
|
|
236
|
-
*/
|
|
237
72
|
setupAttributes() {
|
|
238
|
-
this.isShadowRoot = "open";
|
|
239
|
-
this.syncAria();
|
|
73
|
+
this.isShadowRoot = "open", this.syncAria();
|
|
240
74
|
}
|
|
241
|
-
/**
|
|
242
|
-
* Prepares data before the draw operation by fetching tags, transforming objects, and creating an index.
|
|
243
|
-
* @returns {Promise<void>} Resolves when data preparation is complete.
|
|
244
|
-
*/
|
|
245
75
|
async beforeDraw() {
|
|
246
|
-
this.tags = Object.values(await this.getTags());
|
|
247
|
-
this.transformedObjects = this.convertObject(this.tags);
|
|
248
|
-
this.index = this.transformedObjects.map((item) => ({
|
|
249
|
-
...item,
|
|
250
|
-
searchText: `${item.name.toLowerCase()} ${item.tags.join(" ").toLowerCase()}`
|
|
251
|
-
}));
|
|
76
|
+
this.tags = Object.values(await this.getTags()), this.transformedObjects = this.convertObject(this.tags), this.index = this.transformedObjects.map((e2) => ({ ...e2, searchText: `${e2.name.toLowerCase()} ${e2.tags.join(" ").toLowerCase()}` }));
|
|
252
77
|
}
|
|
253
|
-
/**
|
|
254
|
-
* Draws and initializes the native color picker component on the DOM.
|
|
255
|
-
* This method creates and appends the necessary elements, including input and infinite scroll components,
|
|
256
|
-
* and sets their attributes and event listeners. It also provides custom data handling for infinite scrolling
|
|
257
|
-
* and manages the way icons are displayed based on input.
|
|
258
|
-
* @returns {DocumentFragment} A document fragment containing the fully constructed color picker component.
|
|
259
|
-
*/
|
|
260
78
|
draw() {
|
|
261
|
-
let
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
let icon = document.createElement("wje-icon");
|
|
266
|
-
icon.setAttribute("name", this.icon);
|
|
267
|
-
if (this.type === "filled")
|
|
268
|
-
icon.setAttribute("filled", "");
|
|
269
|
-
this.selectIcon(icon);
|
|
79
|
+
let e2 = document.createDocumentFragment(), r2 = document.createElement("div");
|
|
80
|
+
if (r2.classList.add("native-color-picker"), this.hasAttribute("icon") && this.icon) {
|
|
81
|
+
let e3 = document.createElement("wje-icon");
|
|
82
|
+
e3.setAttribute("name", this.icon), "filled" === this.type && e3.setAttribute("filled", ""), this.selectIcon(e3);
|
|
270
83
|
}
|
|
271
|
-
let
|
|
272
|
-
|
|
273
|
-
let
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
input.setAttribute("clearable", "");
|
|
278
|
-
input.addEventListener("wje-input:input", this.debounce(this.searchIcon.bind(this), 300));
|
|
279
|
-
input.addEventListener("wje-input:clear", this.searchIcon);
|
|
280
|
-
let infiniteScroll = new InfiniteScroll();
|
|
281
|
-
infiniteScroll.setAttribute("url", getBasePath("assets/tags.json"));
|
|
282
|
-
infiniteScroll.setAttribute("placement", ".icon-items");
|
|
283
|
-
infiniteScroll.setAttribute("size", this.size);
|
|
284
|
-
infiniteScroll.setAttribute("height", "223px");
|
|
285
|
-
infiniteScroll.innerHTML = '<div class="icon-items"></div>';
|
|
286
|
-
picker.append(input, infiniteScroll);
|
|
287
|
-
native.append(picker);
|
|
288
|
-
fragment.append(native);
|
|
289
|
-
this.input = input;
|
|
290
|
-
this.picker = picker;
|
|
291
|
-
this.infiniteScroll = infiniteScroll;
|
|
292
|
-
this.infiniteScroll.dataToHtml = this.dataToHtml;
|
|
293
|
-
this.infiniteScroll.compareFunction = (i, item) => i.name === item.name;
|
|
294
|
-
this.infiniteScroll.setCustomData = (page = 0) => {
|
|
295
|
-
return {
|
|
296
|
-
data: this.transformedObjects.slice(page * this.size, page * this.size + this.size),
|
|
297
|
-
page,
|
|
298
|
-
size: this.size,
|
|
299
|
-
totalPages: Math.round(this.transformedObjects.length / this.size)
|
|
300
|
-
};
|
|
301
|
-
};
|
|
302
|
-
return fragment;
|
|
84
|
+
let s2 = document.createElement("div");
|
|
85
|
+
s2.classList.add("picker");
|
|
86
|
+
let n2 = document.createElement("wje-input");
|
|
87
|
+
n2.classList.add("input"), n2.setAttribute("variant", "standard"), n2.setAttribute("placeholder", "type to filter..."), n2.setAttribute("clearable", ""), n2.addEventListener("wje-input:input", this.debounce(this.searchIcon.bind(this), 300)), n2.addEventListener("wje-input:clear", this.searchIcon);
|
|
88
|
+
let o2 = new i();
|
|
89
|
+
return o2.setAttribute("url", t("assets/tags.json")), o2.setAttribute("placement", ".icon-items"), o2.setAttribute("size", this.size), o2.setAttribute("height", "223px"), o2.innerHTML = '<div class="icon-items"></div>', s2.append(n2, o2), r2.append(s2), e2.append(r2), this.input = n2, this.picker = s2, this.infiniteScroll = o2, this.infiniteScroll.dataToHtml = this.dataToHtml, this.infiniteScroll.compareFunction = (e3, t2) => e3.name === t2.name, this.infiniteScroll.setCustomData = (e3 = 0) => ({ data: this.transformedObjects.slice(e3 * this.size, e3 * this.size + this.size), page: e3, size: this.size, totalPages: Math.round(this.transformedObjects.length / this.size) }), e2;
|
|
303
90
|
}
|
|
304
|
-
/**
|
|
305
|
-
* Executes actions that occur after the component finishes its draw phase. Sets up event listeners for input clear
|
|
306
|
-
* and infinite scroll item clicks, resets initialization state, and rebinds scroll-related events.
|
|
307
|
-
* @returns {void} Does not return a value.
|
|
308
|
-
*/
|
|
309
91
|
afterDraw() {
|
|
310
|
-
this.syncAria()
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
this.
|
|
314
|
-
|
|
315
|
-
});
|
|
316
|
-
this.addEventListener("wje-infinite-scroll:click-item", (e) => {
|
|
317
|
-
e.preventDefault();
|
|
318
|
-
e.stopImmediatePropagation();
|
|
319
|
-
this.selectIcon(e.detail.context.querySelector("wje-icon"));
|
|
320
|
-
});
|
|
321
|
-
this.init = false;
|
|
92
|
+
this.syncAria(), this.addEventListener("wje-input:clear", () => {
|
|
93
|
+
this.clearIconsContainer(), this.infiniteScroll.scrollEvent(), this.infiniteScroll.loadPages(0);
|
|
94
|
+
}), this.addEventListener("wje-infinite-scroll:click-item", (e2) => {
|
|
95
|
+
e2.preventDefault(), e2.stopImmediatePropagation(), this.selectIcon(e2.detail.context.querySelector("wje-icon"));
|
|
96
|
+
}), this.init = false;
|
|
322
97
|
}
|
|
323
|
-
/**
|
|
324
|
-
* Sync ARIA attributes on host.
|
|
325
|
-
*/
|
|
326
98
|
syncAria() {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
}
|
|
330
|
-
const ariaLabel = this.getAttribute("aria-label");
|
|
331
|
-
const label = this.getAttribute("label");
|
|
332
|
-
if (!ariaLabel && label) {
|
|
333
|
-
this.setAriaState({ label });
|
|
334
|
-
}
|
|
99
|
+
this.hasAttribute("role") || this.setAriaState({ role: "group" });
|
|
100
|
+
const e2 = this.getAttribute("aria-label"), t2 = this.getAttribute("label");
|
|
101
|
+
!e2 && t2 && this.setAriaState({ label: t2 });
|
|
335
102
|
}
|
|
336
|
-
/**
|
|
337
|
-
* Initializes the component.
|
|
338
|
-
*/
|
|
339
103
|
initial() {
|
|
340
104
|
this.infiniteScroll.scrollEvent();
|
|
341
105
|
}
|
|
342
|
-
/**
|
|
343
|
-
* Gets the tags.
|
|
344
|
-
* @returns {Promise<Array>} The tags of the component.
|
|
345
|
-
*/
|
|
346
106
|
async getTags() {
|
|
347
|
-
|
|
348
|
-
return response.json();
|
|
107
|
+
return (await fetch(t("assets/tags.json"))).json();
|
|
349
108
|
}
|
|
350
|
-
/**
|
|
351
|
-
* Called when the component is disconnected.
|
|
352
|
-
*/
|
|
353
109
|
beforeDisconnect() {
|
|
354
110
|
this.init = false;
|
|
355
111
|
}
|
|
356
|
-
/**
|
|
357
|
-
* Clears the icons container.
|
|
358
|
-
*/
|
|
359
112
|
clearIconsContainer() {
|
|
360
113
|
this.context.querySelector(".icon-items").innerHTML = "";
|
|
361
114
|
}
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
* @param {number} delay The delay duration in milliseconds.
|
|
367
|
-
* @returns {Function} A new debounced function that delays the execution of the original function.
|
|
368
|
-
*/
|
|
369
|
-
debounce(fn, delay) {
|
|
370
|
-
let timeout;
|
|
371
|
-
return (...args) => {
|
|
372
|
-
clearTimeout(timeout);
|
|
373
|
-
timeout = setTimeout(() => fn(...args), delay);
|
|
115
|
+
debounce(e2, t2) {
|
|
116
|
+
let i2;
|
|
117
|
+
return (...r2) => {
|
|
118
|
+
clearTimeout(i2), i2 = setTimeout(() => e2(...r2), t2);
|
|
374
119
|
};
|
|
375
120
|
}
|
|
376
121
|
}
|
|
377
|
-
|
|
122
|
+
o.define("wje-icon-picker", o);
|
|
378
123
|
export {
|
|
379
|
-
|
|
124
|
+
o as default
|
|
380
125
|
};
|
|
381
126
|
//# sourceMappingURL=wje-icon-picker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wje-icon-picker.js","sources":["../packages/wje-icon-picker/icon-picker.element.js","../packages/wje-icon-picker/icon-picker.js"],"sourcesContent":["import { default as WJElement, event } from '../wje-element/element.js';\nimport { getBasePath } from \"../utils/base-path.js\";\nimport InfiniteScroll from '../wje-infinite-scroll/infinite-scroll.js';\nimport Input from '../wje-input/input.js';\nimport Tooltip from '../wje-tooltip/tooltip.js';\nimport styles from './styles/styles.css?inline';\n\n/**\n * @summary This element allows users to pick an icon from a set of available options.\n * `IconPicker` is a custom web component that represents an interactive icon picker. It features\n * search functionality, infinite scrolling, and popup-based selection. The component is highly customizable\n * and integrates seamlessly with other `WJElement` components.\n * @documentation https://elements.webjet.sk/components/icon-picker\n * @status stable\n * @augments {WJElement}\n * @attribute {string} icon - The selected icon's name.\n * @attribute {number} size - The number of icons displayed per page in infinite scroll. Default is 60.\n * @csspart native - The native part of the component.\n * @csspart anchor - The part representing the anchor button displaying the selected icon.\n * @csspart picker - The picker part containing the search and icon selection interface.\n * @csspart input - The input part for searching icons.\n * @cssproperty [--wje-color-picker-value=#ff0000] - The default color value.\n * @cssproperty [--wje-color-picker-area=transparent] - The background color of the color picker area.\n * @cssproperty [--wje-color-picker-swatch=transparent] - The background color of the swatch picker.\n * @cssproperty [--wje-color-picker-size=1rem] - The size of the icons in the picker.\n * @cssproperty [--wje-color-picker-radius=4px] - The border radius of the picker.\n * @tag wje-icon-picker\n */\n\nexport default class IconPicker extends WJElement {\n /**\n * Creates an instance of IconPicker.\n * @class\n */\n constructor() {\n super();\n }\n\n /**\n * Dependencies of the IconPicker component.\n * @property {object} dependencies\n */\n dependencies = {\n 'wje-input': Input,\n 'wje-infinite-scroll': InfiniteScroll,\n 'wje-tooltip': Tooltip\n };\n\n /**\n * Setter for the markerPosition property.\n * @param {any} value The value to set.\n */\n set size(value) {\n this.setAttribute('size', value);\n }\n\n /**\n * Getter for the markerPosition property.\n * @returns {any} size The value of the markerPosition property.\n */\n get size() {\n return this.getAttribute('size') || 60;\n }\n\n /**\n * Setter for the value property.\n * @param value\n */\n set icon(value) {\n this.setAttribute('icon', value);\n }\n\n /**\n * Getter for the value property.\n * @returns {string}\n */\n get icon() {\n return this.getAttribute('icon');\n }\n\n /**\n * Setter for the value property.\n * @param value\n */\n set type(value) {\n this.setAttribute('type', value);\n }\n\n /**\n * Getter for the value property.\n * @returns {string}\n */\n get type() {\n return this.getAttribute('type');\n }\n\n className = 'IconPicker';\n\n /**\n * Returns the CSS styles for the component.\n * @static\n * @returns {CSSStyleSheet}\n */\n static get cssStyleSheet() {\n return styles;\n }\n\n /**\n * Returns the list of attributes to observe for changes.\n * @static\n * @returns {Array<string>}\n */\n static get observedAttributes() {\n return [];\n }\n\n /**\n * Sets up the attributes for the component.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n this.syncAria();\n }\n\n /**\n * Prepares data before the draw operation by fetching tags, transforming objects, and creating an index.\n * @returns {Promise<void>} Resolves when data preparation is complete.\n */\n async beforeDraw() {\n this.tags = Object.values(await this.getTags());\n\n this.transformedObjects = this.convertObject(this.tags);\n\n this.index = this.transformedObjects.map((item) => ({\n ...item,\n searchText: `${item.name.toLowerCase()} ${item.tags.join(' ').toLowerCase()}`,\n }));\n }\n\n /**\n * Draws and initializes the native color picker component on the DOM.\n * This method creates and appends the necessary elements, including input and infinite scroll components,\n * and sets their attributes and event listeners. It also provides custom data handling for infinite scrolling\n * and manages the way icons are displayed based on input.\n * @returns {DocumentFragment} A document fragment containing the fully constructed color picker component.\n */\n draw() {\n let fragment = document.createDocumentFragment();\n\n let native = document.createElement('div');\n native.classList.add('native-color-picker');\n\n if (this.hasAttribute('icon') && this.icon) {\n\n let icon = document.createElement('wje-icon');\n icon.setAttribute('name', this.icon);\n if(this.type === 'filled')\n icon.setAttribute('filled', '');\n\n this.selectIcon(icon);\n }\n\n // PICKER\n let picker = document.createElement('div');\n picker.classList.add('picker');\n\n let input = document.createElement('wje-input');\n input.classList.add('input');\n input.setAttribute('variant', 'standard');\n input.setAttribute('placeholder', 'type to filter...');\n input.setAttribute('clearable', '');\n input.addEventListener('wje-input:input', this.debounce(this.searchIcon.bind(this), 300));\n input.addEventListener('wje-input:clear', this.searchIcon);\n\n let infiniteScroll = new InfiniteScroll();\n infiniteScroll.setAttribute('url', getBasePath('assets/tags.json'));\n infiniteScroll.setAttribute('placement', '.icon-items');\n infiniteScroll.setAttribute('size', this.size);\n infiniteScroll.setAttribute('height', '223px');\n infiniteScroll.innerHTML = '<div class=\"icon-items\"></div>';\n\n // APPEND\n picker.append(input, infiniteScroll);\n\n native.append(picker);\n\n fragment.append(native);\n\n this.input = input;\n this.picker = picker;\n this.infiniteScroll = infiniteScroll;\n\n this.infiniteScroll.dataToHtml = this.dataToHtml;\n this.infiniteScroll.compareFunction = (i, item) => i.name === item.name;\n this.infiniteScroll.setCustomData = (page = 0) => {\n return {\n data: this.transformedObjects.slice(page * this.size, page * this.size + this.size),\n page: page,\n size: this.size,\n totalPages: Math.round(this.transformedObjects.length / this.size),\n };\n };\n\n return fragment;\n }\n\n /**\n * Executes actions that occur after the component finishes its draw phase. Sets up event listeners for input clear\n * and infinite scroll item clicks, resets initialization state, and rebinds scroll-related events.\n * @returns {void} Does not return a value.\n */\n afterDraw() {\n this.syncAria();\n\n // udalost po vymazani inputu\n this.addEventListener('wje-input:clear', () => {\n this.clearIconsContainer(); // clear icons container\n this.infiniteScroll.scrollEvent(); // bind scroll event\n this.infiniteScroll.loadPages(0); // load first page\n });\n\n this.addEventListener('wje-infinite-scroll:click-item', (e) => {\n e.preventDefault();\n e.stopImmediatePropagation();\n\n this.selectIcon(e.detail.context.querySelector('wje-icon'));\n });\n\n this.init = false;\n }\n\n /**\n * Sync ARIA attributes on host.\n */\n syncAria() {\n if (!this.hasAttribute('role')) {\n this.setAriaState({ role: 'group' });\n }\n\n const ariaLabel = this.getAttribute('aria-label');\n const label = this.getAttribute('label');\n if (!ariaLabel && label) {\n this.setAriaState({ label });\n }\n }\n\n /**\n * Handles the selection of an icon from a given input element and updates the relevant properties and events.\n * @function selectIcon\n * @param {HTMLElement} icon The icon element that was selected. It must have a 'name' attribute and may optionally have a 'filled' attribute.\n * The function performs the following actions:\n * - Retrieves the name of the selected icon from its 'name' attribute.\n * - Determines the style type ('filled' or 'outline') based on the presence of the 'filled' attribute.\n * - Searches for a matching object in the `transformedObjects` array based on name and style.\n * - Creates a new `wje-icon` element and assigns its attributes based on the selected icon's properties.\n * - Updates the selected object's properties and assigns it to the `value`, `icon`, and `type` properties of the class.\n * - Dispatches a custom event (`wje-icon-picker:select`) to signal a change in the selected icon.\n */\n selectIcon = (icon) => {\n let name = icon.getAttribute('name');\n let stylesType = icon.hasAttribute('filled') ? 'filled' : 'outline';\n let uniqueObject = this.transformedObjects.find(\n (i) => i.name === name && Object.keys(i.styles)[0] === stylesType\n );\n\n const iconElement = document.createElement('wje-icon');\n iconElement.setAttribute('name', name);\n\n if (uniqueObject.styles?.hasOwnProperty('filled')) iconElement.setAttribute('filled', '');\n\n uniqueObject.icon = iconElement;\n\n this.value = uniqueObject;\n this.icon = uniqueObject.name;\n this.type = uniqueObject.styles?.hasOwnProperty('filled') ? 'filled' : 'outline';\n\n event.dispatchCustomEvent(this, 'wje-icon-picker:select', uniqueObject); // odpalenie custom eventu\n }\n\n /**\n * Initializes the component.\n */\n initial() {\n this.infiniteScroll.scrollEvent();\n }\n\n /**\n * Converts an object of tags into a transformed array of objects, separating `filled` and `outline` styles.\n * The function processes an input object containing tags, extracts its values,\n * and for each tag that has both `filled` and `outline` styles, splits them into\n * two separate objects. Tags without `filled` styles remain unchanged.\n * @param {object} tags The input object containing tags as properties. Each property is an object with a `styles` key.\n * @param {object} tags[].styles The styles object containing `filled` and/or `outline` styles.\n * @param {object} [tags[].styles.outline] The outline style object, if present.\n * @param {object} [tags[].styles.filled] The filled style object, if present.\n * @returns {Array<object>} An array of transformed objects. Objects with both `filled` and `outline` styles are split into separate objects, each containing only one style.\n * @example\n * const tags = {\n * hourglass: {\n * styles: {\n * outline: { ... },\n * filled: { ... },\n * }\n * },\n * clock: {\n * styles: {\n * outline: { ... },\n * }\n * }\n * };\n * const result = convertObject(tags);\n * console.log(result);\n * // [\n * // { styles: { outline: { ... } } },\n * // { styles: { filled: { ... } } },\n * // { styles: { outline: { ... } } }\n * // ]\n */\n convertObject = (tags = {}) => {\n let originalObjects = Object.values(tags);\n let transformedObjects = [];\n for (let i = 0; i < originalObjects.length; i++) {\n const obj = originalObjects[i];\n if (obj.styles.filled) {\n transformedObjects.push(\n { ...obj, styles: { outline: obj.styles.outline } },\n { ...obj, styles: { filled: obj.styles.filled } }\n );\n } else {\n transformedObjects.push(obj);\n }\n }\n\n return transformedObjects;\n };\n\n /**\n * Converts an icon data object into an HTML element structure.\n * This function creates a styled HTML element that represents an icon with a tooltip.\n * The tooltip displays the name of the icon, and the icon itself is styled based on\n * whether it uses the `filled` style.\n * @param {object} data The icon data object.\n * @returns {HTMLElement} A `div` element containing the icon wrapped in a `wje-tooltip`. The tooltip displays the icon name, and the `wje-icon` element represents the icon with attributes set according to the data.\n * @example\n * const iconData = {\n * name: \"hourglass\",\n * styles: {\n * filled: { ... }\n * }\n * };\n * const htmlElement = dataToHtml(iconData);\n * document.body.appendChild(htmlElement);\n *\n * // The resulting structure:\n * // <div class=\"icon-item\">\n * // <wje-tooltip content=\"hourglass\">\n * // <wje-icon name=\"hourglass\" size=\"large\" filled></wje-icon></wje-icon>\n * // </wje-tooltip>\n * // </div>\n */\n dataToHtml = (data) => {\n let iconItem = document.createElement('div');\n iconItem.classList.add('icon-item');\n\n let tooltip = document.createElement('wje-tooltip');\n tooltip.setAttribute('content', data.name);\n\n let icon = document.createElement('wje-icon');\n icon.setAttribute('name', data.name);\n icon.setAttribute('size', 'large');\n if (data.styles.hasOwnProperty('filled')) icon.setAttribute('filled', '');\n\n tooltip.appendChild(icon);\n iconItem.appendChild(tooltip);\n\n return iconItem;\n };\n\n /**\n * Gets the tags.\n * @returns {Promise<Array>} The tags of the component.\n */\n async getTags() {\n const response = await fetch(getBasePath('assets/tags.json'));\n return response.json();\n }\n\n /**\n * Called when the component is disconnected.\n */\n beforeDisconnect() {\n this.init = false;\n }\n\n /**\n * Searches icons based on user input.\n * This method handles the input event and filters the available icons based on the provided search string.\n * The filtering is performed on an index that combines icon names and their tags.\n * The results are then adjusted for infinite scrolling.\n * @param {Event} e The input event (e.g., `wje-input:input`) containing the search query details.\n */\n searchIcon = (e) => {\n const query = !e.detail?.value ? \"\" : e.detail.value.toLowerCase();\n const results = this.index.filter((item) => item.searchText.includes(query));\n\n if (results.length === 0) {\n this.clearIconsContainer();\n\n const noResultsDiv = document.createElement('div');\n noResultsDiv.setAttribute('part', 'no-results');\n noResultsDiv.classList.add('no-results');\n noResultsDiv.textContent = 'No icons found';\n\n this.infiniteScroll.querySelector('.icon-items').append(noResultsDiv);\n\n return;\n }\n\n this.infiniteScroll.unScrollEvent();\n this.infiniteScroll.setCustomData = (page = 0) => {\n const data = results.slice(page * this.size, page * this.size + this.size);\n\n return {\n data: data,\n page: page,\n size: this.size,\n totalPages: Math.ceil(results.length / this.size),\n };\n };\n\n this.infiniteScroll.reset();\n this.infiniteScroll.scrollEvent();\n this.infiniteScroll.loadPages(0);\n }\n\n /**\n * Clears the icons container.\n */\n clearIconsContainer() {\n this.context.querySelector('.icon-items').innerHTML = '';\n }\n\n /**\n * Creates a debounced version of the provided function that delays its execution\n * until after the specified delay has passed since the last time it was invoked.\n * @param {Function} fn The function to debounce.\n * @param {number} delay The delay duration in milliseconds.\n * @returns {Function} A new debounced function that delays the execution of the original function.\n */\n debounce(fn, delay) {\n let timeout;\n return (...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n };\n }\n}\n","import IconPicker from './icon-picker.element.js';\n\nexport default IconPicker;\n\nIconPicker.define('wje-icon-picker', IconPicker);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wje-icon-picker.js","sources":["../packages/wje-icon-picker/icon-picker.element.js","../packages/wje-icon-picker/icon-picker.js"],"sourcesContent":["import { default as WJElement, event } from '../wje-element/element.js';\nimport { getBasePath } from \"../utils/base-path.js\";\nimport InfiniteScroll from '../wje-infinite-scroll/infinite-scroll.js';\nimport Input from '../wje-input/input.js';\nimport Tooltip from '../wje-tooltip/tooltip.js';\nimport styles from './styles/styles.css?inline';\n\n/**\n * @summary This element allows users to pick an icon from a set of available options.\n * `IconPicker` is a custom web component that represents an interactive icon picker. It features\n * search functionality, infinite scrolling, and popup-based selection. The component is highly customizable\n * and integrates seamlessly with other `WJElement` components.\n * @documentation https://elements.webjet.sk/components/icon-picker\n * @status stable\n * @augments {WJElement}\n * @attribute {string} icon - The selected icon's name.\n * @attribute {number} size - The number of icons displayed per page in infinite scroll. Default is 60.\n * @csspart native - The native part of the component.\n * @csspart anchor - The part representing the anchor button displaying the selected icon.\n * @csspart picker - The picker part containing the search and icon selection interface.\n * @csspart input - The input part for searching icons.\n * @cssproperty [--wje-color-picker-value=#ff0000] - The default color value.\n * @cssproperty [--wje-color-picker-area=transparent] - The background color of the color picker area.\n * @cssproperty [--wje-color-picker-swatch=transparent] - The background color of the swatch picker.\n * @cssproperty [--wje-color-picker-size=1rem] - The size of the icons in the picker.\n * @cssproperty [--wje-color-picker-radius=4px] - The border radius of the picker.\n * @tag wje-icon-picker\n */\n\nexport default class IconPicker extends WJElement {\n /**\n * Creates an instance of IconPicker.\n * @class\n */\n constructor() {\n super();\n }\n\n /**\n * Dependencies of the IconPicker component.\n * @property {object} dependencies\n */\n dependencies = {\n 'wje-input': Input,\n 'wje-infinite-scroll': InfiniteScroll,\n 'wje-tooltip': Tooltip\n };\n\n /**\n * Setter for the markerPosition property.\n * @param {any} value The value to set.\n */\n set size(value) {\n this.setAttribute('size', value);\n }\n\n /**\n * Getter for the markerPosition property.\n * @returns {any} size The value of the markerPosition property.\n */\n get size() {\n return this.getAttribute('size') || 60;\n }\n\n /**\n * Setter for the value property.\n * @param value\n */\n set icon(value) {\n this.setAttribute('icon', value);\n }\n\n /**\n * Getter for the value property.\n * @returns {string}\n */\n get icon() {\n return this.getAttribute('icon');\n }\n\n /**\n * Setter for the value property.\n * @param value\n */\n set type(value) {\n this.setAttribute('type', value);\n }\n\n /**\n * Getter for the value property.\n * @returns {string}\n */\n get type() {\n return this.getAttribute('type');\n }\n\n className = 'IconPicker';\n\n /**\n * Returns the CSS styles for the component.\n * @static\n * @returns {CSSStyleSheet}\n */\n static get cssStyleSheet() {\n return styles;\n }\n\n /**\n * Returns the list of attributes to observe for changes.\n * @static\n * @returns {Array<string>}\n */\n static get observedAttributes() {\n return [];\n }\n\n /**\n * Sets up the attributes for the component.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n this.syncAria();\n }\n\n /**\n * Prepares data before the draw operation by fetching tags, transforming objects, and creating an index.\n * @returns {Promise<void>} Resolves when data preparation is complete.\n */\n async beforeDraw() {\n this.tags = Object.values(await this.getTags());\n\n this.transformedObjects = this.convertObject(this.tags);\n\n this.index = this.transformedObjects.map((item) => ({\n ...item,\n searchText: `${item.name.toLowerCase()} ${item.tags.join(' ').toLowerCase()}`,\n }));\n }\n\n /**\n * Draws and initializes the native color picker component on the DOM.\n * This method creates and appends the necessary elements, including input and infinite scroll components,\n * and sets their attributes and event listeners. It also provides custom data handling for infinite scrolling\n * and manages the way icons are displayed based on input.\n * @returns {DocumentFragment} A document fragment containing the fully constructed color picker component.\n */\n draw() {\n let fragment = document.createDocumentFragment();\n\n let native = document.createElement('div');\n native.classList.add('native-color-picker');\n\n if (this.hasAttribute('icon') && this.icon) {\n\n let icon = document.createElement('wje-icon');\n icon.setAttribute('name', this.icon);\n if(this.type === 'filled')\n icon.setAttribute('filled', '');\n\n this.selectIcon(icon);\n }\n\n // PICKER\n let picker = document.createElement('div');\n picker.classList.add('picker');\n\n let input = document.createElement('wje-input');\n input.classList.add('input');\n input.setAttribute('variant', 'standard');\n input.setAttribute('placeholder', 'type to filter...');\n input.setAttribute('clearable', '');\n input.addEventListener('wje-input:input', this.debounce(this.searchIcon.bind(this), 300));\n input.addEventListener('wje-input:clear', this.searchIcon);\n\n let infiniteScroll = new InfiniteScroll();\n infiniteScroll.setAttribute('url', getBasePath('assets/tags.json'));\n infiniteScroll.setAttribute('placement', '.icon-items');\n infiniteScroll.setAttribute('size', this.size);\n infiniteScroll.setAttribute('height', '223px');\n infiniteScroll.innerHTML = '<div class=\"icon-items\"></div>';\n\n // APPEND\n picker.append(input, infiniteScroll);\n\n native.append(picker);\n\n fragment.append(native);\n\n this.input = input;\n this.picker = picker;\n this.infiniteScroll = infiniteScroll;\n\n this.infiniteScroll.dataToHtml = this.dataToHtml;\n this.infiniteScroll.compareFunction = (i, item) => i.name === item.name;\n this.infiniteScroll.setCustomData = (page = 0) => {\n return {\n data: this.transformedObjects.slice(page * this.size, page * this.size + this.size),\n page: page,\n size: this.size,\n totalPages: Math.round(this.transformedObjects.length / this.size),\n };\n };\n\n return fragment;\n }\n\n /**\n * Executes actions that occur after the component finishes its draw phase. Sets up event listeners for input clear\n * and infinite scroll item clicks, resets initialization state, and rebinds scroll-related events.\n * @returns {void} Does not return a value.\n */\n afterDraw() {\n this.syncAria();\n\n // udalost po vymazani inputu\n this.addEventListener('wje-input:clear', () => {\n this.clearIconsContainer(); // clear icons container\n this.infiniteScroll.scrollEvent(); // bind scroll event\n this.infiniteScroll.loadPages(0); // load first page\n });\n\n this.addEventListener('wje-infinite-scroll:click-item', (e) => {\n e.preventDefault();\n e.stopImmediatePropagation();\n\n this.selectIcon(e.detail.context.querySelector('wje-icon'));\n });\n\n this.init = false;\n }\n\n /**\n * Sync ARIA attributes on host.\n */\n syncAria() {\n if (!this.hasAttribute('role')) {\n this.setAriaState({ role: 'group' });\n }\n\n const ariaLabel = this.getAttribute('aria-label');\n const label = this.getAttribute('label');\n if (!ariaLabel && label) {\n this.setAriaState({ label });\n }\n }\n\n /**\n * Handles the selection of an icon from a given input element and updates the relevant properties and events.\n * @function selectIcon\n * @param {HTMLElement} icon The icon element that was selected. It must have a 'name' attribute and may optionally have a 'filled' attribute.\n * The function performs the following actions:\n * - Retrieves the name of the selected icon from its 'name' attribute.\n * - Determines the style type ('filled' or 'outline') based on the presence of the 'filled' attribute.\n * - Searches for a matching object in the `transformedObjects` array based on name and style.\n * - Creates a new `wje-icon` element and assigns its attributes based on the selected icon's properties.\n * - Updates the selected object's properties and assigns it to the `value`, `icon`, and `type` properties of the class.\n * - Dispatches a custom event (`wje-icon-picker:select`) to signal a change in the selected icon.\n */\n selectIcon = (icon) => {\n let name = icon.getAttribute('name');\n let stylesType = icon.hasAttribute('filled') ? 'filled' : 'outline';\n let uniqueObject = this.transformedObjects.find(\n (i) => i.name === name && Object.keys(i.styles)[0] === stylesType\n );\n\n const iconElement = document.createElement('wje-icon');\n iconElement.setAttribute('name', name);\n\n if (uniqueObject.styles?.hasOwnProperty('filled')) iconElement.setAttribute('filled', '');\n\n uniqueObject.icon = iconElement;\n\n this.value = uniqueObject;\n this.icon = uniqueObject.name;\n this.type = uniqueObject.styles?.hasOwnProperty('filled') ? 'filled' : 'outline';\n\n event.dispatchCustomEvent(this, 'wje-icon-picker:select', uniqueObject); // odpalenie custom eventu\n }\n\n /**\n * Initializes the component.\n */\n initial() {\n this.infiniteScroll.scrollEvent();\n }\n\n /**\n * Converts an object of tags into a transformed array of objects, separating `filled` and `outline` styles.\n * The function processes an input object containing tags, extracts its values,\n * and for each tag that has both `filled` and `outline` styles, splits them into\n * two separate objects. Tags without `filled` styles remain unchanged.\n * @param {object} tags The input object containing tags as properties. Each property is an object with a `styles` key.\n * @param {object} tags[].styles The styles object containing `filled` and/or `outline` styles.\n * @param {object} [tags[].styles.outline] The outline style object, if present.\n * @param {object} [tags[].styles.filled] The filled style object, if present.\n * @returns {Array<object>} An array of transformed objects. Objects with both `filled` and `outline` styles are split into separate objects, each containing only one style.\n * @example\n * const tags = {\n * hourglass: {\n * styles: {\n * outline: { ... },\n * filled: { ... },\n * }\n * },\n * clock: {\n * styles: {\n * outline: { ... },\n * }\n * }\n * };\n * const result = convertObject(tags);\n * console.log(result);\n * // [\n * // { styles: { outline: { ... } } },\n * // { styles: { filled: { ... } } },\n * // { styles: { outline: { ... } } }\n * // ]\n */\n convertObject = (tags = {}) => {\n let originalObjects = Object.values(tags);\n let transformedObjects = [];\n for (let i = 0; i < originalObjects.length; i++) {\n const obj = originalObjects[i];\n if (obj.styles.filled) {\n transformedObjects.push(\n { ...obj, styles: { outline: obj.styles.outline } },\n { ...obj, styles: { filled: obj.styles.filled } }\n );\n } else {\n transformedObjects.push(obj);\n }\n }\n\n return transformedObjects;\n };\n\n /**\n * Converts an icon data object into an HTML element structure.\n * This function creates a styled HTML element that represents an icon with a tooltip.\n * The tooltip displays the name of the icon, and the icon itself is styled based on\n * whether it uses the `filled` style.\n * @param {object} data The icon data object.\n * @returns {HTMLElement} A `div` element containing the icon wrapped in a `wje-tooltip`. The tooltip displays the icon name, and the `wje-icon` element represents the icon with attributes set according to the data.\n * @example\n * const iconData = {\n * name: \"hourglass\",\n * styles: {\n * filled: { ... }\n * }\n * };\n * const htmlElement = dataToHtml(iconData);\n * document.body.appendChild(htmlElement);\n *\n * // The resulting structure:\n * // <div class=\"icon-item\">\n * // <wje-tooltip content=\"hourglass\">\n * // <wje-icon name=\"hourglass\" size=\"large\" filled></wje-icon></wje-icon>\n * // </wje-tooltip>\n * // </div>\n */\n dataToHtml = (data) => {\n let iconItem = document.createElement('div');\n iconItem.classList.add('icon-item');\n\n let tooltip = document.createElement('wje-tooltip');\n tooltip.setAttribute('content', data.name);\n\n let icon = document.createElement('wje-icon');\n icon.setAttribute('name', data.name);\n icon.setAttribute('size', 'large');\n if (data.styles.hasOwnProperty('filled')) icon.setAttribute('filled', '');\n\n tooltip.appendChild(icon);\n iconItem.appendChild(tooltip);\n\n return iconItem;\n };\n\n /**\n * Gets the tags.\n * @returns {Promise<Array>} The tags of the component.\n */\n async getTags() {\n const response = await fetch(getBasePath('assets/tags.json'));\n return response.json();\n }\n\n /**\n * Called when the component is disconnected.\n */\n beforeDisconnect() {\n this.init = false;\n }\n\n /**\n * Searches icons based on user input.\n * This method handles the input event and filters the available icons based on the provided search string.\n * The filtering is performed on an index that combines icon names and their tags.\n * The results are then adjusted for infinite scrolling.\n * @param {Event} e The input event (e.g., `wje-input:input`) containing the search query details.\n */\n searchIcon = (e) => {\n const query = !e.detail?.value ? \"\" : e.detail.value.toLowerCase();\n const results = this.index.filter((item) => item.searchText.includes(query));\n\n if (results.length === 0) {\n this.clearIconsContainer();\n\n const noResultsDiv = document.createElement('div');\n noResultsDiv.setAttribute('part', 'no-results');\n noResultsDiv.classList.add('no-results');\n noResultsDiv.textContent = 'No icons found';\n\n this.infiniteScroll.querySelector('.icon-items').append(noResultsDiv);\n\n return;\n }\n\n this.infiniteScroll.unScrollEvent();\n this.infiniteScroll.setCustomData = (page = 0) => {\n const data = results.slice(page * this.size, page * this.size + this.size);\n\n return {\n data: data,\n page: page,\n size: this.size,\n totalPages: Math.ceil(results.length / this.size),\n };\n };\n\n this.infiniteScroll.reset();\n this.infiniteScroll.scrollEvent();\n this.infiniteScroll.loadPages(0);\n }\n\n /**\n * Clears the icons container.\n */\n clearIconsContainer() {\n this.context.querySelector('.icon-items').innerHTML = '';\n }\n\n /**\n * Creates a debounced version of the provided function that delays its execution\n * until after the specified delay has passed since the last time it was invoked.\n * @param {Function} fn The function to debounce.\n * @param {number} delay The delay duration in milliseconds.\n * @returns {Function} A new debounced function that delays the execution of the original function.\n */\n debounce(fn, delay) {\n let timeout;\n return (...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n };\n }\n}\n","import IconPicker from './icon-picker.element.js';\n\nexport default IconPicker;\n\nIconPicker.define('wje-icon-picker', IconPicker);\n"],"names":["IconPicker","WJElement","constructor","super","dependencies","Input","InfiniteScroll","Tooltip","className","selectIcon","icon","name","getAttribute","stylesType","hasAttribute","uniqueObject","this","transformedObjects","find","i","Object","keys","styles","iconElement","document","createElement","setAttribute","hasOwnProperty","value","type","event","dispatchCustomEvent","convertObject","tags","originalObjects","values","length","obj","filled","push","outline","dataToHtml","data","iconItem","classList","add","tooltip","appendChild","searchIcon","e","query","detail","toLowerCase","results","index","filter","item","searchText","includes","clearIconsContainer","noResultsDiv","textContent","infiniteScroll","querySelector","append","unScrollEvent","setCustomData","page","slice","size","totalPages","Math","ceil","reset","scrollEvent","loadPages","cssStyleSheet","isShadowRoot","syncAria","beforeDraw","getTags","map","join","draw","fragment","createDocumentFragment","native","picker","input","addEventListener","debounce","bind","getBasePath","innerHTML","compareFunction","round","afterDraw","preventDefault","stopImmediatePropagation","context","init","setAriaState","role","ariaLabel","label","initial","fetch","json","fn","delay","timeout","args","clearTimeout","setTimeout","define"],"mappings":"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"}
|
package/dist/wje-icon.js
CHANGED