@tsed/react-formio 3.0.0-alpha.10 → 3.0.0-alpha.12

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 (215) hide show
  1. package/dist/atoms/icon/Icon.js.map +1 -1
  2. package/dist/chunks/index.js +33 -30
  3. package/dist/chunks/index.js.map +1 -1
  4. package/dist/chunks/index.module.js +16 -16
  5. package/dist/chunks/index.module.js.map +1 -1
  6. package/dist/chunks/react-select-animated.esm.js +1204 -1101
  7. package/dist/chunks/react-select-animated.esm.js.map +1 -1
  8. package/dist/hooks/keyboard.constants.d.ts +38 -0
  9. package/dist/hooks/keyboard.constants.js +7 -0
  10. package/dist/hooks/keyboard.constants.js.map +1 -0
  11. package/dist/hooks/useKeyboardControls.d.ts +12 -0
  12. package/dist/hooks/useKeyboardControls.js +35 -0
  13. package/dist/hooks/useKeyboardControls.js.map +1 -0
  14. package/dist/hooks/useTooltip.js.map +1 -1
  15. package/dist/interfaces/Operation.d.ts +12 -2
  16. package/dist/molecules/alert/Alert.js.map +1 -1
  17. package/dist/molecules/button/Button.d.ts +18 -5
  18. package/dist/molecules/button/Button.js +22 -26
  19. package/dist/molecules/button/Button.js.map +1 -1
  20. package/dist/molecules/card/Card.js +7 -5
  21. package/dist/molecules/card/Card.js.map +1 -1
  22. package/dist/molecules/forms/form-control/FormControl.js.map +1 -1
  23. package/dist/molecules/forms/input-tags/InputTags.js +14 -14
  24. package/dist/molecules/forms/input-tags/InputTags.js.map +1 -1
  25. package/dist/molecules/forms/input-tags/components/ChoicesTags.js +26 -26
  26. package/dist/molecules/forms/input-tags/components/ChoicesTags.js.map +1 -1
  27. package/dist/molecules/forms/input-tags/components/ReactTags.js +289 -300
  28. package/dist/molecules/forms/input-tags/components/ReactTags.js.map +1 -1
  29. package/dist/molecules/forms/input-text/InputText.js +3 -3
  30. package/dist/molecules/forms/input-text/InputText.js.map +1 -1
  31. package/dist/molecules/forms/select/Select.js.map +1 -1
  32. package/dist/molecules/forms/select/components/ChoicesSelect.js +71 -73
  33. package/dist/molecules/forms/select/components/ChoicesSelect.js.map +1 -1
  34. package/dist/molecules/forms/select/components/HtmlSelect.js.map +1 -1
  35. package/dist/molecules/forms/select/components/ReactSelect.js +13 -14
  36. package/dist/molecules/forms/select/components/ReactSelect.js.map +1 -1
  37. package/dist/molecules/forms/select/components/choices.template.js +2340 -2257
  38. package/dist/molecules/forms/select/components/choices.template.js.map +1 -1
  39. package/dist/molecules/forms/select/hooks/useOptions.js.map +1 -1
  40. package/dist/molecules/loader/Loader.js.map +1 -1
  41. package/dist/molecules/modal/Modal.js +23 -24
  42. package/dist/molecules/modal/Modal.js.map +1 -1
  43. package/dist/molecules/pagination/Pagination.js +19 -19
  44. package/dist/molecules/pagination/Pagination.js.map +1 -1
  45. package/dist/molecules/pagination/PaginationButton.js.map +1 -1
  46. package/dist/molecules/pagination/utils/getPageNumbers.js.map +1 -1
  47. package/dist/molecules/table/Table.d.ts +11 -3
  48. package/dist/molecules/table/Table.js +31 -32
  49. package/dist/molecules/table/Table.js.map +1 -1
  50. package/dist/molecules/table/components/DefaultArrowSort.js.map +1 -1
  51. package/dist/molecules/table/components/DefaultCell.js.map +1 -1
  52. package/dist/molecules/table/components/DefaultCellFooter.js.map +1 -1
  53. package/dist/molecules/table/components/DefaultCellHeader.js.map +1 -1
  54. package/dist/molecules/table/components/DefaultCellOperations.d.ts +12 -4
  55. package/dist/molecules/table/components/DefaultCellOperations.js +13 -7
  56. package/dist/molecules/table/components/DefaultCellOperations.js.map +1 -1
  57. package/dist/molecules/table/components/DefaultFilter.js.map +1 -1
  58. package/dist/molecules/table/components/DefaultOperationButton.d.ts +12 -4
  59. package/dist/molecules/table/components/DefaultOperationButton.js +1 -1
  60. package/dist/molecules/table/components/DefaultOperationButton.js.map +1 -1
  61. package/dist/molecules/table/filters/RangeFilter.js +23 -24
  62. package/dist/molecules/table/filters/RangeFilter.js.map +1 -1
  63. package/dist/molecules/table/filters/SelectFilter.js +11 -13
  64. package/dist/molecules/table/filters/SelectFilter.js.map +1 -1
  65. package/dist/molecules/table/filters/TextFieldFilter.js.map +1 -1
  66. package/dist/molecules/table/hooks/useTable.d.ts +12 -4
  67. package/dist/molecules/table/hooks/useTable.js +7 -7
  68. package/dist/molecules/table/hooks/useTable.js.map +1 -1
  69. package/dist/molecules/table/hooks/useUniqValues.js.map +1 -1
  70. package/dist/molecules/table/utils/mapFormToColumns.js +20 -21
  71. package/dist/molecules/table/utils/mapFormToColumns.js.map +1 -1
  72. package/dist/molecules/tabs/Tab.d.ts +13 -0
  73. package/dist/molecules/tabs/Tab.js +66 -0
  74. package/dist/molecules/tabs/Tab.js.map +1 -0
  75. package/dist/molecules/tabs/TabList.d.ts +2 -0
  76. package/dist/molecules/tabs/TabList.js +23 -0
  77. package/dist/molecules/tabs/TabList.js.map +1 -0
  78. package/dist/molecules/tabs/TabPanel.d.ts +9 -0
  79. package/dist/molecules/tabs/TabPanel.js +27 -0
  80. package/dist/molecules/tabs/TabPanel.js.map +1 -0
  81. package/dist/molecules/tabs/Tabs.d.ts +4 -16
  82. package/dist/molecules/tabs/Tabs.js +7 -67
  83. package/dist/molecules/tabs/Tabs.js.map +1 -1
  84. package/dist/molecules/tabs/TabsBody.d.ts +1 -0
  85. package/dist/molecules/tabs/TabsBody.js +10 -0
  86. package/dist/molecules/tabs/TabsBody.js.map +1 -0
  87. package/dist/molecules/tabs/TabsLegacy.d.ts +17 -0
  88. package/dist/molecules/tabs/TabsLegacy.js +49 -0
  89. package/dist/molecules/tabs/TabsLegacy.js.map +1 -0
  90. package/dist/molecules/tabs/all.d.ts +5 -0
  91. package/dist/molecules/tabs/all.js +13 -0
  92. package/dist/molecules/tabs/all.js.map +1 -0
  93. package/dist/molecules/tabs/context/TabControl.d.ts +52 -0
  94. package/dist/molecules/tabs/context/TabControl.js +85 -0
  95. package/dist/molecules/tabs/context/TabControl.js.map +1 -0
  96. package/dist/molecules/tabs/hooks/tabControl.d.ts +44 -0
  97. package/dist/molecules/tabs/hooks/tabControl.js +34 -0
  98. package/dist/molecules/tabs/hooks/tabControl.js.map +1 -0
  99. package/dist/organisms/form/Form.js.map +1 -1
  100. package/dist/organisms/form/access/FormAccess.js +41 -41
  101. package/dist/organisms/form/access/FormAccess.js.map +1 -1
  102. package/dist/organisms/form/access/FormAccess.schema.js.map +1 -1
  103. package/dist/organisms/form/access/FormAccess.utils.js +2 -2
  104. package/dist/organisms/form/access/FormAccess.utils.js.map +1 -1
  105. package/dist/organisms/form/{action → actions}/FormAction.js +7 -8
  106. package/dist/organisms/form/actions/FormAction.js.map +1 -0
  107. package/dist/organisms/form/builder/FormBuilder.js.map +1 -1
  108. package/dist/organisms/form/builder/FormEdit.d.ts +3 -1
  109. package/dist/organisms/form/builder/FormEdit.js +38 -35
  110. package/dist/organisms/form/builder/FormEdit.js.map +1 -1
  111. package/dist/organisms/form/builder/FormEdit.reducer.js.map +1 -1
  112. package/dist/organisms/form/builder/FormEditCtas.js +34 -34
  113. package/dist/organisms/form/builder/FormEditCtas.js.map +1 -1
  114. package/dist/organisms/form/builder/FormParameters.js.map +1 -1
  115. package/dist/organisms/form/builder/useFormBuilder.js +41 -38
  116. package/dist/organisms/form/builder/useFormBuilder.js.map +1 -1
  117. package/dist/organisms/form/builder/useFormEdit.js +1 -1
  118. package/dist/organisms/form/builder/useFormEdit.js.map +1 -1
  119. package/dist/organisms/form/exports/FormExport.d.ts +5 -0
  120. package/dist/organisms/form/exports/FormExport.js +55 -0
  121. package/dist/organisms/form/exports/FormExport.js.map +1 -0
  122. package/dist/organisms/form/preview/FormPreview.d.ts +6 -0
  123. package/dist/organisms/form/preview/FormPreview.js +11 -0
  124. package/dist/organisms/form/preview/FormPreview.js.map +1 -0
  125. package/dist/organisms/form/settings/FormSettings.js +24 -24
  126. package/dist/organisms/form/settings/FormSettings.js.map +1 -1
  127. package/dist/organisms/form/settings/FormSettings.schema.js.map +1 -1
  128. package/dist/organisms/form/settings/FormSettings.utils.js.map +1 -1
  129. package/dist/organisms/form/useForm.js +664 -661
  130. package/dist/organisms/form/useForm.js.map +1 -1
  131. package/dist/organisms/modal/RemoveModal.js +16 -17
  132. package/dist/organisms/modal/RemoveModal.js.map +1 -1
  133. package/dist/organisms/table/actions/ActionsTable.js.map +1 -1
  134. package/dist/organisms/table/forms/FormsTable.js.map +1 -1
  135. package/dist/organisms/table/forms/components/FormsCell.js.map +1 -1
  136. package/dist/organisms/table/submissions/SubmissionsTable.d.ts +11 -3
  137. package/dist/organisms/table/submissions/SubmissionsTable.js +4 -1
  138. package/dist/organisms/table/submissions/SubmissionsTable.js.map +1 -1
  139. package/dist/organisms/views/FormViews.d.ts +24 -0
  140. package/dist/organisms/views/FormViews.js +96 -0
  141. package/dist/organisms/views/FormViews.js.map +1 -0
  142. package/dist/registries/components.js.map +1 -1
  143. package/dist/utils/getEventValue.js.map +1 -1
  144. package/dist/utils/iconClass.js.map +1 -1
  145. package/dist/utils/mapPagination.js.map +1 -1
  146. package/dist/utils/stopPropagationWrapper.js.map +1 -1
  147. package/package.json +7 -7
  148. package/src/atoms/icon/Icon.stories.tsx +1 -1
  149. package/src/hooks/keyboard.constants.ts +40 -0
  150. package/src/hooks/useKeyboardControls.spec.tsx +208 -0
  151. package/src/hooks/useKeyboardControls.ts +84 -0
  152. package/src/interfaces/Operation.ts +9 -3
  153. package/src/molecules/button/Button.stories.tsx +1 -1
  154. package/src/molecules/button/Button.tsx +43 -24
  155. package/src/molecules/card/Card.tsx +4 -0
  156. package/src/molecules/forms/form-control/FormControl.stories.tsx +1 -1
  157. package/src/molecules/forms/input-tags/InputTags.tsx +1 -1
  158. package/src/molecules/forms/input-tags/components/ChoicesTags.stories.tsx +1 -1
  159. package/src/molecules/forms/input-tags/components/ReactTags.stories.tsx +1 -1
  160. package/src/molecules/forms/input-text/InputText.stories.tsx +2 -2
  161. package/src/molecules/forms/select/components/ChoicesSelect.stories.tsx +2 -2
  162. package/src/molecules/forms/select/components/HtmlSelect.stories.tsx +2 -2
  163. package/src/molecules/forms/select/components/ReactSelect.stories.tsx +2 -2
  164. package/src/molecules/loader/Loader.stories.tsx +1 -1
  165. package/src/molecules/modal/Modal.stories.tsx +1 -1
  166. package/src/molecules/pagination/Pagination.stories.tsx +1 -8
  167. package/src/molecules/pagination/Pagination.tsx +0 -1
  168. package/src/molecules/table/Table.stories.tsx +36 -3
  169. package/src/molecules/table/Table.tsx +12 -6
  170. package/src/molecules/table/components/DefaultCellOperations.tsx +13 -7
  171. package/src/molecules/table/components/DefaultOperationButton.tsx +5 -4
  172. package/src/molecules/table/filters/SelectFilter.tsx +1 -1
  173. package/src/molecules/table/hooks/useTable.tsx +5 -5
  174. package/src/molecules/tabs/Tab.tsx +106 -0
  175. package/src/molecules/tabs/TabList.tsx +37 -0
  176. package/src/molecules/tabs/TabPanel.tsx +37 -0
  177. package/src/molecules/tabs/Tabs.spec.tsx +126 -73
  178. package/src/molecules/tabs/Tabs.stories.tsx +298 -65
  179. package/src/molecules/tabs/Tabs.tsx +10 -81
  180. package/src/molecules/tabs/TabsBody.tsx +11 -0
  181. package/src/molecules/tabs/TabsLegacy.stories.tsx +103 -0
  182. package/src/molecules/tabs/TabsLegacy.tsx +84 -0
  183. package/src/molecules/tabs/all.ts +5 -0
  184. package/src/molecules/tabs/context/TabControl.tsx +166 -0
  185. package/src/molecules/tabs/hooks/tabControl.spec.tsx +388 -0
  186. package/src/molecules/tabs/hooks/tabControl.ts +52 -0
  187. package/src/organisms/__fixtures__/form-firstname.fixture.json +1 -0
  188. package/src/organisms/__fixtures__/form.fixture.json +1 -0
  189. package/src/organisms/form/Form.stories.tsx +94 -118
  190. package/src/organisms/form/access/FormAccess.stories.tsx +2 -2
  191. package/src/organisms/form/actions/FormAction.stories.tsx +422 -0
  192. package/src/organisms/form/builder/FormBuilder.stories.tsx +4 -1
  193. package/src/organisms/form/builder/FormEdit.stories.tsx +1 -1
  194. package/src/organisms/form/builder/FormEdit.tsx +7 -1
  195. package/src/organisms/form/builder/useFormBuilder.ts +5 -1
  196. package/src/organisms/form/builder/useFormEdit.ts +1 -1
  197. package/src/organisms/form/exports/FormExport.stories.tsx +71 -0
  198. package/src/organisms/form/exports/FormExport.tsx +58 -0
  199. package/src/organisms/form/preview/FormPreview.stories.tsx +61 -0
  200. package/src/organisms/form/preview/FormPreview.tsx +21 -0
  201. package/src/organisms/modal/RemoveModal.stories.tsx +1 -1
  202. package/src/organisms/table/actions/ActionsTable.stories.tsx +38 -36
  203. package/src/organisms/table/submissions/SubmissionsTable.stories.tsx +103 -57
  204. package/src/organisms/table/submissions/SubmissionsTable.tsx +10 -4
  205. package/src/organisms/views/FormViews.stories.tsx +224 -0
  206. package/src/organisms/views/FormViews.tsx +146 -0
  207. package/vite.config.mts +2 -2
  208. package/dist/organisms/form/action/FormAction.js.map +0 -1
  209. package/src/organisms/form/action/FormAction.stories.tsx +0 -364
  210. package/tsconfig.app.json +0 -11
  211. package/tsconfig.json +0 -21
  212. package/tsconfig.node.json +0 -13
  213. package/tsconfig.spec.json +0 -14
  214. /package/dist/organisms/form/{action → actions}/FormAction.d.ts +0 -0
  215. /package/src/organisms/form/{action → actions}/FormAction.tsx +0 -0
@@ -0,0 +1,21 @@
1
+ import type { FormType } from "../../../interfaces/index.js";
2
+ import type { Card } from "../../../molecules/card/Card.js";
3
+ import { getComponent } from "../../../registries/components.js";
4
+ import { Form } from "../Form.js";
5
+
6
+ export interface FormPreviewProps {
7
+ form: FormType;
8
+ i18n?: (key: string) => string;
9
+ }
10
+
11
+ export function FormPreview({ form, i18n = (f) => f }: FormPreviewProps) {
12
+ const FCard = getComponent<typeof Card>("Card");
13
+
14
+ return (
15
+ <div className='p-10 bg-gray-500'>
16
+ <FCard label={i18n(form.title || "")} className={"shadow"}>
17
+ <Form form={form} options={{ i18n }} />
18
+ </FCard>
19
+ </div>
20
+ );
21
+ }
@@ -1,4 +1,4 @@
1
- import { Meta, StoryObj } from "@storybook/react";
1
+ import { Meta, StoryObj } from "@storybook/react-vite";
2
2
 
3
3
  import { useModal } from "../../molecules/modal/Modal";
4
4
  import { RemoveModal, RemoveModalProps } from "./RemoveModal";
@@ -1,8 +1,8 @@
1
1
  import "../../../molecules/forms/select/all.ts";
2
2
  import "../../../molecules/table/all.ts";
3
3
 
4
- import type { Meta, StoryObj } from "@storybook/react";
5
- import { expect, fn, userEvent, within } from "@storybook/test";
4
+ import type { Meta, StoryObj } from "@storybook/react-vite";
5
+ import { expect, fn, userEvent, within } from "storybook/test";
6
6
 
7
7
  import availableActions from "../../__fixtures__/form-actions.json";
8
8
  import data from "./__fixtures__/data.json";
@@ -36,19 +36,47 @@ export default {
36
36
  action: "onAddAction"
37
37
  }
38
38
  },
39
+ args: {
40
+ availableActions: availableActions.map(({ name, title }) => ({
41
+ label: title,
42
+ value: name
43
+ })),
44
+ data: data as never,
45
+ operations: [
46
+ {
47
+ title: "Edit",
48
+ action: "edit",
49
+ alias: "row",
50
+ path: "/resources/:resourceId/submissions/:submissionId",
51
+ icon: "edit",
52
+ permissionsResolver() {
53
+ return true;
54
+ }
55
+ },
56
+ {
57
+ action: "delete",
58
+ path: "/resources/:resourceId/submissions/:submissionId/delete",
59
+ icon: "trash",
60
+ buttonType: "danger",
61
+ permissionsResolver() {
62
+ return true;
63
+ }
64
+ }
65
+ ]
66
+ },
39
67
  parameters: {}
40
68
  } satisfies Meta<typeof ActionsTable>;
41
69
 
42
70
  type Story = StoryObj<typeof ActionsTable>;
43
71
 
44
- export const Sandbox: Story = {
72
+ export const Usage: Story = {
45
73
  async play({ canvasElement, args }) {
46
74
  const canvas = within(canvasElement);
47
75
 
48
76
  const select = canvas.getByTestId("action-table-select");
49
77
  const addButton = canvas.getByTestId("action-table-add");
50
78
 
51
- expect(addButton).toHaveAttribute("disabled");
79
+ await expect(addButton).toHaveAttribute("disabled");
52
80
 
53
81
  await userEvent.selectOptions(select, "save", {
54
82
  delay: 100
@@ -56,56 +84,30 @@ export const Sandbox: Story = {
56
84
 
57
85
  await userEvent.click(addButton);
58
86
 
59
- expect(args.onAddAction).toHaveBeenCalledWith("save");
87
+ await expect(args.onAddAction).toHaveBeenCalledWith("save");
60
88
 
61
89
  const editButton = await canvas.getByRole("button", { name: /Operation button: Edit/i });
62
90
  const deleteButton = await canvas.getByRole("button", { name: /Operation button: delete/i });
63
91
 
64
- expect(editButton).toBeInTheDocument();
65
- expect(deleteButton).toBeInTheDocument();
92
+ await expect(editButton).toBeInTheDocument();
93
+ await expect(deleteButton).toBeInTheDocument();
66
94
 
67
95
  await userEvent.click(editButton);
68
96
 
69
- expect(args.onClick).toHaveBeenCalledWith(
97
+ await expect(args.onClick).toHaveBeenCalledWith(
70
98
  args.data[0],
71
99
  args.operations!.find(({ action }) => action === "edit")
72
100
  );
73
101
 
74
102
  await userEvent.click(deleteButton);
75
103
 
76
- expect(args.onClick).toHaveBeenCalledWith(
104
+ await expect(args.onClick).toHaveBeenCalledWith(
77
105
  args.data[0],
78
106
  args.operations!.find(({ action }) => action === "delete")
79
107
  );
80
108
  },
81
109
  args: {
82
110
  onAddAction: fn(),
83
- onClick: fn(),
84
- availableActions: availableActions.map(({ name, title }) => ({
85
- label: title,
86
- value: name
87
- })),
88
- data: data as never,
89
- operations: [
90
- {
91
- title: "Edit",
92
- action: "edit",
93
- alias: "row",
94
- path: "/resources/:resourceId/submissions/:submissionId",
95
- icon: "edit",
96
- permissionsResolver() {
97
- return true;
98
- }
99
- },
100
- {
101
- action: "delete",
102
- path: "/resources/:resourceId/submissions/:submissionId/delete",
103
- icon: "trash",
104
- buttonType: "danger",
105
- permissionsResolver() {
106
- return true;
107
- }
108
- }
109
- ]
111
+ onClick: fn()
110
112
  }
111
113
  };
@@ -4,16 +4,44 @@ import "../../../molecules/forms/select/all";
4
4
  import "../../../molecules/pagination/all";
5
5
  import "../../../molecules/table/all";
6
6
 
7
+ import { Meta, StoryObj } from "@storybook/react-vite";
7
8
  import { useState } from "react";
8
9
 
9
10
  import { mapPagination } from "../../../utils/mapPagination";
10
- import FormType from "../../__fixtures__/form-schema.json";
11
+ import FormSchema from "../../__fixtures__/form-schema.json";
11
12
  import formSubmissions from "../../__fixtures__/form-submissions.json";
12
13
  import { SubmissionsTable } from "./SubmissionsTable";
13
14
 
15
+ function Wrapper(args: any) {
16
+ const [skip, setSkip] = useState(0);
17
+ const [limit, setLimit] = useState(10);
18
+ const [serverCount] = useState(87);
19
+
20
+ const onChange = (obj: any) => {
21
+ setLimit(obj.pageSize);
22
+ setSkip(obj.pageIndex * obj.pageSize);
23
+ args.onChange && args.onChange(obj);
24
+ };
25
+
26
+ return (
27
+ <SubmissionsTable
28
+ {...args}
29
+ onChange={onChange}
30
+ {...mapPagination({
31
+ skip,
32
+ limit,
33
+ serverCount
34
+ })}
35
+ />
36
+ );
37
+ }
38
+
14
39
  /**
40
+ * SubmissionsTable component displays form submissions in a table format with filtering,
41
+ * pagination, and action buttons for each submission.
42
+ *
15
43
  * ```tsx
16
- * import {SubmissionsTable} from "@tsed/react-formio/organisms/table/submissions/SubmissionsTable";
44
+ * import { SubmissionsTable } from "@tsed/react-formio/organisms/table/submissions/SubmissionsTable";
17
45
  * ```
18
46
  */
19
47
  export default {
@@ -21,76 +49,94 @@ export default {
21
49
  component: SubmissionsTable,
22
50
  argTypes: {
23
51
  form: {
52
+ description: "The form schema used to determine table columns",
24
53
  control: "object"
25
54
  },
26
55
  data: {
56
+ description: "Array of submission data to display in the table",
27
57
  control: "object"
28
58
  },
29
59
  operations: {
60
+ description: "Array of operations/actions available for each submission",
30
61
  control: "object"
31
62
  },
32
- isLoading: {
33
- control: "boolean"
63
+ onChange: {
64
+ description: "Callback when table state changes (sorting, filtering, pagination)",
65
+ action: "onChange"
34
66
  },
35
- isEmpty: {
36
- control: "boolean"
37
- },
38
- disableFilters: {
39
- control: "boolean"
40
- },
41
- disablePagination: {
42
- control: "boolean"
67
+ i18n: {
68
+ description: "Internationalization function"
43
69
  }
44
70
  },
45
- parameters: {}
46
- };
71
+ parameters: {
72
+ docs: {
73
+ description: {
74
+ component:
75
+ "Component that displays form submissions in a table format with filtering, pagination, and action buttons for each submission."
76
+ }
77
+ }
78
+ },
79
+ args: {
80
+ form: FormSchema as any,
81
+ data: formSubmissions,
82
+ operations: [
83
+ {
84
+ title: "Edit",
85
+ action: "edit",
86
+ alias: "row",
87
+ path: "/resources/:resourceId/submissions/:submissionId",
88
+ icon: "edit",
89
+ permissionsResolver() {
90
+ return true;
91
+ }
92
+ },
93
+ {
94
+ action: "delete",
95
+ path: "/resources/:resourceId/submissions/:submissionId/delete",
96
+ icon: "trash",
97
+ buttonType: "danger",
98
+ permissionsResolver() {
99
+ return true;
100
+ }
101
+ }
102
+ ]
103
+ },
104
+ render: Wrapper
105
+ } satisfies Meta<typeof SubmissionsTable>;
47
106
 
48
- export const Sandbox = (args: any) => {
49
- const [skip, setSkip] = useState(0);
50
- const [limit, setLimit] = useState(10);
51
- const [serverCount] = useState(87);
107
+ type Story = StoryObj<typeof SubmissionsTable>;
52
108
 
53
- const onChange = (obj: any) => {
54
- setLimit(obj.pageSize);
55
- setSkip(obj.pageIndex * obj.pageSize);
56
- args.onChange && args.onChange(obj);
57
- };
109
+ /**
110
+ * Standard table with default settings
111
+ */
112
+ export const Default: Story = {};
58
113
 
59
- return (
60
- <SubmissionsTable
61
- {...args}
62
- onChange={onChange}
63
- {...mapPagination({
64
- skip,
65
- limit,
66
- serverCount
67
- })}
68
- />
69
- );
114
+ /**
115
+ * Empty table with no data
116
+ */
117
+ export const Empty: Story = {
118
+ args: {
119
+ data: []
120
+ }
70
121
  };
71
122
 
72
- Sandbox.args = {
73
- form: FormType,
74
- data: formSubmissions,
75
- operations: [
76
- {
77
- title: "Edit",
78
- action: "edit",
79
- alias: "row",
80
- path: "/resources/:resourceId/submissions/:submissionId",
81
- icon: "edit",
82
- permissionsResolver() {
83
- return true;
84
- }
85
- },
86
- {
87
- action: "delete",
88
- path: "/resources/:resourceId/submissions/:submissionId/delete",
89
- icon: "trash",
90
- buttonType: "danger",
91
- permissionsResolver() {
92
- return true;
93
- }
123
+ /**
124
+ * Table with custom translations
125
+ */
126
+ export const Translated: Story = {
127
+ args: {
128
+ i18n: (key: string) => {
129
+ const translations: Record<string, string> = {
130
+ "Search...": "Rechercher...",
131
+ "No results found": "Aucun résultat trouvé",
132
+ "Loading...": "Chargement...",
133
+ Page: "Page",
134
+ of: "sur",
135
+ rows: "lignes",
136
+ Edit: "Éditer",
137
+ Delete: "Supprimer"
138
+ };
139
+ return translations[key] || key;
94
140
  }
95
- ]
141
+ }
96
142
  };
@@ -1,13 +1,19 @@
1
- import type { FormType, SubmissionType } from "../../../interfaces";
1
+ import type { FormType, JSON, SubmissionType } from "../../../interfaces";
2
2
  import { Table, type TableProps } from "../../../molecules/table/Table";
3
3
  import { mapFormToColumns } from "../../../molecules/table/utils/mapFormToColumns.js";
4
4
 
5
- export type SubmissionsTableProps = Omit<TableProps<SubmissionType>, "columns"> & {
5
+ export type SubmissionsTableProps<Data extends { [key: string]: JSON } = { [key: string]: JSON }> = Omit<
6
+ TableProps<SubmissionType<Data>>,
7
+ "columns"
8
+ > & {
6
9
  form?: FormType;
7
10
  };
8
11
 
9
- export function SubmissionsTable({ form, ...props }: SubmissionsTableProps) {
12
+ export function SubmissionsTable<Data extends { [key: string]: JSON } = { [key: string]: JSON }>({
13
+ form,
14
+ ...props
15
+ }: SubmissionsTableProps<Data>) {
10
16
  const columns: any[] | undefined = form && mapFormToColumns(form);
11
17
 
12
- return <Table {...props} columns={columns!} />;
18
+ return <Table {...(props as any)} columns={columns!} />;
13
19
  }
@@ -0,0 +1,224 @@
1
+ import "../../molecules/button/Button";
2
+ import "../../molecules/forms/input-text/InputText";
3
+ import "../../molecules/forms/select/all";
4
+ import "../../molecules/forms/form-control/FormControl";
5
+ import "../../molecules/pagination/all";
6
+ import "../../molecules/table/all";
7
+ import "../../molecules/tabs/all";
8
+ import "../../molecules/card/Card";
9
+ import "../form/builder/all";
10
+ import "../form/Form";
11
+
12
+ import { Meta, StoryObj } from "@storybook/react-vite";
13
+
14
+ import ActionsTableStory from "../table/actions/ActionsTable.stories.js";
15
+ import SubmissionsTableStory from "../table/submissions/SubmissionsTable.stories.js";
16
+ import { FormViews } from "./FormViews.js";
17
+
18
+ /**
19
+ * FormViews component displays a tabbed interface for managing forms with tabs for editing,
20
+ * viewing submissions, previewing, managing actions, controlling access, exporting, and configuring settings.
21
+ *
22
+ * ```tsx
23
+ * import { FormViews } from "@tsed/react-formio/organisms/views/FormViews";
24
+ * ```
25
+ *
26
+ * ## Implementation
27
+ *
28
+ * ```tsx
29
+ * import type { FormType } from "../../interfaces/index.js";
30
+ * import type { Tab as DefaultTab } from "../../molecules/tabs/Tab.js";
31
+ * import type { TabList as DefaultTabList } from "../../molecules/tabs/TabList.js";
32
+ * import type { TabPanel as DefaultTabPanel } from "../../molecules/tabs/TabPanel.js";
33
+ * import type { Tabs as DefaultTabs } from "../../molecules/tabs/Tabs.js";
34
+ * import type { TabsBody as DefaultTabsBody } from "../../molecules/tabs/TabsBody.js";
35
+ * import { getComponent } from "../../registries/components.js";
36
+ * import { FormAccess, type FormAccessProps } from "../form/access/FormAccess.js";
37
+ * import { FormEdit, type FormEditProps } from "../form/builder/FormEdit.js";
38
+ * import { FormExport } from "../form/exports/FormExport.js";
39
+ * import { FormPreview } from "../form/preview/FormPreview.js";
40
+ * import { FormSettings } from "../form/settings/FormSettings.js";
41
+ * import { ActionsTable, type ActionsTableProps } from "../table/actions/ActionsTable.js";
42
+ * import { SubmissionsTable, type SubmissionsTableProps } from "../table/submissions/SubmissionsTable.js";
43
+ *
44
+ * export type FormViewsProps = {
45
+ * form: FormEditProps["form"];
46
+ * submissions: SubmissionsTableProps["data"];
47
+ * availableActions: ActionsTableProps["availableActions"];
48
+ * actions: ActionsTableProps["data"];
49
+ * roles?: FormAccessProps["roles"];
50
+ * i18n?: (key: string) => string;
51
+ * onAction: () => void;
52
+ * operations: SubmissionsTableProps["operations"];
53
+ * };
54
+ *
55
+ * export function FormViews({ form, roles, availableActions, actions, submissions, operations, i18n = (f) => f }: FormViewsProps) {
56
+ * const Tabs = getComponent<typeof DefaultTabs>("Tabs");
57
+ * const TabList = getComponent<typeof DefaultTabList>("TabList");
58
+ * const Tab = getComponent<typeof DefaultTab>("Tab");
59
+ * const TabsBody = getComponent<typeof DefaultTabsBody>("TabsBody");
60
+ * const TabPanel = getComponent<typeof DefaultTabPanel>("TabPanel");
61
+ *
62
+ * return (
63
+ * <Tabs>
64
+ * <TabList>
65
+ * <Tab value={0} icon='edit'>
66
+ * {i18n("Edit")}
67
+ * </Tab>
68
+ * <Tab value={1} icon='data'>
69
+ * {i18n("Data")}
70
+ * </Tab>
71
+ * <Tab value={2} icon='test-tube'>
72
+ * {i18n("Preview")}
73
+ * </Tab>
74
+ * <Tab value={3} icon='paper-plane'>
75
+ * {i18n("Actions")}
76
+ * </Tab>
77
+ * <Tab value={4} icon='lock'>
78
+ * {i18n("Access")}
79
+ * </Tab>
80
+ * <Tab value={5} icon='download'>
81
+ * {i18n("Export")}
82
+ * </Tab>
83
+ * <Tab value={6} icon='cog'>
84
+ * {i18n("Settings")}
85
+ * </Tab>
86
+ * </TabList>
87
+ * <TabsBody>
88
+ * <TabPanel value={0} className='p-3 border-l-1 border-b-1 border-r-1 border-gray-300'>
89
+ * <FormEdit form={form} options={{ i18n }} />
90
+ * </TabPanel>
91
+ * <TabPanel value={1}>
92
+ * <SubmissionsTable className={"border-top-0"} form={form as FormType} data={submissions} i18n={i18n} operations={operations} />
93
+ * </TabPanel>
94
+ * <TabPanel value={2}>
95
+ * <FormPreview form={form as FormType} i18n={i18n} />
96
+ * </TabPanel>
97
+ * <TabPanel value={3}>
98
+ * <ActionsTable className={"border-top-0"} availableActions={availableActions} data={actions} operations={[]} i18n={i18n} />
99
+ * </TabPanel>
100
+ * <TabPanel value={4} className='pt-3'>
101
+ * <FormAccess form={form as FormType} roles={roles} options={{ i18n }} />
102
+ * </TabPanel>
103
+ * <TabPanel value={5} className='pt-3'>
104
+ * <FormExport i18n={i18n} />
105
+ * </TabPanel>
106
+ * <TabPanel value={6} className='p-3 border-l-1 border-b-1 border-r-1 border-gray-300'>
107
+ * <FormSettings form={form as FormType} options={{}} />
108
+ * </TabPanel>
109
+ * </TabsBody>
110
+ * </Tabs>
111
+ * );
112
+ * }
113
+ * ```
114
+ */
115
+ export default {
116
+ title: "views/FormViews",
117
+ component: FormViews,
118
+ argTypes: {
119
+ form: {
120
+ description: "The form object to manage",
121
+ control: "object"
122
+ },
123
+ submissions: {
124
+ description: "Submission data to display in the Data tab",
125
+ control: "object"
126
+ },
127
+ // operations: {
128
+ // description: "Operations available for submissions",
129
+ // control: "object"
130
+ // },
131
+ roles: {
132
+ description: "Roles for access control",
133
+ control: "object"
134
+ },
135
+ i18n: {
136
+ description: "Internationalization function"
137
+ },
138
+ onAction: {
139
+ action: "onAction",
140
+ description: "Callback when an action is triggered"
141
+ }
142
+ },
143
+ parameters: {
144
+ docs: {
145
+ description: {
146
+ component:
147
+ "Component that displays a tabbed interface for managing forms with tabs for editing, viewing submissions, previewing, managing actions, controlling access, exporting, and configuring settings."
148
+ }
149
+ }
150
+ }
151
+ } satisfies Meta<typeof FormViews>;
152
+
153
+ type Story = StoryObj<typeof FormViews>;
154
+
155
+ /**
156
+ * Basic form view with a simple form
157
+ */
158
+ export const Usage: Story = {
159
+ args: {
160
+ form: SubmissionsTableStory.args.form as any,
161
+ submissions: SubmissionsTableStory.args.data as any,
162
+ // operations: SubmissionsTableStory.args.operations,
163
+ actions: ActionsTableStory.args.data as any,
164
+ roles: [
165
+ {
166
+ _id: "1",
167
+ title: "Administrator"
168
+ },
169
+ {
170
+ _id: "2",
171
+ title: "Authenticated"
172
+ },
173
+ {
174
+ _id: "3",
175
+ title: "Anonymous"
176
+ }
177
+ ],
178
+ i18n: (key: string) => key,
179
+ onAction: () => console.log("Action triggered")
180
+ }
181
+ };
182
+
183
+ /**
184
+ * Form view with translated labels
185
+ */
186
+ export const Translated: Story = {
187
+ args: {
188
+ form: SubmissionsTableStory.args.form as any,
189
+ submissions: SubmissionsTableStory.args.data as any,
190
+ // operations: SubmissionsTableStory.args.operations,
191
+ actions: ActionsTableStory.args.data as any,
192
+ roles: [
193
+ {
194
+ _id: "1",
195
+ title: "Administrator"
196
+ },
197
+ {
198
+ _id: "2",
199
+ title: "Authenticated"
200
+ },
201
+ {
202
+ _id: "3",
203
+ title: "Anonymous"
204
+ }
205
+ ],
206
+ i18n: (key: string) => {
207
+ const translations: Record<string, string> = {
208
+ Edit: "Éditer",
209
+ Data: "Données",
210
+ Preview: "Aperçu",
211
+ Actions: "Actions",
212
+ Access: "Accès",
213
+ Export: "Exporter",
214
+ Settings: "Paramètres",
215
+ "Form with First Name": "Formulaire avec prénom",
216
+ "First name": "Prénom",
217
+ "Last name": "Nom de famille",
218
+ Submit: "Soumettre"
219
+ };
220
+ return translations[key] || key;
221
+ },
222
+ onAction: () => console.log("Action triggered")
223
+ }
224
+ };