fuma 0.3.43 → 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.
@@ -20,7 +20,7 @@ function getDateTime(v) {
20
20
 
21
21
  <FormControl {...$$restProps} let:key>
22
22
  <input
23
- value={value && dayjs(value).format('YYYY-MM-DDThh:mm')}
23
+ value={value && dayjs(value).format('YYYY-MM-DDTHH:mm')}
24
24
  on:input={handleInput}
25
25
  on:focus
26
26
  on:blur
@@ -1,34 +1,32 @@
1
- <script>import { FormControl } from "./index.js";
2
- import { createEventDispatcher } from "svelte";
1
+ <script>import { createEventDispatcher } from "svelte";
2
+ import { FormControl } from "./index.js";
3
+ import dayjs from "dayjs";
3
4
  export let value = void 0;
4
5
  export let input = {};
5
6
  $:
6
7
  ({ class: inputClass = "", ...inputProps } = input);
7
- let valueAsNumber = value;
8
- let valueAsString = msToString(value);
9
- $:
10
- if (value !== valueAsNumber)
11
- valueAsString = msToString(value);
12
8
  const dispatch = createEventDispatcher();
13
- function msToString(ms) {
14
- if (ms === null || ms === void 0)
15
- return "";
16
- const hours = Math.floor(ms / (1e3 * 60 * 60));
17
- const minutes = Math.floor(ms / (1e3 * 60) - hours * 60);
18
- const secondes = Math.floor(ms / 1e3 - minutes * 60);
19
- const format = (n) => n.toString().padStart(2, "0");
20
- return [format(hours), format(minutes), format(secondes)].join(":");
21
- }
22
- const onInput = (event) => {
23
- valueAsNumber = event.currentTarget.valueAsNumber;
24
- value = valueAsNumber;
25
- dispatch("input", valueAsNumber);
9
+ const onInput = ({ currentTarget }) => {
10
+ value = getDateTime(currentTarget.value);
11
+ dispatch("input", value);
26
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
+ }
27
25
  </script>
28
26
 
29
27
  <FormControl {...$$restProps} let:key>
30
28
  <input
31
- value={valueAsString}
29
+ value={value && dayjs(value).format('HH:mm')}
32
30
  on:input={onInput}
33
31
  on:focus
34
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<number>;
4
+ props: InputProps<Date>;
5
5
  events: {
6
6
  focus: FocusEvent;
7
7
  blur: FocusEvent;
8
- input: CustomEvent<number>;
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 ? new Date(period.start) : "",
34
- endDate: period?.end ? new Date(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
  });
@@ -7,26 +7,21 @@ import { Icon } from "../icon/index.js";
7
7
  import { DropDown } from "../menu/index.js";
8
8
  import { InputTime } from "../input/index.js";
9
9
  import { PeriodPicker } from "./index.js";
10
+ import { msToTime, timeToMs } from "../../utils/time.js";
11
+ import dayjs from "dayjs";
10
12
  let dropDown;
11
- const start = $page.url.searchParams.get("start")?.split("T") || [];
12
- const end = $page.url.searchParams.get("end")?.split("T") || [];
13
+ const start = $page.url.searchParams.get("start");
14
+ const end = $page.url.searchParams.get("end");
13
15
  let period = {
14
- start: start[0] || "",
15
- end: end[0] || ""
16
- };
17
- let time = {
18
- start: start[1] || "00:00",
19
- end: end[1] || "23:59"
16
+ start: start ? new Date(start) : null,
17
+ end: end ? new Date(end) : null
20
18
  };
21
19
  $:
22
- isValidPeriod = period.start && period.end && time.start && time.start;
23
- function getLabel(_period, _time) {
20
+ isValidPeriod = !!period.start && !!period.end;
21
+ function getLabel(_period) {
24
22
  if (!_period || !_period.start || !_period.end)
25
23
  return "P\xE9riodes";
26
- return formatRange({
27
- start: /* @__PURE__ */ new Date(`${_period.start}T${_time.start}`),
28
- end: /* @__PURE__ */ new Date(`${_period.end}T${_time.end}`)
29
- });
24
+ return formatRange(_period);
30
25
  }
31
26
  function handleSubmit() {
32
27
  dropDown.hide();
@@ -34,16 +29,15 @@ function handleSubmit() {
34
29
  return;
35
30
  goto(
36
31
  $urlParam.with({
37
- start: `${period.start}T${time.start || "00:00"}`,
38
- end: `${period.end}T${time.end || "23:59"}`
32
+ start: dayjs(period.start).format("HH:mm"),
33
+ end: dayjs(period.end).format("HH:mm")
39
34
  }),
40
35
  { replaceState: true, noScroll: true }
41
36
  );
42
37
  }
43
38
  function handleReset() {
44
39
  dropDown.hide();
45
- period = { start: "", end: "" };
46
- time = { start: "00:00", end: "23:59" };
40
+ period = { start: null, end: null };
47
41
  goto($urlParam.without("start", "end"), { replaceState: true, noScroll: true });
48
42
  }
49
43
  </script>
@@ -52,7 +46,7 @@ function handleReset() {
52
46
  <div slot="activator" class="join">
53
47
  <button class="btn join-item btn-sm shrink flex-nowrap">
54
48
  <Icon path={mdiCalendarMonthOutline} class="opacity-60" size={20} />
55
- {getLabel(period, time)}
49
+ {getLabel(period)}
56
50
  </button>
57
51
  {#if isValidPeriod}
58
52
  <button class="btn btn-square join-item btn-sm" on:click|preventDefault={handleReset}>
@@ -64,12 +58,12 @@ function handleReset() {
64
58
  <form class="flex flex-col" on:submit|preventDefault={handleSubmit} data-sveltekit-replacestate>
65
59
  <PeriodPicker numberOfMonths={1} bind:period />
66
60
 
67
- <input class="hidden" type="text" name="start" value="{period.start}T{time.start || '00:00'}" />
68
- <input class="hidden" type="text" name="end" value="{period.end}T{time.end || '23:59'}" />
61
+ <input class="hidden" type="text" name="start" value={period.start?.toJSON()} />
62
+ <input class="hidden" type="text" name="end" value={period.end?.toJSON()} />
69
63
 
70
64
  <div class="flex gap-2 p-2">
71
- <InputTime label="A partir de" bind:value={time.start} enhanceDisabled class="grow" />
72
- <InputTime label="Jusqu'à" bind:value={time.end} enhanceDisabled class="grow" />
65
+ <InputTime label="A partir de" bind:value={period.start} enhanceDisabled class="grow" />
66
+ <InputTime label="Jusqu'à" bind:value={period.end} enhanceDisabled class="grow" />
73
67
  </div>
74
68
  <button class="btn m-2"> Valider </button>
75
69
  </form>
@@ -1,6 +1,6 @@
1
1
  export type Period = {
2
- start: string;
3
- end: string;
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';
@@ -1,5 +1,6 @@
1
1
  <script>import { goto } from "$app/navigation";
2
2
  import { page } from "$app/stores";
3
+ import { mdiCalendarFilterOutline } from "@mdi/js";
3
4
  import { DropDown } from "../../menu/index.js";
4
5
  import { InputTime } from "../../input/index.js";
5
6
  import { formatRange } from "../../../utils/formatRange.js";
@@ -7,31 +8,19 @@ import { PeriodPicker } from "../../period/index.js";
7
8
  import { urlParam } from "../../../store/param.js";
8
9
  import { jsonParse } from "../../../utils/jsonParse.js";
9
10
  import { Icon } from "../../icon/index.js";
10
- import { mdiCalendarFilterOutline } from "@mdi/js";
11
+ import dayjs from "dayjs";
11
12
  export let field;
12
13
  let dropDown;
13
14
  const initialValue = jsonParse(
14
15
  $page.url.searchParams.get(field.key),
15
16
  {}
16
17
  );
17
- const start = initialValue.start?.split("T") || [];
18
- const end = initialValue.end?.split("T") || [];
19
18
  let period = {
20
- start: start[0] || "",
21
- end: end[0] || ""
22
- };
23
- let time = {
24
- start: start[1] || "00:00",
25
- end: end[1] || "23:59"
19
+ start: initialValue.start ? new Date(initialValue.start) : null,
20
+ end: initialValue.end ? new Date(initialValue.end) : null
26
21
  };
27
22
  $:
28
- isValidPeriod = period.start && period.end && time.start && time.start;
29
- function getLabel(_period, _time) {
30
- return formatRange({
31
- start: /* @__PURE__ */ new Date(`${_period.start}T${_time.start}`),
32
- end: /* @__PURE__ */ new Date(`${_period.end}T${_time.end}`)
33
- });
34
- }
23
+ isValidPeriod = !!period.start && !!period.end;
35
24
  function handleSubmit() {
36
25
  dropDown.hide();
37
26
  if (!isValidPeriod)
@@ -40,8 +29,8 @@ function handleSubmit() {
40
29
  $urlParam.with(
41
30
  {
42
31
  [field.key]: JSON.stringify({
43
- start: `${period.start}T${time.start || "00:00"}`,
44
- end: `${period.end}T${time.end || "23:59"}`
32
+ start: dayjs(period.start).format("HH:mm"),
33
+ end: dayjs(period.end).format("HH:mm")
45
34
  })
46
35
  },
47
36
  "skip",
@@ -52,8 +41,7 @@ function handleSubmit() {
52
41
  }
53
42
  function handleReset() {
54
43
  dropDown.hide();
55
- period = { start: "", end: "" };
56
- time = { start: "00:00", end: "23:59" };
44
+ period = { start: null, end: null };
57
45
  goto($urlParam.without(field.key, "skip", "take"), { replaceState: true, noScroll: true });
58
46
  }
59
47
  </script>
@@ -75,7 +63,7 @@ function handleReset() {
75
63
 
76
64
  {#if isValidPeriod}
77
65
  <span class="badge badge-primary badge-xs text-[0.7rem] font-normal text-white">
78
- {getLabel(period, time)}
66
+ {formatRange(period)}
79
67
  </span>
80
68
  {/if}
81
69
  </button>
@@ -87,17 +75,12 @@ function handleReset() {
87
75
  >
88
76
  <PeriodPicker numberOfMonths={1} bind:period />
89
77
 
90
- <input
91
- class="hidden"
92
- type="text"
93
- name="start"
94
- value="{period.start}T{time.start || '00:00'}"
95
- />
96
- <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()} />
97
80
 
98
81
  <div class="m-2 flex gap-2">
99
- <InputTime label="A partir de" bind:value={time.start} enhanceDisabled class="grow" />
100
- <InputTime label="Jusqu'à" bind:value={time.end} enhanceDisabled class="grow" />
82
+ <InputTime label="A partir de" bind:value={period.start} enhanceDisabled class="grow" />
83
+ <InputTime label="Jusqu'à" bind:value={period.end} enhanceDisabled class="grow" />
101
84
  </div>
102
85
 
103
86
  <div class="m-2 flex flex-row-reverse gap-2">
@@ -1,8 +1,8 @@
1
1
  type Range = {
2
- start: Date | number;
3
- end: Date | number;
2
+ start?: Date | number | null;
3
+ end?: Date | number | null;
4
4
  };
5
- export declare const formatRange: ({ start, end }: Range) => string;
6
- export declare const formatRangeShort: ({ start, end }: Range) => string;
7
- export declare const formatRangeHour: ({ start, end }: Range) => string;
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
- export const formatRange = ({ start, end }) => formater.formatRange(start, end);
18
- export const formatRangeShort = ({ start, end }) => formaterShort.formatRange(start, end);
19
- export const formatRangeHour = ({ start, end }) => {
20
- const _start = dayjs(start);
21
- const _end = dayjs(end);
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(' – ');
@@ -9,3 +9,4 @@ export * from './nestedPaths.js';
9
9
  export * from './constant.js';
10
10
  export * from './csv.js';
11
11
  export * from './eventEmitter.js';
12
+ export * from './time.js';
@@ -9,3 +9,4 @@ export * from './nestedPaths.js';
9
9
  export * from './constant.js';
10
10
  export * from './csv.js';
11
11
  export * from './eventEmitter.js';
12
+ export * from './time.js';
@@ -0,0 +1,2 @@
1
+ export declare function msToTime(ms: number | null | undefined): string;
2
+ export declare function timeToMs(time: string): number;
@@ -0,0 +1,13 @@
1
+ export function msToTime(ms) {
2
+ if (ms === null || ms === undefined)
3
+ return '';
4
+ const hours = Math.floor(ms / (1000 * 60 * 60));
5
+ const minutes = Math.floor(ms / (1000 * 60) - hours * 60);
6
+ const secondes = Math.floor(ms / 1000 - minutes * 60 - hours * 60 * 60);
7
+ const format = (n) => n.toString().padStart(2, '0');
8
+ return [format(hours % 24), format(minutes), format(secondes)].join(':');
9
+ }
10
+ export function timeToMs(time) {
11
+ const [h = 0, m = 0, s = 0] = time.split(':').map((s) => +s);
12
+ return (h * 60 * 60 + m * 60 + s) * 1000;
13
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fuma",
3
- "version": "0.3.43",
3
+ "version": "0.3.45",
4
4
  "description": "My fullstack material build with sveltekit, daisyui, zod, prisma, lucia",
5
5
  "author": {
6
6
  "name": "Jonas Voisard",