@likable-hair/svelte 3.0.19 → 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.
- package/dist/components/composed/common/MenuOrDrawer.svelte +3 -2
- package/dist/components/composed/common/MenuOrDrawer.svelte.d.ts +2 -1
- package/dist/components/composed/common/MenuOrDrawerOptions.svelte +2 -2
- package/dist/components/composed/common/MenuOrDrawerOptions.svelte.d.ts +1 -1
- package/dist/components/composed/forms/Dropdown.svelte +19 -8
- package/dist/components/composed/forms/Dropdown.svelte.d.ts +7 -0
- package/dist/components/composed/list/PaginatedTable.svelte +179 -129
- package/dist/components/composed/list/PaginatedTable.svelte.d.ts +71 -2
- package/dist/components/composed/list/Paginator.svelte +12 -6
- package/dist/components/composed/search/FilterEditor.svelte +260 -0
- package/dist/components/composed/search/FilterEditor.svelte.d.ts +29 -0
- package/dist/components/composed/search/Filters.css +0 -0
- package/dist/components/composed/search/Filters.svelte +500 -0
- package/dist/components/composed/search/Filters.svelte.d.ts +46 -0
- package/dist/components/composed/search/MobileFilterEditor.svelte +342 -0
- package/dist/components/composed/search/MobileFilterEditor.svelte.d.ts +34 -0
- package/dist/components/composed/search/SearchBar.svelte +12 -11
- package/dist/components/composed/search/SearchBar.svelte.d.ts +1 -0
- package/dist/components/simple/buttons/Button.css +1 -0
- package/dist/components/simple/buttons/Button.svelte +8 -0
- package/dist/components/simple/common/Menu.svelte +29 -10
- package/dist/components/simple/common/Menu.svelte.d.ts +2 -0
- package/dist/components/simple/dates/DatePickerTextField.svelte +91 -61
- package/dist/components/simple/dates/DatePickerTextField.svelte.d.ts +2 -0
- package/dist/components/simple/dialogs/Dialog.svelte.d.ts +1 -1
- package/dist/components/simple/forms/Autocomplete.css +1 -0
- package/dist/components/simple/forms/Autocomplete.svelte +100 -46
- package/dist/components/simple/forms/Autocomplete.svelte.d.ts +4 -0
- package/dist/components/simple/lists/SelectableVerticalList.svelte +52 -9
- package/dist/components/simple/lists/SelectableVerticalList.svelte.d.ts +9 -0
- package/dist/components/simple/lists/SimpleTable.svelte +25 -23
- package/dist/components/simple/lists/SimpleTable.svelte.d.ts +3 -1
- package/dist/components/simple/lists/columnTypes.d.ts +35 -0
- package/dist/components/simple/lists/columnTypes.js +1 -0
- package/dist/components/simple/media/DescriptiveAvatar.svelte.d.ts +1 -1
- package/dist/components/simple/navigation/Chip.css +2 -1
- package/dist/components/simple/navigation/Chip.svelte +16 -5
- package/dist/components/simple/navigation/Chip.svelte.d.ts +1 -0
- package/dist/components/simple/navigation/Drawer.svelte +10 -0
- package/dist/components/simple/navigation/Drawer.svelte.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/utils/filters/builder.d.ts +43 -0
- package/dist/utils/filters/builder.js +137 -0
- package/dist/utils/filters/filters.d.ts +89 -0
- package/dist/utils/filters/filters.js +102 -0
- package/dist/utils/filters/modifiers/join.d.ts +26 -0
- package/dist/utils/filters/modifiers/join.js +1 -0
- package/dist/utils/filters/modifiers/where.d.ts +29 -0
- package/dist/utils/filters/modifiers/where.js +1 -0
- package/dist/utils/filters/validator.d.ts +4 -0
- package/dist/utils/filters/validator.js +30 -0
- 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=
|
|
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;
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
--button-default-text-hover-background-color: rgb(var(--global-color-primary-500), 0.2);
|
|
15
15
|
--button-default-active-background-color: rgb(var(--global-color-primary-500));
|
|
16
16
|
--button-default-focus-background-color: rgb(var(--global-color-primary-500));
|
|
17
|
+
--button-default-focus-color: rgb(var(--global-color-grey-50));
|
|
17
18
|
--button-default-disabled-background-color: rgb(var(--global-color-primary-500), .6);
|
|
18
19
|
--button-default-disabled-color: rgb(var(--global-color-grey-50), .6);
|
|
19
20
|
--button-default-text-active-background-color: rgb(var(--global-color-primary-500), 0.4);
|
|
@@ -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) {
|
|
@@ -199,6 +203,10 @@ import CircularLoader from "../loaders/CircularLoader.svelte";
|
|
|
199
203
|
--button-focus-background-color,
|
|
200
204
|
var(--button-default-focus-background-color)
|
|
201
205
|
);
|
|
206
|
+
color: var(
|
|
207
|
+
--button-focus-color,
|
|
208
|
+
var(--button-default-focus-color)
|
|
209
|
+
);
|
|
202
210
|
}
|
|
203
211
|
|
|
204
212
|
.button-text {
|
|
@@ -85,8 +85,8 @@ $:
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
|
-
let otherMenus = document.querySelectorAll("[data-menu
|
|
89
|
-
let otherDialogs = document.querySelectorAll("[data-dialog
|
|
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 (!
|
|
101
|
-
|
|
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
|
-
|
|
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>
|