@likable-hair/svelte 3.0.57 → 3.0.59
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/ToolTip.svelte +42 -0
- package/dist/components/composed/common/ToolTip.svelte.d.ts +46 -0
- package/dist/components/composed/forms/CountriesAutocomplete.svelte.d.ts +1 -0
- package/dist/components/composed/forms/DatePickerTextField.svelte +3 -3
- package/dist/components/composed/forms/DatePickerTextField.svelte.d.ts +2 -0
- package/dist/components/composed/list/PaginatedTable.svelte +12 -4
- package/dist/components/composed/list/PaginatedTable.svelte.d.ts +13 -0
- package/dist/components/composed/progress/HorizontalStackedProgress.css +3 -0
- package/dist/components/composed/progress/HorizontalStackedProgress.svelte +117 -0
- package/dist/components/composed/progress/HorizontalStackedProgress.svelte.d.ts +24 -0
- package/dist/components/composed/search/FilterEditor.svelte +6 -4
- package/dist/components/composed/search/FilterEditor.svelte.d.ts +6 -1
- package/dist/components/composed/search/Filters.svelte +28 -11
- package/dist/components/composed/search/Filters.svelte.d.ts +9 -0
- package/dist/components/composed/search/MobileFilterEditor.svelte +6 -4
- package/dist/components/composed/search/MobileFilterEditor.svelte.d.ts +4 -0
- package/dist/components/simple/forms/Autocomplete.svelte +3 -1
- package/dist/components/simple/forms/Autocomplete.svelte.d.ts +1 -0
- package/dist/components/simple/forms/FileInput.css +7 -0
- package/dist/components/simple/forms/FileInput.svelte +34 -17
- package/dist/components/simple/forms/FileInput.svelte.d.ts +4 -6
- package/dist/components/simple/forms/FileInputList.css +11 -0
- package/dist/components/simple/forms/FileInputList.svelte +60 -23
- package/dist/components/simple/forms/FileInputList.svelte.d.ts +3 -11
- package/dist/components/simple/forms/TreeEditor.svelte +128 -0
- package/dist/components/simple/forms/TreeEditor.svelte.d.ts +38 -0
- package/dist/components/simple/forms/TreeEditorItem.svelte +120 -0
- package/dist/components/simple/forms/TreeEditorItem.svelte.d.ts +32 -0
- package/dist/components/simple/progress/ProgressBar.css +7 -0
- package/dist/components/simple/progress/ProgressBar.svelte +28 -8
- package/dist/components/simple/progress/ProgressBar.svelte.d.ts +2 -5
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/utils/filters/filters.d.ts +5 -1
- package/dist/utils/filters/filters.js +6 -3
- package/package.json +3 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<script>import "../../../css/main.css";
|
|
2
|
+
import Menu from "../../simple/common/Menu.svelte";
|
|
3
|
+
export let activator, menuOpen = false, menuProps = {}, appearTimeout = void 0;
|
|
4
|
+
let mouseEnterHandler = void 0, mouseLeaveHandler = void 0, appearTimeoutId = void 0;
|
|
5
|
+
$:
|
|
6
|
+
if (!!activator) {
|
|
7
|
+
if (!!mouseEnterHandler)
|
|
8
|
+
activator.removeEventListener("mouseenter", mouseEnterHandler);
|
|
9
|
+
if (!!mouseLeaveHandler)
|
|
10
|
+
activator.removeEventListener("mouseleave", mouseLeaveHandler);
|
|
11
|
+
mouseEnterHandler = () => {
|
|
12
|
+
if (appearTimeout !== void 0) {
|
|
13
|
+
if (appearTimeoutId !== void 0)
|
|
14
|
+
clearTimeout(appearTimeoutId);
|
|
15
|
+
appearTimeoutId = setTimeout(() => {
|
|
16
|
+
menuOpen = true;
|
|
17
|
+
}, appearTimeout);
|
|
18
|
+
} else {
|
|
19
|
+
menuOpen = true;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
activator.addEventListener("mouseenter", mouseEnterHandler);
|
|
23
|
+
mouseLeaveHandler = () => {
|
|
24
|
+
if (appearTimeoutId !== void 0)
|
|
25
|
+
clearTimeout(appearTimeoutId);
|
|
26
|
+
menuOpen = false;
|
|
27
|
+
};
|
|
28
|
+
activator.addEventListener("mouseleave", mouseLeaveHandler);
|
|
29
|
+
}
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<Menu
|
|
33
|
+
bind:open={menuOpen}
|
|
34
|
+
bind:activator
|
|
35
|
+
anchor="bottom-center"
|
|
36
|
+
stayInViewport={true}
|
|
37
|
+
flipOnOverflow={true}
|
|
38
|
+
{...menuProps}
|
|
39
|
+
>
|
|
40
|
+
<slot></slot>
|
|
41
|
+
</Menu>
|
|
42
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
import '../../../css/main.css';
|
|
3
|
+
declare const __propDef: {
|
|
4
|
+
props: {
|
|
5
|
+
activator: HTMLElement;
|
|
6
|
+
menuOpen?: boolean | undefined;
|
|
7
|
+
menuProps?: {
|
|
8
|
+
_top?: number | undefined;
|
|
9
|
+
_left?: number | undefined;
|
|
10
|
+
_width?: string | undefined;
|
|
11
|
+
_height?: string | undefined;
|
|
12
|
+
_maxHeight?: string | undefined;
|
|
13
|
+
_minWidth?: string | undefined;
|
|
14
|
+
_overflow?: string | undefined;
|
|
15
|
+
_boxShadow?: string | undefined;
|
|
16
|
+
_borderRadius?: string | undefined;
|
|
17
|
+
_activatorGap?: number | undefined;
|
|
18
|
+
open?: boolean | undefined;
|
|
19
|
+
refreshPosition?: boolean | undefined;
|
|
20
|
+
activator?: HTMLElement | undefined;
|
|
21
|
+
anchor?: "bottom" | "bottom-center" | "right-center" | undefined;
|
|
22
|
+
closeOnClickOutside?: boolean | undefined;
|
|
23
|
+
inAnimation?: ((node: Element, params?: import("svelte/transition").SlideParams | import("svelte/transition").FlyParams | import("svelte/transition").FadeParams | undefined) => import("svelte/transition").TransitionConfig) | undefined;
|
|
24
|
+
inAnimationConfig?: import("svelte/transition").SlideParams | import("svelte/transition").FlyParams | import("svelte/transition").FadeParams | undefined;
|
|
25
|
+
outAnimation?: ((node: Element, params?: import("svelte/transition").SlideParams | import("svelte/transition").FlyParams | import("svelte/transition").FadeParams | undefined) => import("svelte/transition").TransitionConfig) | undefined;
|
|
26
|
+
outAnimationConfig?: import("svelte/transition").SlideParams | import("svelte/transition").FlyParams | import("svelte/transition").FadeParams | undefined;
|
|
27
|
+
menuElement?: HTMLElement | undefined;
|
|
28
|
+
flipOnOverflow?: boolean | undefined;
|
|
29
|
+
stayInViewport?: boolean | undefined;
|
|
30
|
+
openingId?: string | undefined;
|
|
31
|
+
} | undefined;
|
|
32
|
+
appearTimeout?: number | undefined;
|
|
33
|
+
};
|
|
34
|
+
events: {
|
|
35
|
+
[evt: string]: CustomEvent<any>;
|
|
36
|
+
};
|
|
37
|
+
slots: {
|
|
38
|
+
default: {};
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
export type ToolTipProps = typeof __propDef.props;
|
|
42
|
+
export type ToolTipEvents = typeof __propDef.events;
|
|
43
|
+
export type ToolTipSlots = typeof __propDef.slots;
|
|
44
|
+
export default class ToolTip extends SvelteComponentTyped<ToolTipProps, ToolTipEvents, ToolTipSlots> {
|
|
45
|
+
}
|
|
46
|
+
export {};
|
|
@@ -31,6 +31,7 @@ declare const __propDef: {
|
|
|
31
31
|
searchText?: string | undefined;
|
|
32
32
|
maxVisibleChips?: number | undefined;
|
|
33
33
|
menuOpened?: boolean | undefined;
|
|
34
|
+
closeOnSelect?: boolean | undefined;
|
|
34
35
|
menuBoxShadow?: string | undefined;
|
|
35
36
|
menuBorderRadius?: string | undefined;
|
|
36
37
|
mobileDrawer?: boolean | undefined;
|
|
@@ -11,7 +11,7 @@ import Dialog from "../../simple/dialogs/Dialog.svelte";
|
|
|
11
11
|
let clazz = {};
|
|
12
12
|
export { clazz as class };
|
|
13
13
|
let dispatch = createEventDispatcher();
|
|
14
|
-
export let menuOpened = false, openingId = "date-picker-text-field", pattern = "dd/MM/yyyy", selectedMonth = void 0, selectedYear = void 0, visibleMonth = void 0, visibleYear = void 0, selectedDate = void 0, placeholder = void 0, mobileDialog = true;
|
|
14
|
+
export let menuOpened = false, openingId = "date-picker-text-field", pattern = "dd/MM/yyyy", selectedMonth = void 0, selectedYear = void 0, visibleMonth = void 0, visibleYear = void 0, selectedDate = void 0, placeholder = void 0, mobileDialog = true, maxYearInRange = 2100, minYearInRange = 1970;
|
|
15
15
|
let activator, refreshPosition = false, menuElement, inputElement, mask = {
|
|
16
16
|
value: void 0
|
|
17
17
|
}, maskFactoryArgs = {
|
|
@@ -26,8 +26,8 @@ let activator, refreshPosition = false, menuElement, inputElement, mask = {
|
|
|
26
26
|
blocks: {
|
|
27
27
|
yyyy: {
|
|
28
28
|
mask: IMask.MaskedRange,
|
|
29
|
-
from:
|
|
30
|
-
to:
|
|
29
|
+
from: minYearInRange,
|
|
30
|
+
to: maxYearInRange
|
|
31
31
|
},
|
|
32
32
|
MM: {
|
|
33
33
|
mask: IMask.MaskedRange,
|
|
@@ -18,6 +18,8 @@ declare const __propDef: {
|
|
|
18
18
|
selectedDate?: Date | undefined;
|
|
19
19
|
placeholder?: string | undefined;
|
|
20
20
|
mobileDialog?: boolean | undefined;
|
|
21
|
+
maxYearInRange?: number | undefined;
|
|
22
|
+
minYearInRange?: number | undefined;
|
|
21
23
|
};
|
|
22
24
|
events: {
|
|
23
25
|
'day-click': CustomEvent<{
|
|
@@ -14,7 +14,7 @@ export let headers = [], items = [], sortedBy = void 0, sortDirection = void 0,
|
|
|
14
14
|
{ label: "20", value: 20 },
|
|
15
15
|
{ label: "50", value: 50 },
|
|
16
16
|
{ label: "100", value: 100 }
|
|
17
|
-
], hideRowsPerPage = false, totalElements = void 0, rowsPerPage = 20, filters = [], searchBarColumns = void 0, searchBarVisible = true, lang = "en";
|
|
17
|
+
], hideRowsPerPage = false, totalElements = void 0, rowsPerPage = 20, filters = [], searchBarColumns = void 0, searchBarVisible = true, searchBarPlaceholder = "Type something to search...", customFiltersValid = {}, customFiltersValues = void 0, lang = "en";
|
|
18
18
|
let searchBarInput, searchText = void 0;
|
|
19
19
|
let dispatch = createEventDispatcher();
|
|
20
20
|
let rowsPerPageSelection = [];
|
|
@@ -39,7 +39,8 @@ function handleSearchChange(searchText2) {
|
|
|
39
39
|
let converter = new Converter();
|
|
40
40
|
let builder;
|
|
41
41
|
builder = converter.createBuilder({
|
|
42
|
-
filters: filters || []
|
|
42
|
+
filters: filters || [],
|
|
43
|
+
customFiltersValues
|
|
43
44
|
});
|
|
44
45
|
if (!!searchText2 && !!searchBarColumns && searchBarColumns.length > 0) {
|
|
45
46
|
builder.where((b) => {
|
|
@@ -64,7 +65,7 @@ function handleFiltersChange() {
|
|
|
64
65
|
{#if searchBarVisible}
|
|
65
66
|
<slot name="search-bar" {handleSearchChange}>
|
|
66
67
|
<SearchBar
|
|
67
|
-
placeholder=
|
|
68
|
+
placeholder={searchBarPlaceholder}
|
|
68
69
|
bind:input={searchBarInput}
|
|
69
70
|
bind:value={searchText}
|
|
70
71
|
>
|
|
@@ -78,10 +79,17 @@ function handleFiltersChange() {
|
|
|
78
79
|
on:removeFilter={handleFiltersChange}
|
|
79
80
|
--filters-default-wrapper-width="100%"
|
|
80
81
|
{lang}
|
|
81
|
-
|
|
82
|
+
{customFiltersValid}
|
|
83
|
+
>
|
|
82
84
|
<svelte:fragment slot="append">
|
|
83
85
|
<slot name="filter-append"></slot>
|
|
84
86
|
</svelte:fragment>
|
|
87
|
+
<svelte:fragment slot="custom" let:filter>
|
|
88
|
+
<slot name="custom-filter" {filter}></slot>
|
|
89
|
+
</svelte:fragment>
|
|
90
|
+
<svelte:fragment slot="custom-mobile" let:filter>
|
|
91
|
+
<slot name="custom-filter-mobile" {filter}></slot>
|
|
92
|
+
</svelte:fragment>
|
|
85
93
|
</Filters>
|
|
86
94
|
</div>
|
|
87
95
|
<SimpleTable
|
|
@@ -24,6 +24,13 @@ declare const __propDef: {
|
|
|
24
24
|
filters?: ComponentProps<Filters>['filters'];
|
|
25
25
|
searchBarColumns?: string[] | undefined;
|
|
26
26
|
searchBarVisible?: boolean | undefined;
|
|
27
|
+
searchBarPlaceholder?: string | undefined;
|
|
28
|
+
customFiltersValid?: {
|
|
29
|
+
[filterName: string]: boolean;
|
|
30
|
+
} | undefined;
|
|
31
|
+
customFiltersValues?: {
|
|
32
|
+
[filterName: string]: any;
|
|
33
|
+
} | undefined;
|
|
27
34
|
lang?: "it" | "en" | undefined;
|
|
28
35
|
};
|
|
29
36
|
events: {
|
|
@@ -44,6 +51,12 @@ declare const __propDef: {
|
|
|
44
51
|
handleSearchChange: (searchText: string | undefined) => void;
|
|
45
52
|
};
|
|
46
53
|
'filter-append': {};
|
|
54
|
+
'custom-filter': {
|
|
55
|
+
filter: import("../../../utils/filters/filters").Filter | undefined;
|
|
56
|
+
};
|
|
57
|
+
'custom-filter-mobile': {
|
|
58
|
+
filter: import("../../../utils/filters/filters").Filter | undefined;
|
|
59
|
+
};
|
|
47
60
|
header: {
|
|
48
61
|
head: import("../../simple/lists/SimpleTable.svelte").Header;
|
|
49
62
|
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
<script context="module">export function isProgressItem(obj) {
|
|
2
|
+
return (obj.label === void 0 || typeof obj.label === "string") && (obj.color === void 0 || typeof obj.color === "string") && typeof obj.value === "number";
|
|
3
|
+
}
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<script>import "./HorizontalStackedProgress.css";
|
|
7
|
+
import ProgressBar from "../../simple/progress/ProgressBar.svelte";
|
|
8
|
+
export let progresses = [], labelVisible = true;
|
|
9
|
+
let colors = [
|
|
10
|
+
"rgb(var(--global-color-primary-500))",
|
|
11
|
+
"rgb(var(--global-color-primary-300))",
|
|
12
|
+
"rgb(var(--global-color-primary-700))",
|
|
13
|
+
"rgb(var(--global-color-primary-500), .5)",
|
|
14
|
+
"rgb(var(--global-color-primary-600), .5)",
|
|
15
|
+
"rgb(var(--global-color-primary-700), .5)"
|
|
16
|
+
];
|
|
17
|
+
$:
|
|
18
|
+
total = progresses.reduce((p, c, i, a) => {
|
|
19
|
+
if (isProgressItem(c)) {
|
|
20
|
+
return p + c.value;
|
|
21
|
+
} else {
|
|
22
|
+
return p + c;
|
|
23
|
+
}
|
|
24
|
+
}, 0);
|
|
25
|
+
$:
|
|
26
|
+
progressesItems = progresses.map((p, i) => {
|
|
27
|
+
let item;
|
|
28
|
+
let value = isProgressItem(p) ? p.value : p;
|
|
29
|
+
let percentage = Number((100 * value / total).toFixed(2));
|
|
30
|
+
let color = isProgressItem(p) ? p.color : colors[i % colors.length];
|
|
31
|
+
item = {
|
|
32
|
+
...isProgressItem(p) ? p : {},
|
|
33
|
+
color,
|
|
34
|
+
value,
|
|
35
|
+
percentage
|
|
36
|
+
};
|
|
37
|
+
return item;
|
|
38
|
+
}).filter((p) => p.value !== 0);
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<div
|
|
42
|
+
class="stacked-container"
|
|
43
|
+
>
|
|
44
|
+
{#each progressesItems as progress}
|
|
45
|
+
<div
|
|
46
|
+
style:width={progress.percentage + '%'}
|
|
47
|
+
class="single-progress-container"
|
|
48
|
+
>
|
|
49
|
+
<ProgressBar
|
|
50
|
+
total={progress.value}
|
|
51
|
+
value={progress.value}
|
|
52
|
+
--progress-bar-highlight-color={progress.color}
|
|
53
|
+
></ProgressBar>
|
|
54
|
+
{#if progress.label && labelVisible}
|
|
55
|
+
<div class="label">
|
|
56
|
+
<div class="label-text">{progress.label}</div>
|
|
57
|
+
<div class="label-value">
|
|
58
|
+
<div
|
|
59
|
+
class="dot"
|
|
60
|
+
style:background-color={progress.color || 'rgb(var(--global-color-background-300))'}
|
|
61
|
+
></div>
|
|
62
|
+
<div class="value-text">
|
|
63
|
+
{progress.value}
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
{/if}
|
|
68
|
+
</div>
|
|
69
|
+
{/each}
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<style>
|
|
73
|
+
.stacked-container {
|
|
74
|
+
overflow: hidden;
|
|
75
|
+
display: flex;
|
|
76
|
+
gap: var(
|
|
77
|
+
--horizontal-stacked-progress-gap,
|
|
78
|
+
var(--horizontal-stacked-progress-default-gap)
|
|
79
|
+
);
|
|
80
|
+
width: var(
|
|
81
|
+
--horizontal-stacked-progress-width,
|
|
82
|
+
var(--horizontal-stacked-progress-default-width)
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.single-progress-container {
|
|
87
|
+
transition: width 300ms cubic-bezier(0.215, 0.610, 0.355, 1);
|
|
88
|
+
display: flex;
|
|
89
|
+
flex-direction: column;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.label-text {
|
|
93
|
+
font-size: .8rem;
|
|
94
|
+
font-weight: 300;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.label {
|
|
98
|
+
margin-top: 12px;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.label-value {
|
|
102
|
+
display: flex;
|
|
103
|
+
align-items: center;
|
|
104
|
+
gap: 8px;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.value-text {
|
|
108
|
+
font-size: 1.1rem;
|
|
109
|
+
font-weight: 700;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.dot {
|
|
113
|
+
height: 10px;
|
|
114
|
+
width: 10px;
|
|
115
|
+
border-radius: 9999px;
|
|
116
|
+
}
|
|
117
|
+
</style>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
export type ProgressItem = {
|
|
3
|
+
label?: string;
|
|
4
|
+
color?: string;
|
|
5
|
+
value: number;
|
|
6
|
+
};
|
|
7
|
+
export declare function isProgressItem(obj: any): obj is ProgressItem;
|
|
8
|
+
import './HorizontalStackedProgress.css';
|
|
9
|
+
declare const __propDef: {
|
|
10
|
+
props: {
|
|
11
|
+
progresses?: (number | ProgressItem)[] | undefined;
|
|
12
|
+
labelVisible?: boolean | undefined;
|
|
13
|
+
};
|
|
14
|
+
events: {
|
|
15
|
+
[evt: string]: CustomEvent<any>;
|
|
16
|
+
};
|
|
17
|
+
slots: {};
|
|
18
|
+
};
|
|
19
|
+
export type HorizontalStackedProgressProps = typeof __propDef.props;
|
|
20
|
+
export type HorizontalStackedProgressEvents = typeof __propDef.events;
|
|
21
|
+
export type HorizontalStackedProgressSlots = typeof __propDef.slots;
|
|
22
|
+
export default class HorizontalStackedProgress extends SvelteComponentTyped<HorizontalStackedProgressProps, HorizontalStackedProgressEvents, HorizontalStackedProgressSlots> {
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -7,11 +7,11 @@ import { createEventDispatcher } from "svelte";
|
|
|
7
7
|
import Validator from "../../../utils/filters/validator";
|
|
8
8
|
import Autocomplete from "../../simple/forms/Autocomplete.svelte";
|
|
9
9
|
import Checkbox from "../../simple/forms/Checkbox.svelte";
|
|
10
|
-
export let filter = void 0, lang = "en", cancelFilterLabel = lang == "en" ? "Cancel" : "Annulla", applyFilterLabel = lang == "en" ? "Apply filter" : "Applica filter", betweenFromLabel = lang == "en" ? "From" : "Da", betweenToLabel = lang == "en" ? "To" : "A", labelsMapper;
|
|
10
|
+
export let filter = void 0, lang = "en", cancelFilterLabel = lang == "en" ? "Cancel" : "Annulla", applyFilterLabel = lang == "en" ? "Apply filter" : "Applica filter", betweenFromLabel = lang == "en" ? "From" : "Da", betweenToLabel = lang == "en" ? "To" : "A", labelsMapper, forceApplyValid = false;
|
|
11
11
|
let tmpFilter;
|
|
12
12
|
let advancedModeOptions, advancedModeSelectedOptions;
|
|
13
13
|
function initTmpFilter() {
|
|
14
|
-
tmpFilter =
|
|
14
|
+
tmpFilter = filter === void 0 ? void 0 : { ...filter };
|
|
15
15
|
if (!!tmpFilter && ["string", "number", "date", "select"].includes(tmpFilter.type) && Object.keys(tmpFilter).includes("mode")) {
|
|
16
16
|
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) {
|
|
17
17
|
advancedModeSelectedOptions = [{
|
|
@@ -36,7 +36,7 @@ function handleCancelFilterClick(e) {
|
|
|
36
36
|
}
|
|
37
37
|
function handleApplyFilterClick() {
|
|
38
38
|
if (!!filter && !!tmpFilter) {
|
|
39
|
-
filter =
|
|
39
|
+
filter = { ...tmpFilter };
|
|
40
40
|
filter.active = true;
|
|
41
41
|
dispatch("apply");
|
|
42
42
|
}
|
|
@@ -83,7 +83,7 @@ function handleAdvancedModeSelection() {
|
|
|
83
83
|
dropdownOpened = false;
|
|
84
84
|
}
|
|
85
85
|
$:
|
|
86
|
-
applyFilterDisabled = !Validator.isValid(tmpFilter);
|
|
86
|
+
applyFilterDisabled = !Validator.isValid(tmpFilter) && !forceApplyValid;
|
|
87
87
|
$:
|
|
88
88
|
if (!!tmpFilter && tmpFilter.type == "bool") {
|
|
89
89
|
if (tmpFilter.value === void 0) {
|
|
@@ -200,6 +200,8 @@ $:
|
|
|
200
200
|
{tmpFilter.description}
|
|
201
201
|
</span>
|
|
202
202
|
</div>
|
|
203
|
+
{:else if tmpFilter.type == 'custom'}
|
|
204
|
+
<slot name="custom" filter={tmpFilter}></slot>
|
|
203
205
|
{/if}
|
|
204
206
|
{/if}
|
|
205
207
|
</div>
|
|
@@ -10,6 +10,7 @@ declare const __propDef: {
|
|
|
10
10
|
betweenFromLabel?: string | undefined;
|
|
11
11
|
betweenToLabel?: string | undefined;
|
|
12
12
|
labelsMapper: LabelMapper;
|
|
13
|
+
forceApplyValid?: boolean | undefined;
|
|
13
14
|
};
|
|
14
15
|
events: {
|
|
15
16
|
click: MouseEvent;
|
|
@@ -19,7 +20,11 @@ declare const __propDef: {
|
|
|
19
20
|
} & {
|
|
20
21
|
[evt: string]: CustomEvent<any>;
|
|
21
22
|
};
|
|
22
|
-
slots: {
|
|
23
|
+
slots: {
|
|
24
|
+
custom: {
|
|
25
|
+
filter: Filter | undefined;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
23
28
|
};
|
|
24
29
|
export type FilterEditorProps = typeof __propDef.props;
|
|
25
30
|
export type FilterEditorEvents = typeof __propDef.events;
|
|
@@ -13,7 +13,7 @@ import Chip from "../../simple/navigation/Chip.svelte";
|
|
|
13
13
|
import FilterEditor from "./FilterEditor.svelte";
|
|
14
14
|
import MobileFilterEditor from "./MobileFilterEditor.svelte";
|
|
15
15
|
import { fly } from "svelte/transition";
|
|
16
|
-
export let filters = [], lang = "en", addFilterLabel = lang == "en" ? "Filters" : "Filtri", cancelFilterLabel = lang == "en" ? "Cancel" : "Annulla", applyFilterLabel = lang == "en" ? "Apply filter" : "Applica filtro", showActiveFilters = true, filterTitleLabel = lang == "en" ? "Filter by" : "Filtra per", dateLocale = "en", betweenSeparator = lang == "en" ? "and" : "e", trueString = lang == "en" ? "true" : "vero", falseString = lang == "en" ? "false" : "falso", labelsMapper = lang == "en" ? {
|
|
16
|
+
export let filters = [], lang = "en", addFilterLabel = lang == "en" ? "Filters" : "Filtri", cancelFilterLabel = lang == "en" ? "Cancel" : "Annulla", applyFilterLabel = lang == "en" ? "Apply filter" : "Applica filtro", showActiveFilters = true, filterTitleLabel = lang == "en" ? "Filter by" : "Filtra per", dateLocale = "en", betweenSeparator = lang == "en" ? "and" : "e", trueString = lang == "en" ? "true" : "vero", falseString = lang == "en" ? "false" : "falso", customFiltersValid = {}, labelsMapper = lang == "en" ? {
|
|
17
17
|
"equal": {
|
|
18
18
|
extended: "equal to",
|
|
19
19
|
short: "equal"
|
|
@@ -24,6 +24,9 @@ export let filters = [], lang = "en", addFilterLabel = lang == "en" ? "Filters"
|
|
|
24
24
|
"ilike": {
|
|
25
25
|
short: "includes"
|
|
26
26
|
},
|
|
27
|
+
"contains": {
|
|
28
|
+
short: "contains"
|
|
29
|
+
},
|
|
27
30
|
"greater": {
|
|
28
31
|
short: "greater",
|
|
29
32
|
extended: "greater than"
|
|
@@ -51,6 +54,9 @@ export let filters = [], lang = "en", addFilterLabel = lang == "en" ? "Filters"
|
|
|
51
54
|
"ilike": {
|
|
52
55
|
short: "include"
|
|
53
56
|
},
|
|
57
|
+
"contains": {
|
|
58
|
+
short: "contiene"
|
|
59
|
+
},
|
|
54
60
|
"greater": {
|
|
55
61
|
short: "maggiore",
|
|
56
62
|
extended: "maggiore di"
|
|
@@ -288,10 +294,10 @@ function handleDeleteIconClick(e) {
|
|
|
288
294
|
>
|
|
289
295
|
<div class="drawer-content">
|
|
290
296
|
{#if !!selectedFilter && singleFilterMenuOpened}
|
|
291
|
-
<div
|
|
292
|
-
class="drawer-filter-detail"
|
|
293
|
-
style:height="100%"
|
|
294
|
-
in:fly|local={{delay: 100, duration: 100, x: 200}}
|
|
297
|
+
<div
|
|
298
|
+
class="drawer-filter-detail"
|
|
299
|
+
style:height="100%"
|
|
300
|
+
in:fly|local={{delay: 100, duration: 100, x: 200}}
|
|
295
301
|
out:fly|local={{duration: 100, x: -200}}
|
|
296
302
|
>
|
|
297
303
|
<MobileFilterEditor
|
|
@@ -303,20 +309,26 @@ function handleDeleteIconClick(e) {
|
|
|
303
309
|
on:cancelClick={() => {mobileOpen = false; closeFilterMenu(200)}}
|
|
304
310
|
{lang}
|
|
305
311
|
{labelsMapper}
|
|
312
|
+
forceApplyValid={!!customFiltersValid[selectedFilter.name]}
|
|
306
313
|
>
|
|
307
314
|
<div slot="title">
|
|
308
315
|
<div class="mobile-title">
|
|
309
316
|
{selectedFilter?.label}
|
|
310
317
|
</div>
|
|
311
318
|
</div>
|
|
319
|
+
|
|
320
|
+
<svelte:fragment slot="custom" let:filter>
|
|
321
|
+
<slot name="custom-mobile" {filter}></slot>
|
|
322
|
+
</svelte:fragment>
|
|
323
|
+
|
|
312
324
|
</MobileFilterEditor>
|
|
313
325
|
</div>
|
|
314
326
|
{:else}
|
|
315
|
-
<div
|
|
316
|
-
class="drawer-filter-list"
|
|
317
|
-
style:margin-top="20px"
|
|
318
|
-
style:height="100%"
|
|
319
|
-
out:fly|local={{duration: 100, x: -200}}
|
|
327
|
+
<div
|
|
328
|
+
class="drawer-filter-list"
|
|
329
|
+
style:margin-top="20px"
|
|
330
|
+
style:height="100%"
|
|
331
|
+
out:fly|local={{duration: 100, x: -200}}
|
|
320
332
|
in:fly|local={{duration: 100, x: 200, delay: 100}}
|
|
321
333
|
>
|
|
322
334
|
<SelectableVerticalList
|
|
@@ -401,7 +413,12 @@ function handleDeleteIconClick(e) {
|
|
|
401
413
|
on:apply={handleApplyFilterClick}
|
|
402
414
|
{lang}
|
|
403
415
|
{labelsMapper}
|
|
404
|
-
|
|
416
|
+
forceApplyValid={!!customFiltersValid[selectedFilter.name]}
|
|
417
|
+
>
|
|
418
|
+
<svelte:fragment slot="custom" let:filter>
|
|
419
|
+
<slot name="custom" {filter}></slot>
|
|
420
|
+
</svelte:fragment>
|
|
421
|
+
</FilterEditor>
|
|
405
422
|
{/if}
|
|
406
423
|
</div>
|
|
407
424
|
</Menu>
|
|
@@ -23,6 +23,9 @@ declare const __propDef: {
|
|
|
23
23
|
betweenSeparator?: string | undefined;
|
|
24
24
|
trueString?: string | undefined;
|
|
25
25
|
falseString?: string | undefined;
|
|
26
|
+
customFiltersValid?: {
|
|
27
|
+
[filterName: string]: boolean;
|
|
28
|
+
} | undefined;
|
|
26
29
|
labelsMapper?: LabelMapper | undefined;
|
|
27
30
|
};
|
|
28
31
|
events: {
|
|
@@ -38,6 +41,12 @@ declare const __propDef: {
|
|
|
38
41
|
};
|
|
39
42
|
slots: {
|
|
40
43
|
append: {};
|
|
44
|
+
'custom-mobile': {
|
|
45
|
+
filter: Filter | undefined;
|
|
46
|
+
};
|
|
47
|
+
custom: {
|
|
48
|
+
filter: Filter | undefined;
|
|
49
|
+
};
|
|
41
50
|
};
|
|
42
51
|
};
|
|
43
52
|
export type FiltersProps = typeof __propDef.props;
|
|
@@ -9,11 +9,11 @@ import Icon from "../../simple/media/Icon.svelte";
|
|
|
9
9
|
import { fly } from "svelte/transition";
|
|
10
10
|
import Autocomplete from "../../simple/forms/Autocomplete.svelte";
|
|
11
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;
|
|
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, forceApplyValid = false;
|
|
13
13
|
let dispatch = createEventDispatcher();
|
|
14
14
|
function handleApplyFilterClick() {
|
|
15
15
|
if (!!filter && !!tmpFilter) {
|
|
16
|
-
filter =
|
|
16
|
+
filter = { ...tmpFilter };
|
|
17
17
|
filter.active = true;
|
|
18
18
|
dispatch("apply");
|
|
19
19
|
}
|
|
@@ -21,7 +21,7 @@ function handleApplyFilterClick() {
|
|
|
21
21
|
let step;
|
|
22
22
|
let tmpFilter;
|
|
23
23
|
function initTmpFilter() {
|
|
24
|
-
tmpFilter =
|
|
24
|
+
tmpFilter = filter === void 0 ? void 0 : { ...filter };
|
|
25
25
|
if (!!tmpFilter && tmpFilter.advanced) {
|
|
26
26
|
if (["string", "number", "date", "select"].includes(tmpFilter.type) && Object.keys(tmpFilter).includes("mode")) {
|
|
27
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) {
|
|
@@ -84,7 +84,7 @@ function handleAdvancedModeSelection() {
|
|
|
84
84
|
}
|
|
85
85
|
let canRenderOptions = true;
|
|
86
86
|
$:
|
|
87
|
-
applyFilterDisabled = !Validator.isValid(tmpFilter);
|
|
87
|
+
applyFilterDisabled = !Validator.isValid(tmpFilter) && !forceApplyValid;
|
|
88
88
|
function handleModeBackClick() {
|
|
89
89
|
dispatch("backClick");
|
|
90
90
|
}
|
|
@@ -245,6 +245,8 @@ $:
|
|
|
245
245
|
{tmpFilter.description}
|
|
246
246
|
</span>
|
|
247
247
|
</div>
|
|
248
|
+
{:else if tmpFilter.type == 'custom'}
|
|
249
|
+
<slot name="custom" filter={tmpFilter}></slot>
|
|
248
250
|
{/if}
|
|
249
251
|
</div>
|
|
250
252
|
</div>
|
|
@@ -11,6 +11,7 @@ declare const __propDef: {
|
|
|
11
11
|
betweenFromLabel?: string | undefined;
|
|
12
12
|
betweenToLabel?: string | undefined;
|
|
13
13
|
labelsMapper: LabelMapper;
|
|
14
|
+
forceApplyValid?: boolean | undefined;
|
|
14
15
|
};
|
|
15
16
|
events: {
|
|
16
17
|
keypress: KeyboardEvent;
|
|
@@ -24,6 +25,9 @@ declare const __propDef: {
|
|
|
24
25
|
};
|
|
25
26
|
slots: {
|
|
26
27
|
title: {};
|
|
28
|
+
custom: {
|
|
29
|
+
filter: Filter | undefined;
|
|
30
|
+
};
|
|
27
31
|
};
|
|
28
32
|
};
|
|
29
33
|
export type MobileFilterEditorProps = typeof __propDef.props;
|
|
@@ -5,7 +5,7 @@ import "./Autocomplete.css";
|
|
|
5
5
|
import { scrollInMenu } from "../common/scroller";
|
|
6
6
|
let clazz = {};
|
|
7
7
|
export { clazz as class };
|
|
8
|
-
export let values = [], items, searchFunction = void 0, multiple = false, disabled = false, mandatory = false, placeholder = "", width = "auto", height = "auto", maxWidth = void 0, openingId = "autocomplete-menu", searchText = void 0, maxVisibleChips = void 0, menuOpened = false, menuBoxShadow = "rgb(var(--global-color-background-300), .5) 0px 2px 4px", menuBorderRadius = "5px", mobileDrawer = false;
|
|
8
|
+
export let values = [], items, searchFunction = void 0, multiple = false, disabled = false, mandatory = false, placeholder = "", width = "auto", height = "auto", maxWidth = void 0, openingId = "autocomplete-menu", searchText = void 0, maxVisibleChips = void 0, menuOpened = false, closeOnSelect = false, menuBoxShadow = "rgb(var(--global-color-background-300), .5) 0px 2px 4px", menuBorderRadius = "5px", mobileDrawer = false;
|
|
9
9
|
let dispatch = createEventDispatcher();
|
|
10
10
|
function select(item) {
|
|
11
11
|
const alreadyPresent = values.findIndex((i) => i.value === item.value) != -1;
|
|
@@ -21,6 +21,8 @@ function select(item) {
|
|
|
21
21
|
selection: values
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
|
+
if (!multiple && closeOnSelect)
|
|
25
|
+
menuOpened = false;
|
|
24
26
|
}
|
|
25
27
|
function unselect(item) {
|
|
26
28
|
if (values.length == 1 && mandatory)
|
|
@@ -29,6 +29,7 @@ declare const __propDef: {
|
|
|
29
29
|
searchText?: string | undefined;
|
|
30
30
|
maxVisibleChips?: number | undefined;
|
|
31
31
|
menuOpened?: boolean | undefined;
|
|
32
|
+
closeOnSelect?: boolean | undefined;
|
|
32
33
|
menuBoxShadow?: string | undefined;
|
|
33
34
|
menuBorderRadius?: string | undefined;
|
|
34
35
|
mobileDrawer?: boolean | undefined;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--file-input-default-height: 64px;
|
|
3
|
+
--file-input-default-background-color: rgb(var(--global-color-background-300));
|
|
4
|
+
--file-input-default-color: rgb(var(--global-color-contrast-900));
|
|
5
|
+
--file-input-default-focus-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1), 0 0 #0000, 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
|
|
6
|
+
--file-input-default-border-radius: 5px;
|
|
7
|
+
}
|