@webiny/app-headless-cms 6.5.0-beta.9 → 6.5.1-beta.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/admin/components/ContentEntries/Filters/RefFieldRenderer.js +1 -0
- package/admin/components/ContentEntries/Filters/RefFieldRenderer.js.map +1 -1
- package/admin/plugins/editor/defaultBar/Name/Name.d.ts +0 -5
- package/admin/plugins/editor/defaultBar/Name/Name.js +0 -2
- package/admin/plugins/editor/defaultBar/Name/Name.js.map +1 -1
- package/features/contentEntry/feature.js +2 -0
- package/features/contentEntry/feature.js.map +1 -1
- package/features/contentEntry/referenceTitles/ReferenceTitles.d.ts +18 -0
- package/features/contentEntry/referenceTitles/ReferenceTitles.js +58 -0
- package/features/contentEntry/referenceTitles/ReferenceTitles.js.map +1 -0
- package/features/contentEntry/referenceTitles/ReferenceTitles.test.d.ts +1 -0
- package/features/contentEntry/referenceTitles/ReferenceTitles.test.js +173 -0
- package/features/contentEntry/referenceTitles/ReferenceTitles.test.js.map +1 -0
- package/features/contentEntry/referenceTitles/RememberTitlesDecorators.d.ts +22 -0
- package/features/contentEntry/referenceTitles/RememberTitlesDecorators.js +40 -0
- package/features/contentEntry/referenceTitles/RememberTitlesDecorators.js.map +1 -0
- package/features/contentEntry/referenceTitles/abstractions.d.ts +16 -0
- package/features/contentEntry/referenceTitles/abstractions.js +5 -0
- package/features/contentEntry/referenceTitles/abstractions.js.map +1 -0
- package/features/contentEntry/referenceTitles/feature.d.ts +3 -0
- package/features/contentEntry/referenceTitles/feature.js +20 -0
- package/features/contentEntry/referenceTitles/feature.js.map +1 -0
- package/features/formModel/CmsFormModelBuilder.test.js +213 -0
- package/features/formModel/CmsFormModelBuilder.test.js.map +1 -1
- package/features/formModel/CmsRefFieldValueFormatter.d.ts +12 -0
- package/features/formModel/CmsRefFieldValueFormatter.js +29 -0
- package/features/formModel/CmsRefFieldValueFormatter.js.map +1 -0
- package/features/formModel/CmsValidationMapper.d.ts +9 -0
- package/features/formModel/CmsValidationMapper.js +25 -19
- package/features/formModel/CmsValidationMapper.js.map +1 -1
- package/features/formModel/feature.js +2 -0
- package/features/formModel/feature.js.map +1 -1
- package/features/formModel/mappers/DateTimeFieldMapper.js +3 -0
- package/features/formModel/mappers/DateTimeFieldMapper.js.map +1 -1
- package/package.json +22 -22
- package/presentation/contentEntries/form/ContentEntryFormPresenter.js +30 -30
- package/presentation/contentEntries/form/ContentEntryFormPresenter.js.map +1 -1
- package/presentation/contentEntries/form/ContentEntryFormPresenter.test.js +144 -10
- package/presentation/contentEntries/form/ContentEntryFormPresenter.test.js.map +1 -1
- package/presentation/contentEntries/preview/ModelEditorComponentDiscovery.js +1 -1
- package/presentation/contentEntries/preview/ModelEditorComponentDiscovery.js.map +1 -1
- package/presentation/contentEntries/preview/PreviewDecorator.js +9 -3
- package/presentation/contentEntries/preview/PreviewDecorator.js.map +1 -1
- package/presentation/contentEntries/preview/PreviewDomainStatus.d.ts +10 -0
- package/presentation/contentEntries/preview/PreviewDomainStatus.js +19 -0
- package/presentation/contentEntries/preview/PreviewDomainStatus.js.map +1 -0
- package/presentation/contentEntries/preview/PreviewPane.d.ts +6 -1
- package/presentation/contentEntries/preview/PreviewPane.js +80 -44
- package/presentation/contentEntries/preview/PreviewPane.js.map +1 -1
- package/presentation/contentEntries/views/ContentEntryFormView.js +1 -0
- package/presentation/contentEntries/views/ContentEntryFormView.js.map +1 -1
- package/presentation/fieldEditor/groups/AppearanceGroup.js +12 -0
- package/presentation/fieldEditor/groups/AppearanceGroup.js.map +1 -1
- package/presentation/fieldEditor/groups/ValidationsGroup.d.ts +2 -0
- package/presentation/fieldEditor/groups/ValidationsGroup.js +20 -6
- package/presentation/fieldEditor/groups/ValidationsGroup.js.map +1 -1
- package/presentation/fieldEditor/renderers/CmsValidatorsRenderer.js +2 -2
- package/presentation/fieldEditor/renderers/CmsValidatorsRenderer.js.map +1 -1
- package/presentation/fieldRenderers/feature.js +2 -1
- package/presentation/fieldRenderers/feature.js.map +1 -1
- package/presentation/fieldRenderers/ref/CmsRefInputRenderer.js +1 -0
- package/presentation/fieldRenderers/ref/CmsRefInputRenderer.js.map +1 -1
- package/presentation/fieldRenderers/ref/CmsRefInputsRenderer.js +1 -0
- package/presentation/fieldRenderers/ref/CmsRefInputsRenderer.js.map +1 -1
- package/presentation/fieldRenderers/ref/autocomplete/BaseAutocompletePresenter.d.ts +1 -0
- package/presentation/fieldRenderers/ref/autocomplete/BaseAutocompletePresenter.js +8 -2
- package/presentation/fieldRenderers/ref/autocomplete/BaseAutocompletePresenter.js.map +1 -1
- package/presentation/fieldRenderers/ref/autocomplete/RefAutocompletePresenters.test.js +52 -0
- package/presentation/fieldRenderers/ref/autocomplete/RefAutocompletePresenters.test.js.map +1 -1
- package/presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.d.ts +15 -0
- package/presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.js +19 -0
- package/presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.js.map +1 -0
- package/presentation/fieldTypes/renderers/index.d.ts +1 -0
- package/presentation/fieldTypes/renderers/index.js +1 -0
- package/presentation/fieldValidators/abstractions.d.ts +7 -0
- package/presentation/fieldValidators/abstractions.js.map +1 -1
- package/presentation/fieldValidators/validators/DateGteValidator.d.ts +6 -0
- package/presentation/fieldValidators/validators/DateGteValidator.js +17 -25
- package/presentation/fieldValidators/validators/DateGteValidator.js.map +1 -1
- package/presentation/fieldValidators/validators/DateLteValidator.d.ts +6 -0
- package/presentation/fieldValidators/validators/DateLteValidator.js +17 -25
- package/presentation/fieldValidators/validators/DateLteValidator.js.map +1 -1
- package/presentation/fieldValidators/validators/dateLimitSettings.d.ts +20 -0
- package/presentation/fieldValidators/validators/dateLimitSettings.js +124 -0
- package/presentation/fieldValidators/validators/dateLimitSettings.js.map +1 -0
- package/presentation/fieldValidators/validators/dateLimitSettings.test.d.ts +1 -0
- package/presentation/fieldValidators/validators/dateLimitSettings.test.js +111 -0
- package/presentation/fieldValidators/validators/dateLimitSettings.test.js.map +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldEditor/renderers/CmsValidatorsRenderer.js","sources":["../../../../src/presentation/fieldEditor/renderers/CmsValidatorsRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { createObjectFieldRenderer } from \"@webiny/app-admin/features/formModel/createFieldRenderer.js\";\nimport { LayoutNodeRenderer } from \"@webiny/app-admin/features/formModel/FormView.js\";\nimport type { IObjectFieldVM } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { Accordion,
|
|
1
|
+
{"version":3,"file":"presentation/fieldEditor/renderers/CmsValidatorsRenderer.js","sources":["../../../../src/presentation/fieldEditor/renderers/CmsValidatorsRenderer.tsx"],"sourcesContent":["import React from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { createObjectFieldRenderer } from \"@webiny/app-admin/features/formModel/createFieldRenderer.js\";\nimport { LayoutNodeRenderer } from \"@webiny/app-admin/features/formModel/FormView.js\";\nimport type { IObjectFieldVM } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { Accordion, SwitchPrimitive } from \"@webiny/admin-ui\";\n\ndeclare module \"@webiny/app-admin/features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n cmsValidatorItem: { fieldType: \"object\"; settings: undefined };\n }\n}\n\nexport const CmsValidatorItemRenderer = createObjectFieldRenderer(({ field }) => {\n return <ValidatorItem field={field} />;\n});\n\ninterface ValidatorItemProps {\n field: IObjectFieldVM;\n}\n\nconst ValidatorItem = observer(({ field }: ValidatorItemProps) => {\n const value = field.value as Record<string, unknown> | null;\n const isEnabled = Boolean(value && value.enabled);\n\n const toggleEnabled = (checked: boolean) => {\n field.onChange({ ...value, enabled: checked });\n };\n\n return (\n <Accordion.Item\n interactive={false}\n open={isEnabled}\n title={field.label}\n description={field.description}\n actions={\n // The primitive keeps the label inline: in an accordion header the switch is\n // an action next to the title, not a form field with a label above it.\n <SwitchPrimitive label=\"Enabled\" checked={isEnabled} onChange={toggleEnabled} />\n }\n >\n {isEnabled ? (\n <div className={\"flex flex-col gap-md p-md\"}>\n {field.layout.map((node, index) => (\n <LayoutNodeRenderer key={index} node={node} />\n ))}\n </div>\n ) : null}\n </Accordion.Item>\n );\n});\n"],"names":["CmsValidatorItemRenderer","createObjectFieldRenderer","field","ValidatorItem","observer","value","isEnabled","Boolean","toggleEnabled","checked","Accordion","SwitchPrimitive","node","index","LayoutNodeRenderer"],"mappings":";;;;;AAaO,MAAMA,2BAA2BC,0BAA0B,CAAC,EAAEC,KAAK,EAAE,GACjE,WAAP,GAAO,oBAACC,eAAaA;QAAC,OAAOD;;AAOjC,MAAMC,gBAAgBC,SAAS,CAAC,EAAEF,KAAK,EAAsB;IACzD,MAAMG,QAAQH,MAAM,KAAK;IACzB,MAAMI,YAAYC,QAAQF,SAASA,MAAM,OAAO;IAEhD,MAAMG,gBAAgB,CAACC;QACnBP,MAAM,QAAQ,CAAC;YAAE,GAAGG,KAAK;YAAE,SAASI;QAAQ;IAChD;IAEA,OAAO,WAAP,GACI,oBAACC,UAAU,IAAI;QACX,aAAa;QACb,MAAMJ;QACN,OAAOJ,MAAM,KAAK;QAClB,aAAaA,MAAM,WAAW;QAC9B,S,cAGI,oBAACS,iBAAeA;YAAC,OAAM;YAAU,SAASL;YAAW,UAAUE;;OAGlEF,YAAY,WAAZA,GACG,oBAAC;QAAI,WAAW;OACXJ,MAAM,MAAM,CAAC,GAAG,CAAC,CAACU,MAAMC,QAAAA,WAAAA,GACrB,oBAACC,oBAAkBA;YAAC,KAAKD;YAAO,MAAMD;eAG9C;AAGhB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createFeature } from "@webiny/feature/admin";
|
|
2
|
-
import { BooleanSwitchRenderer, CheckboxesRenderer, DateTimeInputRenderer, DateTimeInputsRenderer, DynamicZoneRenderer, HiddenRenderer, LexicalTextInputRenderer, LexicalTextInputsRenderer, LongTextRenderer, LongTextsRenderer, NumberInputRenderer, NumberInputsRenderer, ObjectAccordionMultipleRenderer, ObjectAccordionRenderer, ObjectsAccordionRenderer, PassthroughRenderer, RadioButtonsRenderer, RefDetailedMultipleRenderer, RefDetailedSingleRenderer, RefInputRenderer, RefInputsRenderer, RefSimpleMultipleRenderer, RefSimpleSingleRenderer, SelectBoxRenderer, TagsRenderer, TextInputRenderer, TextInputsRenderer } from "../fieldTypes/renderers/index.js";
|
|
2
|
+
import { BirthdayInputRenderer, BooleanSwitchRenderer, CheckboxesRenderer, DateTimeInputRenderer, DateTimeInputsRenderer, DynamicZoneRenderer, HiddenRenderer, LexicalTextInputRenderer, LexicalTextInputsRenderer, LongTextRenderer, LongTextsRenderer, NumberInputRenderer, NumberInputsRenderer, ObjectAccordionMultipleRenderer, ObjectAccordionRenderer, ObjectsAccordionRenderer, PassthroughRenderer, RadioButtonsRenderer, RefDetailedMultipleRenderer, RefDetailedSingleRenderer, RefInputRenderer, RefInputsRenderer, RefSimpleMultipleRenderer, RefSimpleSingleRenderer, SelectBoxRenderer, TagsRenderer, TextInputRenderer, TextInputsRenderer } from "../fieldTypes/renderers/index.js";
|
|
3
3
|
const CmsFieldRendererFeature = createFeature({
|
|
4
4
|
name: "CmsFieldRenderers",
|
|
5
5
|
register (container) {
|
|
@@ -13,6 +13,7 @@ const CmsFieldRendererFeature = createFeature({
|
|
|
13
13
|
container.register(BooleanSwitchRenderer);
|
|
14
14
|
container.register(DateTimeInputRenderer);
|
|
15
15
|
container.register(DateTimeInputsRenderer);
|
|
16
|
+
container.register(BirthdayInputRenderer);
|
|
16
17
|
container.register(SelectBoxRenderer);
|
|
17
18
|
container.register(RadioButtonsRenderer);
|
|
18
19
|
container.register(CheckboxesRenderer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldRenderers/feature.js","sources":["../../../src/presentation/fieldRenderers/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport {\n TextInputRenderer,\n TextInputsRenderer,\n TagsRenderer,\n LongTextRenderer,\n LongTextsRenderer,\n NumberInputRenderer,\n NumberInputsRenderer,\n BooleanSwitchRenderer,\n DateTimeInputRenderer,\n DateTimeInputsRenderer,\n SelectBoxRenderer,\n RadioButtonsRenderer,\n CheckboxesRenderer,\n HiddenRenderer,\n PassthroughRenderer,\n LexicalTextInputRenderer,\n LexicalTextInputsRenderer,\n ObjectAccordionRenderer,\n ObjectsAccordionRenderer,\n ObjectAccordionMultipleRenderer,\n DynamicZoneRenderer,\n RefInputRenderer,\n RefInputsRenderer,\n RefSimpleSingleRenderer,\n RefSimpleMultipleRenderer,\n RefDetailedSingleRenderer,\n RefDetailedMultipleRenderer\n} from \"../fieldTypes/renderers/index.js\";\n\nexport const CmsFieldRendererFeature = createFeature({\n name: \"CmsFieldRenderers\",\n register(container) {\n container.register(TextInputRenderer);\n container.register(TextInputsRenderer);\n container.register(TagsRenderer);\n container.register(LongTextRenderer);\n container.register(LongTextsRenderer);\n container.register(NumberInputRenderer);\n container.register(NumberInputsRenderer);\n container.register(BooleanSwitchRenderer);\n container.register(DateTimeInputRenderer);\n container.register(DateTimeInputsRenderer);\n container.register(SelectBoxRenderer);\n container.register(RadioButtonsRenderer);\n container.register(CheckboxesRenderer);\n container.register(HiddenRenderer);\n container.register(PassthroughRenderer);\n container.register(LexicalTextInputRenderer);\n container.register(LexicalTextInputsRenderer);\n container.register(ObjectAccordionRenderer);\n container.register(ObjectsAccordionRenderer);\n container.register(ObjectAccordionMultipleRenderer);\n container.register(DynamicZoneRenderer);\n container.register(RefInputRenderer);\n container.register(RefInputsRenderer);\n container.register(RefSimpleSingleRenderer);\n container.register(RefSimpleMultipleRenderer);\n container.register(RefDetailedSingleRenderer);\n container.register(RefDetailedMultipleRenderer);\n }\n});\n"],"names":["CmsFieldRendererFeature","createFeature","container","TextInputRenderer","TextInputsRenderer","TagsRenderer","LongTextRenderer","LongTextsRenderer","NumberInputRenderer","NumberInputsRenderer","BooleanSwitchRenderer","DateTimeInputRenderer","DateTimeInputsRenderer","SelectBoxRenderer","RadioButtonsRenderer","CheckboxesRenderer","HiddenRenderer","PassthroughRenderer","LexicalTextInputRenderer","LexicalTextInputsRenderer","ObjectAccordionRenderer","ObjectsAccordionRenderer","ObjectAccordionMultipleRenderer","DynamicZoneRenderer","RefInputRenderer","RefInputsRenderer","RefSimpleSingleRenderer","RefSimpleMultipleRenderer","RefDetailedSingleRenderer","RefDetailedMultipleRenderer"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/feature.js","sources":["../../../src/presentation/fieldRenderers/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport {\n TextInputRenderer,\n TextInputsRenderer,\n TagsRenderer,\n LongTextRenderer,\n LongTextsRenderer,\n NumberInputRenderer,\n NumberInputsRenderer,\n BooleanSwitchRenderer,\n DateTimeInputRenderer,\n DateTimeInputsRenderer,\n BirthdayInputRenderer,\n SelectBoxRenderer,\n RadioButtonsRenderer,\n CheckboxesRenderer,\n HiddenRenderer,\n PassthroughRenderer,\n LexicalTextInputRenderer,\n LexicalTextInputsRenderer,\n ObjectAccordionRenderer,\n ObjectsAccordionRenderer,\n ObjectAccordionMultipleRenderer,\n DynamicZoneRenderer,\n RefInputRenderer,\n RefInputsRenderer,\n RefSimpleSingleRenderer,\n RefSimpleMultipleRenderer,\n RefDetailedSingleRenderer,\n RefDetailedMultipleRenderer\n} from \"../fieldTypes/renderers/index.js\";\n\nexport const CmsFieldRendererFeature = createFeature({\n name: \"CmsFieldRenderers\",\n register(container) {\n container.register(TextInputRenderer);\n container.register(TextInputsRenderer);\n container.register(TagsRenderer);\n container.register(LongTextRenderer);\n container.register(LongTextsRenderer);\n container.register(NumberInputRenderer);\n container.register(NumberInputsRenderer);\n container.register(BooleanSwitchRenderer);\n container.register(DateTimeInputRenderer);\n container.register(DateTimeInputsRenderer);\n container.register(BirthdayInputRenderer);\n container.register(SelectBoxRenderer);\n container.register(RadioButtonsRenderer);\n container.register(CheckboxesRenderer);\n container.register(HiddenRenderer);\n container.register(PassthroughRenderer);\n container.register(LexicalTextInputRenderer);\n container.register(LexicalTextInputsRenderer);\n container.register(ObjectAccordionRenderer);\n container.register(ObjectsAccordionRenderer);\n container.register(ObjectAccordionMultipleRenderer);\n container.register(DynamicZoneRenderer);\n container.register(RefInputRenderer);\n container.register(RefInputsRenderer);\n container.register(RefSimpleSingleRenderer);\n container.register(RefSimpleMultipleRenderer);\n container.register(RefDetailedSingleRenderer);\n container.register(RefDetailedMultipleRenderer);\n }\n});\n"],"names":["CmsFieldRendererFeature","createFeature","container","TextInputRenderer","TextInputsRenderer","TagsRenderer","LongTextRenderer","LongTextsRenderer","NumberInputRenderer","NumberInputsRenderer","BooleanSwitchRenderer","DateTimeInputRenderer","DateTimeInputsRenderer","BirthdayInputRenderer","SelectBoxRenderer","RadioButtonsRenderer","CheckboxesRenderer","HiddenRenderer","PassthroughRenderer","LexicalTextInputRenderer","LexicalTextInputsRenderer","ObjectAccordionRenderer","ObjectsAccordionRenderer","ObjectAccordionMultipleRenderer","DynamicZoneRenderer","RefInputRenderer","RefInputsRenderer","RefSimpleSingleRenderer","RefSimpleMultipleRenderer","RefDetailedSingleRenderer","RefDetailedMultipleRenderer"],"mappings":";;AAgCO,MAAMA,0BAA0BC,cAAc;IACjD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QACnBL,UAAU,QAAQ,CAACM;QACnBN,UAAU,QAAQ,CAACO;QACnBP,UAAU,QAAQ,CAACQ;QACnBR,UAAU,QAAQ,CAACS;QACnBT,UAAU,QAAQ,CAACU;QACnBV,UAAU,QAAQ,CAACW;QACnBX,UAAU,QAAQ,CAACY;QACnBZ,UAAU,QAAQ,CAACa;QACnBb,UAAU,QAAQ,CAACc;QACnBd,UAAU,QAAQ,CAACe;QACnBf,UAAU,QAAQ,CAACgB;QACnBhB,UAAU,QAAQ,CAACiB;QACnBjB,UAAU,QAAQ,CAACkB;QACnBlB,UAAU,QAAQ,CAACmB;QACnBnB,UAAU,QAAQ,CAACoB;QACnBpB,UAAU,QAAQ,CAACqB;QACnBrB,UAAU,QAAQ,CAACsB;QACnBtB,UAAU,QAAQ,CAACuB;QACnBvB,UAAU,QAAQ,CAACwB;QACnBxB,UAAU,QAAQ,CAACyB;QACnBzB,UAAU,QAAQ,CAAC0B;QACnB1B,UAAU,QAAQ,CAAC2B;QACnB3B,UAAU,QAAQ,CAAC4B;IACvB;AACJ"}
|
|
@@ -39,6 +39,7 @@ const RefInputInner = observer(({ field })=>{
|
|
|
39
39
|
value: vm.value,
|
|
40
40
|
options: vm.options,
|
|
41
41
|
validation: field.validation,
|
|
42
|
+
shouldFilter: false,
|
|
42
43
|
onValueSearch: (query)=>presenter.search(query),
|
|
43
44
|
onValueChange: (selectedEntryId)=>{
|
|
44
45
|
if (!selectedEntryId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldRenderers/ref/CmsRefInputRenderer.js","sources":["../../../../src/presentation/fieldRenderers/ref/CmsRefInputRenderer.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { createFieldRenderer } from \"@webiny/app-admin/features/formModel/createFieldRenderer.js\";\nimport type { IFieldVM } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport { AutoComplete } from \"@webiny/admin-ui\";\nimport type { CmsReferenceValue } from \"~/features/contentEntry/refTypes.js\";\nimport type { RefFieldRendererSettings } from \"./types.js\";\nimport { RefSingleAutocompletePresenterFeature } from \"./autocomplete/single/feature.js\";\n\ndeclare module \"@webiny/app-admin/features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n refInput: { fieldType: \"ref\"; settings: RefFieldRendererSettings };\n }\n}\n\nexport const CmsRefInputRenderer = createFieldRenderer<\"refInput\">(({ field }) => {\n const parentContainer = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = parentContainer.createChildContainer();\n RefSingleAutocompletePresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <RefInputInner field={field} />\n </DiContainerProvider>\n );\n});\n\ninterface InnerFieldProps {\n field: IFieldVM & { rendererSettings: RefFieldRendererSettings };\n}\n\nconst RefInputInner = observer(({ field }: InnerFieldProps) => {\n const { presenter } = useFeature(RefSingleAutocompletePresenterFeature);\n\n const settings = field.rendererSettings;\n const modelIds = (settings.models || []).map(m => m.modelId);\n const value = field.value as CmsReferenceValue | null;\n\n useEffect(() => {\n presenter.init({ modelIds, value });\n }, []);\n\n const vm = presenter.vm;\n\n return (\n <AutoComplete\n label={field.label}\n description={field.description}\n note={field.note}\n hint={field.help}\n disabled={field.disabled}\n loading={vm.loading}\n value={vm.value}\n options={vm.options}\n validation={field.validation}\n onValueSearch={query => presenter.search(query)}\n onValueChange={selectedEntryId => {\n if (!selectedEntryId) {\n presenter.clear();\n field.onChange(null);\n return;\n }\n const ref = presenter.select(selectedEntryId);\n if (ref) {\n field.onChange(ref);\n }\n }}\n onValueReset={() => {\n presenter.clear();\n field.onChange(null);\n }}\n displayResetAction={vm.canReset}\n />\n );\n});\n"],"names":["CmsRefInputRenderer","createFieldRenderer","field","parentContainer","useContainer","scopedContainer","useMemo","child","RefSingleAutocompletePresenterFeature","DiContainerProvider","RefInputInner","observer","presenter","useFeature","settings","modelIds","m","value","useEffect","vm","AutoComplete","query","selectedEntryId","ref"],"mappings":";;;;;;AAgBO,MAAMA,sBAAsBC,oBAAgC,CAAC,EAAEC,KAAK,EAAE;IACzE,MAAMC,kBAAkBC;IAExB,MAAMC,kBAAkBC,QAAQ;QAC5B,MAAMC,QAAQJ,gBAAgB,oBAAoB;QAClDK,sCAAsC,QAAQ,CAACD;QAC/C,OAAOA;IACX,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACE,qBAAmBA;QAAC,WAAWJ;qBAC5B,oBAACK,eAAaA;QAAC,OAAOR;;AAGlC;AAMA,MAAMQ,gBAAgBC,SAAS,CAAC,EAAET,KAAK,EAAmB;IACtD,MAAM,EAAEU,SAAS,EAAE,GAAGC,WAAWL;IAEjC,MAAMM,WAAWZ,MAAM,gBAAgB;IACvC,MAAMa,WAAYD,AAAAA,CAAAA,SAAS,MAAM,IAAI,EAAC,EAAG,GAAG,CAACE,CAAAA,IAAKA,EAAE,OAAO;IAC3D,MAAMC,QAAQf,MAAM,KAAK;IAEzBgB,UAAU;QACNN,UAAU,IAAI,CAAC;YAAEG;YAAUE;QAAM;IACrC,GAAG,EAAE;IAEL,MAAME,KAAKP,UAAU,EAAE;IAEvB,OAAO,WAAP,GACI,oBAACQ,cAAYA;QACT,OAAOlB,MAAM,KAAK;QAClB,aAAaA,MAAM,WAAW;QAC9B,MAAMA,MAAM,IAAI;QAChB,MAAMA,MAAM,IAAI;QAChB,UAAUA,MAAM,QAAQ;QACxB,SAASiB,GAAG,OAAO;QACnB,OAAOA,GAAG,KAAK;QACf,SAASA,GAAG,OAAO;QACnB,YAAYjB,MAAM,UAAU;QAC5B,eAAemB,CAAAA,QAAST,UAAU,MAAM,CAACS;QACzC,eAAeC,CAAAA;YACX,IAAI,CAACA,iBAAiB;gBAClBV,UAAU,KAAK;gBACfV,MAAM,QAAQ,CAAC;gBACf;YACJ;YACA,MAAMqB,MAAMX,UAAU,MAAM,CAACU;YAC7B,IAAIC,KACArB,MAAM,QAAQ,CAACqB;QAEvB;QACA,cAAc;YACVX,UAAU,KAAK;YACfV,MAAM,QAAQ,CAAC;QACnB;QACA,oBAAoBiB,GAAG,QAAQ;;AAG3C"}
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/CmsRefInputRenderer.js","sources":["../../../../src/presentation/fieldRenderers/ref/CmsRefInputRenderer.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { createFieldRenderer } from \"@webiny/app-admin/features/formModel/createFieldRenderer.js\";\nimport type { IFieldVM } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport { AutoComplete } from \"@webiny/admin-ui\";\nimport type { CmsReferenceValue } from \"~/features/contentEntry/refTypes.js\";\nimport type { RefFieldRendererSettings } from \"./types.js\";\nimport { RefSingleAutocompletePresenterFeature } from \"./autocomplete/single/feature.js\";\n\ndeclare module \"@webiny/app-admin/features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n refInput: { fieldType: \"ref\"; settings: RefFieldRendererSettings };\n }\n}\n\nexport const CmsRefInputRenderer = createFieldRenderer<\"refInput\">(({ field }) => {\n const parentContainer = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = parentContainer.createChildContainer();\n RefSingleAutocompletePresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <RefInputInner field={field} />\n </DiContainerProvider>\n );\n});\n\ninterface InnerFieldProps {\n field: IFieldVM & { rendererSettings: RefFieldRendererSettings };\n}\n\nconst RefInputInner = observer(({ field }: InnerFieldProps) => {\n const { presenter } = useFeature(RefSingleAutocompletePresenterFeature);\n\n const settings = field.rendererSettings;\n const modelIds = (settings.models || []).map(m => m.modelId);\n const value = field.value as CmsReferenceValue | null;\n\n useEffect(() => {\n presenter.init({ modelIds, value });\n }, []);\n\n const vm = presenter.vm;\n\n return (\n <AutoComplete\n label={field.label}\n description={field.description}\n note={field.note}\n hint={field.help}\n disabled={field.disabled}\n loading={vm.loading}\n value={vm.value}\n options={vm.options}\n validation={field.validation}\n shouldFilter={false}\n onValueSearch={query => presenter.search(query)}\n onValueChange={selectedEntryId => {\n if (!selectedEntryId) {\n presenter.clear();\n field.onChange(null);\n return;\n }\n const ref = presenter.select(selectedEntryId);\n if (ref) {\n field.onChange(ref);\n }\n }}\n onValueReset={() => {\n presenter.clear();\n field.onChange(null);\n }}\n displayResetAction={vm.canReset}\n />\n );\n});\n"],"names":["CmsRefInputRenderer","createFieldRenderer","field","parentContainer","useContainer","scopedContainer","useMemo","child","RefSingleAutocompletePresenterFeature","DiContainerProvider","RefInputInner","observer","presenter","useFeature","settings","modelIds","m","value","useEffect","vm","AutoComplete","query","selectedEntryId","ref"],"mappings":";;;;;;AAgBO,MAAMA,sBAAsBC,oBAAgC,CAAC,EAAEC,KAAK,EAAE;IACzE,MAAMC,kBAAkBC;IAExB,MAAMC,kBAAkBC,QAAQ;QAC5B,MAAMC,QAAQJ,gBAAgB,oBAAoB;QAClDK,sCAAsC,QAAQ,CAACD;QAC/C,OAAOA;IACX,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACE,qBAAmBA;QAAC,WAAWJ;qBAC5B,oBAACK,eAAaA;QAAC,OAAOR;;AAGlC;AAMA,MAAMQ,gBAAgBC,SAAS,CAAC,EAAET,KAAK,EAAmB;IACtD,MAAM,EAAEU,SAAS,EAAE,GAAGC,WAAWL;IAEjC,MAAMM,WAAWZ,MAAM,gBAAgB;IACvC,MAAMa,WAAYD,AAAAA,CAAAA,SAAS,MAAM,IAAI,EAAC,EAAG,GAAG,CAACE,CAAAA,IAAKA,EAAE,OAAO;IAC3D,MAAMC,QAAQf,MAAM,KAAK;IAEzBgB,UAAU;QACNN,UAAU,IAAI,CAAC;YAAEG;YAAUE;QAAM;IACrC,GAAG,EAAE;IAEL,MAAME,KAAKP,UAAU,EAAE;IAEvB,OAAO,WAAP,GACI,oBAACQ,cAAYA;QACT,OAAOlB,MAAM,KAAK;QAClB,aAAaA,MAAM,WAAW;QAC9B,MAAMA,MAAM,IAAI;QAChB,MAAMA,MAAM,IAAI;QAChB,UAAUA,MAAM,QAAQ;QACxB,SAASiB,GAAG,OAAO;QACnB,OAAOA,GAAG,KAAK;QACf,SAASA,GAAG,OAAO;QACnB,YAAYjB,MAAM,UAAU;QAC5B,cAAc;QACd,eAAemB,CAAAA,QAAST,UAAU,MAAM,CAACS;QACzC,eAAeC,CAAAA;YACX,IAAI,CAACA,iBAAiB;gBAClBV,UAAU,KAAK;gBACfV,MAAM,QAAQ,CAAC;gBACf;YACJ;YACA,MAAMqB,MAAMX,UAAU,MAAM,CAACU;YAC7B,IAAIC,KACArB,MAAM,QAAQ,CAACqB;QAEvB;QACA,cAAc;YACVX,UAAU,KAAK;YACfV,MAAM,QAAQ,CAAC;QACnB;QACA,oBAAoBiB,GAAG,QAAQ;;AAG3C"}
|
|
@@ -40,6 +40,7 @@ const RefInputsInner = observer(({ field })=>{
|
|
|
40
40
|
options: vm.options,
|
|
41
41
|
uniqueValues: true,
|
|
42
42
|
validation: field.validation,
|
|
43
|
+
shouldFilter: false,
|
|
43
44
|
onValueSearch: (query)=>presenter.search(query),
|
|
44
45
|
onValuesChange: (entryIds)=>{
|
|
45
46
|
const refs = presenter.select(entryIds);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldRenderers/ref/CmsRefInputsRenderer.js","sources":["../../../../src/presentation/fieldRenderers/ref/CmsRefInputsRenderer.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { createFieldRenderer } from \"@webiny/app-admin/features/formModel/createFieldRenderer.js\";\nimport type { IFieldVM } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport { MultiAutoComplete } from \"@webiny/admin-ui\";\nimport type { CmsReferenceValue } from \"~/features/contentEntry/refTypes.js\";\nimport type { RefFieldRendererSettings } from \"./types.js\";\nimport { RefMultiAutocompletePresenterFeature } from \"./autocomplete/multi/feature.js\";\n\ndeclare module \"@webiny/app-admin/features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n refInputs: { fieldType: \"ref\"; settings: RefFieldRendererSettings };\n }\n}\n\nexport const CmsRefInputsRenderer = createFieldRenderer<\"refInputs\">(({ field }) => {\n const parentContainer = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = parentContainer.createChildContainer();\n RefMultiAutocompletePresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <RefInputsInner field={field} />\n </DiContainerProvider>\n );\n});\n\ninterface InnerFieldProps {\n field: IFieldVM & { rendererSettings: RefFieldRendererSettings };\n}\n\nconst RefInputsInner = observer(({ field }: InnerFieldProps) => {\n const { presenter } = useFeature(RefMultiAutocompletePresenterFeature);\n\n const settings = field.rendererSettings;\n const modelIds = (settings.models || []).map(m => m.modelId);\n const values: CmsReferenceValue[] = Array.isArray(field.value) ? field.value : [];\n\n useEffect(() => {\n presenter.init({ modelIds, values });\n }, []);\n\n const vm = presenter.vm;\n\n return (\n <MultiAutoComplete\n label={field.label}\n description={field.description}\n note={field.note}\n hint={field.help}\n disabled={field.disabled}\n loading={vm.loading}\n values={vm.values}\n options={vm.options}\n uniqueValues\n validation={field.validation}\n onValueSearch={query => presenter.search(query)}\n onValuesChange={entryIds => {\n const refs = presenter.select(entryIds);\n field.onChange(refs.length > 0 ? refs : null);\n }}\n onValuesReset={() => {\n presenter.clear();\n field.onChange(null);\n }}\n />\n );\n});\n"],"names":["CmsRefInputsRenderer","createFieldRenderer","field","parentContainer","useContainer","scopedContainer","useMemo","child","RefMultiAutocompletePresenterFeature","DiContainerProvider","RefInputsInner","observer","presenter","useFeature","settings","modelIds","m","values","Array","useEffect","vm","MultiAutoComplete","query","entryIds","refs"],"mappings":";;;;;;AAgBO,MAAMA,uBAAuBC,oBAAiC,CAAC,EAAEC,KAAK,EAAE;IAC3E,MAAMC,kBAAkBC;IAExB,MAAMC,kBAAkBC,QAAQ;QAC5B,MAAMC,QAAQJ,gBAAgB,oBAAoB;QAClDK,qCAAqC,QAAQ,CAACD;QAC9C,OAAOA;IACX,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACE,qBAAmBA;QAAC,WAAWJ;qBAC5B,oBAACK,gBAAcA;QAAC,OAAOR;;AAGnC;AAMA,MAAMQ,iBAAiBC,SAAS,CAAC,EAAET,KAAK,EAAmB;IACvD,MAAM,EAAEU,SAAS,EAAE,GAAGC,WAAWL;IAEjC,MAAMM,WAAWZ,MAAM,gBAAgB;IACvC,MAAMa,WAAYD,AAAAA,CAAAA,SAAS,MAAM,IAAI,EAAC,EAAG,GAAG,CAACE,CAAAA,IAAKA,EAAE,OAAO;IAC3D,MAAMC,SAA8BC,MAAM,OAAO,CAAChB,MAAM,KAAK,IAAIA,MAAM,KAAK,GAAG,EAAE;IAEjFiB,UAAU;QACNP,UAAU,IAAI,CAAC;YAAEG;YAAUE;QAAO;IACtC,GAAG,EAAE;IAEL,MAAMG,KAAKR,UAAU,EAAE;IAEvB,OAAO,WAAP,GACI,oBAACS,mBAAiBA;QACd,OAAOnB,MAAM,KAAK;QAClB,aAAaA,MAAM,WAAW;QAC9B,MAAMA,MAAM,IAAI;QAChB,MAAMA,MAAM,IAAI;QAChB,UAAUA,MAAM,QAAQ;QACxB,SAASkB,GAAG,OAAO;QACnB,QAAQA,GAAG,MAAM;QACjB,SAASA,GAAG,OAAO;QACnB;QACA,YAAYlB,MAAM,UAAU;QAC5B,eAAeoB,CAAAA,QAASV,UAAU,MAAM,CAACU;QACzC,gBAAgBC,CAAAA;YACZ,MAAMC,OAAOZ,UAAU,MAAM,CAACW;YAC9BrB,MAAM,QAAQ,CAACsB,KAAK,MAAM,GAAG,IAAIA,OAAO;QAC5C;QACA,eAAe;YACXZ,UAAU,KAAK;YACfV,MAAM,QAAQ,CAAC;QACnB;;AAGZ"}
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/CmsRefInputsRenderer.js","sources":["../../../../src/presentation/fieldRenderers/ref/CmsRefInputsRenderer.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { createFieldRenderer } from \"@webiny/app-admin/features/formModel/createFieldRenderer.js\";\nimport type { IFieldVM } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport { MultiAutoComplete } from \"@webiny/admin-ui\";\nimport type { CmsReferenceValue } from \"~/features/contentEntry/refTypes.js\";\nimport type { RefFieldRendererSettings } from \"./types.js\";\nimport { RefMultiAutocompletePresenterFeature } from \"./autocomplete/multi/feature.js\";\n\ndeclare module \"@webiny/app-admin/features/formModel/abstractions.js\" {\n interface IFieldRendererRegistry {\n refInputs: { fieldType: \"ref\"; settings: RefFieldRendererSettings };\n }\n}\n\nexport const CmsRefInputsRenderer = createFieldRenderer<\"refInputs\">(({ field }) => {\n const parentContainer = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = parentContainer.createChildContainer();\n RefMultiAutocompletePresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <RefInputsInner field={field} />\n </DiContainerProvider>\n );\n});\n\ninterface InnerFieldProps {\n field: IFieldVM & { rendererSettings: RefFieldRendererSettings };\n}\n\nconst RefInputsInner = observer(({ field }: InnerFieldProps) => {\n const { presenter } = useFeature(RefMultiAutocompletePresenterFeature);\n\n const settings = field.rendererSettings;\n const modelIds = (settings.models || []).map(m => m.modelId);\n const values: CmsReferenceValue[] = Array.isArray(field.value) ? field.value : [];\n\n useEffect(() => {\n presenter.init({ modelIds, values });\n }, []);\n\n const vm = presenter.vm;\n\n return (\n <MultiAutoComplete\n label={field.label}\n description={field.description}\n note={field.note}\n hint={field.help}\n disabled={field.disabled}\n loading={vm.loading}\n values={vm.values}\n options={vm.options}\n uniqueValues\n validation={field.validation}\n shouldFilter={false}\n onValueSearch={query => presenter.search(query)}\n onValuesChange={entryIds => {\n const refs = presenter.select(entryIds);\n field.onChange(refs.length > 0 ? refs : null);\n }}\n onValuesReset={() => {\n presenter.clear();\n field.onChange(null);\n }}\n />\n );\n});\n"],"names":["CmsRefInputsRenderer","createFieldRenderer","field","parentContainer","useContainer","scopedContainer","useMemo","child","RefMultiAutocompletePresenterFeature","DiContainerProvider","RefInputsInner","observer","presenter","useFeature","settings","modelIds","m","values","Array","useEffect","vm","MultiAutoComplete","query","entryIds","refs"],"mappings":";;;;;;AAgBO,MAAMA,uBAAuBC,oBAAiC,CAAC,EAAEC,KAAK,EAAE;IAC3E,MAAMC,kBAAkBC;IAExB,MAAMC,kBAAkBC,QAAQ;QAC5B,MAAMC,QAAQJ,gBAAgB,oBAAoB;QAClDK,qCAAqC,QAAQ,CAACD;QAC9C,OAAOA;IACX,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACE,qBAAmBA;QAAC,WAAWJ;qBAC5B,oBAACK,gBAAcA;QAAC,OAAOR;;AAGnC;AAMA,MAAMQ,iBAAiBC,SAAS,CAAC,EAAET,KAAK,EAAmB;IACvD,MAAM,EAAEU,SAAS,EAAE,GAAGC,WAAWL;IAEjC,MAAMM,WAAWZ,MAAM,gBAAgB;IACvC,MAAMa,WAAYD,AAAAA,CAAAA,SAAS,MAAM,IAAI,EAAC,EAAG,GAAG,CAACE,CAAAA,IAAKA,EAAE,OAAO;IAC3D,MAAMC,SAA8BC,MAAM,OAAO,CAAChB,MAAM,KAAK,IAAIA,MAAM,KAAK,GAAG,EAAE;IAEjFiB,UAAU;QACNP,UAAU,IAAI,CAAC;YAAEG;YAAUE;QAAO;IACtC,GAAG,EAAE;IAEL,MAAMG,KAAKR,UAAU,EAAE;IAEvB,OAAO,WAAP,GACI,oBAACS,mBAAiBA;QACd,OAAOnB,MAAM,KAAK;QAClB,aAAaA,MAAM,WAAW;QAC9B,MAAMA,MAAM,IAAI;QAChB,MAAMA,MAAM,IAAI;QAChB,UAAUA,MAAM,QAAQ;QACxB,SAASkB,GAAG,OAAO;QACnB,QAAQA,GAAG,MAAM;QACjB,SAASA,GAAG,OAAO;QACnB;QACA,YAAYlB,MAAM,UAAU;QAC5B,cAAc;QACd,eAAeoB,CAAAA,QAASV,UAAU,MAAM,CAACU;QACzC,gBAAgBC,CAAAA;YACZ,MAAMC,OAAOZ,UAAU,MAAM,CAACW;YAC9BrB,MAAM,QAAQ,CAACsB,KAAK,MAAM,GAAG,IAAIA,OAAO;QAC5C;QACA,eAAe;YACXZ,UAAU,KAAK;YACfV,MAAM,QAAQ,CAAC;QACnB;;AAGZ"}
|
|
@@ -9,6 +9,7 @@ export declare class BaseAutocompletePresenter {
|
|
|
9
9
|
searchOptions: IRefEntryOption[];
|
|
10
10
|
modelIds: string[];
|
|
11
11
|
searchQuery: string;
|
|
12
|
+
private lastSearchId;
|
|
12
13
|
constructor(searchUseCase: SearchContentEntriesUseCase.Interface, getEntriesUseCase: GetContentEntriesUseCase.Interface);
|
|
13
14
|
get activeOptions(): IRefEntryOption[];
|
|
14
15
|
search(query: string): Promise<void>;
|
|
@@ -9,18 +9,22 @@ class BaseAutocompletePresenter {
|
|
|
9
9
|
this.searchOptions = [];
|
|
10
10
|
this.modelIds = [];
|
|
11
11
|
this.searchQuery = "";
|
|
12
|
+
this.lastSearchId = 0;
|
|
12
13
|
makeAutoObservable(this, {
|
|
13
14
|
searchUseCase: false,
|
|
14
|
-
getEntriesUseCase: false
|
|
15
|
+
getEntriesUseCase: false,
|
|
16
|
+
lastSearchId: false
|
|
15
17
|
});
|
|
16
18
|
}
|
|
17
19
|
get activeOptions() {
|
|
18
20
|
return this.searchQuery ? this.searchOptions : this.defaultOptions;
|
|
19
21
|
}
|
|
20
22
|
async search(query) {
|
|
23
|
+
const searchId = ++this.lastSearchId;
|
|
21
24
|
this.searchQuery = query;
|
|
22
25
|
if (!query) {
|
|
23
26
|
this.searchOptions = [];
|
|
27
|
+
this.loading = false;
|
|
24
28
|
return;
|
|
25
29
|
}
|
|
26
30
|
this.loading = true;
|
|
@@ -30,11 +34,12 @@ class BaseAutocompletePresenter {
|
|
|
30
34
|
query,
|
|
31
35
|
limit: 10
|
|
32
36
|
});
|
|
37
|
+
if (searchId !== this.lastSearchId) return;
|
|
33
38
|
runInAction(()=>{
|
|
34
39
|
this.searchOptions = result.data.map(toOption);
|
|
35
40
|
});
|
|
36
41
|
} finally{
|
|
37
|
-
runInAction(()=>{
|
|
42
|
+
if (searchId === this.lastSearchId) runInAction(()=>{
|
|
38
43
|
this.loading = false;
|
|
39
44
|
});
|
|
40
45
|
}
|
|
@@ -77,6 +82,7 @@ class BaseAutocompletePresenter {
|
|
|
77
82
|
}
|
|
78
83
|
}
|
|
79
84
|
clearSearch() {
|
|
85
|
+
this.lastSearchId++;
|
|
80
86
|
this.searchQuery = "";
|
|
81
87
|
this.searchOptions = [];
|
|
82
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldRenderers/ref/autocomplete/BaseAutocompletePresenter.js","sources":["../../../../../src/presentation/fieldRenderers/ref/autocomplete/BaseAutocompletePresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport type { SearchContentEntriesUseCase } from \"~/features/contentEntry/searchContentEntries/abstractions.js\";\nimport type { GetContentEntriesUseCase } from \"~/features/contentEntry/getContentEntries/abstractions.js\";\nimport type { IRefEntryOption } from \"./abstractions.js\";\nimport { toOption } from \"./toOption.js\";\n\nexport class BaseAutocompletePresenter {\n loading = false;\n defaultOptions: IRefEntryOption[] = [];\n searchOptions: IRefEntryOption[] = [];\n modelIds: string[] = [];\n searchQuery = \"\";\n\n constructor(\n private searchUseCase: SearchContentEntriesUseCase.Interface,\n private getEntriesUseCase: GetContentEntriesUseCase.Interface\n ) {\n makeAutoObservable
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/autocomplete/BaseAutocompletePresenter.js","sources":["../../../../../src/presentation/fieldRenderers/ref/autocomplete/BaseAutocompletePresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport type { SearchContentEntriesUseCase } from \"~/features/contentEntry/searchContentEntries/abstractions.js\";\nimport type { GetContentEntriesUseCase } from \"~/features/contentEntry/getContentEntries/abstractions.js\";\nimport type { IRefEntryOption } from \"./abstractions.js\";\nimport { toOption } from \"./toOption.js\";\n\nexport class BaseAutocompletePresenter {\n loading = false;\n defaultOptions: IRefEntryOption[] = [];\n searchOptions: IRefEntryOption[] = [];\n modelIds: string[] = [];\n searchQuery = \"\";\n private lastSearchId = 0;\n\n constructor(\n private searchUseCase: SearchContentEntriesUseCase.Interface,\n private getEntriesUseCase: GetContentEntriesUseCase.Interface\n ) {\n makeAutoObservable<\n BaseAutocompletePresenter,\n \"searchUseCase\" | \"getEntriesUseCase\" | \"lastSearchId\"\n >(this, {\n searchUseCase: false,\n getEntriesUseCase: false,\n lastSearchId: false\n });\n }\n\n get activeOptions(): IRefEntryOption[] {\n return this.searchQuery ? this.searchOptions : this.defaultOptions;\n }\n\n async search(query: string): Promise<void> {\n // Every keystroke starts a search, and responses can arrive out of order.\n // Only the latest search may write its results, or an older, shorter query overwrites them.\n const searchId = ++this.lastSearchId;\n this.searchQuery = query;\n if (!query) {\n this.searchOptions = [];\n this.loading = false;\n return;\n }\n\n this.loading = true;\n try {\n const result = await this.searchUseCase.execute({\n modelIds: this.modelIds,\n query,\n limit: 10\n });\n if (searchId !== this.lastSearchId) {\n return;\n }\n runInAction(() => {\n this.searchOptions = result.data.map(toOption);\n });\n } finally {\n if (searchId === this.lastSearchId) {\n runInAction(() => {\n this.loading = false;\n });\n }\n }\n }\n\n async loadDefaults(): Promise<void> {\n this.loading = true;\n try {\n const result = await this.searchUseCase.execute({\n modelIds: this.modelIds,\n limit: 10\n });\n runInAction(() => {\n this.defaultOptions = result.data.map(toOption);\n });\n } finally {\n runInAction(() => {\n this.loading = false;\n });\n }\n }\n\n async resolveEntries(values: { id: string; modelId: string }[]): Promise<IRefEntryOption[]> {\n this.loading = true;\n try {\n const result = await this.getEntriesUseCase.execute({\n entries: values.map(v => ({ id: v.id, modelId: v.modelId }))\n });\n const options = result.latest.map(toOption);\n runInAction(() => {\n this.loading = false;\n });\n return options;\n } catch (e) {\n runInAction(() => {\n this.loading = false;\n });\n throw e;\n }\n }\n\n clearSearch(): void {\n this.lastSearchId++;\n this.searchQuery = \"\";\n this.searchOptions = [];\n }\n}\n"],"names":["BaseAutocompletePresenter","searchUseCase","getEntriesUseCase","makeAutoObservable","query","searchId","result","runInAction","toOption","values","v","options","e"],"mappings":";;AAMO,MAAMA;IAQT,YACYC,aAAoD,EACpDC,iBAAqD,CAC/D;aAFUD,aAAa,GAAbA;aACAC,iBAAiB,GAAjBA;aATZ,OAAO,GAAG;aACV,cAAc,GAAsB,EAAE;aACtC,aAAa,GAAsB,EAAE;aACrC,QAAQ,GAAa,EAAE;aACvB,WAAW,GAAG;aACN,YAAY,GAAG;QAMnBC,mBAGE,IAAI,EAAE;YACJ,eAAe;YACf,mBAAmB;YACnB,cAAc;QAClB;IACJ;IAEA,IAAI,gBAAmC;QACnC,OAAO,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc;IACtE;IAEA,MAAM,OAAOC,KAAa,EAAiB;QAGvC,MAAMC,WAAW,EAAE,IAAI,CAAC,YAAY;QACpC,IAAI,CAAC,WAAW,GAAGD;QACnB,IAAI,CAACA,OAAO;YACR,IAAI,CAAC,aAAa,GAAG,EAAE;YACvB,IAAI,CAAC,OAAO,GAAG;YACf;QACJ;QAEA,IAAI,CAAC,OAAO,GAAG;QACf,IAAI;YACA,MAAME,SAAS,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;gBAC5C,UAAU,IAAI,CAAC,QAAQ;gBACvBF;gBACA,OAAO;YACX;YACA,IAAIC,aAAa,IAAI,CAAC,YAAY,EAC9B;YAEJE,YAAY;gBACR,IAAI,CAAC,aAAa,GAAGD,OAAO,IAAI,CAAC,GAAG,CAACE;YACzC;QACJ,SAAU;YACN,IAAIH,aAAa,IAAI,CAAC,YAAY,EAC9BE,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;YACnB;QAER;IACJ;IAEA,MAAM,eAA8B;QAChC,IAAI,CAAC,OAAO,GAAG;QACf,IAAI;YACA,MAAMD,SAAS,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;gBAC5C,UAAU,IAAI,CAAC,QAAQ;gBACvB,OAAO;YACX;YACAC,YAAY;gBACR,IAAI,CAAC,cAAc,GAAGD,OAAO,IAAI,CAAC,GAAG,CAACE;YAC1C;QACJ,SAAU;YACND,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;YACnB;QACJ;IACJ;IAEA,MAAM,eAAeE,MAAyC,EAA8B;QACxF,IAAI,CAAC,OAAO,GAAG;QACf,IAAI;YACA,MAAMH,SAAS,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;gBAChD,SAASG,OAAO,GAAG,CAACC,CAAAA,IAAM;wBAAE,IAAIA,EAAE,EAAE;wBAAE,SAASA,EAAE,OAAO;oBAAC;YAC7D;YACA,MAAMC,UAAUL,OAAO,MAAM,CAAC,GAAG,CAACE;YAClCD,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;YACnB;YACA,OAAOI;QACX,EAAE,OAAOC,GAAG;YACRL,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;YACnB;YACA,MAAMK;QACV;IACJ;IAEA,cAAoB;QAChB,IAAI,CAAC,YAAY;QACjB,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,aAAa,GAAG,EAAE;IAC3B;AACJ"}
|
|
@@ -109,6 +109,58 @@ describe("RefMultiAutocompletePresenter", ()=>{
|
|
|
109
109
|
"second"
|
|
110
110
|
]);
|
|
111
111
|
});
|
|
112
|
+
it("ignores a search response that arrives after a newer one", async ()=>{
|
|
113
|
+
const boulder = createEntry("boulder", "Boulder");
|
|
114
|
+
const baker = createEntry("baker", "Baker");
|
|
115
|
+
let resolveSlow = ()=>{};
|
|
116
|
+
const slow = new Promise((resolve)=>{
|
|
117
|
+
resolveSlow = resolve;
|
|
118
|
+
});
|
|
119
|
+
const container = new Container();
|
|
120
|
+
container.registerInstance(SearchContentEntriesUseCase, {
|
|
121
|
+
execute: async ({ query })=>{
|
|
122
|
+
if ("B" === query) {
|
|
123
|
+
await slow;
|
|
124
|
+
return {
|
|
125
|
+
data: [
|
|
126
|
+
baker
|
|
127
|
+
]
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
data: query ? [
|
|
132
|
+
boulder
|
|
133
|
+
] : [
|
|
134
|
+
defaultEntry
|
|
135
|
+
]
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
container.registerInstance(GetContentEntriesUseCase, {
|
|
140
|
+
execute: async ()=>({
|
|
141
|
+
latest: [],
|
|
142
|
+
published: []
|
|
143
|
+
})
|
|
144
|
+
});
|
|
145
|
+
container.register(RefMultiAutocompletePresenter_js_RefMultiAutocompletePresenter);
|
|
146
|
+
const presenter = container.resolve(RefMultiAutocompletePresenter);
|
|
147
|
+
await presenter.init({
|
|
148
|
+
modelIds: [
|
|
149
|
+
"location"
|
|
150
|
+
]
|
|
151
|
+
});
|
|
152
|
+
const first = presenter.search("B");
|
|
153
|
+
await presenter.search("Boulder");
|
|
154
|
+
resolveSlow();
|
|
155
|
+
await first;
|
|
156
|
+
expect(presenter.vm.options).toEqual([
|
|
157
|
+
{
|
|
158
|
+
label: "Boulder",
|
|
159
|
+
value: "boulder"
|
|
160
|
+
}
|
|
161
|
+
]);
|
|
162
|
+
expect(presenter.vm.loading).toBe(false);
|
|
163
|
+
});
|
|
112
164
|
});
|
|
113
165
|
describe("RefSingleAutocompletePresenter", ()=>{
|
|
114
166
|
it("keeps an entry picked from the search results", async ()=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldRenderers/ref/autocomplete/RefAutocompletePresenters.test.js","sources":["../../../../../src/presentation/fieldRenderers/ref/autocomplete/RefAutocompletePresenters.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { SearchContentEntriesUseCase } from \"~/features/contentEntry/searchContentEntries/abstractions.js\";\nimport { GetContentEntriesUseCase } from \"~/features/contentEntry/getContentEntries/abstractions.js\";\nimport type { CmsReferenceEntry } from \"~/features/contentEntry/refTypes.js\";\nimport { RefMultiAutocompletePresenter as MultiAbstraction } from \"./multi/abstractions.js\";\nimport { RefMultiAutocompletePresenter } from \"./multi/RefMultiAutocompletePresenter.js\";\nimport { RefSingleAutocompletePresenter as SingleAbstraction } from \"./single/abstractions.js\";\nimport { RefSingleAutocompletePresenter } from \"./single/RefSingleAutocompletePresenter.js\";\n\nconst createEntry = (entryId: string, title: string): CmsReferenceEntry => ({\n id: `${entryId}#0001`,\n entryId,\n status: \"draft\",\n title,\n description: null,\n image: null,\n createdOn: \"2026-01-01T00:00:00.000Z\",\n savedOn: \"2026-01-01T00:00:00.000Z\",\n createdBy: { id: \"1\", type: \"admin\", displayName: \"Admin\" },\n modifiedBy: null,\n model: { modelId: \"location\", name: \"Location\" },\n published: null,\n wbyAco_location: null\n});\n\n// The default list holds only the first entry, so the second one can only be found by searching.\nconst defaultEntry = createEntry(\"first\", \"First\");\nconst searchedEntry = createEntry(\"second\", \"Second\");\n\nconst createContainer = () => {\n const container = new Container();\n container.registerInstance(SearchContentEntriesUseCase, {\n execute: async ({ query }) => ({ data: query ? [searchedEntry] : [defaultEntry] })\n });\n container.registerInstance(GetContentEntriesUseCase, {\n execute: async () => ({ latest: [], published: [] })\n });\n return container;\n};\n\ndescribe(\"RefMultiAutocompletePresenter\", () => {\n it(\"keeps an entry picked from the search results\", async () => {\n const container = createContainer();\n container.register(RefMultiAutocompletePresenter);\n const presenter = container.resolve(MultiAbstraction);\n\n await presenter.init({ modelIds: [\"location\"] });\n await presenter.search(\"sec\");\n\n const refs = presenter.select([\"second\"]);\n\n expect(refs).toEqual([{ id: \"second#0001\", modelId: \"location\" }]);\n expect(presenter.vm.values).toEqual([\"second\"]);\n expect(presenter.vm.options).toContainEqual({ label: \"Second\", value: \"second\" });\n });\n\n it(\"keeps earlier picks when another entry is picked from the search results\", async () => {\n const container = createContainer();\n container.register(RefMultiAutocompletePresenter);\n const presenter = container.resolve(MultiAbstraction);\n\n await presenter.init({ modelIds: [\"location\"] });\n presenter.select([\"first\"]);\n await presenter.search(\"sec\");\n\n const refs = presenter.select([\"first\", \"second\"]);\n\n expect(refs).toEqual([\n { id: \"first#0001\", modelId: \"location\" },\n { id: \"second#0001\", modelId: \"location\" }\n ]);\n expect(presenter.vm.values).toEqual([\"first\", \"second\"]);\n });\n});\n\ndescribe(\"RefSingleAutocompletePresenter\", () => {\n it(\"keeps an entry picked from the search results\", async () => {\n const container = createContainer();\n container.register(RefSingleAutocompletePresenter);\n const presenter = container.resolve(SingleAbstraction);\n\n await presenter.init({ modelIds: [\"location\"] });\n await presenter.search(\"sec\");\n\n const ref = presenter.select(\"second\");\n\n expect(ref).toEqual({ id: \"second#0001\", modelId: \"location\" });\n expect(presenter.vm.value).toBe(\"second\");\n });\n});\n"],"names":["createEntry","entryId","title","defaultEntry","searchedEntry","createContainer","container","Container","SearchContentEntriesUseCase","query","GetContentEntriesUseCase","describe","it","RefMultiAutocompletePresenter","presenter","MultiAbstraction","refs","expect","RefSingleAutocompletePresenter","SingleAbstraction","ref"],"mappings":";;;;;;;;AAUA,MAAMA,cAAc,CAACC,SAAiBC,QAAsC;QACxE,IAAI,GAAGD,QAAQ,KAAK,CAAC;QACrBA;QACA,QAAQ;QACRC;QACA,aAAa;QACb,OAAO;QACP,WAAW;QACX,SAAS;QACT,WAAW;YAAE,IAAI;YAAK,MAAM;YAAS,aAAa;QAAQ;QAC1D,YAAY;QACZ,OAAO;YAAE,SAAS;YAAY,MAAM;QAAW;QAC/C,WAAW;QACX,iBAAiB;IACrB;AAGA,MAAMC,eAAeH,YAAY,SAAS;AAC1C,MAAMI,gBAAgBJ,YAAY,UAAU;AAE5C,MAAMK,kBAAkB;IACpB,MAAMC,YAAY,IAAIC;IACtBD,UAAU,gBAAgB,CAACE,6BAA6B;QACpD,SAAS,OAAO,EAAEC,KAAK,EAAE,GAAM;gBAAE,MAAMA,QAAQ;oBAACL;iBAAc,GAAG;oBAACD;iBAAa;YAAC;IACpF;IACAG,UAAU,gBAAgB,CAACI,0BAA0B;QACjD,SAAS,UAAa;gBAAE,QAAQ,EAAE;gBAAE,WAAW,EAAE;YAAC;IACtD;IACA,OAAOJ;AACX;AAEAK,SAAS,iCAAiC;IACtCC,GAAG,iDAAiD;QAChD,MAAMN,YAAYD;QAClBC,UAAU,QAAQ,CAACO;QACnB,MAAMC,YAAYR,UAAU,OAAO,CAACS;QAEpC,MAAMD,UAAU,IAAI,CAAC;YAAE,UAAU;gBAAC;aAAW;QAAC;QAC9C,MAAMA,UAAU,MAAM,CAAC;QAEvB,MAAME,OAAOF,UAAU,MAAM,CAAC;YAAC;SAAS;QAExCG,OAAOD,MAAM,OAAO,CAAC;YAAC;gBAAE,IAAI;gBAAe,SAAS;YAAW;SAAE;QACjEC,OAAOH,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAAC;SAAS;QAC9CG,OAAOH,UAAU,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;YAAE,OAAO;YAAU,OAAO;QAAS;IACnF;IAEAF,GAAG,4EAA4E;QAC3E,MAAMN,YAAYD;QAClBC,UAAU,QAAQ,CAACO;QACnB,MAAMC,YAAYR,UAAU,OAAO,CAACS;QAEpC,MAAMD,UAAU,IAAI,CAAC;YAAE,UAAU;gBAAC;aAAW;QAAC;QAC9CA,UAAU,MAAM,CAAC;YAAC;SAAQ;QAC1B,MAAMA,UAAU,MAAM,CAAC;QAEvB,MAAME,OAAOF,UAAU,MAAM,CAAC;YAAC;YAAS;SAAS;QAEjDG,OAAOD,MAAM,OAAO,CAAC;YACjB;gBAAE,IAAI;gBAAc,SAAS;YAAW;YACxC;gBAAE,IAAI;gBAAe,SAAS;YAAW;SAC5C;QACDC,OAAOH,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAAC;YAAS;SAAS;IAC3D;AACJ;AAEAH,SAAS,kCAAkC;IACvCC,GAAG,iDAAiD;QAChD,MAAMN,YAAYD;QAClBC,UAAU,QAAQ,
|
|
1
|
+
{"version":3,"file":"presentation/fieldRenderers/ref/autocomplete/RefAutocompletePresenters.test.js","sources":["../../../../../src/presentation/fieldRenderers/ref/autocomplete/RefAutocompletePresenters.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { SearchContentEntriesUseCase } from \"~/features/contentEntry/searchContentEntries/abstractions.js\";\nimport { GetContentEntriesUseCase } from \"~/features/contentEntry/getContentEntries/abstractions.js\";\nimport type { CmsReferenceEntry } from \"~/features/contentEntry/refTypes.js\";\nimport { RefMultiAutocompletePresenter as MultiAbstraction } from \"./multi/abstractions.js\";\nimport { RefMultiAutocompletePresenter } from \"./multi/RefMultiAutocompletePresenter.js\";\nimport { RefSingleAutocompletePresenter as SingleAbstraction } from \"./single/abstractions.js\";\nimport { RefSingleAutocompletePresenter } from \"./single/RefSingleAutocompletePresenter.js\";\n\nconst createEntry = (entryId: string, title: string): CmsReferenceEntry => ({\n id: `${entryId}#0001`,\n entryId,\n status: \"draft\",\n title,\n description: null,\n image: null,\n createdOn: \"2026-01-01T00:00:00.000Z\",\n savedOn: \"2026-01-01T00:00:00.000Z\",\n createdBy: { id: \"1\", type: \"admin\", displayName: \"Admin\" },\n modifiedBy: null,\n model: { modelId: \"location\", name: \"Location\" },\n published: null,\n wbyAco_location: null\n});\n\n// The default list holds only the first entry, so the second one can only be found by searching.\nconst defaultEntry = createEntry(\"first\", \"First\");\nconst searchedEntry = createEntry(\"second\", \"Second\");\n\nconst createContainer = () => {\n const container = new Container();\n container.registerInstance(SearchContentEntriesUseCase, {\n execute: async ({ query }) => ({ data: query ? [searchedEntry] : [defaultEntry] })\n });\n container.registerInstance(GetContentEntriesUseCase, {\n execute: async () => ({ latest: [], published: [] })\n });\n return container;\n};\n\ndescribe(\"RefMultiAutocompletePresenter\", () => {\n it(\"keeps an entry picked from the search results\", async () => {\n const container = createContainer();\n container.register(RefMultiAutocompletePresenter);\n const presenter = container.resolve(MultiAbstraction);\n\n await presenter.init({ modelIds: [\"location\"] });\n await presenter.search(\"sec\");\n\n const refs = presenter.select([\"second\"]);\n\n expect(refs).toEqual([{ id: \"second#0001\", modelId: \"location\" }]);\n expect(presenter.vm.values).toEqual([\"second\"]);\n expect(presenter.vm.options).toContainEqual({ label: \"Second\", value: \"second\" });\n });\n\n it(\"keeps earlier picks when another entry is picked from the search results\", async () => {\n const container = createContainer();\n container.register(RefMultiAutocompletePresenter);\n const presenter = container.resolve(MultiAbstraction);\n\n await presenter.init({ modelIds: [\"location\"] });\n presenter.select([\"first\"]);\n await presenter.search(\"sec\");\n\n const refs = presenter.select([\"first\", \"second\"]);\n\n expect(refs).toEqual([\n { id: \"first#0001\", modelId: \"location\" },\n { id: \"second#0001\", modelId: \"location\" }\n ]);\n expect(presenter.vm.values).toEqual([\"first\", \"second\"]);\n });\n\n it(\"ignores a search response that arrives after a newer one\", async () => {\n const boulder = createEntry(\"boulder\", \"Boulder\");\n const baker = createEntry(\"baker\", \"Baker\");\n // The \"B\" request is slower than the \"Boulder\" one, and its first page does not hold Boulder.\n let resolveSlow: () => void = () => {};\n const slow = new Promise<void>(resolve => {\n resolveSlow = resolve;\n });\n\n const container = new Container();\n container.registerInstance(SearchContentEntriesUseCase, {\n execute: async ({ query }) => {\n if (query === \"B\") {\n await slow;\n return { data: [baker] };\n }\n return { data: query ? [boulder] : [defaultEntry] };\n }\n });\n container.registerInstance(GetContentEntriesUseCase, {\n execute: async () => ({ latest: [], published: [] })\n });\n container.register(RefMultiAutocompletePresenter);\n const presenter = container.resolve(MultiAbstraction);\n\n await presenter.init({ modelIds: [\"location\"] });\n const first = presenter.search(\"B\");\n await presenter.search(\"Boulder\");\n resolveSlow();\n await first;\n\n expect(presenter.vm.options).toEqual([{ label: \"Boulder\", value: \"boulder\" }]);\n expect(presenter.vm.loading).toBe(false);\n });\n});\n\ndescribe(\"RefSingleAutocompletePresenter\", () => {\n it(\"keeps an entry picked from the search results\", async () => {\n const container = createContainer();\n container.register(RefSingleAutocompletePresenter);\n const presenter = container.resolve(SingleAbstraction);\n\n await presenter.init({ modelIds: [\"location\"] });\n await presenter.search(\"sec\");\n\n const ref = presenter.select(\"second\");\n\n expect(ref).toEqual({ id: \"second#0001\", modelId: \"location\" });\n expect(presenter.vm.value).toBe(\"second\");\n });\n});\n"],"names":["createEntry","entryId","title","defaultEntry","searchedEntry","createContainer","container","Container","SearchContentEntriesUseCase","query","GetContentEntriesUseCase","describe","it","RefMultiAutocompletePresenter","presenter","MultiAbstraction","refs","expect","boulder","baker","resolveSlow","slow","Promise","resolve","first","RefSingleAutocompletePresenter","SingleAbstraction","ref"],"mappings":";;;;;;;;AAUA,MAAMA,cAAc,CAACC,SAAiBC,QAAsC;QACxE,IAAI,GAAGD,QAAQ,KAAK,CAAC;QACrBA;QACA,QAAQ;QACRC;QACA,aAAa;QACb,OAAO;QACP,WAAW;QACX,SAAS;QACT,WAAW;YAAE,IAAI;YAAK,MAAM;YAAS,aAAa;QAAQ;QAC1D,YAAY;QACZ,OAAO;YAAE,SAAS;YAAY,MAAM;QAAW;QAC/C,WAAW;QACX,iBAAiB;IACrB;AAGA,MAAMC,eAAeH,YAAY,SAAS;AAC1C,MAAMI,gBAAgBJ,YAAY,UAAU;AAE5C,MAAMK,kBAAkB;IACpB,MAAMC,YAAY,IAAIC;IACtBD,UAAU,gBAAgB,CAACE,6BAA6B;QACpD,SAAS,OAAO,EAAEC,KAAK,EAAE,GAAM;gBAAE,MAAMA,QAAQ;oBAACL;iBAAc,GAAG;oBAACD;iBAAa;YAAC;IACpF;IACAG,UAAU,gBAAgB,CAACI,0BAA0B;QACjD,SAAS,UAAa;gBAAE,QAAQ,EAAE;gBAAE,WAAW,EAAE;YAAC;IACtD;IACA,OAAOJ;AACX;AAEAK,SAAS,iCAAiC;IACtCC,GAAG,iDAAiD;QAChD,MAAMN,YAAYD;QAClBC,UAAU,QAAQ,CAACO;QACnB,MAAMC,YAAYR,UAAU,OAAO,CAACS;QAEpC,MAAMD,UAAU,IAAI,CAAC;YAAE,UAAU;gBAAC;aAAW;QAAC;QAC9C,MAAMA,UAAU,MAAM,CAAC;QAEvB,MAAME,OAAOF,UAAU,MAAM,CAAC;YAAC;SAAS;QAExCG,OAAOD,MAAM,OAAO,CAAC;YAAC;gBAAE,IAAI;gBAAe,SAAS;YAAW;SAAE;QACjEC,OAAOH,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAAC;SAAS;QAC9CG,OAAOH,UAAU,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;YAAE,OAAO;YAAU,OAAO;QAAS;IACnF;IAEAF,GAAG,4EAA4E;QAC3E,MAAMN,YAAYD;QAClBC,UAAU,QAAQ,CAACO;QACnB,MAAMC,YAAYR,UAAU,OAAO,CAACS;QAEpC,MAAMD,UAAU,IAAI,CAAC;YAAE,UAAU;gBAAC;aAAW;QAAC;QAC9CA,UAAU,MAAM,CAAC;YAAC;SAAQ;QAC1B,MAAMA,UAAU,MAAM,CAAC;QAEvB,MAAME,OAAOF,UAAU,MAAM,CAAC;YAAC;YAAS;SAAS;QAEjDG,OAAOD,MAAM,OAAO,CAAC;YACjB;gBAAE,IAAI;gBAAc,SAAS;YAAW;YACxC;gBAAE,IAAI;gBAAe,SAAS;YAAW;SAC5C;QACDC,OAAOH,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAAC;YAAS;SAAS;IAC3D;IAEAF,GAAG,4DAA4D;QAC3D,MAAMM,UAAUlB,YAAY,WAAW;QACvC,MAAMmB,QAAQnB,YAAY,SAAS;QAEnC,IAAIoB,cAA0B,KAAO;QACrC,MAAMC,OAAO,IAAIC,QAAcC,CAAAA;YAC3BH,cAAcG;QAClB;QAEA,MAAMjB,YAAY,IAAIC;QACtBD,UAAU,gBAAgB,CAACE,6BAA6B;YACpD,SAAS,OAAO,EAAEC,KAAK,EAAE;gBACrB,IAAIA,AAAU,QAAVA,OAAe;oBACf,MAAMY;oBACN,OAAO;wBAAE,MAAM;4BAACF;yBAAM;oBAAC;gBAC3B;gBACA,OAAO;oBAAE,MAAMV,QAAQ;wBAACS;qBAAQ,GAAG;wBAACf;qBAAa;gBAAC;YACtD;QACJ;QACAG,UAAU,gBAAgB,CAACI,0BAA0B;YACjD,SAAS,UAAa;oBAAE,QAAQ,EAAE;oBAAE,WAAW,EAAE;gBAAC;QACtD;QACAJ,UAAU,QAAQ,CAACO;QACnB,MAAMC,YAAYR,UAAU,OAAO,CAACS;QAEpC,MAAMD,UAAU,IAAI,CAAC;YAAE,UAAU;gBAAC;aAAW;QAAC;QAC9C,MAAMU,QAAQV,UAAU,MAAM,CAAC;QAC/B,MAAMA,UAAU,MAAM,CAAC;QACvBM;QACA,MAAMI;QAENP,OAAOH,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;YAAC;gBAAE,OAAO;gBAAW,OAAO;YAAU;SAAE;QAC7EG,OAAOH,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;IACtC;AACJ;AAEAH,SAAS,kCAAkC;IACvCC,GAAG,iDAAiD;QAChD,MAAMN,YAAYD;QAClBC,UAAU,QAAQ,CAACmB;QACnB,MAAMX,YAAYR,UAAU,OAAO,CAACoB;QAEpC,MAAMZ,UAAU,IAAI,CAAC;YAAE,UAAU;gBAAC;aAAW;QAAC;QAC9C,MAAMA,UAAU,MAAM,CAAC;QAEvB,MAAMa,MAAMb,UAAU,MAAM,CAAC;QAE7BG,OAAOU,KAAK,OAAO,CAAC;YAAE,IAAI;YAAe,SAAS;QAAW;QAC7DV,OAAOH,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACpC;AACJ"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CmsFieldRenderer } from "../../../../presentation/fieldRenderers/abstractions.js";
|
|
2
|
+
import type { CmsModelField } from "../../../../types.js";
|
|
3
|
+
declare class BirthdayInputRendererImpl implements CmsFieldRenderer.Interface {
|
|
4
|
+
rendererName: string;
|
|
5
|
+
formRenderer: string;
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
canUse({ field }: {
|
|
9
|
+
field: CmsModelField;
|
|
10
|
+
}): boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const BirthdayInputRenderer: typeof BirthdayInputRendererImpl & {
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<import("~/presentation/fieldRenderers/abstractions.js").ICmsFieldRenderer>;
|
|
14
|
+
};
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CmsFieldRenderer } from "../../../fieldRenderers/abstractions.js";
|
|
2
|
+
class BirthdayInputRendererImpl {
|
|
3
|
+
canUse({ field }) {
|
|
4
|
+
return "datetime" === field.type && field.settings?.type === "date" && !field.list && !field.predefinedValues?.enabled;
|
|
5
|
+
}
|
|
6
|
+
constructor(){
|
|
7
|
+
this.rendererName = "birthday-input";
|
|
8
|
+
this.formRenderer = "birthdayInput";
|
|
9
|
+
this.name = "Birthday Picker";
|
|
10
|
+
this.description = "Picks a day, then a month, then a year. Suits dates far in the past, like a date of birth.";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const BirthdayInputRenderer = CmsFieldRenderer.createImplementation({
|
|
14
|
+
implementation: BirthdayInputRendererImpl,
|
|
15
|
+
dependencies: []
|
|
16
|
+
});
|
|
17
|
+
export { BirthdayInputRenderer };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=BirthdayInputRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.js","sources":["../../../../../src/presentation/fieldTypes/renderers/dateTime/BirthdayInputRenderer.ts"],"sourcesContent":["import { CmsFieldRenderer } from \"~/presentation/fieldRenderers/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\n\nclass BirthdayInputRendererImpl implements CmsFieldRenderer.Interface {\n rendererName = \"birthday-input\";\n formRenderer = \"birthdayInput\";\n name = \"Birthday Picker\";\n description =\n \"Picks a day, then a month, then a year. Suits dates far in the past, like a date of birth.\";\n\n canUse({ field }: { field: CmsModelField }) {\n return (\n field.type === \"datetime\" &&\n field.settings?.type === \"date\" &&\n !field.list &&\n !field.predefinedValues?.enabled\n );\n }\n}\n\nexport const BirthdayInputRenderer = CmsFieldRenderer.createImplementation({\n implementation: BirthdayInputRendererImpl,\n dependencies: []\n});\n"],"names":["BirthdayInputRendererImpl","field","BirthdayInputRenderer","CmsFieldRenderer"],"mappings":";AAGA,MAAMA;IAOF,OAAO,EAAEC,KAAK,EAA4B,EAAE;QACxC,OACIA,AAAe,eAAfA,MAAM,IAAI,IACVA,MAAM,QAAQ,EAAE,SAAS,UACzB,CAACA,MAAM,IAAI,IACX,CAACA,MAAM,gBAAgB,EAAE;IAEjC;;aAbA,YAAY,GAAG;aACf,YAAY,GAAG;aACf,IAAI,GAAG;aACP,WAAW,GACP;;AAUR;AAEO,MAAMC,wBAAwBC,iBAAiB,oBAAoB,CAAC;IACvE,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -8,6 +8,7 @@ export { NumberInputsRenderer } from "./number/NumberInputsRenderer.js";
|
|
|
8
8
|
export { BooleanSwitchRenderer } from "./boolean/BooleanSwitchRenderer.js";
|
|
9
9
|
export { DateTimeInputRenderer } from "./dateTime/DateTimeInputRenderer.js";
|
|
10
10
|
export { DateTimeInputsRenderer } from "./dateTime/DateTimeInputsRenderer.js";
|
|
11
|
+
export { BirthdayInputRenderer } from "./dateTime/BirthdayInputRenderer.js";
|
|
11
12
|
export { SelectBoxRenderer } from "./common/SelectBoxRenderer.js";
|
|
12
13
|
export { RadioButtonsRenderer } from "./common/RadioButtonsRenderer.js";
|
|
13
14
|
export { CheckboxesRenderer } from "./common/CheckboxesRenderer.js";
|
|
@@ -8,6 +8,7 @@ export { NumberInputsRenderer } from "./number/NumberInputsRenderer.js";
|
|
|
8
8
|
export { BooleanSwitchRenderer } from "./boolean/BooleanSwitchRenderer.js";
|
|
9
9
|
export { DateTimeInputRenderer } from "./dateTime/DateTimeInputRenderer.js";
|
|
10
10
|
export { DateTimeInputsRenderer } from "./dateTime/DateTimeInputsRenderer.js";
|
|
11
|
+
export { BirthdayInputRenderer } from "./dateTime/BirthdayInputRenderer.js";
|
|
11
12
|
export { SelectBoxRenderer } from "./common/SelectBoxRenderer.js";
|
|
12
13
|
export { RadioButtonsRenderer } from "./common/RadioButtonsRenderer.js";
|
|
13
14
|
export { CheckboxesRenderer } from "./common/CheckboxesRenderer.js";
|
|
@@ -25,6 +25,13 @@ export interface ICmsFieldValidator {
|
|
|
25
25
|
validator: CmsModelFieldValidator;
|
|
26
26
|
}): Record<string, string>;
|
|
27
27
|
buildSettingsForm?(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext): void;
|
|
28
|
+
/**
|
|
29
|
+
* Turns the stored settings into the settings form's values, when the form shows them
|
|
30
|
+
* differently. Without it, the stored settings are the form's values.
|
|
31
|
+
*/
|
|
32
|
+
mapSettingsToForm?(settings: Record<string, unknown>, context: ICmsFieldValidatorContext): Record<string, unknown>;
|
|
33
|
+
/** Turns the settings form's values back into the settings to store. */
|
|
34
|
+
mapSettingsFromForm?(settings: Record<string, unknown>, context: ICmsFieldValidatorContext): Record<string, unknown>;
|
|
28
35
|
mapToFieldBuilder(builder: IFieldBuilder, validator: CmsModelFieldValidator, field: CmsModelField): void;
|
|
29
36
|
}
|
|
30
37
|
export declare const CmsFieldValidator: import("@webiny/di").Abstraction<ICmsFieldValidator>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldValidators/abstractions.js","sources":["../../../src/presentation/fieldValidators/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport { FormModel, FormModelFactory } from \"@webiny/app-admin\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport type { CmsModelFieldValidator } from \"~/types.js\";\n\nexport interface ICmsFieldValidatorVariable {\n name: string;\n description: string;\n}\n\nexport interface ICmsFieldValidatorFormBuilder {\n message: FormModelFactory.FieldBuilder;\n fields(\n fn: (\n fields: FormModelFactory.FieldBuilderRegistry\n ) => Record<string, FormModelFactory.FieldBuilder>\n ): void;\n layout(fn: (layout: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]): void;\n}\n\nexport interface ICmsFieldValidatorContext {\n field: CmsModelField;\n}\n\nexport interface ICmsFieldValidator {\n readonly name: string;\n readonly label: string;\n readonly description: string;\n readonly defaultMessage: string;\n readonly defaultSettings?: Record<string, unknown>;\n readonly variables?: ICmsFieldValidatorVariable[];\n\n getVariableValues?(context: { validator: CmsModelFieldValidator }): Record<string, string>;\n\n buildSettingsForm?(\n form: ICmsFieldValidatorFormBuilder,\n context: ICmsFieldValidatorContext\n ): void;\n\n mapToFieldBuilder(\n builder: IFieldBuilder,\n validator: CmsModelFieldValidator,\n field: CmsModelField\n ): void;\n}\n\nexport const CmsFieldValidator = createAbstraction<ICmsFieldValidator>(\"CmsFieldValidator\");\n\nexport namespace CmsFieldValidator {\n export type Interface = ICmsFieldValidator;\n export type FormBuilder = ICmsFieldValidatorFormBuilder;\n export type Context = ICmsFieldValidatorContext;\n export type Variable = ICmsFieldValidatorVariable;\n}\n"],"names":["CmsFieldValidator","createAbstraction"],"mappings":";
|
|
1
|
+
{"version":3,"file":"presentation/fieldValidators/abstractions.js","sources":["../../../src/presentation/fieldValidators/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport { FormModel, FormModelFactory } from \"@webiny/app-admin\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport type { CmsModelFieldValidator } from \"~/types.js\";\n\nexport interface ICmsFieldValidatorVariable {\n name: string;\n description: string;\n}\n\nexport interface ICmsFieldValidatorFormBuilder {\n message: FormModelFactory.FieldBuilder;\n fields(\n fn: (\n fields: FormModelFactory.FieldBuilderRegistry\n ) => Record<string, FormModelFactory.FieldBuilder>\n ): void;\n layout(fn: (layout: FormModelFactory.LayoutBuilder) => FormModel.LayoutNodeBuilder[]): void;\n}\n\nexport interface ICmsFieldValidatorContext {\n field: CmsModelField;\n}\n\nexport interface ICmsFieldValidator {\n readonly name: string;\n readonly label: string;\n readonly description: string;\n readonly defaultMessage: string;\n readonly defaultSettings?: Record<string, unknown>;\n readonly variables?: ICmsFieldValidatorVariable[];\n\n getVariableValues?(context: { validator: CmsModelFieldValidator }): Record<string, string>;\n\n buildSettingsForm?(\n form: ICmsFieldValidatorFormBuilder,\n context: ICmsFieldValidatorContext\n ): void;\n\n /**\n * Turns the stored settings into the settings form's values, when the form shows them\n * differently. Without it, the stored settings are the form's values.\n */\n mapSettingsToForm?(\n settings: Record<string, unknown>,\n context: ICmsFieldValidatorContext\n ): Record<string, unknown>;\n\n /** Turns the settings form's values back into the settings to store. */\n mapSettingsFromForm?(\n settings: Record<string, unknown>,\n context: ICmsFieldValidatorContext\n ): Record<string, unknown>;\n\n mapToFieldBuilder(\n builder: IFieldBuilder,\n validator: CmsModelFieldValidator,\n field: CmsModelField\n ): void;\n}\n\nexport const CmsFieldValidator = createAbstraction<ICmsFieldValidator>(\"CmsFieldValidator\");\n\nexport namespace CmsFieldValidator {\n export type Interface = ICmsFieldValidator;\n export type FormBuilder = ICmsFieldValidatorFormBuilder;\n export type Context = ICmsFieldValidatorContext;\n export type Variable = ICmsFieldValidatorVariable;\n}\n"],"names":["CmsFieldValidator","createAbstraction"],"mappings":";AA8DO,MAAMA,oBAAoBC,kBAAsC"}
|
|
@@ -8,7 +8,13 @@ declare class DateGteValidatorImpl implements CmsFieldValidator.Interface {
|
|
|
8
8
|
label: string;
|
|
9
9
|
description: string;
|
|
10
10
|
defaultMessage: string;
|
|
11
|
+
variables: {
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
}[];
|
|
11
15
|
buildSettingsForm(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext): void;
|
|
16
|
+
mapSettingsToForm(settings: Record<string, unknown>, context: ICmsFieldValidatorContext): Record<string, unknown>;
|
|
17
|
+
mapSettingsFromForm(settings: Record<string, unknown>): Record<string, unknown>;
|
|
12
18
|
mapToFieldBuilder(builder: IFieldBuilder, validator: CmsModelFieldValidator, _field: CmsModelField): void;
|
|
13
19
|
}
|
|
14
20
|
export declare const DateGteValidator: typeof DateGteValidatorImpl & {
|
|
@@ -1,31 +1,17 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { CmsFieldValidator } from "../abstractions.js";
|
|
3
|
+
import { buildDateLimitSettingsForm, dateLimitSettingsFromForm, dateLimitSettingsToForm } from "./dateLimitSettings.js";
|
|
3
4
|
class DateGteValidatorImpl {
|
|
4
5
|
buildSettingsForm(form, context) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const valueField = fields.datetime().label("Value").description("This is the earliest date/time that will be allowed.");
|
|
8
|
-
switch(type){
|
|
9
|
-
case "time":
|
|
10
|
-
valueField.timeOnly();
|
|
11
|
-
break;
|
|
12
|
-
case "dateTimeWithTimezone":
|
|
13
|
-
valueField.withTimezone();
|
|
14
|
-
break;
|
|
15
|
-
case "dateTimeWithoutTimezone":
|
|
16
|
-
valueField.withoutTimezone();
|
|
17
|
-
break;
|
|
18
|
-
default:
|
|
19
|
-
valueField.dateOnly();
|
|
20
|
-
break;
|
|
21
|
-
}
|
|
22
|
-
return {
|
|
23
|
-
value: valueField
|
|
24
|
-
};
|
|
6
|
+
buildDateLimitSettingsForm(form, context, {
|
|
7
|
+
valueDescription: "This is the earliest date/time that will be allowed."
|
|
25
8
|
});
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
9
|
+
}
|
|
10
|
+
mapSettingsToForm(settings, context) {
|
|
11
|
+
return dateLimitSettingsToForm(settings, context);
|
|
12
|
+
}
|
|
13
|
+
mapSettingsFromForm(settings) {
|
|
14
|
+
return dateLimitSettingsFromForm(settings);
|
|
29
15
|
}
|
|
30
16
|
mapToFieldBuilder(builder, validator, _field) {
|
|
31
17
|
const minDate = validator.settings?.value;
|
|
@@ -36,8 +22,14 @@ class DateGteValidatorImpl {
|
|
|
36
22
|
constructor(){
|
|
37
23
|
this.name = "dateGte";
|
|
38
24
|
this.label = "Later or equal";
|
|
39
|
-
this.description = "Entered date/time must be equal or later compared to the provided date.";
|
|
40
|
-
this.defaultMessage = "
|
|
25
|
+
this.description = "Entered date/time must be equal or later compared to the provided date. A date relative to today is worked out from the current date every time the value is checked.";
|
|
26
|
+
this.defaultMessage = "Must be on or after {date}.";
|
|
27
|
+
this.variables = [
|
|
28
|
+
{
|
|
29
|
+
name: "date",
|
|
30
|
+
description: "The earliest allowed date, worked out when the value is checked."
|
|
31
|
+
}
|
|
32
|
+
];
|
|
41
33
|
}
|
|
42
34
|
}
|
|
43
35
|
const DateGteValidator = CmsFieldValidator.createImplementation({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldValidators/validators/DateGteValidator.js","sources":["../../../../src/presentation/fieldValidators/validators/DateGteValidator.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelFieldValidator } from \"~/types.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { CmsFieldValidator } from \"../abstractions.js\";\nimport type { ICmsFieldValidatorFormBuilder, ICmsFieldValidatorContext } from \"../abstractions.js\";\n\nclass DateGteValidatorImpl implements CmsFieldValidator.Interface {\n name = \"dateGte\";\n label = \"Later or equal\";\n description
|
|
1
|
+
{"version":3,"file":"presentation/fieldValidators/validators/DateGteValidator.js","sources":["../../../../src/presentation/fieldValidators/validators/DateGteValidator.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelFieldValidator } from \"~/types.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { CmsFieldValidator } from \"../abstractions.js\";\nimport type { ICmsFieldValidatorFormBuilder, ICmsFieldValidatorContext } from \"../abstractions.js\";\nimport {\n buildDateLimitSettingsForm,\n dateLimitSettingsFromForm,\n dateLimitSettingsToForm\n} from \"./dateLimitSettings.js\";\n\nclass DateGteValidatorImpl implements CmsFieldValidator.Interface {\n name = \"dateGte\";\n label = \"Later or equal\";\n description =\n \"Entered date/time must be equal or later compared to the provided date. A date relative to today is worked out from the current date every time the value is checked.\";\n defaultMessage = \"Must be on or after {date}.\";\n variables = [\n {\n name: \"date\",\n description: \"The earliest allowed date, worked out when the value is checked.\"\n }\n ];\n\n buildSettingsForm(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext) {\n buildDateLimitSettingsForm(form, context, {\n valueDescription: \"This is the earliest date/time that will be allowed.\"\n });\n }\n\n mapSettingsToForm(settings: Record<string, unknown>, context: ICmsFieldValidatorContext) {\n return dateLimitSettingsToForm(settings, context);\n }\n\n mapSettingsFromForm(settings: Record<string, unknown>) {\n return dateLimitSettingsFromForm(settings);\n }\n\n mapToFieldBuilder(\n builder: IFieldBuilder,\n validator: CmsModelFieldValidator,\n _field: CmsModelField\n ) {\n const minDate = validator.settings?.value;\n if (minDate != null) {\n builder.schema(\n z.string().refine(val => val >= minDate, {\n message: validator.message || `Must be on or after ${minDate}`\n })\n );\n }\n }\n}\n\nexport const DateGteValidator = CmsFieldValidator.createImplementation({\n implementation: DateGteValidatorImpl,\n dependencies: []\n});\n"],"names":["DateGteValidatorImpl","form","context","buildDateLimitSettingsForm","settings","dateLimitSettingsToForm","dateLimitSettingsFromForm","builder","validator","_field","minDate","z","val","DateGteValidator","CmsFieldValidator"],"mappings":";;;AAYA,MAAMA;IAaF,kBAAkBC,IAAmC,EAAEC,OAAkC,EAAE;QACvFC,2BAA2BF,MAAMC,SAAS;YACtC,kBAAkB;QACtB;IACJ;IAEA,kBAAkBE,QAAiC,EAAEF,OAAkC,EAAE;QACrF,OAAOG,wBAAwBD,UAAUF;IAC7C;IAEA,oBAAoBE,QAAiC,EAAE;QACnD,OAAOE,0BAA0BF;IACrC;IAEA,kBACIG,OAAsB,EACtBC,SAAiC,EACjCC,MAAqB,EACvB;QACE,MAAMC,UAAUF,UAAU,QAAQ,EAAE;QACpC,IAAIE,AAAW,QAAXA,SACAH,QAAQ,MAAM,CACVI,EAAE,MAAM,GAAG,MAAM,CAACC,CAAAA,MAAOA,OAAOF,SAAS;YACrC,SAASF,UAAU,OAAO,IAAI,CAAC,oBAAoB,EAAEE,SAAS;QAClE;IAGZ;;aAvCA,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GACP;aACJ,cAAc,GAAG;aACjB,SAAS,GAAG;YACR;gBACI,MAAM;gBACN,aAAa;YACjB;SACH;;AA8BL;AAEO,MAAMG,mBAAmBC,kBAAkB,oBAAoB,CAAC;IACnE,gBAAgBd;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -8,7 +8,13 @@ declare class DateLteValidatorImpl implements CmsFieldValidator.Interface {
|
|
|
8
8
|
label: string;
|
|
9
9
|
description: string;
|
|
10
10
|
defaultMessage: string;
|
|
11
|
+
variables: {
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
}[];
|
|
11
15
|
buildSettingsForm(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext): void;
|
|
16
|
+
mapSettingsToForm(settings: Record<string, unknown>, context: ICmsFieldValidatorContext): Record<string, unknown>;
|
|
17
|
+
mapSettingsFromForm(settings: Record<string, unknown>): Record<string, unknown>;
|
|
12
18
|
mapToFieldBuilder(builder: IFieldBuilder, validator: CmsModelFieldValidator, _field: CmsModelField): void;
|
|
13
19
|
}
|
|
14
20
|
export declare const DateLteValidator: typeof DateLteValidatorImpl & {
|
|
@@ -1,31 +1,17 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { CmsFieldValidator } from "../abstractions.js";
|
|
3
|
+
import { buildDateLimitSettingsForm, dateLimitSettingsFromForm, dateLimitSettingsToForm } from "./dateLimitSettings.js";
|
|
3
4
|
class DateLteValidatorImpl {
|
|
4
5
|
buildSettingsForm(form, context) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const valueField = fields.datetime().label("Value").description("This is the latest date/time that will be allowed.");
|
|
8
|
-
switch(type){
|
|
9
|
-
case "time":
|
|
10
|
-
valueField.timeOnly();
|
|
11
|
-
break;
|
|
12
|
-
case "dateTimeWithTimezone":
|
|
13
|
-
valueField.withTimezone();
|
|
14
|
-
break;
|
|
15
|
-
case "dateTimeWithoutTimezone":
|
|
16
|
-
valueField.withoutTimezone();
|
|
17
|
-
break;
|
|
18
|
-
default:
|
|
19
|
-
valueField.dateOnly();
|
|
20
|
-
break;
|
|
21
|
-
}
|
|
22
|
-
return {
|
|
23
|
-
value: valueField
|
|
24
|
-
};
|
|
6
|
+
buildDateLimitSettingsForm(form, context, {
|
|
7
|
+
valueDescription: "This is the latest date/time that will be allowed."
|
|
25
8
|
});
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
9
|
+
}
|
|
10
|
+
mapSettingsToForm(settings, context) {
|
|
11
|
+
return dateLimitSettingsToForm(settings, context);
|
|
12
|
+
}
|
|
13
|
+
mapSettingsFromForm(settings) {
|
|
14
|
+
return dateLimitSettingsFromForm(settings);
|
|
29
15
|
}
|
|
30
16
|
mapToFieldBuilder(builder, validator, _field) {
|
|
31
17
|
const maxDate = validator.settings?.value;
|
|
@@ -36,8 +22,14 @@ class DateLteValidatorImpl {
|
|
|
36
22
|
constructor(){
|
|
37
23
|
this.name = "dateLte";
|
|
38
24
|
this.label = "Earlier or equal";
|
|
39
|
-
this.description = "Entered date/time must be equal or earlier compared to the provided date.";
|
|
40
|
-
this.defaultMessage = "
|
|
25
|
+
this.description = "Entered date/time must be equal or earlier compared to the provided date. A date relative to today is worked out from the current date every time the value is checked.";
|
|
26
|
+
this.defaultMessage = "Must be on or before {date}.";
|
|
27
|
+
this.variables = [
|
|
28
|
+
{
|
|
29
|
+
name: "date",
|
|
30
|
+
description: "The latest allowed date, worked out when the value is checked."
|
|
31
|
+
}
|
|
32
|
+
];
|
|
41
33
|
}
|
|
42
34
|
}
|
|
43
35
|
const DateLteValidator = CmsFieldValidator.createImplementation({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/fieldValidators/validators/DateLteValidator.js","sources":["../../../../src/presentation/fieldValidators/validators/DateLteValidator.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelFieldValidator } from \"~/types.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { CmsFieldValidator } from \"../abstractions.js\";\nimport type { ICmsFieldValidatorFormBuilder, ICmsFieldValidatorContext } from \"../abstractions.js\";\n\nclass DateLteValidatorImpl implements CmsFieldValidator.Interface {\n name = \"dateLte\";\n label = \"Earlier or equal\";\n description
|
|
1
|
+
{"version":3,"file":"presentation/fieldValidators/validators/DateLteValidator.js","sources":["../../../../src/presentation/fieldValidators/validators/DateLteValidator.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { IFieldBuilder } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { CmsModelFieldValidator } from \"~/types.js\";\nimport type { CmsModelField } from \"~/types.js\";\nimport { CmsFieldValidator } from \"../abstractions.js\";\nimport type { ICmsFieldValidatorFormBuilder, ICmsFieldValidatorContext } from \"../abstractions.js\";\nimport {\n buildDateLimitSettingsForm,\n dateLimitSettingsFromForm,\n dateLimitSettingsToForm\n} from \"./dateLimitSettings.js\";\n\nclass DateLteValidatorImpl implements CmsFieldValidator.Interface {\n name = \"dateLte\";\n label = \"Earlier or equal\";\n description =\n \"Entered date/time must be equal or earlier compared to the provided date. A date relative to today is worked out from the current date every time the value is checked.\";\n defaultMessage = \"Must be on or before {date}.\";\n variables = [\n {\n name: \"date\",\n description: \"The latest allowed date, worked out when the value is checked.\"\n }\n ];\n\n buildSettingsForm(form: ICmsFieldValidatorFormBuilder, context: ICmsFieldValidatorContext) {\n buildDateLimitSettingsForm(form, context, {\n valueDescription: \"This is the latest date/time that will be allowed.\"\n });\n }\n\n mapSettingsToForm(settings: Record<string, unknown>, context: ICmsFieldValidatorContext) {\n return dateLimitSettingsToForm(settings, context);\n }\n\n mapSettingsFromForm(settings: Record<string, unknown>) {\n return dateLimitSettingsFromForm(settings);\n }\n\n mapToFieldBuilder(\n builder: IFieldBuilder,\n validator: CmsModelFieldValidator,\n _field: CmsModelField\n ) {\n const maxDate = validator.settings?.value;\n if (maxDate != null) {\n builder.schema(\n z.string().refine(val => val <= maxDate, {\n message: validator.message || `Must be on or before ${maxDate}`\n })\n );\n }\n }\n}\n\nexport const DateLteValidator = CmsFieldValidator.createImplementation({\n implementation: DateLteValidatorImpl,\n dependencies: []\n});\n"],"names":["DateLteValidatorImpl","form","context","buildDateLimitSettingsForm","settings","dateLimitSettingsToForm","dateLimitSettingsFromForm","builder","validator","_field","maxDate","z","val","DateLteValidator","CmsFieldValidator"],"mappings":";;;AAYA,MAAMA;IAaF,kBAAkBC,IAAmC,EAAEC,OAAkC,EAAE;QACvFC,2BAA2BF,MAAMC,SAAS;YACtC,kBAAkB;QACtB;IACJ;IAEA,kBAAkBE,QAAiC,EAAEF,OAAkC,EAAE;QACrF,OAAOG,wBAAwBD,UAAUF;IAC7C;IAEA,oBAAoBE,QAAiC,EAAE;QACnD,OAAOE,0BAA0BF;IACrC;IAEA,kBACIG,OAAsB,EACtBC,SAAiC,EACjCC,MAAqB,EACvB;QACE,MAAMC,UAAUF,UAAU,QAAQ,EAAE;QACpC,IAAIE,AAAW,QAAXA,SACAH,QAAQ,MAAM,CACVI,EAAE,MAAM,GAAG,MAAM,CAACC,CAAAA,MAAOA,OAAOF,SAAS;YACrC,SAASF,UAAU,OAAO,IAAI,CAAC,qBAAqB,EAAEE,SAAS;QACnE;IAGZ;;aAvCA,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GACP;aACJ,cAAc,GAAG;aACjB,SAAS,GAAG;YACR;gBACI,MAAM;gBACN,aAAa;YACjB;SACH;;AA8BL;AAEO,MAAMG,mBAAmBC,kBAAkB,oBAAoB,CAAC;IACnE,gBAAgBd;IAChB,cAAc,EAAE;AACpB"}
|