@webiny/app-admin 6.5.0-beta.4 → 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.
Files changed (86) hide show
  1. package/base/Base/FieldRenderers/HorizontalTabsRenderer.d.ts +2 -2
  2. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.d.ts +2 -2
  3. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js +1 -1
  4. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js.map +1 -1
  5. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +8 -4
  6. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.d.ts +2 -2
  7. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +1 -1
  8. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -1
  9. package/base/Base/FieldRenderers/ObjectRenderer/{TemplatePicker.d.ts → TemplatePicker/AddTemplateButton.d.ts} +1 -1
  10. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/AddTemplateButton.js +24 -0
  11. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/AddTemplateButton.js.map +1 -0
  12. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.d.ts +13 -0
  13. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.js +21 -0
  14. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.js.map +1 -0
  15. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.d.ts +3 -0
  16. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.js +35 -0
  17. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.js.map +1 -0
  18. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.d.ts +8 -0
  19. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.js +22 -0
  20. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.js.map +1 -0
  21. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.d.ts +10 -0
  22. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.js +46 -0
  23. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.js.map +1 -0
  24. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.d.ts +8 -0
  25. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.js +16 -0
  26. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.js.map +1 -0
  27. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.d.ts +10 -0
  28. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.js +22 -0
  29. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.js.map +1 -0
  30. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.d.ts +3 -0
  31. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.js +35 -0
  32. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.js.map +1 -0
  33. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/index.d.ts +1 -0
  34. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/index.js +1 -0
  35. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/types.d.ts +6 -0
  36. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/types.js +0 -0
  37. package/base/Base/FieldRenderers/VerticalTabsRenderer.d.ts +2 -2
  38. package/components/IconPicker/IconPickerComponent.d.ts +2 -2
  39. package/components/IconPicker/IconPickerComponent.js +1 -1
  40. package/components/IconPicker/IconPickerComponent.js.map +1 -1
  41. package/components/ListView/ListViewBulkActions.d.ts +2 -2
  42. package/components/ListView/ListViewContent.d.ts +2 -2
  43. package/components/ListView/ListViewFilters.d.ts +2 -2
  44. package/components/ListView/index.d.ts +6 -6
  45. package/components/RolesMultiAutocomplete/index.js +1 -1
  46. package/components/RolesMultiAutocomplete/index.js.map +1 -1
  47. package/components/Table/components/Table/TableInner.d.ts +2 -2
  48. package/components/TeamsMultiAutocomplete/index.js +1 -1
  49. package/components/TeamsMultiAutocomplete/index.js.map +1 -1
  50. package/domain/Identity.js +1 -1
  51. package/domain/Identity.js.map +1 -1
  52. package/features/debugger/Debugger.d.ts +2 -2
  53. package/features/debugger/DebuggerIndicator.d.ts +2 -2
  54. package/features/debugger/DebuggerView.d.ts +2 -2
  55. package/features/formModel/FormErrors.d.ts +2 -2
  56. package/features/formModel/FormModel.test.js +3 -2
  57. package/features/formModel/FormModel.test.js.map +1 -1
  58. package/features/formModel/FormView.d.ts +8 -4
  59. package/features/formModel/ObjectField.js +1 -0
  60. package/features/formModel/ObjectField.js.map +1 -1
  61. package/features/formModel/PresenterErrors.d.ts +2 -2
  62. package/features/formModel/abstractions.d.ts +3 -0
  63. package/features/formModel/abstractions.js.map +1 -1
  64. package/features/formModel/demo/FormModelDemo.d.ts +2 -2
  65. package/features/formModel/fieldTypes/ObjectFieldType.js +6 -0
  66. package/features/formModel/fieldTypes/ObjectFieldType.js.map +1 -1
  67. package/features/notifications/NotificationsRenderer.d.ts +2 -2
  68. package/hooks/useSnackbar.js.map +1 -1
  69. package/package.json +34 -34
  70. package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js +1 -2
  71. package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js.map +1 -1
  72. package/presentation/accessManagement/apiKeys/components/ApiKeysView.d.ts +2 -2
  73. package/presentation/accessManagement/roles/RolesPresenter.js +1 -2
  74. package/presentation/accessManagement/roles/RolesPresenter.js.map +1 -1
  75. package/presentation/accessManagement/roles/components/RolesView.d.ts +2 -2
  76. package/presentation/accessManagement/teams/TeamsPresenter.js +1 -2
  77. package/presentation/accessManagement/teams/TeamsPresenter.js.map +1 -1
  78. package/presentation/accessManagement/teams/components/TeamsView.d.ts +2 -2
  79. package/presentation/installation/components/SystemInstaller/SystemInstaller.d.ts +2 -2
  80. package/presentation/listPresenter/QueryMatcher.js +3 -3
  81. package/presentation/listPresenter/QueryMatcher.js.map +1 -1
  82. package/presentation/trashBin/components/BulkActions/DeleteItems.d.ts +2 -2
  83. package/presentation/trashBin/components/BulkActions/RestoreItems.d.ts +2 -2
  84. package/presentation/trashBin/components/TrashBinOverlay.d.ts +2 -2
  85. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +0 -68
  86. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"features/formModel/fieldTypes/ObjectFieldType.js","sources":["../../../../src/features/formModel/fieldTypes/ObjectFieldType.ts"],"sourcesContent":["import type { z } from \"zod\";\nimport {\n FieldType,\n type IFieldTypeFactory,\n type IFieldBuilder,\n type IFieldBuilderRegistry,\n type IObjectFieldBuilder,\n type IObjectFieldConfig,\n type ITemplateBuilder,\n type ITemplateConfig,\n type ITemplateIcon\n} from \"../abstractions.js\";\nimport type { IFormModel } from \"../abstractions.js\";\nimport { FieldBuilder } from \"../FieldBuilder.js\";\n\ninterface TemplateBuilderInternal extends ITemplateBuilder {\n _build(id: string, registry: IFieldBuilderRegistry): ITemplateConfig;\n}\n\nexport function createTemplateBuilder(): TemplateBuilderInternal {\n let label = \"\";\n let icon: ITemplateIcon | undefined;\n let fieldsFactory:\n | ((registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>)\n | undefined;\n let visibleFn: ((form: IFormModel) => boolean) | undefined;\n\n const builder: TemplateBuilderInternal = {\n label(text: string) {\n label = text;\n return builder;\n },\n icon(i: ITemplateIcon) {\n icon = i;\n return builder;\n },\n fields(factory) {\n fieldsFactory = factory;\n return builder;\n },\n visible(predicate) {\n visibleFn = predicate;\n return builder;\n },\n _build(id: string, registry: IFieldBuilderRegistry): ITemplateConfig {\n const childBuilders = fieldsFactory ? fieldsFactory(registry) : {};\n if (\"_templateId\" in childBuilders) {\n throw new Error(\n `Template \"${id}\" defines a reserved field \"_templateId\". ` +\n `The discriminator is added automatically.`\n );\n }\n for (const [fieldName, builder] of Object.entries(childBuilders)) {\n if (builder) {\n builder.build(fieldName);\n }\n }\n return { id, label, icon, childBuilders, visible: visibleFn };\n }\n };\n return builder;\n}\n\nexport class ObjectFieldBuilder extends FieldBuilder<\"object\"> implements IObjectFieldBuilder {\n private _childBuilders: Record<string, IFieldBuilder> = {};\n private _isList = false;\n private _listSchema?: z.ZodTypeAny;\n private _templates?: ITemplateConfig[];\n private _templateIds = new Set<string>();\n private _registry: IFieldBuilderRegistry;\n\n constructor(registry: IFieldBuilderRegistry) {\n super(\"object\");\n this._config.renderer = \"objectAccordionSingle\";\n this._registry = registry;\n }\n\n fields(fn: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>): this {\n this._childBuilders = fn(this._registry);\n return this;\n }\n\n override list(): this {\n this._isList = true;\n if (this._config.renderer === \"objectAccordionSingle\") {\n this._config.renderer = \"objectAccordionMultiple\";\n }\n return this;\n }\n\n listSchema(schema: z.ZodTypeAny): this {\n this._listSchema = schema;\n return this;\n }\n\n template(id: string, configure: (t: ITemplateBuilder) => void): this {\n if (id === \"_templateId\") {\n throw new Error(`Template id \"_templateId\" is reserved. Choose a different id.`);\n }\n if (this._templateIds.has(id)) {\n throw new Error(`Duplicate template id \"${id}\".`);\n }\n this._templateIds.add(id);\n\n const tb = createTemplateBuilder();\n configure(tb);\n\n if (!this._templates) {\n this._templates = [];\n }\n this._templates.push(tb._build(id, this._registry));\n\n if (\n this._config.renderer === \"objectAccordionSingle\" ||\n this._config.renderer === \"objectAccordionMultiple\"\n ) {\n this._config.renderer = \"dynamicZone\";\n }\n\n return this;\n }\n\n override build(name: string): IObjectFieldConfig {\n this._config.name = name;\n\n if (this._templates && Object.keys(this._childBuilders).length > 0) {\n throw new Error(\n `Object field \"${name}\" has both .fields() and .template() defined. ` +\n `Templates are mutually exclusive with .fields(); each template defines its own children.`\n );\n }\n\n return {\n ...this._config,\n childBuilders: this._childBuilders,\n isList: this._isList,\n listSchema: this._listSchema,\n templates: this._templates\n };\n }\n}\n\nclass ObjectFieldTypeFactory implements IFieldTypeFactory {\n readonly type = \"object\";\n create(registry: IFieldBuilderRegistry) {\n return new ObjectFieldBuilder(registry);\n }\n}\n\nexport const ObjectFieldType = FieldType.createImplementation({\n implementation: ObjectFieldTypeFactory,\n dependencies: []\n});\n\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n object(): IObjectFieldBuilder;\n }\n}\n"],"names":["createTemplateBuilder","label","icon","fieldsFactory","visibleFn","builder","text","i","factory","predicate","id","registry","childBuilders","Error","fieldName","Object","ObjectFieldBuilder","FieldBuilder","Set","fn","schema","configure","tb","name","ObjectFieldTypeFactory","ObjectFieldType","FieldType"],"mappings":"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"}
1
+ {"version":3,"file":"features/formModel/fieldTypes/ObjectFieldType.js","sources":["../../../../src/features/formModel/fieldTypes/ObjectFieldType.ts"],"sourcesContent":["import type { z } from \"zod\";\nimport {\n FieldType,\n type IFieldTypeFactory,\n type IFieldBuilder,\n type IFieldBuilderRegistry,\n type IObjectFieldBuilder,\n type IObjectFieldConfig,\n type ITemplateBuilder,\n type ITemplateConfig,\n type ITemplateIcon\n} from \"../abstractions.js\";\nimport type { IFormModel } from \"../abstractions.js\";\nimport { FieldBuilder } from \"../FieldBuilder.js\";\n\ninterface TemplateBuilderInternal extends ITemplateBuilder {\n _build(id: string, registry: IFieldBuilderRegistry): ITemplateConfig;\n}\n\nexport function createTemplateBuilder(): TemplateBuilderInternal {\n let label = \"\";\n let description: string | undefined;\n let icon: ITemplateIcon | undefined;\n let fieldsFactory:\n | ((registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>)\n | undefined;\n let visibleFn: ((form: IFormModel) => boolean) | undefined;\n\n const builder: TemplateBuilderInternal = {\n label(text: string) {\n label = text;\n return builder;\n },\n description(text: string) {\n description = text;\n return builder;\n },\n icon(i: ITemplateIcon) {\n icon = i;\n return builder;\n },\n fields(factory) {\n fieldsFactory = factory;\n return builder;\n },\n visible(predicate) {\n visibleFn = predicate;\n return builder;\n },\n _build(id: string, registry: IFieldBuilderRegistry): ITemplateConfig {\n const childBuilders = fieldsFactory ? fieldsFactory(registry) : {};\n if (\"_templateId\" in childBuilders) {\n throw new Error(\n `Template \"${id}\" defines a reserved field \"_templateId\". ` +\n `The discriminator is added automatically.`\n );\n }\n for (const [fieldName, builder] of Object.entries(childBuilders)) {\n if (builder) {\n builder.build(fieldName);\n }\n }\n return { id, label, description, icon, childBuilders, visible: visibleFn };\n }\n };\n return builder;\n}\n\nexport class ObjectFieldBuilder extends FieldBuilder<\"object\"> implements IObjectFieldBuilder {\n private _childBuilders: Record<string, IFieldBuilder> = {};\n private _isList = false;\n private _listSchema?: z.ZodTypeAny;\n private _templates?: ITemplateConfig[];\n private _templateIds = new Set<string>();\n private _registry: IFieldBuilderRegistry;\n\n constructor(registry: IFieldBuilderRegistry) {\n super(\"object\");\n this._config.renderer = \"objectAccordionSingle\";\n this._registry = registry;\n }\n\n fields(fn: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>): this {\n this._childBuilders = fn(this._registry);\n return this;\n }\n\n override list(): this {\n this._isList = true;\n if (this._config.renderer === \"objectAccordionSingle\") {\n this._config.renderer = \"objectAccordionMultiple\";\n }\n return this;\n }\n\n listSchema(schema: z.ZodTypeAny): this {\n this._listSchema = schema;\n return this;\n }\n\n template(id: string, configure: (t: ITemplateBuilder) => void): this {\n if (id === \"_templateId\") {\n throw new Error(`Template id \"_templateId\" is reserved. Choose a different id.`);\n }\n if (this._templateIds.has(id)) {\n throw new Error(`Duplicate template id \"${id}\".`);\n }\n this._templateIds.add(id);\n\n const tb = createTemplateBuilder();\n configure(tb);\n\n if (!this._templates) {\n this._templates = [];\n }\n this._templates.push(tb._build(id, this._registry));\n\n if (\n this._config.renderer === \"objectAccordionSingle\" ||\n this._config.renderer === \"objectAccordionMultiple\"\n ) {\n this._config.renderer = \"dynamicZone\";\n }\n\n return this;\n }\n\n override build(name: string): IObjectFieldConfig {\n this._config.name = name;\n\n if (this._templates && Object.keys(this._childBuilders).length > 0) {\n throw new Error(\n `Object field \"${name}\" has both .fields() and .template() defined. ` +\n `Templates are mutually exclusive with .fields(); each template defines its own children.`\n );\n }\n\n return {\n ...this._config,\n childBuilders: this._childBuilders,\n isList: this._isList,\n listSchema: this._listSchema,\n templates: this._templates\n };\n }\n}\n\nclass ObjectFieldTypeFactory implements IFieldTypeFactory {\n readonly type = \"object\";\n create(registry: IFieldBuilderRegistry) {\n return new ObjectFieldBuilder(registry);\n }\n}\n\nexport const ObjectFieldType = FieldType.createImplementation({\n implementation: ObjectFieldTypeFactory,\n dependencies: []\n});\n\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n object(): IObjectFieldBuilder;\n }\n}\n"],"names":["createTemplateBuilder","label","description","icon","fieldsFactory","visibleFn","builder","text","i","factory","predicate","id","registry","childBuilders","Error","fieldName","Object","ObjectFieldBuilder","FieldBuilder","Set","fn","schema","configure","tb","name","ObjectFieldTypeFactory","ObjectFieldType","FieldType"],"mappings":"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"}
@@ -2,6 +2,6 @@
2
2
  * Standalone consumer of the Notifications queue. Drains queued notifications oldest-first
3
3
  * and shows each one as a toast, then removes it from the queue. Mounted once, app-wide.
4
4
  */
5
- export declare const NotificationsRenderer: (() => null) & {
6
- displayName: string;
5
+ export declare const NotificationsRenderer: (() => null) & import("react").NamedExoticComponent<unknown> & {
6
+ readonly type: () => null;
7
7
  };
@@ -1 +1 @@
1
- {"version":3,"file":"hooks/useSnackbar.js","sources":["../../src/hooks/useSnackbar.tsx"],"sourcesContent":["import React from \"react\";\nimport { Toast, useToast } from \"@webiny/admin-ui\";\n\ninterface UseSnackbarResponse {\n showSnackbar: (message: React.ReactNode, options?: Record<string, React.ReactNode>) => void;\n showErrorSnackbar: (\n message: React.ReactNode,\n options?: Record<string, React.ReactNode>\n ) => void;\n hideSnackbar: () => void;\n}\n\n/**\n * @deprecated Use the new `useToast` hook from `@webiny/admin-ui` instead.\n */\nexport const useSnackbar = (): UseSnackbarResponse => {\n const { showToast, hideAllToasts } = useToast();\n\n return {\n showSnackbar: (message, options = {}) => {\n showToast({\n title: <Toast.Title text={message} />,\n ...options\n });\n },\n showErrorSnackbar: (message, options = {}) => {\n showToast({\n title: <Toast.Title text={message} />,\n duration: Infinity,\n ...options\n });\n },\n hideSnackbar: () => {\n hideAllToasts();\n }\n };\n};\n"],"names":["useSnackbar","showToast","hideAllToasts","useToast","message","options","Toast","Infinity"],"mappings":";;AAeO,MAAMA,cAAc;IACvB,MAAM,EAAEC,SAAS,EAAEC,aAAa,EAAE,GAAGC;IAErC,OAAO;QACH,cAAc,CAACC,SAASC,UAAU,CAAC,CAAC;YAChCJ,UAAU;gBACN,OAAO,WAAP,GAAO,oBAACK,MAAM,KAAK;oBAAC,MAAMF;;gBAC1B,GAAGC,OAAO;YACd;QACJ;QACA,mBAAmB,CAACD,SAASC,UAAU,CAAC,CAAC;YACrCJ,UAAU;gBACN,OAAO,WAAP,GAAO,oBAACK,MAAM,KAAK;oBAAC,MAAMF;;gBAC1B,UAAUG;gBACV,GAAGF,OAAO;YACd;QACJ;QACA,cAAc;YACVH;QACJ;IACJ;AACJ"}
1
+ {"version":3,"file":"hooks/useSnackbar.js","sources":["../../src/hooks/useSnackbar.tsx"],"sourcesContent":["import React from \"react\";\nimport { Toast, useToast } from \"@webiny/admin-ui\";\n\ninterface UseSnackbarResponse {\n showSnackbar: (message: React.ReactNode, options?: Record<string, React.ReactNode>) => void;\n showErrorSnackbar: (\n message: React.ReactNode,\n options?: Record<string, React.ReactNode>\n ) => void;\n hideSnackbar: () => void;\n}\n\n/**\n * @deprecated Use the new `useToast` hook from `@webiny/admin-ui` instead.\n */\nexport const useSnackbar = (): UseSnackbarResponse => {\n const { showToast, hideAllToasts } = useToast();\n\n return {\n showSnackbar: (message, options = {}) => {\n showToast({\n title: <Toast.Title text={message} />,\n ...options\n });\n },\n showErrorSnackbar: (message, options = {}) => {\n showToast({\n title: <Toast.Title text={message} />,\n duration: Infinity,\n ...options\n });\n },\n hideSnackbar: () => {\n hideAllToasts();\n }\n };\n};\n"],"names":["useSnackbar","showToast","hideAllToasts","useToast","message","options","Toast","Infinity"],"mappings":";;AAeO,MAAMA,cAAc;IACvB,MAAM,EAAEC,SAAS,EAAEC,aAAa,EAAE,GAAGC;IAErC,OAAO;QACH,cAAc,CAACC,SAASC,UAAU,CAAC,CAAC;YAChCJ,UAAU;gBACN,OAAO,WAAP,GAAO,oBAACK,MAAM,KAAK;oBAAC,MAAMF;;gBAC1B,GAAGC,OAAO;YACd;QACJ;QACA,mBAAmB,CAACD,SAASC,UAAU,CAAC,CAAC;YACrCJ,UAAU;gBACN,OAAO,WAAP,GAAO,oBAACK,MAAM,KAAK;oBAAC,MAAMF;;gBAC1B,UAAUG,KAAQ;gBAClB,GAAGF,OAAO;YACd;QACJ;QACA,cAAc;YACVH;QACJ;IACJ;AACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/app-admin",
3
- "version": "6.5.0-beta.4",
3
+ "version": "6.5.0-beta.5",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -16,34 +16,34 @@
16
16
  "dependencies": {
17
17
  "@apollo/react-components": "3.1.5",
18
18
  "@apollo/react-hooks": "3.1.5",
19
- "@atlaskit/pragmatic-drag-and-drop": "2.0.1",
20
- "@atlaskit/pragmatic-drag-and-drop-hitbox": "2.0.0",
19
+ "@atlaskit/pragmatic-drag-and-drop": "2.0.2",
20
+ "@atlaskit/pragmatic-drag-and-drop-hitbox": "2.2.2",
21
21
  "@emotion/css": "11.13.5",
22
22
  "@emotion/react": "11.14.0",
23
23
  "@emotion/styled": "11.14.1",
24
24
  "@fortawesome/fontawesome-svg-core": "7.3.1",
25
25
  "@fortawesome/react-fontawesome": "3.5.0",
26
- "@iconify/json": "2.2.503",
27
- "@lexical/utils": "0.48.0",
26
+ "@iconify/json": "2.2.534",
27
+ "@lexical/utils": "0.51.0",
28
28
  "@types/react": "18.3.31",
29
- "@webiny/admin-ui": "6.5.0-beta.4",
30
- "@webiny/app": "6.5.0-beta.4",
31
- "@webiny/di": "1.0.2",
32
- "@webiny/feature": "6.5.0-beta.4",
33
- "@webiny/form": "6.5.0-beta.4",
34
- "@webiny/icons": "6.5.0-beta.4",
35
- "@webiny/lexical-converter": "6.5.0-beta.4",
36
- "@webiny/lexical-editor": "6.5.0-beta.4",
37
- "@webiny/lexical-nodes": "6.5.0-beta.4",
38
- "@webiny/lexical-theme": "6.5.0-beta.4",
39
- "@webiny/plugins": "6.5.0-beta.4",
40
- "@webiny/react-composition": "6.5.0-beta.4",
41
- "@webiny/react-properties": "6.5.0-beta.4",
42
- "@webiny/sdk": "6.5.0-beta.4",
43
- "@webiny/telemetry": "6.5.0-beta.4",
44
- "@webiny/utils": "6.5.0-beta.4",
45
- "@webiny/validation": "6.5.0-beta.4",
46
- "@webiny/wcp": "6.5.0-beta.4",
29
+ "@webiny/admin-ui": "6.5.0-beta.5",
30
+ "@webiny/app": "6.5.0-beta.5",
31
+ "@webiny/di": "1.1.0",
32
+ "@webiny/feature": "6.5.0-beta.5",
33
+ "@webiny/form": "6.5.0-beta.5",
34
+ "@webiny/icons": "6.5.0-beta.5",
35
+ "@webiny/lexical-converter": "6.5.0-beta.5",
36
+ "@webiny/lexical-editor": "6.5.0-beta.5",
37
+ "@webiny/lexical-nodes": "6.5.0-beta.5",
38
+ "@webiny/lexical-theme": "6.5.0-beta.5",
39
+ "@webiny/plugins": "6.5.0-beta.5",
40
+ "@webiny/react-composition": "6.5.0-beta.5",
41
+ "@webiny/react-properties": "6.5.0-beta.5",
42
+ "@webiny/sdk": "6.5.0-beta.5",
43
+ "@webiny/telemetry": "6.5.0-beta.5",
44
+ "@webiny/utils": "6.5.0-beta.5",
45
+ "@webiny/validation": "6.5.0-beta.5",
46
+ "@webiny/wcp": "6.5.0-beta.5",
47
47
  "apollo-cache": "1.3.5",
48
48
  "apollo-client": "2.6.10",
49
49
  "apollo-link": "1.2.14",
@@ -55,38 +55,38 @@
55
55
  "graphql-tag": "2.12.7",
56
56
  "history": "5.3.0",
57
57
  "is-hotkey": "0.2.0",
58
- "lexical": "0.48.0",
58
+ "lexical": "0.51.0",
59
59
  "lodash": "4.18.1",
60
- "markdown-to-jsx": "9.9.0",
60
+ "markdown-to-jsx": "9.10.3",
61
61
  "mime": "4.1.0",
62
- "minimatch": "10.2.5",
63
- "mobx": "6.16.1",
64
- "mobx-react-lite": "4.1.1",
62
+ "minimatch": "10.2.6",
63
+ "mobx": "7.0.5",
64
+ "mobx-react-lite": "5.1.0",
65
65
  "monaco-editor": "0.53.0",
66
66
  "react": "18.3.1",
67
67
  "react-dom": "18.3.1",
68
- "react-resizable-panels": "4.12.2",
68
+ "react-resizable-panels": "4.14.1",
69
69
  "react-transition-group": "4.4.5",
70
70
  "react-virtualized": "9.22.6",
71
71
  "reset-css": "5.0.2",
72
72
  "slugify": "1.6.9",
73
73
  "tinycolor2": "1.6.0",
74
74
  "unicode-emoji-json": "0.9.0",
75
- "zod": "4.4.3"
75
+ "zod": "4.6.5"
76
76
  },
77
77
  "devDependencies": {
78
- "@testing-library/react": "16.3.2",
79
- "@types/bytes": "3.1.5",
78
+ "@testing-library/react": "16.3.3",
79
+ "@types/bytes": "3.1.6",
80
80
  "@types/graphlib": "2.1.12",
81
81
  "@types/is-hotkey": "0.1.10",
82
82
  "@types/react-resizable": "4.0.0",
83
83
  "@types/react-transition-group": "4.4.12",
84
84
  "@types/store": "2.0.5",
85
85
  "@types/tinycolor2": "1.4.6",
86
- "@webiny/build-tools": "6.5.0-beta.4",
86
+ "@webiny/build-tools": "6.5.0-beta.5",
87
87
  "rimraf": "6.1.3",
88
88
  "typescript": "7.0.2",
89
- "vitest": "4.1.10"
89
+ "vitest": "5.0.2"
90
90
  },
91
91
  "publishConfig": {
92
92
  "access": "public"
@@ -109,8 +109,7 @@ class ApiKeysPresenterImpl {
109
109
  this._selectedApiKey = apiKey;
110
110
  });
111
111
  return apiKey;
112
- }
113
- {
112
+ } else {
114
113
  const apiKey = await this.createApiKeyUseCase.execute({
115
114
  name: data.name,
116
115
  slug: data.slug,
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/accessManagement/apiKeys/ApiKeysPresenter.js","sources":["../../../../src/presentation/accessManagement/apiKeys/ApiKeysPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport slugify from \"slugify\";\nimport { ListPresenter } from \"~/presentation/listPresenter/abstractions.js\";\nimport { FormModelFactory } from \"~/features/formModel/abstractions.js\";\nimport type { IFormModel } from \"~/features/formModel/abstractions.js\";\nimport type { ApiKey } from \"~/features/accessManagement/types.js\";\nimport {\n ListApiKeysUseCase,\n ApiKeysListCache\n} from \"~/features/accessManagement/apiKeys/listApiKeys/abstractions.js\";\nimport { GetApiKeyUseCase } from \"~/features/accessManagement/apiKeys/getApiKey/abstractions.js\";\nimport { CreateApiKeyUseCase } from \"~/features/accessManagement/apiKeys/createApiKey/abstractions.js\";\nimport { UpdateApiKeyUseCase } from \"~/features/accessManagement/apiKeys/updateApiKey/abstractions.js\";\nimport { DeleteApiKeyUseCase } from \"~/features/accessManagement/apiKeys/deleteApiKey/abstractions.js\";\nimport { ApiKeysPresenter as Abstraction } from \"./abstractions.js\";\nimport { ApiKeysDataSource } from \"./ApiKeysDataSource.js\";\n\nclass ApiKeysPresenterImpl implements Abstraction.Interface {\n private _selectedApiKey: ApiKey | null = null;\n private _loading = false;\n private _saving = false;\n private _showForm = false;\n private _form: IFormModel;\n\n constructor(\n private _listPresenter: ListPresenter.Interface<ApiKey>,\n private formModelFactory: FormModelFactory.Interface,\n private listApiKeysUseCase: ListApiKeysUseCase.Interface,\n private getApiKeyUseCase: GetApiKeyUseCase.Interface,\n private createApiKeyUseCase: CreateApiKeyUseCase.Interface,\n private updateApiKeyUseCase: UpdateApiKeyUseCase.Interface,\n private deleteApiKeyUseCase: DeleteApiKeyUseCase.Interface,\n private cache: ApiKeysListCache.Interface\n ) {\n this._form = this.buildForm(true, \"new\");\n makeAutoObservable<\n ApiKeysPresenterImpl,\n | \"formModelFactory\"\n | \"listApiKeysUseCase\"\n | \"getApiKeyUseCase\"\n | \"createApiKeyUseCase\"\n | \"updateApiKeyUseCase\"\n | \"deleteApiKeyUseCase\"\n | \"cache\"\n >(this, {\n formModelFactory: false,\n listApiKeysUseCase: false,\n getApiKeyUseCase: false,\n createApiKeyUseCase: false,\n updateApiKeyUseCase: false,\n deleteApiKeyUseCase: false,\n cache: false,\n vm: computed\n });\n }\n\n get vm(): Abstraction.ViewModel {\n return {\n selectedApiKey: this._selectedApiKey,\n loading: this._loading,\n saving: this._saving,\n showForm: this._showForm,\n form: this._form.vm\n };\n }\n\n get list(): ListPresenter.Interface<ApiKey> {\n return this._listPresenter;\n }\n\n init(): void {\n const dataSource = new ApiKeysDataSource(this.listApiKeysUseCase, this.cache);\n\n this._listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n limit: 1000\n });\n }\n\n async selectApiKey(id: string): Promise<void> {\n runInAction(() => {\n this._loading = true;\n this._showForm = true;\n });\n\n try {\n const apiKey = await this.getApiKeyUseCase.execute(id);\n runInAction(() => {\n this._selectedApiKey = apiKey;\n this._form = this.buildForm(false, apiKey.id);\n this._form.setData({\n name: apiKey.name,\n slug: apiKey.slug,\n description: apiKey.description,\n token: apiKey.token,\n permissions: apiKey.permissions || []\n });\n });\n } finally {\n runInAction(() => {\n this._loading = false;\n });\n }\n }\n\n createNew(): void {\n this._selectedApiKey = null;\n this._form = this.buildForm(true, \"new\");\n this._showForm = true;\n }\n\n deselect(): void {\n this._selectedApiKey = null;\n this._showForm = false;\n }\n\n async save(): Promise<ApiKey | null> {\n const data = await this._form.submit<ApiKey>();\n if (!data) {\n return null;\n }\n\n runInAction(() => {\n this._saving = true;\n });\n\n try {\n const isUpdate = this._selectedApiKey !== null && this._selectedApiKey.createdOn;\n\n if (isUpdate) {\n const apiKey = await this.updateApiKeyUseCase.execute(this._selectedApiKey!.id, {\n name: data.name,\n description: data.description,\n permissions: data.permissions\n });\n runInAction(() => {\n this._selectedApiKey = apiKey;\n });\n return apiKey;\n } else {\n const apiKey = await this.createApiKeyUseCase.execute({\n name: data.name,\n slug: data.slug,\n description: data.description,\n permissions: data.permissions\n });\n runInAction(() => {\n this._selectedApiKey = apiKey;\n this._form = this.buildForm(false, apiKey.id);\n this._form.setData({\n name: apiKey.name,\n slug: apiKey.slug,\n description: apiKey.description,\n permissions: apiKey.permissions || []\n });\n });\n return apiKey;\n }\n } catch {\n return null;\n } finally {\n runInAction(() => {\n this._saving = false;\n });\n }\n }\n\n async deleteApiKey(id: string): Promise<void> {\n await this.deleteApiKeyUseCase.execute(id);\n\n runInAction(() => {\n if (this._selectedApiKey !== null && this._selectedApiKey.id === id) {\n this._selectedApiKey = null;\n this._showForm = false;\n }\n });\n }\n\n private buildForm(isNew: boolean, entityId: string): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n name: fields\n .text()\n .label(\"Name\")\n .required(\"Name is required.\")\n .onBlur((value, { form }) => {\n const slugValue = form.field(\"slug\").getValue();\n if (slugValue || !value) {\n return;\n }\n form.field(\"slug\").setValue(\n slugify(String(value), {\n replacement: \"-\",\n lower: true,\n remove: /[*#?<>_{}[\\]+~.()'\"!:;@]/g,\n trim: false\n })\n );\n }),\n slug: fields.text().label(\"Slug\").required(\"Slug is required.\").disabled(!isNew),\n description: fields\n .text()\n .label(\"Description\")\n .required(\"Description is required.\")\n .renderer(\"textarea\"),\n // @ts-expect-error This is a single-use local renderer I don't want to be visible to users.\n token: fields.text().label(\"Token\").renderer(\"apiKeyToken\"),\n permissions: fields\n .permissions()\n .label(\"Permissions\")\n .renderer(\"permissions\", { id: entityId })\n }),\n layout: layout => [\n layout.row(\"name\", \"slug\"),\n layout.row(\"description\"),\n layout.row(\"token\"),\n layout.row(\"permissions\")\n ]\n });\n }\n}\n\nexport const ApiKeysPresenter = Abstraction.createImplementation({\n implementation: ApiKeysPresenterImpl,\n dependencies: [\n ListPresenter,\n FormModelFactory,\n ListApiKeysUseCase,\n GetApiKeyUseCase,\n CreateApiKeyUseCase,\n UpdateApiKeyUseCase,\n DeleteApiKeyUseCase,\n ApiKeysListCache\n ]\n});\n"],"names":["ApiKeysPresenterImpl","_listPresenter","formModelFactory","listApiKeysUseCase","getApiKeyUseCase","createApiKeyUseCase","updateApiKeyUseCase","deleteApiKeyUseCase","cache","makeAutoObservable","computed","dataSource","ApiKeysDataSource","id","runInAction","apiKey","data","isUpdate","isNew","entityId","fields","value","form","slugValue","slugify","String","layout","ApiKeysPresenter","Abstraction","ListPresenter","FormModelFactory","ListApiKeysUseCase","GetApiKeyUseCase","CreateApiKeyUseCase","UpdateApiKeyUseCase","DeleteApiKeyUseCase","ApiKeysListCache"],"mappings":"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"}
1
+ {"version":3,"file":"presentation/accessManagement/apiKeys/ApiKeysPresenter.js","sources":["../../../../src/presentation/accessManagement/apiKeys/ApiKeysPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport slugify from \"slugify\";\nimport { ListPresenter } from \"~/presentation/listPresenter/abstractions.js\";\nimport { FormModelFactory } from \"~/features/formModel/abstractions.js\";\nimport type { IFormModel } from \"~/features/formModel/abstractions.js\";\nimport type { ApiKey } from \"~/features/accessManagement/types.js\";\nimport {\n ListApiKeysUseCase,\n ApiKeysListCache\n} from \"~/features/accessManagement/apiKeys/listApiKeys/abstractions.js\";\nimport { GetApiKeyUseCase } from \"~/features/accessManagement/apiKeys/getApiKey/abstractions.js\";\nimport { CreateApiKeyUseCase } from \"~/features/accessManagement/apiKeys/createApiKey/abstractions.js\";\nimport { UpdateApiKeyUseCase } from \"~/features/accessManagement/apiKeys/updateApiKey/abstractions.js\";\nimport { DeleteApiKeyUseCase } from \"~/features/accessManagement/apiKeys/deleteApiKey/abstractions.js\";\nimport { ApiKeysPresenter as Abstraction } from \"./abstractions.js\";\nimport { ApiKeysDataSource } from \"./ApiKeysDataSource.js\";\n\nclass ApiKeysPresenterImpl implements Abstraction.Interface {\n private _selectedApiKey: ApiKey | null = null;\n private _loading = false;\n private _saving = false;\n private _showForm = false;\n private _form: IFormModel;\n\n constructor(\n private _listPresenter: ListPresenter.Interface<ApiKey>,\n private formModelFactory: FormModelFactory.Interface,\n private listApiKeysUseCase: ListApiKeysUseCase.Interface,\n private getApiKeyUseCase: GetApiKeyUseCase.Interface,\n private createApiKeyUseCase: CreateApiKeyUseCase.Interface,\n private updateApiKeyUseCase: UpdateApiKeyUseCase.Interface,\n private deleteApiKeyUseCase: DeleteApiKeyUseCase.Interface,\n private cache: ApiKeysListCache.Interface\n ) {\n this._form = this.buildForm(true, \"new\");\n makeAutoObservable<\n ApiKeysPresenterImpl,\n | \"formModelFactory\"\n | \"listApiKeysUseCase\"\n | \"getApiKeyUseCase\"\n | \"createApiKeyUseCase\"\n | \"updateApiKeyUseCase\"\n | \"deleteApiKeyUseCase\"\n | \"cache\"\n >(this, {\n formModelFactory: false,\n listApiKeysUseCase: false,\n getApiKeyUseCase: false,\n createApiKeyUseCase: false,\n updateApiKeyUseCase: false,\n deleteApiKeyUseCase: false,\n cache: false,\n vm: computed\n });\n }\n\n get vm(): Abstraction.ViewModel {\n return {\n selectedApiKey: this._selectedApiKey,\n loading: this._loading,\n saving: this._saving,\n showForm: this._showForm,\n form: this._form.vm\n };\n }\n\n get list(): ListPresenter.Interface<ApiKey> {\n return this._listPresenter;\n }\n\n init(): void {\n const dataSource = new ApiKeysDataSource(this.listApiKeysUseCase, this.cache);\n\n this._listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n limit: 1000\n });\n }\n\n async selectApiKey(id: string): Promise<void> {\n runInAction(() => {\n this._loading = true;\n this._showForm = true;\n });\n\n try {\n const apiKey = await this.getApiKeyUseCase.execute(id);\n runInAction(() => {\n this._selectedApiKey = apiKey;\n this._form = this.buildForm(false, apiKey.id);\n this._form.setData({\n name: apiKey.name,\n slug: apiKey.slug,\n description: apiKey.description,\n token: apiKey.token,\n permissions: apiKey.permissions || []\n });\n });\n } finally {\n runInAction(() => {\n this._loading = false;\n });\n }\n }\n\n createNew(): void {\n this._selectedApiKey = null;\n this._form = this.buildForm(true, \"new\");\n this._showForm = true;\n }\n\n deselect(): void {\n this._selectedApiKey = null;\n this._showForm = false;\n }\n\n async save(): Promise<ApiKey | null> {\n const data = await this._form.submit<ApiKey>();\n if (!data) {\n return null;\n }\n\n runInAction(() => {\n this._saving = true;\n });\n\n try {\n const isUpdate = this._selectedApiKey !== null && this._selectedApiKey.createdOn;\n\n if (isUpdate) {\n const apiKey = await this.updateApiKeyUseCase.execute(this._selectedApiKey!.id, {\n name: data.name,\n description: data.description,\n permissions: data.permissions\n });\n runInAction(() => {\n this._selectedApiKey = apiKey;\n });\n return apiKey;\n } else {\n const apiKey = await this.createApiKeyUseCase.execute({\n name: data.name,\n slug: data.slug,\n description: data.description,\n permissions: data.permissions\n });\n runInAction(() => {\n this._selectedApiKey = apiKey;\n this._form = this.buildForm(false, apiKey.id);\n this._form.setData({\n name: apiKey.name,\n slug: apiKey.slug,\n description: apiKey.description,\n permissions: apiKey.permissions || []\n });\n });\n return apiKey;\n }\n } catch {\n return null;\n } finally {\n runInAction(() => {\n this._saving = false;\n });\n }\n }\n\n async deleteApiKey(id: string): Promise<void> {\n await this.deleteApiKeyUseCase.execute(id);\n\n runInAction(() => {\n if (this._selectedApiKey !== null && this._selectedApiKey.id === id) {\n this._selectedApiKey = null;\n this._showForm = false;\n }\n });\n }\n\n private buildForm(isNew: boolean, entityId: string): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n name: fields\n .text()\n .label(\"Name\")\n .required(\"Name is required.\")\n .onBlur((value, { form }) => {\n const slugValue = form.field(\"slug\").getValue();\n if (slugValue || !value) {\n return;\n }\n form.field(\"slug\").setValue(\n slugify(String(value), {\n replacement: \"-\",\n lower: true,\n remove: /[*#?<>_{}[\\]+~.()'\"!:;@]/g,\n trim: false\n })\n );\n }),\n slug: fields.text().label(\"Slug\").required(\"Slug is required.\").disabled(!isNew),\n description: fields\n .text()\n .label(\"Description\")\n .required(\"Description is required.\")\n .renderer(\"textarea\"),\n // @ts-expect-error This is a single-use local renderer I don't want to be visible to users.\n token: fields.text().label(\"Token\").renderer(\"apiKeyToken\"),\n permissions: fields\n .permissions()\n .label(\"Permissions\")\n .renderer(\"permissions\", { id: entityId })\n }),\n layout: layout => [\n layout.row(\"name\", \"slug\"),\n layout.row(\"description\"),\n layout.row(\"token\"),\n layout.row(\"permissions\")\n ]\n });\n }\n}\n\nexport const ApiKeysPresenter = Abstraction.createImplementation({\n implementation: ApiKeysPresenterImpl,\n dependencies: [\n ListPresenter,\n FormModelFactory,\n ListApiKeysUseCase,\n GetApiKeyUseCase,\n CreateApiKeyUseCase,\n UpdateApiKeyUseCase,\n DeleteApiKeyUseCase,\n ApiKeysListCache\n ]\n});\n"],"names":["ApiKeysPresenterImpl","_listPresenter","formModelFactory","listApiKeysUseCase","getApiKeyUseCase","createApiKeyUseCase","updateApiKeyUseCase","deleteApiKeyUseCase","cache","makeAutoObservable","computed","dataSource","ApiKeysDataSource","id","runInAction","apiKey","data","isUpdate","isNew","entityId","fields","value","form","slugValue","slugify","String","layout","ApiKeysPresenter","Abstraction","ListPresenter","FormModelFactory","ListApiKeysUseCase","GetApiKeyUseCase","CreateApiKeyUseCase","UpdateApiKeyUseCase","DeleteApiKeyUseCase","ApiKeysListCache"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const ApiKeysView: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const ApiKeysView: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -116,8 +116,7 @@ class RolesPresenterImpl {
116
116
  this._selectedRole = role;
117
117
  });
118
118
  return role;
119
- }
120
- {
119
+ } else {
121
120
  const role = await this.createRoleUseCase.execute({
122
121
  name: data.name,
123
122
  slug: data.slug,
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/accessManagement/roles/RolesPresenter.js","sources":["../../../../src/presentation/accessManagement/roles/RolesPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport slugify from \"slugify\";\nimport { ListPresenter } from \"~/presentation/listPresenter/abstractions.js\";\nimport { FormModelFactory } from \"~/features/formModel/abstractions.js\";\nimport type { IFormModel } from \"~/features/formModel/abstractions.js\";\nimport type { Role } from \"~/features/accessManagement/types.js\";\nimport {\n ListRolesUseCase,\n RolesListCache\n} from \"~/features/accessManagement/roles/listRoles/abstractions.js\";\nimport { GetRoleUseCase } from \"~/features/accessManagement/roles/getRole/abstractions.js\";\nimport { CreateRoleUseCase } from \"~/features/accessManagement/roles/createRole/abstractions.js\";\nimport { UpdateRoleUseCase } from \"~/features/accessManagement/roles/updateRole/abstractions.js\";\nimport { DeleteRoleUseCase } from \"~/features/accessManagement/roles/deleteRole/abstractions.js\";\nimport {\n RolesPresenter as Abstraction,\n type IRolesPresenter,\n type IRolesPresenterViewModel\n} from \"./abstractions.js\";\nimport { RolesDataSource } from \"./RolesDataSource.js\";\n\nclass RolesPresenterImpl implements IRolesPresenter {\n private _selectedRole: Role | null = null;\n private _loading = false;\n private _saving = false;\n private _showForm = false;\n private _form: IFormModel;\n\n constructor(\n private _listPresenter: ListPresenter.Interface<Role>,\n private formModelFactory: FormModelFactory.Interface,\n private listRolesUseCase: ListRolesUseCase.Interface,\n private getRoleUseCase: GetRoleUseCase.Interface,\n private createRoleUseCase: CreateRoleUseCase.Interface,\n private updateRoleUseCase: UpdateRoleUseCase.Interface,\n private deleteRoleUseCase: DeleteRoleUseCase.Interface,\n private cache: RolesListCache.Interface\n ) {\n this._form = this.buildForm(false, false);\n makeAutoObservable<\n RolesPresenterImpl,\n | \"formModelFactory\"\n | \"listRolesUseCase\"\n | \"getRoleUseCase\"\n | \"createRoleUseCase\"\n | \"updateRoleUseCase\"\n | \"deleteRoleUseCase\"\n | \"cache\"\n >(this, {\n formModelFactory: false,\n listRolesUseCase: false,\n getRoleUseCase: false,\n createRoleUseCase: false,\n updateRoleUseCase: false,\n deleteRoleUseCase: false,\n cache: false,\n vm: computed\n });\n }\n\n get vm(): IRolesPresenterViewModel {\n const role = this._selectedRole;\n const isSystemRole = role !== null && (role.slug === \"full-access\" || role.system === true);\n const isPluginRole = role !== null && (role.plugin ?? false);\n\n return {\n selectedRole: this._selectedRole,\n loading: this._loading,\n saving: this._saving,\n showForm: this._showForm,\n canModify: !isSystemRole && !isPluginRole,\n isSystemRole,\n form: this._form.vm\n };\n }\n\n get list(): ListPresenter.Interface<Role> {\n return this._listPresenter;\n }\n\n init(): void {\n const dataSource = new RolesDataSource(this.listRolesUseCase, this.cache);\n\n this._listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n limit: 1000\n });\n }\n\n async selectRole(id: string): Promise<void> {\n runInAction(() => {\n this._loading = true;\n this._showForm = true;\n });\n\n try {\n const role = await this.getRoleUseCase.execute(id);\n const isSystemRole = role.slug === \"full-access\" || role.system === true;\n const isPluginRole = role.plugin ?? false;\n const canModify = !isSystemRole && !isPluginRole;\n\n runInAction(() => {\n this._selectedRole = role;\n this._form = this.buildForm(false, canModify, role.id);\n this._form.setData({\n name: role.name,\n slug: role.slug,\n description: role.description,\n permissions: role.permissions || []\n });\n });\n } finally {\n runInAction(() => {\n this._loading = false;\n });\n }\n }\n\n createNew(): void {\n this._selectedRole = null;\n this._form = this.buildForm(true, true, \"new\");\n this._showForm = true;\n }\n\n deselect(): void {\n this._selectedRole = null;\n this._showForm = false;\n }\n\n async save(): Promise<Role | null> {\n const data = await this._form.submit<Role>();\n if (!data) {\n return null;\n }\n\n runInAction(() => {\n this._saving = true;\n });\n\n try {\n const isUpdate = this._selectedRole !== null && this._selectedRole.createdOn;\n\n if (isUpdate) {\n const role = await this.updateRoleUseCase.execute(this._selectedRole!.id, {\n name: data.name as string,\n description: data.description as string,\n permissions: data.permissions\n });\n runInAction(() => {\n this._selectedRole = role;\n });\n return role;\n } else {\n const role = await this.createRoleUseCase.execute({\n name: data.name as string,\n slug: data.slug as string,\n description: data.description as string,\n permissions: data.permissions\n });\n runInAction(() => {\n this._selectedRole = role;\n this._form = this.buildForm(false, true, role.id);\n this._form.setData({\n name: role.name,\n slug: role.slug,\n description: role.description,\n permissions: role.permissions || []\n });\n });\n return role;\n }\n } catch {\n return null;\n } finally {\n runInAction(() => {\n this._saving = false;\n });\n }\n }\n\n async deleteRole(id: string): Promise<void> {\n await this.deleteRoleUseCase.execute(id);\n\n runInAction(() => {\n if (this._selectedRole !== null && this._selectedRole.id === id) {\n this._selectedRole = null;\n this._showForm = false;\n }\n });\n }\n\n private buildForm(isNew: boolean, canModify: boolean, entityId?: string): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n name: fields\n .text()\n .label(\"Name\")\n .required(\"Name is required.\")\n .disabled(!canModify)\n .onBlur((value, { form }) => {\n const slugValue = form.field(\"slug\").getValue();\n if (slugValue || !value) {\n return;\n }\n form.field(\"slug\").setValue(\n slugify(String(value), {\n replacement: \"-\",\n lower: true,\n remove: /[*#?<>_{}[\\]+~.()'\"!:;@]/g,\n trim: false\n })\n );\n }),\n slug: fields\n .text()\n .label(\"Slug\")\n .required(\"Slug is required.\")\n .disabled(!isNew || !canModify),\n description: fields\n .text()\n .label(\"Description\")\n .defaultValue(\"\")\n .renderer(\"textarea\")\n .disabled(!canModify),\n permissions: fields\n .permissions()\n .label(\"Permissions\")\n .renderer(\"permissions\", { id: entityId || \"new\" })\n .hiddenWhen(() => {\n const role = this._selectedRole;\n return (\n role !== null && (role.slug === \"full-access\" || role.system === true)\n );\n })\n }),\n layout: layout => [\n layout.row(\"name\", \"slug\"),\n layout.row(\"description\"),\n layout.row(\"permissions\")\n ]\n });\n }\n}\n\nexport const RolesPresenter = Abstraction.createImplementation({\n implementation: RolesPresenterImpl,\n dependencies: [\n ListPresenter,\n FormModelFactory,\n ListRolesUseCase,\n GetRoleUseCase,\n CreateRoleUseCase,\n UpdateRoleUseCase,\n DeleteRoleUseCase,\n RolesListCache\n ]\n});\n"],"names":["RolesPresenterImpl","_listPresenter","formModelFactory","listRolesUseCase","getRoleUseCase","createRoleUseCase","updateRoleUseCase","deleteRoleUseCase","cache","makeAutoObservable","computed","role","isSystemRole","isPluginRole","dataSource","RolesDataSource","id","runInAction","canModify","data","isUpdate","isNew","entityId","fields","value","form","slugValue","slugify","String","layout","RolesPresenter","Abstraction","ListPresenter","FormModelFactory","ListRolesUseCase","GetRoleUseCase","CreateRoleUseCase","UpdateRoleUseCase","DeleteRoleUseCase","RolesListCache"],"mappings":"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"}
1
+ {"version":3,"file":"presentation/accessManagement/roles/RolesPresenter.js","sources":["../../../../src/presentation/accessManagement/roles/RolesPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport slugify from \"slugify\";\nimport { ListPresenter } from \"~/presentation/listPresenter/abstractions.js\";\nimport { FormModelFactory } from \"~/features/formModel/abstractions.js\";\nimport type { IFormModel } from \"~/features/formModel/abstractions.js\";\nimport type { Role } from \"~/features/accessManagement/types.js\";\nimport {\n ListRolesUseCase,\n RolesListCache\n} from \"~/features/accessManagement/roles/listRoles/abstractions.js\";\nimport { GetRoleUseCase } from \"~/features/accessManagement/roles/getRole/abstractions.js\";\nimport { CreateRoleUseCase } from \"~/features/accessManagement/roles/createRole/abstractions.js\";\nimport { UpdateRoleUseCase } from \"~/features/accessManagement/roles/updateRole/abstractions.js\";\nimport { DeleteRoleUseCase } from \"~/features/accessManagement/roles/deleteRole/abstractions.js\";\nimport {\n RolesPresenter as Abstraction,\n type IRolesPresenter,\n type IRolesPresenterViewModel\n} from \"./abstractions.js\";\nimport { RolesDataSource } from \"./RolesDataSource.js\";\n\nclass RolesPresenterImpl implements IRolesPresenter {\n private _selectedRole: Role | null = null;\n private _loading = false;\n private _saving = false;\n private _showForm = false;\n private _form: IFormModel;\n\n constructor(\n private _listPresenter: ListPresenter.Interface<Role>,\n private formModelFactory: FormModelFactory.Interface,\n private listRolesUseCase: ListRolesUseCase.Interface,\n private getRoleUseCase: GetRoleUseCase.Interface,\n private createRoleUseCase: CreateRoleUseCase.Interface,\n private updateRoleUseCase: UpdateRoleUseCase.Interface,\n private deleteRoleUseCase: DeleteRoleUseCase.Interface,\n private cache: RolesListCache.Interface\n ) {\n this._form = this.buildForm(false, false);\n makeAutoObservable<\n RolesPresenterImpl,\n | \"formModelFactory\"\n | \"listRolesUseCase\"\n | \"getRoleUseCase\"\n | \"createRoleUseCase\"\n | \"updateRoleUseCase\"\n | \"deleteRoleUseCase\"\n | \"cache\"\n >(this, {\n formModelFactory: false,\n listRolesUseCase: false,\n getRoleUseCase: false,\n createRoleUseCase: false,\n updateRoleUseCase: false,\n deleteRoleUseCase: false,\n cache: false,\n vm: computed\n });\n }\n\n get vm(): IRolesPresenterViewModel {\n const role = this._selectedRole;\n const isSystemRole = role !== null && (role.slug === \"full-access\" || role.system === true);\n const isPluginRole = role !== null && (role.plugin ?? false);\n\n return {\n selectedRole: this._selectedRole,\n loading: this._loading,\n saving: this._saving,\n showForm: this._showForm,\n canModify: !isSystemRole && !isPluginRole,\n isSystemRole,\n form: this._form.vm\n };\n }\n\n get list(): ListPresenter.Interface<Role> {\n return this._listPresenter;\n }\n\n init(): void {\n const dataSource = new RolesDataSource(this.listRolesUseCase, this.cache);\n\n this._listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n limit: 1000\n });\n }\n\n async selectRole(id: string): Promise<void> {\n runInAction(() => {\n this._loading = true;\n this._showForm = true;\n });\n\n try {\n const role = await this.getRoleUseCase.execute(id);\n const isSystemRole = role.slug === \"full-access\" || role.system === true;\n const isPluginRole = role.plugin ?? false;\n const canModify = !isSystemRole && !isPluginRole;\n\n runInAction(() => {\n this._selectedRole = role;\n this._form = this.buildForm(false, canModify, role.id);\n this._form.setData({\n name: role.name,\n slug: role.slug,\n description: role.description,\n permissions: role.permissions || []\n });\n });\n } finally {\n runInAction(() => {\n this._loading = false;\n });\n }\n }\n\n createNew(): void {\n this._selectedRole = null;\n this._form = this.buildForm(true, true, \"new\");\n this._showForm = true;\n }\n\n deselect(): void {\n this._selectedRole = null;\n this._showForm = false;\n }\n\n async save(): Promise<Role | null> {\n const data = await this._form.submit<Role>();\n if (!data) {\n return null;\n }\n\n runInAction(() => {\n this._saving = true;\n });\n\n try {\n const isUpdate = this._selectedRole !== null && this._selectedRole.createdOn;\n\n if (isUpdate) {\n const role = await this.updateRoleUseCase.execute(this._selectedRole!.id, {\n name: data.name as string,\n description: data.description as string,\n permissions: data.permissions\n });\n runInAction(() => {\n this._selectedRole = role;\n });\n return role;\n } else {\n const role = await this.createRoleUseCase.execute({\n name: data.name as string,\n slug: data.slug as string,\n description: data.description as string,\n permissions: data.permissions\n });\n runInAction(() => {\n this._selectedRole = role;\n this._form = this.buildForm(false, true, role.id);\n this._form.setData({\n name: role.name,\n slug: role.slug,\n description: role.description,\n permissions: role.permissions || []\n });\n });\n return role;\n }\n } catch {\n return null;\n } finally {\n runInAction(() => {\n this._saving = false;\n });\n }\n }\n\n async deleteRole(id: string): Promise<void> {\n await this.deleteRoleUseCase.execute(id);\n\n runInAction(() => {\n if (this._selectedRole !== null && this._selectedRole.id === id) {\n this._selectedRole = null;\n this._showForm = false;\n }\n });\n }\n\n private buildForm(isNew: boolean, canModify: boolean, entityId?: string): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n name: fields\n .text()\n .label(\"Name\")\n .required(\"Name is required.\")\n .disabled(!canModify)\n .onBlur((value, { form }) => {\n const slugValue = form.field(\"slug\").getValue();\n if (slugValue || !value) {\n return;\n }\n form.field(\"slug\").setValue(\n slugify(String(value), {\n replacement: \"-\",\n lower: true,\n remove: /[*#?<>_{}[\\]+~.()'\"!:;@]/g,\n trim: false\n })\n );\n }),\n slug: fields\n .text()\n .label(\"Slug\")\n .required(\"Slug is required.\")\n .disabled(!isNew || !canModify),\n description: fields\n .text()\n .label(\"Description\")\n .defaultValue(\"\")\n .renderer(\"textarea\")\n .disabled(!canModify),\n permissions: fields\n .permissions()\n .label(\"Permissions\")\n .renderer(\"permissions\", { id: entityId || \"new\" })\n .hiddenWhen(() => {\n const role = this._selectedRole;\n return (\n role !== null && (role.slug === \"full-access\" || role.system === true)\n );\n })\n }),\n layout: layout => [\n layout.row(\"name\", \"slug\"),\n layout.row(\"description\"),\n layout.row(\"permissions\")\n ]\n });\n }\n}\n\nexport const RolesPresenter = Abstraction.createImplementation({\n implementation: RolesPresenterImpl,\n dependencies: [\n ListPresenter,\n FormModelFactory,\n ListRolesUseCase,\n GetRoleUseCase,\n CreateRoleUseCase,\n UpdateRoleUseCase,\n DeleteRoleUseCase,\n RolesListCache\n ]\n});\n"],"names":["RolesPresenterImpl","_listPresenter","formModelFactory","listRolesUseCase","getRoleUseCase","createRoleUseCase","updateRoleUseCase","deleteRoleUseCase","cache","makeAutoObservable","computed","role","isSystemRole","isPluginRole","dataSource","RolesDataSource","id","runInAction","canModify","data","isUpdate","isNew","entityId","fields","value","form","slugValue","slugify","String","layout","RolesPresenter","Abstraction","ListPresenter","FormModelFactory","ListRolesUseCase","GetRoleUseCase","CreateRoleUseCase","UpdateRoleUseCase","DeleteRoleUseCase","RolesListCache"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const RolesView: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const RolesView: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -119,8 +119,7 @@ class TeamsPresenterImpl {
119
119
  this._selectedTeam = team;
120
120
  });
121
121
  return team;
122
- }
123
- {
122
+ } else {
124
123
  const team = await this.createTeamUseCase.execute({
125
124
  name: data.name,
126
125
  slug: data.slug,
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/accessManagement/teams/TeamsPresenter.js","sources":["../../../../src/presentation/accessManagement/teams/TeamsPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport slugify from \"slugify\";\nimport { ListPresenter } from \"~/presentation/listPresenter/abstractions.js\";\nimport { FormModelFactory } from \"~/features/formModel/abstractions.js\";\nimport type { IFormModel } from \"~/features/formModel/abstractions.js\";\nimport type { Team } from \"~/features/accessManagement/types.js\";\nimport {\n ListTeamsUseCase,\n TeamsListCache\n} from \"~/features/accessManagement/teams/listTeams/abstractions.js\";\nimport { GetTeamUseCase } from \"~/features/accessManagement/teams/getTeam/abstractions.js\";\nimport { CreateTeamUseCase } from \"~/features/accessManagement/teams/createTeam/abstractions.js\";\nimport { UpdateTeamUseCase } from \"~/features/accessManagement/teams/updateTeam/abstractions.js\";\nimport { DeleteTeamUseCase } from \"~/features/accessManagement/teams/deleteTeam/abstractions.js\";\nimport {\n TeamsPresenter as Abstraction,\n type ITeamsPresenter,\n type ITeamsPresenterViewModel\n} from \"./abstractions.js\";\nimport { TeamsDataSource } from \"./TeamsDataSource.js\";\n\nclass TeamsPresenterImpl implements ITeamsPresenter {\n private _selectedTeam: Team | null = null;\n private _loading = false;\n private _saving = false;\n private _showForm = false;\n private _form: IFormModel;\n private _isNew = false;\n\n constructor(\n private _listPresenter: ListPresenter.Interface<Team>,\n private formModelFactory: FormModelFactory.Interface,\n private listTeamsUseCase: ListTeamsUseCase.Interface,\n private getTeamUseCase: GetTeamUseCase.Interface,\n private createTeamUseCase: CreateTeamUseCase.Interface,\n private updateTeamUseCase: UpdateTeamUseCase.Interface,\n private deleteTeamUseCase: DeleteTeamUseCase.Interface,\n private cache: TeamsListCache.Interface\n ) {\n this._form = this.buildForm(false, true);\n makeAutoObservable<\n TeamsPresenterImpl,\n | \"formModelFactory\"\n | \"listTeamsUseCase\"\n | \"getTeamUseCase\"\n | \"createTeamUseCase\"\n | \"updateTeamUseCase\"\n | \"deleteTeamUseCase\"\n | \"cache\"\n >(this, {\n formModelFactory: false,\n listTeamsUseCase: false,\n getTeamUseCase: false,\n createTeamUseCase: false,\n updateTeamUseCase: false,\n deleteTeamUseCase: false,\n cache: false,\n vm: computed\n });\n }\n\n get vm(): ITeamsPresenterViewModel {\n const team = this._selectedTeam;\n const systemTeam = team !== null && team.system === true;\n const pluginTeam = team !== null && (team.plugin ?? false);\n\n return {\n selectedTeam: this._selectedTeam,\n loading: this._loading,\n saving: this._saving,\n showForm: this._showForm,\n canModify: !systemTeam && !pluginTeam,\n form: this._form.vm\n };\n }\n\n get list(): ListPresenter.Interface<Team> {\n return this._listPresenter;\n }\n\n init(): void {\n const dataSource = new TeamsDataSource(this.listTeamsUseCase, this.cache);\n\n this._listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n limit: 1000\n });\n }\n\n async selectTeam(id: string): Promise<void> {\n runInAction(() => {\n this._loading = true;\n this._showForm = true;\n this._isNew = false;\n });\n\n try {\n const team = await this.getTeamUseCase.execute(id);\n const systemTeam = team.system === true;\n const pluginTeam = team.plugin ?? false;\n const canModify = !systemTeam && !pluginTeam;\n\n runInAction(() => {\n this._selectedTeam = team;\n this._form = this.buildForm(false, canModify);\n this._form.setData({\n name: team.name,\n slug: team.slug,\n description: team.description,\n roles: team.roles || []\n });\n });\n } finally {\n runInAction(() => {\n this._loading = false;\n });\n }\n }\n\n createNew(): void {\n this._selectedTeam = null;\n this._isNew = true;\n this._form = this.buildForm(true, true);\n this._showForm = true;\n }\n\n deselect(): void {\n this._selectedTeam = null;\n this._showForm = false;\n }\n\n async save(): Promise<Team | null> {\n const data = await this._form.submit();\n if (!data) {\n return null;\n }\n\n runInAction(() => {\n this._saving = true;\n });\n\n try {\n const roles = ((data.roles as any[]) || []).map((r: any) =>\n typeof r === \"string\" ? r : r.id\n );\n const isUpdate = this._selectedTeam !== null && this._selectedTeam.createdOn;\n\n if (isUpdate) {\n const team = await this.updateTeamUseCase.execute(this._selectedTeam!.id, {\n name: data.name as string,\n description: data.description as string,\n roles\n });\n runInAction(() => {\n this._selectedTeam = team;\n });\n return team;\n } else {\n const team = await this.createTeamUseCase.execute({\n name: data.name as string,\n slug: data.slug as string,\n description: data.description as string,\n roles\n });\n runInAction(() => {\n this._selectedTeam = team;\n this._isNew = false;\n this._form = this.buildForm(false, true);\n this._form.setData({\n name: team.name,\n slug: team.slug,\n description: team.description,\n roles: team.roles || []\n });\n });\n return team;\n }\n } catch {\n return null;\n } finally {\n runInAction(() => {\n this._saving = false;\n });\n }\n }\n\n async deleteTeam(id: string): Promise<void> {\n await this.deleteTeamUseCase.execute(id);\n\n runInAction(() => {\n if (this._selectedTeam !== null && this._selectedTeam.id === id) {\n this._selectedTeam = null;\n this._showForm = false;\n }\n });\n }\n\n private buildForm(isNew: boolean, canModify: boolean): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n name: fields\n .text()\n .label(\"Name\")\n .required(\"Name is required.\")\n .disabled(!canModify)\n .onBlur((value, { form }) => {\n const slugValue = form.field(\"slug\").getValue();\n if (slugValue || !value) {\n return;\n }\n form.field(\"slug\").setValue(\n slugify(String(value), {\n replacement: \"-\",\n lower: true,\n remove: /[*#?<>_{}[\\]+~.()'\"!:;@]/g,\n trim: false\n })\n );\n }),\n slug: fields\n .text()\n .label(\"Slug\")\n .required(\"Slug is required.\")\n .disabled(!isNew || !canModify),\n description: fields\n .text()\n .label(\"Description\")\n .renderer(\"textarea\")\n .defaultValue(\"\")\n .disabled(!canModify),\n roles: fields\n .rolesMultiSelect()\n .label(\"Roles\")\n .required(\"Roles are required.\")\n .disabled(!canModify)\n }),\n layout: layout => [\n layout.row(\"name\", \"slug\"),\n layout.row(\"description\"),\n layout.row(\"roles\")\n ]\n });\n }\n}\n\nexport const TeamsPresenter = Abstraction.createImplementation({\n implementation: TeamsPresenterImpl,\n dependencies: [\n ListPresenter,\n FormModelFactory,\n ListTeamsUseCase,\n GetTeamUseCase,\n CreateTeamUseCase,\n UpdateTeamUseCase,\n DeleteTeamUseCase,\n TeamsListCache\n ]\n});\n"],"names":["TeamsPresenterImpl","_listPresenter","formModelFactory","listTeamsUseCase","getTeamUseCase","createTeamUseCase","updateTeamUseCase","deleteTeamUseCase","cache","makeAutoObservable","computed","team","systemTeam","pluginTeam","dataSource","TeamsDataSource","id","runInAction","canModify","data","roles","r","isUpdate","isNew","fields","value","form","slugValue","slugify","String","layout","TeamsPresenter","Abstraction","ListPresenter","FormModelFactory","ListTeamsUseCase","GetTeamUseCase","CreateTeamUseCase","UpdateTeamUseCase","DeleteTeamUseCase","TeamsListCache"],"mappings":"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"}
1
+ {"version":3,"file":"presentation/accessManagement/teams/TeamsPresenter.js","sources":["../../../../src/presentation/accessManagement/teams/TeamsPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport slugify from \"slugify\";\nimport { ListPresenter } from \"~/presentation/listPresenter/abstractions.js\";\nimport { FormModelFactory } from \"~/features/formModel/abstractions.js\";\nimport type { IFormModel } from \"~/features/formModel/abstractions.js\";\nimport type { Team } from \"~/features/accessManagement/types.js\";\nimport {\n ListTeamsUseCase,\n TeamsListCache\n} from \"~/features/accessManagement/teams/listTeams/abstractions.js\";\nimport { GetTeamUseCase } from \"~/features/accessManagement/teams/getTeam/abstractions.js\";\nimport { CreateTeamUseCase } from \"~/features/accessManagement/teams/createTeam/abstractions.js\";\nimport { UpdateTeamUseCase } from \"~/features/accessManagement/teams/updateTeam/abstractions.js\";\nimport { DeleteTeamUseCase } from \"~/features/accessManagement/teams/deleteTeam/abstractions.js\";\nimport {\n TeamsPresenter as Abstraction,\n type ITeamsPresenter,\n type ITeamsPresenterViewModel\n} from \"./abstractions.js\";\nimport { TeamsDataSource } from \"./TeamsDataSource.js\";\n\nclass TeamsPresenterImpl implements ITeamsPresenter {\n private _selectedTeam: Team | null = null;\n private _loading = false;\n private _saving = false;\n private _showForm = false;\n private _form: IFormModel;\n private _isNew = false;\n\n constructor(\n private _listPresenter: ListPresenter.Interface<Team>,\n private formModelFactory: FormModelFactory.Interface,\n private listTeamsUseCase: ListTeamsUseCase.Interface,\n private getTeamUseCase: GetTeamUseCase.Interface,\n private createTeamUseCase: CreateTeamUseCase.Interface,\n private updateTeamUseCase: UpdateTeamUseCase.Interface,\n private deleteTeamUseCase: DeleteTeamUseCase.Interface,\n private cache: TeamsListCache.Interface\n ) {\n this._form = this.buildForm(false, true);\n makeAutoObservable<\n TeamsPresenterImpl,\n | \"formModelFactory\"\n | \"listTeamsUseCase\"\n | \"getTeamUseCase\"\n | \"createTeamUseCase\"\n | \"updateTeamUseCase\"\n | \"deleteTeamUseCase\"\n | \"cache\"\n >(this, {\n formModelFactory: false,\n listTeamsUseCase: false,\n getTeamUseCase: false,\n createTeamUseCase: false,\n updateTeamUseCase: false,\n deleteTeamUseCase: false,\n cache: false,\n vm: computed\n });\n }\n\n get vm(): ITeamsPresenterViewModel {\n const team = this._selectedTeam;\n const systemTeam = team !== null && team.system === true;\n const pluginTeam = team !== null && (team.plugin ?? false);\n\n return {\n selectedTeam: this._selectedTeam,\n loading: this._loading,\n saving: this._saving,\n showForm: this._showForm,\n canModify: !systemTeam && !pluginTeam,\n form: this._form.vm\n };\n }\n\n get list(): ListPresenter.Interface<Team> {\n return this._listPresenter;\n }\n\n init(): void {\n const dataSource = new TeamsDataSource(this.listTeamsUseCase, this.cache);\n\n this._listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n limit: 1000\n });\n }\n\n async selectTeam(id: string): Promise<void> {\n runInAction(() => {\n this._loading = true;\n this._showForm = true;\n this._isNew = false;\n });\n\n try {\n const team = await this.getTeamUseCase.execute(id);\n const systemTeam = team.system === true;\n const pluginTeam = team.plugin ?? false;\n const canModify = !systemTeam && !pluginTeam;\n\n runInAction(() => {\n this._selectedTeam = team;\n this._form = this.buildForm(false, canModify);\n this._form.setData({\n name: team.name,\n slug: team.slug,\n description: team.description,\n roles: team.roles || []\n });\n });\n } finally {\n runInAction(() => {\n this._loading = false;\n });\n }\n }\n\n createNew(): void {\n this._selectedTeam = null;\n this._isNew = true;\n this._form = this.buildForm(true, true);\n this._showForm = true;\n }\n\n deselect(): void {\n this._selectedTeam = null;\n this._showForm = false;\n }\n\n async save(): Promise<Team | null> {\n const data = await this._form.submit();\n if (!data) {\n return null;\n }\n\n runInAction(() => {\n this._saving = true;\n });\n\n try {\n const roles = ((data.roles as any[]) || []).map((r: any) =>\n typeof r === \"string\" ? r : r.id\n );\n const isUpdate = this._selectedTeam !== null && this._selectedTeam.createdOn;\n\n if (isUpdate) {\n const team = await this.updateTeamUseCase.execute(this._selectedTeam!.id, {\n name: data.name as string,\n description: data.description as string,\n roles\n });\n runInAction(() => {\n this._selectedTeam = team;\n });\n return team;\n } else {\n const team = await this.createTeamUseCase.execute({\n name: data.name as string,\n slug: data.slug as string,\n description: data.description as string,\n roles\n });\n runInAction(() => {\n this._selectedTeam = team;\n this._isNew = false;\n this._form = this.buildForm(false, true);\n this._form.setData({\n name: team.name,\n slug: team.slug,\n description: team.description,\n roles: team.roles || []\n });\n });\n return team;\n }\n } catch {\n return null;\n } finally {\n runInAction(() => {\n this._saving = false;\n });\n }\n }\n\n async deleteTeam(id: string): Promise<void> {\n await this.deleteTeamUseCase.execute(id);\n\n runInAction(() => {\n if (this._selectedTeam !== null && this._selectedTeam.id === id) {\n this._selectedTeam = null;\n this._showForm = false;\n }\n });\n }\n\n private buildForm(isNew: boolean, canModify: boolean): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n name: fields\n .text()\n .label(\"Name\")\n .required(\"Name is required.\")\n .disabled(!canModify)\n .onBlur((value, { form }) => {\n const slugValue = form.field(\"slug\").getValue();\n if (slugValue || !value) {\n return;\n }\n form.field(\"slug\").setValue(\n slugify(String(value), {\n replacement: \"-\",\n lower: true,\n remove: /[*#?<>_{}[\\]+~.()'\"!:;@]/g,\n trim: false\n })\n );\n }),\n slug: fields\n .text()\n .label(\"Slug\")\n .required(\"Slug is required.\")\n .disabled(!isNew || !canModify),\n description: fields\n .text()\n .label(\"Description\")\n .renderer(\"textarea\")\n .defaultValue(\"\")\n .disabled(!canModify),\n roles: fields\n .rolesMultiSelect()\n .label(\"Roles\")\n .required(\"Roles are required.\")\n .disabled(!canModify)\n }),\n layout: layout => [\n layout.row(\"name\", \"slug\"),\n layout.row(\"description\"),\n layout.row(\"roles\")\n ]\n });\n }\n}\n\nexport const TeamsPresenter = Abstraction.createImplementation({\n implementation: TeamsPresenterImpl,\n dependencies: [\n ListPresenter,\n FormModelFactory,\n ListTeamsUseCase,\n GetTeamUseCase,\n CreateTeamUseCase,\n UpdateTeamUseCase,\n DeleteTeamUseCase,\n TeamsListCache\n ]\n});\n"],"names":["TeamsPresenterImpl","_listPresenter","formModelFactory","listTeamsUseCase","getTeamUseCase","createTeamUseCase","updateTeamUseCase","deleteTeamUseCase","cache","makeAutoObservable","computed","team","systemTeam","pluginTeam","dataSource","TeamsDataSource","id","runInAction","canModify","data","roles","r","isUpdate","isNew","fields","value","form","slugValue","slugify","String","layout","TeamsPresenter","Abstraction","ListPresenter","FormModelFactory","ListTeamsUseCase","GetTeamUseCase","CreateTeamUseCase","UpdateTeamUseCase","DeleteTeamUseCase","TeamsListCache"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const TeamsView: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const TeamsView: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -2,7 +2,7 @@ import React from "react";
2
2
  interface SystemInstallerProps {
3
3
  children: React.ReactNode;
4
4
  }
5
- export declare const SystemInstaller: (({ children }: SystemInstallerProps) => React.JSX.Element) & {
6
- displayName: string;
5
+ export declare const SystemInstaller: (({ children }: SystemInstallerProps) => React.JSX.Element) & React.NamedExoticComponent<SystemInstallerProps> & {
6
+ readonly type: ({ children }: SystemInstallerProps) => React.JSX.Element;
7
7
  };
8
8
  export {};
@@ -1,4 +1,4 @@
1
- import { action, computed, makeObservable, observable } from "mobx";
1
+ import { action, computed, makeObservable, observableRef } from "mobx";
2
2
  class QueryMatcher {
3
3
  constructor(config){
4
4
  this.config = config;
@@ -8,8 +8,8 @@ class QueryMatcher {
8
8
  this.localFilterKeys = new Set(Object.keys(config.localFilters));
9
9
  this.getSortValue = config.getSortValue ?? getValueByPath;
10
10
  makeObservable(this, {
11
- _matcher: observable.ref,
12
- _view: observable.ref,
11
+ _matcher: observableRef,
12
+ _view: observableRef,
13
13
  matcher: computed,
14
14
  updateFromQuery: action,
15
15
  appendResultKeys: action
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/listPresenter/QueryMatcher.js","sources":["../../../src/presentation/listPresenter/QueryMatcher.ts"],"sourcesContent":["import { makeObservable, observable, computed, action } from \"mobx\";\nimport type { IDataSourceQuery } from \"./abstractions.js\";\n\ntype ItemPredicate<TRow> = (item: TRow, value: unknown) => boolean;\n\ntype SortValueGetter<TRow> = (item: TRow, field: string) => unknown;\n\nexport interface QueryMatcherConfig<TRow> {\n keyField: keyof TRow & string;\n localFilters: Record<string, ItemPredicate<TRow>>;\n /**\n * Reads the value of a sort field from an item. Defaults to a dot-path lookup\n * (e.g. `savedOn`, `values.title`). Override when the query's sort field name\n * does not match the item's shape.\n */\n getSortValue?: SortValueGetter<TRow>;\n}\n\n/**\n * Decides which cached items belong in the current view.\n *\n * A DataSource backed by a shared cache (e.g., per-model entry cache) needs to\n * filter cached items to only those matching the active query. QueryMatcher does\n * this by splitting filters into two categories:\n *\n * - **Local filters** (e.g., folderId, status) — evaluated client-side against\n * each item using predicates provided via `localFilters` config. Used when\n * browsing without search or server-side filters.\n *\n * - **Server-side filters** (search, advanced search, any filter key not in\n * `localFilters`) — cannot be evaluated locally. Instead, QueryMatcher tracks\n * the set of item keys returned by the last server query (`_queryResultKeys`)\n * and restricts the view to those items.\n *\n * The `matcher` getter is MobX-computed, so any DataSource `rows` getter that\n * reads it will recompute when the matcher changes after a query.\n *\n * Usage:\n * ```ts\n * const matcher = new QueryMatcher<MyItem>({\n * keyField: \"id\",\n * localFilters: {\n * folderId: (item, value) => item.folderId === value,\n * status: (item, value) => item.status === value,\n * }\n * });\n *\n * // In DataSource.query(), after fetching:\n * matcher.updateFromQuery(params, result.data.map(item => item.id), result.meta.hasMoreItems);\n *\n * // In DataSource.rows getter (filters, sorts by the applied sort, and cuts off at the\n * // last loaded item):\n * return matcher.select(cache.getItems());\n * ```\n */\nexport class QueryMatcher<TRow> {\n private _queryResultKeys: Set<string> | null = null;\n private _matcher: (item: TRow) => boolean = () => true;\n private localFilterKeys: Set<string>;\n private getSortValue: SortValueGetter<TRow>;\n\n // Ordering state of the current view: the keys the server returned for the active\n // query (in server order, extended by `appendResultKeys`), the applied sort, and\n // whether the server has more items beyond the loaded ones.\n private _view: {\n resultKeys: string[];\n sort: IDataSourceQuery[\"sort\"];\n searching: boolean;\n hasMore: boolean;\n } | null = null;\n\n constructor(private config: QueryMatcherConfig<TRow>) {\n this.localFilterKeys = new Set(Object.keys(config.localFilters));\n this.getSortValue = config.getSortValue ?? getValueByPath;\n\n makeObservable<QueryMatcher<TRow>, \"_matcher\" | \"_view\">(this, {\n _matcher: observable.ref,\n _view: observable.ref,\n matcher: computed,\n updateFromQuery: action,\n appendResultKeys: action\n });\n }\n\n get matcher(): (item: TRow) => boolean {\n return this._matcher;\n }\n\n filter(items: TRow[]): TRow[] {\n return items.filter(this._matcher);\n }\n\n /**\n * Returns the items that belong in the current view, in the view's order.\n *\n * The cache is shared by views with different sorts, so its order means nothing to\n * this view. Instead, matching items are sorted by the applied sort (ties keep the\n * server order), and the result is cut off after the last item the server returned\n * for this view. That keeps locally created or updated items in their sort position,\n * and hides cached items that sort past the loaded pages until pagination reaches them.\n *\n * While searching, the server's (relevance) order is kept as is.\n */\n select(items: TRow[]): TRow[] {\n const matched = this.filter(items);\n const view = this._view;\n if (!view) {\n return matched;\n }\n\n const serverIndex = new Map(view.resultKeys.map((key, index) => [key, index]));\n // Items the server did not return for this view (cached by other views, or created\n // locally) sort after the server's items among equal sort values.\n const indexOf = (item: TRow) =>\n serverIndex.get(this.getKey(item)) ?? Number.POSITIVE_INFINITY;\n\n const sort = view.searching ? undefined : view.sort;\n const sorted = [...matched].sort((a, b) => {\n if (sort) {\n const result = compareValues(\n this.getSortValue(a, sort.field),\n this.getSortValue(b, sort.field)\n );\n if (result !== 0) {\n return sort.direction === \"ASC\" ? result : -result;\n }\n }\n const left = indexOf(a);\n const right = indexOf(b);\n return left === right ? 0 : left < right ? -1 : 1;\n });\n\n if (!view.hasMore) {\n return sorted;\n }\n\n let lastLoaded = -1;\n sorted.forEach((item, index) => {\n if (serverIndex.has(this.getKey(item))) {\n lastLoaded = index;\n }\n });\n\n return lastLoaded < 0 ? sorted : sorted.slice(0, lastLoaded + 1);\n }\n\n private getKey(item: TRow): string {\n return String(item[this.config.keyField]);\n }\n\n hasServerSideFilters(params: IDataSourceQuery): boolean {\n if (params.search) {\n return true;\n }\n const filters = params.filters ?? {};\n return Object.keys(filters).some(key => !this.localFilterKeys.has(key));\n }\n\n updateFromQuery(params: IDataSourceQuery, resultKeys: string[], hasMore = false): void {\n if (this.hasServerSideFilters(params)) {\n this._queryResultKeys = new Set(resultKeys);\n } else {\n this._queryResultKeys = null;\n }\n this._matcher = this.buildMatcher(params);\n this._view = {\n resultKeys: [...resultKeys],\n sort: params.sort,\n searching: !!params.search,\n hasMore\n };\n }\n\n appendResultKeys(keys: string[], hasMore = false): void {\n if (this._queryResultKeys) {\n for (const key of keys) {\n this._queryResultKeys.add(key);\n }\n }\n if (this._view) {\n this._view = {\n ...this._view,\n resultKeys: [...this._view.resultKeys, ...keys],\n hasMore\n };\n }\n }\n\n private buildMatcher(params: IDataSourceQuery): (item: TRow) => boolean {\n const filters = params.filters ?? {};\n const queryResultKeys = this._queryResultKeys;\n const isSearching = !!params.search;\n const { keyField, localFilters } = this.config;\n\n const activeLocalFilters: Array<{ predicate: ItemPredicate<TRow>; value: unknown }> = [];\n for (const [key, predicate] of Object.entries(localFilters)) {\n const value = filters[key];\n if (value !== undefined && value !== null) {\n activeLocalFilters.push({ predicate, value });\n }\n }\n\n return (item: TRow) => {\n if (queryResultKeys) {\n if (!queryResultKeys.has(String(item[keyField]))) {\n return false;\n }\n } else if (!isSearching) {\n for (const { predicate, value } of activeLocalFilters) {\n if (!predicate(item, value)) {\n return false;\n }\n }\n }\n\n return true;\n };\n }\n}\n\nfunction getValueByPath(item: unknown, path: string): unknown {\n let current: unknown = item;\n for (const part of path.split(\".\")) {\n if (current === null || current === undefined || typeof current !== \"object\") {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/**\n * Compares two sort values in ascending order, the same way the DDB and SQL storage sort\n * entries: `null` and `undefined` sort last (so first in descending order), and an empty\n * string is a regular string. Strings are compared by code point, which keeps ISO dates in\n * chronological order.\n */\nfunction compareValues(a: unknown, b: unknown): number {\n const aEmpty = a === null || a === undefined;\n const bEmpty = b === null || b === undefined;\n if (aEmpty || bEmpty) {\n return aEmpty === bEmpty ? 0 : aEmpty ? 1 : -1;\n }\n\n const left = a instanceof Date ? a.getTime() : a;\n const right = b instanceof Date ? b.getTime() : b;\n\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n if (typeof left === \"boolean\" && typeof right === \"boolean\") {\n return Number(left) - Number(right);\n }\n\n const leftString = String(left);\n const rightString = String(right);\n return leftString < rightString ? -1 : leftString > rightString ? 1 : 0;\n}\n"],"names":["QueryMatcher","config","Set","Object","getValueByPath","makeObservable","observable","computed","action","items","matched","view","serverIndex","Map","key","index","indexOf","item","Number","sort","undefined","sorted","a","b","result","compareValues","left","right","lastLoaded","String","params","filters","resultKeys","hasMore","keys","queryResultKeys","isSearching","keyField","localFilters","activeLocalFilters","predicate","value","path","current","part","aEmpty","bEmpty","Date","leftString","rightString"],"mappings":"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"}
1
+ {"version":3,"file":"presentation/listPresenter/QueryMatcher.js","sources":["../../../src/presentation/listPresenter/QueryMatcher.ts"],"sourcesContent":["import { makeObservable, observableRef, computed, action } from \"mobx\";\nimport type { IDataSourceQuery } from \"./abstractions.js\";\n\ntype ItemPredicate<TRow> = (item: TRow, value: unknown) => boolean;\n\ntype SortValueGetter<TRow> = (item: TRow, field: string) => unknown;\n\nexport interface QueryMatcherConfig<TRow> {\n keyField: keyof TRow & string;\n localFilters: Record<string, ItemPredicate<TRow>>;\n /**\n * Reads the value of a sort field from an item. Defaults to a dot-path lookup\n * (e.g. `savedOn`, `values.title`). Override when the query's sort field name\n * does not match the item's shape.\n */\n getSortValue?: SortValueGetter<TRow>;\n}\n\n/**\n * Decides which cached items belong in the current view.\n *\n * A DataSource backed by a shared cache (e.g., per-model entry cache) needs to\n * filter cached items to only those matching the active query. QueryMatcher does\n * this by splitting filters into two categories:\n *\n * - **Local filters** (e.g., folderId, status) — evaluated client-side against\n * each item using predicates provided via `localFilters` config. Used when\n * browsing without search or server-side filters.\n *\n * - **Server-side filters** (search, advanced search, any filter key not in\n * `localFilters`) — cannot be evaluated locally. Instead, QueryMatcher tracks\n * the set of item keys returned by the last server query (`_queryResultKeys`)\n * and restricts the view to those items.\n *\n * The `matcher` getter is MobX-computed, so any DataSource `rows` getter that\n * reads it will recompute when the matcher changes after a query.\n *\n * Usage:\n * ```ts\n * const matcher = new QueryMatcher<MyItem>({\n * keyField: \"id\",\n * localFilters: {\n * folderId: (item, value) => item.folderId === value,\n * status: (item, value) => item.status === value,\n * }\n * });\n *\n * // In DataSource.query(), after fetching:\n * matcher.updateFromQuery(params, result.data.map(item => item.id), result.meta.hasMoreItems);\n *\n * // In DataSource.rows getter (filters, sorts by the applied sort, and cuts off at the\n * // last loaded item):\n * return matcher.select(cache.getItems());\n * ```\n */\nexport class QueryMatcher<TRow> {\n private _queryResultKeys: Set<string> | null = null;\n private _matcher: (item: TRow) => boolean = () => true;\n private localFilterKeys: Set<string>;\n private getSortValue: SortValueGetter<TRow>;\n\n // Ordering state of the current view: the keys the server returned for the active\n // query (in server order, extended by `appendResultKeys`), the applied sort, and\n // whether the server has more items beyond the loaded ones.\n private _view: {\n resultKeys: string[];\n sort: IDataSourceQuery[\"sort\"];\n searching: boolean;\n hasMore: boolean;\n } | null = null;\n\n constructor(private config: QueryMatcherConfig<TRow>) {\n this.localFilterKeys = new Set(Object.keys(config.localFilters));\n this.getSortValue = config.getSortValue ?? getValueByPath;\n\n makeObservable<QueryMatcher<TRow>, \"_matcher\" | \"_view\">(this, {\n _matcher: observableRef,\n _view: observableRef,\n matcher: computed,\n updateFromQuery: action,\n appendResultKeys: action\n });\n }\n\n get matcher(): (item: TRow) => boolean {\n return this._matcher;\n }\n\n filter(items: TRow[]): TRow[] {\n return items.filter(this._matcher);\n }\n\n /**\n * Returns the items that belong in the current view, in the view's order.\n *\n * The cache is shared by views with different sorts, so its order means nothing to\n * this view. Instead, matching items are sorted by the applied sort (ties keep the\n * server order), and the result is cut off after the last item the server returned\n * for this view. That keeps locally created or updated items in their sort position,\n * and hides cached items that sort past the loaded pages until pagination reaches them.\n *\n * While searching, the server's (relevance) order is kept as is.\n */\n select(items: TRow[]): TRow[] {\n const matched = this.filter(items);\n const view = this._view;\n if (!view) {\n return matched;\n }\n\n const serverIndex = new Map(view.resultKeys.map((key, index) => [key, index]));\n // Items the server did not return for this view (cached by other views, or created\n // locally) sort after the server's items among equal sort values.\n const indexOf = (item: TRow) =>\n serverIndex.get(this.getKey(item)) ?? Number.POSITIVE_INFINITY;\n\n const sort = view.searching ? undefined : view.sort;\n const sorted = [...matched].sort((a, b) => {\n if (sort) {\n const result = compareValues(\n this.getSortValue(a, sort.field),\n this.getSortValue(b, sort.field)\n );\n if (result !== 0) {\n return sort.direction === \"ASC\" ? result : -result;\n }\n }\n const left = indexOf(a);\n const right = indexOf(b);\n return left === right ? 0 : left < right ? -1 : 1;\n });\n\n if (!view.hasMore) {\n return sorted;\n }\n\n let lastLoaded = -1;\n sorted.forEach((item, index) => {\n if (serverIndex.has(this.getKey(item))) {\n lastLoaded = index;\n }\n });\n\n return lastLoaded < 0 ? sorted : sorted.slice(0, lastLoaded + 1);\n }\n\n private getKey(item: TRow): string {\n return String(item[this.config.keyField]);\n }\n\n hasServerSideFilters(params: IDataSourceQuery): boolean {\n if (params.search) {\n return true;\n }\n const filters = params.filters ?? {};\n return Object.keys(filters).some(key => !this.localFilterKeys.has(key));\n }\n\n updateFromQuery(params: IDataSourceQuery, resultKeys: string[], hasMore = false): void {\n if (this.hasServerSideFilters(params)) {\n this._queryResultKeys = new Set(resultKeys);\n } else {\n this._queryResultKeys = null;\n }\n this._matcher = this.buildMatcher(params);\n this._view = {\n resultKeys: [...resultKeys],\n sort: params.sort,\n searching: !!params.search,\n hasMore\n };\n }\n\n appendResultKeys(keys: string[], hasMore = false): void {\n if (this._queryResultKeys) {\n for (const key of keys) {\n this._queryResultKeys.add(key);\n }\n }\n if (this._view) {\n this._view = {\n ...this._view,\n resultKeys: [...this._view.resultKeys, ...keys],\n hasMore\n };\n }\n }\n\n private buildMatcher(params: IDataSourceQuery): (item: TRow) => boolean {\n const filters = params.filters ?? {};\n const queryResultKeys = this._queryResultKeys;\n const isSearching = !!params.search;\n const { keyField, localFilters } = this.config;\n\n const activeLocalFilters: Array<{ predicate: ItemPredicate<TRow>; value: unknown }> = [];\n for (const [key, predicate] of Object.entries(localFilters)) {\n const value = filters[key];\n if (value !== undefined && value !== null) {\n activeLocalFilters.push({ predicate, value });\n }\n }\n\n return (item: TRow) => {\n if (queryResultKeys) {\n if (!queryResultKeys.has(String(item[keyField]))) {\n return false;\n }\n } else if (!isSearching) {\n for (const { predicate, value } of activeLocalFilters) {\n if (!predicate(item, value)) {\n return false;\n }\n }\n }\n\n return true;\n };\n }\n}\n\nfunction getValueByPath(item: unknown, path: string): unknown {\n let current: unknown = item;\n for (const part of path.split(\".\")) {\n if (current === null || current === undefined || typeof current !== \"object\") {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/**\n * Compares two sort values in ascending order, the same way the DDB and SQL storage sort\n * entries: `null` and `undefined` sort last (so first in descending order), and an empty\n * string is a regular string. Strings are compared by code point, which keeps ISO dates in\n * chronological order.\n */\nfunction compareValues(a: unknown, b: unknown): number {\n const aEmpty = a === null || a === undefined;\n const bEmpty = b === null || b === undefined;\n if (aEmpty || bEmpty) {\n return aEmpty === bEmpty ? 0 : aEmpty ? 1 : -1;\n }\n\n const left = a instanceof Date ? a.getTime() : a;\n const right = b instanceof Date ? b.getTime() : b;\n\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n if (typeof left === \"boolean\" && typeof right === \"boolean\") {\n return Number(left) - Number(right);\n }\n\n const leftString = String(left);\n const rightString = String(right);\n return leftString < rightString ? -1 : leftString > rightString ? 1 : 0;\n}\n"],"names":["QueryMatcher","config","Set","Object","getValueByPath","makeObservable","observableRef","computed","action","items","matched","view","serverIndex","Map","key","index","indexOf","item","Number","sort","undefined","sorted","a","b","result","compareValues","left","right","lastLoaded","String","params","filters","resultKeys","hasMore","keys","queryResultKeys","isSearching","keyField","localFilters","activeLocalFilters","predicate","value","path","current","part","aEmpty","bEmpty","Date","leftString","rightString"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const BulkActionsDeleteItems: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const BulkActionsDeleteItems: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
- export declare const BulkActionsRestoreItems: (() => React.JSX.Element) & {
3
- displayName: string;
2
+ export declare const BulkActionsRestoreItems: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element;
4
4
  };
@@ -6,7 +6,7 @@ interface TrashBinOverlayProps {
6
6
  onExited: () => void;
7
7
  onItemAfterRestore?: (item: TrashBinItem) => Promise<void>;
8
8
  }
9
- export declare const TrashBinOverlay: (({ presenter, title, onExited, onItemAfterRestore }: TrashBinOverlayProps) => React.JSX.Element) & {
10
- displayName: string;
9
+ export declare const TrashBinOverlay: (({ presenter, title, onExited, onItemAfterRestore }: TrashBinOverlayProps) => React.JSX.Element) & React.NamedExoticComponent<TrashBinOverlayProps> & {
10
+ readonly type: ({ presenter, title, onExited, onItemAfterRestore }: TrashBinOverlayProps) => React.JSX.Element;
11
11
  };
12
12
  export {};