@likable-hair/svelte 3.0.20 → 3.0.21

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.
Files changed (43) hide show
  1. package/dist/components/composed/common/MenuOrDrawer.svelte +3 -2
  2. package/dist/components/composed/common/MenuOrDrawer.svelte.d.ts +2 -1
  3. package/dist/components/composed/common/MenuOrDrawerOptions.svelte +2 -2
  4. package/dist/components/composed/common/MenuOrDrawerOptions.svelte.d.ts +1 -1
  5. package/dist/components/composed/forms/Dropdown.svelte +6 -4
  6. package/dist/components/composed/forms/Dropdown.svelte.d.ts +3 -0
  7. package/dist/components/composed/list/PaginatedTable.svelte +62 -10
  8. package/dist/components/composed/list/PaginatedTable.svelte.d.ts +3 -0
  9. package/dist/components/composed/search/FilterEditor.svelte +260 -0
  10. package/dist/components/composed/search/FilterEditor.svelte.d.ts +29 -0
  11. package/dist/components/composed/search/Filters.svelte +445 -42
  12. package/dist/components/composed/search/Filters.svelte.d.ts +24 -4
  13. package/dist/components/composed/search/MobileFilterEditor.svelte +342 -0
  14. package/dist/components/composed/search/MobileFilterEditor.svelte.d.ts +34 -0
  15. package/dist/components/composed/search/SearchBar.svelte +12 -11
  16. package/dist/components/composed/search/SearchBar.svelte.d.ts +1 -0
  17. package/dist/components/simple/buttons/Button.svelte +4 -0
  18. package/dist/components/simple/common/Menu.svelte +29 -10
  19. package/dist/components/simple/common/Menu.svelte.d.ts +2 -0
  20. package/dist/components/simple/dates/DatePickerTextField.svelte +91 -61
  21. package/dist/components/simple/dates/DatePickerTextField.svelte.d.ts +2 -0
  22. package/dist/components/simple/dialogs/Dialog.svelte.d.ts +1 -1
  23. package/dist/components/simple/forms/Autocomplete.css +1 -0
  24. package/dist/components/simple/forms/Autocomplete.svelte +96 -46
  25. package/dist/components/simple/forms/Autocomplete.svelte.d.ts +3 -0
  26. package/dist/components/simple/lists/SelectableVerticalList.svelte +52 -9
  27. package/dist/components/simple/lists/SelectableVerticalList.svelte.d.ts +9 -0
  28. package/dist/components/simple/lists/SimpleTable.svelte.d.ts +2 -2
  29. package/dist/components/simple/lists/columnTypes.d.ts +1 -1
  30. package/dist/components/simple/media/DescriptiveAvatar.svelte.d.ts +1 -1
  31. package/dist/components/simple/navigation/Chip.css +2 -1
  32. package/dist/components/simple/navigation/Chip.svelte +16 -5
  33. package/dist/components/simple/navigation/Chip.svelte.d.ts +1 -0
  34. package/dist/components/simple/navigation/Drawer.svelte +10 -0
  35. package/dist/components/simple/navigation/Drawer.svelte.d.ts +1 -0
  36. package/dist/utils/filters/builder.d.ts +1 -1
  37. package/dist/utils/filters/builder.js +1 -1
  38. package/dist/utils/filters/filters.d.ts +67 -4
  39. package/dist/utils/filters/filters.js +73 -0
  40. package/dist/utils/filters/modifiers/where.d.ts +1 -1
  41. package/dist/utils/filters/validator.d.ts +4 -0
  42. package/dist/utils/filters/validator.js +30 -0
  43. package/package.json +2 -1
@@ -0,0 +1,342 @@
1
+ <script>import { GenericModes, SelectModes, StringModes } from "../../../utils/filters/filters";
2
+ import SimpleTextField from "../../simple/forms/SimpleTextField.svelte";
3
+ import DatePickerTextField from "../../simple/dates/DatePickerTextField.svelte";
4
+ import Button from "../../simple/buttons/Button.svelte";
5
+ import { createEventDispatcher } from "svelte";
6
+ import Validator from "../../../utils/filters/validator";
7
+ import SelectableVerticalList, {} from "../../simple/lists/SelectableVerticalList.svelte";
8
+ import Icon from "../../simple/media/Icon.svelte";
9
+ import { fly } from "svelte/transition";
10
+ import Autocomplete from "../../simple/forms/Autocomplete.svelte";
11
+ import Checkbox from "../../simple/forms/Checkbox.svelte";
12
+ export let filter = void 0, lang = "en", cancelFilterLabel = lang == "en" ? "Cancel" : "Annulla", applyFilterLabel = lang == "en" ? "Apply filter" : "Applica filtro", backIcon = "mdi-arrow-left", betweenFromLabel = lang == "en" ? "From" : "Da", betweenToLabel = lang == "en" ? "To" : "A", labelsMapper;
13
+ let dispatch = createEventDispatcher();
14
+ function handleApplyFilterClick() {
15
+ if (!!filter && !!tmpFilter) {
16
+ filter = structuredClone(tmpFilter);
17
+ filter.active = true;
18
+ dispatch("apply");
19
+ }
20
+ }
21
+ let step;
22
+ let tmpFilter;
23
+ function initTmpFilter() {
24
+ tmpFilter = structuredClone(filter);
25
+ if (!!tmpFilter && tmpFilter.advanced) {
26
+ if (["string", "number", "date", "select"].includes(tmpFilter.type) && Object.keys(tmpFilter).includes("mode")) {
27
+ if (tmpFilter.mode == "between" && tmpFilter.from !== void 0 && tmpFilter.to !== void 0 || tmpFilter.value !== void 0 || tmpFilter.type == "select" && tmpFilter.values !== void 0 && tmpFilter.values.length > 0) {
28
+ step = "editor";
29
+ advancedModeSelectedOption = tmpFilter.mode;
30
+ } else {
31
+ step = "advanced";
32
+ }
33
+ } else {
34
+ step = "advanced";
35
+ }
36
+ } else {
37
+ step = "editor";
38
+ }
39
+ }
40
+ $:
41
+ if (!!filter) {
42
+ initTmpFilter();
43
+ }
44
+ let advancedModeOptions, advancedModeSelectedOption;
45
+ $:
46
+ if (!!tmpFilter) {
47
+ let modes;
48
+ if (tmpFilter.type == "string") {
49
+ modes = StringModes;
50
+ } else if (tmpFilter.type == "date") {
51
+ modes = GenericModes;
52
+ } else if (tmpFilter.type == "number") {
53
+ modes = GenericModes;
54
+ } else if (tmpFilter.type == "select") {
55
+ modes = SelectModes;
56
+ }
57
+ if (!!modes) {
58
+ advancedModeOptions = modes.map((mode) => {
59
+ return {
60
+ title: labelsMapper[mode].short || mode,
61
+ name: mode
62
+ };
63
+ });
64
+ }
65
+ }
66
+ $:
67
+ if (!tmpFilter?.advanced) {
68
+ advancedModeSelectedOption = void 0;
69
+ }
70
+ let calendarOpened = false, calendarOpened2 = false;
71
+ function handleAdvancedModeSelection() {
72
+ if (!!advancedModeSelectedOption && !!tmpFilter) {
73
+ if (tmpFilter.type == "date")
74
+ tmpFilter.mode = advancedModeSelectedOption;
75
+ else if (tmpFilter.type == "string")
76
+ tmpFilter.mode = advancedModeSelectedOption;
77
+ else if (tmpFilter.type == "number")
78
+ tmpFilter.mode = advancedModeSelectedOption;
79
+ else if (tmpFilter.type == "select")
80
+ tmpFilter.mode = advancedModeSelectedOption;
81
+ step = "editor";
82
+ canRenderOptions = false;
83
+ }
84
+ }
85
+ let canRenderOptions = true;
86
+ $:
87
+ applyFilterDisabled = !Validator.isValid(tmpFilter);
88
+ function handleModeBackClick() {
89
+ dispatch("backClick");
90
+ }
91
+ function handleEditorBackCLick() {
92
+ if (!!tmpFilter && !tmpFilter.advanced) {
93
+ dispatch("backClick");
94
+ } else {
95
+ step = "advanced";
96
+ advancedModeSelectedOption = void 0;
97
+ setTimeout(() => {
98
+ canRenderOptions = true;
99
+ }, 100);
100
+ }
101
+ }
102
+ $:
103
+ if (!!tmpFilter && tmpFilter.type == "date" && tmpFilter.mode == "between") {
104
+ if (!tmpFilter.from)
105
+ tmpFilter.from = /* @__PURE__ */ new Date();
106
+ if (!tmpFilter.to)
107
+ tmpFilter.to = /* @__PURE__ */ new Date();
108
+ }
109
+ function handleCancelClick() {
110
+ dispatch("cancelClick");
111
+ }
112
+ $:
113
+ if (!!tmpFilter && tmpFilter.type == "bool") {
114
+ if (tmpFilter.value === void 0) {
115
+ tmpFilter.value = false;
116
+ }
117
+ }
118
+ </script>
119
+
120
+ <div class="container">
121
+ {#if !!filter && !!tmpFilter}
122
+ <div class="header" on:click={step=="advanced" ? handleModeBackClick : handleEditorBackCLick} on:keypress>
123
+ <div class="back-link">
124
+ <Icon
125
+ name={backIcon}
126
+ ></Icon>
127
+ </div>
128
+ <div class="title">
129
+ <slot name="title"></slot>
130
+ </div>
131
+ </div>
132
+ <div class="filter-editor">
133
+ {#if tmpFilter.advanced && step == 'advanced' && canRenderOptions}
134
+ <div class="advanced-mode" in:fly={{delay: 100, x: 200, duration: 100}} out:fly={{x: -200, duration: 100}}>
135
+ <div class="advanced-mode-selector" on:click|stopPropagation on:keypress>
136
+ <SelectableVerticalList
137
+ bind:selected={advancedModeSelectedOption}
138
+ bind:elements={advancedModeOptions}
139
+ --selectable-vertical-list-default-width="100%"
140
+ --selectable-vertical-list-default-element-height="56px"
141
+ --selectable-vertical-list-default-title-font-size="null"
142
+ on:select={handleAdvancedModeSelection}
143
+ centered
144
+ bicolor
145
+ ></SelectableVerticalList>
146
+ </div>
147
+ </div>
148
+ {:else if step == 'editor' && (!tmpFilter.advanced || !!advancedModeSelectedOption)}
149
+ <div class="editor" in:fly={{delay: 100, x: 200, duration: 100}} out:fly={{x: -200, duration: 100}}>
150
+ <div class="fields-container">
151
+ <div class="fields"
152
+ on:click|stopPropagation
153
+ on:keypress
154
+ >
155
+ {#if tmpFilter.type === "string" }
156
+ <SimpleTextField
157
+ bind:value={tmpFilter.value}
158
+ type="text"
159
+ placeholder={tmpFilter?.label}
160
+ --simple-textfield-width="100%"
161
+ ></SimpleTextField>
162
+ {:else if tmpFilter.type === "date" && tmpFilter.mode !== 'between'}
163
+ <div style:width="100%">
164
+ <div>
165
+ <DatePickerTextField
166
+ bind:selectedDate={tmpFilter.value}
167
+ openingId="advanced-filter"
168
+ bind:menuOpened={calendarOpened}
169
+ placeholder={tmpFilter.label}
170
+ on:day-click={() => {calendarOpened = false}}
171
+ --simple-textfield-width="100%"
172
+ ></DatePickerTextField>
173
+ </div>
174
+ </div>
175
+ {:else if tmpFilter.type === "number" && tmpFilter.mode !== 'between'}
176
+ <SimpleTextField
177
+ bind:value={tmpFilter.value}
178
+ type="number"
179
+ placeholder={tmpFilter.label}
180
+ --simple-textfield-width="100%"
181
+ ></SimpleTextField>
182
+ {:else if tmpFilter.type === "date" && tmpFilter.mode === 'between'}
183
+ <div style:width="100%">
184
+ <div class="date" style:margin-bottom="10px">
185
+ <DatePickerTextField
186
+ bind:selectedDate={tmpFilter.from}
187
+ openingId="advanced-filter"
188
+ placeholder={betweenToLabel}
189
+ bind:menuOpened={calendarOpened}
190
+ on:day-click={() => {calendarOpened = false}}
191
+ --simple-textfield-width="100%"
192
+ ></DatePickerTextField>
193
+ </div>
194
+ <div class="date">
195
+ <DatePickerTextField
196
+ bind:selectedDate={tmpFilter.to}
197
+ openingId="advanced-filter"
198
+ placeholder="Alla data"
199
+ bind:menuOpened={calendarOpened2}
200
+ on:day-click={() => {calendarOpened2 = false}}
201
+ --simple-textfield-width="100%"
202
+ ></DatePickerTextField>
203
+ </div>
204
+ </div>
205
+ {:else if tmpFilter.type === "number" && tmpFilter.mode === "between"}
206
+ <div style:width="100%">
207
+ <div style:margin-bottom="10px">
208
+ <SimpleTextField
209
+ bind:value={tmpFilter.from}
210
+ type="number"
211
+ placeholder={betweenFromLabel}
212
+ --simple-textfield-width="100%"
213
+ ></SimpleTextField>
214
+ </div>
215
+ <div>
216
+ <SimpleTextField
217
+ bind:value={tmpFilter.to}
218
+ type="number"
219
+ placeholder={betweenToLabel}
220
+ --simple-textfield-width="100%"
221
+ ></SimpleTextField>
222
+ </div>
223
+ </div>
224
+ {:else if tmpFilter.type == 'select'}
225
+ <div style:width="100%">
226
+ <Autocomplete
227
+ on:close
228
+ --drawer-margin="5px 5px -10px 5px"
229
+ mobileDrawer
230
+ bind:values={tmpFilter.values}
231
+ items={tmpFilter.items}
232
+ multiple
233
+ maxVisibleChips={4}
234
+ --simple-textfield-width="0px"
235
+ --simple-text-field-margin-left="0px"
236
+ --autocomplete-options-max-width="100%"
237
+ ></Autocomplete>
238
+ </div>
239
+ {:else if tmpFilter.type == 'bool'}
240
+ <div class="bool-filter">
241
+ <Checkbox
242
+ bind:value={tmpFilter.value}
243
+ ></Checkbox>
244
+ <span style:margin-left="10px">
245
+ {tmpFilter.desctiprion}
246
+ </span>
247
+ </div>
248
+ {/if}
249
+ </div>
250
+ </div>
251
+ <div class="bottom-btn">
252
+ <div class="btn">
253
+ <Button
254
+ --button-width="100%"
255
+ --button-box-shadow="none"
256
+ --button-height="30px"
257
+ --button-padding="10px 0px 10px 0px"
258
+ --button-border-radius="10px 10px 0px 0px"
259
+ disabled={applyFilterDisabled}
260
+ on:click={handleApplyFilterClick}
261
+ >{applyFilterLabel}</Button>
262
+ </div>
263
+ <div class="btn">
264
+ <Button
265
+ --button-width="100%"
266
+ --button-box-shadow="none"
267
+ --button-padding="10px 0px 10px 0px"
268
+ --button-background-color="rgb(var(--global-color-grey-50))"
269
+ --button-color="rgb(var(--global-color-primary-500))"
270
+ --button-border-radius="0px 0px 0px 0px"
271
+ on:click={handleCancelClick}
272
+ >{cancelFilterLabel}</Button>
273
+ </div>
274
+ </div>
275
+ </div>
276
+ {/if}
277
+ </div>
278
+ {/if}
279
+ </div>
280
+
281
+ <style>
282
+ .filter-editor {
283
+ display: flex;
284
+ flex-direction: column;
285
+ gap:10px;
286
+ height: 100%;
287
+ }
288
+
289
+ .advanced-mode {
290
+ display: flex;
291
+ gap: 10px;
292
+ align-items: center;
293
+ }
294
+
295
+ .advanced-mode-selector {
296
+ width: 100%;
297
+ }
298
+
299
+ .header {
300
+ padding: 20px 0px 10px 20px;
301
+ display: flex;
302
+ gap: 10px
303
+ }
304
+
305
+ .title {
306
+ font-size: 1.4rem;
307
+ font-weight: 600;
308
+ }
309
+
310
+ .fields {
311
+ display: flex;
312
+ align-items: center;
313
+ margin-left: 20px;
314
+ margin-right: 20px;
315
+ }
316
+
317
+
318
+ .date {
319
+ width: 100%;
320
+ }
321
+
322
+ .container {
323
+ height: 100%;
324
+ display: flex;
325
+ flex-direction: column;
326
+ }
327
+
328
+ .bottom-btn {
329
+ margin-top: auto;
330
+ }
331
+
332
+ .editor {
333
+ display: flex;
334
+ flex-direction: column;
335
+ height: 100%;
336
+ }
337
+
338
+ .header {
339
+ margin-bottom: 20px;
340
+ }
341
+
342
+ </style>
@@ -0,0 +1,34 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { Filter } from "../../../utils/filters/filters";
3
+ import type { LabelMapper } from "./Filters.svelte";
4
+ declare const __propDef: {
5
+ props: {
6
+ filter?: Filter | undefined;
7
+ lang?: "it" | "en" | undefined;
8
+ cancelFilterLabel?: string | undefined;
9
+ applyFilterLabel?: string | undefined;
10
+ backIcon?: string | undefined;
11
+ betweenFromLabel?: string | undefined;
12
+ betweenToLabel?: string | undefined;
13
+ labelsMapper: LabelMapper;
14
+ };
15
+ events: {
16
+ keypress: KeyboardEvent;
17
+ click: MouseEvent;
18
+ close: CustomEvent<{}>;
19
+ apply: CustomEvent<undefined>;
20
+ backClick: CustomEvent<undefined>;
21
+ cancelClick: CustomEvent<undefined>;
22
+ } & {
23
+ [evt: string]: CustomEvent<any>;
24
+ };
25
+ slots: {
26
+ title: {};
27
+ };
28
+ };
29
+ export type MobileFilterEditorProps = typeof __propDef.props;
30
+ export type MobileFilterEditorEvents = typeof __propDef.events;
31
+ export type MobileFilterEditorSlots = typeof __propDef.slots;
32
+ export default class MobileFilterEditor extends SvelteComponentTyped<MobileFilterEditorProps, MobileFilterEditorEvents, MobileFilterEditorSlots> {
33
+ }
34
+ export {};
@@ -2,7 +2,7 @@
2
2
  import "./SearchBar.css";
3
3
  let clazz = {};
4
4
  export { clazz as class };
5
- export let input = void 0, value = void 0;
5
+ export let input = void 0, value = void 0, placeholder = void 0;
6
6
  </script>
7
7
 
8
8
  <div
@@ -23,16 +23,16 @@ export let input = void 0, value = void 0;
23
23
  </slot>
24
24
  <slot name="input">
25
25
  <input
26
- aria-autocomplete="both"
27
- aria-labelledby="search-content"
28
- id="search-content"
29
- autocomplete="off"
30
- autocorrect="off"
31
- autocapitalize="off"
32
- enterkeyhint="search"
33
- spellcheck="false"
34
- placeholder="Find something..."
35
- maxlength="512"
26
+ aria-autocomplete="both"
27
+ aria-labelledby="search-content"
28
+ id="search-content"
29
+ autocomplete="off"
30
+ autocorrect="off"
31
+ autocapitalize="off"
32
+ enterkeyhint="search"
33
+ spellcheck="false"
34
+ placeholder={placeholder}
35
+ maxlength="512"
36
36
  tabindex="0"
37
37
  bind:this={input}
38
38
  bind:value={value}
@@ -91,6 +91,7 @@ export let input = void 0, value = void 0;
91
91
  --search-bar-line-height,
92
92
  var(--search-bar-default-line-height)
93
93
  );
94
+ width: 100%;
94
95
  box-sizing: border-box;
95
96
  border: 0 solid #e5e7eb;
96
97
  outline: 2px solid transparent;
@@ -10,6 +10,7 @@ declare const __propDef: {
10
10
  } | undefined;
11
11
  input?: HTMLElement | undefined;
12
12
  value?: string | undefined;
13
+ placeholder?: string | undefined;
13
14
  };
14
15
  events: {
15
16
  input: Event;
@@ -185,6 +185,10 @@ import CircularLoader from "../loaders/CircularLoader.svelte";
185
185
  --button-hover-color,
186
186
  var(--button-default-hover-color)
187
187
  );
188
+ box-shadow: var(
189
+ --button-hover-box-shadow,
190
+ var(--button-default-hover-box-shadow)
191
+ );
188
192
  }
189
193
 
190
194
  .button-default:active:not(.disabled) {
@@ -85,8 +85,8 @@ $:
85
85
  }
86
86
  }
87
87
  }
88
- let otherMenus = document.querySelectorAll("[data-menu=true]");
89
- let otherDialogs = document.querySelectorAll("[data-dialog=true]");
88
+ let otherMenus = document.querySelectorAll("[data-menu]");
89
+ let otherDialogs = document.querySelectorAll("[data-dialog]");
90
90
  let maxZIndex = void 0;
91
91
  if (otherDialogs.length > 0) {
92
92
  otherDialogs.forEach((dialog) => {
@@ -95,10 +95,9 @@ $:
95
95
  });
96
96
  }
97
97
  if (otherMenus.length > 0) {
98
- let maxZIndex2;
99
98
  otherMenus.forEach((menu) => {
100
- if (!maxZIndex2 || maxZIndex2 < Number(menu.style.zIndex))
101
- maxZIndex2 = Number(menu.style.zIndex);
99
+ if (!maxZIndex || maxZIndex < Number(menu.style.zIndex))
100
+ maxZIndex = Number(menu.style.zIndex);
102
101
  });
103
102
  }
104
103
  if (!!activator && !!menuElement)
@@ -159,15 +158,33 @@ function handleWindowScrollOrResize() {
159
158
  if (open && !!menuElement && !!activator)
160
159
  calculateMenuPosition({ menuElement, activator });
161
160
  }
161
+ function handleMenuClick(e, zIndex2) {
162
+ let otherMenus = document.querySelectorAll(`[data-menu]`);
163
+ otherMenus.forEach((m) => {
164
+ let uid = m.getAttribute("data-uid");
165
+ if (uid !== currentUid && Number(m.style.zIndex) > zIndex2) {
166
+ let controller = document.querySelector(`[data-operation="close"][data-uid="${uid}"]`);
167
+ if (!!controller) {
168
+ const clickEvent = new MouseEvent("click", {
169
+ bubbles: false,
170
+ cancelable: true,
171
+ view: window
172
+ });
173
+ controller.dispatchEvent(clickEvent);
174
+ }
175
+ }
176
+ });
177
+ }
162
178
  </script>
163
179
 
164
180
  <svelte:window on:scroll={handleWindowScrollOrResize} on:resize={handleWindowScrollOrResize} ></svelte:window>
165
181
 
166
- <div
167
- class="controller"
168
- data-operation="close"
169
- data-opening-id={openingId}
170
- on:click={handleCloseControllerClick}
182
+ <div
183
+ class="controller"
184
+ data-operation="close"
185
+ data-opening-id={openingId}
186
+ data-uid={currentUid}
187
+ on:click={handleCloseControllerClick}
171
188
  on:keypress={handleCloseControllerClick}
172
189
  bind:this={closeController}
173
190
  ></div>
@@ -189,6 +206,8 @@ function handleWindowScrollOrResize() {
189
206
  style:overflow={_overflow}
190
207
  in:inAnimation={inAnimationConfig}
191
208
  out:outAnimation={outAnimationConfig}
209
+ on:click={(e) => handleMenuClick(e, zIndex)}
210
+ on:keydown
192
211
  >
193
212
  <slot />
194
213
  </div>
@@ -27,6 +27,8 @@ declare const __propDef: {
27
27
  openingId?: string | undefined;
28
28
  };
29
29
  events: {
30
+ keydown: KeyboardEvent;
31
+ } & {
30
32
  [evt: string]: CustomEvent<any>;
31
33
  };
32
34
  slots: {