fuma 0.3.60 → 0.4.1

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.
@@ -81,7 +81,7 @@ function getActionPadding() {
81
81
  if (container === "drawer")
82
82
  return "bottom-0 -ml-8 -mr-4 pl-8 pr-4";
83
83
  if (container === "card")
84
- return "-bottom-4 -mx-2 sm:-mx-8 px-2 sm:px-8";
84
+ return "bottom-0 -mx-2 sm:-mx-8 px-2 sm:px-8";
85
85
  if (container === "dialog")
86
86
  return "-bottom-4 -mx-4 px-4";
87
87
  return "bottom-0";
@@ -3,7 +3,7 @@ export * from './drawer/index.js';
3
3
  export * from './input/index.js';
4
4
  export * from './form/index.js';
5
5
  export * from './menu/index.js';
6
- export * from './period/index.js';
6
+ export * from './range/index.js';
7
7
  export * from './table/index.js';
8
8
  export * from './tabs/index.js';
9
9
  export * from './button/index.js';
package/dist/ui/index.js CHANGED
@@ -3,7 +3,7 @@ export * from './drawer/index.js';
3
3
  export * from './input/index.js';
4
4
  export * from './form/index.js';
5
5
  export * from './menu/index.js';
6
- export * from './period/index.js';
6
+ export * from './range/index.js';
7
7
  export * from './table/index.js';
8
8
  export * from './tabs/index.js';
9
9
  export * from './button/index.js';
@@ -1,8 +1,11 @@
1
1
  <script>import { onMount, onDestroy, createEventDispatcher } from "svelte";
2
+ import dayjs from "dayjs";
2
3
  export let numberOfMonths = 3;
3
4
  export let numberOfColumns = numberOfMonths;
4
5
  export let showWeekNumbers = true;
5
- export let period = void 0;
6
+ export let range = void 0;
7
+ export let minDate = void 0;
8
+ export let maxDate = void 0;
6
9
  let startElement;
7
10
  let endElement;
8
11
  let picker;
@@ -29,20 +32,21 @@ async function initTimePicker() {
29
32
  numberOfMonths,
30
33
  numberOfColumns,
31
34
  showWeekNumbers,
32
- startDate: period?.start ?? void 0,
33
- endDate: period?.end ?? void 0,
35
+ minDate,
36
+ maxDate,
37
+ startDate: range?.start ? dayjs(range.start).toDate() : void 0,
38
+ endDate: range?.end ? dayjs(range.end).toDate() : void 0,
34
39
  setup: (picker2) => {
35
40
  picker2.on("selected", (date1, date2) => {
36
- const start = `${getAbsoluteDate(date1.dateInstance)}T${getAbsoluteTime(period?.start)}`;
37
- period = {
41
+ range = {
38
42
  start: /* @__PURE__ */ new Date(
39
- `${getAbsoluteDate(date1.dateInstance)}T${getAbsoluteTime(period?.start)}`
43
+ `${getAbsoluteDate(date1.dateInstance)}T${getAbsoluteTime(range?.start)}`
40
44
  ),
41
45
  end: /* @__PURE__ */ new Date(
42
- `${getAbsoluteDate(date2.dateInstance)}T${getAbsoluteTime(period?.end, "23:59:00")}`
46
+ `${getAbsoluteDate(date2.dateInstance)}T${getAbsoluteTime(range?.end, "23:59:00")}`
43
47
  )
44
48
  };
45
- dispatch("change", period);
49
+ dispatch("change", range);
46
50
  });
47
51
  }
48
52
  });
@@ -51,7 +55,7 @@ const getAbsoluteDate = (date) => [date.getFullYear(), date.getMonth() + 1, date
51
55
  const getAbsoluteTime = (date, defaultTime = "00:00:00") => {
52
56
  if (!date)
53
57
  return defaultTime;
54
- return [date.getHours(), date.getMinutes(), date.getSeconds()].map((n) => n.toString().padStart(2, "0")).join(":");
58
+ return dayjs(date).format("HH:mm:ss");
55
59
  };
56
60
  </script>
57
61
 
@@ -0,0 +1,24 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { Range } from './types.js';
3
+ declare const __propDef: {
4
+ props: {
5
+ numberOfMonths?: number | undefined;
6
+ numberOfColumns?: number | undefined;
7
+ showWeekNumbers?: boolean | undefined;
8
+ range?: Range | undefined;
9
+ minDate?: Date | number | string | undefined;
10
+ maxDate?: Date | number | string | undefined;
11
+ };
12
+ events: {
13
+ change: CustomEvent<Range>;
14
+ } & {
15
+ [evt: string]: CustomEvent<any>;
16
+ };
17
+ slots: {};
18
+ };
19
+ export type RangePickerProps = typeof __propDef.props;
20
+ export type RangePickerEvents = typeof __propDef.events;
21
+ export type RangePickerSlots = typeof __propDef.slots;
22
+ export default class RangePicker extends SvelteComponent<RangePickerProps, RangePickerEvents, RangePickerSlots> {
23
+ }
24
+ export {};
@@ -1,26 +1,28 @@
1
1
  <script>import { mdiCalendarMonthOutline, mdiClose } from "@mdi/js";
2
+ import dayjs from "dayjs";
2
3
  import { goto } from "$app/navigation";
3
4
  import { page } from "$app/stores";
4
5
  import { urlParam } from "../../store/param.js";
5
- import { formatRange } from "../../utils/formatRange.js";
6
+ import { formatRange } from "./format.js";
6
7
  import { Icon } from "../icon/index.js";
7
8
  import { DropDown } from "../menu/index.js";
8
9
  import { InputTime } from "../input/index.js";
9
- import { PeriodPicker } from "./index.js";
10
- import dayjs from "dayjs";
10
+ import { RangePicker } from "./index.js";
11
+ export let minDate = void 0;
12
+ export let maxDate = void 0;
11
13
  let dropDown;
12
14
  const start = $page.url.searchParams.get("start");
13
15
  const end = $page.url.searchParams.get("end");
14
- let period = {
16
+ export let range = {
15
17
  start: start ? new Date(start) : null,
16
18
  end: end ? new Date(end) : null
17
19
  };
18
20
  $:
19
- isValidPeriod = !!period.start && !!period.end;
20
- function getLabel(_period) {
21
- if (!_period || !_period.start || !_period.end)
21
+ isValidPeriod = !!range.start && !!range.end;
22
+ function getLabel(_range) {
23
+ if (!_range || !_range.start || !_range.end)
22
24
  return "P\xE9riodes";
23
- return formatRange(_period);
25
+ return formatRange(_range);
24
26
  }
25
27
  function handleSubmit() {
26
28
  dropDown.hide();
@@ -28,15 +30,15 @@ function handleSubmit() {
28
30
  return;
29
31
  goto(
30
32
  $urlParam.with({
31
- start: dayjs(period.start).format("HH:mm"),
32
- end: dayjs(period.end).format("HH:mm")
33
+ start: dayjs(range.start).format("HH:mm"),
34
+ end: dayjs(range.end).format("HH:mm")
33
35
  }),
34
36
  { replaceState: true, noScroll: true }
35
37
  );
36
38
  }
37
39
  function handleReset() {
38
40
  dropDown.hide();
39
- period = { start: null, end: null };
41
+ range = { start: null, end: null };
40
42
  goto($urlParam.without("start", "end"), { replaceState: true, noScroll: true });
41
43
  }
42
44
  </script>
@@ -45,7 +47,7 @@ function handleReset() {
45
47
  <div slot="activator" class="join">
46
48
  <button class="btn join-item btn-sm shrink flex-nowrap">
47
49
  <Icon path={mdiCalendarMonthOutline} class="opacity-60" size={20} />
48
- {getLabel(period)}
50
+ {getLabel(range)}
49
51
  </button>
50
52
  {#if isValidPeriod}
51
53
  <button class="btn btn-square join-item btn-sm" on:click|preventDefault={handleReset}>
@@ -55,14 +57,14 @@ function handleReset() {
55
57
  </div>
56
58
 
57
59
  <form class="flex flex-col" on:submit|preventDefault={handleSubmit} data-sveltekit-replacestate>
58
- <PeriodPicker numberOfMonths={1} bind:period />
60
+ <RangePicker numberOfMonths={1} bind:range {minDate} {maxDate} />
59
61
 
60
- <input class="hidden" type="text" name="start" value={period.start?.toJSON()} />
61
- <input class="hidden" type="text" name="end" value={period.end?.toJSON()} />
62
+ <input class="hidden" type="text" name="start" value={range.start?.toJSON()} />
63
+ <input class="hidden" type="text" name="end" value={range.end?.toJSON()} />
62
64
 
63
65
  <div class="flex gap-2 p-2">
64
- <InputTime label="A partir de" bind:value={period.start} enhanceDisabled class="grow" />
65
- <InputTime label="Jusqu'à" bind:value={period.end} enhanceDisabled class="grow" />
66
+ <InputTime label="A partir de" bind:value={range.start} enhanceDisabled class="grow" />
67
+ <InputTime label="Jusqu'à" bind:value={range.end} enhanceDisabled class="grow" />
66
68
  </div>
67
69
  <button class="btn m-2"> Valider </button>
68
70
  </form>
@@ -0,0 +1,21 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ minDate?: Date | number | string | undefined;
5
+ maxDate?: Date | number | string | undefined;
6
+ range?: {
7
+ start: Date | null;
8
+ end: Date | null;
9
+ } | undefined;
10
+ };
11
+ events: {
12
+ [evt: string]: CustomEvent<any>;
13
+ };
14
+ slots: {};
15
+ };
16
+ export type RangePickerButtonProps = typeof __propDef.props;
17
+ export type RangePickerButtonEvents = typeof __propDef.events;
18
+ export type RangePickerButtonSlots = typeof __propDef.slots;
19
+ export default class RangePickerButton extends SvelteComponent<RangePickerButtonProps, RangePickerButtonEvents, RangePickerButtonSlots> {
20
+ }
21
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { Range } from './types.js';
2
+ export declare const formatRange: (range?: Range, placeholder?: string) => string;
3
+ export declare const formatRangeShort: (range: Range, placeholder?: string) => string | undefined;
4
+ export declare const formatRangeHour: (range: Range, placeholder?: string) => string;
@@ -0,0 +1,48 @@
1
+ import dayjs from 'dayjs';
2
+ const formater = new Intl.DateTimeFormat('fr-ch', {
3
+ weekday: 'long',
4
+ day: 'numeric',
5
+ month: 'numeric',
6
+ year: '2-digit',
7
+ hour: 'numeric',
8
+ minute: 'numeric',
9
+ timeZone: 'Europe/Zurich'
10
+ });
11
+ const formaterShort = new Intl.DateTimeFormat('fr-ch', {
12
+ weekday: 'short',
13
+ hour: 'numeric',
14
+ minute: 'numeric',
15
+ timeZone: 'Europe/Zurich'
16
+ });
17
+ function isRequiredRange(range) {
18
+ if (!range)
19
+ return false;
20
+ return (range.start !== null &&
21
+ range.start !== undefined &&
22
+ range.end !== null &&
23
+ range.end !== undefined);
24
+ }
25
+ export const formatRange = (range, placeholder = '') => {
26
+ dayjs();
27
+ if (!isRequiredRange(range))
28
+ return placeholder;
29
+ const start = dayjs(range.start).toDate();
30
+ const end = dayjs(range.end).toDate();
31
+ return formater.formatRange(start, end);
32
+ };
33
+ export const formatRangeShort = (range, placeholder = '') => {
34
+ if (!isRequiredRange(range))
35
+ return placeholder;
36
+ const start = dayjs(range.start).toDate();
37
+ const end = dayjs(range.end).toDate();
38
+ formaterShort.formatRange(start, end);
39
+ };
40
+ export const formatRangeHour = (range, placeholder = '') => {
41
+ if (!isRequiredRange(range))
42
+ return placeholder;
43
+ const start = dayjs(range.start);
44
+ const end = dayjs(range.end);
45
+ if (start.isSame(end))
46
+ return start.format('HH:mm');
47
+ return [start.format('HH:mm'), end.format('HH:mm')].join(' – ');
48
+ };
@@ -0,0 +1,4 @@
1
+ export { default as RangePicker } from './RangePicker.svelte';
2
+ export { default as RangePickerButton } from './RangePickerButton.svelte';
3
+ export * from './format.js';
4
+ export * from './types.js';
@@ -0,0 +1,4 @@
1
+ export { default as RangePicker } from './RangePicker.svelte';
2
+ export { default as RangePickerButton } from './RangePickerButton.svelte';
3
+ export * from './format.js';
4
+ export * from './types.js';
@@ -0,0 +1,10 @@
1
+ import dayjs, { type ConfigType } from 'dayjs';
2
+ export type RangeDate = ConfigType;
3
+ export type Range = {
4
+ start: RangeDate;
5
+ end: RangeDate;
6
+ };
7
+ export type RangeRequired = {
8
+ start: string | number | Date | dayjs.Dayjs;
9
+ end: string | number | Date | dayjs.Dayjs;
10
+ };
@@ -0,0 +1 @@
1
+ import dayjs, {} from 'dayjs';
@@ -3,24 +3,23 @@ import { page } from "$app/stores";
3
3
  import { mdiCalendarFilterOutline } from "@mdi/js";
4
4
  import { DropDown } from "../../menu/index.js";
5
5
  import { InputTime } from "../../input/index.js";
6
- import { formatRange } from "../../../utils/formatRange.js";
7
- import { PeriodPicker } from "../../period/index.js";
6
+ import { formatRange } from "../../range/format.js";
7
+ import { RangePicker } from "../../range/index.js";
8
8
  import { urlParam } from "../../../store/param.js";
9
9
  import { jsonParse } from "../../../utils/jsonParse.js";
10
10
  import { Icon } from "../../icon/index.js";
11
- import dayjs from "dayjs";
12
11
  export let field;
13
12
  let dropDown;
14
13
  const initialValue = jsonParse(
15
14
  $page.url.searchParams.get(field.key),
16
15
  {}
17
16
  );
18
- let period = {
17
+ let range = {
19
18
  start: initialValue.start ? new Date(initialValue.start) : null,
20
19
  end: initialValue.end ? new Date(initialValue.end) : null
21
20
  };
22
21
  $:
23
- isValidPeriod = !!period.start && !!period.end;
22
+ isValidPeriod = !!range.start && !!range.end;
24
23
  function handleSubmit() {
25
24
  dropDown.hide();
26
25
  if (!isValidPeriod)
@@ -29,8 +28,8 @@ function handleSubmit() {
29
28
  $urlParam.with(
30
29
  {
31
30
  [field.key]: JSON.stringify({
32
- start: period.start?.toJSON(),
33
- end: period.end?.toJSON()
31
+ start: range.start?.toJSON(),
32
+ end: range.end?.toJSON()
34
33
  })
35
34
  },
36
35
  "skip",
@@ -41,7 +40,7 @@ function handleSubmit() {
41
40
  }
42
41
  function handleReset() {
43
42
  dropDown.hide();
44
- period = { start: null, end: null };
43
+ range = { start: null, end: null };
45
44
  goto($urlParam.without(field.key, "skip", "take"), { replaceState: true, noScroll: true });
46
45
  }
47
46
  </script>
@@ -63,7 +62,7 @@ function handleReset() {
63
62
 
64
63
  {#if isValidPeriod}
65
64
  <span class="badge badge-primary badge-xs text-[0.7rem] font-normal text-white">
66
- {formatRange(period)}
65
+ {formatRange(range)}
67
66
  </span>
68
67
  {/if}
69
68
  </button>
@@ -73,14 +72,14 @@ function handleReset() {
73
72
  on:submit|preventDefault={handleSubmit}
74
73
  data-sveltekit-replacestate
75
74
  >
76
- <PeriodPicker numberOfMonths={1} bind:period />
75
+ <RangePicker numberOfMonths={1} bind:range />
77
76
 
78
- <input class="hidden" type="text" name="start" value={period.start?.toJSON()} />
79
- <input class="hidden" type="text" name="end" value={period.end?.toJSON()} />
77
+ <input class="hidden" type="text" name="start" value={range.start?.toJSON()} />
78
+ <input class="hidden" type="text" name="end" value={range.end?.toJSON()} />
80
79
 
81
80
  <div class="m-2 flex gap-2">
82
- <InputTime label="A partir de" bind:value={period.start} enhanceDisabled class="grow" />
83
- <InputTime label="Jusqu'à" bind:value={period.end} enhanceDisabled class="grow" />
81
+ <InputTime label="A partir de" bind:value={range.start} enhanceDisabled class="grow" />
82
+ <InputTime label="Jusqu'à" bind:value={range.end} enhanceDisabled class="grow" />
84
83
  </div>
85
84
 
86
85
  <div class="m-2 flex flex-row-reverse gap-2">
@@ -1,7 +1,6 @@
1
1
  export * from './component.js';
2
2
  export * from './jsonParse.js';
3
3
  export * from './normalizePath.js';
4
- export * from './formatRange.js';
5
4
  export * from './options.js';
6
5
  export * from './avatar.js';
7
6
  export * from './tippy.js';
@@ -1,7 +1,6 @@
1
1
  export * from './component.js';
2
2
  export * from './jsonParse.js';
3
3
  export * from './normalizePath.js';
4
- export * from './formatRange.js';
5
4
  export * from './options.js';
6
5
  export * from './avatar.js';
7
6
  export * from './tippy.js';
@@ -21,6 +21,7 @@ export type UseFormOptions<ReturnData> = {
21
21
  successUpdate?: BooleanOrFunction;
22
22
  successReset?: BooleanOrFunction;
23
23
  successMessage?: SuccessMessage;
24
+ submitOnChange?: boolean;
24
25
  };
25
26
  export declare function useForm<ReturnData extends Record<string, unknown>>({ onSubmit, onSuccess, onResetError, onError, onFail, successUpdate, successReset, successMessage }?: UseFormOptions<ReturnData>): {
26
27
  enhance: (form: HTMLFormElement) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fuma",
3
- "version": "0.3.60",
3
+ "version": "0.4.1",
4
4
  "description": "My fullstack material build with sveltekit, daisyui, zod, prisma, lucia",
5
5
  "author": {
6
6
  "name": "Jonas Voisard",
@@ -1,22 +0,0 @@
1
- import { SvelteComponent } from "svelte";
2
- import type { Period } from './index.js';
3
- declare const __propDef: {
4
- props: {
5
- numberOfMonths?: number | undefined;
6
- numberOfColumns?: number | undefined;
7
- showWeekNumbers?: boolean | undefined;
8
- period?: Period | undefined;
9
- };
10
- events: {
11
- change: CustomEvent<Period>;
12
- } & {
13
- [evt: string]: CustomEvent<any>;
14
- };
15
- slots: {};
16
- };
17
- export type PeriodPickerProps = typeof __propDef.props;
18
- export type PeriodPickerEvents = typeof __propDef.events;
19
- export type PeriodPickerSlots = typeof __propDef.slots;
20
- export default class PeriodPicker extends SvelteComponent<PeriodPickerProps, PeriodPickerEvents, PeriodPickerSlots> {
21
- }
22
- export {};
@@ -1,14 +0,0 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: Record<string, never>;
4
- events: {
5
- [evt: string]: CustomEvent<any>;
6
- };
7
- slots: {};
8
- };
9
- export type PeriodPickerButtonProps = typeof __propDef.props;
10
- export type PeriodPickerButtonEvents = typeof __propDef.events;
11
- export type PeriodPickerButtonSlots = typeof __propDef.slots;
12
- export default class PeriodPickerButton extends SvelteComponent<PeriodPickerButtonProps, PeriodPickerButtonEvents, PeriodPickerButtonSlots> {
13
- }
14
- export {};
@@ -1,6 +0,0 @@
1
- export type Period = {
2
- start: Date | null | undefined;
3
- end: Date | null | undefined;
4
- };
5
- export { default as PeriodPicker } from './PeriodPicker.svelte';
6
- export { default as PeriodPickerButton } from './PeriodPickerButton.svelte';
@@ -1,2 +0,0 @@
1
- export { default as PeriodPicker } from './PeriodPicker.svelte';
2
- export { default as PeriodPickerButton } from './PeriodPickerButton.svelte';
@@ -1,8 +0,0 @@
1
- type Range = {
2
- start?: Date | number | null;
3
- end?: Date | number | null;
4
- };
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
- export {};
@@ -1,41 +0,0 @@
1
- import dayjs from 'dayjs';
2
- const formater = new Intl.DateTimeFormat('fr-ch', {
3
- weekday: 'long',
4
- day: 'numeric',
5
- month: 'numeric',
6
- year: '2-digit',
7
- hour: 'numeric',
8
- minute: 'numeric',
9
- timeZone: 'Europe/Zurich'
10
- });
11
- const formaterShort = new Intl.DateTimeFormat('fr-ch', {
12
- weekday: 'short',
13
- hour: 'numeric',
14
- minute: 'numeric',
15
- timeZone: 'Europe/Zurich'
16
- });
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);
38
- if (_start.isSame(_end))
39
- return _start.format('HH:mm');
40
- return [_start.format('HH:mm'), _end.format('HH:mm')].join(' – ');
41
- };