@lattice-php/lattice 0.1.0 → 0.2.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.
- package/dist/_virtual/_rolldown/runtime.js +8 -0
- package/dist/action/components/action-form.d.ts +24 -0
- package/dist/action/components/action-form.js +270 -0
- package/dist/action/components/action-form.js.map +1 -0
- package/dist/action/components/action-group.d.ts +1 -8
- package/dist/action/components/action-group.js +24 -66
- package/dist/action/components/action-group.js.map +1 -1
- package/dist/action/components/action.d.ts +1 -24
- package/dist/action/components/action.js +61 -46
- package/dist/action/components/action.js.map +1 -1
- package/dist/action/effects.d.ts +6 -25
- package/dist/action/effects.js +2 -2
- package/dist/action/effects.js.map +1 -1
- package/dist/action/index.d.ts +1 -1
- package/dist/core/components/badge.d.ts +1 -8
- package/dist/core/components/badge.js +2 -3
- package/dist/core/components/badge.js.map +1 -1
- package/dist/core/components/button.d.ts +4 -12
- package/dist/core/components/button.js +6 -9
- package/dist/core/components/button.js.map +1 -1
- package/dist/core/components/card.d.ts +1 -9
- package/dist/core/components/card.js +1 -3
- package/dist/core/components/card.js.map +1 -1
- package/dist/core/components/confirm-dialog.d.ts +2 -3
- package/dist/core/components/confirm-dialog.js +19 -13
- package/dist/core/components/confirm-dialog.js.map +1 -1
- package/dist/core/components/fragment.d.ts +1 -10
- package/dist/core/components/fragment.js +5 -6
- package/dist/core/components/fragment.js.map +1 -1
- package/dist/core/components/grid.d.ts +1 -8
- package/dist/core/components/grid.js +1 -2
- package/dist/core/components/grid.js.map +1 -1
- package/dist/core/components/heading.d.ts +1 -9
- package/dist/core/components/heading.js +2 -3
- package/dist/core/components/heading.js.map +1 -1
- package/dist/core/components/icon.d.ts +3 -0
- package/dist/core/components/icon.js +30 -0
- package/dist/core/components/icon.js.map +1 -0
- package/dist/core/components/index.d.ts +1 -1
- package/dist/core/components/index.js +4 -0
- package/dist/core/components/index.js.map +1 -1
- package/dist/core/components/link.d.ts +1 -12
- package/dist/core/components/link.js +4 -9
- package/dist/core/components/link.js.map +1 -1
- package/dist/core/components/modal.d.ts +1 -11
- package/dist/core/components/modal.js +27 -31
- package/dist/core/components/modal.js.map +1 -1
- package/dist/core/components/section.d.ts +3 -0
- package/dist/core/components/section.js +79 -0
- package/dist/core/components/section.js.map +1 -0
- package/dist/core/components/segmented-control.d.ts +1 -14
- package/dist/core/components/segmented-control.js +4 -7
- package/dist/core/components/segmented-control.js.map +1 -1
- package/dist/core/components/segmented-pills.d.ts +4 -2
- package/dist/core/components/segmented-pills.js +10 -1
- package/dist/core/components/segmented-pills.js.map +1 -1
- package/dist/core/components/spinner.js +8 -4
- package/dist/core/components/spinner.js.map +1 -1
- package/dist/core/components/stack.d.ts +1 -11
- package/dist/core/components/stack.js +5 -5
- package/dist/core/components/stack.js.map +1 -1
- package/dist/core/components/tabs.d.ts +1 -19
- package/dist/core/components/tabs.js +45 -21
- package/dist/core/components/tabs.js.map +1 -1
- package/dist/core/components/text.d.ts +1 -9
- package/dist/core/components/text.js +2 -3
- package/dist/core/components/text.js.map +1 -1
- package/dist/core/registry.d.ts +9 -3
- package/dist/core/registry.js +21 -5
- package/dist/core/registry.js.map +1 -1
- package/dist/core/renderer.js +7 -13
- package/dist/core/renderer.js.map +1 -1
- package/dist/core/types.d.ts +54 -26
- package/dist/form/components/base/checkbox.js +5 -2
- package/dist/form/components/base/checkbox.js.map +1 -1
- package/dist/form/components/base/field.d.ts +2 -1
- package/dist/form/components/base/field.js +5 -1
- package/dist/form/components/base/field.js.map +1 -1
- package/dist/form/components/base/password-input.js +9 -2
- package/dist/form/components/base/password-input.js.map +1 -1
- package/dist/form/components/base/submit-button.d.ts +4 -4
- package/dist/form/components/base/submit-button.js +2 -2
- package/dist/form/components/base/submit-button.js.map +1 -1
- package/dist/form/components/conditions.d.ts +6 -9
- package/dist/form/components/conditions.js +10 -2
- package/dist/form/components/conditions.js.map +1 -1
- package/dist/form/components/context.d.ts +0 -4
- package/dist/form/components/context.js +1 -5
- package/dist/form/components/context.js.map +1 -1
- package/dist/form/components/field-props.d.ts +24 -0
- package/dist/form/components/field-props.js +15 -0
- package/dist/form/components/field-props.js.map +1 -0
- package/dist/form/components/fields/checkbox.d.ts +1 -15
- package/dist/form/components/fields/checkbox.js +16 -21
- package/dist/form/components/fields/checkbox.js.map +1 -1
- package/dist/form/components/fields/choice.d.ts +1 -13
- package/dist/form/components/fields/choice.js +13 -20
- package/dist/form/components/fields/choice.js.map +1 -1
- package/dist/form/components/fields/date-input.d.ts +1 -19
- package/dist/form/components/fields/date-input.js +11 -16
- package/dist/form/components/fields/date-input.js.map +1 -1
- package/dist/form/components/fields/hidden-input.d.ts +1 -9
- package/dist/form/components/fields/hidden-input.js +2 -3
- package/dist/form/components/fields/hidden-input.js.map +1 -1
- package/dist/form/components/fields/number-input.d.ts +1 -22
- package/dist/form/components/fields/number-input.js +38 -41
- package/dist/form/components/fields/number-input.js.map +1 -1
- package/dist/form/components/fields/password-input.d.ts +1 -28
- package/dist/form/components/fields/password-input.js +15 -24
- package/dist/form/components/fields/password-input.js.map +1 -1
- package/dist/form/components/fields/rich-editor.d.ts +1 -16
- package/dist/form/components/fields/rich-editor.js +57 -47
- package/dist/form/components/fields/rich-editor.js.map +1 -1
- package/dist/form/components/fields/select.d.ts +1 -22
- package/dist/form/components/fields/select.js +85 -74
- package/dist/form/components/fields/select.js.map +1 -1
- package/dist/form/components/fields/simple-field.d.ts +9 -0
- package/dist/form/components/fields/simple-field.js +22 -0
- package/dist/form/components/fields/simple-field.js.map +1 -0
- package/dist/form/components/fields/text-input.d.ts +1 -20
- package/dist/form/components/fields/text-input.js +12 -17
- package/dist/form/components/fields/text-input.js.map +1 -1
- package/dist/form/components/fields/textarea.d.ts +1 -19
- package/dist/form/components/fields/textarea.js +11 -16
- package/dist/form/components/fields/textarea.js.map +1 -1
- package/dist/form/components/form.d.ts +1 -20
- package/dist/form/components/form.js +29 -36
- package/dist/form/components/form.js.map +1 -1
- package/dist/form/components/index.d.ts +0 -1
- package/dist/form/components/index.js +1 -2
- package/dist/form/components/resolved-nodes.d.ts +1 -1
- package/dist/form/components/resolved-nodes.js +2 -2
- package/dist/form/components/resolved-nodes.js.map +1 -1
- package/dist/form/components/types.d.ts +1 -0
- package/dist/form/components/use-controlled-field.d.ts +3 -9
- package/dist/form/components/use-controlled-field.js +5 -9
- package/dist/form/components/use-controlled-field.js.map +1 -1
- package/dist/form/components/use-dependent-field.d.ts +1 -1
- package/dist/form/components/use-dependent-field.js +8 -8
- package/dist/form/components/use-dependent-field.js.map +1 -1
- package/dist/form/components/use-form-resolver.d.ts +1 -1
- package/dist/form/components/use-form-resolver.js +8 -13
- package/dist/form/components/use-form-resolver.js.map +1 -1
- package/dist/form/components/use-seed-default.d.ts +5 -0
- package/dist/form/components/use-seed-default.js +23 -0
- package/dist/form/components/use-seed-default.js.map +1 -0
- package/dist/form/index.d.ts +1 -1
- package/dist/form/index.js +0 -1
- package/dist/form/index.js.map +1 -1
- package/dist/form/skeleton.d.ts +1 -1
- package/dist/form/skeleton.js +1 -1
- package/dist/form/skeleton.js.map +1 -1
- package/dist/i18n/backend.d.ts +24 -0
- package/dist/i18n/backend.js +39 -0
- package/dist/i18n/backend.js.map +1 -0
- package/dist/i18n/index.d.ts +3 -0
- package/dist/i18n/index.js +3 -0
- package/dist/i18n/instance.js +48 -0
- package/dist/i18n/instance.js.map +1 -0
- package/dist/icons/icon-renderer.js +30 -5
- package/dist/icons/icon-renderer.js.map +1 -1
- package/dist/icons/index.d.ts +2 -0
- package/dist/icons/index.js +2 -1
- package/dist/icons/sprite.d.ts +30 -0
- package/dist/icons/sprite.js +40 -0
- package/dist/icons/sprite.js.map +1 -0
- package/dist/index.d.ts +9 -5
- package/dist/index.js +7 -3
- package/dist/inertia.d.ts +1 -6
- package/dist/inertia.js +4 -8
- package/dist/inertia.js.map +1 -1
- package/dist/lattice.css +129 -5
- package/dist/layout/components.d.ts +1 -0
- package/dist/layout/components.js +19 -0
- package/dist/layout/components.js.map +1 -0
- package/dist/layout/context.d.ts +12 -0
- package/dist/layout/context.js +19 -0
- package/dist/layout/context.js.map +1 -0
- package/dist/layout/index.d.ts +3 -0
- package/dist/layout/index.js +4 -0
- package/dist/layout/menu-item.d.ts +3 -0
- package/dist/layout/menu-item.js +130 -0
- package/dist/layout/menu-item.js.map +1 -0
- package/dist/layout/menu.d.ts +3 -0
- package/dist/layout/menu.js +13 -0
- package/dist/layout/menu.js.map +1 -0
- package/dist/layout/outlet.d.ts +6 -0
- package/dist/layout/outlet.js +14 -0
- package/dist/layout/outlet.js.map +1 -0
- package/dist/layout/schema-layout.d.ts +10 -0
- package/dist/layout/schema-layout.js +30 -0
- package/dist/layout/schema-layout.js.map +1 -0
- package/dist/layout/sidebar.d.ts +3 -0
- package/dist/layout/sidebar.js +48 -0
- package/dist/layout/sidebar.js.map +1 -0
- package/dist/lib/utils.d.ts +0 -2
- package/dist/lib/utils.js +1 -4
- package/dist/lib/utils.js.map +1 -1
- package/dist/node_modules/i18next/dist/esm/i18next.js +1982 -0
- package/dist/node_modules/i18next/dist/esm/i18next.js.map +1 -0
- package/dist/node_modules/i18next-http-backend/esm/index.js +352 -0
- package/dist/node_modules/i18next-http-backend/esm/index.js.map +1 -0
- package/dist/node_modules/react-i18next/dist/es/context.js +23 -0
- package/dist/node_modules/react-i18next/dist/es/context.js.map +1 -0
- package/dist/node_modules/react-i18next/dist/es/defaults.js +29 -0
- package/dist/node_modules/react-i18next/dist/es/defaults.js.map +1 -0
- package/dist/node_modules/react-i18next/dist/es/i18nInstance.js +10 -0
- package/dist/node_modules/react-i18next/dist/es/i18nInstance.js.map +1 -0
- package/dist/node_modules/react-i18next/dist/es/initReactI18next.js +14 -0
- package/dist/node_modules/react-i18next/dist/es/initReactI18next.js.map +1 -0
- package/dist/node_modules/react-i18next/dist/es/unescape.js +30 -0
- package/dist/node_modules/react-i18next/dist/es/unescape.js.map +1 -0
- package/dist/node_modules/react-i18next/dist/es/useTranslation.js +157 -0
- package/dist/node_modules/react-i18next/dist/es/useTranslation.js.map +1 -0
- package/dist/node_modules/react-i18next/dist/es/utils.js +58 -0
- package/dist/node_modules/react-i18next/dist/es/utils.js.map +1 -0
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +70 -0
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +1 -0
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +61 -0
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +1 -0
- package/dist/node_modules/use-sync-external-store/shim/index.js +13 -0
- package/dist/node_modules/use-sync-external-store/shim/index.js.map +1 -0
- package/dist/page.d.ts +1 -1
- package/dist/page.js +2 -2
- package/dist/page.js.map +1 -1
- package/dist/provider.d.ts +8 -3
- package/dist/provider.js +17 -9
- package/dist/provider.js.map +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/registry.js +2 -1
- package/dist/registry.js.map +1 -1
- package/dist/table/bulk.d.ts +6 -10
- package/dist/table/bulk.js +13 -35
- package/dist/table/bulk.js.map +1 -1
- package/dist/table/column-registry.d.ts +9 -0
- package/dist/table/components/bulk-bar.js +34 -3
- package/dist/table/components/bulk-bar.js.map +1 -1
- package/dist/table/components/cells/badge-cell.d.ts +5 -0
- package/dist/table/components/cells/badge-cell.js +16 -0
- package/dist/table/components/cells/badge-cell.js.map +1 -0
- package/dist/table/components/cells/icon-cell.d.ts +5 -0
- package/dist/table/components/cells/icon-cell.js +22 -0
- package/dist/table/components/cells/icon-cell.js.map +1 -0
- package/dist/table/components/cells/image-cell.d.ts +5 -0
- package/dist/table/components/cells/image-cell.js +24 -0
- package/dist/table/components/cells/image-cell.js.map +1 -0
- package/dist/table/components/cells/text-cell.d.ts +6 -0
- package/dist/table/components/cells/text-cell.js +50 -0
- package/dist/table/components/cells/text-cell.js.map +1 -0
- package/dist/table/components/column-filter-control.js +59 -96
- package/dist/table/components/column-filter-control.js.map +1 -1
- package/dist/table/components/column-header.js +22 -11
- package/dist/table/components/column-header.js.map +1 -1
- package/dist/table/components/filter-stack-bar.d.ts +2 -2
- package/dist/table/components/filter-stack-bar.js +10 -8
- package/dist/table/components/filter-stack-bar.js.map +1 -1
- package/dist/table/components/filter-value-input.d.ts +5 -3
- package/dist/table/components/filter-value-input.js +25 -16
- package/dist/table/components/filter-value-input.js.map +1 -1
- package/dist/table/components/pagination.d.ts +1 -1
- package/dist/table/components/pagination.js +20 -8
- package/dist/table/components/pagination.js.map +1 -1
- package/dist/table/components/sort-bar.d.ts +2 -2
- package/dist/table/components/sort-bar.js +12 -10
- package/dist/table/components/sort-bar.js.map +1 -1
- package/dist/table/components/table-action-node.d.ts +1 -1
- package/dist/table/components/table-action-node.js +1 -1
- package/dist/table/components/table-action-node.js.map +1 -1
- package/dist/table/components/table-cell.d.ts +1 -1
- package/dist/table/components/table-cell.js +24 -43
- package/dist/table/components/table-cell.js.map +1 -1
- package/dist/table/components/table.d.ts +6 -2
- package/dist/table/components/table.js +40 -17
- package/dist/table/components/table.js.map +1 -1
- package/dist/table/format.js +5 -3
- package/dist/table/format.js.map +1 -1
- package/dist/table/index.d.ts +1 -1
- package/dist/table/index.js.map +1 -1
- package/dist/table/payload.d.ts +1 -1
- package/dist/table/query.d.ts +0 -1
- package/dist/table/query.js +8 -9
- package/dist/table/query.js.map +1 -1
- package/dist/table/types.d.ts +38 -42
- package/dist/table/use-table.d.ts +3 -4
- package/dist/table/use-table.js +12 -23
- package/dist/table/use-table.js.map +1 -1
- package/dist/test-support.d.ts +14 -0
- package/dist/test-support.js +14 -0
- package/dist/test-support.js.map +1 -0
- package/dist/toast/index.d.ts +1 -0
- package/dist/toast/index.js +2 -0
- package/dist/toast/toaster.d.ts +3 -0
- package/dist/toast/toaster.js +126 -0
- package/dist/toast/toaster.js.map +1 -0
- package/dist/types/generated.d.ts +677 -0
- package/dist/types/generated.js +0 -0
- package/dist/types/index.d.ts +1 -1
- package/package.json +18 -3
- package/resources/icons/align-center.svg +17 -0
- package/resources/icons/align-justify.svg +17 -0
- package/resources/icons/align-left.svg +17 -0
- package/resources/icons/align-right.svg +17 -0
- package/resources/icons/arrow-down.svg +16 -0
- package/resources/icons/arrow-up.svg +16 -0
- package/resources/icons/bold.svg +15 -0
- package/resources/icons/check.svg +15 -0
- package/resources/icons/chevron-down.svg +15 -0
- package/resources/icons/chevron-right.svg +15 -0
- package/resources/icons/chevrons-up-down.svg +16 -0
- package/resources/icons/circle-alert.svg +17 -0
- package/resources/icons/circle-check.svg +16 -0
- package/resources/icons/circle-help.svg +17 -0
- package/resources/icons/circle-x.svg +17 -0
- package/resources/icons/code.svg +16 -0
- package/resources/icons/columns-3.svg +17 -0
- package/resources/icons/copy.svg +16 -0
- package/resources/icons/external-link.svg +17 -0
- package/resources/icons/eye-off.svg +18 -0
- package/resources/icons/eye.svg +16 -0
- package/resources/icons/filter.svg +15 -0
- package/resources/icons/heading-1.svg +18 -0
- package/resources/icons/heading-2.svg +18 -0
- package/resources/icons/heading-3.svg +19 -0
- package/resources/icons/highlighter.svg +16 -0
- package/resources/icons/info.svg +17 -0
- package/resources/icons/italic.svg +17 -0
- package/resources/icons/layout-dashboard.svg +18 -0
- package/resources/icons/link.svg +16 -0
- package/resources/icons/list-ordered.svg +20 -0
- package/resources/icons/list.svg +20 -0
- package/resources/icons/loader-2.svg +15 -0
- package/resources/icons/minus.svg +15 -0
- package/resources/icons/more-horizontal.svg +17 -0
- package/resources/icons/panel-left.svg +16 -0
- package/resources/icons/pencil-line.svg +17 -0
- package/resources/icons/pencil.svg +16 -0
- package/resources/icons/plus.svg +16 -0
- package/resources/icons/quote.svg +16 -0
- package/resources/icons/rows-3.svg +17 -0
- package/resources/icons/search.svg +16 -0
- package/resources/icons/send.svg +16 -0
- package/resources/icons/settings.svg +16 -0
- package/resources/icons/smile.svg +18 -0
- package/resources/icons/strikethrough.svg +17 -0
- package/resources/icons/table.svg +18 -0
- package/resources/icons/trash-2.svg +19 -0
- package/resources/icons/underline.svg +16 -0
- package/resources/icons/x.svg +16 -0
- package/dist/core/props.d.ts +0 -14
- package/dist/core/props.js +0 -30
- package/dist/core/props.js.map +0 -1
- package/dist/form/components/fields/submit-button.d.ts +0 -10
- package/dist/form/components/fields/submit-button.js +0 -14
- package/dist/form/components/fields/submit-button.js.map +0 -1
- package/dist/generated/types.d.ts +0 -17
- package/dist/icons/default-icons.d.ts +0 -3
- package/dist/icons/default-icons.js +0 -44
- package/dist/icons/default-icons.js.map +0 -1
- package/dist/icons/dynamic-lucide-renderer.d.ts +0 -2
- package/dist/icons/dynamic-lucide-renderer.js +0 -18
- package/dist/icons/dynamic-lucide-renderer.js.map +0 -1
- package/dist/menu/index.d.ts +0 -1
- package/dist/menu/index.js +0 -2
- package/dist/menu/use-menu.d.ts +0 -2
- package/dist/menu/use-menu.js +0 -9
- package/dist/menu/use-menu.js.map +0 -1
- /package/dist/{generated/types.js → table/column-registry.js} +0 -0
|
@@ -1,21 +1,2 @@
|
|
|
1
|
-
import { RendererComponent } from '
|
|
2
|
-
import { FormMethod } from './types';
|
|
3
|
-
declare module '../../../../core/types' {
|
|
4
|
-
interface ComponentProps {
|
|
5
|
-
form: {
|
|
6
|
-
action?: string;
|
|
7
|
-
errorBag?: string;
|
|
8
|
-
ref?: string;
|
|
9
|
-
method?: FormMethod;
|
|
10
|
-
precognitive?: boolean;
|
|
11
|
-
resetOnError?: boolean | string[];
|
|
12
|
-
resetOnSuccess?: boolean | string[];
|
|
13
|
-
state?: Record<string, unknown>;
|
|
14
|
-
status?: string;
|
|
15
|
-
submitButton?: boolean;
|
|
16
|
-
submitLabel?: string;
|
|
17
|
-
validationTimeout?: number;
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
}
|
|
1
|
+
import { RendererComponent } from '../../core/types';
|
|
21
2
|
export declare const FormComponent: RendererComponent<"form">;
|
|
@@ -1,33 +1,25 @@
|
|
|
1
1
|
import { withRefHeader } from "../../core/component-ref.js";
|
|
2
|
-
import { getBooleanProp, getOptionalNumberProp, getStringProp } from "../../core/props.js";
|
|
3
2
|
import { LATTICE_EVENT } from "../../events/event-names.js";
|
|
4
3
|
import { FormProvider } from "./context.js";
|
|
5
|
-
import {
|
|
4
|
+
import { walkFields } from "./field-props.js";
|
|
6
5
|
import { ResolvedNodesProvider } from "./resolved-nodes.js";
|
|
7
6
|
import { FormValuesProvider } from "./values.js";
|
|
8
7
|
import { useFormResolver } from "./use-form-resolver.js";
|
|
8
|
+
import { FormSubmitButton } from "./base/submit-button.js";
|
|
9
9
|
import { useEffect, useMemo } from "react";
|
|
10
10
|
import { Form } from "@inertiajs/react";
|
|
11
11
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
12
|
//#region resources/js/form/components/form.tsx
|
|
13
|
-
function
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const name = getStringProp(child.props, "name");
|
|
24
|
-
if (name) {
|
|
25
|
-
const label = getStringProp(child.props, "label");
|
|
26
|
-
if (label) collected.labels[name] = label;
|
|
27
|
-
if (child.props?.value !== void 0) collected.values[name] = child.props.value;
|
|
28
|
-
}
|
|
29
|
-
collectFields(child.children, collected);
|
|
30
|
-
}
|
|
13
|
+
function collectFields(nodes) {
|
|
14
|
+
const collected = {
|
|
15
|
+
labels: {},
|
|
16
|
+
values: {}
|
|
17
|
+
};
|
|
18
|
+
walkFields(nodes, (props) => {
|
|
19
|
+
if (!props.name) return;
|
|
20
|
+
if (props.label) collected.labels[props.name] = props.label;
|
|
21
|
+
if (props.value !== void 0) collected.values[props.name] = props.value;
|
|
22
|
+
});
|
|
31
23
|
return collected;
|
|
32
24
|
}
|
|
33
25
|
function FormResetListener({ componentId, reset }) {
|
|
@@ -41,36 +33,40 @@ function FormResetListener({ componentId, reset }) {
|
|
|
41
33
|
}, [componentId, reset]);
|
|
42
34
|
return null;
|
|
43
35
|
}
|
|
44
|
-
function FormBody({ action, children, componentRef, nodes, shouldRenderSubmitButton, submitLabel }) {
|
|
36
|
+
function FormBody({ action, children, componentRef, nodes, shouldRenderSubmitButton, submitLabel, summaryLabel }) {
|
|
45
37
|
return /* @__PURE__ */ jsx(ResolvedNodesProvider, {
|
|
46
38
|
nodes: useFormResolver(action, componentRef, nodes),
|
|
47
39
|
children: /* @__PURE__ */ jsxs("div", {
|
|
48
40
|
className: "flex flex-col gap-6",
|
|
49
41
|
children: [children, shouldRenderSubmitButton && /* @__PURE__ */ jsx("div", {
|
|
50
42
|
className: "flex justify-end rounded-lt border border-lt-border bg-lt-surface px-6 py-4 shadow-xs",
|
|
51
|
-
children: /* @__PURE__ */ jsx(FormSubmitButton, {
|
|
43
|
+
children: /* @__PURE__ */ jsx(FormSubmitButton, {
|
|
44
|
+
label: submitLabel,
|
|
45
|
+
summaryLabel
|
|
46
|
+
})
|
|
52
47
|
})]
|
|
53
48
|
})
|
|
54
49
|
});
|
|
55
50
|
}
|
|
56
51
|
var FormComponent = ({ children, node }) => {
|
|
57
|
-
const props = node.props
|
|
52
|
+
const props = node.props;
|
|
58
53
|
const action = props.action ?? "#";
|
|
59
54
|
const errorBag = props.errorBag;
|
|
60
|
-
const componentRef =
|
|
55
|
+
const componentRef = props.ref ?? "";
|
|
61
56
|
const method = props.method ?? "post";
|
|
62
|
-
const precognitive =
|
|
57
|
+
const precognitive = props.precognitive ?? false;
|
|
63
58
|
const resetOnError = props.resetOnError ?? false;
|
|
64
59
|
const resetOnSuccess = props.resetOnSuccess ?? [];
|
|
65
|
-
const state =
|
|
66
|
-
const { labels: fieldLabels, values: fieldValues } = useMemo(() => collectFields(node.
|
|
60
|
+
const state = props.state;
|
|
61
|
+
const { labels: fieldLabels, values: fieldValues } = useMemo(() => collectFields(node.schema), [node.schema]);
|
|
67
62
|
const initialValues = {
|
|
68
63
|
...fieldValues,
|
|
69
64
|
...state
|
|
70
65
|
};
|
|
71
|
-
const shouldRenderSubmitButton =
|
|
66
|
+
const shouldRenderSubmitButton = props.submitButton ?? true;
|
|
72
67
|
const submitLabel = props.submitLabel ?? "Submit";
|
|
73
|
-
const
|
|
68
|
+
const summaryLabel = props.validationSummaryLabel;
|
|
69
|
+
const validationTimeout = props.validationTimeout ?? void 0;
|
|
74
70
|
return /* @__PURE__ */ jsx(Form, {
|
|
75
71
|
action,
|
|
76
72
|
"data-lattice-component": node.id,
|
|
@@ -81,20 +77,16 @@ var FormComponent = ({ children, node }) => {
|
|
|
81
77
|
validationTimeout: precognitive ? validationTimeout : void 0,
|
|
82
78
|
headers: withRefHeader(componentRef),
|
|
83
79
|
className: "mx-auto flex w-full max-w-2xl flex-col gap-6",
|
|
84
|
-
children: ({ clearErrors, errors,
|
|
80
|
+
children: ({ clearErrors, errors, processing, reset, validate }) => /* @__PURE__ */ jsxs(FormProvider, {
|
|
85
81
|
value: {
|
|
86
82
|
action,
|
|
87
83
|
clearErrors: (field) => clearErrors(field),
|
|
88
84
|
componentRef,
|
|
89
85
|
errors,
|
|
90
86
|
fieldLabels,
|
|
91
|
-
invalid: (field) => invalid(field),
|
|
92
87
|
precognitive,
|
|
93
88
|
processing,
|
|
94
|
-
|
|
95
|
-
validate: (field) => validate(field),
|
|
96
|
-
validating,
|
|
97
|
-
valid: (field) => valid(field)
|
|
89
|
+
validate: (field) => validate(field)
|
|
98
90
|
},
|
|
99
91
|
children: [
|
|
100
92
|
/* @__PURE__ */ jsx(FormResetListener, {
|
|
@@ -110,9 +102,10 @@ var FormComponent = ({ children, node }) => {
|
|
|
110
102
|
children: /* @__PURE__ */ jsx(FormBody, {
|
|
111
103
|
action,
|
|
112
104
|
componentRef,
|
|
113
|
-
nodes: node.
|
|
105
|
+
nodes: node.schema,
|
|
114
106
|
shouldRenderSubmitButton,
|
|
115
107
|
submitLabel,
|
|
108
|
+
summaryLabel,
|
|
116
109
|
children
|
|
117
110
|
})
|
|
118
111
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.js","names":[],"sources":["../../../resources/js/form/components/form.tsx"],"sourcesContent":["import { Form as InertiaForm } from \"@inertiajs/react\";\nimport { withRefHeader } from \"@lattice/lattice/core/component-ref\";\nimport {
|
|
1
|
+
{"version":3,"file":"form.js","names":[],"sources":["../../../resources/js/form/components/form.tsx"],"sourcesContent":["import { Form as InertiaForm } from \"@inertiajs/react\";\nimport { withRefHeader } from \"@lattice/lattice/core/component-ref\";\nimport { LATTICE_EVENT } from \"@lattice/lattice/events/event-names\";\nimport type { Node, RendererComponent } from \"@lattice/lattice/core/types\";\nimport { useEffect, useMemo } from \"react\";\nimport { FormSubmitButton } from \"./base/submit-button\";\nimport { FormProvider } from \"./context\";\nimport { walkFields } from \"./field-props\";\nimport { ResolvedNodesProvider } from \"./resolved-nodes\";\nimport { useFormResolver } from \"./use-form-resolver\";\nimport { FormValuesProvider } from \"./values\";\n\ntype CollectedFields = {\n labels: Record<string, string>;\n values: Record<string, unknown>;\n};\n\nfunction collectFields(nodes: Node[] | undefined): CollectedFields {\n const collected: CollectedFields = { labels: {}, values: {} };\n\n walkFields(nodes, (props) => {\n if (!props.name) {\n return;\n }\n if (props.label) {\n collected.labels[props.name] = props.label;\n }\n if (props.value !== undefined) {\n collected.values[props.name] = props.value;\n }\n });\n\n return collected;\n}\n\nfunction FormResetListener({\n componentId,\n reset,\n}: {\n componentId?: string;\n reset: (...fields: string[]) => void;\n}) {\n useEffect(() => {\n const handler = (event: Event) => {\n const detail = (event as CustomEvent<{ form: string | null }>).detail;\n\n if (!detail?.form || detail.form === componentId) {\n reset();\n }\n };\n\n window.addEventListener(LATTICE_EVENT.resetForm, handler);\n\n return () => window.removeEventListener(LATTICE_EVENT.resetForm, handler);\n }, [componentId, reset]);\n\n return null;\n}\n\nfunction FormBody({\n action,\n children,\n componentRef,\n nodes,\n shouldRenderSubmitButton,\n submitLabel,\n summaryLabel,\n}: {\n action: string;\n children: React.ReactNode;\n componentRef: string;\n nodes: Node[] | undefined;\n shouldRenderSubmitButton: boolean;\n submitLabel: string;\n summaryLabel: string;\n}) {\n const resolvedNodes = useFormResolver(action, componentRef, nodes);\n\n return (\n <ResolvedNodesProvider nodes={resolvedNodes}>\n <div className=\"flex flex-col gap-6\">\n {children}\n\n {shouldRenderSubmitButton && (\n <div className=\"flex justify-end rounded-lt border border-lt-border bg-lt-surface px-6 py-4 shadow-xs\">\n <FormSubmitButton label={submitLabel} summaryLabel={summaryLabel} />\n </div>\n )}\n </div>\n </ResolvedNodesProvider>\n );\n}\n\nexport const FormComponent: RendererComponent<\"form\"> = ({ children, node }) => {\n const props = node.props;\n const action = props.action ?? \"#\";\n const errorBag = props.errorBag;\n const componentRef = props.ref ?? \"\";\n const method = props.method ?? \"post\";\n const precognitive = props.precognitive ?? false;\n const resetOnError = props.resetOnError ?? false;\n const resetOnSuccess = props.resetOnSuccess ?? [];\n const state = props.state;\n const { labels: fieldLabels, values: fieldValues } = useMemo(\n () => collectFields(node.schema),\n [node.schema],\n );\n const initialValues = { ...fieldValues, ...state };\n const shouldRenderSubmitButton = props.submitButton ?? true;\n const submitLabel = props.submitLabel ?? \"Submit\";\n const summaryLabel = props.validationSummaryLabel;\n const validationTimeout = props.validationTimeout ?? undefined;\n\n return (\n <InertiaForm\n action={action}\n data-lattice-component={node.id}\n errorBag={errorBag}\n method={method}\n resetOnError={resetOnError}\n resetOnSuccess={resetOnSuccess}\n validationTimeout={precognitive ? validationTimeout : undefined}\n headers={withRefHeader(componentRef)}\n className=\"mx-auto flex w-full max-w-2xl flex-col gap-6\"\n >\n {({ clearErrors, errors, processing, reset, validate }) => (\n <FormProvider\n value={{\n action,\n clearErrors: (field) => clearErrors(field),\n componentRef,\n errors: errors as Record<string, string | undefined>,\n fieldLabels,\n precognitive,\n processing,\n validate: (field) => validate(field),\n }}\n >\n <FormResetListener componentId={node.id} reset={reset} />\n\n {props.status && (\n <div className=\"text-center text-sm font-medium text-green-600 dark:text-green-400\">\n {props.status}\n </div>\n )}\n\n <FormValuesProvider initial={initialValues}>\n <FormBody\n action={action}\n componentRef={componentRef}\n nodes={node.schema}\n shouldRenderSubmitButton={shouldRenderSubmitButton}\n submitLabel={submitLabel}\n summaryLabel={summaryLabel}\n >\n {children}\n </FormBody>\n </FormValuesProvider>\n </FormProvider>\n )}\n </InertiaForm>\n );\n};\n"],"mappings":";;;;;;;;;;;;AAiBA,SAAS,cAAc,OAA4C;CACjE,MAAM,YAA6B;EAAE,QAAQ,CAAC;EAAG,QAAQ,CAAC;CAAE;CAE5D,WAAW,QAAQ,UAAU;EAC3B,IAAI,CAAC,MAAM,MACT;EAEF,IAAI,MAAM,OACR,UAAU,OAAO,MAAM,QAAQ,MAAM;EAEvC,IAAI,MAAM,UAAU,KAAA,GAClB,UAAU,OAAO,MAAM,QAAQ,MAAM;CAEzC,CAAC;CAED,OAAO;AACT;AAEA,SAAS,kBAAkB,EACzB,aACA,SAIC;CACD,gBAAgB;EACd,MAAM,WAAW,UAAiB;GAChC,MAAM,SAAU,MAA+C;GAE/D,IAAI,CAAC,QAAQ,QAAQ,OAAO,SAAS,aACnC,MAAM;EAEV;EAEA,OAAO,iBAAiB,cAAc,WAAW,OAAO;EAExD,aAAa,OAAO,oBAAoB,cAAc,WAAW,OAAO;CAC1E,GAAG,CAAC,aAAa,KAAK,CAAC;CAEvB,OAAO;AACT;AAEA,SAAS,SAAS,EAChB,QACA,UACA,cACA,OACA,0BACA,aACA,gBASC;CAGD,OACE,oBAAC,uBAAD;EAAuB,OAHH,gBAAgB,QAAQ,cAAc,KAG5B;YAC5B,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,UAEA,4BACC,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,kBAAD;KAAkB,OAAO;KAA2B;IAAe,CAAA;GAChE,CAAA,CAEJ;;CACgB,CAAA;AAE3B;AAEA,IAAa,iBAA4C,EAAE,UAAU,WAAW;CAC9E,MAAM,QAAQ,KAAK;CACnB,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,WAAW,MAAM;CACvB,MAAM,eAAe,MAAM,OAAO;CAClC,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,eAAe,MAAM,gBAAgB;CAC3C,MAAM,eAAe,MAAM,gBAAgB;CAC3C,MAAM,iBAAiB,MAAM,kBAAkB,CAAC;CAChD,MAAM,QAAQ,MAAM;CACpB,MAAM,EAAE,QAAQ,aAAa,QAAQ,gBAAgB,cAC7C,cAAc,KAAK,MAAM,GAC/B,CAAC,KAAK,MAAM,CACd;CACA,MAAM,gBAAgB;EAAE,GAAG;EAAa,GAAG;CAAM;CACjD,MAAM,2BAA2B,MAAM,gBAAgB;CACvD,MAAM,cAAc,MAAM,eAAe;CACzC,MAAM,eAAe,MAAM;CAC3B,MAAM,oBAAoB,MAAM,qBAAqB,KAAA;CAErD,OACE,oBAAC,MAAD;EACU;EACR,0BAAwB,KAAK;EACnB;EACF;EACM;EACE;EAChB,mBAAmB,eAAe,oBAAoB,KAAA;EACtD,SAAS,cAAc,YAAY;EACnC,WAAU;aAER,EAAE,aAAa,QAAQ,YAAY,OAAO,eAC1C,qBAAC,cAAD;GACE,OAAO;IACL;IACA,cAAc,UAAU,YAAY,KAAK;IACzC;IACQ;IACR;IACA;IACA;IACA,WAAW,UAAU,SAAS,KAAK;GACrC;aAVF;IAYE,oBAAC,mBAAD;KAAmB,aAAa,KAAK;KAAW;IAAQ,CAAA;IAEvD,MAAM,UACL,oBAAC,OAAD;KAAK,WAAU;eACZ,MAAM;IACJ,CAAA;IAGP,oBAAC,oBAAD;KAAoB,SAAS;eAC3B,oBAAC,UAAD;MACU;MACM;MACd,OAAO,KAAK;MACc;MACb;MACC;MAEb;KACO,CAAA;IACQ,CAAA;GACR;;CAEL,CAAA;AAEjB"}
|
|
@@ -6,6 +6,5 @@ export { HiddenInputComponent } from './fields/hidden-input';
|
|
|
6
6
|
export { NumberInputComponent } from './fields/number-input';
|
|
7
7
|
export { PasswordInputComponent } from './fields/password-input';
|
|
8
8
|
export { SelectComponent } from './fields/select';
|
|
9
|
-
export { SubmitButtonComponent } from './fields/submit-button';
|
|
10
9
|
export { TextareaComponent } from './fields/textarea';
|
|
11
10
|
export { TextInputComponent } from './fields/text-input';
|
|
@@ -6,7 +6,6 @@ import { HiddenInputComponent } from "./fields/hidden-input.js";
|
|
|
6
6
|
import { NumberInputComponent } from "./fields/number-input.js";
|
|
7
7
|
import { PasswordInputComponent } from "./fields/password-input.js";
|
|
8
8
|
import { SelectComponent } from "./fields/select.js";
|
|
9
|
-
import { SubmitButtonComponent } from "./fields/submit-button.js";
|
|
10
9
|
import { TextareaComponent } from "./fields/textarea.js";
|
|
11
10
|
import { TextInputComponent } from "./fields/text-input.js";
|
|
12
|
-
export { CheckboxComponent, ChoiceComponent, DateInputComponent, FormComponent, HiddenInputComponent, NumberInputComponent, PasswordInputComponent, SelectComponent,
|
|
11
|
+
export { CheckboxComponent, ChoiceComponent, DateInputComponent, FormComponent, HiddenInputComponent, NumberInputComponent, PasswordInputComponent, SelectComponent, TextInputComponent, TextareaComponent };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { fieldProps } from "./field-props.js";
|
|
2
2
|
import { createContext, useContext } from "react";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
//#region resources/js/form/components/resolved-nodes.tsx
|
|
@@ -11,7 +11,7 @@ function ResolvedNodesProvider({ nodes, children }) {
|
|
|
11
11
|
}
|
|
12
12
|
function useResolvedNode(node) {
|
|
13
13
|
const nodes = useContext(ResolvedNodesContext);
|
|
14
|
-
const name =
|
|
14
|
+
const name = fieldProps(node).name ?? "";
|
|
15
15
|
return name && nodes[name] ? nodes[name] : node;
|
|
16
16
|
}
|
|
17
17
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolved-nodes.js","names":[],"sources":["../../../resources/js/form/components/resolved-nodes.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport {
|
|
1
|
+
{"version":3,"file":"resolved-nodes.js","names":[],"sources":["../../../resources/js/form/components/resolved-nodes.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { Node } from \"@lattice/lattice/core/types\";\nimport { fieldProps } from \"./field-props\";\n\nconst ResolvedNodesContext = createContext<Record<string, Node>>({});\n\nexport function ResolvedNodesProvider({\n nodes,\n children,\n}: {\n nodes: Record<string, Node>;\n children: React.ReactNode;\n}) {\n return <ResolvedNodesContext.Provider value={nodes}>{children}</ResolvedNodesContext.Provider>;\n}\n\nexport function useResolvedNode(node: Node): Node {\n const nodes = useContext(ResolvedNodesContext);\n const name = fieldProps(node).name ?? \"\";\n\n return name && nodes[name] ? nodes[name] : node;\n}\n"],"mappings":";;;;AAIA,IAAM,uBAAuB,cAAoC,CAAC,CAAC;AAEnE,SAAgB,sBAAsB,EACpC,OACA,YAIC;CACD,OAAO,oBAAC,qBAAqB,UAAtB;EAA+B,OAAO;EAAQ;CAAwC,CAAA;AAC/F;AAEA,SAAgB,gBAAgB,MAAkB;CAChD,MAAM,QAAQ,WAAW,oBAAoB;CAC7C,MAAM,OAAO,WAAW,IAAI,EAAE,QAAQ;CAEtC,OAAO,QAAQ,MAAM,QAAQ,MAAM,QAAQ;AAC7C"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Method } from '@inertiajs/core';
|
|
2
|
+
export type { Checkbox, Choice, DateInput, Form, FormFieldNode, FormNode, FormNodeType, HiddenInput, NumberInput, PasswordInput, RichEditor, Select, Textarea, TextInput, } from '../../types/generated';
|
|
2
3
|
export type FormMethod = Method;
|
|
3
4
|
export type FormLabelAction = {
|
|
4
5
|
href: string;
|
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
import { Node } from '
|
|
1
|
+
import { Node } from '../../core/types';
|
|
2
2
|
import { FieldState } from './conditions';
|
|
3
|
-
type ControlledField = FieldState & {
|
|
3
|
+
export type ControlledField = FieldState & {
|
|
4
4
|
name: string;
|
|
5
5
|
value: string;
|
|
6
6
|
error?: string;
|
|
7
7
|
commit: (value: unknown) => void;
|
|
8
8
|
};
|
|
9
|
-
/**
|
|
10
|
-
* Shared wiring for store-controlled, condition-aware fields: derives the current
|
|
11
|
-
* string value (store, falling back to the node's value prop), the field state
|
|
12
|
-
* (hidden/required/readonly/disabled), the current error, and a `commit` callback
|
|
13
|
-
* that writes to the store and triggers precognition validation / error clearing.
|
|
14
|
-
*/
|
|
9
|
+
/** Shared wiring read by every store-controlled, condition-aware field. */
|
|
15
10
|
export declare function useControlledField(node: Node): ControlledField;
|
|
16
|
-
export {};
|
|
@@ -1,21 +1,17 @@
|
|
|
1
|
-
import { getStringProp } from "../../core/props.js";
|
|
2
1
|
import { useFormContext } from "./context.js";
|
|
2
|
+
import { fieldProps } from "./field-props.js";
|
|
3
3
|
import { useFormValue } from "./values.js";
|
|
4
4
|
import { useDependentField } from "./use-dependent-field.js";
|
|
5
5
|
import { useFieldCommit } from "./use-field-commit.js";
|
|
6
6
|
//#region resources/js/form/components/use-controlled-field.ts
|
|
7
|
-
/**
|
|
8
|
-
* Shared wiring for store-controlled, condition-aware fields: derives the current
|
|
9
|
-
* string value (store, falling back to the node's value prop), the field state
|
|
10
|
-
* (hidden/required/readonly/disabled), the current error, and a `commit` callback
|
|
11
|
-
* that writes to the store and triggers precognition validation / error clearing.
|
|
12
|
-
*/
|
|
7
|
+
/** Shared wiring read by every store-controlled, condition-aware field. */
|
|
13
8
|
function useControlledField(node) {
|
|
14
9
|
const { errors } = useFormContext();
|
|
15
10
|
const state = useDependentField(node);
|
|
16
|
-
const
|
|
11
|
+
const props = fieldProps(node);
|
|
12
|
+
const name = props.name ?? "";
|
|
17
13
|
const storedValue = useFormValue(name);
|
|
18
|
-
const currentValue = storedValue !== void 0 ? storedValue :
|
|
14
|
+
const currentValue = storedValue !== void 0 ? storedValue : props.value;
|
|
19
15
|
const value = typeof currentValue === "string" || typeof currentValue === "number" ? String(currentValue) : "";
|
|
20
16
|
const { commit: commitField } = useFieldCommit();
|
|
21
17
|
const commit = (next) => commitField(name, next);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-controlled-field.js","names":[],"sources":["../../../resources/js/form/components/use-controlled-field.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"use-controlled-field.js","names":[],"sources":["../../../resources/js/form/components/use-controlled-field.ts"],"sourcesContent":["import type { Node } from \"@lattice/lattice/core/types\";\nimport type { FieldState } from \"./conditions\";\nimport { fieldProps } from \"./field-props\";\nimport { useFormContext } from \"./context\";\nimport { useDependentField } from \"./use-dependent-field\";\nimport { useFieldCommit } from \"./use-field-commit\";\nimport { useFormValue } from \"./values\";\n\nexport type ControlledField = FieldState & {\n name: string;\n value: string;\n error?: string;\n commit: (value: unknown) => void;\n};\n\n/** Shared wiring read by every store-controlled, condition-aware field. */\nexport function useControlledField(node: Node): ControlledField {\n const { errors } = useFormContext();\n const state = useDependentField(node);\n const props = fieldProps(node);\n const name = props.name ?? \"\";\n const storedValue = useFormValue(name);\n const currentValue = storedValue !== undefined ? storedValue : props.value;\n const value =\n typeof currentValue === \"string\" || typeof currentValue === \"number\"\n ? String(currentValue)\n : \"\";\n\n const { commit: commitField } = useFieldCommit();\n const commit = (next: unknown): void => commitField(name, next);\n\n return { ...state, name, value, error: errors[name], commit };\n}\n"],"mappings":";;;;;;;AAgBA,SAAgB,mBAAmB,MAA6B;CAC9D,MAAM,EAAE,WAAW,eAAe;CAClC,MAAM,QAAQ,kBAAkB,IAAI;CACpC,MAAM,QAAQ,WAAW,IAAI;CAC7B,MAAM,OAAO,MAAM,QAAQ;CAC3B,MAAM,cAAc,aAAa,IAAI;CACrC,MAAM,eAAe,gBAAgB,KAAA,IAAY,cAAc,MAAM;CACrE,MAAM,QACJ,OAAO,iBAAiB,YAAY,OAAO,iBAAiB,WACxD,OAAO,YAAY,IACnB;CAEN,MAAM,EAAE,QAAQ,gBAAgB,eAAe;CAC/C,MAAM,UAAU,SAAwB,YAAY,MAAM,IAAI;CAE9D,OAAO;EAAE,GAAG;EAAO;EAAM;EAAO,OAAO,OAAO;EAAO;CAAO;AAC9D"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { evaluateConditions } from "./conditions.js";
|
|
1
|
+
import { fieldProps } from "./field-props.js";
|
|
3
2
|
import { useFormValues } from "./values.js";
|
|
3
|
+
import { evaluateConditions } from "./conditions.js";
|
|
4
4
|
//#region resources/js/form/components/use-dependent-field.ts
|
|
5
5
|
function useDependentField(node) {
|
|
6
6
|
const values = useFormValues();
|
|
7
|
-
const
|
|
8
|
-
return evaluateConditions(conditions, values, {
|
|
9
|
-
hidden:
|
|
10
|
-
required:
|
|
11
|
-
|
|
12
|
-
disabled:
|
|
7
|
+
const props = fieldProps(node);
|
|
8
|
+
return evaluateConditions(props.conditions ?? void 0, values, {
|
|
9
|
+
hidden: props.hidden ?? false,
|
|
10
|
+
required: props.required ?? false,
|
|
11
|
+
readOnly: props.readOnly ?? false,
|
|
12
|
+
disabled: props.disabled ?? false
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
15
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-dependent-field.js","names":[],"sources":["../../../resources/js/form/components/use-dependent-field.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"use-dependent-field.js","names":[],"sources":["../../../resources/js/form/components/use-dependent-field.ts"],"sourcesContent":["import type { Node } from \"@lattice/lattice/core/types\";\nimport { type FieldState, evaluateConditions } from \"./conditions\";\nimport { fieldProps } from \"./field-props\";\nimport { useFormValues } from \"./values\";\n\nexport function useDependentField(node: Node): FieldState {\n const values = useFormValues();\n const props = fieldProps(node);\n\n return evaluateConditions(props.conditions ?? undefined, values, {\n hidden: props.hidden ?? false,\n required: props.required ?? false,\n readOnly: props.readOnly ?? false,\n disabled: props.disabled ?? false,\n });\n}\n"],"mappings":";;;;AAKA,SAAgB,kBAAkB,MAAwB;CACxD,MAAM,SAAS,cAAc;CAC7B,MAAM,QAAQ,WAAW,IAAI;CAE7B,OAAO,mBAAmB,MAAM,cAAc,KAAA,GAAW,QAAQ;EAC/D,QAAQ,MAAM,UAAU;EACxB,UAAU,MAAM,YAAY;EAC5B,UAAU,MAAM,YAAY;EAC5B,UAAU,MAAM,YAAY;CAC9B,CAAC;AACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Node } from '
|
|
1
|
+
import { Node } from '../../core/types';
|
|
2
2
|
export declare function useFormResolver(action: string, componentRef: string, nodes: Node[] | undefined): Record<string, Node>;
|
|
@@ -1,27 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { walkFields } from "./field-props.js";
|
|
2
2
|
import { postFormAction } from "./form-transport.js";
|
|
3
3
|
import { useFormValues, useSetFormValue } from "./values.js";
|
|
4
4
|
import { useEffect, useMemo, useState } from "react";
|
|
5
5
|
//#region resources/js/form/components/use-form-resolver.ts
|
|
6
|
-
function collectWatch(nodes, keys, state) {
|
|
7
|
-
for (const child of nodes ?? []) {
|
|
8
|
-
const dependsOnKeys = child.props?.dependsOnKeys;
|
|
9
|
-
if (Array.isArray(dependsOnKeys)) for (const key of dependsOnKeys) keys.add(String(key));
|
|
10
|
-
if (getBooleanProp(child.props, "dependsOnAny")) state.any = true;
|
|
11
|
-
collectWatch(child.children, keys, state);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
6
|
function useFormResolver(action, componentRef, nodes) {
|
|
15
7
|
const values = useFormValues();
|
|
16
8
|
const setValue = useSetFormValue();
|
|
17
9
|
const [resolved, setResolved] = useState({});
|
|
18
10
|
const watch = useMemo(() => {
|
|
19
11
|
const keys = /* @__PURE__ */ new Set();
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
let any = false;
|
|
13
|
+
walkFields(nodes, (props) => {
|
|
14
|
+
if (Array.isArray(props.dependsOnKeys)) for (const key of props.dependsOnKeys) keys.add(String(key));
|
|
15
|
+
if (props.dependsOnAny) any = true;
|
|
16
|
+
});
|
|
22
17
|
return {
|
|
23
18
|
keys: [...keys],
|
|
24
|
-
any
|
|
19
|
+
any
|
|
25
20
|
};
|
|
26
21
|
}, [nodes]);
|
|
27
22
|
useEffect(() => {
|
|
@@ -42,7 +37,7 @@ function useFormResolver(action, componentRef, nodes) {
|
|
|
42
37
|
controller.abort();
|
|
43
38
|
};
|
|
44
39
|
}, [
|
|
45
|
-
watch.any ?
|
|
40
|
+
watch.any ? values : JSON.stringify(watch.keys.map((key) => values[key])),
|
|
46
41
|
action,
|
|
47
42
|
componentRef,
|
|
48
43
|
watch.keys.length,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-resolver.js","names":[],"sources":["../../../resources/js/form/components/use-form-resolver.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport {
|
|
1
|
+
{"version":3,"file":"use-form-resolver.js","names":[],"sources":["../../../resources/js/form/components/use-form-resolver.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport type { Node } from \"@lattice/lattice/core/types\";\nimport { walkFields } from \"./field-props\";\nimport { FORM_DEBOUNCE_MS, postFormAction } from \"./form-transport\";\nimport { useFormValues, useSetFormValue } from \"./values\";\n\ntype ResolveResponse = {\n fields?: Record<string, Node>;\n values?: Record<string, unknown>;\n};\n\nexport function useFormResolver(\n action: string,\n componentRef: string,\n nodes: Node[] | undefined,\n): Record<string, Node> {\n const values = useFormValues();\n const setValue = useSetFormValue();\n const [resolved, setResolved] = useState<Record<string, Node>>({});\n\n const watch = useMemo(() => {\n const keys = new Set<string>();\n let any = false;\n walkFields(nodes, (props) => {\n if (Array.isArray(props.dependsOnKeys)) {\n for (const key of props.dependsOnKeys) {\n keys.add(String(key));\n }\n }\n if (props.dependsOnAny) {\n any = true;\n }\n });\n return { keys: [...keys], any };\n }, [nodes]);\n\n // In \"any\" mode the values store keeps a stable reference until something\n // actually changes (Object.is in setValue), so its identity is the change\n // signal — no need to serialize every value. Otherwise hash the watched keys.\n const watchSignature = watch.any ? values : JSON.stringify(watch.keys.map((key) => values[key]));\n\n useEffect(() => {\n if (watch.keys.length === 0 && !watch.any) {\n return;\n }\n\n const controller = new AbortController();\n\n const timer = window.setTimeout(() => {\n void postFormAction<ResolveResponse>(\n action,\n componentRef,\n { _resolve: true, ...values },\n controller.signal,\n )\n .then((response) => {\n if (!response) {\n return;\n }\n for (const [name, value] of Object.entries(response.values ?? {})) {\n setValue(name, value);\n }\n if (response.fields) {\n setResolved(response.fields);\n }\n })\n .catch(() => {});\n }, FORM_DEBOUNCE_MS);\n\n return () => {\n window.clearTimeout(timer);\n controller.abort();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [watchSignature, action, componentRef, watch.keys.length, watch.any, setValue]);\n\n return resolved;\n}\n"],"mappings":";;;;;AAWA,SAAgB,gBACd,QACA,cACA,OACsB;CACtB,MAAM,SAAS,cAAc;CAC7B,MAAM,WAAW,gBAAgB;CACjC,MAAM,CAAC,UAAU,eAAe,SAA+B,CAAC,CAAC;CAEjE,MAAM,QAAQ,cAAc;EAC1B,MAAM,uBAAO,IAAI,IAAY;EAC7B,IAAI,MAAM;EACV,WAAW,QAAQ,UAAU;GAC3B,IAAI,MAAM,QAAQ,MAAM,aAAa,GACnC,KAAK,MAAM,OAAO,MAAM,eACtB,KAAK,IAAI,OAAO,GAAG,CAAC;GAGxB,IAAI,MAAM,cACR,MAAM;EAEV,CAAC;EACD,OAAO;GAAE,MAAM,CAAC,GAAG,IAAI;GAAG;EAAI;CAChC,GAAG,CAAC,KAAK,CAAC;CAOV,gBAAgB;EACd,IAAI,MAAM,KAAK,WAAW,KAAK,CAAC,MAAM,KACpC;EAGF,MAAM,aAAa,IAAI,gBAAgB;EAEvC,MAAM,QAAQ,OAAO,iBAAiB;GACpC,eACE,QACA,cACA;IAAE,UAAU;IAAM,GAAG;GAAO,GAC5B,WAAW,MACb,EACG,MAAM,aAAa;IAClB,IAAI,CAAC,UACH;IAEF,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,UAAU,CAAC,CAAC,GAC9D,SAAS,MAAM,KAAK;IAEtB,IAAI,SAAS,QACX,YAAY,SAAS,MAAM;GAE/B,CAAC,EACA,YAAY,CAAC,CAAC;EACnB,GAAA,GAAmB;EAEnB,aAAa;GACX,OAAO,aAAa,KAAK;GACzB,WAAW,MAAM;EACnB;CAEF,GAAG;EAnCoB,MAAM,MAAM,SAAS,KAAK,UAAU,MAAM,KAAK,KAAK,QAAQ,OAAO,IAAI,CAAC;EAmC3E;EAAQ;EAAc,MAAM,KAAK;EAAQ,MAAM;EAAK;CAAQ,CAAC;CAEjF,OAAO;AACT"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useFormValue, useSetFormValue } from "./values.js";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
//#region resources/js/form/components/use-seed-default.ts
|
|
4
|
+
/**
|
|
5
|
+
* Seed a field's default into the store so dependent fields and the submitted
|
|
6
|
+
* payload reflect it before the user interacts. Pass undefined to skip.
|
|
7
|
+
*/
|
|
8
|
+
function useSeedDefault(name, value) {
|
|
9
|
+
const stored = useFormValue(name);
|
|
10
|
+
const setValue = useSetFormValue();
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (stored === void 0 && value !== void 0) setValue(name, value);
|
|
13
|
+
}, [
|
|
14
|
+
name,
|
|
15
|
+
value,
|
|
16
|
+
stored,
|
|
17
|
+
setValue
|
|
18
|
+
]);
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { useSeedDefault };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=use-seed-default.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-seed-default.js","names":[],"sources":["../../../resources/js/form/components/use-seed-default.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useFormValue, useSetFormValue } from \"./values\";\n\n/**\n * Seed a field's default into the store so dependent fields and the submitted\n * payload reflect it before the user interacts. Pass undefined to skip.\n */\nexport function useSeedDefault(name: string, value: unknown): void {\n const stored = useFormValue(name);\n const setValue = useSetFormValue();\n\n useEffect(() => {\n if (stored === undefined && value !== undefined) {\n setValue(name, value);\n }\n }, [name, value, stored, setValue]);\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,eAAe,MAAc,OAAsB;CACjE,MAAM,SAAS,aAAa,IAAI;CAChC,MAAM,WAAW,gBAAgB;CAEjC,gBAAgB;EACd,IAAI,WAAW,KAAA,KAAa,UAAU,KAAA,GACpC,SAAS,MAAM,KAAK;CAExB,GAAG;EAAC;EAAM;EAAO;EAAQ;CAAQ,CAAC;AACpC"}
|
package/dist/form/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const formComponents: import('
|
|
1
|
+
export declare const formComponents: import('../core/registry').Plugin;
|
package/dist/form/index.js
CHANGED
|
@@ -21,7 +21,6 @@ var formComponents = createPlugin({
|
|
|
21
21
|
return { default: RichEditorComponent };
|
|
22
22
|
}),
|
|
23
23
|
"form.select": lazyComponent(loadFormComponent("SelectComponent")),
|
|
24
|
-
"form.submit-button": lazyComponent(loadFormComponent("SubmitButtonComponent")),
|
|
25
24
|
"form.textarea": lazyComponent(loadFormComponent("TextareaComponent")),
|
|
26
25
|
"form.text-input": lazyComponent(loadFormComponent("TextInputComponent"))
|
|
27
26
|
},
|
package/dist/form/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../resources/js/form/index.ts"],"sourcesContent":["import { createPlugin, lazyComponent } from \"@lattice/lattice/core/registry\";\nimport type { RendererComponent, RendererComponentModule } from \"@lattice/lattice/core/types\";\nimport { FormSkeletonComponent } from \"./skeleton\";\n\ntype FormComponentName =\n | \"CheckboxComponent\"\n | \"ChoiceComponent\"\n | \"DateInputComponent\"\n | \"FormComponent\"\n | \"HiddenInputComponent\"\n | \"NumberInputComponent\"\n | \"PasswordInputComponent\"\n | \"SelectComponent\"\n | \"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../resources/js/form/index.ts"],"sourcesContent":["import { createPlugin, lazyComponent } from \"@lattice/lattice/core/registry\";\nimport type { RendererComponent, RendererComponentModule } from \"@lattice/lattice/core/types\";\nimport { FormSkeletonComponent } from \"./skeleton\";\n\ntype FormComponentName =\n | \"CheckboxComponent\"\n | \"ChoiceComponent\"\n | \"DateInputComponent\"\n | \"FormComponent\"\n | \"HiddenInputComponent\"\n | \"NumberInputComponent\"\n | \"PasswordInputComponent\"\n | \"SelectComponent\"\n | \"TextareaComponent\"\n | \"TextInputComponent\";\n\nconst loadFormComponents = () => import(\"./components\");\n\nfunction loadFormComponent<TType extends string>(\n name: FormComponentName,\n): () => Promise<RendererComponentModule<TType>> {\n return async () => {\n const components = await loadFormComponents();\n\n return {\n default: components[name] as unknown as RendererComponent<TType>,\n };\n };\n}\n\nexport const formComponents = createPlugin({\n components: {\n form: lazyComponent(loadFormComponent(\"FormComponent\"), {\n fallback: FormSkeletonComponent,\n }),\n \"form.checkbox\": lazyComponent(loadFormComponent(\"CheckboxComponent\")),\n \"form.choice\": lazyComponent(loadFormComponent(\"ChoiceComponent\")),\n \"form.date-input\": lazyComponent(loadFormComponent(\"DateInputComponent\")),\n \"form.hidden-input\": lazyComponent(loadFormComponent(\"HiddenInputComponent\")),\n \"form.number-input\": lazyComponent(loadFormComponent(\"NumberInputComponent\")),\n \"form.password-input\": lazyComponent(loadFormComponent(\"PasswordInputComponent\")),\n // Loaded from its own module so TipTap is split into a separate chunk,\n // only fetched on pages that actually render a rich editor.\n \"form.rich-editor\": lazyComponent<\"form.rich-editor\">(async () => {\n const { RichEditorComponent } = await import(\"./components/fields/rich-editor\");\n\n return { default: RichEditorComponent };\n }),\n \"form.select\": lazyComponent(loadFormComponent(\"SelectComponent\")),\n \"form.textarea\": lazyComponent(loadFormComponent(\"TextareaComponent\")),\n \"form.text-input\": lazyComponent(loadFormComponent(\"TextInputComponent\")),\n },\n name: \"lattice/form\",\n});\n"],"mappings":";;;AAgBA,IAAM,2BAA2B,OAAO;AAExC,SAAS,kBACP,MAC+C;CAC/C,OAAO,YAAY;EAGjB,OAAO,EACL,UAAS,MAHc,mBAAmB,GAGtB,MACtB;CACF;AACF;AAEA,IAAa,iBAAiB,aAAa;CACzC,YAAY;EACV,MAAM,cAAc,kBAAkB,eAAe,GAAG,EACtD,UAAU,sBACZ,CAAC;EACD,iBAAiB,cAAc,kBAAkB,mBAAmB,CAAC;EACrE,eAAe,cAAc,kBAAkB,iBAAiB,CAAC;EACjE,mBAAmB,cAAc,kBAAkB,oBAAoB,CAAC;EACxE,qBAAqB,cAAc,kBAAkB,sBAAsB,CAAC;EAC5E,qBAAqB,cAAc,kBAAkB,sBAAsB,CAAC;EAC5E,uBAAuB,cAAc,kBAAkB,wBAAwB,CAAC;EAGhF,oBAAoB,cAAkC,YAAY;GAChE,MAAM,EAAE,wBAAwB,MAAM,OAAO;GAE7C,OAAO,EAAE,SAAS,oBAAoB;EACxC,CAAC;EACD,eAAe,cAAc,kBAAkB,iBAAiB,CAAC;EACjE,iBAAiB,cAAc,kBAAkB,mBAAmB,CAAC;EACrE,mBAAmB,cAAc,kBAAkB,oBAAoB,CAAC;CAC1E;CACA,MAAM;AACR,CAAC"}
|
package/dist/form/skeleton.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { RendererComponent } from '
|
|
1
|
+
import { RendererComponent } from '../core/types';
|
|
2
2
|
export declare const FormSkeletonComponent: RendererComponent<"form">;
|
package/dist/form/skeleton.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
//#region resources/js/form/skeleton.tsx
|
|
3
3
|
var FormSkeletonComponent = ({ node }) => {
|
|
4
|
-
const fieldCount = Math.max(1, Math.min(4, node.
|
|
4
|
+
const fieldCount = Math.max(1, Math.min(4, node.schema?.find((child) => child.type === "grid")?.schema?.filter((child) => child.type !== "form.hidden-input").length ?? 2));
|
|
5
5
|
return /* @__PURE__ */ jsx("div", {
|
|
6
6
|
"aria-hidden": "true",
|
|
7
7
|
className: "mx-auto flex w-full max-w-md animate-pulse flex-col gap-6 rounded-lt border border-lt-border bg-lt-surface p-6 shadow-xs",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skeleton.js","names":[],"sources":["../../resources/js/form/skeleton.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice/lattice/core/types\";\n\nexport const FormSkeletonComponent: RendererComponent<\"form\"> = ({ node }) => {\n const fieldCount = Math.max(\n 1,\n Math.min(\n 4,\n node.
|
|
1
|
+
{"version":3,"file":"skeleton.js","names":[],"sources":["../../resources/js/form/skeleton.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice/lattice/core/types\";\n\nexport const FormSkeletonComponent: RendererComponent<\"form\"> = ({ node }) => {\n const fieldCount = Math.max(\n 1,\n Math.min(\n 4,\n node.schema\n ?.find((child) => child.type === \"grid\")\n ?.schema?.filter((child) => child.type !== \"form.hidden-input\").length ?? 2,\n ),\n );\n\n return (\n <div\n aria-hidden=\"true\"\n className=\"mx-auto flex w-full max-w-md animate-pulse flex-col gap-6 rounded-lt border border-lt-border bg-lt-surface p-6 shadow-xs\"\n data-lattice-skeleton={node.id ?? node.type}\n >\n <div className=\"grid gap-6\">\n {Array.from({ length: fieldCount }).map((_, index) => (\n <div className=\"grid gap-2\" key={index}>\n <div className=\"h-4 w-28 rounded bg-lt-muted\" />\n <div className=\"h-10 rounded-lt-sm bg-lt-muted\" />\n </div>\n ))}\n\n <div className=\"mt-4 h-10 rounded-lt-sm bg-lt-muted\" />\n </div>\n </div>\n );\n};\n"],"mappings":";;AAEA,IAAa,yBAAoD,EAAE,WAAW;CAC5E,MAAM,aAAa,KAAK,IACtB,GACA,KAAK,IACH,GACA,KAAK,QACD,MAAM,UAAU,MAAM,SAAS,MAAM,GACrC,QAAQ,QAAQ,UAAU,MAAM,SAAS,mBAAmB,EAAE,UAAU,CAC9E,CACF;CAEA,OACE,oBAAC,OAAD;EACE,eAAY;EACZ,WAAU;EACV,yBAAuB,KAAK,MAAM,KAAK;YAEvC,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,MAAM,KAAK,EAAE,QAAQ,WAAW,CAAC,EAAE,KAAK,GAAG,UAC1C,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,OAAD,EAAK,WAAU,+BAAgC,CAAA,GAC/C,oBAAC,OAAD,EAAK,WAAU,iCAAkC,CAAA,CAC9C;MAH4B,KAG5B,CACN,GAED,oBAAC,OAAD,EAAK,WAAU,sCAAuC,CAAA,CACnD;;CACF,CAAA;AAET"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type BackendOptions = {
|
|
2
|
+
/** i18next-http-backend load path. Defaults to laravel-i18next's namespaced route. */
|
|
3
|
+
loadPath?: string;
|
|
4
|
+
/** Path that receives keys reported by saveMissing. */
|
|
5
|
+
addPath?: string;
|
|
6
|
+
/** Report missing keys back to the backend (laravel-i18next persists them). */
|
|
7
|
+
saveMissing?: boolean;
|
|
8
|
+
/** Extra request headers, e.g. the CSRF token for the saveMissing POST. */
|
|
9
|
+
customHeaders?: () => Record<string, string>;
|
|
10
|
+
};
|
|
11
|
+
/** The i18n settings the backend shares to the frontend (Inertia `lattice.i18n`). */
|
|
12
|
+
export type I18nConfig = {
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
saveMissing: boolean;
|
|
15
|
+
};
|
|
16
|
+
/** Apply the i18n config shared from the backend; wires the HTTP backend only when `enabled`. */
|
|
17
|
+
export declare function configureI18n(config: I18nConfig | undefined): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Load translations from a backend such as bambamboole/laravel-i18next,
|
|
20
|
+
* overriding the renderer's inline English defaults. Call before the first
|
|
21
|
+
* render. Importing this module is the opt-in: apps that never call it don't
|
|
22
|
+
* bundle the HTTP backend.
|
|
23
|
+
*/
|
|
24
|
+
export declare function enableBackend(options?: BackendOptions): Promise<void>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ensureI18n, i18n } from "./instance.js";
|
|
2
|
+
import { Backend } from "../node_modules/i18next-http-backend/esm/index.js";
|
|
3
|
+
//#region resources/js/i18n/backend.ts
|
|
4
|
+
/** laravel-i18next's namespaced routes; an app behind a custom prefix overrides them via {@link BackendOptions}. */
|
|
5
|
+
var DEFAULT_LOAD_PATH = "/locales/{{lng}}/{{ns}}.json";
|
|
6
|
+
var DEFAULT_ADD_PATH = "/locales/add/{{lng}}/{{ns}}";
|
|
7
|
+
/** Apply the i18n config shared from the backend; wires the HTTP backend only when `enabled`. */
|
|
8
|
+
async function configureI18n(config) {
|
|
9
|
+
if (!config?.enabled) {
|
|
10
|
+
await ensureI18n();
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
await enableBackend({ saveMissing: config.saveMissing });
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load translations from a backend such as bambamboole/laravel-i18next,
|
|
17
|
+
* overriding the renderer's inline English defaults. Call before the first
|
|
18
|
+
* render. Importing this module is the opt-in: apps that never call it don't
|
|
19
|
+
* bundle the HTTP backend.
|
|
20
|
+
*/
|
|
21
|
+
async function enableBackend(options = {}) {
|
|
22
|
+
const { loadPath = DEFAULT_LOAD_PATH, addPath = DEFAULT_ADD_PATH, saveMissing = false, customHeaders } = options;
|
|
23
|
+
i18n.use(Backend);
|
|
24
|
+
await ensureI18n((base) => ({
|
|
25
|
+
...base,
|
|
26
|
+
partialBundledLanguages: true,
|
|
27
|
+
saveMissing,
|
|
28
|
+
backend: {
|
|
29
|
+
loadPath,
|
|
30
|
+
addPath,
|
|
31
|
+
customHeaders,
|
|
32
|
+
withCredentials: true
|
|
33
|
+
}
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { configureI18n, enableBackend };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","names":[],"sources":["../../resources/js/i18n/backend.ts"],"sourcesContent":["import HttpBackend from \"i18next-http-backend\";\nimport { ensureI18n, i18n } from \"./instance\";\n\n/** laravel-i18next's namespaced routes; an app behind a custom prefix overrides them via {@link BackendOptions}. */\nconst DEFAULT_LOAD_PATH = \"/locales/{{lng}}/{{ns}}.json\";\nconst DEFAULT_ADD_PATH = \"/locales/add/{{lng}}/{{ns}}\";\n\nexport type BackendOptions = {\n /** i18next-http-backend load path. Defaults to laravel-i18next's namespaced route. */\n loadPath?: string;\n /** Path that receives keys reported by saveMissing. */\n addPath?: string;\n /** Report missing keys back to the backend (laravel-i18next persists them). */\n saveMissing?: boolean;\n /** Extra request headers, e.g. the CSRF token for the saveMissing POST. */\n customHeaders?: () => Record<string, string>;\n};\n\n/** The i18n settings the backend shares to the frontend (Inertia `lattice.i18n`). */\nexport type I18nConfig = {\n enabled: boolean;\n saveMissing: boolean;\n};\n\n/** Apply the i18n config shared from the backend; wires the HTTP backend only when `enabled`. */\nexport async function configureI18n(config: I18nConfig | undefined): Promise<void> {\n if (!config?.enabled) {\n await ensureI18n();\n\n return;\n }\n\n await enableBackend({ saveMissing: config.saveMissing });\n}\n\n/**\n * Load translations from a backend such as bambamboole/laravel-i18next,\n * overriding the renderer's inline English defaults. Call before the first\n * render. Importing this module is the opt-in: apps that never call it don't\n * bundle the HTTP backend.\n */\nexport async function enableBackend(options: BackendOptions = {}): Promise<void> {\n const {\n loadPath = DEFAULT_LOAD_PATH,\n addPath = DEFAULT_ADD_PATH,\n saveMissing = false,\n customHeaders,\n } = options;\n\n i18n.use(HttpBackend);\n\n await ensureI18n((base) => ({\n ...base,\n partialBundledLanguages: true,\n saveMissing,\n backend: { loadPath, addPath, customHeaders, withCredentials: true },\n }));\n}\n"],"mappings":";;;;AAIA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;;AAoBzB,eAAsB,cAAc,QAA+C;CACjF,IAAI,CAAC,QAAQ,SAAS;EACpB,MAAM,WAAW;EAEjB;CACF;CAEA,MAAM,cAAc,EAAE,aAAa,OAAO,YAAY,CAAC;AACzD;;;;;;;AAQA,eAAsB,cAAc,UAA0B,CAAC,GAAkB;CAC/E,MAAM,EACJ,WAAW,mBACX,UAAU,kBACV,cAAc,OACd,kBACE;CAEJ,KAAK,IAAI,OAAW;CAEpB,MAAM,YAAY,UAAU;EAC1B,GAAG;EACH,yBAAyB;EACzB;EACA,SAAS;GAAE;GAAU;GAAS;GAAe,iBAAiB;EAAK;CACrE,EAAE;AACJ"}
|