sf-multiselect-search 1.0.1

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 ADDED
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2019 Google LLC. All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # sf-multiselect-search
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Superflow.dev
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { LitElement, PropertyValueMap } from 'lit';
7
+ /**
8
+ * SfMultiselectSearch element.
9
+ * @fires renderComplete - When the list is populated
10
+ * @fires valueChanged - When the value is changed
11
+ * @property apiId - backend api id
12
+ * @property label - input label
13
+ * @property name - name of the input
14
+ * @property mode - mode of operation
15
+ * @property selectedId - id to preselect
16
+ * @property selectedValue - callback function
17
+ */
18
+ export declare class SfMultiselectSearch extends LitElement {
19
+ static styles: import("lit").CSSResult;
20
+ mode: string;
21
+ readonly: boolean;
22
+ listname: string;
23
+ listelements: string[];
24
+ listselection: {
25
+ [key: string]: boolean;
26
+ };
27
+ selectedValues: () => {
28
+ [key: string]: boolean;
29
+ };
30
+ dispatchValueChanged: () => void;
31
+ reorderArray<T>(arr: T[], oldIndex: number, newIndex: number): T[];
32
+ reorderMap(map: Map<string, any>, newOrder: string[]): Map<string, any>;
33
+ initListeners: () => void;
34
+ loadMode: () => Promise<void>;
35
+ protected firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
36
+ connectedCallback(): void;
37
+ render(): import("lit-html").TemplateResult<1>;
38
+ }
39
+ declare global {
40
+ interface HTMLElementTagNameMap {
41
+ }
42
+ }
43
+ //# sourceMappingURL=sf-multiselect-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sf-multiselect-search.d.ts","sourceRoot":"","sources":["../src/sf-multiselect-search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAa,gBAAgB,EAAE,MAAM,KAAK,CAAC;AAU9D;;;;;;;;;;GAUG;AACH,qBACa,WAAY,SAAQ,UAAU;IACzC,OAAgB,MAAM,0BAyGpB;IAIF,IAAI,SAAU;IAGd,QAAQ,UAAQ;IAGhB,QAAQ,SAAK;IAGb,YAAY,EAAE,MAAM,EAAE,CAAK;IAuB3B,aAAa,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAK;IAgB9C,cAAc;;MAOb;IACD,oBAAoB,aAQnB;IACD,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE;IAWlE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IASvE,aAAa,aAkDZ;IACD,QAAQ,sBAwDP;cAEkB,YAAY,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,IAAI;IAMnG,iBAAiB;IAGjB,MAAM;CA0BhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;KAC9B;CACF"}
@@ -0,0 +1,378 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Superflow.dev
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
7
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
8
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
10
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
11
+ };
12
+ import { LitElement, html, css } from 'lit';
13
+ import { customElement, property } from 'lit/decorators.js';
14
+ /*
15
+
16
+ Modes: multiselect, select
17
+ Flows: view,edit
18
+
19
+ */
20
+ /**
21
+ * SfMultiselectSearch element.
22
+ * @fires renderComplete - When the list is populated
23
+ * @fires valueChanged - When the value is changed
24
+ * @property apiId - backend api id
25
+ * @property label - input label
26
+ * @property name - name of the input
27
+ * @property mode - mode of operation
28
+ * @property selectedId - id to preselect
29
+ * @property selectedValue - callback function
30
+ */
31
+ let SfMultiselectSearch = class SfMultiselectSearch extends LitElement {
32
+ constructor() {
33
+ super(...arguments);
34
+ // mode = ""
35
+ this.mode = "admin";
36
+ this.readonly = false;
37
+ // readonly = true
38
+ this.listname = "";
39
+ this.listelements = [];
40
+ // listelements: { name: string }[] = [
41
+ // {
42
+ // "name": "Contract term 1"
43
+ // },
44
+ // {
45
+ // "name": "contract term 2"
46
+ // },
47
+ // {
48
+ // "name": "contract term 3"
49
+ // }
50
+ // ]
51
+ // listelements: { name: string }[] = [{"name": "Terms1"},{"name": "Terms2"}]
52
+ // listelements: { name: string }[] = [
53
+ // {
54
+ // "name": "item 1"
55
+ // },
56
+ // {
57
+ // "name": "item 2"
58
+ // }
59
+ // ]
60
+ this.listselection = {};
61
+ // listselection: { [key: string]: boolean } = {
62
+ // "Contract term 1": true,
63
+ // "contract term 2": true,
64
+ // "contract term 3": true
65
+ // }
66
+ // listselection: any = {
67
+ // "First term": true,
68
+ // "Second term": true
69
+ // }
70
+ // listselection: any = {
71
+ // "Check 1": true,
72
+ // "Check 2": false,
73
+ // "Check 3": true
74
+ // }
75
+ this.selectedValues = () => {
76
+ console.log('checklist selectedvalues', JSON.stringify(this.listselection));
77
+ let retObj = {};
78
+ for (let key of this.listelements) {
79
+ retObj[key] = this.listselection[key] ?? false;
80
+ }
81
+ return this.listselection;
82
+ };
83
+ this.dispatchValueChanged = () => {
84
+ console.log("dispatchValueChanged");
85
+ let customEvent = new CustomEvent('valueChanged', {
86
+ detail: { source: 'InnerElement', id: this.id },
87
+ bubbles: true,
88
+ composed: true
89
+ });
90
+ this.dispatchEvent(customEvent);
91
+ };
92
+ this.initListeners = () => {
93
+ let addButton = this.shadowRoot?.getElementById("add-button");
94
+ let addInput = this.shadowRoot?.getElementById("add-input");
95
+ addButton?.addEventListener("click", () => {
96
+ let newItem = addInput?.value;
97
+ if (newItem) {
98
+ // this.listelements.push({ name: newItem });
99
+ this.listselection[newItem] = false;
100
+ addInput.value = "";
101
+ this.dispatchValueChanged();
102
+ this.loadMode();
103
+ }
104
+ });
105
+ let deleteButtons = this.shadowRoot?.querySelectorAll('.button-delete');
106
+ for (let deleteButton of deleteButtons) {
107
+ deleteButton.addEventListener('click', () => {
108
+ let id = deleteButton.id;
109
+ let index = parseInt(id.split('-')[2]);
110
+ let listelement = this.listelements[index];
111
+ this.listelements.splice(index, 1);
112
+ delete this.listselection[listelement];
113
+ this.dispatchValueChanged();
114
+ this.loadMode();
115
+ });
116
+ }
117
+ let upButtons = this.shadowRoot?.querySelectorAll('.button-up');
118
+ for (let upButton of upButtons) {
119
+ upButton.addEventListener('click', () => {
120
+ let id = upButton.id;
121
+ let index = parseInt(id.split('-')[2]);
122
+ this.listelements = this.reorderArray(this.listelements, index, index - 1);
123
+ let newMap = this.reorderMap(new Map(Object.entries(this.listselection)), this.listelements);
124
+ this.listselection = Object.fromEntries(newMap);
125
+ this.dispatchValueChanged();
126
+ this.loadMode();
127
+ });
128
+ }
129
+ let downButtons = this.shadowRoot?.querySelectorAll('.button-down');
130
+ for (let downButton of downButtons) {
131
+ downButton.addEventListener('click', () => {
132
+ let id = downButton.id;
133
+ let index = parseInt(id.split('-')[2]);
134
+ this.listelements = this.reorderArray(this.listelements, index, index + 1);
135
+ let newMap = this.reorderMap(new Map(Object.entries(this.listselection)), this.listelements);
136
+ this.listselection = Object.fromEntries(newMap);
137
+ this.dispatchValueChanged();
138
+ this.loadMode();
139
+ });
140
+ }
141
+ };
142
+ this.loadMode = async () => {
143
+ console.log("loadMode", this.mode, this.listelements, this.listselection);
144
+ this.listelements = Object.keys(this.listselection);
145
+ if (this.mode == "admin") {
146
+ let checklistInputContainer = this.shadowRoot?.getElementById('checklist-input-container');
147
+ checklistInputContainer.style.display = this.readonly ? 'none' : 'flex';
148
+ let checklistList = this.shadowRoot?.getElementById("checklist-list");
149
+ let innerHTML = '';
150
+ if (Array.isArray(this.listelements)) {
151
+ this.listelements.map((item, index) => {
152
+ innerHTML += `
153
+ <div part="checklist-item" class="d-flex align-center">
154
+ <label part="checklist-checkbox-label">${(item ?? "")}</label>${!this.readonly && index > 0 ? `<button id="button-up-${index}" part="button-icon" class="mrl-5 material-symbols-outlined button-up">arrow_upward</button>` : ''}${!this.readonly && index < (this.listelements.length - 1) ? `<button id="button-down-${index}" part="button-icon" class="mrl-5 material-symbols-outlined button-down">arrow_downward</button>` : ''}${!this.readonly ? `<button id="button-delete-${index}" part="button-icon" class="mrl-5 material-icons button-delete">delete</button>` : ''}
155
+ </div>
156
+ `;
157
+ });
158
+ }
159
+ checklistList.innerHTML = innerHTML;
160
+ console.log("checklistList", checklistList.innerHTML);
161
+ if (!this.readonly) {
162
+ this.initListeners();
163
+ }
164
+ }
165
+ else {
166
+ let checklistList = this.shadowRoot?.getElementById("checklist-list");
167
+ let innerHTML = '';
168
+ if (Array.isArray(this.listelements)) {
169
+ this.listelements.map((item) => {
170
+ console.log('sf-multiselect-searcht rendering checkbox', this.listselection[(item ?? "")]);
171
+ innerHTML += `
172
+ <div part="checklist-item" class="d-flex">
173
+ <input part="checklist-checkbox" type="checkbox" id="checkbox-${(item ?? "").replace(/ /g, '-')}" name="${(item ?? "")}" value="${(item ?? "")}" ${(this.listselection[(item ?? "")] ?? false) ? "checked" : ""} ${this.readonly ? "disabled" : ""}/>
174
+ <label part="checklist-checkbox-label" for="checkbox-${(item ?? "").replace(/ /g, '-')}">${(item ?? "")}</label>
175
+ </div>
176
+ `;
177
+ });
178
+ }
179
+ checklistList.innerHTML = innerHTML;
180
+ for (const item of this.listelements) {
181
+ const checkbox = this.shadowRoot?.getElementById(`checkbox-${(item ?? "").replace(/ /g, '-')}`);
182
+ if (checkbox) {
183
+ checkbox.addEventListener('change', () => {
184
+ const name = item ?? "";
185
+ this.listselection = {
186
+ ...this.listselection,
187
+ [name]: checkbox.checked
188
+ };
189
+ console.log('checklist selected', this.listselection, typeof (this.listselection));
190
+ this.dispatchValueChanged();
191
+ });
192
+ }
193
+ if (this.listselection[(item ?? "")] == null) {
194
+ this.listselection[(item ?? "")] = false;
195
+ }
196
+ }
197
+ this.dispatchValueChanged();
198
+ }
199
+ };
200
+ }
201
+ reorderArray(arr, oldIndex, newIndex) {
202
+ if (oldIndex === newIndex) {
203
+ return arr;
204
+ }
205
+ const newArr = [...arr];
206
+ const [item] = newArr.splice(oldIndex, 1);
207
+ newArr.splice(newIndex, 0, item);
208
+ return newArr;
209
+ }
210
+ reorderMap(map, newOrder) {
211
+ const reordered = new Map();
212
+ for (const key of newOrder) {
213
+ if (map.has(key)) {
214
+ reordered.set(key, map.get(key));
215
+ }
216
+ }
217
+ return reordered;
218
+ }
219
+ firstUpdated(_changedProperties) {
220
+ this.loadMode();
221
+ }
222
+ connectedCallback() {
223
+ super.connectedCallback();
224
+ }
225
+ render() {
226
+ if (this.mode == "admin") {
227
+ return html `
228
+ <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
229
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0" />
230
+ <div part="checklist-container" class="d-flex flex-col">
231
+ ${this.listname != "" ? `<h2 part="checklist-title">${this.listname}</h2>` : ''}
232
+ <div id="checklist-input-container" part="checklist-input-container" class="d-flex">
233
+ <input part="checklist-add-input" type="text" id="add-input" name="add-input" value="" placeholder="Add new item" />
234
+ <button id="add-button" part="checklist-add-button" class="ml-10">Add</button>
235
+ </div>
236
+ <div id="checklist-list" part="checklist-list" class="d-flex flex-col flex-wrap justify-center w-100-m-0">
237
+ </div>
238
+ </div>
239
+ `;
240
+ }
241
+ else {
242
+ return html `
243
+ <div part="checklist-container" class="d-flex">
244
+ ${this.listname != "" ? `<h2 part="checklist-title">${this.listname}</h2>` : ''}
245
+ <div id="checklist-list" part="checklist-list" class="d-flex flex-col flex-wrap justify-center w-100-m-0">
246
+
247
+ </div>
248
+ </div>
249
+ `;
250
+ }
251
+ }
252
+ };
253
+ SfMultiselectSearch.styles = css `
254
+ :root {
255
+ --color: #fcc419;
256
+ --shadow: #f08c00;
257
+ --glare: hsl(0 0% 100% / 0.75);
258
+ --font-size: clamp(.75rem, 2vw, 1rem);
259
+ --transition: 0.2s;
260
+ }
261
+
262
+ * {
263
+ box-sizing: border-box;
264
+ }
265
+
266
+ .d-flex {
267
+ display: flex;
268
+ }
269
+
270
+ .flex-col {
271
+ flex-direction: column;
272
+ }
273
+
274
+ .flex-wrap {
275
+ flex-wrap: wrap;
276
+ }
277
+
278
+ .justify-center {
279
+ justify-content: center;
280
+ }
281
+
282
+ .justify-between {
283
+ justify-content: space-between;
284
+ }
285
+
286
+ .justify-end {
287
+ justify-content: flex-end;
288
+ }
289
+
290
+ .w-100-m-0 {
291
+ width: 100%;
292
+ }
293
+
294
+ .mb-20 {
295
+ margin-bottom: 20px;
296
+ }
297
+
298
+ .mt-20 {
299
+ margin-top: 20px;
300
+ }
301
+ .mr-10 {
302
+ margin-right: 10px;
303
+ }
304
+ .m-0 {
305
+ margin: 0px;
306
+ }
307
+
308
+ .m-20 {
309
+ margin: 20px;
310
+ }
311
+ .md-20-ml-10 {
312
+ margin-top: 20px;
313
+ margin-bottom: 20px;
314
+ margin-left: 10px;
315
+ margin-right: 10px;
316
+ }
317
+ .mrl-5 {
318
+ margin-left: 5px;
319
+ margin-right: 5px;
320
+ }
321
+ .mrl-10 {
322
+ margin-left: 10px;
323
+ margin-right: 10px;
324
+ }
325
+ .mt-10{
326
+ margin-top: 10px
327
+ }
328
+ .ml-10{
329
+ margin-left: 10px
330
+ }
331
+ .mr-20{
332
+ margin-right: 20px
333
+ }
334
+ .flex-grow {
335
+ flex-grow: 1;
336
+ }
337
+ .align-start {
338
+ align-items: flex-start;
339
+ }
340
+
341
+ .align-end {
342
+ align-items: flex-end;
343
+ }
344
+
345
+ .align-center {
346
+ align-items: center;
347
+ }
348
+ .align-stretch {
349
+ align-items: stretch;
350
+ }
351
+ body {
352
+ display: grid;
353
+ place-items: center;
354
+ min-height: 100vh;
355
+ font-family: 'Google Sans', sans-serif, system-ui;
356
+ }
357
+
358
+ `;
359
+ __decorate([
360
+ property({ type: String })
361
+ ], SfMultiselectSearch.prototype, "mode", void 0);
362
+ __decorate([
363
+ property({ type: Boolean })
364
+ ], SfMultiselectSearch.prototype, "readonly", void 0);
365
+ __decorate([
366
+ property()
367
+ ], SfMultiselectSearch.prototype, "listname", void 0);
368
+ __decorate([
369
+ property({ type: Array })
370
+ ], SfMultiselectSearch.prototype, "listelements", void 0);
371
+ __decorate([
372
+ property({ type: Object })
373
+ ], SfMultiselectSearch.prototype, "listselection", void 0);
374
+ SfMultiselectSearch = __decorate([
375
+ customElement('sf-multiselect-search')
376
+ ], SfMultiselectSearch);
377
+ export { SfMultiselectSearch };
378
+ //# sourceMappingURL=sf-multiselect-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sf-multiselect-search.js","sourceRoot":"","sources":["../src/sf-multiselect-search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;;;;;;AAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAoB,MAAM,KAAK,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;;;EAKE;AAEF;;;;;;;;;;GAUG;AAEH,IAAa,WAAW,GAAxB,MAAa,WAAY,SAAQ,UAAU;IAA3C;;QA8GE,AADA,YAAY;QACZ,SAAI,GAAG,OAAO,CAAA;QAGd,aAAQ,GAAG,KAAK,CAAA;QAChB,kBAAkB;QAElB,aAAQ,GAAG,EAAE,CAAA;QAGb,iBAAY,GAAa,EAAE,CAAA;QAC7B,yCAAyC;QACzC,QAAQ;QACR,oCAAoC;QACpC,SAAS;QACT,QAAQ;QACR,oCAAoC;QACpC,SAAS;QACT,QAAQ;QACR,oCAAoC;QACpC,QAAQ;QACR,IAAI;QACF,6EAA6E;QAC7E,yCAAyC;QACzC,QAAQ;QACR,2BAA2B;QAC3B,SAAS;QACT,QAAQ;QACR,2BAA2B;QAC3B,QAAQ;QACR,IAAI;QAGJ,kBAAa,GAA+B,EAAE,CAAA;QAChD,kDAAkD;QAClD,+BAA+B;QAC/B,+BAA+B;QAC/B,8BAA8B;QAC9B,IAAI;QACF,yBAAyB;QACzB,wBAAwB;QACxB,wBAAwB;QACxB,IAAI;QACJ,yBAAyB;QACzB,qBAAqB;QACrB,sBAAsB;QACtB,oBAAoB;QACpB,IAAI;QAEJ,mBAAc,GAAG,GAAG,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;YAC3E,IAAI,MAAM,GAA+B,EAAE,CAAA;YAC3C,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE;gBACjC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAK,KAAK,CAAA;aAChD;YACD,OAAO,IAAI,CAAC,aAAa,CAAA;QAC3B,CAAC,CAAA;QACD,yBAAoB,GAAG,GAAG,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,IAAI,WAAW,GAAG,IAAI,WAAW,CAAC,cAAc,EAAE;gBAChD,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;gBAC/C,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC,CAAA;QAqBD,kBAAa,GAAG,GAAG,EAAE;YACnB,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,YAAY,CAAsB,CAAC;YACnF,IAAI,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,WAAW,CAAqB,CAAC;YAChF,SAAS,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACxC,IAAI,OAAO,GAAG,QAAQ,EAAE,KAAK,CAAC;gBAC9B,IAAI,OAAO,EAAE;oBACX,6CAA6C;oBAC7C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;oBACpC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;oBACpB,IAAI,CAAC,oBAAoB,EAAE,CAAA;oBAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;iBACjB;YACH,CAAC,CAAC,CAAA;YAEF,IAAI,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,gBAAgB,CAAkC,CAAA;YACxG,KAAK,IAAI,YAAY,IAAI,aAAa,EAAE;gBACtC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBAC1C,IAAI,EAAE,GAAG,YAAY,CAAC,EAAE,CAAA;oBACxB,IAAI,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;oBACtC,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;oBAC1C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;oBAClC,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAA;oBACtC,IAAI,CAAC,oBAAoB,EAAE,CAAA;oBAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,CAAC,CAAC,CAAA;aACH;YACD,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAkC,CAAA;YAChG,KAAK,IAAI,QAAQ,IAAI,SAAS,EAAE;gBAC9B,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBACtC,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAA;oBACpB,IAAI,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;oBACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;oBAC1E,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;oBAC5F,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;oBAC/C,IAAI,CAAC,oBAAoB,EAAE,CAAA;oBAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,CAAC,CAAC,CAAA;aACH;YACD,IAAI,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,cAAc,CAAkC,CAAA;YACpG,KAAK,IAAI,UAAU,IAAI,WAAW,EAAE;gBAClC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBACxC,IAAI,EAAE,GAAG,UAAU,CAAC,EAAE,CAAA;oBACtB,IAAI,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;oBACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;oBAC1E,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;oBAC5F,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;oBAC/C,IAAI,CAAC,oBAAoB,EAAE,CAAA;oBAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,CAAC,CAAC,CAAA;aACH;QACH,CAAC,CAAA;QACD,aAAQ,GAAG,KAAK,IAAI,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1E,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YACnD,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,EAAE;gBACxB,IAAI,uBAAuB,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,2BAA2B,CAAmB,CAAA;gBAC5G,uBAAuB,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;gBACxE,IAAI,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,gBAAgB,CAAmB,CAAC;gBACxF,IAAI,SAAS,GAAG,EAAE,CAAA;gBAClB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;oBACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;wBACpC,SAAS,IAAI;;qDAE8B,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB,KAAK,8FAA8F,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B,KAAK,kGAAkG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,6BAA6B,KAAK,iFAAiF,CAAC,CAAC,CAAC,EAAE;;OAErjB,CAAA;oBAAA,CAAC,CAAC,CAAC;iBACH;gBACD,aAAa,CAAC,SAAS,GAAG,SAAS,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;gBACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;oBAClB,IAAI,CAAC,aAAa,EAAE,CAAC;iBACtB;aACF;iBAAM;gBACL,IAAI,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,gBAAgB,CAAmB,CAAC;gBACxF,IAAI,SAAS,GAAG,EAAE,CAAA;gBAClB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;oBACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;wBAC7B,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;wBACjF,SAAS,IAAI;;4EAEqD,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;mEAC3L,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;;SAE1G,CAAA;oBAAA,CAAC,CAAC,CAAC;iBACL;gBACD,aAAa,CAAC,SAAS,GAAG,SAAS,CAAC;gBAEpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE;oBACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAqB,CAAC;oBACpH,IAAI,QAAQ,EAAE;wBACZ,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;4BACvC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;4BACxB,IAAI,CAAC,aAAa,GAAG;gCACnB,GAAG,IAAI,CAAC,aAAa;gCACrB,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO;6BACzB,CAAC;4BACF,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;4BACnF,IAAI,CAAC,oBAAoB,EAAE,CAAA;wBAC7B,CAAC,CAAC,CAAC;qBACJ;oBACD,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;wBAC5C,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;qBAC1C;iBACF;gBAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;aAC7B;QACH,CAAC,CAAA;IAqCH,CAAC;IApKC,YAAY,CAAI,GAAQ,EAAE,QAAgB,EAAE,QAAgB;QAC1D,IAAI,QAAQ,KAAK,QAAQ,EAAE;YACzB,OAAO,GAAG,CAAC;SACZ;QAED,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAEjC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,UAAU,CAAC,GAAqB,EAAE,QAAkB;QAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAe,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAChB,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;aAClC;SACF;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IA8GkB,YAAY,CAAC,kBAAqE;QAEnG,IAAI,CAAC,QAAQ,EAAE,CAAC;IAElB,CAAC;IAEQ,iBAAiB;QACxB,KAAK,CAAC,iBAAiB,EAAE,CAAA;IAC3B,CAAC;IACQ,MAAM;QACb,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,EAAE;YACxB,OAAO,IAAI,CAAA;;;;UAIP,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,8BAA8B,IAAI,CAAC,QAAQ,OAAO,CAAC,CAAC,CAAC,EAAE;;;;;;;;KAQlF,CAAC;SACD;aAAM;YACL,OAAO,IAAI,CAAA;;QAET,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,8BAA8B,IAAI,CAAC,QAAQ,OAAO,CAAC,CAAC,CAAC,EAAE;;;;;KAKhF,CAAC;SACD;IACH,CAAC;CACF,CAAA;AAlViB,kBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyG1B,CAAA;AAIF;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yCAEb;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;6CACZ;AAGhB;IADC,QAAQ,EAAE;6CACE;AAGb;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;iDACC;AAuB3B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDACmB;AA9InC,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CAmVvB;SAnVY,WAAW","sourcesContent":["/**\n * @license\n * Copyright 2022 Superflow.dev\n * SPDX-License-Identifier: MIT\n */\n\nimport { LitElement, html, css, PropertyValueMap } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n/*\n\nModes: multiselect, select\nFlows: view,edit\n\n*/\n\n/**\n * SfMultiselectSearch element.\n * @fires renderComplete - When the list is populated\n * @fires valueChanged - When the value is changed\n * @property apiId - backend api id\n * @property label - input label\n * @property name - name of the input\n * @property mode - mode of operation\n * @property selectedId - id to preselect\n * @property selectedValue - callback function\n */\n@customElement('sf-multiselect-search')\nexport class SfMultiselectSearch extends LitElement {\n static override styles = css`\n :root {\n --color: #fcc419;\n --shadow: #f08c00;\n --glare: hsl(0 0% 100% / 0.75);\n --font-size: clamp(.75rem, 2vw, 1rem);\n --transition: 0.2s;\n }\n\n * {\n box-sizing: border-box;\n }\n\n .d-flex {\n display: flex;\n }\n\n .flex-col {\n flex-direction: column;\n }\n\n .flex-wrap {\n flex-wrap: wrap;\n }\n\n .justify-center {\n justify-content: center;\n }\n\n .justify-between {\n justify-content: space-between;\n }\n\n .justify-end {\n justify-content: flex-end;\n }\n\n .w-100-m-0 {\n width: 100%;\n }\n \n .mb-20 {\n margin-bottom: 20px;\n }\n \n .mt-20 {\n margin-top: 20px;\n }\n .mr-10 {\n margin-right: 10px;\n }\n .m-0 {\n margin: 0px;\n }\n\n .m-20 {\n margin: 20px;\n }\n .md-20-ml-10 {\n margin-top: 20px;\n margin-bottom: 20px;\n margin-left: 10px;\n margin-right: 10px;\n }\n .mrl-5 {\n margin-left: 5px;\n margin-right: 5px;\n }\n .mrl-10 {\n margin-left: 10px;\n margin-right: 10px;\n }\n .mt-10{\n margin-top: 10px\n }\n .ml-10{\n margin-left: 10px\n }\n .mr-20{\n margin-right: 20px\n }\n .flex-grow {\n flex-grow: 1;\n }\n .align-start {\n align-items: flex-start;\n }\n\n .align-end {\n align-items: flex-end;\n }\n\n .align-center {\n align-items: center;\n }\n .align-stretch {\n align-items: stretch;\n }\n body {\n display: grid;\n place-items: center;\n min-height: 100vh;\n font-family: 'Google Sans', sans-serif, system-ui;\n }\n\n `;\n\n @property({ type: String })\n // mode = \"\"\n mode = \"admin\"\n\n @property({ type: Boolean })\n readonly = false\n // readonly = true\n @property()\n listname = \"\"\n\n @property({ type: Array })\n listelements: string[] = []\n// listelements: { name: string }[] = [\n// {\n// \"name\": \"Contract term 1\"\n// },\n// {\n// \"name\": \"contract term 2\"\n// },\n// {\n// \"name\": \"contract term 3\"\n// }\n// ]\n // listelements: { name: string }[] = [{\"name\": \"Terms1\"},{\"name\": \"Terms2\"}]\n // listelements: { name: string }[] = [\n // {\n // \"name\": \"item 1\"\n // },\n // {\n // \"name\": \"item 2\"\n // }\n // ]\n\n @property({ type: Object })\n listselection: { [key: string]: boolean } = {}\n// listselection: { [key: string]: boolean } = {\n// \"Contract term 1\": true,\n// \"contract term 2\": true,\n// \"contract term 3\": true\n// }\n // listselection: any = {\n // \"First term\": true,\n // \"Second term\": true\n // }\n // listselection: any = {\n // \"Check 1\": true,\n // \"Check 2\": false,\n // \"Check 3\": true\n // }\n\n selectedValues = () => {\n console.log('checklist selectedvalues', JSON.stringify(this.listselection))\n let retObj: { [key: string]: boolean } = {}\n for (let key of this.listelements) {\n retObj[key] = this.listselection[key] ?? false\n }\n return this.listselection\n }\n dispatchValueChanged = () => {\n console.log(\"dispatchValueChanged\");\n let customEvent = new CustomEvent('valueChanged', {\n detail: { source: 'InnerElement', id: this.id },\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(customEvent);\n }\n reorderArray<T>(arr: T[], oldIndex: number, newIndex: number): T[] {\n if (oldIndex === newIndex) {\n return arr;\n }\n\n const newArr = [...arr];\n const [item] = newArr.splice(oldIndex, 1);\n newArr.splice(newIndex, 0, item);\n\n return newArr;\n }\n reorderMap(map: Map<string, any>, newOrder: string[]): Map<string, any> {\n const reordered = new Map<string, any>();\n for (const key of newOrder) {\n if (map.has(key)) {\n reordered.set(key, map.get(key));\n }\n }\n return reordered;\n }\n initListeners = () => {\n let addButton = this.shadowRoot?.getElementById(\"add-button\") as HTMLButtonElement;\n let addInput = this.shadowRoot?.getElementById(\"add-input\") as HTMLInputElement;\n addButton?.addEventListener(\"click\", () => {\n let newItem = addInput?.value;\n if (newItem) {\n // this.listelements.push({ name: newItem });\n this.listselection[newItem] = false;\n addInput.value = \"\";\n this.dispatchValueChanged()\n this.loadMode();\n }\n })\n\n let deleteButtons = this.shadowRoot?.querySelectorAll('.button-delete') as NodeListOf<HTMLButtonElement>\n for (let deleteButton of deleteButtons) {\n deleteButton.addEventListener('click', () => {\n let id = deleteButton.id\n let index = parseInt(id.split('-')[2])\n let listelement = this.listelements[index]\n this.listelements.splice(index, 1)\n delete this.listselection[listelement]\n this.dispatchValueChanged()\n this.loadMode();\n })\n }\n let upButtons = this.shadowRoot?.querySelectorAll('.button-up') as NodeListOf<HTMLButtonElement>\n for (let upButton of upButtons) {\n upButton.addEventListener('click', () => {\n let id = upButton.id\n let index = parseInt(id.split('-')[2])\n this.listelements = this.reorderArray(this.listelements, index, index - 1)\n let newMap = this.reorderMap(new Map(Object.entries(this.listselection)), this.listelements)\n this.listselection = Object.fromEntries(newMap)\n this.dispatchValueChanged()\n this.loadMode();\n })\n }\n let downButtons = this.shadowRoot?.querySelectorAll('.button-down') as NodeListOf<HTMLButtonElement>\n for (let downButton of downButtons) {\n downButton.addEventListener('click', () => {\n let id = downButton.id\n let index = parseInt(id.split('-')[2])\n this.listelements = this.reorderArray(this.listelements, index, index + 1)\n let newMap = this.reorderMap(new Map(Object.entries(this.listselection)), this.listelements)\n this.listselection = Object.fromEntries(newMap)\n this.dispatchValueChanged()\n this.loadMode();\n })\n }\n }\n loadMode = async () => {\n console.log(\"loadMode\", this.mode, this.listelements, this.listselection);\n this.listelements = Object.keys(this.listselection)\n if (this.mode == \"admin\") {\n let checklistInputContainer = this.shadowRoot?.getElementById('checklist-input-container') as HTMLDivElement\n checklistInputContainer.style.display = this.readonly ? 'none' : 'flex';\n let checklistList = this.shadowRoot?.getElementById(\"checklist-list\") as HTMLDivElement;\n let innerHTML = ''\n if (Array.isArray(this.listelements)) {\n this.listelements.map((item, index) => {\n innerHTML += `\n <div part=\"checklist-item\" class=\"d-flex align-center\">\n <label part=\"checklist-checkbox-label\">${(item ?? \"\")}</label>${!this.readonly && index > 0 ? `<button id=\"button-up-${index}\" part=\"button-icon\" class=\"mrl-5 material-symbols-outlined button-up\">arrow_upward</button>` : ''}${!this.readonly && index < (this.listelements.length - 1) ? `<button id=\"button-down-${index}\" part=\"button-icon\" class=\"mrl-5 material-symbols-outlined button-down\">arrow_downward</button>` : ''}${!this.readonly ? `<button id=\"button-delete-${index}\" part=\"button-icon\" class=\"mrl-5 material-icons button-delete\">delete</button>` : ''}\n </div>\n `});\n }\n checklistList.innerHTML = innerHTML;\n console.log(\"checklistList\", checklistList.innerHTML);\n if (!this.readonly) {\n this.initListeners();\n }\n } else {\n let checklistList = this.shadowRoot?.getElementById(\"checklist-list\") as HTMLDivElement;\n let innerHTML = ''\n if (Array.isArray(this.listelements)) {\n this.listelements.map((item) => {\n console.log('sf-multiselect-searcht rendering checkbox', this.listselection[(item ?? \"\")])\n innerHTML += `\n <div part=\"checklist-item\" class=\"d-flex\">\n <input part=\"checklist-checkbox\" type=\"checkbox\" id=\"checkbox-${(item ?? \"\").replace(/ /g, '-')}\" name=\"${(item ?? \"\")}\" value=\"${(item ?? \"\")}\" ${(this.listselection[(item ?? \"\")] ?? false) ? \"checked\" : \"\"} ${this.readonly ? \"disabled\" : \"\"}/>\n <label part=\"checklist-checkbox-label\" for=\"checkbox-${(item ?? \"\").replace(/ /g, '-')}\">${(item ?? \"\")}</label>\n </div>\n `});\n }\n checklistList.innerHTML = innerHTML;\n\n for (const item of this.listelements) {\n const checkbox = this.shadowRoot?.getElementById(`checkbox-${(item ?? \"\").replace(/ /g, '-')}`) as HTMLInputElement;\n if (checkbox) {\n checkbox.addEventListener('change', () => {\n const name = item ?? \"\";\n this.listselection = {\n ...this.listselection,\n [name]: checkbox.checked\n };\n console.log('checklist selected', this.listselection, typeof (this.listselection));\n this.dispatchValueChanged()\n });\n }\n if (this.listselection[(item ?? \"\")] == null) {\n this.listselection[(item ?? \"\")] = false;\n }\n }\n\n this.dispatchValueChanged();\n }\n }\n\n protected override firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n\n this.loadMode();\n\n }\n\n override connectedCallback() {\n super.connectedCallback()\n }\n override render() {\n if (this.mode == \"admin\") {\n return html`\n <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0\" />\n <div part=\"checklist-container\" class=\"d-flex flex-col\"> \n ${this.listname != \"\" ? `<h2 part=\"checklist-title\">${this.listname}</h2>` : ''}\n <div id=\"checklist-input-container\" part=\"checklist-input-container\" class=\"d-flex\">\n <input part=\"checklist-add-input\" type=\"text\" id=\"add-input\" name=\"add-input\" value=\"\" placeholder=\"Add new item\" />\n <button id=\"add-button\" part=\"checklist-add-button\" class=\"ml-10\">Add</button>\n </div>\n <div id=\"checklist-list\" part=\"checklist-list\" class=\"d-flex flex-col flex-wrap justify-center w-100-m-0\">\n </div>\n </div>\n `;\n } else {\n return html`\n <div part=\"checklist-container\" class=\"d-flex\"> \n ${this.listname != \"\" ? `<h2 part=\"checklist-title\">${this.listname}</h2>` : ''}\n <div id=\"checklist-list\" part=\"checklist-list\" class=\"d-flex flex-col flex-wrap justify-center w-100-m-0\">\n \n </div>\n </div>\n `;\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n }\n}\n"]}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Superflow.dev
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { LitElement, PropertyValueMap } from 'lit';
7
+ /**
8
+ * SfMultiselectSearch element.
9
+ * @fires renderComplete - When the list is populated
10
+ * @fires valueChanged - When the value is changed
11
+ * @property apiId - backend api id
12
+ * @property label - input label
13
+ * @property name - name of the input
14
+ * @property mode - mode of operation
15
+ * @property selectedId - id to preselect
16
+ * @property selectedValue - callback function
17
+ */
18
+ export declare class SfMultiselectSearch extends LitElement {
19
+ static styles: import("lit").CSSResult;
20
+ mode: string;
21
+ readonly: boolean;
22
+ listname: string;
23
+ listelements: {
24
+ name: string;
25
+ id: string;
26
+ }[];
27
+ listselection: {
28
+ [key: string]: boolean;
29
+ };
30
+ selectedValues: () => {
31
+ [key: string]: boolean;
32
+ };
33
+ dispatchValueChanged: () => void;
34
+ initListeners: () => void;
35
+ populateSelectedList: () => void;
36
+ populateList: () => void;
37
+ loadMode: () => Promise<void>;
38
+ protected firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
39
+ connectedCallback(): void;
40
+ render(): import("lit-html").TemplateResult<1>;
41
+ }
42
+ declare global {
43
+ interface HTMLElementTagNameMap {
44
+ }
45
+ }
46
+ //# sourceMappingURL=sf-multiselect-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sf-multiselect-search.d.ts","sourceRoot":"","sources":["../src/sf-multiselect-search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAa,gBAAgB,EAAE,MAAM,KAAK,CAAC;AAU9D;;;;;;;;;;GAUG;AACH,qBACa,mBAAoB,SAAQ,UAAU;IACjD,OAAgB,MAAM,0BA8GpB;IAIF,IAAI,SAAU;IAGd,QAAQ,UAAQ;IAGhB,QAAQ,SAAK;IAIb,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAa3C;IAYD,aAAa,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAK;IAgB9C,cAAc;;MASb;IACD,oBAAoB,aAUnB;IAED,aAAa,aA6BZ;IAED,oBAAoB,aAsCnB;IAED,YAAY,aAyCX;IAED,QAAQ,sBAOP;cAEkB,YAAY,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,IAAI;IAMnG,iBAAiB;IAGjB,MAAM;CAehB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;KAC9B;CACF"}
@@ -0,0 +1,367 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Superflow.dev
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
7
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
8
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
10
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
11
+ };
12
+ import { LitElement, html, css } from 'lit';
13
+ import { customElement, property } from 'lit/decorators.js';
14
+ /*
15
+
16
+ Modes: multiselect, select
17
+ Flows: view,edit
18
+
19
+ */
20
+ /**
21
+ * SfMultiselectSearch element.
22
+ * @fires renderComplete - When the list is populated
23
+ * @fires valueChanged - When the value is changed
24
+ * @property apiId - backend api id
25
+ * @property label - input label
26
+ * @property name - name of the input
27
+ * @property mode - mode of operation
28
+ * @property selectedId - id to preselect
29
+ * @property selectedValue - callback function
30
+ */
31
+ let SfMultiselectSearch = class SfMultiselectSearch extends LitElement {
32
+ constructor() {
33
+ super(...arguments);
34
+ // mode = ""
35
+ this.mode = "admin";
36
+ this.readonly = false;
37
+ // readonly = true
38
+ this.listname = "";
39
+ // listelements: string[] = []
40
+ this.listelements = [
41
+ {
42
+ "name": "Contract term 1",
43
+ "id": "ct1"
44
+ },
45
+ {
46
+ "name": "contract term 2",
47
+ "id": "ct2"
48
+ },
49
+ {
50
+ "name": "contract term 3",
51
+ "id": "ct3"
52
+ }
53
+ ];
54
+ // listelements: { name: string }[] = [{"name": "Terms1"},{"name": "Terms2"}]
55
+ // listelements: { name: string }[] = [
56
+ // {
57
+ // "name": "item 1"
58
+ // },
59
+ // {
60
+ // "name": "item 2"
61
+ // }
62
+ // ]
63
+ this.listselection = {};
64
+ // listselection: { [key: string]: boolean } = {
65
+ // "Contract term 1": true,
66
+ // "contract term 2": true,
67
+ // "contract term 3": true
68
+ // }
69
+ // listselection: any = {
70
+ // "First term": true,
71
+ // "Second term": true
72
+ // }
73
+ // listselection: any = {
74
+ // "Check 1": true,
75
+ // "Check 2": false,
76
+ // "Check 3": true
77
+ // }
78
+ this.selectedValues = () => {
79
+ console.log('multiselect selectedvalues', JSON.stringify(this.listselection));
80
+ let retObj = {};
81
+ for (let key of this.listelements) {
82
+ if (this.listselection[key.id] == null && this.listselection[key.id] !== false) {
83
+ retObj[key.id] = this.listselection[key.id];
84
+ }
85
+ }
86
+ return retObj;
87
+ };
88
+ this.dispatchValueChanged = () => {
89
+ console.log("dispatchValueChanged");
90
+ this.populateSelectedList();
91
+ let customEvent = new CustomEvent('valueChanged', {
92
+ detail: { source: 'InnerElement', id: this.id },
93
+ bubbles: true,
94
+ composed: true
95
+ });
96
+ this.dispatchEvent(customEvent);
97
+ };
98
+ this.initListeners = () => {
99
+ let dropDownButton = this.shadowRoot?.getElementById("dropdown-button");
100
+ console.log("dropdownButton", dropDownButton.innerHTML);
101
+ dropDownButton.addEventListener('click', (e) => {
102
+ let multiselectList = this.shadowRoot?.getElementById("select-list");
103
+ console.log("checklistList", multiselectList.classList);
104
+ let button = e.target;
105
+ if (button.innerHTML === "keyboard_arrow_down") {
106
+ multiselectList.classList.remove("hide");
107
+ button.innerHTML = "keyboard_arrow_up";
108
+ }
109
+ else {
110
+ multiselectList.classList.add("hide");
111
+ button.innerHTML = "keyboard_arrow_down";
112
+ }
113
+ });
114
+ let searchInput = this.shadowRoot?.getElementById("search-input");
115
+ searchInput.addEventListener('input', (e) => {
116
+ this.populateList();
117
+ let searchInput = e.target;
118
+ let filterText = searchInput.value.toLowerCase();
119
+ if (filterText !== "") {
120
+ let multiselectList = this.shadowRoot?.getElementById("select-list");
121
+ multiselectList.classList.remove("hide");
122
+ let dropdownButton = this.shadowRoot?.getElementById("dropdown-button");
123
+ dropdownButton.innerHTML = "keyboard_arrow_up";
124
+ }
125
+ });
126
+ };
127
+ this.populateSelectedList = () => {
128
+ let searchInput = this.shadowRoot?.getElementById("search-input");
129
+ let filterText = searchInput.value.toLowerCase();
130
+ console.log("populateSelectedList", this.listelements, filterText);
131
+ let selectedList = this.shadowRoot?.getElementById("selected-list");
132
+ let innerHTML = '';
133
+ if (Array.isArray(this.listelements)) {
134
+ this.listelements.map((item) => {
135
+ console.log('sf-multiselect-searcht rendering checkbox', this.listselection[(item.id ?? "")]);
136
+ if (this.listselection[(item.id ?? "")] !== true) {
137
+ return;
138
+ }
139
+ innerHTML += `
140
+ <div part="selected-item" class="d-flex align-center mr-10">
141
+ <span id="selected-delete-${(item.id ?? "").replace(/ /g, '-')}" class="material-icons" part="selected-unselect">cancel</span>
142
+ <label part="selected-label" id="selected-label-${(item.id ?? "").replace(/ /g, '-')}">${(item.name ?? "")}</label>
143
+ </div>
144
+ `;
145
+ });
146
+ }
147
+ selectedList.innerHTML = innerHTML;
148
+ for (const item of this.listelements) {
149
+ const deleteSpan = this.shadowRoot?.getElementById(`selected-delete-${(item.id ?? "").replace(/ /g, '-')}`);
150
+ if (deleteSpan != null) {
151
+ deleteSpan.addEventListener('click', () => {
152
+ const id = item.id ?? "";
153
+ delete this.listselection[id];
154
+ this.populateSelectedList();
155
+ });
156
+ }
157
+ const selectedLabel = this.shadowRoot?.getElementById(`selected-label-${(item.id ?? "").replace(/ /g, '-')}`);
158
+ if (selectedLabel != null) {
159
+ selectedLabel.addEventListener('click', () => {
160
+ const id = item.id ?? "";
161
+ delete this.listselection[id];
162
+ this.populateSelectedList();
163
+ });
164
+ }
165
+ }
166
+ };
167
+ this.populateList = () => {
168
+ let searchInput = this.shadowRoot?.getElementById("search-input");
169
+ let filterText = searchInput.value.toLowerCase();
170
+ console.log("populateList", this.listelements, filterText);
171
+ let miltiselectList = this.shadowRoot?.getElementById("select-list");
172
+ let innerHTML = '';
173
+ if (Array.isArray(this.listelements)) {
174
+ this.listelements.map((item) => {
175
+ console.log('sf-multiselect-searcht rendering checkbox', this.listselection[(item.id ?? "")]);
176
+ if (filterText !== "" && !(item.name ?? "").toLowerCase().includes(filterText)) {
177
+ return;
178
+ }
179
+ innerHTML += `
180
+ <div part="multiselect-item" class="d-flex">
181
+ <input part="multiselect-checkbox" type="checkbox" id="checkbox-${(item.id ?? "").replace(/ /g, '-')}" name="${(item.name ?? "")}" value="${(item.id ?? "")}" ${(this.listselection[(item.id ?? "")] ?? false) ? "checked" : ""} ${this.readonly ? "disabled" : ""}/>
182
+ <label part="multiselect-checkbox-label" for="checkbox-${(item.id ?? "").replace(/ /g, '-')}">${(item.name ?? "")}</label>
183
+ </div>
184
+ `;
185
+ });
186
+ }
187
+ miltiselectList.innerHTML = innerHTML;
188
+ for (const item of this.listelements) {
189
+ const checkbox = this.shadowRoot?.getElementById(`checkbox-${(item.id ?? "").replace(/ /g, '-')}`);
190
+ if (checkbox) {
191
+ checkbox.addEventListener('change', () => {
192
+ const id = item.id ?? "";
193
+ this.listselection = {
194
+ ...this.listselection,
195
+ [id]: checkbox.checked
196
+ };
197
+ console.log('checklist selected', this.listselection, typeof (this.listselection));
198
+ this.dispatchValueChanged();
199
+ let multiselectList = this.shadowRoot?.getElementById("select-list");
200
+ multiselectList.classList.add("hide");
201
+ let dropdownButton = this.shadowRoot?.getElementById("dropdown-button");
202
+ dropdownButton.innerHTML = "keyboard_arrow_down";
203
+ });
204
+ }
205
+ }
206
+ };
207
+ this.loadMode = async () => {
208
+ console.log("loadMode", this.mode, this.listelements, this.listselection);
209
+ // this.listelements = Object.keys(this.listselection)
210
+ this.populateList();
211
+ this.dispatchValueChanged();
212
+ this.initListeners();
213
+ };
214
+ }
215
+ firstUpdated(_changedProperties) {
216
+ this.loadMode();
217
+ }
218
+ connectedCallback() {
219
+ super.connectedCallback();
220
+ }
221
+ render() {
222
+ return html `
223
+ <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
224
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0" />
225
+ <div part="multiselect-container" class="d-flex flex-col align-stretch">
226
+ ${this.listname != "" ? `<h2 part="multiselect-title">${this.listname}</h2>` : ''}
227
+ <div id="multiselect-input-container" part="multiselect-input-container" class="d-flex">
228
+ <input part="input" type="text" id="search-input" name="search-input" class="flex-grow" value="" placeholder="Search"/>
229
+ <button id="dropdown-button" part="button-icon" class="material-icons">keyboard_arrow_down</button>
230
+ </div>
231
+ <div id="select-list" part="select-list" class="hide d-flex flex-col flex-wrap justify-center"></div>
232
+ </div>
233
+ <div id="selected-list" part="selected-list" class="d-flex flex-wrap"></div>
234
+ `;
235
+ }
236
+ };
237
+ SfMultiselectSearch.styles = css `
238
+ :root {
239
+ --color: #fcc419;
240
+ --shadow: #f08c00;
241
+ --glare: hsl(0 0% 100% / 0.75);
242
+ --font-size: clamp(.75rem, 2vw, 1rem);
243
+ --transition: 0.2s;
244
+ }
245
+
246
+ * {
247
+ box-sizing: border-box;
248
+ }
249
+
250
+ .d-flex {
251
+ display: flex;
252
+ }
253
+
254
+ .flex-col {
255
+ flex-direction: column;
256
+ }
257
+
258
+ .flex-wrap {
259
+ flex-wrap: wrap;
260
+ }
261
+
262
+ .justify-center {
263
+ justify-content: center;
264
+ }
265
+
266
+ .justify-between {
267
+ justify-content: space-between;
268
+ }
269
+
270
+ .justify-end {
271
+ justify-content: flex-end;
272
+ }
273
+
274
+ .w-100-m-0 {
275
+ width: 100%;
276
+ }
277
+
278
+ .mb-20 {
279
+ margin-bottom: 20px;
280
+ }
281
+
282
+ .mt-20 {
283
+ margin-top: 20px;
284
+ }
285
+ .mr-10 {
286
+ margin-right: 10px;
287
+ }
288
+ .mr-5 {
289
+ margin-right: 5px;
290
+ }
291
+ .m-0 {
292
+ margin: 0px;
293
+ }
294
+
295
+ .m-20 {
296
+ margin: 20px;
297
+ }
298
+ .md-20-ml-10 {
299
+ margin-top: 20px;
300
+ margin-bottom: 20px;
301
+ margin-left: 10px;
302
+ margin-right: 10px;
303
+ }
304
+ .mrl-5 {
305
+ margin-left: 5px;
306
+ margin-right: 5px;
307
+ }
308
+ .mrl-10 {
309
+ margin-left: 10px;
310
+ margin-right: 10px;
311
+ }
312
+ .mt-10{
313
+ margin-top: 10px
314
+ }
315
+ .ml-10{
316
+ margin-left: 10px
317
+ }
318
+ .mr-20{
319
+ margin-right: 20px
320
+ }
321
+ .flex-grow {
322
+ flex-grow: 1;
323
+ }
324
+ .align-start {
325
+ align-items: flex-start;
326
+ }
327
+
328
+ .align-end {
329
+ align-items: flex-end;
330
+ }
331
+
332
+ .align-center {
333
+ align-items: center;
334
+ }
335
+ .align-stretch {
336
+ align-items: stretch;
337
+ }
338
+ body {
339
+ display: grid;
340
+ place-items: center;
341
+ min-height: 100vh;
342
+ font-family: 'Google Sans', sans-serif, system-ui;
343
+ }
344
+ .hide {
345
+ display: none;
346
+ }
347
+ `;
348
+ __decorate([
349
+ property({ type: String })
350
+ ], SfMultiselectSearch.prototype, "mode", void 0);
351
+ __decorate([
352
+ property({ type: Boolean })
353
+ ], SfMultiselectSearch.prototype, "readonly", void 0);
354
+ __decorate([
355
+ property()
356
+ ], SfMultiselectSearch.prototype, "listname", void 0);
357
+ __decorate([
358
+ property({ type: Array })
359
+ ], SfMultiselectSearch.prototype, "listelements", void 0);
360
+ __decorate([
361
+ property({ type: Object })
362
+ ], SfMultiselectSearch.prototype, "listselection", void 0);
363
+ SfMultiselectSearch = __decorate([
364
+ customElement('sf-multiselect-search')
365
+ ], SfMultiselectSearch);
366
+ export { SfMultiselectSearch };
367
+ //# sourceMappingURL=sf-multiselect-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sf-multiselect-search.js","sourceRoot":"","sources":["../src/sf-multiselect-search.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * @license\r\n * Copyright 2022 Superflow.dev\r\n * SPDX-License-Identifier: MIT\r\n */\r\n\r\nimport { LitElement, html, css, PropertyValueMap } from 'lit';\r\nimport { customElement, property } from 'lit/decorators.js';\r\n\r\n/*\r\n\r\nModes: multiselect, select\r\nFlows: view,edit\r\n\r\n*/\r\n\r\n/**\r\n * SfMultiselectSearch element.\r\n * @fires renderComplete - When the list is populated\r\n * @fires valueChanged - When the value is changed\r\n * @property apiId - backend api id\r\n * @property label - input label\r\n * @property name - name of the input\r\n * @property mode - mode of operation\r\n * @property selectedId - id to preselect\r\n * @property selectedValue - callback function\r\n */\r\n@customElement('sf-multiselect-search')\r\nexport class SfMultiselectSearch extends LitElement {\r\n static override styles = css`\r\n :root {\r\n --color: #fcc419;\r\n --shadow: #f08c00;\r\n --glare: hsl(0 0% 100% / 0.75);\r\n --font-size: clamp(.75rem, 2vw, 1rem);\r\n --transition: 0.2s;\r\n }\r\n\r\n * {\r\n box-sizing: border-box;\r\n }\r\n\r\n .d-flex {\r\n display: flex;\r\n }\r\n\r\n .flex-col {\r\n flex-direction: column;\r\n }\r\n\r\n .flex-wrap {\r\n flex-wrap: wrap;\r\n }\r\n\r\n .justify-center {\r\n justify-content: center;\r\n }\r\n\r\n .justify-between {\r\n justify-content: space-between;\r\n }\r\n\r\n .justify-end {\r\n justify-content: flex-end;\r\n }\r\n\r\n .w-100-m-0 {\r\n width: 100%;\r\n }\r\n \r\n .mb-20 {\r\n margin-bottom: 20px;\r\n }\r\n \r\n .mt-20 {\r\n margin-top: 20px;\r\n }\r\n .mr-10 {\r\n margin-right: 10px;\r\n }\r\n .mr-5 {\r\n margin-right: 5px;\r\n }\r\n .m-0 {\r\n margin: 0px;\r\n }\r\n\r\n .m-20 {\r\n margin: 20px;\r\n }\r\n .md-20-ml-10 {\r\n margin-top: 20px;\r\n margin-bottom: 20px;\r\n margin-left: 10px;\r\n margin-right: 10px;\r\n }\r\n .mrl-5 {\r\n margin-left: 5px;\r\n margin-right: 5px;\r\n }\r\n .mrl-10 {\r\n margin-left: 10px;\r\n margin-right: 10px;\r\n }\r\n .mt-10{\r\n margin-top: 10px\r\n }\r\n .ml-10{\r\n margin-left: 10px\r\n }\r\n .mr-20{\r\n margin-right: 20px\r\n }\r\n .flex-grow {\r\n flex-grow: 1;\r\n }\r\n .align-start {\r\n align-items: flex-start;\r\n }\r\n\r\n .align-end {\r\n align-items: flex-end;\r\n }\r\n\r\n .align-center {\r\n align-items: center;\r\n }\r\n .align-stretch {\r\n align-items: stretch;\r\n }\r\n body {\r\n display: grid;\r\n place-items: center;\r\n min-height: 100vh;\r\n font-family: 'Google Sans', sans-serif, system-ui;\r\n }\r\n .hide {\r\n display: none;\r\n }\r\n `;\r\n\r\n @property({ type: String })\r\n // mode = \"\"\r\n mode = \"admin\"\r\n\r\n @property({ type: Boolean })\r\n readonly = false\r\n // readonly = true\r\n @property()\r\n listname = \"\"\r\n\r\n @property({ type: Array })\r\n // listelements: string[] = []\r\n listelements: { name: string, id: string }[] = [\r\n {\r\n \"name\": \"Contract term 1\",\r\n \"id\": \"ct1\"\r\n },\r\n {\r\n \"name\": \"contract term 2\",\r\n \"id\": \"ct2\"\r\n },\r\n {\r\n \"name\": \"contract term 3\",\r\n \"id\": \"ct3\"\r\n }\r\n ]\r\n // listelements: { name: string }[] = [{\"name\": \"Terms1\"},{\"name\": \"Terms2\"}]\r\n // listelements: { name: string }[] = [\r\n // {\r\n // \"name\": \"item 1\"\r\n // },\r\n // {\r\n // \"name\": \"item 2\"\r\n // }\r\n // ]\r\n\r\n @property({ type: Object })\r\n listselection: { [key: string]: boolean } = {}\r\n // listselection: { [key: string]: boolean } = {\r\n // \"Contract term 1\": true,\r\n // \"contract term 2\": true,\r\n // \"contract term 3\": true\r\n // }\r\n // listselection: any = {\r\n // \"First term\": true,\r\n // \"Second term\": true\r\n // }\r\n // listselection: any = {\r\n // \"Check 1\": true,\r\n // \"Check 2\": false,\r\n // \"Check 3\": true\r\n // }\r\n\r\n selectedValues = () => {\r\n console.log('multiselect selectedvalues', JSON.stringify(this.listselection))\r\n let retObj: { [key: string]: boolean } = {}\r\n for (let key of this.listelements) {\r\n if (this.listselection[key.id] == null && this.listselection[key.id] !== false) {\r\n retObj[key.id] = this.listselection[key.id]\r\n }\r\n }\r\n return retObj\r\n }\r\n dispatchValueChanged = () => {\r\n console.log(\"dispatchValueChanged\");\r\n this.populateSelectedList();\r\n let customEvent = new CustomEvent('valueChanged', {\r\n detail: { source: 'InnerElement', id: this.id },\r\n bubbles: true,\r\n composed: true\r\n });\r\n this.dispatchEvent(customEvent);\r\n\r\n }\r\n\r\n initListeners = () => {\r\n let dropDownButton = this.shadowRoot?.getElementById(\"dropdown-button\") as HTMLButtonElement;\r\n console.log(\"dropdownButton\", dropDownButton.innerHTML);\r\n dropDownButton.addEventListener('click', (e) => {\r\n let multiselectList = this.shadowRoot?.getElementById(\"select-list\") as HTMLDivElement;\r\n console.log(\"checklistList\", multiselectList.classList);\r\n let button = e.target as HTMLButtonElement;\r\n if (button.innerHTML === \"keyboard_arrow_down\") {\r\n multiselectList.classList.remove(\"hide\");\r\n button.innerHTML = \"keyboard_arrow_up\"\r\n } else {\r\n multiselectList.classList.add(\"hide\");\r\n button.innerHTML = \"keyboard_arrow_down\"\r\n }\r\n\r\n })\r\n\r\n let searchInput = this.shadowRoot?.getElementById(\"search-input\") as HTMLInputElement;\r\n searchInput.addEventListener('input', (e) => {\r\n this.populateList();\r\n let searchInput = e.target as HTMLInputElement;\r\n let filterText = searchInput.value.toLowerCase();\r\n if (filterText !== \"\") {\r\n let multiselectList = this.shadowRoot?.getElementById(\"select-list\") as HTMLDivElement;\r\n multiselectList.classList.remove(\"hide\");\r\n let dropdownButton = this.shadowRoot?.getElementById(\"dropdown-button\") as HTMLButtonElement;\r\n dropdownButton.innerHTML = \"keyboard_arrow_up\"\r\n }\r\n })\r\n }\r\n\r\n populateSelectedList = () => {\r\n let searchInput = this.shadowRoot?.getElementById(\"search-input\") as HTMLInputElement;\r\n let filterText = searchInput.value.toLowerCase();\r\n console.log(\"populateSelectedList\", this.listelements, filterText);\r\n let selectedList = this.shadowRoot?.getElementById(\"selected-list\") as HTMLDivElement;\r\n let innerHTML = ''\r\n if (Array.isArray(this.listelements)) {\r\n this.listelements.map((item) => {\r\n console.log('sf-multiselect-searcht rendering checkbox', this.listselection[(item.id ?? \"\")])\r\n if (this.listselection[(item.id ?? \"\")] !== true) {\r\n return;\r\n }\r\n innerHTML += `\r\n <div part=\"selected-item\" class=\"d-flex align-center mr-10\">\r\n <span id=\"selected-delete-${(item.id ?? \"\").replace(/ /g, '-')}\" class=\"material-icons\" part=\"selected-unselect\">cancel</span>\r\n <label part=\"selected-label\" id=\"selected-label-${(item.id ?? \"\").replace(/ /g, '-')}\">${(item.name ?? \"\")}</label>\r\n </div>\r\n `});\r\n }\r\n selectedList.innerHTML = innerHTML;\r\n for (const item of this.listelements) {\r\n const deleteSpan = this.shadowRoot?.getElementById(`selected-delete-${(item.id ?? \"\").replace(/ /g, '-')}`) as HTMLSpanElement;\r\n if (deleteSpan != null) {\r\n deleteSpan.addEventListener('click', () => {\r\n const id = item.id ?? \"\";\r\n delete this.listselection[id];\r\n this.populateSelectedList();\r\n });\r\n }\r\n const selectedLabel = this.shadowRoot?.getElementById(`selected-label-${(item.id ?? \"\").replace(/ /g, '-')}`) as HTMLLabelElement;\r\n if (selectedLabel != null) {\r\n selectedLabel.addEventListener('click', () => {\r\n const id = item.id ?? \"\";\r\n delete this.listselection[id];\r\n this.populateSelectedList();\r\n });\r\n }\r\n }\r\n }\r\n\r\n populateList = () => {\r\n let searchInput = this.shadowRoot?.getElementById(\"search-input\") as HTMLInputElement;\r\n let filterText = searchInput.value.toLowerCase();\r\n console.log(\"populateList\", this.listelements, filterText);\r\n let miltiselectList = this.shadowRoot?.getElementById(\"select-list\") as HTMLDivElement;\r\n let innerHTML = ''\r\n if (Array.isArray(this.listelements)) {\r\n this.listelements.map((item) => {\r\n console.log('sf-multiselect-searcht rendering checkbox', this.listselection[(item.id ?? \"\")])\r\n if (filterText !== \"\" && !(item.name ?? \"\").toLowerCase().includes(filterText)) {\r\n return;\r\n }\r\n innerHTML += `\r\n <div part=\"multiselect-item\" class=\"d-flex\">\r\n <input part=\"multiselect-checkbox\" type=\"checkbox\" id=\"checkbox-${(item.id ?? \"\").replace(/ /g, '-')}\" name=\"${(item.name ?? \"\")}\" value=\"${(item.id ?? \"\")}\" ${(this.listselection[(item.id ?? \"\")] ?? false) ? \"checked\" : \"\"} ${this.readonly ? \"disabled\" : \"\"}/>\r\n <label part=\"multiselect-checkbox-label\" for=\"checkbox-${(item.id ?? \"\").replace(/ /g, '-')}\">${(item.name ?? \"\")}</label>\r\n </div>\r\n `});\r\n }\r\n miltiselectList.innerHTML = innerHTML;\r\n\r\n for (const item of this.listelements) {\r\n const checkbox = this.shadowRoot?.getElementById(`checkbox-${(item.id ?? \"\").replace(/ /g, '-')}`) as HTMLInputElement;\r\n if (checkbox) {\r\n checkbox.addEventListener('change', () => {\r\n const id = item.id ?? \"\";\r\n this.listselection = {\r\n ...this.listselection,\r\n [id]: checkbox.checked\r\n };\r\n console.log('checklist selected', this.listselection, typeof (this.listselection));\r\n this.dispatchValueChanged()\r\n let multiselectList = this.shadowRoot?.getElementById(\"select-list\") as HTMLDivElement;\r\n multiselectList.classList.add(\"hide\");\r\n let dropdownButton = this.shadowRoot?.getElementById(\"dropdown-button\") as HTMLButtonElement;\r\n dropdownButton.innerHTML = \"keyboard_arrow_down\"\r\n });\r\n }\r\n }\r\n\r\n\r\n }\r\n\r\n loadMode = async () => {\r\n console.log(\"loadMode\", this.mode, this.listelements, this.listselection);\r\n // this.listelements = Object.keys(this.listselection)\r\n\r\n this.populateList()\r\n this.dispatchValueChanged();\r\n this.initListeners()\r\n }\r\n\r\n protected override firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\r\n\r\n this.loadMode();\r\n\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n }\r\n override render() {\r\n return html`\r\n <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\r\n <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0\" />\r\n <div part=\"multiselect-container\" class=\"d-flex flex-col align-stretch\"> \r\n ${this.listname != \"\" ? `<h2 part=\"multiselect-title\">${this.listname}</h2>` : ''}\r\n <div id=\"multiselect-input-container\" part=\"multiselect-input-container\" class=\"d-flex\">\r\n <input part=\"input\" type=\"text\" id=\"search-input\" name=\"search-input\" class=\"flex-grow\" value=\"\" placeholder=\"Search\"/>\r\n <button id=\"dropdown-button\" part=\"button-icon\" class=\"material-icons\">keyboard_arrow_down</button>\r\n </div>\r\n <div id=\"select-list\" part=\"select-list\" class=\"hide d-flex flex-col flex-wrap justify-center\"></div>\r\n </div>\r\n <div id=\"selected-list\" part=\"selected-list\" class=\"d-flex flex-wrap\"></div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n }\r\n}\r\n"]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Superflows.dev
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=sf-checklist_test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sf-checklist_test.d.ts","sourceRoot":"","sources":["../../src/test/sf-checklist_test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Superflows.dev
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { SfMultiselectSearch } from '../sf-multiselect-search.js';
7
+ // import { stub } from 'sinon';
8
+ // import {fixture, assert} from '@open-wc/testing';
9
+ import { assert } from '@open-wc/testing';
10
+ // import {html} from 'lit/static-html.js';
11
+ //const TIMEOUT = 2000;
12
+ suite('sf-multiselect-search > left menu', () => {
13
+ test('is defined', () => {
14
+ const el = document.createElement('sf-multiselect-search');
15
+ assert.instanceOf(el, SfMultiselectSearch);
16
+ });
17
+ });
18
+ //# sourceMappingURL=sf-checklist_test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sf-checklist_test.js","sourceRoot":"","sources":["../../src/test/sf-checklist_test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,mBAAmB,EAAC,MAAM,6BAA6B,CAAC;AAChE,gCAAgC;AAChC,oDAAoD;AACpD,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAC;AACxC,2CAA2C;AAE3C,uBAAuB;AACvB,KAAK,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAE9C,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;QACtB,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AAGL,CAAC,CAAC,CAAC","sourcesContent":["/**\r\n * @license\r\n * Copyright 2022 Superflows.dev\r\n * SPDX-License-Identifier: MIT\r\n */\r\n\r\nimport {SfMultiselectSearch} from '../sf-multiselect-search.js';\r\n// import { stub } from 'sinon';\r\n// import {fixture, assert} from '@open-wc/testing';\r\nimport {assert} from '@open-wc/testing';\r\n// import {html} from 'lit/static-html.js';\r\n\r\n//const TIMEOUT = 2000;\r\nsuite('sf-multiselect-search > left menu', () => {\r\n\r\n test('is defined', () => {\r\n const el = document.createElement('sf-multiselect-search');\r\n assert.instanceOf(el, SfMultiselectSearch);\r\n });\r\n\r\n\r\n});\r\n\r\n"]}
package/dist/util.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ declare function alphabeticalSort(arr: string[]): string[];
2
+ declare const exportFunctions: {
3
+ validateName: (name: string) => boolean;
4
+ alphabeticalSort: typeof alphabeticalSort;
5
+ };
6
+ export default exportFunctions;
7
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAQA,iBAAS,gBAAgB,CAAC,GAAG,EAAC,MAAM,EAAE,YAKrC;AAGD,QAAA,MAAM,eAAe;yBAfO,MAAM;;CAiBjC,CAAC;AAEF,eAAe,eAAe,CAAC"}
package/dist/util.js ADDED
@@ -0,0 +1,17 @@
1
+ const validateName = (name) => {
2
+ if ((name + "").length > 2) {
3
+ return true;
4
+ }
5
+ return false;
6
+ };
7
+ function alphabeticalSort(arr) {
8
+ let arrSorted = arr.sort((a, b) => {
9
+ return a.trim().toLowerCase().localeCompare(b.trim().toLowerCase());
10
+ });
11
+ return arrSorted;
12
+ }
13
+ const exportFunctions = {
14
+ validateName, alphabeticalSort
15
+ };
16
+ export default exportFunctions;
17
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AACA,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE;IACpC,IAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QACzB,OAAO,IAAI,CAAC;KACb;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAA;AAED,SAAS,gBAAgB,CAAC,GAAY;IACpC,IAAI,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,EAAE,EAAE;QAC/B,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;IACF,OAAO,SAAS,CAAA;AAClB,CAAC;AAGD,MAAM,eAAe,GAAG;IACrB,YAAY,EAAE,gBAAgB;CAChC,CAAC;AAEF,eAAe,eAAe,CAAC","sourcesContent":["\r\nconst validateName = (name: string) => {\r\n if((name + \"\").length > 2) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nfunction alphabeticalSort(arr:string[]){\r\n let arrSorted = arr.sort((a,b) => {\r\n return a.trim().toLowerCase().localeCompare(b.trim().toLowerCase())\r\n })\r\n return arrSorted\r\n}\r\n\r\n\r\nconst exportFunctions = {\r\n validateName, alphabeticalSort\r\n};\r\n\r\nexport default exportFunctions;"]}
package/package.json ADDED
@@ -0,0 +1,93 @@
1
+ {
2
+ "name": "sf-multiselect-search",
3
+ "private": false,
4
+ "version": "1.0.1",
5
+ "description": "Superflows Multiselect Component",
6
+ "module": "dist/sf-multiselect-search.js",
7
+ "outDir": "dist",
8
+ "declaration": true,
9
+ "type": "module",
10
+ "main": "dist/sf-multiselect-search.js",
11
+ "types": "dist/sf-multiselect-search.d.ts",
12
+ "files": [
13
+ "dist",
14
+ "README.md"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "build:watch": "tsc --watch",
19
+ "clean": "rimraf sf-multiselect-search.{d.ts,d.ts.map,js,js.map} test/sf-multiselect-search.{d.ts,d.ts.map,js,js.map} test/sf-multiselect-search_test.{d.ts,d.ts.map,js,js.map}",
20
+ "lint": "npm run lint:lit-analyzer && npm run lint:eslint",
21
+ "lint:eslint": "eslint 'src/**/*.ts'",
22
+ "lint:lit-analyzer": "lit-analyzer",
23
+ "format": "prettier \"**/*.{cjs,html,js,json,md,ts}\" --ignore-path ./.eslintignore --write",
24
+ "analyze": "cem analyze --litelement --globs \"src/**/*.ts\"",
25
+ "analyze:watch": "cem analyze --litelement --globs \"src/**/*.ts\" --watch",
26
+ "serve": "wds --watch",
27
+ "serve:prod": "MODE=prod npm run serve",
28
+ "test": "npm run test:dev && npm run test:prod",
29
+ "test:dev": "wtr --verbose=true --coverage --silent=false",
30
+ "test:watch": "wtr --watch",
31
+ "test:prod": "MODE=prod wtr",
32
+ "test:prod:watch": "MODE=prod wtr --watch",
33
+ "checksize": "rollup -c ; cat sf-multiselect-search.bundled.js | gzip -9 | wc -c ; rm sf-multiselect-search.bundled.js"
34
+ },
35
+ "keywords": [
36
+ "superflows",
37
+ "react",
38
+ "serverless",
39
+ "buttons",
40
+ "input",
41
+ "navigation",
42
+ "building blocks",
43
+ "lego",
44
+ "search",
45
+ "notifications",
46
+ "login",
47
+ "sign in",
48
+ "profile",
49
+ "menu",
50
+ "brand",
51
+ "lit",
52
+ "lit-element",
53
+ "navigation-bar",
54
+ "web component",
55
+ "browser"
56
+ ],
57
+ "author": "Superflows-dev",
58
+ "license": "MIT",
59
+ "repository": "superflows-dev/sf-multiselect-search",
60
+ "dependencies": {
61
+ "fs": "^0.0.1-security",
62
+ "lit": "^2.2.4",
63
+ "sinon": "^15.0.1"
64
+ },
65
+ "devDependencies": {
66
+ "@11ty/eleventy": "^3.1.0",
67
+ "@11ty/eleventy-plugin-syntaxhighlight": "^4.0.0",
68
+ "@custom-elements-manifest/analyzer": "^0.6.3",
69
+ "@open-wc/testing": "^3.1.7",
70
+ "@rollup/plugin-node-resolve": "^13.3.0",
71
+ "@rollup/plugin-replace": "^4.0.0",
72
+ "@types/mocha": "^10.0.10",
73
+ "@typescript-eslint/eslint-plugin": "^5.25.0",
74
+ "@typescript-eslint/parser": "^5.25.0",
75
+ "@web/dev-server": "^0.4.6",
76
+ "@web/dev-server-legacy": "^1.0.0",
77
+ "@web/test-runner": "^0.20.1",
78
+ "@web/test-runner-playwright": "^0.11.0",
79
+ "@webcomponents/webcomponentsjs": "^2.6.0",
80
+ "eslint": "^8.15.0",
81
+ "lit-analyzer": "^2.0.3",
82
+ "prettier": "^2.6.2",
83
+ "rimraf": "^3.0.2",
84
+ "rollup": "^2.73.0",
85
+ "rollup-plugin-summary": "^1.4.3",
86
+ "rollup-plugin-terser": "^7.0.2",
87
+ "typescript": "~4.7.4"
88
+ },
89
+ "customElements": "custom-elements.json",
90
+ "include": [
91
+ "src"
92
+ ]
93
+ }