fuma 0.3.44 → 0.3.45
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/ui/input/InputDateTime.svelte +1 -1
- package/dist/ui/input/InputTime.svelte +17 -11
- package/dist/ui/input/InputTime.svelte.d.ts +2 -2
- package/dist/ui/period/PeriodPicker.svelte +4 -6
- package/dist/ui/period/PeriodPickerButton.svelte +16 -23
- package/dist/ui/period/index.d.ts +2 -2
- package/dist/ui/table/head/TableHeadDate.svelte +12 -30
- package/dist/utils/formatRange.d.ts +5 -5
- package/dist/utils/formatRange.js +23 -7
- package/package.json +1 -1
|
@@ -1,26 +1,32 @@
|
|
|
1
1
|
<script>import { createEventDispatcher } from "svelte";
|
|
2
2
|
import { FormControl } from "./index.js";
|
|
3
|
-
import
|
|
3
|
+
import dayjs from "dayjs";
|
|
4
4
|
export let value = void 0;
|
|
5
5
|
export let input = {};
|
|
6
6
|
$:
|
|
7
7
|
({ class: inputClass = "", ...inputProps } = input);
|
|
8
|
-
let valueAsNumber = value;
|
|
9
|
-
let valueAsString = msToTime(value);
|
|
10
|
-
$:
|
|
11
|
-
if (value !== valueAsNumber)
|
|
12
|
-
valueAsString = msToTime(value);
|
|
13
8
|
const dispatch = createEventDispatcher();
|
|
14
|
-
const onInput = (
|
|
15
|
-
|
|
16
|
-
value
|
|
17
|
-
dispatch("input", valueAsNumber);
|
|
9
|
+
const onInput = ({ currentTarget }) => {
|
|
10
|
+
value = getDateTime(currentTarget.value);
|
|
11
|
+
dispatch("input", value);
|
|
18
12
|
};
|
|
13
|
+
function getDateTime(v) {
|
|
14
|
+
console.log({ v });
|
|
15
|
+
if (!v)
|
|
16
|
+
return value;
|
|
17
|
+
const date = new Date(value || 0);
|
|
18
|
+
const dateString = [
|
|
19
|
+
date.getFullYear().toString(),
|
|
20
|
+
(date.getMonth() + 1).toString().padStart(2, "0"),
|
|
21
|
+
date.getDate().toString().padStart(2, "0")
|
|
22
|
+
].join("-");
|
|
23
|
+
return /* @__PURE__ */ new Date(`${dateString}T${v}`);
|
|
24
|
+
}
|
|
19
25
|
</script>
|
|
20
26
|
|
|
21
27
|
<FormControl {...$$restProps} let:key>
|
|
22
28
|
<input
|
|
23
|
-
value={
|
|
29
|
+
value={value && dayjs(value).format('HH:mm')}
|
|
24
30
|
on:input={onInput}
|
|
25
31
|
on:focus
|
|
26
32
|
on:blur
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { SvelteComponent } from "svelte";
|
|
2
2
|
import { type InputProps } from './index.js';
|
|
3
3
|
declare const __propDef: {
|
|
4
|
-
props: InputProps<
|
|
4
|
+
props: InputProps<Date>;
|
|
5
5
|
events: {
|
|
6
6
|
focus: FocusEvent;
|
|
7
7
|
blur: FocusEvent;
|
|
8
|
-
input: CustomEvent<
|
|
8
|
+
input: CustomEvent<Date | null>;
|
|
9
9
|
} & {
|
|
10
10
|
[evt: string]: CustomEvent<any>;
|
|
11
11
|
};
|
|
@@ -30,15 +30,13 @@ async function initTimePicker() {
|
|
|
30
30
|
numberOfMonths,
|
|
31
31
|
numberOfColumns,
|
|
32
32
|
showWeekNumbers,
|
|
33
|
-
startDate: period?.start
|
|
34
|
-
endDate: period?.end
|
|
33
|
+
startDate: period?.start ?? void 0,
|
|
34
|
+
endDate: period?.end ?? void 0,
|
|
35
35
|
setup: (picker2) => {
|
|
36
36
|
picker2.on("selected", (date1, date2) => {
|
|
37
|
-
const start = dayjs(date1.dateInstance).format("YYYY-MM-DD");
|
|
38
|
-
const end = dayjs(date2.dateInstance).format("YYYY-MM-DD");
|
|
39
37
|
period = {
|
|
40
|
-
start,
|
|
41
|
-
end
|
|
38
|
+
start: date1.dateInstance,
|
|
39
|
+
end: date2.dateInstance
|
|
42
40
|
};
|
|
43
41
|
dispatch("change", period);
|
|
44
42
|
});
|
|
@@ -8,26 +8,20 @@ import { DropDown } from "../menu/index.js";
|
|
|
8
8
|
import { InputTime } from "../input/index.js";
|
|
9
9
|
import { PeriodPicker } from "./index.js";
|
|
10
10
|
import { msToTime, timeToMs } from "../../utils/time.js";
|
|
11
|
+
import dayjs from "dayjs";
|
|
11
12
|
let dropDown;
|
|
12
|
-
const start = $page.url.searchParams.get("start")
|
|
13
|
-
const end = $page.url.searchParams.get("end")
|
|
13
|
+
const start = $page.url.searchParams.get("start");
|
|
14
|
+
const end = $page.url.searchParams.get("end");
|
|
14
15
|
let period = {
|
|
15
|
-
start: start
|
|
16
|
-
end: end
|
|
17
|
-
};
|
|
18
|
-
let time = {
|
|
19
|
-
start: timeToMs(start[1] || "00:00"),
|
|
20
|
-
end: timeToMs(end[1] || "23:59")
|
|
16
|
+
start: start ? new Date(start) : null,
|
|
17
|
+
end: end ? new Date(end) : null
|
|
21
18
|
};
|
|
22
19
|
$:
|
|
23
|
-
isValidPeriod = period.start && period.end
|
|
24
|
-
function getLabel(_period
|
|
20
|
+
isValidPeriod = !!period.start && !!period.end;
|
|
21
|
+
function getLabel(_period) {
|
|
25
22
|
if (!_period || !_period.start || !_period.end)
|
|
26
23
|
return "P\xE9riodes";
|
|
27
|
-
return formatRange(
|
|
28
|
-
start: /* @__PURE__ */ new Date(`${_period.start}T${msToTime(_time.start)}`),
|
|
29
|
-
end: /* @__PURE__ */ new Date(`${_period.end}T${msToTime(_time.end)}`)
|
|
30
|
-
});
|
|
24
|
+
return formatRange(_period);
|
|
31
25
|
}
|
|
32
26
|
function handleSubmit() {
|
|
33
27
|
dropDown.hide();
|
|
@@ -35,16 +29,15 @@ function handleSubmit() {
|
|
|
35
29
|
return;
|
|
36
30
|
goto(
|
|
37
31
|
$urlParam.with({
|
|
38
|
-
start:
|
|
39
|
-
end:
|
|
32
|
+
start: dayjs(period.start).format("HH:mm"),
|
|
33
|
+
end: dayjs(period.end).format("HH:mm")
|
|
40
34
|
}),
|
|
41
35
|
{ replaceState: true, noScroll: true }
|
|
42
36
|
);
|
|
43
37
|
}
|
|
44
38
|
function handleReset() {
|
|
45
39
|
dropDown.hide();
|
|
46
|
-
period = { start:
|
|
47
|
-
time = { start: 0, end: timeToMs("23:59") };
|
|
40
|
+
period = { start: null, end: null };
|
|
48
41
|
goto($urlParam.without("start", "end"), { replaceState: true, noScroll: true });
|
|
49
42
|
}
|
|
50
43
|
</script>
|
|
@@ -53,7 +46,7 @@ function handleReset() {
|
|
|
53
46
|
<div slot="activator" class="join">
|
|
54
47
|
<button class="btn join-item btn-sm shrink flex-nowrap">
|
|
55
48
|
<Icon path={mdiCalendarMonthOutline} class="opacity-60" size={20} />
|
|
56
|
-
{getLabel(period
|
|
49
|
+
{getLabel(period)}
|
|
57
50
|
</button>
|
|
58
51
|
{#if isValidPeriod}
|
|
59
52
|
<button class="btn btn-square join-item btn-sm" on:click|preventDefault={handleReset}>
|
|
@@ -65,12 +58,12 @@ function handleReset() {
|
|
|
65
58
|
<form class="flex flex-col" on:submit|preventDefault={handleSubmit} data-sveltekit-replacestate>
|
|
66
59
|
<PeriodPicker numberOfMonths={1} bind:period />
|
|
67
60
|
|
|
68
|
-
<input class="hidden" type="text" name="start" value=
|
|
69
|
-
<input class="hidden" type="text" name="end" value=
|
|
61
|
+
<input class="hidden" type="text" name="start" value={period.start?.toJSON()} />
|
|
62
|
+
<input class="hidden" type="text" name="end" value={period.end?.toJSON()} />
|
|
70
63
|
|
|
71
64
|
<div class="flex gap-2 p-2">
|
|
72
|
-
<InputTime label="A partir de" bind:value={
|
|
73
|
-
<InputTime label="Jusqu'à" bind:value={
|
|
65
|
+
<InputTime label="A partir de" bind:value={period.start} enhanceDisabled class="grow" />
|
|
66
|
+
<InputTime label="Jusqu'à" bind:value={period.end} enhanceDisabled class="grow" />
|
|
74
67
|
</div>
|
|
75
68
|
<button class="btn m-2"> Valider </button>
|
|
76
69
|
</form>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type Period = {
|
|
2
|
-
start:
|
|
3
|
-
end:
|
|
2
|
+
start: Date | null | undefined;
|
|
3
|
+
end: Date | null | undefined;
|
|
4
4
|
};
|
|
5
5
|
export { default as PeriodPicker } from './PeriodPicker.svelte';
|
|
6
6
|
export { default as PeriodPickerButton } from './PeriodPickerButton.svelte';
|
|
@@ -4,35 +4,23 @@ import { mdiCalendarFilterOutline } from "@mdi/js";
|
|
|
4
4
|
import { DropDown } from "../../menu/index.js";
|
|
5
5
|
import { InputTime } from "../../input/index.js";
|
|
6
6
|
import { formatRange } from "../../../utils/formatRange.js";
|
|
7
|
-
import { msToTime, timeToMs } from "../../../utils/time.js";
|
|
8
7
|
import { PeriodPicker } from "../../period/index.js";
|
|
9
8
|
import { urlParam } from "../../../store/param.js";
|
|
10
9
|
import { jsonParse } from "../../../utils/jsonParse.js";
|
|
11
10
|
import { Icon } from "../../icon/index.js";
|
|
11
|
+
import dayjs from "dayjs";
|
|
12
12
|
export let field;
|
|
13
13
|
let dropDown;
|
|
14
14
|
const initialValue = jsonParse(
|
|
15
15
|
$page.url.searchParams.get(field.key),
|
|
16
16
|
{}
|
|
17
17
|
);
|
|
18
|
-
const start = initialValue.start?.split("T") || [];
|
|
19
|
-
const end = initialValue.end?.split("T") || [];
|
|
20
18
|
let period = {
|
|
21
|
-
start: start
|
|
22
|
-
end: end
|
|
23
|
-
};
|
|
24
|
-
let time = {
|
|
25
|
-
start: timeToMs(start[1] || "00:00"),
|
|
26
|
-
end: timeToMs(end[1] || "23:59")
|
|
19
|
+
start: initialValue.start ? new Date(initialValue.start) : null,
|
|
20
|
+
end: initialValue.end ? new Date(initialValue.end) : null
|
|
27
21
|
};
|
|
28
22
|
$:
|
|
29
|
-
isValidPeriod = period.start && period.end
|
|
30
|
-
function getLabel(_period, _time) {
|
|
31
|
-
return formatRange({
|
|
32
|
-
start: /* @__PURE__ */ new Date(`${_period.start}T${msToTime(_time.start)}`),
|
|
33
|
-
end: /* @__PURE__ */ new Date(`${_period.end}T${msToTime(_time.end)}`)
|
|
34
|
-
});
|
|
35
|
-
}
|
|
23
|
+
isValidPeriod = !!period.start && !!period.end;
|
|
36
24
|
function handleSubmit() {
|
|
37
25
|
dropDown.hide();
|
|
38
26
|
if (!isValidPeriod)
|
|
@@ -41,8 +29,8 @@ function handleSubmit() {
|
|
|
41
29
|
$urlParam.with(
|
|
42
30
|
{
|
|
43
31
|
[field.key]: JSON.stringify({
|
|
44
|
-
start:
|
|
45
|
-
end:
|
|
32
|
+
start: dayjs(period.start).format("HH:mm"),
|
|
33
|
+
end: dayjs(period.end).format("HH:mm")
|
|
46
34
|
})
|
|
47
35
|
},
|
|
48
36
|
"skip",
|
|
@@ -53,8 +41,7 @@ function handleSubmit() {
|
|
|
53
41
|
}
|
|
54
42
|
function handleReset() {
|
|
55
43
|
dropDown.hide();
|
|
56
|
-
period = { start:
|
|
57
|
-
time = { start: 0, end: timeToMs("23:59") };
|
|
44
|
+
period = { start: null, end: null };
|
|
58
45
|
goto($urlParam.without(field.key, "skip", "take"), { replaceState: true, noScroll: true });
|
|
59
46
|
}
|
|
60
47
|
</script>
|
|
@@ -76,7 +63,7 @@ function handleReset() {
|
|
|
76
63
|
|
|
77
64
|
{#if isValidPeriod}
|
|
78
65
|
<span class="badge badge-primary badge-xs text-[0.7rem] font-normal text-white">
|
|
79
|
-
{
|
|
66
|
+
{formatRange(period)}
|
|
80
67
|
</span>
|
|
81
68
|
{/if}
|
|
82
69
|
</button>
|
|
@@ -88,17 +75,12 @@ function handleReset() {
|
|
|
88
75
|
>
|
|
89
76
|
<PeriodPicker numberOfMonths={1} bind:period />
|
|
90
77
|
|
|
91
|
-
<input
|
|
92
|
-
|
|
93
|
-
type="text"
|
|
94
|
-
name="start"
|
|
95
|
-
value="{period.start}T{time.start || '00:00'}"
|
|
96
|
-
/>
|
|
97
|
-
<input class="hidden" type="text" name="end" value="{period.end}T{time.end || '23:59'}" />
|
|
78
|
+
<input class="hidden" type="text" name="start" value={period.start?.toJSON()} />
|
|
79
|
+
<input class="hidden" type="text" name="end" value={period.end?.toJSON()} />
|
|
98
80
|
|
|
99
81
|
<div class="m-2 flex gap-2">
|
|
100
|
-
<InputTime label="A partir de" bind:value={
|
|
101
|
-
<InputTime label="Jusqu'à" bind:value={
|
|
82
|
+
<InputTime label="A partir de" bind:value={period.start} enhanceDisabled class="grow" />
|
|
83
|
+
<InputTime label="Jusqu'à" bind:value={period.end} enhanceDisabled class="grow" />
|
|
102
84
|
</div>
|
|
103
85
|
|
|
104
86
|
<div class="m-2 flex flex-row-reverse gap-2">
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
type Range = {
|
|
2
|
-
start
|
|
3
|
-
end
|
|
2
|
+
start?: Date | number | null;
|
|
3
|
+
end?: Date | number | null;
|
|
4
4
|
};
|
|
5
|
-
export declare const formatRange: (
|
|
6
|
-
export declare const formatRangeShort: (
|
|
7
|
-
export declare const formatRangeHour: (
|
|
5
|
+
export declare const formatRange: (range: Range) => string;
|
|
6
|
+
export declare const formatRangeShort: (range: Range) => "" | undefined;
|
|
7
|
+
export declare const formatRangeHour: (range: Range) => string;
|
|
8
8
|
export {};
|
|
@@ -6,19 +6,35 @@ const formater = new Intl.DateTimeFormat('fr-ch', {
|
|
|
6
6
|
year: '2-digit',
|
|
7
7
|
hour: 'numeric',
|
|
8
8
|
minute: 'numeric',
|
|
9
|
-
timeZone: 'Europe/Zurich'
|
|
9
|
+
timeZone: 'Europe/Zurich'
|
|
10
10
|
});
|
|
11
11
|
const formaterShort = new Intl.DateTimeFormat('fr-ch', {
|
|
12
12
|
weekday: 'short',
|
|
13
13
|
hour: 'numeric',
|
|
14
14
|
minute: 'numeric',
|
|
15
|
-
timeZone: 'Europe/Zurich'
|
|
15
|
+
timeZone: 'Europe/Zurich'
|
|
16
16
|
});
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
function isRequiredRange(range) {
|
|
18
|
+
return (range.start !== null &&
|
|
19
|
+
range.start !== undefined &&
|
|
20
|
+
range.end !== null &&
|
|
21
|
+
range.end !== undefined);
|
|
22
|
+
}
|
|
23
|
+
export const formatRange = (range) => {
|
|
24
|
+
if (!isRequiredRange(range))
|
|
25
|
+
return '';
|
|
26
|
+
return formater.formatRange(range.start, range.end);
|
|
27
|
+
};
|
|
28
|
+
export const formatRangeShort = (range) => {
|
|
29
|
+
if (!isRequiredRange(range))
|
|
30
|
+
return '';
|
|
31
|
+
formaterShort.formatRange(range.start, range.end);
|
|
32
|
+
};
|
|
33
|
+
export const formatRangeHour = (range) => {
|
|
34
|
+
if (!isRequiredRange(range))
|
|
35
|
+
return '';
|
|
36
|
+
const _start = dayjs(range.start);
|
|
37
|
+
const _end = dayjs(range.end);
|
|
22
38
|
if (_start.isSame(_end))
|
|
23
39
|
return _start.format('HH:mm');
|
|
24
40
|
return [_start.format('HH:mm'), _end.format('HH:mm')].join(' – ');
|