fuma 1.0.16 → 1.0.18

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.
Files changed (128) hide show
  1. package/dist/private/Meta.svelte +27 -32
  2. package/dist/private/Meta.svelte.d.ts +0 -1
  3. package/dist/private/api.d.ts +1 -1
  4. package/dist/ui/badge/Badge.svelte +3 -4
  5. package/dist/ui/button/ButtonCopy.svelte +31 -37
  6. package/dist/ui/button/ButtonDelete.svelte +21 -23
  7. package/dist/ui/button/ButtonDelete.svelte.d.ts +0 -1
  8. package/dist/ui/card/Card.svelte +10 -13
  9. package/dist/ui/card/Card.svelte.d.ts +0 -1
  10. package/dist/ui/card/CardBasic.svelte +4 -5
  11. package/dist/ui/card/CardBasic.svelte.d.ts +0 -1
  12. package/dist/ui/card/CardCollapse.svelte +31 -35
  13. package/dist/ui/card/CardCollapse.svelte.d.ts +0 -1
  14. package/dist/ui/card/CardFullScreen.svelte +6 -8
  15. package/dist/ui/card/CardFullScreen.svelte.d.ts +0 -3
  16. package/dist/ui/card/CardLink.svelte +4 -5
  17. package/dist/ui/card/CardLink.svelte.d.ts +0 -1
  18. package/dist/ui/dialog/Dialog.svelte +34 -41
  19. package/dist/ui/dialog/Dialog.svelte.d.ts +0 -1
  20. package/dist/ui/dialog/DialogConfirm.svelte +4 -6
  21. package/dist/ui/dialog/DialogConfirm.svelte.d.ts +0 -1
  22. package/dist/ui/drawer/Drawer.svelte +37 -46
  23. package/dist/ui/drawer/Drawer.svelte.d.ts +0 -16
  24. package/dist/ui/form/Form.svelte +82 -100
  25. package/dist/ui/form/Form.svelte.d.ts +0 -1
  26. package/dist/ui/form/FormInput.svelte +6 -12
  27. package/dist/ui/form/FormInput.svelte.d.ts +0 -18
  28. package/dist/ui/form/FormSection.svelte +16 -23
  29. package/dist/ui/form/formInput.d.ts +0 -1
  30. package/dist/ui/icon/Icon.svelte +32 -35
  31. package/dist/ui/input/FormControl.svelte +32 -38
  32. package/dist/ui/input/FormControl.svelte.d.ts +0 -3
  33. package/dist/ui/input/InputBoolean.svelte +8 -13
  34. package/dist/ui/input/InputBoolean.svelte.d.ts +0 -3
  35. package/dist/ui/input/InputCheckboxs.svelte +20 -22
  36. package/dist/ui/input/InputCheckboxs.svelte.d.ts +0 -3
  37. package/dist/ui/input/InputCheckboxsMenu.svelte +35 -51
  38. package/dist/ui/input/InputCheckboxsMenu.svelte.d.ts +0 -3
  39. package/dist/ui/input/InputCheckboxsTree.svelte +6 -9
  40. package/dist/ui/input/InputCheckboxsTreeNodes.svelte +27 -35
  41. package/dist/ui/input/InputCombo.svelte +34 -43
  42. package/dist/ui/input/InputCombo.svelte.d.ts +0 -3
  43. package/dist/ui/input/InputDate.svelte +17 -22
  44. package/dist/ui/input/InputDateTime.svelte +18 -23
  45. package/dist/ui/input/InputImage.svelte +45 -52
  46. package/dist/ui/input/InputImage.svelte.d.ts +0 -1
  47. package/dist/ui/input/InputImagePreview.svelte +20 -24
  48. package/dist/ui/input/InputNumber.svelte +5 -10
  49. package/dist/ui/input/InputOptionInParam.svelte +10 -12
  50. package/dist/ui/input/InputOptions.svelte +34 -40
  51. package/dist/ui/input/InputPassword.svelte +5 -7
  52. package/dist/ui/input/InputPassword.svelte.d.ts +0 -3
  53. package/dist/ui/input/InputRadio.svelte +32 -36
  54. package/dist/ui/input/InputRadio.svelte.d.ts +0 -3
  55. package/dist/ui/input/InputRelation.svelte +67 -83
  56. package/dist/ui/input/InputRelation.svelte.d.ts +0 -1
  57. package/dist/ui/input/InputRelations.svelte +79 -92
  58. package/dist/ui/input/InputSearch.svelte +10 -13
  59. package/dist/ui/input/InputSelect.svelte +28 -39
  60. package/dist/ui/input/InputText.svelte +7 -8
  61. package/dist/ui/input/InputTextarea.svelte +6 -6
  62. package/dist/ui/input/InputTime.svelte +23 -29
  63. package/dist/ui/input/RelationAfter.svelte +9 -13
  64. package/dist/ui/input/SelectorList.svelte +12 -16
  65. package/dist/ui/input/SelectorList.svelte.d.ts +0 -4
  66. package/dist/ui/input/textRich/InputTextRich.svelte +50 -57
  67. package/dist/ui/input/textRich/InputTextRich.svelte.d.ts +0 -3
  68. package/dist/ui/input/textRich/SuggesionList.svelte +9 -13
  69. package/dist/ui/input/textRich/ToolMark.svelte +9 -12
  70. package/dist/ui/input/textRich/ToolMarkColor.svelte +11 -15
  71. package/dist/ui/input/textRich/ToolMarkLink.svelte +38 -46
  72. package/dist/ui/input/textRich/ToolMenu.svelte +19 -34
  73. package/dist/ui/input/textRich/ToolMenuAlign.svelte +9 -13
  74. package/dist/ui/input/textRich/ToolMenuInsert.svelte +7 -12
  75. package/dist/ui/input/textRich/ToolMenuNode.svelte +10 -14
  76. package/dist/ui/input/textRich/ToolsBar.svelte +11 -15
  77. package/dist/ui/login/Login.svelte +30 -36
  78. package/dist/ui/menu/ContextMenu.svelte +31 -37
  79. package/dist/ui/menu/ContextMenu.svelte.d.ts +0 -1
  80. package/dist/ui/menu/DropDown.svelte +83 -92
  81. package/dist/ui/menu/DropDown.svelte.d.ts +0 -1
  82. package/dist/ui/menu/DropDownMenu.svelte +18 -25
  83. package/dist/ui/menu/DropDownMenu.svelte.d.ts +0 -1
  84. package/dist/ui/mode/ToggleMode.svelte +14 -15
  85. package/dist/ui/mode/ToggleMode.svelte.d.ts +1 -6
  86. package/dist/ui/pagination/Pagination.svelte +8 -9
  87. package/dist/ui/placeholder/Placeholder.svelte +3 -4
  88. package/dist/ui/placeholder/Placeholder.svelte.d.ts +0 -1
  89. package/dist/ui/placeholder/PlaceholderImage.svelte +4 -6
  90. package/dist/ui/placeholder/PlaceholderImage.svelte.d.ts +0 -1
  91. package/dist/ui/range/RangePicker.svelte +62 -75
  92. package/dist/ui/range/RangePicker.svelte.d.ts +2 -2
  93. package/dist/ui/range/RangePickerButton.svelte +35 -43
  94. package/dist/ui/slot/Slot.svelte +25 -42
  95. package/dist/ui/slot/Span.svelte +1 -2
  96. package/dist/ui/table/Table.svelte +28 -35
  97. package/dist/ui/table/TableBody.svelte +12 -18
  98. package/dist/ui/table/TableCell.svelte +10 -13
  99. package/dist/ui/table/TableFieldsEdition.svelte +52 -58
  100. package/dist/ui/table/TableHead.svelte +21 -20
  101. package/dist/ui/table/TableViewSelect.svelte +37 -50
  102. package/dist/ui/table/cell/TableCellArray.svelte +3 -5
  103. package/dist/ui/table/cell/TableCellBoolean.svelte +3 -4
  104. package/dist/ui/table/cell/TableCellNumber.svelte +1 -2
  105. package/dist/ui/table/cell/TableCellString.svelte +2 -5
  106. package/dist/ui/table/cell/TableCellString.svelte.d.ts +20 -10
  107. package/dist/ui/table/field.d.ts +25 -17
  108. package/dist/ui/table/field.js +1 -1
  109. package/dist/ui/table/head/OrderButtons.svelte +37 -0
  110. package/dist/ui/table/head/OrderButtons.svelte.d.ts +20 -0
  111. package/dist/ui/table/head/TableHeadBoolean.svelte +3 -6
  112. package/dist/ui/table/head/TableHeadBoolean.svelte.d.ts +20 -10
  113. package/dist/ui/table/head/TableHeadDate.svelte +113 -61
  114. package/dist/ui/table/head/TableHeadDate.svelte.d.ts +20 -10
  115. package/dist/ui/table/head/TableHeadDefault.svelte +2 -5
  116. package/dist/ui/table/head/TableHeadDefault.svelte.d.ts +20 -10
  117. package/dist/ui/table/head/TableHeadNumber.svelte +76 -67
  118. package/dist/ui/table/head/TableHeadNumber.svelte.d.ts +20 -10
  119. package/dist/ui/table/head/TableHeadSelect.svelte +41 -47
  120. package/dist/ui/table/head/TableHeadSelect.svelte.d.ts +20 -10
  121. package/dist/ui/table/head/TableHeadString.svelte +8 -14
  122. package/dist/ui/table/head/TableHeadString.svelte.d.ts +20 -10
  123. package/dist/ui/table/head/index.d.ts +2 -2
  124. package/dist/ui/tabs/Tabs.svelte +5 -8
  125. package/dist/ui/tabs/TabsIcon.svelte +28 -31
  126. package/dist/validation/zod.d.ts +12 -0
  127. package/dist/validation/zod.js +4 -2
  128. package/package.json +1 -1
@@ -1,53 +1,40 @@
1
- <script lang="ts">
2
- import { onMount } from 'svelte'
3
- import { mdiChevronDown, mdiContentSaveEditOutline, mdiPlus } from '@mdi/js'
4
- import { page } from '$app/stores'
5
- import { enhance } from '$app/forms'
6
-
7
- import { Icon } from '../icon/index.js'
8
- import { Dialog } from '../dialog/index.js'
9
- import { DropDown } from '../menu/index.js'
10
- import { InputText } from '../input/index.js'
11
- import { useForm } from '../../validation/form.js'
12
-
13
- type View = {
14
- id: string
15
- name: string
16
- query: string
17
- }
18
-
19
- export let key: string
20
- export let views: View[]
21
- export let action = ''
22
- export let actionCreate = '?/view_create'
23
- export let actionUpdate = '?/view_update'
24
- export let actionDelete = '?/view_delete'
25
-
26
- let dialog: HTMLDialogElement
27
- const form = useForm({
28
- onSuccess() {
29
- dialog.close()
30
- }
31
- })
32
-
33
- let query = getQuery($page.url)
34
- let selectedView = views.find((v) => v.query === query)
35
- let isNewView = !!query && !selectedView
36
-
37
- onMount(() =>
38
- page.subscribe(({ url }) => {
39
- query = getQuery(url)
40
- selectedView = views.find((v) => v.query === query)
41
- isNewView = !!query && !selectedView
42
- })
43
- )
44
-
45
- function getQuery({ searchParams }: URL) {
46
- const searchParam = new URLSearchParams(searchParams)
47
- searchParam.delete('skip')
48
- searchParam.delete('take')
49
- return searchParam.toString()
50
- }
1
+ <script>import { onMount } from "svelte";
2
+ import { mdiChevronDown, mdiContentSaveEditOutline, mdiPlus } from "@mdi/js";
3
+ import { page } from "$app/stores";
4
+ import { enhance } from "$app/forms";
5
+ import { Icon } from "../icon/index.js";
6
+ import { Dialog } from "../dialog/index.js";
7
+ import { DropDown } from "../menu/index.js";
8
+ import { InputText } from "../input/index.js";
9
+ import { useForm } from "../../validation/form.js";
10
+ export let key;
11
+ export let views;
12
+ export let action = "";
13
+ export let actionCreate = "?/view_create";
14
+ export let actionUpdate = "?/view_update";
15
+ export let actionDelete = "?/view_delete";
16
+ let dialog;
17
+ const form = useForm({
18
+ onSuccess() {
19
+ dialog.close();
20
+ }
21
+ });
22
+ let query = getQuery($page.url);
23
+ let selectedView = views.find((v) => v.query === query);
24
+ let isNewView = !!query && !selectedView;
25
+ onMount(
26
+ () => page.subscribe(({ url }) => {
27
+ query = getQuery(url);
28
+ selectedView = views.find((v) => v.query === query);
29
+ isNewView = !!query && !selectedView;
30
+ })
31
+ );
32
+ function getQuery({ searchParams }) {
33
+ const searchParam = new URLSearchParams(searchParams);
34
+ searchParam.delete("skip");
35
+ searchParam.delete("take");
36
+ return searchParam.toString();
37
+ }
51
38
  </script>
52
39
 
53
40
  <DropDown>
@@ -1,8 +1,6 @@
1
- <script lang="ts">
2
- import { Badge } from '../../badge/index.js'
3
- import { component, type ComponentAndProps } from '../../../utils/component.js'
4
-
5
- export let value: (ComponentAndProps | string | number | boolean)[]
1
+ <script>import { Badge } from "../../badge/index.js";
2
+ import { component } from "../../../utils/component.js";
3
+ export let value;
6
4
  </script>
7
5
 
8
6
  <td>
@@ -1,7 +1,6 @@
1
- <script lang="ts">
2
- import { mdiCheck, mdiClose } from '@mdi/js'
3
- import { Icon } from '../../icon/index.js'
4
- export let value: boolean
1
+ <script>import { mdiCheck, mdiClose } from "@mdi/js";
2
+ import { Icon } from "../../icon/index.js";
3
+ export let value;
5
4
  </script>
6
5
 
7
6
  <td>
@@ -1,5 +1,4 @@
1
- <script lang="ts">
2
- export let value: number
1
+ <script>export let value;
3
2
  </script>
4
3
 
5
4
  <td>
@@ -1,8 +1,5 @@
1
- <script lang="ts">
2
- import type { TableField } from '../index.js'
3
-
4
- export let value: string
5
- export let field: TableField
1
+ <script generics="Item extends {id: string}">export let value;
2
+ export let field;
6
3
  </script>
7
4
 
8
5
  <td data-field-key={field.key} data-field-type={field.type === 'textarea' ? 'textarea' : 'string'}>
@@ -1,18 +1,28 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import type { TableField } from '../index.js';
3
- declare const __propDef: {
4
- props: {
3
+ declare class __sveltets_Render<Item extends {
4
+ id: string;
5
+ }> {
6
+ props(): {
5
7
  value: string;
6
- field: TableField;
8
+ field: TableField<Item>;
7
9
  };
8
- events: {
10
+ events(): {} & {
9
11
  [evt: string]: CustomEvent<any>;
10
12
  };
11
- slots: {};
12
- };
13
- export type TableCellStringProps = typeof __propDef.props;
14
- export type TableCellStringEvents = typeof __propDef.events;
15
- export type TableCellStringSlots = typeof __propDef.slots;
16
- export default class TableCellString extends SvelteComponent<TableCellStringProps, TableCellStringEvents, TableCellStringSlots> {
13
+ slots(): {};
14
+ }
15
+ export type TableCellStringProps<Item extends {
16
+ id: string;
17
+ }> = ReturnType<__sveltets_Render<Item>['props']>;
18
+ export type TableCellStringEvents<Item extends {
19
+ id: string;
20
+ }> = ReturnType<__sveltets_Render<Item>['events']>;
21
+ export type TableCellStringSlots<Item extends {
22
+ id: string;
23
+ }> = ReturnType<__sveltets_Render<Item>['slots']>;
24
+ export default class TableCellString<Item extends {
25
+ id: string;
26
+ }> extends SvelteComponent<TableCellStringProps<Item>, TableCellStringEvents<Item>, TableCellStringSlots<Item>> {
17
27
  }
18
28
  export {};
@@ -1,7 +1,10 @@
1
1
  import type { ComponentAndProps, Primitive } from '../../utils/component.js';
2
2
  import type { Options } from '../../utils/options.js';
3
+ export type ItemBase = {
4
+ id: string;
5
+ };
3
6
  export type TableFieldType = 'string' | 'textarea' | 'number' | 'boolean' | 'select' | 'multiselect' | 'date';
4
- export type TableField<Item = any> = TableFieldCommon & (TableFieldUntyped<Item> | TableFieldPrimitive<Item> | TableFieldSelect<Item> | TableFieldMultiselect<Item>);
7
+ export type TableField<Item extends ItemBase> = TableFieldCommon & (TableFieldUntyped<Item> | TableFieldPrimitive<Item> | TableFieldSelect<Item> | TableFieldMultiselect<Item>);
5
8
  type TableFieldCommon = {
6
9
  key: string;
7
10
  label: string;
@@ -10,23 +13,24 @@ type TableFieldCommon = {
10
13
  hint?: string;
11
14
  locked?: boolean;
12
15
  visible?: boolean;
16
+ sortable?: boolean;
13
17
  /** Internal usage */
14
- $visible?: boolean;
18
+ _visible?: boolean;
15
19
  };
16
- type TableFieldUntyped<Item = any> = {
20
+ type TableFieldUntyped<Item extends ItemBase> = {
17
21
  getCell: (item: Item) => ComponentAndProps[] | ComponentAndProps | Primitive[] | Primitive | undefined | null;
18
- head?: ComponentAndProps | ((field: TableField) => ComponentAndProps);
22
+ head?: ComponentAndProps | ((field: TableField<Item>) => ComponentAndProps);
19
23
  };
20
- type TableFieldPrimitive<Item = any> = {
24
+ type TableFieldPrimitive<Item extends ItemBase> = {
21
25
  type: Exclude<TableFieldType, 'select' | 'multiselect'>;
22
26
  getCell: (item: Item) => ComponentAndProps[] | ComponentAndProps | Primitive | undefined | null;
23
27
  };
24
- type TableFieldSelect<Item = any> = {
28
+ type TableFieldSelect<Item extends ItemBase> = {
25
29
  type: 'select';
26
30
  getCell: (item: Item) => Primitive | undefined | null;
27
31
  options: Options;
28
32
  };
29
- type TableFieldMultiselect<Item = any> = {
33
+ type TableFieldMultiselect<Item extends ItemBase> = {
30
34
  type: 'multiselect';
31
35
  getCell: (item: Item) => Primitive[] | undefined | null;
32
36
  options: Options;
@@ -34,8 +38,8 @@ type TableFieldMultiselect<Item = any> = {
34
38
  /**
35
39
  * Initialise fields from url query
36
40
  */
37
- export declare function syncFieldsWithParams(tablekey: string, fields: TableField[]): ({
38
- $visible: boolean;
41
+ export declare function syncFieldsWithParams<Item extends ItemBase>(tablekey: string, fields: TableField<Item>[]): ({
42
+ _visible: boolean;
39
43
  key: string;
40
44
  label: string;
41
45
  type?: TableFieldType | undefined;
@@ -43,10 +47,11 @@ export declare function syncFieldsWithParams(tablekey: string, fields: TableFiel
43
47
  hint?: string | undefined;
44
48
  locked?: boolean | undefined;
45
49
  visible?: boolean | undefined;
46
- getCell: (item: any) => Primitive | ComponentAndProps | ComponentAndProps[] | Primitive[] | null | undefined;
47
- head?: ComponentAndProps | ((field: TableField<any>) => ComponentAndProps) | undefined;
50
+ sortable?: boolean | undefined;
51
+ getCell: (item: Item) => Primitive | ComponentAndProps | ComponentAndProps[] | Primitive[] | null | undefined;
52
+ head?: ComponentAndProps | ((field: TableField<Item>) => ComponentAndProps) | undefined;
48
53
  } | {
49
- $visible: boolean;
54
+ _visible: boolean;
50
55
  key: string;
51
56
  label: string;
52
57
  type: "string" | "number" | "boolean" | "textarea" | "date";
@@ -54,9 +59,10 @@ export declare function syncFieldsWithParams(tablekey: string, fields: TableFiel
54
59
  hint?: string | undefined;
55
60
  locked?: boolean | undefined;
56
61
  visible?: boolean | undefined;
57
- getCell: (item: any) => Primitive | ComponentAndProps | ComponentAndProps[] | null | undefined;
62
+ sortable?: boolean | undefined;
63
+ getCell: (item: Item) => Primitive | ComponentAndProps | ComponentAndProps[] | null | undefined;
58
64
  } | {
59
- $visible: boolean;
65
+ _visible: boolean;
60
66
  key: string;
61
67
  label: string;
62
68
  type: "select";
@@ -64,9 +70,10 @@ export declare function syncFieldsWithParams(tablekey: string, fields: TableFiel
64
70
  hint?: string | undefined;
65
71
  locked?: boolean | undefined;
66
72
  visible?: boolean | undefined;
67
- getCell: (item: any) => Primitive | null | undefined;
73
+ sortable?: boolean | undefined;
74
+ getCell: (item: Item) => Primitive | null | undefined;
68
75
  } | {
69
- $visible: boolean;
76
+ _visible: boolean;
70
77
  key: string;
71
78
  label: string;
72
79
  type: "multiselect";
@@ -74,6 +81,7 @@ export declare function syncFieldsWithParams(tablekey: string, fields: TableFiel
74
81
  hint?: string | undefined;
75
82
  locked?: boolean | undefined;
76
83
  visible?: boolean | undefined;
77
- getCell: (item: any) => Primitive[] | null | undefined;
84
+ sortable?: boolean | undefined;
85
+ getCell: (item: Item) => Primitive[] | null | undefined;
78
86
  })[];
79
87
  export {};
@@ -14,7 +14,7 @@ export function syncFieldsWithParams(tablekey, fields) {
14
14
  // Init correct visible prop
15
15
  const _fields = fields.map((field) => ({
16
16
  ...field,
17
- $visible: field.locked ||
17
+ _visible: field.locked ||
18
18
  (field.visible ? !fieldsHidden.includes(field.key) : fieldsVisible.includes(field.key))
19
19
  }));
20
20
  // Init correct order fields
@@ -0,0 +1,37 @@
1
+ <script>import { Icon } from "../../icon/index.js";
2
+ import { mdiSortAscending, mdiSortDescending } from "@mdi/js";
3
+ import { createEventDispatcher } from "svelte";
4
+ export let order;
5
+ export let iconAsc = mdiSortAscending;
6
+ export let iconDesc = mdiSortDescending;
7
+ const dispatch = createEventDispatcher();
8
+ const handleOrderClick = (orderBy) => () => {
9
+ if (order === orderBy)
10
+ order = void 0;
11
+ else
12
+ order = orderBy;
13
+ dispatch("change", order);
14
+ };
15
+ </script>
16
+
17
+ <div class="p-1 pt-2">
18
+ <span class="text-sm font-semibold opacity-70">Ordre:</span>
19
+ <div class="grid grid-cols-2 gap-2 pt-2">
20
+ <button
21
+ class="btn ring-primary"
22
+ class:ring-2={order === 'asc'}
23
+ on:click={handleOrderClick('asc')}
24
+ >
25
+ <Icon path={iconAsc} />
26
+ <span>Ascendant</span>
27
+ </button>
28
+ <button
29
+ class="btn ring-primary"
30
+ class:ring-2={order === 'desc'}
31
+ on:click={handleOrderClick('desc')}
32
+ >
33
+ <Icon path={iconDesc} />
34
+ <span>Descendant</span>
35
+ </button>
36
+ </div>
37
+ </div>
@@ -0,0 +1,20 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ order: "desc" | "asc" | undefined;
5
+ iconAsc?: string | undefined;
6
+ iconDesc?: string | undefined;
7
+ };
8
+ events: {
9
+ change: CustomEvent<"desc" | "asc" | undefined>;
10
+ } & {
11
+ [evt: string]: CustomEvent<any>;
12
+ };
13
+ slots: {};
14
+ };
15
+ export type OrderButtonsProps = typeof __propDef.props;
16
+ export type OrderButtonsEvents = typeof __propDef.events;
17
+ export type OrderButtonsSlots = typeof __propDef.slots;
18
+ export default class OrderButtons extends SvelteComponent<OrderButtonsProps, OrderButtonsEvents, OrderButtonsSlots> {
19
+ }
20
+ export {};
@@ -1,9 +1,6 @@
1
- <script lang="ts">
2
- import { mdiCheck, mdiClose } from '@mdi/js'
3
- import type { TableField } from '../index.js'
4
- import TableHeadSelect from './TableHeadSelect.svelte'
5
-
6
- export let field: TableField
1
+ <script generics="Item extends {id: string}">import { mdiCheck, mdiClose } from "@mdi/js";
2
+ import TableHeadSelect from "./TableHeadSelect.svelte";
3
+ export let field;
7
4
  </script>
8
5
 
9
6
  <TableHeadSelect
@@ -1,17 +1,27 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import type { TableField } from '../index.js';
3
- declare const __propDef: {
4
- props: {
5
- field: TableField;
3
+ declare class __sveltets_Render<Item extends {
4
+ id: string;
5
+ }> {
6
+ props(): {
7
+ field: TableField<Item>;
6
8
  };
7
- events: {
9
+ events(): {} & {
8
10
  [evt: string]: CustomEvent<any>;
9
11
  };
10
- slots: {};
11
- };
12
- export type TableHeadBooleanProps = typeof __propDef.props;
13
- export type TableHeadBooleanEvents = typeof __propDef.events;
14
- export type TableHeadBooleanSlots = typeof __propDef.slots;
15
- export default class TableHeadBoolean extends SvelteComponent<TableHeadBooleanProps, TableHeadBooleanEvents, TableHeadBooleanSlots> {
12
+ slots(): {};
13
+ }
14
+ export type TableHeadBooleanProps<Item extends {
15
+ id: string;
16
+ }> = ReturnType<__sveltets_Render<Item>['props']>;
17
+ export type TableHeadBooleanEvents<Item extends {
18
+ id: string;
19
+ }> = ReturnType<__sveltets_Render<Item>['events']>;
20
+ export type TableHeadBooleanSlots<Item extends {
21
+ id: string;
22
+ }> = ReturnType<__sveltets_Render<Item>['slots']>;
23
+ export default class TableHeadBoolean<Item extends {
24
+ id: string;
25
+ }> extends SvelteComponent<TableHeadBooleanProps<Item>, TableHeadBooleanEvents<Item>, TableHeadBooleanSlots<Item>> {
16
26
  }
17
27
  export {};
@@ -1,64 +1,77 @@
1
- <script lang="ts">
2
- import { goto } from '$app/navigation'
3
- import { page } from '$app/stores'
4
- import { mdiCalendarFilterOutline } from '@mdi/js'
5
-
6
- import { DropDown } from '../../menu/index.js'
7
- import { InputTime } from '../../input/index.js'
8
- import type { TableField } from '../index.js'
9
- import { formatRange } from '../../range/format.js'
10
- import { RangePicker } from '../../range/index.js'
11
- import { urlParam } from '../../../store/param.js'
12
- import { jsonParse } from '../../../utils/jsonParse.js'
13
- import { Icon } from '../../icon/index.js'
14
-
15
- export let field: Omit<TableField, 'getCell' | 'type'>
16
-
17
- let dropDown: DropDown
18
- let rangePicker: RangePicker
19
- const initialValue = jsonParse<{ start?: string; end?: string }>(
20
- $page.url.searchParams.get(field.key),
21
- {}
22
- )
23
-
24
- let range = {
25
- start: initialValue.start ? new Date(initialValue.start) : null,
26
- end: initialValue.end ? new Date(initialValue.end) : null
27
- }
28
-
29
- $: isValidPeriod = !!range.start && !!range.end
30
-
31
- function handleSubmit() {
32
- dropDown.hide()
33
- if (!isValidPeriod) return
34
- goto(
35
- $urlParam.with(
36
- {
37
- [field.key]: JSON.stringify({
38
- start: range.start?.toJSON(),
39
- end: range.end?.toJSON()
40
- })
41
- },
42
- 'skip',
43
- 'take'
44
- ),
45
- { replaceState: true, noScroll: true }
46
- )
47
- }
48
-
49
- function handleReset() {
50
- dropDown.hide()
51
- range = { start: null, end: null }
52
- rangePicker.clear()
53
- goto($urlParam.without(field.key, 'skip', 'take'), { replaceState: true, noScroll: true })
54
- }
1
+ <script generics="Item extends {id: string}">import { goto } from "$app/navigation";
2
+ import { page } from "$app/stores";
3
+ import {
4
+ mdiCalendarFilterOutline,
5
+ mdiSortClockAscendingOutline,
6
+ mdiSortClockDescendingOutline
7
+ } from "@mdi/js";
8
+ import { DropDown } from "../../menu/index.js";
9
+ import { InputTime } from "../../input/index.js";
10
+ import { formatRange } from "../../range/format.js";
11
+ import { RangePicker } from "../../range/index.js";
12
+ import { urlParam } from "../../../store/param.js";
13
+ import { jsonParse } from "../../../utils/jsonParse.js";
14
+ import { Icon } from "../../icon/index.js";
15
+ import OrderButtons from "./OrderButtons.svelte";
16
+ export let field;
17
+ let dropDown;
18
+ let rangePicker;
19
+ const initialValue = jsonParse(
20
+ $page.url.searchParams.get(field.key),
21
+ {}
22
+ );
23
+ let { order } = jsonParse($page.url.searchParams.get(field.key), {});
24
+ let range = {
25
+ start: initialValue.start ? new Date(initialValue.start) : null,
26
+ end: initialValue.end ? new Date(initialValue.end) : null
27
+ };
28
+ let isValidPeriod = !!range.start && !!range.end;
29
+ function updateUrl() {
30
+ isValidPeriod = !!range.start && !!range.end;
31
+ if (!isValidPeriod && !order) {
32
+ goto($urlParam.without(field.key, "skip", "take"), {
33
+ replaceState: true,
34
+ noScroll: true,
35
+ keepFocus: true
36
+ });
37
+ return;
38
+ }
39
+ goto(
40
+ $urlParam.with(
41
+ {
42
+ [field.key]: JSON.stringify({
43
+ ...isValidPeriod ? {
44
+ start: range.start?.toJSON(),
45
+ end: range.end?.toJSON()
46
+ } : {},
47
+ ...order ? { order } : {}
48
+ })
49
+ },
50
+ "skip",
51
+ "take"
52
+ ),
53
+ { replaceState: true, noScroll: true, keepFocus: true }
54
+ );
55
+ }
56
+ function handleReset() {
57
+ isValidPeriod = false;
58
+ range.start = null;
59
+ range = { start: null, end: null };
60
+ dropDown.hide();
61
+ rangePicker.clear();
62
+ goto($urlParam.without(field.key, "skip", "take"), {
63
+ replaceState: true,
64
+ noScroll: true,
65
+ keepFocus: true
66
+ });
67
+ }
55
68
  </script>
56
69
 
57
70
  <th class="p-1">
58
71
  <DropDown
59
72
  bind:this={dropDown}
60
- on:mouseLeave={handleSubmit}
61
73
  tippyProps={{ appendTo: () => document.body }}
74
+ hideOnNav={false}
62
75
  class="max-h-none"
63
76
  >
64
77
  <button slot="activator" class="menu-item min-h-8 w-full flex-wrap gap-y-1">
@@ -74,25 +87,64 @@
74
87
  {formatRange(range)}
75
88
  </span>
76
89
  {/if}
90
+ {#if order}
91
+ <Icon
92
+ path={order === 'asc' ? mdiSortClockAscendingOutline : mdiSortClockDescendingOutline}
93
+ size={18}
94
+ class="fill-primary"
95
+ />
96
+ {/if}
77
97
  </button>
78
98
 
99
+ {#if field.sortable !== false}
100
+ <OrderButtons
101
+ bind:order
102
+ on:change={() => {
103
+ updateUrl()
104
+ dropDown.hide()
105
+ }}
106
+ iconAsc={mdiSortClockAscendingOutline}
107
+ iconDesc={mdiSortClockDescendingOutline}
108
+ />
109
+ {/if}
110
+
79
111
  <form
80
- class="flex flex-col font-normal"
81
- on:submit|preventDefault={handleSubmit}
112
+ on:submit|preventDefault={() => dropDown.hide()}
82
113
  data-sveltekit-replacestate
114
+ class="flex flex-col font-normal"
115
+ class:mt-6={field.sortable !== false}
83
116
  >
84
- <RangePicker bind:this={rangePicker} numberOfMonths={1} bind:range />
117
+ <RangePicker
118
+ bind:this={rangePicker}
119
+ numberOfMonths={1}
120
+ on:change={({ detail: newRange }) => {
121
+ range = newRange
122
+ updateUrl()
123
+ }}
124
+ />
85
125
 
86
126
  <input class="hidden" type="text" name="start" value={range.start?.toJSON()} />
87
127
  <input class="hidden" type="text" name="end" value={range.end?.toJSON()} />
88
128
 
89
129
  <div class="m-2 flex gap-2">
90
- <InputTime label="A partir de" bind:value={range.start} enhanceDisabled class="grow" />
91
- <InputTime label="Jusqu'à" bind:value={range.end} enhanceDisabled class="grow" />
130
+ <InputTime
131
+ label="A partir de"
132
+ bind:value={range.start}
133
+ enhanceDisabled
134
+ class="grow"
135
+ on:input={updateUrl}
136
+ />
137
+ <InputTime
138
+ label="Jusqu'à"
139
+ bind:value={range.end}
140
+ enhanceDisabled
141
+ class="grow"
142
+ on:input={updateUrl}
143
+ />
92
144
  </div>
93
145
 
94
146
  <div class="m-2 flex flex-row-reverse gap-2">
95
- <button class="btn"> Valider </button>
147
+ <button class="btn">Ok</button>
96
148
  <button class="btn btn-ghost" type="button" on:click={handleReset}>Effacer</button>
97
149
  </div>
98
150
  </form>
@@ -1,17 +1,27 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import type { TableField } from '../index.js';
3
- declare const __propDef: {
4
- props: {
5
- field: Omit<TableField, 'getCell' | 'type'>;
3
+ declare class __sveltets_Render<Item extends {
4
+ id: string;
5
+ }> {
6
+ props(): {
7
+ field: Omit<TableField<Item>, "type" | "getCell">;
6
8
  };
7
- events: {
9
+ events(): {} & {
8
10
  [evt: string]: CustomEvent<any>;
9
11
  };
10
- slots: {};
11
- };
12
- export type TableHeadDateProps = typeof __propDef.props;
13
- export type TableHeadDateEvents = typeof __propDef.events;
14
- export type TableHeadDateSlots = typeof __propDef.slots;
15
- export default class TableHeadDate extends SvelteComponent<TableHeadDateProps, TableHeadDateEvents, TableHeadDateSlots> {
12
+ slots(): {};
13
+ }
14
+ export type TableHeadDateProps<Item extends {
15
+ id: string;
16
+ }> = ReturnType<__sveltets_Render<Item>['props']>;
17
+ export type TableHeadDateEvents<Item extends {
18
+ id: string;
19
+ }> = ReturnType<__sveltets_Render<Item>['events']>;
20
+ export type TableHeadDateSlots<Item extends {
21
+ id: string;
22
+ }> = ReturnType<__sveltets_Render<Item>['slots']>;
23
+ export default class TableHeadDate<Item extends {
24
+ id: string;
25
+ }> extends SvelteComponent<TableHeadDateProps<Item>, TableHeadDateEvents<Item>, TableHeadDateSlots<Item>> {
16
26
  }
17
27
  export {};
@@ -1,8 +1,5 @@
1
- <script lang="ts">
2
- import type { TableField } from '../index.js'
3
- import { tip } from '../../../action/tip.js'
4
-
5
- export let field: TableField
1
+ <script generics="Item extends {id: string}">import { tip } from "../../../action/tip.js";
2
+ export let field;
6
3
  </script>
7
4
 
8
5
  <th use:tip={{ disable: !field.hint, content: field.hint }}>