@btst/plugin-form-builder 0.0.0-stage → 1.0.0

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 (213) hide show
  1. package/LICENSE.md +17 -0
  2. package/dist/api/getters.cjs +154 -0
  3. package/dist/api/getters.mjs +145 -0
  4. package/dist/api/index.cjs +25 -0
  5. package/dist/api/index.d.cts +119 -0
  6. package/dist/api/index.d.mts +119 -0
  7. package/dist/api/index.d.ts +119 -0
  8. package/dist/api/index.mjs +6 -0
  9. package/dist/api/lifecycle-migrations.cjs +15 -0
  10. package/dist/api/lifecycle-migrations.mjs +13 -0
  11. package/dist/api/operations.cjs +1093 -0
  12. package/dist/api/operations.mjs +1082 -0
  13. package/dist/api/plugin.cjs +201 -0
  14. package/dist/api/plugin.mjs +192 -0
  15. package/dist/api/query-key-defs.cjs +43 -0
  16. package/dist/api/query-key-defs.mjs +39 -0
  17. package/dist/client/components/forms/form-renderer.cjs +193 -0
  18. package/dist/client/components/forms/form-renderer.mjs +191 -0
  19. package/dist/client/components/index.cjs +29 -0
  20. package/dist/client/components/index.d.cts +97 -0
  21. package/dist/client/components/index.d.mts +97 -0
  22. package/dist/client/components/index.d.ts +97 -0
  23. package/dist/client/components/index.mjs +18 -0
  24. package/dist/client/components/loading/form-builder-skeleton.cjs +32 -0
  25. package/dist/client/components/loading/form-builder-skeleton.mjs +30 -0
  26. package/dist/client/components/loading/form-list-skeleton.cjs +21 -0
  27. package/dist/client/components/loading/form-list-skeleton.mjs +19 -0
  28. package/dist/client/components/loading/submissions-skeleton.cjs +34 -0
  29. package/dist/client/components/loading/submissions-skeleton.mjs +32 -0
  30. package/dist/client/components/pages/404-page.cjs +28 -0
  31. package/dist/client/components/pages/404-page.mjs +26 -0
  32. package/dist/client/components/pages/form-builder-page.cjs +77 -0
  33. package/dist/client/components/pages/form-builder-page.internal.cjs +217 -0
  34. package/dist/client/components/pages/form-builder-page.internal.mjs +215 -0
  35. package/dist/client/components/pages/form-builder-page.mjs +75 -0
  36. package/dist/client/components/pages/form-list-page.cjs +44 -0
  37. package/dist/client/components/pages/form-list-page.internal.cjs +282 -0
  38. package/dist/client/components/pages/form-list-page.internal.mjs +280 -0
  39. package/dist/client/components/pages/form-list-page.mjs +42 -0
  40. package/dist/client/components/pages/submissions-page.cjs +64 -0
  41. package/dist/client/components/pages/submissions-page.internal.cjs +255 -0
  42. package/dist/client/components/pages/submissions-page.internal.mjs +253 -0
  43. package/dist/client/components/pages/submissions-page.mjs +62 -0
  44. package/dist/client/components/shared/default-error.cjs +17 -0
  45. package/dist/client/components/shared/default-error.mjs +15 -0
  46. package/dist/client/components/shared/empty-state.cjs +16 -0
  47. package/dist/client/components/shared/empty-state.mjs +14 -0
  48. package/dist/client/components/shared/page-wrapper.cjs +29 -0
  49. package/dist/client/components/shared/page-wrapper.mjs +27 -0
  50. package/dist/client/components/shared/pagination.cjs +49 -0
  51. package/dist/client/components/shared/pagination.mjs +47 -0
  52. package/dist/client/constants.cjs +5 -0
  53. package/dist/client/constants.mjs +3 -0
  54. package/dist/client/hooks/form-builder-hooks.cjs +203 -0
  55. package/dist/client/hooks/form-builder-hooks.mjs +186 -0
  56. package/dist/client/hooks/form-builder-resource.cjs +13 -0
  57. package/dist/client/hooks/form-builder-resource.mjs +11 -0
  58. package/dist/client/hooks/index.cjs +22 -0
  59. package/dist/client/hooks/index.d.cts +378 -0
  60. package/dist/client/hooks/index.d.mts +378 -0
  61. package/dist/client/hooks/index.d.ts +378 -0
  62. package/dist/client/hooks/index.mjs +1 -0
  63. package/dist/client/index.cjs +13 -0
  64. package/dist/client/index.d.cts +410 -0
  65. package/dist/client/index.d.mts +410 -0
  66. package/dist/client/index.d.ts +410 -0
  67. package/dist/client/index.mjs +2 -0
  68. package/dist/client/plugin.cjs +311 -0
  69. package/dist/client/plugin.mjs +309 -0
  70. package/dist/client.css +3 -0
  71. package/dist/db.cjs +99 -0
  72. package/dist/db.mjs +97 -0
  73. package/dist/permissions.cjs +95 -0
  74. package/dist/permissions.d.cts +94 -0
  75. package/dist/permissions.d.mts +94 -0
  76. package/dist/permissions.d.ts +94 -0
  77. package/dist/permissions.mjs +93 -0
  78. package/dist/query-keys.cjs +140 -0
  79. package/dist/query-keys.d.cts +392 -0
  80. package/dist/query-keys.d.mts +392 -0
  81. package/dist/query-keys.d.ts +392 -0
  82. package/dist/query-keys.mjs +137 -0
  83. package/dist/schemas.cjs +91 -0
  84. package/dist/schemas.mjs +82 -0
  85. package/dist/shared/plugin-form-builder.BZYGyFgT.d.mts +351 -0
  86. package/dist/shared/plugin-form-builder.Bbl9NufB.d.cts +408 -0
  87. package/dist/shared/plugin-form-builder.CSP5HR2O.d.ts +408 -0
  88. package/dist/shared/plugin-form-builder.Cmk083dA.d.cts +351 -0
  89. package/dist/shared/plugin-form-builder.D258Qpb8.d.ts +351 -0
  90. package/dist/shared/plugin-form-builder.DWrQ3lRX.d.cts +118 -0
  91. package/dist/shared/plugin-form-builder.DWrQ3lRX.d.mts +118 -0
  92. package/dist/shared/plugin-form-builder.DWrQ3lRX.d.ts +118 -0
  93. package/dist/shared/plugin-form-builder.lp98rFNl.d.mts +408 -0
  94. package/dist/style.css +6 -0
  95. package/dist/types.cjs +2 -0
  96. package/dist/types.d.cts +6 -0
  97. package/dist/types.d.mts +6 -0
  98. package/dist/types.d.ts +6 -0
  99. package/dist/types.mjs +1 -0
  100. package/dist/ui/src/components/accordion.cjs +81 -0
  101. package/dist/ui/src/components/accordion.mjs +62 -0
  102. package/dist/ui/src/components/alert-dialog.cjs +157 -0
  103. package/dist/ui/src/components/alert-dialog.mjs +132 -0
  104. package/dist/ui/src/components/auto-form/common/label.cjs +18 -0
  105. package/dist/ui/src/components/auto-form/common/label.mjs +16 -0
  106. package/dist/ui/src/components/auto-form/common/tooltip.cjs +9 -0
  107. package/dist/ui/src/components/auto-form/common/tooltip.mjs +7 -0
  108. package/dist/ui/src/components/auto-form/config.cjs +40 -0
  109. package/dist/ui/src/components/auto-form/config.mjs +37 -0
  110. package/dist/ui/src/components/auto-form/dependencies.cjs +48 -0
  111. package/dist/ui/src/components/auto-form/dependencies.mjs +46 -0
  112. package/dist/ui/src/components/auto-form/fields/array.cjs +266 -0
  113. package/dist/ui/src/components/auto-form/fields/array.mjs +264 -0
  114. package/dist/ui/src/components/auto-form/fields/checkbox.cjs +38 -0
  115. package/dist/ui/src/components/auto-form/fields/checkbox.mjs +36 -0
  116. package/dist/ui/src/components/auto-form/fields/date.cjs +67 -0
  117. package/dist/ui/src/components/auto-form/fields/date.mjs +65 -0
  118. package/dist/ui/src/components/auto-form/fields/enum.cjs +73 -0
  119. package/dist/ui/src/components/auto-form/fields/enum.mjs +71 -0
  120. package/dist/ui/src/components/auto-form/fields/input.cjs +32 -0
  121. package/dist/ui/src/components/auto-form/fields/input.mjs +30 -0
  122. package/dist/ui/src/components/auto-form/fields/number.cjs +31 -0
  123. package/dist/ui/src/components/auto-form/fields/number.mjs +29 -0
  124. package/dist/ui/src/components/auto-form/fields/object.cjs +233 -0
  125. package/dist/ui/src/components/auto-form/fields/object.mjs +217 -0
  126. package/dist/ui/src/components/auto-form/fields/radio-group.cjs +67 -0
  127. package/dist/ui/src/components/auto-form/fields/radio-group.mjs +65 -0
  128. package/dist/ui/src/components/auto-form/fields/switch.cjs +38 -0
  129. package/dist/ui/src/components/auto-form/fields/switch.mjs +36 -0
  130. package/dist/ui/src/components/auto-form/fields/textarea.cjs +31 -0
  131. package/dist/ui/src/components/auto-form/fields/textarea.mjs +29 -0
  132. package/dist/ui/src/components/auto-form/helpers.cjs +270 -0
  133. package/dist/ui/src/components/auto-form/helpers.mjs +259 -0
  134. package/dist/ui/src/components/auto-form/index.cjs +92 -0
  135. package/dist/ui/src/components/auto-form/index.mjs +86 -0
  136. package/dist/ui/src/components/auto-form/stepped-auto-form.cjs +374 -0
  137. package/dist/ui/src/components/auto-form/stepped-auto-form.mjs +368 -0
  138. package/dist/ui/src/components/auto-form/types.cjs +11 -0
  139. package/dist/ui/src/components/auto-form/types.mjs +9 -0
  140. package/dist/ui/src/components/button.cjs +56 -0
  141. package/dist/ui/src/components/button.mjs +53 -0
  142. package/dist/ui/src/components/calendar.cjs +207 -0
  143. package/dist/ui/src/components/calendar.mjs +190 -0
  144. package/dist/ui/src/components/checkbox.cjs +48 -0
  145. package/dist/ui/src/components/checkbox.mjs +32 -0
  146. package/dist/ui/src/components/date-picker.cjs +41 -0
  147. package/dist/ui/src/components/date-picker.mjs +39 -0
  148. package/dist/ui/src/components/dialog.cjs +141 -0
  149. package/dist/ui/src/components/dialog.mjs +118 -0
  150. package/dist/ui/src/components/dropdown-menu.cjs +81 -0
  151. package/dist/ui/src/components/dropdown-menu.mjs +62 -0
  152. package/dist/ui/src/components/form-builder/canvas.cjs +111 -0
  153. package/dist/ui/src/components/form-builder/canvas.mjs +109 -0
  154. package/dist/ui/src/components/form-builder/components/index.cjs +571 -0
  155. package/dist/ui/src/components/form-builder/components/index.mjs +554 -0
  156. package/dist/ui/src/components/form-builder/edit-field-dialog.cjs +131 -0
  157. package/dist/ui/src/components/form-builder/edit-field-dialog.mjs +129 -0
  158. package/dist/ui/src/components/form-builder/form-preview.cjs +73 -0
  159. package/dist/ui/src/components/form-builder/form-preview.mjs +71 -0
  160. package/dist/ui/src/components/form-builder/index.cjs +350 -0
  161. package/dist/ui/src/components/form-builder/index.mjs +344 -0
  162. package/dist/ui/src/components/form-builder/nested-field-editor-dialog.cjs +263 -0
  163. package/dist/ui/src/components/form-builder/nested-field-editor-dialog.mjs +261 -0
  164. package/dist/ui/src/components/form-builder/palette.cjs +52 -0
  165. package/dist/ui/src/components/form-builder/palette.mjs +49 -0
  166. package/dist/ui/src/components/form-builder/schema-utils.cjs +128 -0
  167. package/dist/ui/src/components/form-builder/schema-utils.mjs +122 -0
  168. package/dist/ui/src/components/form-builder/sortable-field.cjs +151 -0
  169. package/dist/ui/src/components/form-builder/sortable-field.mjs +148 -0
  170. package/dist/ui/src/components/form-builder/step-tabs.cjs +180 -0
  171. package/dist/ui/src/components/form-builder/step-tabs.mjs +178 -0
  172. package/dist/ui/src/components/form-builder/types.cjs +7 -0
  173. package/dist/ui/src/components/form-builder/types.mjs +5 -0
  174. package/dist/ui/src/components/form-builder/validation-schemas.cjs +67 -0
  175. package/dist/ui/src/components/form-builder/validation-schemas.mjs +56 -0
  176. package/dist/ui/src/components/form.cjs +120 -0
  177. package/dist/ui/src/components/form.mjs +98 -0
  178. package/dist/ui/src/components/input.cjs +23 -0
  179. package/dist/ui/src/components/input.mjs +21 -0
  180. package/dist/ui/src/components/label.cjs +39 -0
  181. package/dist/ui/src/components/label.mjs +23 -0
  182. package/dist/ui/src/components/page-layout.cjs +25 -0
  183. package/dist/ui/src/components/page-layout.mjs +23 -0
  184. package/dist/ui/src/components/page-wrapper.cjs +20 -0
  185. package/dist/ui/src/components/page-wrapper.mjs +18 -0
  186. package/dist/ui/src/components/popover.cjs +60 -0
  187. package/dist/ui/src/components/popover.mjs +42 -0
  188. package/dist/ui/src/components/radio-group.cjs +62 -0
  189. package/dist/ui/src/components/radio-group.mjs +45 -0
  190. package/dist/ui/src/components/select.cjs +161 -0
  191. package/dist/ui/src/components/select.mjs +139 -0
  192. package/dist/ui/src/components/separator.cjs +43 -0
  193. package/dist/ui/src/components/separator.mjs +27 -0
  194. package/dist/ui/src/components/skeleton.cjs +17 -0
  195. package/dist/ui/src/components/skeleton.mjs +15 -0
  196. package/dist/ui/src/components/stack-attribution.cjs +24 -0
  197. package/dist/ui/src/components/stack-attribution.mjs +22 -0
  198. package/dist/ui/src/components/switch.cjs +48 -0
  199. package/dist/ui/src/components/switch.mjs +32 -0
  200. package/dist/ui/src/components/table.cjs +89 -0
  201. package/dist/ui/src/components/table.mjs +82 -0
  202. package/dist/ui/src/components/tabs.cjs +84 -0
  203. package/dist/ui/src/components/tabs.mjs +65 -0
  204. package/dist/ui/src/components/textarea.cjs +20 -0
  205. package/dist/ui/src/components/textarea.mjs +18 -0
  206. package/dist/ui/src/lib/schema-converter.cjs +133 -0
  207. package/dist/ui/src/lib/schema-converter.mjs +127 -0
  208. package/dist/ui/src/lib/utils.cjs +10 -0
  209. package/dist/ui/src/lib/utils.mjs +8 -0
  210. package/dist/utils.cjs +41 -0
  211. package/dist/utils.mjs +32 -0
  212. package/package.json +175 -3
  213. package/README.md +0 -3
@@ -0,0 +1,75 @@
1
+ 'use client';
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { lazy } from 'react';
4
+ import { usePluginOverrides } from '@btst/stack/context';
5
+ import { ComposedRoute, PermissionRouteAccess } from '@btst/stack/client/components';
6
+ import { DefaultError } from '../shared/default-error.mjs';
7
+ import { FormBuilderSkeleton } from '../loading/form-builder-skeleton.mjs';
8
+ import { NotFoundPage } from './404-page.mjs';
9
+ import { formBuilderPermissions } from '../../../permissions.mjs';
10
+ import { FORM_BUILDER_PLUGIN_ID } from '../../constants.mjs';
11
+ import { useSuspenseFormForUpdate } from '../../hooks/form-builder-hooks.mjs';
12
+
13
+ const FormBuilderPage = lazy(
14
+ () => import('./form-builder-page.internal.mjs').then((m) => ({
15
+ default: m.FormBuilderPage
16
+ }))
17
+ );
18
+ function FormBuilderPageComponent({ id }) {
19
+ const { onRouteError } = usePluginOverrides(
20
+ FORM_BUILDER_PLUGIN_ID
21
+ );
22
+ const isNew = !id;
23
+ const path = isNew ? "/forms/new" : `/forms/${id}/edit`;
24
+ return /* @__PURE__ */ jsx(
25
+ ComposedRoute,
26
+ {
27
+ path,
28
+ PageComponent: AuthorizedFormBuilderPage,
29
+ ErrorComponent: DefaultError,
30
+ LoadingComponent: FormBuilderSkeleton,
31
+ NotFoundComponent: NotFoundPage,
32
+ props: { id },
33
+ onError: (error) => {
34
+ if (onRouteError) {
35
+ onRouteError("formBuilder", error, {
36
+ path,
37
+ params: id ? { id } : {},
38
+ isSSR: typeof window === "undefined"
39
+ });
40
+ }
41
+ }
42
+ }
43
+ );
44
+ }
45
+ function AuthorizedFormBuilderPage({ id }) {
46
+ if (!id) {
47
+ return /* @__PURE__ */ jsx(
48
+ PermissionRouteAccess,
49
+ {
50
+ permission: formBuilderPermissions.form.create(),
51
+ LoadingComponent: FormBuilderSkeleton,
52
+ children: /* @__PURE__ */ jsx(FormBuilderPage, {})
53
+ }
54
+ );
55
+ }
56
+ return /* @__PURE__ */ jsx(AuthorizedExistingFormBuilderPage, { id });
57
+ }
58
+ function AuthorizedExistingFormBuilderPage({ id }) {
59
+ const { form } = useSuspenseFormForUpdate(id);
60
+ if (!form) return /* @__PURE__ */ jsx(NotFoundPage, {});
61
+ return /* @__PURE__ */ jsx(
62
+ PermissionRouteAccess,
63
+ {
64
+ permission: formBuilderPermissions.form.update({
65
+ formId: form.id,
66
+ ...form.createdBy ? { ownerId: form.createdBy } : {},
67
+ status: form.status
68
+ }),
69
+ LoadingComponent: FormBuilderSkeleton,
70
+ children: /* @__PURE__ */ jsx(FormBuilderPage, { id })
71
+ }
72
+ );
73
+ }
74
+
75
+ export { FormBuilderPageComponent };
@@ -0,0 +1,44 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ const jsxRuntime = require('react/jsx-runtime');
5
+ const React = require('react');
6
+ const context = require('@btst/stack/context');
7
+ const components = require('@btst/stack/client/components');
8
+ const defaultError = require('../shared/default-error.cjs');
9
+ const formListSkeleton = require('../loading/form-list-skeleton.cjs');
10
+ const _404Page = require('./404-page.cjs');
11
+ const permissions = require('../../../permissions.cjs');
12
+ const constants = require('../../constants.cjs');
13
+
14
+ const FormListPage = React.lazy(
15
+ () => import('./form-list-page.internal.cjs').then((m) => ({
16
+ default: m.FormListPage
17
+ }))
18
+ );
19
+ function FormListPageComponent() {
20
+ const { onRouteError } = context.usePluginOverrides(
21
+ constants.FORM_BUILDER_PLUGIN_ID
22
+ );
23
+ return /* @__PURE__ */ jsxRuntime.jsx(
24
+ components.ComposedRoute,
25
+ {
26
+ path: "/forms",
27
+ permission: permissions.formBuilderPermissions.form.read({ scope: "collection" }),
28
+ PageComponent: FormListPage,
29
+ ErrorComponent: defaultError.DefaultError,
30
+ LoadingComponent: formListSkeleton.FormListSkeleton,
31
+ NotFoundComponent: _404Page.NotFoundPage,
32
+ onError: (error) => {
33
+ if (onRouteError) {
34
+ onRouteError("formList", error, {
35
+ path: "/forms",
36
+ isSSR: typeof window === "undefined"
37
+ });
38
+ }
39
+ }
40
+ }
41
+ );
42
+ }
43
+
44
+ exports.FormListPageComponent = FormListPageComponent;
@@ -0,0 +1,282 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ const jsxRuntime = require('react/jsx-runtime');
5
+ const React = require('react');
6
+ const context = require('@btst/stack/context');
7
+ const hooks = require('@btst/stack/client/hooks');
8
+ const button = require('../../../ui/src/components/button.cjs');
9
+ const input = require('../../../ui/src/components/input.cjs');
10
+ const table = require('../../../ui/src/components/table.cjs');
11
+ const dropdownMenu = require('../../../ui/src/components/dropdown-menu.cjs');
12
+ const alertDialog = require('../../../ui/src/components/alert-dialog.cjs');
13
+ const lucideReact = require('lucide-react');
14
+ const pageWrapper = require('../shared/page-wrapper.cjs');
15
+ const emptyState = require('../shared/empty-state.cjs');
16
+ const pagination = require('../shared/pagination.cjs');
17
+ const permissions = require('../../../permissions.cjs');
18
+ const constants = require('../../constants.cjs');
19
+ const utils = require('../../../utils.cjs');
20
+ const formBuilderHooks = require('../../hooks/form-builder-hooks.cjs');
21
+
22
+ const LIST_STATE_SCHEMA = {
23
+ q: { type: "string", default: "", history: "replace" }
24
+ };
25
+ const SEARCH_DEBOUNCE_MS = 300;
26
+ function FormListPage() {
27
+ const t = context.useTranslate();
28
+ const notify = context.useNotify();
29
+ const { localization, classNames } = context.usePluginOverrides(constants.FORM_BUILDER_PLUGIN_ID);
30
+ const { Link, navigate, resolve } = context.usePluginSiteNavigation(
31
+ constants.FORM_BUILDER_PLUGIN_ID
32
+ );
33
+ const [{ q: search }, setListState] = hooks.useListState(
34
+ "form-builder-forms",
35
+ LIST_STATE_SCHEMA
36
+ );
37
+ const [searchInput, setSearchInput] = React.useState(search);
38
+ const lastSyncedSearch = React.useRef(search);
39
+ React.useEffect(() => {
40
+ if (search !== lastSyncedSearch.current) {
41
+ lastSyncedSearch.current = search;
42
+ setSearchInput(search);
43
+ }
44
+ }, [search]);
45
+ React.useEffect(() => {
46
+ if (searchInput === search) return;
47
+ const timeout = setTimeout(() => {
48
+ lastSyncedSearch.current = searchInput;
49
+ setListState({ q: searchInput });
50
+ }, SEARCH_DEBOUNCE_MS);
51
+ return () => clearTimeout(timeout);
52
+ }, [searchInput, search, setListState]);
53
+ const hasSearch = search.trim().length > 0;
54
+ const defaultList = formBuilderHooks.useSuspenseForms();
55
+ const searchedList = formBuilderHooks.useForms({ search, enabled: hasSearch });
56
+ const activeList = hasSearch ? searchedList : defaultList;
57
+ const { forms, total, hasMore, isLoadingMore, loadMore } = activeList;
58
+ const isSearchLoading = hasSearch && searchedList.isLoading;
59
+ const deleteMutation = formBuilderHooks.useDeleteForm();
60
+ const [deleteId, setDeleteId] = React.useState(null);
61
+ const LinkComponent = Link || "a";
62
+ const handleDelete = async () => {
63
+ if (!deleteId) return;
64
+ try {
65
+ await deleteMutation.mutateAsync(deleteId);
66
+ } catch {
67
+ notify.error(
68
+ localization?.FORM_BUILDER_TOAST_ERROR ?? t("formBuilder.toasts.error", "An error occurred. Please try again.")
69
+ );
70
+ return;
71
+ }
72
+ notify.success(
73
+ localization?.FORM_BUILDER_TOAST_DELETE_SUCCESS ?? t("formBuilder.toasts.deleteSuccess", "Form deleted successfully")
74
+ );
75
+ setDeleteId(null);
76
+ };
77
+ const getStatusBadge = (status) => {
78
+ const colors = {
79
+ active: "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200",
80
+ inactive: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200",
81
+ archived: "bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-200"
82
+ };
83
+ return /* @__PURE__ */ jsxRuntime.jsx(
84
+ "span",
85
+ {
86
+ className: `px-2 py-1 rounded-full text-xs font-medium ${colors[status] || colors.inactive}`,
87
+ children: status
88
+ }
89
+ );
90
+ };
91
+ const newFormButton = /* @__PURE__ */ jsxRuntime.jsx(context.PermissionAccess, { permission: permissions.formBuilderPermissions.form.create(), children: /* @__PURE__ */ jsxRuntime.jsx(button.Button, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(LinkComponent, { href: resolve("forms", "new").href, children: [
92
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "mr-2 h-4 w-4" }),
93
+ localization?.FORM_BUILDER_BUTTON_NEW_FORM ?? t("formBuilder.common.buttonNewForm", "New Form")
94
+ ] }) }) });
95
+ return /* @__PURE__ */ jsxRuntime.jsxs(pageWrapper.PageWrapper, { testId: "form-list-page", children: [
96
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full max-w-5xl space-y-6", children: [
97
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
98
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
99
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold", children: localization?.FORM_BUILDER_LIST_TITLE ?? t("formBuilder.list.title", "Forms") }),
100
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: localization?.FORM_BUILDER_LIST_SUBTITLE ?? t("formBuilder.list.subtitle", "Manage your forms") })
101
+ ] }),
102
+ newFormButton
103
+ ] }),
104
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative max-w-sm", children: [
105
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
106
+ /* @__PURE__ */ jsxRuntime.jsx(
107
+ input.Input,
108
+ {
109
+ "data-testid": "form-builder-list-search",
110
+ value: searchInput,
111
+ onChange: (e) => setSearchInput(e.target.value),
112
+ placeholder: localization?.FORM_BUILDER_LIST_SEARCH_PLACEHOLDER ?? t("formBuilder.list.searchPlaceholder", "Search forms..."),
113
+ className: "pl-9"
114
+ }
115
+ ),
116
+ isSearchLoading && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 animate-spin text-muted-foreground" })
117
+ ] }),
118
+ forms.length === 0 ? isSearchLoading ? null : hasSearch ? /* @__PURE__ */ jsxRuntime.jsx(
119
+ emptyState.EmptyState,
120
+ {
121
+ title: localization?.FORM_BUILDER_LIST_SEARCH_EMPTY ?? t("formBuilder.list.searchEmpty", "No forms match your search"),
122
+ description: localization?.FORM_BUILDER_LIST_SEARCH_EMPTY_DESCRIPTION ?? t(
123
+ "formBuilder.list.searchEmptyDescription",
124
+ "Try a different search term."
125
+ )
126
+ }
127
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
128
+ emptyState.EmptyState,
129
+ {
130
+ title: localization?.FORM_BUILDER_LIST_EMPTY ?? t("formBuilder.list.empty", "No forms yet"),
131
+ description: localization?.FORM_BUILDER_LIST_EMPTY_DESCRIPTION ?? t(
132
+ "formBuilder.list.emptyDescription",
133
+ "Create your first form to get started."
134
+ ),
135
+ action: newFormButton
136
+ }
137
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
138
+ /* @__PURE__ */ jsxRuntime.jsx(
139
+ "div",
140
+ {
141
+ className: utils.cn("rounded-lg border", classNames?.table),
142
+ "data-testid": "form-builder-list-table",
143
+ children: /* @__PURE__ */ jsxRuntime.jsxs(table.Table, { children: [
144
+ /* @__PURE__ */ jsxRuntime.jsx(table.TableHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(table.TableRow, { children: [
145
+ /* @__PURE__ */ jsxRuntime.jsx(table.TableHead, { children: localization?.FORM_BUILDER_LIST_COLUMN_NAME ?? t("formBuilder.list.columnName", "Name") }),
146
+ /* @__PURE__ */ jsxRuntime.jsx(table.TableHead, { children: localization?.FORM_BUILDER_LIST_COLUMN_SLUG ?? t("formBuilder.list.columnSlug", "Slug") }),
147
+ /* @__PURE__ */ jsxRuntime.jsx(table.TableHead, { children: localization?.FORM_BUILDER_LIST_COLUMN_STATUS ?? t("formBuilder.list.columnStatus", "Status") }),
148
+ /* @__PURE__ */ jsxRuntime.jsx(table.TableHead, { children: localization?.FORM_BUILDER_LIST_COLUMN_CREATED ?? t("formBuilder.list.columnCreated", "Created") }),
149
+ /* @__PURE__ */ jsxRuntime.jsx(table.TableHead, { className: "w-12", children: localization?.FORM_BUILDER_LIST_COLUMN_ACTIONS ?? t("formBuilder.list.columnActions", "Actions") })
150
+ ] }) }),
151
+ /* @__PURE__ */ jsxRuntime.jsx(table.TableBody, { children: forms.map((form) => /* @__PURE__ */ jsxRuntime.jsxs(table.TableRow, { className: classNames?.tableRow, children: [
152
+ /* @__PURE__ */ jsxRuntime.jsx(table.TableCell, { className: "font-medium", children: form.name }),
153
+ /* @__PURE__ */ jsxRuntime.jsx(table.TableCell, { className: "text-muted-foreground font-mono text-sm", children: form.slug }),
154
+ /* @__PURE__ */ jsxRuntime.jsx(table.TableCell, { children: getStatusBadge(form.status) }),
155
+ /* @__PURE__ */ jsxRuntime.jsx(table.TableCell, { className: "text-muted-foreground", children: new Date(form.createdAt).toLocaleDateString() }),
156
+ /* @__PURE__ */ jsxRuntime.jsx(table.TableCell, { children: /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenu, { children: [
157
+ /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(button.Button, { variant: "ghost", size: "icon", children: [
158
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreHorizontal, { className: "h-4 w-4" }),
159
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: localization?.FORM_BUILDER_LIST_COLUMN_ACTIONS ?? t(
160
+ "formBuilder.list.columnActions",
161
+ "Actions"
162
+ ) })
163
+ ] }) }),
164
+ /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenuContent, { align: "end", children: [
165
+ /* @__PURE__ */ jsxRuntime.jsx(
166
+ context.PermissionAccess,
167
+ {
168
+ permission: permissions.formBuilderPermissions.form.update({
169
+ formId: form.id,
170
+ ...form.createdBy ? { ownerId: form.createdBy } : {},
171
+ status: form.status
172
+ }),
173
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
174
+ dropdownMenu.DropdownMenuItem,
175
+ {
176
+ onClick: () => navigate("forms", form.id, "edit"),
177
+ children: [
178
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pencil, { className: "mr-2 h-4 w-4" }),
179
+ localization?.FORM_BUILDER_LIST_ACTION_EDIT ?? t("formBuilder.list.actionEdit", "Edit")
180
+ ]
181
+ }
182
+ )
183
+ }
184
+ ),
185
+ /* @__PURE__ */ jsxRuntime.jsx(
186
+ context.PermissionAccess,
187
+ {
188
+ permission: permissions.formBuilderPermissions.submission.read(
189
+ {
190
+ scope: "collection",
191
+ formId: form.id,
192
+ formExists: true,
193
+ ...form.createdBy ? { ownerId: form.createdBy } : {}
194
+ }
195
+ ),
196
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
197
+ dropdownMenu.DropdownMenuItem,
198
+ {
199
+ onClick: () => navigate("forms", form.id, "submissions"),
200
+ children: [
201
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "mr-2 h-4 w-4" }),
202
+ localization?.FORM_BUILDER_LIST_ACTION_SUBMISSIONS ?? t(
203
+ "formBuilder.list.actionSubmissions",
204
+ "Submissions"
205
+ )
206
+ ]
207
+ }
208
+ )
209
+ }
210
+ ),
211
+ /* @__PURE__ */ jsxRuntime.jsx(
212
+ context.PermissionAccess,
213
+ {
214
+ permission: permissions.formBuilderPermissions.form.delete({
215
+ formId: form.id,
216
+ ...form.createdBy ? { ownerId: form.createdBy } : {},
217
+ status: form.status
218
+ }),
219
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
220
+ dropdownMenu.DropdownMenuItem,
221
+ {
222
+ className: "text-destructive",
223
+ onClick: () => setDeleteId(form.id),
224
+ children: [
225
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2, { className: "mr-2 h-4 w-4" }),
226
+ localization?.FORM_BUILDER_LIST_ACTION_DELETE ?? t("formBuilder.list.actionDelete", "Delete")
227
+ ]
228
+ }
229
+ )
230
+ }
231
+ )
232
+ ] })
233
+ ] }) })
234
+ ] }, form.id)) })
235
+ ] })
236
+ }
237
+ ),
238
+ /* @__PURE__ */ jsxRuntime.jsx(
239
+ pagination.Pagination,
240
+ {
241
+ total,
242
+ showing: forms.length,
243
+ hasMore,
244
+ isLoadingMore,
245
+ onLoadMore: loadMore,
246
+ className: classNames?.pagination,
247
+ labels: {
248
+ showing: localization?.FORM_BUILDER_LIST_PAGINATION_SHOWING ?? t(
249
+ "formBuilder.list.paginationShowing",
250
+ "Showing {count} of {total}"
251
+ ),
252
+ next: localization?.FORM_BUILDER_LIST_PAGINATION_NEXT ?? t("formBuilder.list.paginationNext", "Load More"),
253
+ loading: localization?.FORM_BUILDER_STATUS_LOADING ?? t("formBuilder.common.statusLoading", "Loading...")
254
+ }
255
+ }
256
+ )
257
+ ] })
258
+ ] }),
259
+ /* @__PURE__ */ jsxRuntime.jsx(alertDialog.AlertDialog, { open: !!deleteId, onOpenChange: () => setDeleteId(null), children: /* @__PURE__ */ jsxRuntime.jsxs(alertDialog.AlertDialogContent, { children: [
260
+ /* @__PURE__ */ jsxRuntime.jsxs(alertDialog.AlertDialogHeader, { children: [
261
+ /* @__PURE__ */ jsxRuntime.jsx(alertDialog.AlertDialogTitle, { children: localization?.FORM_BUILDER_LIST_DELETE_TITLE ?? t("formBuilder.list.deleteTitle", "Delete Form") }),
262
+ /* @__PURE__ */ jsxRuntime.jsx(alertDialog.AlertDialogDescription, { children: localization?.FORM_BUILDER_EDITOR_DELETE_CONFIRM ?? t(
263
+ "formBuilder.editor.deleteConfirm",
264
+ "Are you sure you want to delete this form? All submissions will also be deleted."
265
+ ) })
266
+ ] }),
267
+ /* @__PURE__ */ jsxRuntime.jsxs(alertDialog.AlertDialogFooter, { children: [
268
+ /* @__PURE__ */ jsxRuntime.jsx(alertDialog.AlertDialogCancel, { children: localization?.FORM_BUILDER_BUTTON_CANCEL ?? t("formBuilder.common.buttonCancel", "Cancel") }),
269
+ /* @__PURE__ */ jsxRuntime.jsx(
270
+ alertDialog.AlertDialogAction,
271
+ {
272
+ onClick: handleDelete,
273
+ className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
274
+ children: deleteMutation.isPending ? localization?.FORM_BUILDER_STATUS_DELETING ?? t("formBuilder.common.statusDeleting", "Deleting...") : localization?.FORM_BUILDER_BUTTON_DELETE ?? t("formBuilder.common.buttonDelete", "Delete")
275
+ }
276
+ )
277
+ ] })
278
+ ] }) })
279
+ ] });
280
+ }
281
+
282
+ exports.FormListPage = FormListPage;