@webiny/app-admin 6.5.0-beta.3 → 6.5.0-beta.5
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/base/Base/FieldRenderers/HorizontalTabsRenderer.d.ts +2 -2
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.d.ts +2 -2
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +8 -4
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.d.ts +2 -2
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/{TemplatePicker.d.ts → TemplatePicker/AddTemplateButton.d.ts} +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/AddTemplateButton.js +24 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/AddTemplateButton.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.d.ts +13 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.js +21 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.d.ts +3 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.js +35 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.d.ts +8 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.js +22 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.js +46 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.d.ts +8 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.js +16 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.js +22 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.d.ts +3 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.js +35 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/index.d.ts +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/index.js +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/types.d.ts +6 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/types.js +0 -0
- package/base/Base/FieldRenderers/VerticalTabsRenderer.d.ts +2 -2
- package/components/IconPicker/IconPickerComponent.d.ts +2 -2
- package/components/IconPicker/IconPickerComponent.js +1 -1
- package/components/IconPicker/IconPickerComponent.js.map +1 -1
- package/components/ListView/ListViewBulkActions.d.ts +2 -2
- package/components/ListView/ListViewContent.d.ts +2 -2
- package/components/ListView/ListViewFilters.d.ts +2 -2
- package/components/ListView/index.d.ts +6 -6
- package/components/RolesMultiAutocomplete/index.js +1 -1
- package/components/RolesMultiAutocomplete/index.js.map +1 -1
- package/components/Table/components/Table/TableInner.d.ts +2 -2
- package/components/TeamsMultiAutocomplete/index.js +1 -1
- package/components/TeamsMultiAutocomplete/index.js.map +1 -1
- package/domain/Identity.js +1 -1
- package/domain/Identity.js.map +1 -1
- package/features/debugger/Debugger.d.ts +2 -2
- package/features/debugger/DebuggerIndicator.d.ts +2 -2
- package/features/debugger/DebuggerView.d.ts +2 -2
- package/features/formModel/Field.d.ts +7 -1
- package/features/formModel/Field.js +13 -5
- package/features/formModel/Field.js.map +1 -1
- package/features/formModel/FieldBuilder.test.js +12 -0
- package/features/formModel/FieldBuilder.test.js.map +1 -1
- package/features/formModel/FormErrors.d.ts +2 -2
- package/features/formModel/FormErrors.js +1 -1
- package/features/formModel/FormErrors.js.map +1 -1
- package/features/formModel/FormModel.d.ts +1 -0
- package/features/formModel/FormModel.js +17 -0
- package/features/formModel/FormModel.js.map +1 -1
- package/features/formModel/FormModel.test.js +342 -2
- package/features/formModel/FormModel.test.js.map +1 -1
- package/features/formModel/FormView.d.ts +8 -4
- package/features/formModel/ObjectField.d.ts +9 -1
- package/features/formModel/ObjectField.js +27 -17
- package/features/formModel/ObjectField.js.map +1 -1
- package/features/formModel/PresenterErrors.d.ts +2 -2
- package/features/formModel/abstractions.d.ts +17 -1
- package/features/formModel/abstractions.js.map +1 -1
- package/features/formModel/demo/FormModelDemo.d.ts +2 -2
- package/features/formModel/fieldTypes/DateTimeFieldType.d.ts +2 -0
- package/features/formModel/fieldTypes/DateTimeFieldType.js +14 -11
- package/features/formModel/fieldTypes/DateTimeFieldType.js.map +1 -1
- package/features/formModel/fieldTypes/ObjectFieldType.js +6 -0
- package/features/formModel/fieldTypes/ObjectFieldType.js.map +1 -1
- package/features/notifications/NotificationsRenderer.d.ts +2 -2
- package/hooks/useSnackbar.js.map +1 -1
- package/package.json +34 -34
- package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js +1 -2
- package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js.map +1 -1
- package/presentation/accessManagement/apiKeys/components/ApiKeysView.d.ts +2 -2
- package/presentation/accessManagement/roles/RolesPresenter.js +1 -2
- package/presentation/accessManagement/roles/RolesPresenter.js.map +1 -1
- package/presentation/accessManagement/roles/components/RolesView.d.ts +2 -2
- package/presentation/accessManagement/teams/TeamsPresenter.js +1 -2
- package/presentation/accessManagement/teams/TeamsPresenter.js.map +1 -1
- package/presentation/accessManagement/teams/components/TeamsView.d.ts +2 -2
- package/presentation/installation/components/SystemInstaller/SystemInstaller.d.ts +2 -2
- package/presentation/listPresenter/QueryMatcher.js +3 -3
- package/presentation/listPresenter/QueryMatcher.js.map +1 -1
- package/presentation/trashBin/components/BulkActions/DeleteItems.d.ts +2 -2
- package/presentation/trashBin/components/BulkActions/RestoreItems.d.ts +2 -2
- package/presentation/trashBin/components/TrashBinOverlay.d.ts +2 -2
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +0 -68
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AddTemplateButton, type AddTemplateButtonProps } from "./AddTemplateButton.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AddTemplateButton } from "./AddTemplateButton.js";
|
|
File without changes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import type { TabsNodeRendererProps } from "../../../features/formModel/FormView.js";
|
|
3
|
-
export declare const VerticalTabsRenderer: (({ node }: TabsNodeRendererProps) => React.JSX.Element) & {
|
|
4
|
-
|
|
3
|
+
export declare const VerticalTabsRenderer: (({ node }: TabsNodeRendererProps) => React.JSX.Element) & React.NamedExoticComponent<TabsNodeRendererProps> & {
|
|
4
|
+
readonly type: ({ node }: TabsNodeRendererProps) => React.JSX.Element;
|
|
5
5
|
};
|
|
@@ -12,6 +12,6 @@ export interface IconPickerProps extends FormComponentProps {
|
|
|
12
12
|
export interface IconPickerComponentProps extends IconPickerProps {
|
|
13
13
|
presenter: IconPickerPresenter;
|
|
14
14
|
}
|
|
15
|
-
export declare const IconPickerComponent: (({ presenter, label, description, removable, required, disabled, ...props }: IconPickerComponentProps) => React.JSX.Element) & {
|
|
16
|
-
|
|
15
|
+
export declare const IconPickerComponent: (({ presenter, label, description, removable, required, disabled, ...props }: IconPickerComponentProps) => React.JSX.Element) & React.NamedExoticComponent<IconPickerComponentProps> & {
|
|
16
|
+
readonly type: ({ presenter, label, description, removable, required, disabled, ...props }: IconPickerComponentProps) => React.JSX.Element;
|
|
17
17
|
};
|
|
@@ -27,7 +27,7 @@ const IconPickerComponent = observer(({ presenter, label, description, removable
|
|
|
27
27
|
]);
|
|
28
28
|
const handleOnOpenChange = useCallback((open)=>{
|
|
29
29
|
if (open) return presenter.openMenu();
|
|
30
|
-
return presenter.closeMenu();
|
|
30
|
+
else return presenter.closeMenu();
|
|
31
31
|
}, [
|
|
32
32
|
presenter.openMenu,
|
|
33
33
|
presenter.closeMenu
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/IconPicker/IconPickerComponent.js","sources":["../../../src/components/IconPicker/IconPickerComponent.tsx"],"sourcesContent":["import React, { useEffect, useCallback, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport isEqual from \"lodash/isEqual.js\";\nimport type { FormComponentProps } from \"@webiny/admin-ui\";\nimport {\n FormComponentDescription,\n FormComponentErrorMessage,\n FormComponentLabel,\n PopoverPrimitive\n} from \"@webiny/admin-ui\";\nimport { IconPickerContent, IconPickerTrigger } from \"./components/index.js\";\nimport type { IconPickerPresenter } from \"./IconPickerPresenter.js\";\nimport { IconPickerPresenterProvider } from \"./IconPickerPresenterProvider.js\";\nimport type { Icon } from \"./types.js\";\nimport { ICON_PICKER_SIZE } from \"./types.js\";\n\nexport interface IconPickerProps extends FormComponentProps {\n size?: ICON_PICKER_SIZE;\n removable?: boolean;\n value?: Icon;\n onChange?: (value: Icon | undefined) => void;\n}\n\nexport interface IconPickerComponentProps extends IconPickerProps {\n presenter: IconPickerPresenter;\n}\n\nexport const IconPickerComponent = observer(\n ({\n presenter,\n label,\n description,\n removable,\n required,\n disabled,\n ...props\n }: IconPickerComponentProps) => {\n const { value, onChange } = props;\n const { isValid: validationIsValid, message: validationMessage } = props.validation || {};\n const invalid = useMemo(() => validationIsValid === false, [validationIsValid]);\n const { activeTab, isMenuOpened, isLoading, iconTypes, selectedIcon, size } = presenter.vm;\n\n useEffect(() => {\n if (onChange && selectedIcon && !isEqual(selectedIcon, value)) {\n onChange(selectedIcon);\n }\n }, [JSON.stringify(selectedIcon)]);\n\n const removeIcon = useCallback(() => {\n if (onChange) {\n presenter.setIcon(null);\n onChange(undefined);\n }\n }, [onChange]);\n\n const handleOnOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n return presenter.openMenu();\n } else {\n return presenter.closeMenu();\n }\n },\n [presenter.openMenu, presenter.closeMenu]\n );\n\n return (\n <IconPickerPresenterProvider presenter={presenter}>\n <FormComponentLabel text={label} required={required} disabled={disabled} />\n <FormComponentDescription text={description} />\n <PopoverPrimitive open={isMenuOpened} onOpenChange={handleOnOpenChange}>\n <PopoverPrimitive.Trigger>\n <IconPickerTrigger icon={selectedIcon} />\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Content\n style={{ width: size === ICON_PICKER_SIZE.SMALL ? \"248px\" : \"328px\" }}\n >\n <IconPickerContent\n loading={isLoading}\n removable={value && removable}\n iconTypes={iconTypes}\n activeTab={activeTab}\n removeIcon={removeIcon}\n />\n </PopoverPrimitive.Content>\n </PopoverPrimitive>\n <FormComponentErrorMessage text={validationMessage} invalid={invalid} />\n </IconPickerPresenterProvider>\n );\n }\n);\n"],"names":["IconPickerComponent","observer","presenter","label","description","removable","required","disabled","props","value","onChange","validationIsValid","validationMessage","invalid","useMemo","activeTab","isMenuOpened","isLoading","iconTypes","selectedIcon","size","useEffect","isEqual","JSON","removeIcon","useCallback","undefined","handleOnOpenChange","open","IconPickerPresenterProvider","FormComponentLabel","FormComponentDescription","PopoverPrimitive","IconPickerTrigger","ICON_PICKER_SIZE","IconPickerContent","FormComponentErrorMessage"],"mappings":";;;;;;;AA2BO,MAAMA,sBAAsBC,SAC/B,CAAC,EACGC,SAAS,EACTC,KAAK,EACLC,WAAW,EACXC,SAAS,EACTC,QAAQ,EACRC,QAAQ,EACR,GAAGC,OACoB;IACvB,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGF;IAC5B,MAAM,EAAE,SAASG,iBAAiB,EAAE,SAASC,iBAAiB,EAAE,GAAGJ,MAAM,UAAU,IAAI,CAAC;IACxF,MAAMK,UAAUC,QAAQ,IAAMH,AAAsB,UAAtBA,mBAA6B;QAACA;KAAkB;IAC9E,MAAM,EAAEI,SAAS,EAAEC,YAAY,EAAEC,SAAS,EAAEC,SAAS,EAAEC,YAAY,EAAEC,IAAI,EAAE,GAAGlB,UAAU,EAAE;IAE1FmB,UAAU;QACN,IAAIX,YAAYS,gBAAgB,CAACG,QAAQH,cAAcV,QACnDC,SAASS;IAEjB,GAAG;QAACI,KAAK,SAAS,CAACJ;KAAc;IAEjC,MAAMK,aAAaC,YAAY;QAC3B,IAAIf,UAAU;YACVR,UAAU,OAAO,CAAC;YAClBQ,SAASgB;QACb;IACJ,GAAG;QAAChB;KAAS;IAEb,MAAMiB,qBAAqBF,YACvB,CAACG;QACG,IAAIA,MACA,OAAO1B,UAAU,QAAQ;
|
|
1
|
+
{"version":3,"file":"components/IconPicker/IconPickerComponent.js","sources":["../../../src/components/IconPicker/IconPickerComponent.tsx"],"sourcesContent":["import React, { useEffect, useCallback, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport isEqual from \"lodash/isEqual.js\";\nimport type { FormComponentProps } from \"@webiny/admin-ui\";\nimport {\n FormComponentDescription,\n FormComponentErrorMessage,\n FormComponentLabel,\n PopoverPrimitive\n} from \"@webiny/admin-ui\";\nimport { IconPickerContent, IconPickerTrigger } from \"./components/index.js\";\nimport type { IconPickerPresenter } from \"./IconPickerPresenter.js\";\nimport { IconPickerPresenterProvider } from \"./IconPickerPresenterProvider.js\";\nimport type { Icon } from \"./types.js\";\nimport { ICON_PICKER_SIZE } from \"./types.js\";\n\nexport interface IconPickerProps extends FormComponentProps {\n size?: ICON_PICKER_SIZE;\n removable?: boolean;\n value?: Icon;\n onChange?: (value: Icon | undefined) => void;\n}\n\nexport interface IconPickerComponentProps extends IconPickerProps {\n presenter: IconPickerPresenter;\n}\n\nexport const IconPickerComponent = observer(\n ({\n presenter,\n label,\n description,\n removable,\n required,\n disabled,\n ...props\n }: IconPickerComponentProps) => {\n const { value, onChange } = props;\n const { isValid: validationIsValid, message: validationMessage } = props.validation || {};\n const invalid = useMemo(() => validationIsValid === false, [validationIsValid]);\n const { activeTab, isMenuOpened, isLoading, iconTypes, selectedIcon, size } = presenter.vm;\n\n useEffect(() => {\n if (onChange && selectedIcon && !isEqual(selectedIcon, value)) {\n onChange(selectedIcon);\n }\n }, [JSON.stringify(selectedIcon)]);\n\n const removeIcon = useCallback(() => {\n if (onChange) {\n presenter.setIcon(null);\n onChange(undefined);\n }\n }, [onChange]);\n\n const handleOnOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n return presenter.openMenu();\n } else {\n return presenter.closeMenu();\n }\n },\n [presenter.openMenu, presenter.closeMenu]\n );\n\n return (\n <IconPickerPresenterProvider presenter={presenter}>\n <FormComponentLabel text={label} required={required} disabled={disabled} />\n <FormComponentDescription text={description} />\n <PopoverPrimitive open={isMenuOpened} onOpenChange={handleOnOpenChange}>\n <PopoverPrimitive.Trigger>\n <IconPickerTrigger icon={selectedIcon} />\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Content\n style={{ width: size === ICON_PICKER_SIZE.SMALL ? \"248px\" : \"328px\" }}\n >\n <IconPickerContent\n loading={isLoading}\n removable={value && removable}\n iconTypes={iconTypes}\n activeTab={activeTab}\n removeIcon={removeIcon}\n />\n </PopoverPrimitive.Content>\n </PopoverPrimitive>\n <FormComponentErrorMessage text={validationMessage} invalid={invalid} />\n </IconPickerPresenterProvider>\n );\n }\n);\n"],"names":["IconPickerComponent","observer","presenter","label","description","removable","required","disabled","props","value","onChange","validationIsValid","validationMessage","invalid","useMemo","activeTab","isMenuOpened","isLoading","iconTypes","selectedIcon","size","useEffect","isEqual","JSON","removeIcon","useCallback","undefined","handleOnOpenChange","open","IconPickerPresenterProvider","FormComponentLabel","FormComponentDescription","PopoverPrimitive","IconPickerTrigger","ICON_PICKER_SIZE","IconPickerContent","FormComponentErrorMessage"],"mappings":";;;;;;;AA2BO,MAAMA,sBAAsBC,SAC/B,CAAC,EACGC,SAAS,EACTC,KAAK,EACLC,WAAW,EACXC,SAAS,EACTC,QAAQ,EACRC,QAAQ,EACR,GAAGC,OACoB;IACvB,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGF;IAC5B,MAAM,EAAE,SAASG,iBAAiB,EAAE,SAASC,iBAAiB,EAAE,GAAGJ,MAAM,UAAU,IAAI,CAAC;IACxF,MAAMK,UAAUC,QAAQ,IAAMH,AAAsB,UAAtBA,mBAA6B;QAACA;KAAkB;IAC9E,MAAM,EAAEI,SAAS,EAAEC,YAAY,EAAEC,SAAS,EAAEC,SAAS,EAAEC,YAAY,EAAEC,IAAI,EAAE,GAAGlB,UAAU,EAAE;IAE1FmB,UAAU;QACN,IAAIX,YAAYS,gBAAgB,CAACG,QAAQH,cAAcV,QACnDC,SAASS;IAEjB,GAAG;QAACI,KAAK,SAAS,CAACJ;KAAc;IAEjC,MAAMK,aAAaC,YAAY;QAC3B,IAAIf,UAAU;YACVR,UAAU,OAAO,CAAC;YAClBQ,SAASgB;QACb;IACJ,GAAG;QAAChB;KAAS;IAEb,MAAMiB,qBAAqBF,YACvB,CAACG;QACG,IAAIA,MACA,OAAO1B,UAAU,QAAQ;aAEzB,OAAOA,UAAU,SAAS;IAElC,GACA;QAACA,UAAU,QAAQ;QAAEA,UAAU,SAAS;KAAC;IAG7C,OAAO,WAAP,GACI,oBAAC2B,6BAA2BA;QAAC,WAAW3B;qBACpC,oBAAC4B,oBAAkBA;QAAC,MAAM3B;QAAO,UAAUG;QAAU,UAAUC;sBAC/D,oBAACwB,0BAAwBA;QAAC,MAAM3B;sBAChC,oBAAC4B,kBAAgBA;QAAC,MAAMhB;QAAc,cAAcW;qBAChD,oBAACK,iBAAiB,OAAO,sBACrB,oBAACC,mBAAiBA;QAAC,MAAMd;uBAE7B,oBAACa,iBAAiB,OAAO;QACrB,OAAO;YAAE,OAAOZ,SAASc,iBAAiB,KAAK,GAAG,UAAU;QAAQ;qBAEpE,oBAACC,mBAAiBA;QACd,SAASlB;QACT,WAAWR,SAASJ;QACpB,WAAWa;QACX,WAAWH;QACX,YAAYS;wBAIxB,oBAACY,2BAAyBA;QAAC,MAAMxB;QAAmB,SAASC;;AAGzE"}
|
|
@@ -5,7 +5,7 @@ export interface ListViewBulkActionsProps {
|
|
|
5
5
|
itemLabelPlural?: string;
|
|
6
6
|
actions: React.ComponentProps<typeof Buttons>["actions"];
|
|
7
7
|
}
|
|
8
|
-
declare const ListViewBulkActions: (({ itemLabel, itemLabelPlural, actions: bulkActions }: ListViewBulkActionsProps) => React.JSX.Element) & {
|
|
9
|
-
|
|
8
|
+
declare const ListViewBulkActions: (({ itemLabel, itemLabelPlural, actions: bulkActions }: ListViewBulkActionsProps) => React.JSX.Element) & React.NamedExoticComponent<ListViewBulkActionsProps> & {
|
|
9
|
+
readonly type: ({ itemLabel, itemLabelPlural, actions: bulkActions }: ListViewBulkActionsProps) => React.JSX.Element;
|
|
10
10
|
};
|
|
11
11
|
export { ListViewBulkActions };
|
|
@@ -6,7 +6,7 @@ export interface ListViewContentProps {
|
|
|
6
6
|
searchEmpty?: React.ReactNode;
|
|
7
7
|
children: React.ReactNode;
|
|
8
8
|
}
|
|
9
|
-
declare const ListViewContent: (({ loadMoreThreshold, loadMoreDebounceMs, empty, searchEmpty, children }: ListViewContentProps) => React.JSX.Element) & {
|
|
10
|
-
|
|
9
|
+
declare const ListViewContent: (({ loadMoreThreshold, loadMoreDebounceMs, empty, searchEmpty, children }: ListViewContentProps) => React.JSX.Element) & React.NamedExoticComponent<ListViewContentProps> & {
|
|
10
|
+
readonly type: ({ loadMoreThreshold, loadMoreDebounceMs, empty, searchEmpty, children }: ListViewContentProps) => React.JSX.Element;
|
|
11
11
|
};
|
|
12
12
|
export { ListViewContent };
|
|
@@ -9,7 +9,7 @@ export interface ListViewFiltersProps {
|
|
|
9
9
|
filtersToWhere?: FiltersToWhereConverter[];
|
|
10
10
|
children?: React.ReactNode;
|
|
11
11
|
}
|
|
12
|
-
declare const ListViewFilters: (({ filters, filtersToWhere, children }: ListViewFiltersProps) => React.JSX.Element) & {
|
|
13
|
-
|
|
12
|
+
declare const ListViewFilters: (({ filters, filtersToWhere, children }: ListViewFiltersProps) => React.JSX.Element) & React.NamedExoticComponent<ListViewFiltersProps> & {
|
|
13
|
+
readonly type: ({ filters, filtersToWhere, children }: ListViewFiltersProps) => React.JSX.Element;
|
|
14
14
|
};
|
|
15
15
|
export { ListViewFilters };
|
|
@@ -8,14 +8,14 @@ export declare const ListView: typeof ListViewBase & {
|
|
|
8
8
|
};
|
|
9
9
|
Header: typeof ListViewHeader;
|
|
10
10
|
BottomBar: typeof ListViewBottomBar;
|
|
11
|
-
BulkActions: (({ itemLabel, itemLabelPlural, actions: bulkActions }: import("./ListViewBulkActions.js").ListViewBulkActionsProps) => import("react").JSX.Element) & {
|
|
12
|
-
|
|
11
|
+
BulkActions: (({ itemLabel, itemLabelPlural, actions: bulkActions }: import("./ListViewBulkActions.js").ListViewBulkActionsProps) => import("react").JSX.Element) & import("react").NamedExoticComponent<import("./ListViewBulkActions.js").ListViewBulkActionsProps> & {
|
|
12
|
+
readonly type: ({ itemLabel, itemLabelPlural, actions: bulkActions }: import("./ListViewBulkActions.js").ListViewBulkActionsProps) => import("react").JSX.Element;
|
|
13
13
|
};
|
|
14
|
-
Filters: (({ filters, filtersToWhere, children }: import("./ListViewFilters.js").ListViewFiltersProps) => import("react").JSX.Element) & {
|
|
15
|
-
|
|
14
|
+
Filters: (({ filters, filtersToWhere, children }: import("./ListViewFilters.js").ListViewFiltersProps) => import("react").JSX.Element) & import("react").NamedExoticComponent<import("./ListViewFilters.js").ListViewFiltersProps> & {
|
|
15
|
+
readonly type: ({ filters, filtersToWhere, children }: import("./ListViewFilters.js").ListViewFiltersProps) => import("react").JSX.Element;
|
|
16
16
|
};
|
|
17
|
-
Content: (({ loadMoreThreshold, loadMoreDebounceMs, empty, searchEmpty, children }: import("./ListViewContent.js").ListViewContentProps) => import("react").JSX.Element) & {
|
|
18
|
-
|
|
17
|
+
Content: (({ loadMoreThreshold, loadMoreDebounceMs, empty, searchEmpty, children }: import("./ListViewContent.js").ListViewContentProps) => import("react").JSX.Element) & import("react").NamedExoticComponent<import("./ListViewContent.js").ListViewContentProps> & {
|
|
18
|
+
readonly type: ({ loadMoreThreshold, loadMoreDebounceMs, empty, searchEmpty, children }: import("./ListViewContent.js").ListViewContentProps) => import("react").JSX.Element;
|
|
19
19
|
};
|
|
20
20
|
};
|
|
21
21
|
export { useListView } from "./context.js";
|
|
@@ -18,7 +18,7 @@ const RolesMultiAutocomplete = ({ onChange, ...props })=>{
|
|
|
18
18
|
const selected = Array.isArray(props.values) ? props.values : Array.isArray(props.value) ? props.value : [];
|
|
19
19
|
return selected.map((s)=>{
|
|
20
20
|
if ("string" == typeof s) return s;
|
|
21
|
-
if ("object" == typeof s) return s?.id;
|
|
21
|
+
else if ("object" == typeof s) return s?.id;
|
|
22
22
|
return null;
|
|
23
23
|
}).filter((s)=>!!s);
|
|
24
24
|
}, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/RolesMultiAutocomplete/index.js","sources":["../../../src/components/RolesMultiAutocomplete/index.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from \"react\";\nimport { MultiAutoComplete } from \"@webiny/admin-ui\";\nimport { LIST_ROLES } from \"./graphql.js\";\nimport { useQuery } from \"@apollo/react-hooks\";\n\ntype RolesMultiAutocompleteProps = Omit<\n React.ComponentProps<typeof MultiAutoComplete>,\n \"options\" | \"onValuesChange\"\n> & {\n onChange?: (values: string[]) => void;\n};\n\nexport const RolesMultiAutocomplete = ({ onChange, ...props }: RolesMultiAutocompleteProps) => {\n const { data, loading } = useQuery(LIST_ROLES);\n const rawOptions = loading || !data ? [] : data.security.roles.data;\n\n const options = useMemo(\n () => rawOptions.map((role: any) => ({ label: role.name, value: role.id })),\n [rawOptions]\n );\n\n const onValuesChange = useCallback((ids: string[]) => onChange?.(ids), [onChange]);\n\n /**\n * This is required because the Bind, which currently wraps this component passes \"values\" as \"value\" prop, not \"values\".\n * \"values\" is added to safeguard for future changes. When we move to new forms, remove this part.\n */\n const values = useMemo(() => {\n const selected = Array.isArray(props.values)\n ? props.values\n : Array.isArray(props.value)\n ? props.value\n : [];\n\n return selected\n .map(s => {\n if (typeof s === \"string\") {\n return s;\n } else if (typeof s === \"object\") {\n return s?.id;\n }\n return null;\n })\n .filter((s): s is string => !!s);\n }, [props.values, props.value]);\n\n return (\n <MultiAutoComplete\n {...props}\n options={options}\n values={loading ? undefined : (values as string[] | undefined)}\n onValuesChange={onValuesChange}\n />\n );\n};\n"],"names":["RolesMultiAutocomplete","onChange","props","data","loading","useQuery","LIST_ROLES","rawOptions","options","useMemo","role","onValuesChange","useCallback","ids","values","selected","Array","s","MultiAutoComplete","undefined"],"mappings":";;;;AAYO,MAAMA,yBAAyB,CAAC,EAAEC,QAAQ,EAAE,GAAGC,OAAoC;IACtF,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAE,GAAGC,SAASC;IACnC,MAAMC,aAAaH,WAAW,CAACD,OAAO,EAAE,GAAGA,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI;IAEnE,MAAMK,UAAUC,QACZ,IAAMF,WAAW,GAAG,CAAC,CAACG,OAAe;gBAAE,OAAOA,KAAK,IAAI;gBAAE,OAAOA,KAAK,EAAE;YAAC,KACxE;QAACH;KAAW;IAGhB,MAAMI,iBAAiBC,YAAY,CAACC,MAAkBZ,WAAWY,MAAM;QAACZ;KAAS;IAMjF,MAAMa,SAASL,QAAQ;QACnB,MAAMM,WAAWC,MAAM,OAAO,CAACd,MAAM,MAAM,IACrCA,MAAM,MAAM,GACZc,MAAM,OAAO,CAACd,MAAM,KAAK,IACvBA,MAAM,KAAK,GACX,EAAE;QAEV,OAAOa,SACF,GAAG,CAACE,CAAAA;YACD,IAAI,AAAa,YAAb,OAAOA,GACP,OAAOA;
|
|
1
|
+
{"version":3,"file":"components/RolesMultiAutocomplete/index.js","sources":["../../../src/components/RolesMultiAutocomplete/index.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from \"react\";\nimport { MultiAutoComplete } from \"@webiny/admin-ui\";\nimport { LIST_ROLES } from \"./graphql.js\";\nimport { useQuery } from \"@apollo/react-hooks\";\n\ntype RolesMultiAutocompleteProps = Omit<\n React.ComponentProps<typeof MultiAutoComplete>,\n \"options\" | \"onValuesChange\"\n> & {\n onChange?: (values: string[]) => void;\n};\n\nexport const RolesMultiAutocomplete = ({ onChange, ...props }: RolesMultiAutocompleteProps) => {\n const { data, loading } = useQuery(LIST_ROLES);\n const rawOptions = loading || !data ? [] : data.security.roles.data;\n\n const options = useMemo(\n () => rawOptions.map((role: any) => ({ label: role.name, value: role.id })),\n [rawOptions]\n );\n\n const onValuesChange = useCallback((ids: string[]) => onChange?.(ids), [onChange]);\n\n /**\n * This is required because the Bind, which currently wraps this component passes \"values\" as \"value\" prop, not \"values\".\n * \"values\" is added to safeguard for future changes. When we move to new forms, remove this part.\n */\n const values = useMemo(() => {\n const selected = Array.isArray(props.values)\n ? props.values\n : Array.isArray(props.value)\n ? props.value\n : [];\n\n return selected\n .map(s => {\n if (typeof s === \"string\") {\n return s;\n } else if (typeof s === \"object\") {\n return s?.id;\n }\n return null;\n })\n .filter((s): s is string => !!s);\n }, [props.values, props.value]);\n\n return (\n <MultiAutoComplete\n {...props}\n options={options}\n values={loading ? undefined : (values as string[] | undefined)}\n onValuesChange={onValuesChange}\n />\n );\n};\n"],"names":["RolesMultiAutocomplete","onChange","props","data","loading","useQuery","LIST_ROLES","rawOptions","options","useMemo","role","onValuesChange","useCallback","ids","values","selected","Array","s","MultiAutoComplete","undefined"],"mappings":";;;;AAYO,MAAMA,yBAAyB,CAAC,EAAEC,QAAQ,EAAE,GAAGC,OAAoC;IACtF,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAE,GAAGC,SAASC;IACnC,MAAMC,aAAaH,WAAW,CAACD,OAAO,EAAE,GAAGA,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI;IAEnE,MAAMK,UAAUC,QACZ,IAAMF,WAAW,GAAG,CAAC,CAACG,OAAe;gBAAE,OAAOA,KAAK,IAAI;gBAAE,OAAOA,KAAK,EAAE;YAAC,KACxE;QAACH;KAAW;IAGhB,MAAMI,iBAAiBC,YAAY,CAACC,MAAkBZ,WAAWY,MAAM;QAACZ;KAAS;IAMjF,MAAMa,SAASL,QAAQ;QACnB,MAAMM,WAAWC,MAAM,OAAO,CAACd,MAAM,MAAM,IACrCA,MAAM,MAAM,GACZc,MAAM,OAAO,CAACd,MAAM,KAAK,IACvBA,MAAM,KAAK,GACX,EAAE;QAEV,OAAOa,SACF,GAAG,CAACE,CAAAA;YACD,IAAI,AAAa,YAAb,OAAOA,GACP,OAAOA;iBACJ,IAAI,AAAa,YAAb,OAAOA,GACd,OAAOA,GAAG;YAEd,OAAO;QACX,GACC,MAAM,CAAC,CAACA,IAAmB,CAAC,CAACA;IACtC,GAAG;QAACf,MAAM,MAAM;QAAEA,MAAM,KAAK;KAAC;IAE9B,OAAO,WAAP,GACI,oBAACgB,mBAAiBA;QACb,GAAGhB,KAAK;QACT,SAASM;QACT,QAAQJ,UAAUe,SAAaL;QAC/B,gBAAgBH;;AAG5B"}
|
|
@@ -19,6 +19,6 @@ export interface TableInnerProps<T extends TableRow> {
|
|
|
19
19
|
sorting: DataTableSorting;
|
|
20
20
|
tablePresenter: TablePresenter;
|
|
21
21
|
}
|
|
22
|
-
export declare const TableInner: (<T extends TableRow>(props: TableInnerProps<T>) => React.JSX.Element) & {
|
|
23
|
-
|
|
22
|
+
export declare const TableInner: (<T extends TableRow>(props: TableInnerProps<T>) => React.JSX.Element) & React.NamedExoticComponent<TableInnerProps<TableRow<unknown>>> & {
|
|
23
|
+
readonly type: <T extends TableRow>(props: TableInnerProps<T>) => React.JSX.Element;
|
|
24
24
|
};
|
|
@@ -18,7 +18,7 @@ const TeamsMultiAutocomplete = ({ onChange, ...props })=>{
|
|
|
18
18
|
const selected = Array.isArray(props.values) ? props.values : Array.isArray(props.value) ? props.value : [];
|
|
19
19
|
return selected.map((s)=>{
|
|
20
20
|
if ("string" == typeof s) return s;
|
|
21
|
-
if ("object" == typeof s) return s?.id;
|
|
21
|
+
else if ("object" == typeof s) return s?.id;
|
|
22
22
|
return null;
|
|
23
23
|
}).filter((s)=>!!s);
|
|
24
24
|
}, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/TeamsMultiAutocomplete/index.js","sources":["../../../src/components/TeamsMultiAutocomplete/index.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from \"react\";\nimport { MultiAutoComplete } from \"@webiny/admin-ui\";\nimport { LIST_TEAMS } from \"./graphql.js\";\nimport { useQuery } from \"@apollo/react-hooks\";\n\ntype TeamsMultiAutocompleteProps = Omit<\n React.ComponentProps<typeof MultiAutoComplete>,\n \"options\" | \"onValuesChange\"\n> & {\n onChange?: (values: string[]) => void;\n};\n\nexport const TeamsMultiAutocomplete = ({ onChange, ...props }: TeamsMultiAutocompleteProps) => {\n const { data, loading } = useQuery(LIST_TEAMS);\n const rawOptions = loading || !data?.security?.teams?.data ? [] : data.security.teams.data;\n\n const options = useMemo(\n () => rawOptions.map((team: any) => ({ label: team.name, value: team.id })),\n [rawOptions]\n );\n\n const onValuesChange = useCallback((ids: string[]) => onChange?.(ids), [onChange]);\n /**\n * This is required because the Bind, which currently wraps this component passes \"values\" as \"value\" prop, not \"values\".\n * \"values\" is added to safeguard for future changes. When we move to new forms, remove this part.\n */\n const values = useMemo(() => {\n const selected = Array.isArray(props.values)\n ? props.values\n : Array.isArray(props.value)\n ? props.value\n : [];\n\n return selected\n .map(s => {\n if (typeof s === \"string\") {\n return s;\n } else if (typeof s === \"object\") {\n return s?.id;\n }\n return null;\n })\n .filter((s): s is string => !!s);\n }, [props.values, props.value]);\n\n return (\n <MultiAutoComplete\n uniqueValues\n {...props}\n options={options}\n values={loading ? undefined : (values as string[] | undefined)}\n onValuesChange={onValuesChange}\n />\n );\n};\n"],"names":["TeamsMultiAutocomplete","onChange","props","data","loading","useQuery","LIST_TEAMS","rawOptions","options","useMemo","team","onValuesChange","useCallback","ids","values","selected","Array","s","MultiAutoComplete","undefined"],"mappings":";;;;AAYO,MAAMA,yBAAyB,CAAC,EAAEC,QAAQ,EAAE,GAAGC,OAAoC;IACtF,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAE,GAAGC,SAASC;IACnC,MAAMC,aAAaH,WAAW,CAACD,MAAM,UAAU,OAAO,OAAO,EAAE,GAAGA,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI;IAE1F,MAAMK,UAAUC,QACZ,IAAMF,WAAW,GAAG,CAAC,CAACG,OAAe;gBAAE,OAAOA,KAAK,IAAI;gBAAE,OAAOA,KAAK,EAAE;YAAC,KACxE;QAACH;KAAW;IAGhB,MAAMI,iBAAiBC,YAAY,CAACC,MAAkBZ,WAAWY,MAAM;QAACZ;KAAS;IAKjF,MAAMa,SAASL,QAAQ;QACnB,MAAMM,WAAWC,MAAM,OAAO,CAACd,MAAM,MAAM,IACrCA,MAAM,MAAM,GACZc,MAAM,OAAO,CAACd,MAAM,KAAK,IACvBA,MAAM,KAAK,GACX,EAAE;QAEV,OAAOa,SACF,GAAG,CAACE,CAAAA;YACD,IAAI,AAAa,YAAb,OAAOA,GACP,OAAOA;
|
|
1
|
+
{"version":3,"file":"components/TeamsMultiAutocomplete/index.js","sources":["../../../src/components/TeamsMultiAutocomplete/index.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from \"react\";\nimport { MultiAutoComplete } from \"@webiny/admin-ui\";\nimport { LIST_TEAMS } from \"./graphql.js\";\nimport { useQuery } from \"@apollo/react-hooks\";\n\ntype TeamsMultiAutocompleteProps = Omit<\n React.ComponentProps<typeof MultiAutoComplete>,\n \"options\" | \"onValuesChange\"\n> & {\n onChange?: (values: string[]) => void;\n};\n\nexport const TeamsMultiAutocomplete = ({ onChange, ...props }: TeamsMultiAutocompleteProps) => {\n const { data, loading } = useQuery(LIST_TEAMS);\n const rawOptions = loading || !data?.security?.teams?.data ? [] : data.security.teams.data;\n\n const options = useMemo(\n () => rawOptions.map((team: any) => ({ label: team.name, value: team.id })),\n [rawOptions]\n );\n\n const onValuesChange = useCallback((ids: string[]) => onChange?.(ids), [onChange]);\n /**\n * This is required because the Bind, which currently wraps this component passes \"values\" as \"value\" prop, not \"values\".\n * \"values\" is added to safeguard for future changes. When we move to new forms, remove this part.\n */\n const values = useMemo(() => {\n const selected = Array.isArray(props.values)\n ? props.values\n : Array.isArray(props.value)\n ? props.value\n : [];\n\n return selected\n .map(s => {\n if (typeof s === \"string\") {\n return s;\n } else if (typeof s === \"object\") {\n return s?.id;\n }\n return null;\n })\n .filter((s): s is string => !!s);\n }, [props.values, props.value]);\n\n return (\n <MultiAutoComplete\n uniqueValues\n {...props}\n options={options}\n values={loading ? undefined : (values as string[] | undefined)}\n onValuesChange={onValuesChange}\n />\n );\n};\n"],"names":["TeamsMultiAutocomplete","onChange","props","data","loading","useQuery","LIST_TEAMS","rawOptions","options","useMemo","team","onValuesChange","useCallback","ids","values","selected","Array","s","MultiAutoComplete","undefined"],"mappings":";;;;AAYO,MAAMA,yBAAyB,CAAC,EAAEC,QAAQ,EAAE,GAAGC,OAAoC;IACtF,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAE,GAAGC,SAASC;IACnC,MAAMC,aAAaH,WAAW,CAACD,MAAM,UAAU,OAAO,OAAO,EAAE,GAAGA,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI;IAE1F,MAAMK,UAAUC,QACZ,IAAMF,WAAW,GAAG,CAAC,CAACG,OAAe;gBAAE,OAAOA,KAAK,IAAI;gBAAE,OAAOA,KAAK,EAAE;YAAC,KACxE;QAACH;KAAW;IAGhB,MAAMI,iBAAiBC,YAAY,CAACC,MAAkBZ,WAAWY,MAAM;QAACZ;KAAS;IAKjF,MAAMa,SAASL,QAAQ;QACnB,MAAMM,WAAWC,MAAM,OAAO,CAACd,MAAM,MAAM,IACrCA,MAAM,MAAM,GACZc,MAAM,OAAO,CAACd,MAAM,KAAK,IACvBA,MAAM,KAAK,GACX,EAAE;QAEV,OAAOa,SACF,GAAG,CAACE,CAAAA;YACD,IAAI,AAAa,YAAb,OAAOA,GACP,OAAOA;iBACJ,IAAI,AAAa,YAAb,OAAOA,GACd,OAAOA,GAAG;YAEd,OAAO;QACX,GACC,MAAM,CAAC,CAACA,IAAmB,CAAC,CAACA;IACtC,GAAG;QAACf,MAAM,MAAM;QAAEA,MAAM,KAAK;KAAC;IAE9B,OAAO,WAAP,GACI,oBAACgB,mBAAiBA;QACd;QACC,GAAGhB,KAAK;QACT,SAASM;QACT,QAAQJ,UAAUe,SAAaL;QAC/B,gBAAgBH;;AAG5B"}
|
package/domain/Identity.js
CHANGED
|
@@ -62,7 +62,7 @@ class Identity {
|
|
|
62
62
|
const perms = this.data.permissions || [];
|
|
63
63
|
const exactMatch = perms.find((p)=>p.name === name);
|
|
64
64
|
if (exactMatch) return exactMatch;
|
|
65
|
-
if (exact) return null;
|
|
65
|
+
else if (exact) return null;
|
|
66
66
|
return perms.find((p)=>minimatch(name, p.name)) || null;
|
|
67
67
|
}
|
|
68
68
|
getPermissions(name) {
|
package/domain/Identity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain/Identity.js","sources":["../../src/domain/Identity.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport { minimatch } from \"minimatch\";\nimport type { Tenant } from \"~/features/tenancy/abstractions.js\";\n\nexport interface IPermission {\n name: string;\n [key: string]: any;\n}\n\nexport interface IRole {\n id: string;\n slug: string;\n name: string;\n}\n\nexport interface ITeam {\n id: string;\n slug: string;\n name: string;\n}\n\nexport interface IProfile {\n external: boolean;\n email?: string;\n firstName?: string;\n lastName?: string;\n avatar?: {\n src?: string;\n };\n}\n\nexport interface IdentityData {\n id: string;\n type: string;\n displayName: string;\n roles: IRole[];\n teams: ITeam[];\n permissions: Identity.Permission[];\n profile: Identity.Profile;\n currentTenant: Tenant;\n defaultTenant: Tenant;\n}\n\nconst anonymousData: IdentityData = {\n id: \"anonymous\",\n displayName: \"Anonymous\",\n type: \"admin\",\n roles: [],\n teams: [],\n permissions: [],\n profile: {\n external: false\n },\n currentTenant: {\n id: \"root\",\n name: \"Root\"\n },\n defaultTenant: {\n id: \"root\",\n name: \"Root\"\n }\n};\n\nexport class Identity {\n private constructor(\n private data: Identity.Data,\n private identityType: \"anonymous\" | \"authenticated\"\n ) {\n makeAutoObservable(this);\n }\n\n static createAuthenticated(data: Identity.Data) {\n return new Identity(data, \"authenticated\");\n }\n\n static createAnonymous() {\n return new Identity(anonymousData, \"anonymous\");\n }\n\n get isAuthenticated(): boolean {\n return this.identityType === \"authenticated\";\n }\n\n get id() {\n return this.data.id;\n }\n\n get type() {\n return this.data.type;\n }\n\n get displayName() {\n return this.data.displayName;\n }\n\n get roles() {\n return this.data.roles ?? [];\n }\n\n get teams() {\n return this.data.teams ?? [];\n }\n\n get profile() {\n return this.data.profile;\n }\n\n get currentTenant() {\n return this.data.currentTenant;\n }\n\n get defaultTenant() {\n return this.data.defaultTenant;\n }\n\n getPermission<T extends Identity.Permission = Identity.Permission>(\n name: string,\n exact?: boolean\n ): T | null {\n const perms = (this.data.permissions || []) as T[];\n const exactMatch = perms.find(p => p.name === name);\n if (exactMatch) {\n return exactMatch as T;\n } else if (exact) {\n return null;\n }\n\n // Try matching using patterns\n return perms.find(p => minimatch(name, p.name)) || null;\n }\n\n getPermissions<T extends Identity.Permission = Identity.Permission>(name?: string): Array<T> {\n const permissions = this.data.permissions || [];\n if (!name) {\n return permissions as T[];\n }\n\n return permissions.filter(current => {\n const exactMatch = current.name === name;\n if (exactMatch) {\n return true;\n }\n\n // Try matching using patterns.\n return minimatch(name, current.name);\n }) as T[];\n }\n\n update(updates: Partial<Pick<Identity.Data, \"displayName\" | \"profile\">>) {\n runInAction(() => {\n this.data.displayName = updates.displayName || this.data.displayName;\n this.data.profile = updates.profile || this.data.profile;\n });\n }\n}\n\nexport namespace Identity {\n export type Data = IdentityData;\n export type Permission = IPermission;\n export type Profile = IProfile;\n}\n"],"names":["anonymousData","Identity","data","identityType","makeAutoObservable","name","exact","perms","exactMatch","p","minimatch","permissions","current","updates","runInAction"],"mappings":";;AA2CA,MAAMA,gBAA8B;IAChC,IAAI;IACJ,aAAa;IACb,MAAM;IACN,OAAO,EAAE;IACT,OAAO,EAAE;IACT,aAAa,EAAE;IACf,SAAS;QACL,UAAU;IACd;IACA,eAAe;QACX,IAAI;QACJ,MAAM;IACV;IACA,eAAe;QACX,IAAI;QACJ,MAAM;IACV;AACJ;AAEO,MAAMC;IACT,YACYC,IAAmB,EACnBC,YAA2C,CACrD;aAFUD,IAAI,GAAJA;aACAC,YAAY,GAAZA;QAERC,mBAAmB,IAAI;IAC3B;IAEA,OAAO,oBAAoBF,IAAmB,EAAE;QAC5C,OAAO,IAAID,SAASC,MAAM;IAC9B;IAEA,OAAO,kBAAkB;QACrB,OAAO,IAAID,SAASD,eAAe;IACvC;IAEA,IAAI,kBAA2B;QAC3B,OAAO,AAAsB,oBAAtB,IAAI,CAAC,YAAY;IAC5B;IAEA,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE;IACvB;IAEA,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI;IACzB;IAEA,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW;IAChC;IAEA,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;IAChC;IAEA,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;IAChC;IAEA,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;IAC5B;IAEA,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa;IAClC;IAEA,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa;IAClC;IAEA,cACIK,IAAY,EACZC,KAAe,EACP;QACR,MAAMC,QAAS,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE;QAC1C,MAAMC,aAAaD,MAAM,IAAI,CAACE,CAAAA,IAAKA,EAAE,IAAI,KAAKJ;QAC9C,IAAIG,YACA,OAAOA;
|
|
1
|
+
{"version":3,"file":"domain/Identity.js","sources":["../../src/domain/Identity.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport { minimatch } from \"minimatch\";\nimport type { Tenant } from \"~/features/tenancy/abstractions.js\";\n\nexport interface IPermission {\n name: string;\n [key: string]: any;\n}\n\nexport interface IRole {\n id: string;\n slug: string;\n name: string;\n}\n\nexport interface ITeam {\n id: string;\n slug: string;\n name: string;\n}\n\nexport interface IProfile {\n external: boolean;\n email?: string;\n firstName?: string;\n lastName?: string;\n avatar?: {\n src?: string;\n };\n}\n\nexport interface IdentityData {\n id: string;\n type: string;\n displayName: string;\n roles: IRole[];\n teams: ITeam[];\n permissions: Identity.Permission[];\n profile: Identity.Profile;\n currentTenant: Tenant;\n defaultTenant: Tenant;\n}\n\nconst anonymousData: IdentityData = {\n id: \"anonymous\",\n displayName: \"Anonymous\",\n type: \"admin\",\n roles: [],\n teams: [],\n permissions: [],\n profile: {\n external: false\n },\n currentTenant: {\n id: \"root\",\n name: \"Root\"\n },\n defaultTenant: {\n id: \"root\",\n name: \"Root\"\n }\n};\n\nexport class Identity {\n private constructor(\n private data: Identity.Data,\n private identityType: \"anonymous\" | \"authenticated\"\n ) {\n makeAutoObservable(this);\n }\n\n static createAuthenticated(data: Identity.Data) {\n return new Identity(data, \"authenticated\");\n }\n\n static createAnonymous() {\n return new Identity(anonymousData, \"anonymous\");\n }\n\n get isAuthenticated(): boolean {\n return this.identityType === \"authenticated\";\n }\n\n get id() {\n return this.data.id;\n }\n\n get type() {\n return this.data.type;\n }\n\n get displayName() {\n return this.data.displayName;\n }\n\n get roles() {\n return this.data.roles ?? [];\n }\n\n get teams() {\n return this.data.teams ?? [];\n }\n\n get profile() {\n return this.data.profile;\n }\n\n get currentTenant() {\n return this.data.currentTenant;\n }\n\n get defaultTenant() {\n return this.data.defaultTenant;\n }\n\n getPermission<T extends Identity.Permission = Identity.Permission>(\n name: string,\n exact?: boolean\n ): T | null {\n const perms = (this.data.permissions || []) as T[];\n const exactMatch = perms.find(p => p.name === name);\n if (exactMatch) {\n return exactMatch as T;\n } else if (exact) {\n return null;\n }\n\n // Try matching using patterns\n return perms.find(p => minimatch(name, p.name)) || null;\n }\n\n getPermissions<T extends Identity.Permission = Identity.Permission>(name?: string): Array<T> {\n const permissions = this.data.permissions || [];\n if (!name) {\n return permissions as T[];\n }\n\n return permissions.filter(current => {\n const exactMatch = current.name === name;\n if (exactMatch) {\n return true;\n }\n\n // Try matching using patterns.\n return minimatch(name, current.name);\n }) as T[];\n }\n\n update(updates: Partial<Pick<Identity.Data, \"displayName\" | \"profile\">>) {\n runInAction(() => {\n this.data.displayName = updates.displayName || this.data.displayName;\n this.data.profile = updates.profile || this.data.profile;\n });\n }\n}\n\nexport namespace Identity {\n export type Data = IdentityData;\n export type Permission = IPermission;\n export type Profile = IProfile;\n}\n"],"names":["anonymousData","Identity","data","identityType","makeAutoObservable","name","exact","perms","exactMatch","p","minimatch","permissions","current","updates","runInAction"],"mappings":";;AA2CA,MAAMA,gBAA8B;IAChC,IAAI;IACJ,aAAa;IACb,MAAM;IACN,OAAO,EAAE;IACT,OAAO,EAAE;IACT,aAAa,EAAE;IACf,SAAS;QACL,UAAU;IACd;IACA,eAAe;QACX,IAAI;QACJ,MAAM;IACV;IACA,eAAe;QACX,IAAI;QACJ,MAAM;IACV;AACJ;AAEO,MAAMC;IACT,YACYC,IAAmB,EACnBC,YAA2C,CACrD;aAFUD,IAAI,GAAJA;aACAC,YAAY,GAAZA;QAERC,mBAAmB,IAAI;IAC3B;IAEA,OAAO,oBAAoBF,IAAmB,EAAE;QAC5C,OAAO,IAAID,SAASC,MAAM;IAC9B;IAEA,OAAO,kBAAkB;QACrB,OAAO,IAAID,SAASD,eAAe;IACvC;IAEA,IAAI,kBAA2B;QAC3B,OAAO,AAAsB,oBAAtB,IAAI,CAAC,YAAY;IAC5B;IAEA,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE;IACvB;IAEA,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI;IACzB;IAEA,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW;IAChC;IAEA,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;IAChC;IAEA,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;IAChC;IAEA,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;IAC5B;IAEA,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa;IAClC;IAEA,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa;IAClC;IAEA,cACIK,IAAY,EACZC,KAAe,EACP;QACR,MAAMC,QAAS,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE;QAC1C,MAAMC,aAAaD,MAAM,IAAI,CAACE,CAAAA,IAAKA,EAAE,IAAI,KAAKJ;QAC9C,IAAIG,YACA,OAAOA;aACJ,IAAIF,OACP,OAAO;QAIX,OAAOC,MAAM,IAAI,CAACE,CAAAA,IAAKC,UAAUL,MAAMI,EAAE,IAAI,MAAM;IACvD;IAEA,eAAoEJ,IAAa,EAAY;QACzF,MAAMM,cAAc,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE;QAC/C,IAAI,CAACN,MACD,OAAOM;QAGX,OAAOA,YAAY,MAAM,CAACC,CAAAA;YACtB,MAAMJ,aAAaI,QAAQ,IAAI,KAAKP;YACpC,IAAIG,YACA,OAAO;YAIX,OAAOE,UAAUL,MAAMO,QAAQ,IAAI;QACvC;IACJ;IAEA,OAAOC,OAAgE,EAAE;QACrEC,YAAY;YACR,IAAI,CAAC,IAAI,CAAC,WAAW,GAAGD,QAAQ,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW;YACpE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAGA,QAAQ,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;QAC5D;IACJ;AACJ"}
|
|
@@ -3,6 +3,6 @@ import React from "react";
|
|
|
3
3
|
* No menu entry: the header indicator is the way in, and it downloads the report directly. The
|
|
4
4
|
* panel remains reachable by URL for anyone who wants the namespace filter or the session list.
|
|
5
5
|
*/
|
|
6
|
-
export declare const Debugger: (() => React.JSX.Element) & {
|
|
7
|
-
|
|
6
|
+
export declare const Debugger: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
|
|
7
|
+
readonly type: () => React.JSX.Element;
|
|
8
8
|
};
|
|
@@ -11,6 +11,6 @@ import React from "react";
|
|
|
11
11
|
* held is in memory and lands in the next report whether or not it is relevant to the problem being
|
|
12
12
|
* reproduced.
|
|
13
13
|
*/
|
|
14
|
-
export declare const DebuggerIndicator: (() => React.JSX.Element | null) & {
|
|
15
|
-
|
|
14
|
+
export declare const DebuggerIndicator: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
|
|
15
|
+
readonly type: () => React.JSX.Element | null;
|
|
16
16
|
};
|
|
@@ -22,6 +22,7 @@ export declare class Field implements IField {
|
|
|
22
22
|
private _focusRequested;
|
|
23
23
|
private _qualifiedName;
|
|
24
24
|
private _parentPath;
|
|
25
|
+
private _scopePath;
|
|
25
26
|
private _form;
|
|
26
27
|
private _ancestorRules;
|
|
27
28
|
readonly config: IFieldConfig;
|
|
@@ -72,7 +73,12 @@ export declare class Field implements IField {
|
|
|
72
73
|
};
|
|
73
74
|
private _resolveRequired;
|
|
74
75
|
blur(): void;
|
|
75
|
-
setForm(form: IFormModel, parentPath?: string): void;
|
|
76
|
+
setForm(form: IFormModel, parentPath?: string, scopePath?: () => string): void;
|
|
77
|
+
/**
|
|
78
|
+
* A path `form.field()` resolves to exactly this field. Same as `qualifiedName`,
|
|
79
|
+
* except inside list items, where it carries the item index (`blocks.2.title`).
|
|
80
|
+
*/
|
|
81
|
+
get scopedName(): string;
|
|
76
82
|
private _callbackParams;
|
|
77
83
|
get qualifiedName(): string;
|
|
78
84
|
focus(): void;
|
|
@@ -48,6 +48,7 @@ class Field {
|
|
|
48
48
|
this._focusRequested = false;
|
|
49
49
|
this._qualifiedName = "";
|
|
50
50
|
this._parentPath = "";
|
|
51
|
+
this._scopePath = ()=>this._parentPath;
|
|
51
52
|
this._form = null;
|
|
52
53
|
this._ancestorRules = [];
|
|
53
54
|
this.config = config;
|
|
@@ -81,7 +82,8 @@ class Field {
|
|
|
81
82
|
else if (config.computedUntilDirty) this._computedUntilDirty = config.computedUntilDirty;
|
|
82
83
|
makeAutoObservable(this, {
|
|
83
84
|
config: false,
|
|
84
|
-
vm: computed
|
|
85
|
+
vm: computed,
|
|
86
|
+
_scopePath: false
|
|
85
87
|
});
|
|
86
88
|
}
|
|
87
89
|
get name() {
|
|
@@ -141,11 +143,12 @@ class Field {
|
|
|
141
143
|
visible: true,
|
|
142
144
|
disabled: false
|
|
143
145
|
};
|
|
144
|
-
|
|
146
|
+
const scopePath = this._scopePath();
|
|
147
|
+
if (scopePath) {
|
|
145
148
|
const resolved = all.map((rule)=>{
|
|
146
149
|
if (rule.target.startsWith("$.")) return {
|
|
147
150
|
...rule,
|
|
148
|
-
target: `${
|
|
151
|
+
target: `${scopePath}.${rule.target.slice(2)}`
|
|
149
152
|
};
|
|
150
153
|
return rule;
|
|
151
154
|
});
|
|
@@ -246,15 +249,20 @@ class Field {
|
|
|
246
249
|
blur() {
|
|
247
250
|
for (const cb of this._onBlurCallbacks)cb(this._value, this._callbackParams());
|
|
248
251
|
}
|
|
249
|
-
setForm(form, parentPath) {
|
|
252
|
+
setForm(form, parentPath, scopePath) {
|
|
250
253
|
this._form = form;
|
|
251
254
|
this._parentPath = parentPath || "";
|
|
255
|
+
this._scopePath = scopePath ?? (()=>this._parentPath);
|
|
252
256
|
this._qualifiedName = parentPath ? `${parentPath}.${this.config.name}` : this.config.name;
|
|
253
257
|
}
|
|
258
|
+
get scopedName() {
|
|
259
|
+
const scopePath = this._scopePath();
|
|
260
|
+
return scopePath ? `${scopePath}.${this.config.name}` : this.config.name;
|
|
261
|
+
}
|
|
254
262
|
_callbackParams() {
|
|
255
263
|
if (!this._form) throw new Error("Field not attached to a form.");
|
|
256
264
|
return {
|
|
257
|
-
field: new FieldNavigator(this._form, this.
|
|
265
|
+
field: new FieldNavigator(this._form, this.scopedName),
|
|
258
266
|
form: this._form
|
|
259
267
|
};
|
|
260
268
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/formModel/Field.js","sources":["../../../src/features/formModel/Field.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport type {\n IFieldConfig,\n IFieldVM,\n IFieldValidation,\n IValueOption,\n IFormModel,\n IField,\n IRule,\n FieldTypeMap,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback,\n RequiredWhenCallback,\n HiddenWhenCallback,\n DisabledWhenCallback,\n ComputedFieldCallback,\n IFieldCallbackParams,\n IFieldNavigator,\n IFieldScope\n} from \"./abstractions.js\";\n\n/**\n * Runtime observable field. Holds value, validation state, and exposes a VM for renderers.\n */\nclass FieldScope implements IFieldScope {\n constructor(\n private _form: IFormModel,\n private _path: string\n ) {}\n\n field(name: string): IField {\n const path = this._path ? `${this._path}.${name}` : name;\n return this._form.field(path);\n }\n\n parent(): IFieldScope {\n if (!this._path) {\n throw new Error(\"Cannot navigate above root level.\");\n }\n const segments = this._path.split(\".\");\n segments.pop();\n return new FieldScope(this._form, segments.join(\".\"));\n }\n}\n\nclass FieldNavigator implements IFieldNavigator {\n constructor(\n private _form: IFormModel,\n private _qualifiedName: string\n ) {}\n\n parent(): IFieldScope {\n const segments = this._qualifiedName.split(\".\");\n segments.pop();\n return new FieldScope(this._form, segments.join(\".\"));\n }\n}\n\nexport class Field implements IField {\n private _value: unknown;\n private _validation: IFieldValidation = { isValid: null };\n private _disabled: boolean;\n private _hidden: boolean;\n private _beforeChangeCallbacks: BeforeChangeCallback[] = [];\n private _afterChangeCallbacks: AfterChangeCallback[] = [];\n private _afterSetValueCallbacks: AfterSetValueCallback[] = [];\n private _onBlurCallbacks: OnBlurCallback[] = [];\n private _requiredWhenCallbacks: RequiredWhenCallback[] = [];\n private _hiddenWhenCallbacks: HiddenWhenCallback[] = [];\n private _disabledWhenCallbacks: DisabledWhenCallback[] = [];\n private _computed: ComputedFieldCallback | null = null;\n private _computedUntilDirty: ComputedFieldCallback | null = null;\n /** Set once a computedUntilDirty field receives its first user edit. */\n private _computedOverridden = false;\n private _validating = false;\n private _validationCacheKey: string | undefined = undefined;\n private _validationCache: boolean | undefined = undefined;\n private _isUIChange = false;\n private _focusRequested = false;\n private _qualifiedName: string = \"\";\n private _parentPath: string = \"\";\n private _form: IFormModel | null = null;\n private _ancestorRules: IRule[] = [];\n\n readonly config: IFieldConfig;\n\n constructor(config: IFieldConfig) {\n this.config = config;\n this._qualifiedName = config.name;\n const defaultValue =\n typeof config.defaultValue === \"function\"\n ? (config.defaultValue as () => unknown)()\n : config.defaultValue;\n this._value = defaultValue ?? (config.isList ? [] : null);\n this._disabled = config.disabled;\n this._hidden = config.hidden;\n\n if (config.beforeChangeCallbacks) {\n this._beforeChangeCallbacks = [...config.beforeChangeCallbacks];\n }\n if (config.afterChangeCallbacks) {\n this._afterChangeCallbacks = [...config.afterChangeCallbacks];\n }\n if (config.afterSetValueCallbacks) {\n this._afterSetValueCallbacks = [...config.afterSetValueCallbacks];\n }\n if (config.onBlurCallbacks) {\n this._onBlurCallbacks = [...config.onBlurCallbacks];\n }\n if (config.requiredWhenCallbacks) {\n this._requiredWhenCallbacks = [...config.requiredWhenCallbacks];\n }\n if (config.hiddenWhenCallbacks) {\n this._hiddenWhenCallbacks = [...config.hiddenWhenCallbacks];\n }\n if (config.disabledWhenCallbacks) {\n this._disabledWhenCallbacks = [...config.disabledWhenCallbacks];\n }\n if (config.computed) {\n this._computed = config.computed;\n } else if (config.computedUntilDirty) {\n this._computedUntilDirty = config.computedUntilDirty;\n }\n\n makeAutoObservable(this, {\n config: false,\n vm: computed\n });\n }\n\n get name(): string {\n return this.config.name;\n }\n\n get type(): string {\n return this.config.type;\n }\n\n getValue<T = unknown>(): T {\n if (this._computed && this._form) {\n return this._computed(this._callbackParams()) as T;\n }\n if (this._computedUntilDirty && !this._computedOverridden && this._form) {\n return this._computedUntilDirty(this._callbackParams()) as T;\n }\n return this._value as T;\n }\n\n /**\n * Set value with beforeChange/afterChange pipeline.\n * beforeChange always runs (pure transform).\n * afterChange only fires when value actually changed.\n */\n setValue(raw: unknown): void {\n let transformed = this.config.normalizeValue\n ? this._applyNormalizeValue(raw, this.config.normalizeValue)\n : raw;\n for (const cb of this._beforeChangeCallbacks) {\n transformed = cb(transformed, this._callbackParams());\n }\n\n if (transformed === this._value) {\n return;\n }\n\n const wasComputed = this._computedUntilDirty && !this._computedOverridden && this._form;\n const computedValue = wasComputed\n ? this._computedUntilDirty!(this._callbackParams())\n : undefined;\n\n this._value = transformed;\n if (this._computedUntilDirty && this._isUIChange) {\n if (!wasComputed || transformed !== computedValue) {\n this._computedOverridden = true;\n }\n }\n\n for (const cb of this._afterChangeCallbacks) {\n cb(transformed, this._callbackParams());\n }\n\n if (!this._isUIChange) {\n for (const cb of this._afterSetValueCallbacks) {\n cb(transformed, this._callbackParams());\n }\n }\n }\n\n /**\n * Set value directly without running pipelines. Used by setData() and reset().\n */\n setValueSilent(value: unknown): void {\n const parsed = this.config.normalizeValue\n ? this._applyNormalizeValue(value, this.config.normalizeValue)\n : value;\n this._value = parsed;\n if (this._computedUntilDirty) {\n if (parsed === null || parsed === undefined) {\n this._computedOverridden = false;\n } else if (this._form) {\n const computedValue = this._computedUntilDirty(this._callbackParams());\n this._computedOverridden = parsed !== computedValue;\n } else {\n this._computedOverridden = true;\n }\n }\n }\n\n setDisabled(value: boolean): void {\n this._disabled = value;\n }\n\n /**\n * `form.field()` throws for a path it can't resolve, which happens while a form is\n * still being assembled. Ancestor lookups treat that as \"no parent\" rather than\n * failing the render.\n */\n private _safeGetField(name: string): IField | undefined {\n try {\n return this._form?.field(name);\n } catch {\n return undefined;\n }\n }\n\n private _evaluateRules(): { visible: boolean; disabled: boolean } {\n if (!this._form) {\n return { visible: true, disabled: false };\n }\n const own = this.config.rules ?? [];\n const all = [...this._ancestorRules, ...own];\n if (all.length === 0) {\n return { visible: true, disabled: false };\n }\n if (this._parentPath) {\n const resolved = all.map(rule => {\n if (rule.target.startsWith(\"$.\")) {\n return { ...rule, target: `${this._parentPath}.${rule.target.slice(2)}` };\n }\n return rule;\n });\n return this._form.evaluateRules(resolved);\n }\n return this._form.evaluateRules(all);\n }\n\n get visible(): boolean {\n if (this._hidden) {\n return false;\n }\n if (this._form && this._hiddenWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._hiddenWhenCallbacks) {\n if (cb(scoped)) {\n return false;\n }\n }\n }\n return this._evaluateRules().visible;\n }\n\n get disabled(): boolean {\n if (this._disabled) {\n return true;\n }\n /**\n * Disabling a container disables everything inside it, the way a disabled\n * fieldset does in HTML. Without this, marking an object field disabled would\n * grey out the container while leaving every child editable.\n */\n if (this._parentPath && this._form) {\n const parent = this._safeGetField(this._parentPath);\n if (parent?.disabled) {\n return true;\n }\n }\n if (this._form && this._disabledWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._disabledWhenCallbacks) {\n if (cb(scoped)) {\n return true;\n }\n }\n }\n return this._evaluateRules().disabled;\n }\n\n setVisible(value: boolean): void {\n this._hidden = !value;\n }\n\n setAncestorRules(rules: IRule[]): void {\n runInAction(() => {\n this._ancestorRules = rules;\n });\n }\n\n setValidation(validation: IFieldValidation): void {\n this._validation = validation;\n }\n\n setValidationWithCache(validation: IFieldValidation, value: unknown, result: boolean): void {\n this._validation = validation;\n this._validationCacheKey = this._serializeValue(value);\n this._validationCache = result;\n }\n\n resetValidation(): void {\n this._validation = { isValid: null };\n this._validationCacheKey = undefined;\n this._validationCache = undefined;\n }\n\n addBeforeChange(cb: BeforeChangeCallback): void {\n this._beforeChangeCallbacks.push(cb);\n }\n\n addAfterChange(cb: AfterChangeCallback): void {\n this._afterChangeCallbacks.push(cb);\n }\n\n addAfterSetValue(cb: AfterSetValueCallback): void {\n this._afterSetValueCallbacks.push(cb);\n }\n\n addOnBlur(cb: OnBlurCallback): void {\n this._onBlurCallbacks.push(cb);\n }\n\n addRequiredWhen(fn: (params: IFieldCallbackParams) => boolean, message?: string): void {\n this._requiredWhenCallbacks.push({ fn, message });\n }\n\n setComputed(fn: ComputedFieldCallback): void {\n this._computed = fn;\n this._computedUntilDirty = null;\n this._computedOverridden = false;\n }\n\n setComputedUntilDirty(fn: ComputedFieldCallback): void {\n this._computedUntilDirty = fn;\n this._computed = null;\n this._computedOverridden = false;\n }\n\n /**\n * Effective `required` state — true if the built-in `.required()` flag is\n * set, or if any `requiredWhen()` callback returns `true` for the current\n * form state. The first truthy callback wins; its message is used.\n */\n resolveRequired(): { required: boolean; message?: string } {\n return this._resolveRequired();\n }\n\n private _resolveRequired(): { required: boolean; message?: string } {\n if (this.config.required) {\n return { required: true, message: this.config.requiredMessage };\n }\n if (this._form && this._requiredWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._requiredWhenCallbacks) {\n if (cb.fn(scoped)) {\n return { required: true, message: cb.message };\n }\n }\n }\n return { required: false };\n }\n\n blur(): void {\n for (const cb of this._onBlurCallbacks) {\n cb(this._value, this._callbackParams());\n }\n }\n\n setForm(form: IFormModel, parentPath?: string): void {\n this._form = form;\n this._parentPath = parentPath || \"\";\n this._qualifiedName = parentPath ? `${parentPath}.${this.config.name}` : this.config.name;\n }\n\n private _callbackParams(): IFieldCallbackParams {\n if (!this._form) {\n throw new Error(\"Field not attached to a form.\");\n }\n return {\n field: new FieldNavigator(this._form, this._qualifiedName),\n form: this._form\n };\n }\n\n get qualifiedName(): string {\n return this._qualifiedName;\n }\n\n focus(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n this._form.focusField(this._qualifiedName);\n }\n\n requestFocus(): void {\n this._focusRequested = true;\n }\n\n clearFocusRequest(): void {\n this._focusRequested = false;\n }\n\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T] {\n if (this.config.type !== type) {\n throw new Error(\n `Field \"${this.config.name}\" is type \"${this.config.type}\", not \"${type}\".`\n );\n }\n return this as unknown as FieldTypeMap[T];\n }\n\n remove(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n (this._form as any).removeField(this.config.name);\n }\n\n get vm(): IFieldVM {\n const options = this._resolveOptions();\n const required = this._resolveRequired().required;\n\n return {\n name: this.config.name,\n qualifiedName: this._qualifiedName,\n type: this.config.type,\n label: this.config.label,\n help: this.config.help,\n description: this.config.description,\n note: this.config.note,\n placeholder: this.config.placeholder,\n value: this.getValue(),\n validation: this.visible ? this._validation : { isValid: null },\n validating: this._validating,\n required,\n visible: this.visible,\n disabled: this.disabled,\n renderer: this.config.renderer,\n rendererSettings: this.config.rendererSettings,\n isList: !!this.config.isList,\n options,\n onChange: (value: unknown) => this._setValueFromUI(value),\n onBlur: () => {\n if (this._form?.submitted) {\n void this.validate();\n }\n this.blur();\n },\n addItem: (value?: unknown) => this._addItem(value),\n removeItem: (index: number) => this._removeItem(index),\n focusRequested: this._focusRequested,\n clearFocusRequest: () => this.clearFocusRequest(),\n context: this._resolveContext()\n };\n }\n\n private _setValueFromUI(value: unknown): void {\n this._isUIChange = true;\n try {\n this.setValue(value);\n } finally {\n this._isUIChange = false;\n }\n }\n\n private _applyNormalizeValue(value: unknown, normalizeValue: (v: unknown) => unknown): unknown {\n if (this.config.isList && Array.isArray(value)) {\n return value.map(item => normalizeValue(item));\n }\n return normalizeValue(value);\n }\n\n private _addItem(value?: unknown): void {\n const current = Array.isArray(this._value) ? this._value : [];\n this._setValueFromUI([...current, value ?? null]);\n }\n\n private _removeItem(index: number): void {\n const current = Array.isArray(this._value) ? this._value : [];\n this._setValueFromUI(current.filter((_: unknown, i: number) => i !== index));\n }\n\n private _resolveOptions(): IValueOption[] | undefined {\n if (!this.config.options) {\n return undefined;\n }\n if (typeof this.config.options === \"function\") {\n return this.config.options(this._callbackParams());\n }\n return this.config.options;\n }\n\n private _resolveContext(): Record<string, unknown> {\n if (!this.config.context || !this._form) {\n return {};\n }\n return this.config.context(this._callbackParams());\n }\n\n /**\n * Validate this field. Returns true if valid.\n * Validation order: required check → zod schema.\n * Hidden fields are excluded from validation.\n *\n * Pass `{ force: true }` to bypass the memoization cache (used by\n * `form.validate()` / `form.submit()`). Blur-triggered validation\n * omits the flag so unchanged values return the cached result.\n */\n async validate(options?: { force?: boolean }): Promise<boolean> {\n if (!this.visible) {\n runInAction(() => {\n this._validation = { isValid: null };\n });\n return true;\n }\n\n const effectiveValue = this.getValue();\n\n // Memoization: return cached result when value hasn't changed.\n if (!options?.force && this._validationCache !== undefined) {\n const cacheKey = this._serializeValue(effectiveValue);\n if (this._validationCacheKey === cacheKey) {\n return this._validationCache;\n }\n }\n\n runInAction(() => {\n this._validating = true;\n });\n\n try {\n const requiredState = this._resolveRequired();\n\n // Required check\n if (requiredState.required) {\n const isEmpty =\n effectiveValue === null ||\n effectiveValue === undefined ||\n effectiveValue === \"\" ||\n (this.config.isList &&\n Array.isArray(effectiveValue) &&\n effectiveValue.length === 0);\n\n if (isEmpty) {\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: requiredState.message || \"This field is required.\"\n };\n this._validationCacheKey = cacheKey;\n this._validationCache = false;\n });\n return false;\n }\n }\n\n if (\n !requiredState.required &&\n (effectiveValue === null || effectiveValue === undefined)\n ) {\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = { isValid: null };\n this._validationCacheKey = cacheKey;\n this._validationCache = true;\n });\n return true;\n }\n\n // Zod schema check\n if (this.config.schema) {\n const result = await this.config.schema.safeParseAsync(effectiveValue);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n };\n this._validationCacheKey = cacheKey;\n this._validationCache = false;\n });\n return false;\n }\n }\n\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = { isValid: true };\n this._validationCacheKey = cacheKey;\n this._validationCache = true;\n });\n return true;\n } finally {\n runInAction(() => {\n this._validating = false;\n });\n }\n }\n\n private _serializeValue(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(Math.random());\n }\n }\n\n /** True if this field has any computed callback configured. */\n get isComputed(): boolean {\n return this._computed !== null || this._computedUntilDirty !== null;\n }\n\n /** True if a computedUntilDirty field has been overridden by user edit. */\n get isComputedOverridden(): boolean {\n return this._computedOverridden;\n }\n}\n"],"names":["FieldScope","_form","_path","name","path","Error","segments","FieldNavigator","_qualifiedName","Field","config","undefined","defaultValue","makeAutoObservable","computed","raw","transformed","cb","wasComputed","computedValue","value","parsed","own","all","resolved","rule","scoped","parent","rules","runInAction","validation","result","fn","message","form","parentPath","type","options","required","index","normalizeValue","Array","item","current","_","i","effectiveValue","cacheKey","requiredState","isEmpty","firstIssue","JSON","String","Math"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"features/formModel/Field.js","sources":["../../../src/features/formModel/Field.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport type {\n IFieldConfig,\n IFieldVM,\n IFieldValidation,\n IValueOption,\n IFormModel,\n IField,\n IRule,\n FieldTypeMap,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback,\n RequiredWhenCallback,\n HiddenWhenCallback,\n DisabledWhenCallback,\n ComputedFieldCallback,\n IFieldCallbackParams,\n IFieldNavigator,\n IFieldScope\n} from \"./abstractions.js\";\n\n/**\n * Runtime observable field. Holds value, validation state, and exposes a VM for renderers.\n */\nclass FieldScope implements IFieldScope {\n constructor(\n private _form: IFormModel,\n private _path: string\n ) {}\n\n field(name: string): IField {\n const path = this._path ? `${this._path}.${name}` : name;\n return this._form.field(path);\n }\n\n parent(): IFieldScope {\n if (!this._path) {\n throw new Error(\"Cannot navigate above root level.\");\n }\n const segments = this._path.split(\".\");\n segments.pop();\n return new FieldScope(this._form, segments.join(\".\"));\n }\n}\n\nclass FieldNavigator implements IFieldNavigator {\n constructor(\n private _form: IFormModel,\n private _qualifiedName: string\n ) {}\n\n parent(): IFieldScope {\n const segments = this._qualifiedName.split(\".\");\n segments.pop();\n return new FieldScope(this._form, segments.join(\".\"));\n }\n}\n\nexport class Field implements IField {\n private _value: unknown;\n private _validation: IFieldValidation = { isValid: null };\n private _disabled: boolean;\n private _hidden: boolean;\n private _beforeChangeCallbacks: BeforeChangeCallback[] = [];\n private _afterChangeCallbacks: AfterChangeCallback[] = [];\n private _afterSetValueCallbacks: AfterSetValueCallback[] = [];\n private _onBlurCallbacks: OnBlurCallback[] = [];\n private _requiredWhenCallbacks: RequiredWhenCallback[] = [];\n private _hiddenWhenCallbacks: HiddenWhenCallback[] = [];\n private _disabledWhenCallbacks: DisabledWhenCallback[] = [];\n private _computed: ComputedFieldCallback | null = null;\n private _computedUntilDirty: ComputedFieldCallback | null = null;\n /** Set once a computedUntilDirty field receives its first user edit. */\n private _computedOverridden = false;\n private _validating = false;\n private _validationCacheKey: string | undefined = undefined;\n private _validationCache: boolean | undefined = undefined;\n private _isUIChange = false;\n private _focusRequested = false;\n private _qualifiedName: string = \"\";\n private _parentPath: string = \"\";\n private _scopePath: () => string = () => this._parentPath;\n private _form: IFormModel | null = null;\n private _ancestorRules: IRule[] = [];\n\n readonly config: IFieldConfig;\n\n constructor(config: IFieldConfig) {\n this.config = config;\n this._qualifiedName = config.name;\n const defaultValue =\n typeof config.defaultValue === \"function\"\n ? (config.defaultValue as () => unknown)()\n : config.defaultValue;\n this._value = defaultValue ?? (config.isList ? [] : null);\n this._disabled = config.disabled;\n this._hidden = config.hidden;\n\n if (config.beforeChangeCallbacks) {\n this._beforeChangeCallbacks = [...config.beforeChangeCallbacks];\n }\n if (config.afterChangeCallbacks) {\n this._afterChangeCallbacks = [...config.afterChangeCallbacks];\n }\n if (config.afterSetValueCallbacks) {\n this._afterSetValueCallbacks = [...config.afterSetValueCallbacks];\n }\n if (config.onBlurCallbacks) {\n this._onBlurCallbacks = [...config.onBlurCallbacks];\n }\n if (config.requiredWhenCallbacks) {\n this._requiredWhenCallbacks = [...config.requiredWhenCallbacks];\n }\n if (config.hiddenWhenCallbacks) {\n this._hiddenWhenCallbacks = [...config.hiddenWhenCallbacks];\n }\n if (config.disabledWhenCallbacks) {\n this._disabledWhenCallbacks = [...config.disabledWhenCallbacks];\n }\n if (config.computed) {\n this._computed = config.computed;\n } else if (config.computedUntilDirty) {\n this._computedUntilDirty = config.computedUntilDirty;\n }\n\n makeAutoObservable<this, \"_scopePath\">(this, {\n config: false,\n vm: computed,\n _scopePath: false\n });\n }\n\n get name(): string {\n return this.config.name;\n }\n\n get type(): string {\n return this.config.type;\n }\n\n getValue<T = unknown>(): T {\n if (this._computed && this._form) {\n return this._computed(this._callbackParams()) as T;\n }\n if (this._computedUntilDirty && !this._computedOverridden && this._form) {\n return this._computedUntilDirty(this._callbackParams()) as T;\n }\n return this._value as T;\n }\n\n /**\n * Set value with beforeChange/afterChange pipeline.\n * beforeChange always runs (pure transform).\n * afterChange only fires when value actually changed.\n */\n setValue(raw: unknown): void {\n let transformed = this.config.normalizeValue\n ? this._applyNormalizeValue(raw, this.config.normalizeValue)\n : raw;\n for (const cb of this._beforeChangeCallbacks) {\n transformed = cb(transformed, this._callbackParams());\n }\n\n if (transformed === this._value) {\n return;\n }\n\n const wasComputed = this._computedUntilDirty && !this._computedOverridden && this._form;\n const computedValue = wasComputed\n ? this._computedUntilDirty!(this._callbackParams())\n : undefined;\n\n this._value = transformed;\n if (this._computedUntilDirty && this._isUIChange) {\n if (!wasComputed || transformed !== computedValue) {\n this._computedOverridden = true;\n }\n }\n\n for (const cb of this._afterChangeCallbacks) {\n cb(transformed, this._callbackParams());\n }\n\n if (!this._isUIChange) {\n for (const cb of this._afterSetValueCallbacks) {\n cb(transformed, this._callbackParams());\n }\n }\n }\n\n /**\n * Set value directly without running pipelines. Used by setData() and reset().\n */\n setValueSilent(value: unknown): void {\n const parsed = this.config.normalizeValue\n ? this._applyNormalizeValue(value, this.config.normalizeValue)\n : value;\n this._value = parsed;\n if (this._computedUntilDirty) {\n if (parsed === null || parsed === undefined) {\n this._computedOverridden = false;\n } else if (this._form) {\n const computedValue = this._computedUntilDirty(this._callbackParams());\n this._computedOverridden = parsed !== computedValue;\n } else {\n this._computedOverridden = true;\n }\n }\n }\n\n setDisabled(value: boolean): void {\n this._disabled = value;\n }\n\n /**\n * `form.field()` throws for a path it can't resolve, which happens while a form is\n * still being assembled. Ancestor lookups treat that as \"no parent\" rather than\n * failing the render.\n */\n private _safeGetField(name: string): IField | undefined {\n try {\n return this._form?.field(name);\n } catch {\n return undefined;\n }\n }\n\n private _evaluateRules(): { visible: boolean; disabled: boolean } {\n if (!this._form) {\n return { visible: true, disabled: false };\n }\n const own = this.config.rules ?? [];\n const all = [...this._ancestorRules, ...own];\n if (all.length === 0) {\n return { visible: true, disabled: false };\n }\n const scopePath = this._scopePath();\n if (scopePath) {\n const resolved = all.map(rule => {\n if (rule.target.startsWith(\"$.\")) {\n return { ...rule, target: `${scopePath}.${rule.target.slice(2)}` };\n }\n return rule;\n });\n return this._form.evaluateRules(resolved);\n }\n return this._form.evaluateRules(all);\n }\n\n get visible(): boolean {\n if (this._hidden) {\n return false;\n }\n if (this._form && this._hiddenWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._hiddenWhenCallbacks) {\n if (cb(scoped)) {\n return false;\n }\n }\n }\n return this._evaluateRules().visible;\n }\n\n get disabled(): boolean {\n if (this._disabled) {\n return true;\n }\n /**\n * Disabling a container disables everything inside it, the way a disabled\n * fieldset does in HTML. Without this, marking an object field disabled would\n * grey out the container while leaving every child editable.\n */\n if (this._parentPath && this._form) {\n const parent = this._safeGetField(this._parentPath);\n if (parent?.disabled) {\n return true;\n }\n }\n if (this._form && this._disabledWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._disabledWhenCallbacks) {\n if (cb(scoped)) {\n return true;\n }\n }\n }\n return this._evaluateRules().disabled;\n }\n\n setVisible(value: boolean): void {\n this._hidden = !value;\n }\n\n setAncestorRules(rules: IRule[]): void {\n runInAction(() => {\n this._ancestorRules = rules;\n });\n }\n\n setValidation(validation: IFieldValidation): void {\n this._validation = validation;\n }\n\n setValidationWithCache(validation: IFieldValidation, value: unknown, result: boolean): void {\n this._validation = validation;\n this._validationCacheKey = this._serializeValue(value);\n this._validationCache = result;\n }\n\n resetValidation(): void {\n this._validation = { isValid: null };\n this._validationCacheKey = undefined;\n this._validationCache = undefined;\n }\n\n addBeforeChange(cb: BeforeChangeCallback): void {\n this._beforeChangeCallbacks.push(cb);\n }\n\n addAfterChange(cb: AfterChangeCallback): void {\n this._afterChangeCallbacks.push(cb);\n }\n\n addAfterSetValue(cb: AfterSetValueCallback): void {\n this._afterSetValueCallbacks.push(cb);\n }\n\n addOnBlur(cb: OnBlurCallback): void {\n this._onBlurCallbacks.push(cb);\n }\n\n addRequiredWhen(fn: (params: IFieldCallbackParams) => boolean, message?: string): void {\n this._requiredWhenCallbacks.push({ fn, message });\n }\n\n setComputed(fn: ComputedFieldCallback): void {\n this._computed = fn;\n this._computedUntilDirty = null;\n this._computedOverridden = false;\n }\n\n setComputedUntilDirty(fn: ComputedFieldCallback): void {\n this._computedUntilDirty = fn;\n this._computed = null;\n this._computedOverridden = false;\n }\n\n /**\n * Effective `required` state — true if the built-in `.required()` flag is\n * set, or if any `requiredWhen()` callback returns `true` for the current\n * form state. The first truthy callback wins; its message is used.\n */\n resolveRequired(): { required: boolean; message?: string } {\n return this._resolveRequired();\n }\n\n private _resolveRequired(): { required: boolean; message?: string } {\n if (this.config.required) {\n return { required: true, message: this.config.requiredMessage };\n }\n if (this._form && this._requiredWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._requiredWhenCallbacks) {\n if (cb.fn(scoped)) {\n return { required: true, message: cb.message };\n }\n }\n }\n return { required: false };\n }\n\n blur(): void {\n for (const cb of this._onBlurCallbacks) {\n cb(this._value, this._callbackParams());\n }\n }\n\n setForm(form: IFormModel, parentPath?: string, scopePath?: () => string): void {\n this._form = form;\n this._parentPath = parentPath || \"\";\n this._scopePath = scopePath ?? (() => this._parentPath);\n this._qualifiedName = parentPath ? `${parentPath}.${this.config.name}` : this.config.name;\n }\n\n /**\n * A path `form.field()` resolves to exactly this field. Same as `qualifiedName`,\n * except inside list items, where it carries the item index (`blocks.2.title`).\n */\n get scopedName(): string {\n const scopePath = this._scopePath();\n return scopePath ? `${scopePath}.${this.config.name}` : this.config.name;\n }\n\n private _callbackParams(): IFieldCallbackParams {\n if (!this._form) {\n throw new Error(\"Field not attached to a form.\");\n }\n return {\n field: new FieldNavigator(this._form, this.scopedName),\n form: this._form\n };\n }\n\n get qualifiedName(): string {\n return this._qualifiedName;\n }\n\n focus(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n this._form.focusField(this._qualifiedName);\n }\n\n requestFocus(): void {\n this._focusRequested = true;\n }\n\n clearFocusRequest(): void {\n this._focusRequested = false;\n }\n\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T] {\n if (this.config.type !== type) {\n throw new Error(\n `Field \"${this.config.name}\" is type \"${this.config.type}\", not \"${type}\".`\n );\n }\n return this as unknown as FieldTypeMap[T];\n }\n\n remove(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n (this._form as any).removeField(this.config.name);\n }\n\n get vm(): IFieldVM {\n const options = this._resolveOptions();\n const required = this._resolveRequired().required;\n\n return {\n name: this.config.name,\n qualifiedName: this._qualifiedName,\n type: this.config.type,\n label: this.config.label,\n help: this.config.help,\n description: this.config.description,\n note: this.config.note,\n placeholder: this.config.placeholder,\n value: this.getValue(),\n validation: this.visible ? this._validation : { isValid: null },\n validating: this._validating,\n required,\n visible: this.visible,\n disabled: this.disabled,\n renderer: this.config.renderer,\n rendererSettings: this.config.rendererSettings,\n isList: !!this.config.isList,\n options,\n onChange: (value: unknown) => this._setValueFromUI(value),\n onBlur: () => {\n if (this._form?.submitted) {\n void this.validate();\n }\n this.blur();\n },\n addItem: (value?: unknown) => this._addItem(value),\n removeItem: (index: number) => this._removeItem(index),\n focusRequested: this._focusRequested,\n clearFocusRequest: () => this.clearFocusRequest(),\n context: this._resolveContext()\n };\n }\n\n private _setValueFromUI(value: unknown): void {\n this._isUIChange = true;\n try {\n this.setValue(value);\n } finally {\n this._isUIChange = false;\n }\n }\n\n private _applyNormalizeValue(value: unknown, normalizeValue: (v: unknown) => unknown): unknown {\n if (this.config.isList && Array.isArray(value)) {\n return value.map(item => normalizeValue(item));\n }\n return normalizeValue(value);\n }\n\n private _addItem(value?: unknown): void {\n const current = Array.isArray(this._value) ? this._value : [];\n this._setValueFromUI([...current, value ?? null]);\n }\n\n private _removeItem(index: number): void {\n const current = Array.isArray(this._value) ? this._value : [];\n this._setValueFromUI(current.filter((_: unknown, i: number) => i !== index));\n }\n\n private _resolveOptions(): IValueOption[] | undefined {\n if (!this.config.options) {\n return undefined;\n }\n if (typeof this.config.options === \"function\") {\n return this.config.options(this._callbackParams());\n }\n return this.config.options;\n }\n\n private _resolveContext(): Record<string, unknown> {\n if (!this.config.context || !this._form) {\n return {};\n }\n return this.config.context(this._callbackParams());\n }\n\n /**\n * Validate this field. Returns true if valid.\n * Validation order: required check → zod schema.\n * Hidden fields are excluded from validation.\n *\n * Pass `{ force: true }` to bypass the memoization cache (used by\n * `form.validate()` / `form.submit()`). Blur-triggered validation\n * omits the flag so unchanged values return the cached result.\n */\n async validate(options?: { force?: boolean }): Promise<boolean> {\n if (!this.visible) {\n runInAction(() => {\n this._validation = { isValid: null };\n });\n return true;\n }\n\n const effectiveValue = this.getValue();\n\n // Memoization: return cached result when value hasn't changed.\n if (!options?.force && this._validationCache !== undefined) {\n const cacheKey = this._serializeValue(effectiveValue);\n if (this._validationCacheKey === cacheKey) {\n return this._validationCache;\n }\n }\n\n runInAction(() => {\n this._validating = true;\n });\n\n try {\n const requiredState = this._resolveRequired();\n\n // Required check\n if (requiredState.required) {\n const isEmpty =\n effectiveValue === null ||\n effectiveValue === undefined ||\n effectiveValue === \"\" ||\n (this.config.isList &&\n Array.isArray(effectiveValue) &&\n effectiveValue.length === 0);\n\n if (isEmpty) {\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: requiredState.message || \"This field is required.\"\n };\n this._validationCacheKey = cacheKey;\n this._validationCache = false;\n });\n return false;\n }\n }\n\n if (\n !requiredState.required &&\n (effectiveValue === null || effectiveValue === undefined)\n ) {\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = { isValid: null };\n this._validationCacheKey = cacheKey;\n this._validationCache = true;\n });\n return true;\n }\n\n // Zod schema check\n if (this.config.schema) {\n const result = await this.config.schema.safeParseAsync(effectiveValue);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n };\n this._validationCacheKey = cacheKey;\n this._validationCache = false;\n });\n return false;\n }\n }\n\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = { isValid: true };\n this._validationCacheKey = cacheKey;\n this._validationCache = true;\n });\n return true;\n } finally {\n runInAction(() => {\n this._validating = false;\n });\n }\n }\n\n private _serializeValue(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(Math.random());\n }\n }\n\n /** True if this field has any computed callback configured. */\n get isComputed(): boolean {\n return this._computed !== null || this._computedUntilDirty !== null;\n }\n\n /** True if a computedUntilDirty field has been overridden by user edit. */\n get isComputedOverridden(): boolean {\n return this._computedOverridden;\n }\n}\n"],"names":["FieldScope","_form","_path","name","path","Error","segments","FieldNavigator","_qualifiedName","Field","config","undefined","defaultValue","makeAutoObservable","computed","raw","transformed","cb","wasComputed","computedValue","value","parsed","own","all","scopePath","resolved","rule","scoped","parent","rules","runInAction","validation","result","fn","message","form","parentPath","type","options","required","index","normalizeValue","Array","item","current","_","i","effectiveValue","cacheKey","requiredState","isEmpty","firstIssue","JSON","String","Math"],"mappings":"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"}
|
|
@@ -154,6 +154,18 @@ describe("DateTimeFieldBuilder", ()=>{
|
|
|
154
154
|
expect(config.renderer).toBe("dateTimeInput");
|
|
155
155
|
expect(config.label).toBe("Created");
|
|
156
156
|
});
|
|
157
|
+
it("keeps the list renderer when a subtype is set after list()", ()=>{
|
|
158
|
+
const subtypes = [
|
|
159
|
+
(b)=>b.dateOnly(),
|
|
160
|
+
(b)=>b.timeOnly(),
|
|
161
|
+
(b)=>b.withTimezone(),
|
|
162
|
+
(b)=>b.withoutTimezone()
|
|
163
|
+
];
|
|
164
|
+
for (const subtype of subtypes){
|
|
165
|
+
expect(subtype(new DateTimeFieldBuilder().list()).build("d").renderer).toBe("dateTimeInputs");
|
|
166
|
+
expect(subtype(new DateTimeFieldBuilder()).build("d").renderer).toBe("dateTimeInput");
|
|
167
|
+
}
|
|
168
|
+
});
|
|
157
169
|
});
|
|
158
170
|
describe("FieldBuilderRegistry", ()=>{
|
|
159
171
|
it("should create text builders via registry.text()", ()=>{
|