fuma 0.3.44 → 0.3.46

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,26 +1,31 @@
1
1
  <script>import { createEventDispatcher } from "svelte";
2
2
  import { FormControl } from "./index.js";
3
- import { msToTime } from "../../utils/time.js";
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 = (event) => {
15
- valueAsNumber = event.currentTarget.valueAsNumber;
16
- value = valueAsNumber;
17
- dispatch("input", valueAsNumber);
9
+ const onInput = ({ currentTarget }) => {
10
+ value = getDateTime(currentTarget.value);
11
+ dispatch("input", value);
18
12
  };
13
+ function getDateTime(v) {
14
+ if (!v)
15
+ return value;
16
+ const date = new Date(value || 0);
17
+ const dateString = [
18
+ date.getFullYear().toString(),
19
+ (date.getMonth() + 1).toString().padStart(2, "0"),
20
+ date.getDate().toString().padStart(2, "0")
21
+ ].join("-");
22
+ return /* @__PURE__ */ new Date(`${dateString}T${v}`);
23
+ }
19
24
  </script>
20
25
 
21
26
  <FormControl {...$$restProps} let:key>
22
27
  <input
23
- value={valueAsString}
28
+ value={value && dayjs(value).format('HH:mm')}
24
29
  on:input={onInput}
25
30
  on:focus
26
31
  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
  };
@@ -1,5 +1,4 @@
1
1
  <script>import { onMount, onDestroy, createEventDispatcher } from "svelte";
2
- import dayjs from "dayjs";
3
2
  export let numberOfMonths = 3;
4
3
  export let numberOfColumns = numberOfMonths;
5
4
  export let showWeekNumbers = true;
@@ -30,15 +29,17 @@ async function initTimePicker() {
30
29
  numberOfMonths,
31
30
  numberOfColumns,
32
31
  showWeekNumbers,
33
- startDate: period?.start ? new Date(period.start) : "",
34
- endDate: period?.end ? new Date(period.end) : "",
32
+ startDate: period?.start ?? void 0,
33
+ endDate: period?.end ?? void 0,
35
34
  setup: (picker2) => {
36
35
  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");
36
+ const [startDate] = date1.dateInstance.toJSON().split("T");
37
+ const [endDate] = date2.dateInstance.toJSON().split("T");
38
+ const startTime = period?.start?.toJSON().split("T").at(1) || "00:00";
39
+ const endTime = period?.end?.toJSON().split("T").at(1) || "00:00";
39
40
  period = {
40
- start,
41
- end
41
+ start: /* @__PURE__ */ new Date(`${startDate}T${startTime}`),
42
+ end: /* @__PURE__ */ new Date(`${endDate}T${endTime}`)
42
43
  };
43
44
  dispatch("change", period);
44
45
  });
@@ -7,27 +7,20 @@ 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";
10
+ import dayjs from "dayjs";
11
11
  let dropDown;
12
- const start = $page.url.searchParams.get("start")?.split("T") || [];
13
- const end = $page.url.searchParams.get("end")?.split("T") || [];
12
+ const start = $page.url.searchParams.get("start");
13
+ const end = $page.url.searchParams.get("end");
14
14
  let period = {
15
- start: start[0] || "",
16
- end: end[0] || ""
17
- };
18
- let time = {
19
- start: timeToMs(start[1] || "00:00"),
20
- end: timeToMs(end[1] || "23:59")
15
+ start: start ? new Date(start) : null,
16
+ end: end ? new Date(end) : null
21
17
  };
22
18
  $:
23
- isValidPeriod = period.start && period.end && time.start && time.start;
24
- function getLabel(_period, _time) {
19
+ isValidPeriod = !!period.start && !!period.end;
20
+ function getLabel(_period) {
25
21
  if (!_period || !_period.start || !_period.end)
26
22
  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
- });
23
+ return formatRange(_period);
31
24
  }
32
25
  function handleSubmit() {
33
26
  dropDown.hide();
@@ -35,16 +28,15 @@ function handleSubmit() {
35
28
  return;
36
29
  goto(
37
30
  $urlParam.with({
38
- start: `${period.start}T${time.start || "00:00"}`,
39
- end: `${period.end}T${time.end || "23:59"}`
31
+ start: dayjs(period.start).format("HH:mm"),
32
+ end: dayjs(period.end).format("HH:mm")
40
33
  }),
41
34
  { replaceState: true, noScroll: true }
42
35
  );
43
36
  }
44
37
  function handleReset() {
45
38
  dropDown.hide();
46
- period = { start: "", end: "" };
47
- time = { start: 0, end: timeToMs("23:59") };
39
+ period = { start: null, end: null };
48
40
  goto($urlParam.without("start", "end"), { replaceState: true, noScroll: true });
49
41
  }
50
42
  </script>
@@ -53,7 +45,7 @@ function handleReset() {
53
45
  <div slot="activator" class="join">
54
46
  <button class="btn join-item btn-sm shrink flex-nowrap">
55
47
  <Icon path={mdiCalendarMonthOutline} class="opacity-60" size={20} />
56
- {getLabel(period, time)}
48
+ {getLabel(period)}
57
49
  </button>
58
50
  {#if isValidPeriod}
59
51
  <button class="btn btn-square join-item btn-sm" on:click|preventDefault={handleReset}>
@@ -65,12 +57,12 @@ function handleReset() {
65
57
  <form class="flex flex-col" on:submit|preventDefault={handleSubmit} data-sveltekit-replacestate>
66
58
  <PeriodPicker numberOfMonths={1} bind:period />
67
59
 
68
- <input class="hidden" type="text" name="start" value="{period.start}T{time.start || '00:00'}" />
69
- <input class="hidden" type="text" name="end" value="{period.end}T{time.end || '23:59'}" />
60
+ <input class="hidden" type="text" name="start" value={period.start?.toJSON()} />
61
+ <input class="hidden" type="text" name="end" value={period.end?.toJSON()} />
70
62
 
71
63
  <div class="flex gap-2 p-2">
72
- <InputTime label="A partir de" bind:value={time.start} enhanceDisabled class="grow" />
73
- <InputTime label="Jusqu'à" bind:value={time.end} enhanceDisabled class="grow" />
64
+ <InputTime label="A partir de" bind:value={period.start} enhanceDisabled class="grow" />
65
+ <InputTime label="Jusqu'à" bind:value={period.end} enhanceDisabled class="grow" />
74
66
  </div>
75
67
  <button class="btn m-2"> Valider </button>
76
68
  </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';
@@ -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[0] || "",
22
- end: end[0] || ""
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 && time.start && time.start;
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: `${period.start}T${time.start || "00:00"}`,
45
- end: `${period.end}T${time.end || "23:59"}`
32
+ start: period.start?.toJSON(),
33
+ end: period.end?.toJSON()
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: "", end: "" };
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
- {getLabel(period, time)}
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
- class="hidden"
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={time.start} enhanceDisabled class="grow" />
101
- <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" />
102
84
  </div>
103
85
 
104
86
  <div class="m-2 flex flex-row-reverse gap-2">
@@ -2,7 +2,7 @@ import { SvelteComponent } from "svelte";
2
2
  import type { TableField } from '../index.js';
3
3
  declare const __propDef: {
4
4
  props: {
5
- field: TableField;
5
+ field: Omit<TableField, 'getCell' | 'type'>;
6
6
  };
7
7
  events: {
8
8
  [evt: string]: CustomEvent<any>;
@@ -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,4 +9,3 @@ 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,4 +9,3 @@ 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';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fuma",
3
- "version": "0.3.44",
3
+ "version": "0.3.46",
4
4
  "description": "My fullstack material build with sveltekit, daisyui, zod, prisma, lucia",
5
5
  "author": {
6
6
  "name": "Jonas Voisard",
@@ -1,2 +0,0 @@
1
- export declare function msToTime(ms: number | null | undefined): string;
2
- export declare function timeToMs(time: string): number;
@@ -1,13 +0,0 @@
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
- }