@webiny/app-record-locking 0.0.0-unstable.e622468070 → 0.0.0-unstable.e6f0dc8ca7

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 (34) hide show
  1. package/components/HeadlessCmsContentEntry/ContentEntryLocker.d.ts +1 -1
  2. package/components/HeadlessCmsContentEntry/ContentEntryLocker.js +4 -11
  3. package/components/HeadlessCmsContentEntry/ContentEntryLocker.js.map +1 -1
  4. package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js +10 -31
  5. package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js.map +1 -1
  6. package/components/SecurityPermissions.d.ts +2 -0
  7. package/components/SecurityPermissions.js +18 -0
  8. package/components/SecurityPermissions.js.map +1 -0
  9. package/domain/RecordLocking.js.map +1 -1
  10. package/domain/RecordLockingGetLockedEntryLockRecord.js.map +1 -1
  11. package/domain/RecordLockingLockEntry.js +1 -1
  12. package/domain/RecordLockingLockEntry.js.map +1 -1
  13. package/domain/permissionsSchema.d.ts +6 -0
  14. package/domain/permissionsSchema.js +9 -0
  15. package/domain/permissionsSchema.js.map +1 -0
  16. package/features/permissions/abstractions.d.ts +17 -0
  17. package/features/permissions/abstractions.js +5 -0
  18. package/features/permissions/abstractions.js.map +1 -0
  19. package/features/permissions/feature.d.ts +14 -0
  20. package/features/permissions/feature.js +6 -0
  21. package/features/permissions/feature.js.map +1 -0
  22. package/hooks/usePermission.js +1 -1
  23. package/hooks/usePermission.js.map +1 -1
  24. package/index.js +6 -4
  25. package/index.js.map +1 -1
  26. package/package.json +21 -20
  27. package/types.d.ts +1 -1
  28. package/types.js.map +1 -1
  29. package/components/permissionRenderer/RecordLockingPermissions.d.ts +0 -7
  30. package/components/permissionRenderer/RecordLockingPermissions.js +0 -71
  31. package/components/permissionRenderer/RecordLockingPermissions.js.map +0 -1
  32. package/components/permissionRenderer/index.d.ts +0 -2
  33. package/components/permissionRenderer/index.js +0 -21
  34. package/components/permissionRenderer/index.js.map +0 -1
@@ -6,7 +6,7 @@ export interface IContentEntryLockerProps {
6
6
  entry: CmsContentEntry;
7
7
  model: CmsModel;
8
8
  onEntryUnlocked: () => void;
9
- onDisablePrompt: (flag: boolean) => void;
9
+ onDisablePrompt: () => void;
10
10
  children: React.ReactElement;
11
11
  }
12
12
  export interface IKickOutWebsocketsMessage extends IncomingGenericData {
@@ -4,11 +4,6 @@ import { useWebsockets } from "@webiny/app-websockets";
4
4
  import { parseIdentifier } from "@webiny/utils";
5
5
  import { useDialogs } from "@webiny/app-admin";
6
6
  const autoUpdateTimeout = 20;
7
- const ForceUnlocked = ({
8
- user
9
- }) => {
10
- return /*#__PURE__*/React.createElement(React.Fragment, null, "The entry you were editing was forcefully unlocked by", " ", /*#__PURE__*/React.createElement("strong", null, user.displayName || "Unknown user"), ". Unfortunately, this means you lost the unsaved changes.");
11
- };
12
7
  export const ContentEntryLocker = ({
13
8
  onEntryUnlocked,
14
9
  onDisablePrompt,
@@ -36,19 +31,17 @@ export const ContentEntryLocker = ({
36
31
  const {
37
32
  user
38
33
  } = incoming.data;
39
- onDisablePrompt(true);
34
+ onDisablePrompt();
40
35
  removeEntryLock({
41
36
  id: entryId,
42
37
  $lockingType: model.modelId
43
38
  });
44
39
  showDialog({
45
40
  title: "Entry was forcefully unlocked!",
46
- content: /*#__PURE__*/React.createElement(ForceUnlocked, {
47
- user: user
48
- }),
41
+ content: /*#__PURE__*/React.createElement(React.Fragment, null, "The entry you were editing was forcefully unlocked by", " ", /*#__PURE__*/React.createElement("strong", null, user.displayName || "Unknown user"), ". Unfortunately, this means you lost the unsaved changes."),
49
42
  acceptLabel: "Ok",
50
43
  onClose: undefined,
51
- cancelLabel: undefined
44
+ cancelLabel: null
52
45
  });
53
46
  onEntryUnlocked();
54
47
  });
@@ -79,7 +72,7 @@ export const ContentEntryLocker = ({
79
72
  content: result.error.message,
80
73
  acceptLabel: "Ok",
81
74
  onClose: undefined,
82
- cancelLabel: undefined
75
+ cancelLabel: null
83
76
  });
84
77
  onEntryUnlocked();
85
78
  return;
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useRef","useRecordLocking","useWebsockets","parseIdentifier","useDialogs","autoUpdateTimeout","ForceUnlocked","user","createElement","Fragment","displayName","ContentEntryLocker","onEntryUnlocked","onDisablePrompt","entry","model","children","updateEntryLock","removeEntryLock","websockets","showDialog","entryLockerTimeout","id","entryId","onMessageSub","onMessage","incoming","data","$lockingType","modelId","title","content","acceptLabel","onClose","undefined","cancelLabel","off","current","updateLock","result","error","message","createTimeout","window","setTimeout","clearTimeout"],"sources":["ContentEntryLocker.tsx"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { useRecordLocking } from \"~/hooks/index.js\";\nimport type { IRecordLockingIdentity, IRecordLockingLockRecord } from \"~/types.js\";\nimport type { IncomingGenericData } from \"@webiny/app-websockets\";\nimport { useWebsockets } from \"@webiny/app-websockets\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { useDialogs } from \"@webiny/app-admin\";\nimport type { CmsContentEntry, CmsModel } from \"@webiny/app-headless-cms/types.js\";\n\nconst autoUpdateTimeout = 20;\n\nexport interface IContentEntryLockerProps {\n entry: CmsContentEntry;\n model: CmsModel;\n onEntryUnlocked: () => void;\n onDisablePrompt: (flag: boolean) => void;\n children: React.ReactElement;\n}\n\nexport interface IKickOutWebsocketsMessage extends IncomingGenericData {\n data: {\n record: IRecordLockingLockRecord;\n user: IRecordLockingIdentity;\n };\n}\ninterface IForceUnlockedProps {\n user: IRecordLockingIdentity;\n}\nconst ForceUnlocked = ({ user }: IForceUnlockedProps) => {\n return (\n <>\n The entry you were editing was forcefully unlocked by{\" \"}\n <strong>{user.displayName || \"Unknown user\"}</strong>. Unfortunately, this means you\n lost the unsaved changes.\n </>\n );\n};\n\nexport const ContentEntryLocker = ({\n onEntryUnlocked,\n onDisablePrompt,\n entry,\n model,\n children\n}: IContentEntryLockerProps) => {\n const { updateEntryLock, removeEntryLock } = useRecordLocking();\n const websockets = useWebsockets();\n const { showDialog } = useDialogs();\n\n const entryLockerTimeout = useRef<number | null>(null);\n\n useEffect(() => {\n if (!entry.id) {\n return;\n }\n const { id: entryId } = parseIdentifier(entry.id);\n\n let onMessageSub = websockets.onMessage<IKickOutWebsocketsMessage>(\n `recordLocking.entry.kickOut.${entryId}`,\n async incoming => {\n const { user } = incoming.data;\n onDisablePrompt(true);\n removeEntryLock({\n id: entryId,\n $lockingType: model.modelId\n });\n showDialog({\n title: \"Entry was forcefully unlocked!\",\n content: <ForceUnlocked user={user} />,\n acceptLabel: \"Ok\",\n onClose: undefined,\n cancelLabel: undefined\n });\n onEntryUnlocked();\n }\n );\n\n return () => {\n onMessageSub.off();\n /**\n * Lets null subscriptions, just in case it...\n */\n // @ts-expect-error\n onMessageSub = null;\n };\n }, [entry.id, onEntryUnlocked, model.modelId]);\n\n useEffect(() => {\n if (!entry.id) {\n return;\n }\n\n if (entryLockerTimeout.current) {\n return;\n }\n\n const updateLock = async () => {\n const result = await updateEntryLock({\n id: entry.id,\n $lockingType: model.modelId\n });\n if (result.error) {\n showDialog({\n title: \"There was an error while updating the entry lock.\",\n content: result.error.message,\n acceptLabel: \"Ok\",\n onClose: undefined,\n cancelLabel: undefined\n });\n onEntryUnlocked();\n return;\n }\n createTimeout();\n };\n\n const createTimeout = () => {\n entryLockerTimeout.current = window.setTimeout(() => {\n updateLock();\n }, autoUpdateTimeout * 1000);\n };\n\n updateLock();\n return () => {\n if (!entryLockerTimeout.current) {\n return;\n }\n clearTimeout(entryLockerTimeout.current);\n entryLockerTimeout.current = null;\n };\n }, [entry.id, onEntryUnlocked]);\n\n return <>{children}</>;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","useRef","useRecordLocking","useWebsockets","parseIdentifier","useDialogs","autoUpdateTimeout","ContentEntryLocker","onEntryUnlocked","onDisablePrompt","entry","model","children","updateEntryLock","removeEntryLock","websockets","showDialog","entryLockerTimeout","id","entryId","onMessageSub","onMessage","incoming","user","data","$lockingType","modelId","title","content","createElement","Fragment","displayName","acceptLabel","onClose","undefined","cancelLabel","off","current","updateLock","result","error","message","createTimeout","window","setTimeout","clearTimeout"],"sources":["ContentEntryLocker.tsx"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { useRecordLocking } from \"~/hooks/index.js\";\nimport type { IRecordLockingIdentity, IRecordLockingLockRecord } from \"~/types.js\";\nimport type { IncomingGenericData } from \"@webiny/app-websockets\";\nimport { useWebsockets } from \"@webiny/app-websockets\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { useDialogs } from \"@webiny/app-admin\";\nimport type { CmsContentEntry, CmsModel } from \"@webiny/app-headless-cms/types.js\";\n\nconst autoUpdateTimeout = 20;\n\nexport interface IContentEntryLockerProps {\n entry: CmsContentEntry;\n model: CmsModel;\n onEntryUnlocked: () => void;\n onDisablePrompt: () => void;\n children: React.ReactElement;\n}\n\nexport interface IKickOutWebsocketsMessage extends IncomingGenericData {\n data: {\n record: IRecordLockingLockRecord;\n user: IRecordLockingIdentity;\n };\n}\n\nexport const ContentEntryLocker = ({\n onEntryUnlocked,\n onDisablePrompt,\n entry,\n model,\n children\n}: IContentEntryLockerProps) => {\n const { updateEntryLock, removeEntryLock } = useRecordLocking();\n const websockets = useWebsockets();\n const { showDialog } = useDialogs();\n\n const entryLockerTimeout = useRef<number | null>(null);\n\n useEffect(() => {\n if (!entry.id) {\n return;\n }\n const { id: entryId } = parseIdentifier(entry.id);\n\n let onMessageSub = websockets.onMessage<IKickOutWebsocketsMessage>(\n `recordLocking.entry.kickOut.${entryId}`,\n async incoming => {\n const { user } = incoming.data;\n onDisablePrompt();\n removeEntryLock({\n id: entryId,\n $lockingType: model.modelId\n });\n showDialog({\n title: \"Entry was forcefully unlocked!\",\n content: (\n <>\n The entry you were editing was forcefully unlocked by{\" \"}\n <strong>{user.displayName || \"Unknown user\"}</strong>. Unfortunately,\n this means you lost the unsaved changes.\n </>\n ),\n acceptLabel: \"Ok\",\n onClose: undefined,\n cancelLabel: null\n });\n onEntryUnlocked();\n }\n );\n\n return () => {\n onMessageSub.off();\n /**\n * Lets null subscriptions, just in case it...\n */\n // @ts-expect-error\n onMessageSub = null;\n };\n }, [entry.id, onEntryUnlocked, model.modelId]);\n\n useEffect(() => {\n if (!entry.id) {\n return;\n }\n\n if (entryLockerTimeout.current) {\n return;\n }\n\n const updateLock = async () => {\n const result = await updateEntryLock({\n id: entry.id,\n $lockingType: model.modelId\n });\n if (result.error) {\n showDialog({\n title: \"There was an error while updating the entry lock.\",\n content: result.error.message,\n acceptLabel: \"Ok\",\n onClose: undefined,\n cancelLabel: null\n });\n onEntryUnlocked();\n return;\n }\n createTimeout();\n };\n\n const createTimeout = () => {\n entryLockerTimeout.current = window.setTimeout(() => {\n updateLock();\n }, autoUpdateTimeout * 1000);\n };\n\n updateLock();\n return () => {\n if (!entryLockerTimeout.current) {\n return;\n }\n clearTimeout(entryLockerTimeout.current);\n entryLockerTimeout.current = null;\n };\n }, [entry.id, onEntryUnlocked]);\n\n return <>{children}</>;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import React, { useState } from "react";
2
- import { CompositionScope, createGenericContext, NavigationPrompt } from "@webiny/app-admin";
1
+ import React from "react";
2
+ import { useRouter } from "@webiny/app";
3
3
  import { ContentEntryEditorConfig, ContentEntryListConfig } from "@webiny/app-headless-cms";
4
4
  import { ContentEntryGuard } from "./ContentEntryGuard.js";
5
5
  import { ContentEntryLocker } from "./ContentEntryLocker.js";
@@ -7,22 +7,9 @@ const {
7
7
  ContentEntry,
8
8
  SingletonContentEntry
9
9
  } = ContentEntryEditorConfig;
10
- const DisablePrompt = createGenericContext("DisablePrompt");
11
- const PromptDecorator = NavigationPrompt.createDecorator(Original => {
12
- return function Prompt(props) {
13
- const {
14
- disablePrompt
15
- } = DisablePrompt.useHook();
16
- const when = disablePrompt === true ? false : props.when;
17
- return /*#__PURE__*/React.createElement(Original, {
18
- message: props.message,
19
- when: when
20
- });
21
- };
22
- });
23
10
  const ContentEntryDecorator = ContentEntry.createDecorator(Original => {
24
11
  return function RecordLockingContentEntry() {
25
- const [disablePrompt, setDisablePrompt] = useState(false);
12
+ const router = useRouter();
26
13
  const {
27
14
  entry,
28
15
  contentModel,
@@ -35,9 +22,7 @@ const ContentEntryDecorator = ContentEntry.createDecorator(Original => {
35
22
  * New entry does not have ID yet.
36
23
  */
37
24
  if (!entry?.id) {
38
- return /*#__PURE__*/React.createElement(DisablePrompt.Provider, {
39
- disablePrompt: disablePrompt
40
- }, /*#__PURE__*/React.createElement(Original, null));
25
+ return /*#__PURE__*/React.createElement(Original, null);
41
26
  }
42
27
  /**
43
28
  * Continue with existing entry.
@@ -49,16 +34,14 @@ const ContentEntryDecorator = ContentEntry.createDecorator(Original => {
49
34
  return /*#__PURE__*/React.createElement(ContentEntryGuard, Object.assign({}, props, {
50
35
  loading: loading
51
36
  }), /*#__PURE__*/React.createElement(ContentEntryLocker, Object.assign({}, props, {
52
- onDisablePrompt: flag => setDisablePrompt(flag),
37
+ onDisablePrompt: () => router.unblockTransition(),
53
38
  onEntryUnlocked: navigateTo
54
- }), /*#__PURE__*/React.createElement(DisablePrompt.Provider, {
55
- disablePrompt: disablePrompt
56
- }, /*#__PURE__*/React.createElement(Original, null))));
39
+ }), /*#__PURE__*/React.createElement(Original, null)));
57
40
  };
58
41
  });
59
42
  const SingletonContentEntryDecorator = SingletonContentEntry.createDecorator(Original => {
60
43
  return function RecordLockingSingletonContentEntry() {
61
- const [disablePrompt, setDisablePrompt] = useState(false);
44
+ const router = useRouter();
62
45
  const {
63
46
  entry,
64
47
  contentModel,
@@ -71,19 +54,15 @@ const SingletonContentEntryDecorator = SingletonContentEntry.createDecorator(Ori
71
54
  return /*#__PURE__*/React.createElement(ContentEntryGuard, Object.assign({}, props, {
72
55
  loading: loading
73
56
  }), /*#__PURE__*/React.createElement(ContentEntryLocker, Object.assign({}, props, {
74
- onDisablePrompt: flag => setDisablePrompt(flag),
57
+ onDisablePrompt: () => router.unblockTransition(),
75
58
  onEntryUnlocked: () => {
76
59
  // There's nowhere to go, since singleton entry doesn't have a list view.
77
60
  }
78
- }), /*#__PURE__*/React.createElement(DisablePrompt.Provider, {
79
- disablePrompt: disablePrompt
80
- }, /*#__PURE__*/React.createElement(Original, null))));
61
+ }), /*#__PURE__*/React.createElement(Original, null)));
81
62
  };
82
63
  });
83
64
  export const HeadlessCmsContentEntry = () => {
84
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ContentEntryDecorator, null), /*#__PURE__*/React.createElement(SingletonContentEntryDecorator, null), /*#__PURE__*/React.createElement(CompositionScope, {
85
- name: "cms.contentEntryForm"
86
- }, /*#__PURE__*/React.createElement(PromptDecorator, null)));
65
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ContentEntryDecorator, null), /*#__PURE__*/React.createElement(SingletonContentEntryDecorator, null));
87
66
  };
88
67
 
89
68
  //# sourceMappingURL=HeadlessCmsContentEntry.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","useState","CompositionScope","createGenericContext","NavigationPrompt","ContentEntryEditorConfig","ContentEntryListConfig","ContentEntryGuard","ContentEntryLocker","ContentEntry","SingletonContentEntry","DisablePrompt","PromptDecorator","createDecorator","Original","Prompt","props","disablePrompt","useHook","when","createElement","message","ContentEntryDecorator","RecordLockingContentEntry","setDisablePrompt","entry","contentModel","loading","useContentEntry","navigateTo","ContentEntries","useContentEntriesList","id","Provider","model","Object","assign","onDisablePrompt","flag","onEntryUnlocked","SingletonContentEntryDecorator","RecordLockingSingletonContentEntry","useSingletonContentEntry","HeadlessCmsContentEntry","Fragment","name"],"sources":["HeadlessCmsContentEntry.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { CompositionScope, createGenericContext, NavigationPrompt } from \"@webiny/app-admin\";\nimport { ContentEntryEditorConfig, ContentEntryListConfig } from \"@webiny/app-headless-cms\";\nimport { ContentEntryGuard } from \"./ContentEntryGuard.js\";\nimport { ContentEntryLocker } from \"./ContentEntryLocker.js\";\n\nconst { ContentEntry, SingletonContentEntry } = ContentEntryEditorConfig;\n\nconst DisablePrompt = createGenericContext<{ disablePrompt: boolean }>(\"DisablePrompt\");\n\nconst PromptDecorator = NavigationPrompt.createDecorator(Original => {\n return function Prompt(props) {\n const { disablePrompt } = DisablePrompt.useHook();\n const when = disablePrompt === true ? false : props.when;\n return <Original message={props.message} when={when} />;\n };\n});\n\nconst ContentEntryDecorator = ContentEntry.createDecorator(Original => {\n return function RecordLockingContentEntry() {\n const [disablePrompt, setDisablePrompt] = useState(false);\n const { entry, contentModel, loading } = ContentEntry.useContentEntry();\n const { navigateTo } = ContentEntryListConfig.ContentEntries.useContentEntriesList();\n /**\n * New entry does not have ID yet.\n */\n if (!entry?.id) {\n return (\n <DisablePrompt.Provider disablePrompt={disablePrompt}>\n <Original />\n </DisablePrompt.Provider>\n );\n }\n /**\n * Continue with existing entry.\n */\n const props = { entry, model: contentModel };\n\n return (\n <ContentEntryGuard {...props} loading={loading}>\n <ContentEntryLocker\n {...props}\n onDisablePrompt={flag => setDisablePrompt(flag)}\n onEntryUnlocked={navigateTo}\n >\n <DisablePrompt.Provider disablePrompt={disablePrompt}>\n <Original />\n </DisablePrompt.Provider>\n </ContentEntryLocker>\n </ContentEntryGuard>\n );\n };\n});\n\nconst SingletonContentEntryDecorator = SingletonContentEntry.createDecorator(Original => {\n return function RecordLockingSingletonContentEntry() {\n const [disablePrompt, setDisablePrompt] = useState(false);\n const { entry, contentModel, loading } = SingletonContentEntry.useSingletonContentEntry();\n\n const props = { entry, model: contentModel };\n\n return (\n <ContentEntryGuard {...props} loading={loading}>\n <ContentEntryLocker\n {...props}\n onDisablePrompt={flag => setDisablePrompt(flag)}\n onEntryUnlocked={() => {\n // There's nowhere to go, since singleton entry doesn't have a list view.\n }}\n >\n <DisablePrompt.Provider disablePrompt={disablePrompt}>\n <Original />\n </DisablePrompt.Provider>\n </ContentEntryLocker>\n </ContentEntryGuard>\n );\n };\n});\n\nexport const HeadlessCmsContentEntry = () => {\n return (\n <>\n <ContentEntryDecorator />\n <SingletonContentEntryDecorator />\n <CompositionScope name={\"cms.contentEntryForm\"}>\n <PromptDecorator />\n </CompositionScope>\n </>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useRouter","ContentEntryEditorConfig","ContentEntryListConfig","ContentEntryGuard","ContentEntryLocker","ContentEntry","SingletonContentEntry","ContentEntryDecorator","createDecorator","Original","RecordLockingContentEntry","router","entry","contentModel","loading","useContentEntry","navigateTo","ContentEntries","useContentEntriesList","id","createElement","props","model","Object","assign","onDisablePrompt","unblockTransition","onEntryUnlocked","SingletonContentEntryDecorator","RecordLockingSingletonContentEntry","useSingletonContentEntry","HeadlessCmsContentEntry","Fragment"],"sources":["HeadlessCmsContentEntry.tsx"],"sourcesContent":["import React from \"react\";\nimport { useRouter } from \"@webiny/app\";\nimport { ContentEntryEditorConfig, ContentEntryListConfig } from \"@webiny/app-headless-cms\";\nimport { ContentEntryGuard } from \"./ContentEntryGuard.js\";\nimport { ContentEntryLocker } from \"./ContentEntryLocker.js\";\n\nconst { ContentEntry, SingletonContentEntry } = ContentEntryEditorConfig;\n\nconst ContentEntryDecorator = ContentEntry.createDecorator(Original => {\n return function RecordLockingContentEntry() {\n const router = useRouter();\n const { entry, contentModel, loading } = ContentEntry.useContentEntry();\n const { navigateTo } = ContentEntryListConfig.ContentEntries.useContentEntriesList();\n /**\n * New entry does not have ID yet.\n */\n if (!entry?.id) {\n return <Original />;\n }\n /**\n * Continue with existing entry.\n */\n const props = { entry, model: contentModel };\n\n return (\n <ContentEntryGuard {...props} loading={loading}>\n <ContentEntryLocker\n {...props}\n onDisablePrompt={() => router.unblockTransition()}\n onEntryUnlocked={navigateTo}\n >\n <Original />\n </ContentEntryLocker>\n </ContentEntryGuard>\n );\n };\n});\n\nconst SingletonContentEntryDecorator = SingletonContentEntry.createDecorator(Original => {\n return function RecordLockingSingletonContentEntry() {\n const router = useRouter();\n const { entry, contentModel, loading } = SingletonContentEntry.useSingletonContentEntry();\n\n const props = { entry, model: contentModel };\n\n return (\n <ContentEntryGuard {...props} loading={loading}>\n <ContentEntryLocker\n {...props}\n onDisablePrompt={() => router.unblockTransition()}\n onEntryUnlocked={() => {\n // There's nowhere to go, since singleton entry doesn't have a list view.\n }}\n >\n <Original />\n </ContentEntryLocker>\n </ContentEntryGuard>\n );\n };\n});\n\nexport const HeadlessCmsContentEntry = () => {\n return (\n <>\n <ContentEntryDecorator />\n <SingletonContentEntryDecorator />\n </>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,SAAS,QAAQ,aAAa;AACvC,SAASC,wBAAwB,EAAEC,sBAAsB,QAAQ,0BAA0B;AAC3F,SAASC,iBAAiB;AAC1B,SAASC,kBAAkB;AAE3B,MAAM;EAAEC,YAAY;EAAEC;AAAsB,CAAC,GAAGL,wBAAwB;AAExE,MAAMM,qBAAqB,GAAGF,YAAY,CAACG,eAAe,CAACC,QAAQ,IAAI;EACnE,OAAO,SAASC,yBAAyBA,CAAA,EAAG;IACxC,MAAMC,MAAM,GAAGX,SAAS,CAAC,CAAC;IAC1B,MAAM;MAAEY,KAAK;MAAEC,YAAY;MAAEC;IAAQ,CAAC,GAAGT,YAAY,CAACU,eAAe,CAAC,CAAC;IACvE,MAAM;MAAEC;IAAW,CAAC,GAAGd,sBAAsB,CAACe,cAAc,CAACC,qBAAqB,CAAC,CAAC;IACpF;AACR;AACA;IACQ,IAAI,CAACN,KAAK,EAAEO,EAAE,EAAE;MACZ,oBAAOpB,KAAA,CAAAqB,aAAA,CAACX,QAAQ,MAAE,CAAC;IACvB;IACA;AACR;AACA;IACQ,MAAMY,KAAK,GAAG;MAAET,KAAK;MAAEU,KAAK,EAAET;IAAa,CAAC;IAE5C,oBACId,KAAA,CAAAqB,aAAA,CAACjB,iBAAiB,EAAAoB,MAAA,CAAAC,MAAA,KAAKH,KAAK;MAAEP,OAAO,EAAEA;IAAQ,iBAC3Cf,KAAA,CAAAqB,aAAA,CAAChB,kBAAkB,EAAAmB,MAAA,CAAAC,MAAA,KACXH,KAAK;MACTI,eAAe,EAAEA,CAAA,KAAMd,MAAM,CAACe,iBAAiB,CAAC,CAAE;MAClDC,eAAe,EAAEX;IAAW,iBAE5BjB,KAAA,CAAAqB,aAAA,CAACX,QAAQ,MAAE,CACK,CACL,CAAC;EAE5B,CAAC;AACL,CAAC,CAAC;AAEF,MAAMmB,8BAA8B,GAAGtB,qBAAqB,CAACE,eAAe,CAACC,QAAQ,IAAI;EACrF,OAAO,SAASoB,kCAAkCA,CAAA,EAAG;IACjD,MAAMlB,MAAM,GAAGX,SAAS,CAAC,CAAC;IAC1B,MAAM;MAAEY,KAAK;MAAEC,YAAY;MAAEC;IAAQ,CAAC,GAAGR,qBAAqB,CAACwB,wBAAwB,CAAC,CAAC;IAEzF,MAAMT,KAAK,GAAG;MAAET,KAAK;MAAEU,KAAK,EAAET;IAAa,CAAC;IAE5C,oBACId,KAAA,CAAAqB,aAAA,CAACjB,iBAAiB,EAAAoB,MAAA,CAAAC,MAAA,KAAKH,KAAK;MAAEP,OAAO,EAAEA;IAAQ,iBAC3Cf,KAAA,CAAAqB,aAAA,CAAChB,kBAAkB,EAAAmB,MAAA,CAAAC,MAAA,KACXH,KAAK;MACTI,eAAe,EAAEA,CAAA,KAAMd,MAAM,CAACe,iBAAiB,CAAC,CAAE;MAClDC,eAAe,EAAEA,CAAA,KAAM;QACnB;MAAA;IACF,iBAEF5B,KAAA,CAAAqB,aAAA,CAACX,QAAQ,MAAE,CACK,CACL,CAAC;EAE5B,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,MAAMsB,uBAAuB,GAAGA,CAAA,KAAM;EACzC,oBACIhC,KAAA,CAAAqB,aAAA,CAAArB,KAAA,CAAAiC,QAAA,qBACIjC,KAAA,CAAAqB,aAAA,CAACb,qBAAqB,MAAE,CAAC,eACzBR,KAAA,CAAAqB,aAAA,CAACQ,8BAA8B,MAAE,CACnC,CAAC;AAEX,CAAC","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const SecurityPermissions: () => React.JSX.Element;
@@ -0,0 +1,18 @@
1
+ import React from "react";
2
+ import { AdminConfig } from "@webiny/app-admin";
3
+ import { ReactComponent as LockIcon } from "@webiny/icons/lock.svg";
4
+ import { RECORD_LOCKING_PERMISSIONS_SCHEMA } from "../domain/permissionsSchema.js";
5
+ const {
6
+ Security
7
+ } = AdminConfig;
8
+ export const SecurityPermissions = () => {
9
+ return /*#__PURE__*/React.createElement(AdminConfig, null, /*#__PURE__*/React.createElement(Security.Permissions, {
10
+ name: "record-locking",
11
+ title: "Record Locking",
12
+ description: "Manage Record Locking permissions.",
13
+ icon: /*#__PURE__*/React.createElement(LockIcon, null),
14
+ schema: RECORD_LOCKING_PERMISSIONS_SCHEMA
15
+ }));
16
+ };
17
+
18
+ //# sourceMappingURL=SecurityPermissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","AdminConfig","ReactComponent","LockIcon","RECORD_LOCKING_PERMISSIONS_SCHEMA","Security","SecurityPermissions","createElement","Permissions","name","title","description","icon","schema"],"sources":["SecurityPermissions.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig } from \"@webiny/app-admin\";\nimport { ReactComponent as LockIcon } from \"@webiny/icons/lock.svg\";\nimport { RECORD_LOCKING_PERMISSIONS_SCHEMA } from \"~/domain/permissionsSchema.js\";\n\nconst { Security } = AdminConfig;\n\nexport const SecurityPermissions = () => {\n return (\n <AdminConfig>\n <Security.Permissions\n name=\"record-locking\"\n title=\"Record Locking\"\n description=\"Manage Record Locking permissions.\"\n icon={<LockIcon />}\n schema={RECORD_LOCKING_PERMISSIONS_SCHEMA}\n />\n </AdminConfig>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,WAAW,QAAQ,mBAAmB;AAC/C,SAASC,cAAc,IAAIC,QAAQ,QAAQ,wBAAwB;AACnE,SAASC,iCAAiC;AAE1C,MAAM;EAAEC;AAAS,CAAC,GAAGJ,WAAW;AAEhC,OAAO,MAAMK,mBAAmB,GAAGA,CAAA,KAAM;EACrC,oBACIN,KAAA,CAAAO,aAAA,CAACN,WAAW,qBACRD,KAAA,CAAAO,aAAA,CAACF,QAAQ,CAACG,WAAW;IACjBC,IAAI,EAAC,gBAAgB;IACrBC,KAAK,EAAC,gBAAgB;IACtBC,WAAW,EAAC,oCAAoC;IAChDC,IAAI,eAAEZ,KAAA,CAAAO,aAAA,CAACJ,QAAQ,MAAE,CAAE;IACnBU,MAAM,EAAET;EAAkC,CAC7C,CACQ,CAAC;AAEtB,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["RecordLockingGetLockRecord","RecordLockingIsEntryLocked","RecordLockingListLockRecords","RecordLockingLockEntry","RecordLockingUnlockEntry","RecordLockingClient","createRecordLockingError","parseIdentifier","createCacheKey","RecordLockingUpdateEntryLock","RecordLockingGetLockedEntryLockRecord","RecordLocking","loading","records","onErrorCb","constructor","params","_setLoading","setLoading","_getLockRecord","getLockRecord","_getLockedEntryLockRecord","getLockedEntryLockRecord","_listLockRecords","listLockRecords","_unlockEntry","unlockEntry","_updateEntryLock","updateEntryLock","setRecords","folderId","type","result","fetchAndAssignRecords","undefined","map","record","id","entryId","$type","$lockingType","$locked","$selectable","fetchLockRecord","execute","data","error","ex","fetchLockedEntryLockRecord","getLockRecordEntry","find","isRecordLocked","r","expiresOn","isExpired","isLockExpired","triggerOnError","removeEntryLock","index","findIndex","force","onError","cb","setIsLoading","input","Date","length","assignedIdList","assignRecords","where","id_in","limit","console","message","code","lockedBy","lockedOn","actions","keys","cacheKey","currentRecordsCacheKey","currentRecordType","currentFolderId","reduce","collection","push","createRecordLocking","config","client","isEntryLocked","lockEntry"],"sources":["RecordLocking.ts"],"sourcesContent":["import type {\n IRecordLocking,\n IRecordLockingUpdateEntryLockResult\n} from \"./abstractions/IRecordLocking.js\";\nimport type { ApolloClient } from \"apollo-client\";\nimport { RecordLockingGetLockRecord } from \"./RecordLockingGetLockRecord.js\";\nimport { RecordLockingIsEntryLocked } from \"./RecordLockingIsEntryLocked.js\";\nimport { RecordLockingListLockRecords } from \"./RecordLockingListLockRecords.js\";\nimport { RecordLockingLockEntry } from \"./RecordLockingLockEntry.js\";\nimport { RecordLockingUnlockEntry } from \"./RecordLockingUnlockEntry.js\";\nimport { RecordLockingClient } from \"./RecordLockingClient.js\";\nimport type { IRecordLockingGetLockRecord } from \"./abstractions/IRecordLockingGetLockRecord.js\";\nimport type { IRecordLockingIsEntryLocked } from \"./abstractions/IRecordLockingIsEntryLocked.js\";\nimport type {\n IRecordLockingListLockRecords,\n IRecordLockingListLockRecordsResult\n} from \"./abstractions/IRecordLockingListLockRecords.js\";\nimport type { IRecordLockingLockEntry } from \"./abstractions/IRecordLockingLockEntry.js\";\nimport type {\n IRecordLockingUnlockEntry,\n IRecordLockingUnlockEntryResult\n} from \"./abstractions/IRecordLockingUnlockEntry.js\";\nimport type {\n IFetchLockedEntryLockRecordParams,\n IFetchLockRecordParams,\n IFetchLockRecordResult,\n IIsRecordLockedParams,\n IPossiblyRecordLockingRecord,\n IRecordLockingError,\n IRecordLockingLockRecord,\n IRecordLockingRecord,\n IUnlockEntryParams,\n IUpdateEntryLockParams\n} from \"~/types.js\";\nimport { createRecordLockingError } from \"./utils/createRecordLockingError.js\";\nimport { parseIdentifier } from \"@webiny/utils/parseIdentifier.js\";\nimport { createCacheKey } from \"~/utils/createCacheKey.js\";\nimport { RecordLockingUpdateEntryLock } from \"~/domain/RecordLockingUpdateEntryLock.js\";\nimport type { IRecordLockingUpdateEntryLock } from \"~/domain/abstractions/IRecordLockingUpdateEntryLock.js\";\nimport { RecordLockingGetLockedEntryLockRecord } from \"~/domain/RecordLockingGetLockedEntryLockRecord.js\";\nimport type { IRecordLockingGetLockedEntryLockRecord } from \"./abstractions/IRecordLockingGetLockedEntryLockRecord.js\";\n\nexport interface ICreateRecordLockingParams {\n client: ApolloClient<any>;\n setLoading: (loading: boolean) => void;\n}\n\nexport interface IRecordLockingParams {\n setLoading: (loading: boolean) => void;\n getLockRecord: IRecordLockingGetLockRecord;\n getLockedEntryLockRecord: IRecordLockingGetLockedEntryLockRecord;\n isEntryLocked: IRecordLockingIsEntryLocked;\n listLockRecords: IRecordLockingListLockRecords;\n lockEntry: IRecordLockingLockEntry;\n unlockEntry: IRecordLockingUnlockEntry;\n updateEntryLock: IRecordLockingUpdateEntryLock;\n}\n\nexport interface IOnErrorCb {\n (error: IRecordLockingError): void;\n}\n\nclass RecordLocking<T extends IPossiblyRecordLockingRecord = IPossiblyRecordLockingRecord>\n implements IRecordLocking<T>\n{\n private currentRecordType?: string;\n private currentFolderId?: string;\n private currentRecordsCacheKey?: string;\n private readonly _setLoading: (loading: boolean) => void;\n public loading = false;\n public records: IRecordLockingRecord[] = [];\n private readonly _getLockRecord: IRecordLockingGetLockRecord;\n private readonly _getLockedEntryLockRecord: IRecordLockingGetLockedEntryLockRecord;\n private readonly _listLockRecords: IRecordLockingListLockRecords;\n private readonly _unlockEntry: IRecordLockingUnlockEntry;\n private readonly _updateEntryLock: IRecordLockingUpdateEntryLock;\n\n private onErrorCb: IOnErrorCb | null = null;\n\n public constructor(params: IRecordLockingParams) {\n this._setLoading = params.setLoading;\n this._getLockRecord = params.getLockRecord;\n this._getLockedEntryLockRecord = params.getLockedEntryLockRecord;\n this._listLockRecords = params.listLockRecords;\n this._unlockEntry = params.unlockEntry;\n this._updateEntryLock = params.updateEntryLock;\n }\n\n public async setRecords(\n folderId: string,\n type: string,\n records: T[]\n ): Promise<IRecordLockingRecord[] | undefined> {\n const result = await this.fetchAndAssignRecords(folderId, type, records);\n if (!result) {\n return undefined;\n }\n\n return result.map(record => {\n const { id: entryId } = parseIdentifier(record.id);\n return {\n ...record,\n $type: \"RECORD\",\n $lockingType: type,\n $locked: record.$locked,\n $selectable: record.$locked ? false : record.$selectable,\n entryId\n };\n });\n }\n\n public async fetchLockRecord(params: IFetchLockRecordParams): Promise<IFetchLockRecordResult> {\n const { id, $lockingType } = params;\n\n const { id: entryId } = parseIdentifier(id);\n\n try {\n const result = await this._getLockRecord.execute({\n id: entryId,\n type: $lockingType\n });\n\n return {\n data: result.data,\n error: result.error\n };\n } catch (ex) {\n return {\n data: null,\n error: ex\n };\n }\n }\n\n public async fetchLockedEntryLockRecord(\n params: IFetchLockedEntryLockRecordParams\n ): Promise<IRecordLockingLockRecord | null> {\n const { id, $lockingType } = params;\n\n const { id: entryId } = parseIdentifier(id);\n const result = await this._getLockedEntryLockRecord.execute({\n id: entryId,\n type: $lockingType\n });\n return result.data;\n }\n\n public getLockRecordEntry(id: string): IRecordLockingRecord | undefined {\n return this.records.find(record => {\n const { id: entryId } = parseIdentifier(id);\n return record.entryId === entryId;\n });\n }\n\n public isRecordLocked(record: IIsRecordLockedParams): boolean {\n const result = this.records.find(r => {\n const { id: entryId } = parseIdentifier(record.id);\n\n return r.entryId === entryId && !!r.$locked && r.$lockingType === record.$lockingType;\n });\n if (!result?.$locked?.expiresOn) {\n return false;\n }\n const isExpired = this.isLockExpired(result.$locked.expiresOn);\n return !isExpired;\n }\n\n public async updateEntryLock(\n params: IUpdateEntryLockParams\n ): Promise<IRecordLockingUpdateEntryLockResult> {\n try {\n return await this._updateEntryLock.execute({\n id: params.id,\n type: params.$lockingType\n });\n } catch (ex) {\n this.triggerOnError(ex);\n return {\n data: null,\n error: ex\n };\n }\n }\n\n public removeEntryLock(params: IUnlockEntryParams): void {\n const index = this.records.findIndex(record => {\n return record.entryId === params.id && record.$lockingType === params.$lockingType;\n });\n if (index === -1) {\n return;\n }\n this.records[index] = {\n ...this.records[index],\n $locked: null,\n $selectable: true\n };\n }\n\n public async unlockEntry(\n params: IUnlockEntryParams,\n force?: boolean\n ): Promise<IRecordLockingUnlockEntryResult> {\n try {\n const result = await this._unlockEntry.execute({\n id: params.id,\n type: params.$lockingType,\n force\n });\n\n const id = result.data?.id;\n if (!id) {\n return result;\n }\n this.removeEntryLock({\n ...params\n });\n return result;\n } catch (ex) {\n this.triggerOnError(ex);\n return {\n data: null,\n error: ex\n };\n }\n }\n\n public onError(cb: IOnErrorCb): void {\n this.onErrorCb = cb;\n }\n\n public triggerOnError(error: IRecordLockingError): void {\n this.setIsLoading(false);\n if (!this.onErrorCb) {\n return;\n }\n this.onErrorCb(error);\n }\n\n public isLockExpired(input: Date | string): boolean {\n const expiresOn = new Date(input);\n return expiresOn <= new Date();\n }\n\n private setIsLoading(loading: boolean): void {\n this._setLoading(loading);\n this.loading = loading;\n }\n\n private async fetchAndAssignRecords(\n folderId: string,\n type: string,\n records: T[]\n ): Promise<IPossiblyRecordLockingRecord[] | undefined> {\n if (records.length === 0) {\n return;\n } else if (this.loading) {\n return;\n }\n const assignedIdList = await this.assignRecords(folderId, type, records);\n if (assignedIdList.length === 0) {\n return;\n }\n this.setIsLoading(true);\n let result: IRecordLockingListLockRecordsResult;\n try {\n result = await this._listLockRecords.execute({\n where: {\n id_in: assignedIdList,\n type\n },\n limit: 10000\n });\n } catch (ex) {\n console.error(ex);\n this.triggerOnError(ex);\n return;\n } finally {\n this.setIsLoading(false);\n }\n if (result.error) {\n this.triggerOnError(result.error);\n return;\n } else if (!result.data) {\n this.triggerOnError(\n createRecordLockingError({\n message: `There is no data in the result and there is no error. Please check the network tab for more info.`,\n code: \"NO_DATA_IN_RESULT\"\n })\n );\n return;\n } else if (result.data.length === 0) {\n return;\n }\n\n for (const record of result.data) {\n const index = this.records.findIndex(r => {\n const { id: entryId } = parseIdentifier(record.id);\n return r.entryId === entryId;\n });\n if (index < 0) {\n console.error(`There is no record with id ${record.id} in the records array.`);\n continue;\n }\n this.records[index] = {\n ...this.records[index],\n $locked: {\n lockedBy: record.lockedBy,\n expiresOn: record.expiresOn,\n lockedOn: record.lockedOn,\n actions: record.actions\n }\n };\n }\n\n return this.records;\n }\n /**\n * Assign records and return the assigned ID list.\n */\n private async assignRecords(folderId: string, type: string, records: T[]): Promise<string[]> {\n /**\n * First we check the record keys against ones in the local cache.\n */\n const keys = records.map(record => {\n if (record.entryId) {\n return record.entryId;\n }\n const { id: entryId } = parseIdentifier(record.id);\n return entryId;\n });\n const cacheKey = await createCacheKey(keys);\n if (this.currentRecordsCacheKey === cacheKey) {\n return [];\n }\n this.currentRecordsCacheKey = cacheKey;\n\n /**\n * Reset records if new type is not as same as the old type / folderId.\n */\n if (this.currentRecordType !== type || this.currentFolderId !== folderId) {\n this.records = [];\n this.currentRecordType = type;\n this.currentFolderId = folderId;\n }\n\n return records.reduce<string[]>((collection, record) => {\n const { id: entryId } = parseIdentifier(record.id);\n const index = this.records.findIndex(r => r.entryId === entryId);\n if (index >= 0) {\n return collection;\n }\n this.records.push({\n ...record,\n entryId,\n $lockingType: type,\n $locked: undefined\n });\n if (record.$type !== \"RECORD\") {\n return collection;\n }\n collection.push(entryId);\n return collection;\n }, []);\n }\n}\n\nexport const createRecordLocking = <T extends IRecordLockingRecord>(\n config: ICreateRecordLockingParams\n): IRecordLocking => {\n const client = new RecordLockingClient({\n client: config.client\n });\n\n const getLockRecord = new RecordLockingGetLockRecord({\n client\n });\n\n const getLockedEntryLockRecord = new RecordLockingGetLockedEntryLockRecord({\n client\n });\n\n const isEntryLocked = new RecordLockingIsEntryLocked({\n client\n });\n\n const listLockRecords = new RecordLockingListLockRecords({\n client\n });\n\n const lockEntry = new RecordLockingLockEntry({\n client\n });\n\n const unlockEntry = new RecordLockingUnlockEntry({\n client\n });\n\n const updateEntryLock = new RecordLockingUpdateEntryLock({\n client\n });\n\n return new RecordLocking<T>({\n setLoading: config.setLoading,\n getLockRecord,\n getLockedEntryLockRecord,\n isEntryLocked,\n listLockRecords,\n updateEntryLock,\n lockEntry,\n unlockEntry\n });\n};\n"],"mappings":"AAKA,SAASA,0BAA0B;AACnC,SAASC,0BAA0B;AACnC,SAASC,4BAA4B;AACrC,SAASC,sBAAsB;AAC/B,SAASC,wBAAwB;AACjC,SAASC,mBAAmB;AAwB5B,SAASC,wBAAwB;AACjC,SAASC,eAAe,QAAQ,kCAAkC;AAClE,SAASC,cAAc;AACvB,SAASC,4BAA4B;AAErC,SAASC,qCAAqC;AAuB9C,MAAMC,aAAa,CAEnB;EAKWC,OAAO,GAAG,KAAK;EACfC,OAAO,GAA2B,EAAE;EAOnCC,SAAS,GAAsB,IAAI;EAEpCC,WAAWA,CAACC,MAA4B,EAAE;IAC7C,IAAI,CAACC,WAAW,GAAGD,MAAM,CAACE,UAAU;IACpC,IAAI,CAACC,cAAc,GAAGH,MAAM,CAACI,aAAa;IAC1C,IAAI,CAACC,yBAAyB,GAAGL,MAAM,CAACM,wBAAwB;IAChE,IAAI,CAACC,gBAAgB,GAAGP,MAAM,CAACQ,eAAe;IAC9C,IAAI,CAACC,YAAY,GAAGT,MAAM,CAACU,WAAW;IACtC,IAAI,CAACC,gBAAgB,GAAGX,MAAM,CAACY,eAAe;EAClD;EAEA,MAAaC,UAAUA,CACnBC,QAAgB,EAChBC,IAAY,EACZlB,OAAY,EAC+B;IAC3C,MAAMmB,MAAM,GAAG,MAAM,IAAI,CAACC,qBAAqB,CAACH,QAAQ,EAAEC,IAAI,EAAElB,OAAO,CAAC;IACxE,IAAI,CAACmB,MAAM,EAAE;MACT,OAAOE,SAAS;IACpB;IAEA,OAAOF,MAAM,CAACG,GAAG,CAACC,MAAM,IAAI;MACxB,MAAM;QAAEC,EAAE,EAAEC;MAAQ,CAAC,GAAG/B,eAAe,CAAC6B,MAAM,CAACC,EAAE,CAAC;MAClD,OAAO;QACH,GAAGD,MAAM;QACTG,KAAK,EAAE,QAAQ;QACfC,YAAY,EAAET,IAAI;QAClBU,OAAO,EAAEL,MAAM,CAACK,OAAO;QACvBC,WAAW,EAAEN,MAAM,CAACK,OAAO,GAAG,KAAK,GAAGL,MAAM,CAACM,WAAW;QACxDJ;MACJ,CAAC;IACL,CAAC,CAAC;EACN;EAEA,MAAaK,eAAeA,CAAC3B,MAA8B,EAAmC;IAC1F,MAAM;MAAEqB,EAAE;MAAEG;IAAa,CAAC,GAAGxB,MAAM;IAEnC,MAAM;MAAEqB,EAAE,EAAEC;IAAQ,CAAC,GAAG/B,eAAe,CAAC8B,EAAE,CAAC;IAE3C,IAAI;MACA,MAAML,MAAM,GAAG,MAAM,IAAI,CAACb,cAAc,CAACyB,OAAO,CAAC;QAC7CP,EAAE,EAAEC,OAAO;QACXP,IAAI,EAAES;MACV,CAAC,CAAC;MAEF,OAAO;QACHK,IAAI,EAAEb,MAAM,CAACa,IAAI;QACjBC,KAAK,EAAEd,MAAM,CAACc;MAClB,CAAC;IACL,CAAC,CAAC,OAAOC,EAAE,EAAE;MACT,OAAO;QACHF,IAAI,EAAE,IAAI;QACVC,KAAK,EAAEC;MACX,CAAC;IACL;EACJ;EAEA,MAAaC,0BAA0BA,CACnChC,MAAyC,EACD;IACxC,MAAM;MAAEqB,EAAE;MAAEG;IAAa,CAAC,GAAGxB,MAAM;IAEnC,MAAM;MAAEqB,EAAE,EAAEC;IAAQ,CAAC,GAAG/B,eAAe,CAAC8B,EAAE,CAAC;IAC3C,MAAML,MAAM,GAAG,MAAM,IAAI,CAACX,yBAAyB,CAACuB,OAAO,CAAC;MACxDP,EAAE,EAAEC,OAAO;MACXP,IAAI,EAAES;IACV,CAAC,CAAC;IACF,OAAOR,MAAM,CAACa,IAAI;EACtB;EAEOI,kBAAkBA,CAACZ,EAAU,EAAoC;IACpE,OAAO,IAAI,CAACxB,OAAO,CAACqC,IAAI,CAACd,MAAM,IAAI;MAC/B,MAAM;QAAEC,EAAE,EAAEC;MAAQ,CAAC,GAAG/B,eAAe,CAAC8B,EAAE,CAAC;MAC3C,OAAOD,MAAM,CAACE,OAAO,KAAKA,OAAO;IACrC,CAAC,CAAC;EACN;EAEOa,cAAcA,CAACf,MAA6B,EAAW;IAC1D,MAAMJ,MAAM,GAAG,IAAI,CAACnB,OAAO,CAACqC,IAAI,CAACE,CAAC,IAAI;MAClC,MAAM;QAAEf,EAAE,EAAEC;MAAQ,CAAC,GAAG/B,eAAe,CAAC6B,MAAM,CAACC,EAAE,CAAC;MAElD,OAAOe,CAAC,CAACd,OAAO,KAAKA,OAAO,IAAI,CAAC,CAACc,CAAC,CAACX,OAAO,IAAIW,CAAC,CAACZ,YAAY,KAAKJ,MAAM,CAACI,YAAY;IACzF,CAAC,CAAC;IACF,IAAI,CAACR,MAAM,EAAES,OAAO,EAAEY,SAAS,EAAE;MAC7B,OAAO,KAAK;IAChB;IACA,MAAMC,SAAS,GAAG,IAAI,CAACC,aAAa,CAACvB,MAAM,CAACS,OAAO,CAACY,SAAS,CAAC;IAC9D,OAAO,CAACC,SAAS;EACrB;EAEA,MAAa1B,eAAeA,CACxBZ,MAA8B,EACc;IAC5C,IAAI;MACA,OAAO,MAAM,IAAI,CAACW,gBAAgB,CAACiB,OAAO,CAAC;QACvCP,EAAE,EAAErB,MAAM,CAACqB,EAAE;QACbN,IAAI,EAAEf,MAAM,CAACwB;MACjB,CAAC,CAAC;IACN,CAAC,CAAC,OAAOO,EAAE,EAAE;MACT,IAAI,CAACS,cAAc,CAACT,EAAE,CAAC;MACvB,OAAO;QACHF,IAAI,EAAE,IAAI;QACVC,KAAK,EAAEC;MACX,CAAC;IACL;EACJ;EAEOU,eAAeA,CAACzC,MAA0B,EAAQ;IACrD,MAAM0C,KAAK,GAAG,IAAI,CAAC7C,OAAO,CAAC8C,SAAS,CAACvB,MAAM,IAAI;MAC3C,OAAOA,MAAM,CAACE,OAAO,KAAKtB,MAAM,CAACqB,EAAE,IAAID,MAAM,CAACI,YAAY,KAAKxB,MAAM,CAACwB,YAAY;IACtF,CAAC,CAAC;IACF,IAAIkB,KAAK,KAAK,CAAC,CAAC,EAAE;MACd;IACJ;IACA,IAAI,CAAC7C,OAAO,CAAC6C,KAAK,CAAC,GAAG;MAClB,GAAG,IAAI,CAAC7C,OAAO,CAAC6C,KAAK,CAAC;MACtBjB,OAAO,EAAE,IAAI;MACbC,WAAW,EAAE;IACjB,CAAC;EACL;EAEA,MAAahB,WAAWA,CACpBV,MAA0B,EAC1B4C,KAAe,EACyB;IACxC,IAAI;MACA,MAAM5B,MAAM,GAAG,MAAM,IAAI,CAACP,YAAY,CAACmB,OAAO,CAAC;QAC3CP,EAAE,EAAErB,MAAM,CAACqB,EAAE;QACbN,IAAI,EAAEf,MAAM,CAACwB,YAAY;QACzBoB;MACJ,CAAC,CAAC;MAEF,MAAMvB,EAAE,GAAGL,MAAM,CAACa,IAAI,EAAER,EAAE;MAC1B,IAAI,CAACA,EAAE,EAAE;QACL,OAAOL,MAAM;MACjB;MACA,IAAI,CAACyB,eAAe,CAAC;QACjB,GAAGzC;MACP,CAAC,CAAC;MACF,OAAOgB,MAAM;IACjB,CAAC,CAAC,OAAOe,EAAE,EAAE;MACT,IAAI,CAACS,cAAc,CAACT,EAAE,CAAC;MACvB,OAAO;QACHF,IAAI,EAAE,IAAI;QACVC,KAAK,EAAEC;MACX,CAAC;IACL;EACJ;EAEOc,OAAOA,CAACC,EAAc,EAAQ;IACjC,IAAI,CAAChD,SAAS,GAAGgD,EAAE;EACvB;EAEON,cAAcA,CAACV,KAA0B,EAAQ;IACpD,IAAI,CAACiB,YAAY,CAAC,KAAK,CAAC;IACxB,IAAI,CAAC,IAAI,CAACjD,SAAS,EAAE;MACjB;IACJ;IACA,IAAI,CAACA,SAAS,CAACgC,KAAK,CAAC;EACzB;EAEOS,aAAaA,CAACS,KAAoB,EAAW;IAChD,MAAMX,SAAS,GAAG,IAAIY,IAAI,CAACD,KAAK,CAAC;IACjC,OAAOX,SAAS,IAAI,IAAIY,IAAI,CAAC,CAAC;EAClC;EAEQF,YAAYA,CAACnD,OAAgB,EAAQ;IACzC,IAAI,CAACK,WAAW,CAACL,OAAO,CAAC;IACzB,IAAI,CAACA,OAAO,GAAGA,OAAO;EAC1B;EAEA,MAAcqB,qBAAqBA,CAC/BH,QAAgB,EAChBC,IAAY,EACZlB,OAAY,EACuC;IACnD,IAAIA,OAAO,CAACqD,MAAM,KAAK,CAAC,EAAE;MACtB;IACJ,CAAC,MAAM,IAAI,IAAI,CAACtD,OAAO,EAAE;MACrB;IACJ;IACA,MAAMuD,cAAc,GAAG,MAAM,IAAI,CAACC,aAAa,CAACtC,QAAQ,EAAEC,IAAI,EAAElB,OAAO,CAAC;IACxE,IAAIsD,cAAc,CAACD,MAAM,KAAK,CAAC,EAAE;MAC7B;IACJ;IACA,IAAI,CAACH,YAAY,CAAC,IAAI,CAAC;IACvB,IAAI/B,MAA2C;IAC/C,IAAI;MACAA,MAAM,GAAG,MAAM,IAAI,CAACT,gBAAgB,CAACqB,OAAO,CAAC;QACzCyB,KAAK,EAAE;UACHC,KAAK,EAAEH,cAAc;UACrBpC;QACJ,CAAC;QACDwC,KAAK,EAAE;MACX,CAAC,CAAC;IACN,CAAC,CAAC,OAAOxB,EAAE,EAAE;MACTyB,OAAO,CAAC1B,KAAK,CAACC,EAAE,CAAC;MACjB,IAAI,CAACS,cAAc,CAACT,EAAE,CAAC;MACvB;IACJ,CAAC,SAAS;MACN,IAAI,CAACgB,YAAY,CAAC,KAAK,CAAC;IAC5B;IACA,IAAI/B,MAAM,CAACc,KAAK,EAAE;MACd,IAAI,CAACU,cAAc,CAACxB,MAAM,CAACc,KAAK,CAAC;MACjC;IACJ,CAAC,MAAM,IAAI,CAACd,MAAM,CAACa,IAAI,EAAE;MACrB,IAAI,CAACW,cAAc,CACflD,wBAAwB,CAAC;QACrBmE,OAAO,EAAE,mGAAmG;QAC5GC,IAAI,EAAE;MACV,CAAC,CACL,CAAC;MACD;IACJ,CAAC,MAAM,IAAI1C,MAAM,CAACa,IAAI,CAACqB,MAAM,KAAK,CAAC,EAAE;MACjC;IACJ;IAEA,KAAK,MAAM9B,MAAM,IAAIJ,MAAM,CAACa,IAAI,EAAE;MAC9B,MAAMa,KAAK,GAAG,IAAI,CAAC7C,OAAO,CAAC8C,SAAS,CAACP,CAAC,IAAI;QACtC,MAAM;UAAEf,EAAE,EAAEC;QAAQ,CAAC,GAAG/B,eAAe,CAAC6B,MAAM,CAACC,EAAE,CAAC;QAClD,OAAOe,CAAC,CAACd,OAAO,KAAKA,OAAO;MAChC,CAAC,CAAC;MACF,IAAIoB,KAAK,GAAG,CAAC,EAAE;QACXc,OAAO,CAAC1B,KAAK,CAAC,8BAA8BV,MAAM,CAACC,EAAE,wBAAwB,CAAC;QAC9E;MACJ;MACA,IAAI,CAACxB,OAAO,CAAC6C,KAAK,CAAC,GAAG;QAClB,GAAG,IAAI,CAAC7C,OAAO,CAAC6C,KAAK,CAAC;QACtBjB,OAAO,EAAE;UACLkC,QAAQ,EAAEvC,MAAM,CAACuC,QAAQ;UACzBtB,SAAS,EAAEjB,MAAM,CAACiB,SAAS;UAC3BuB,QAAQ,EAAExC,MAAM,CAACwC,QAAQ;UACzBC,OAAO,EAAEzC,MAAM,CAACyC;QACpB;MACJ,CAAC;IACL;IAEA,OAAO,IAAI,CAAChE,OAAO;EACvB;EACA;AACJ;AACA;EACI,MAAcuD,aAAaA,CAACtC,QAAgB,EAAEC,IAAY,EAAElB,OAAY,EAAqB;IACzF;AACR;AACA;IACQ,MAAMiE,IAAI,GAAGjE,OAAO,CAACsB,GAAG,CAACC,MAAM,IAAI;MAC/B,IAAIA,MAAM,CAACE,OAAO,EAAE;QAChB,OAAOF,MAAM,CAACE,OAAO;MACzB;MACA,MAAM;QAAED,EAAE,EAAEC;MAAQ,CAAC,GAAG/B,eAAe,CAAC6B,MAAM,CAACC,EAAE,CAAC;MAClD,OAAOC,OAAO;IAClB,CAAC,CAAC;IACF,MAAMyC,QAAQ,GAAG,MAAMvE,cAAc,CAACsE,IAAI,CAAC;IAC3C,IAAI,IAAI,CAACE,sBAAsB,KAAKD,QAAQ,EAAE;MAC1C,OAAO,EAAE;IACb;IACA,IAAI,CAACC,sBAAsB,GAAGD,QAAQ;;IAEtC;AACR;AACA;IACQ,IAAI,IAAI,CAACE,iBAAiB,KAAKlD,IAAI,IAAI,IAAI,CAACmD,eAAe,KAAKpD,QAAQ,EAAE;MACtE,IAAI,CAACjB,OAAO,GAAG,EAAE;MACjB,IAAI,CAACoE,iBAAiB,GAAGlD,IAAI;MAC7B,IAAI,CAACmD,eAAe,GAAGpD,QAAQ;IACnC;IAEA,OAAOjB,OAAO,CAACsE,MAAM,CAAW,CAACC,UAAU,EAAEhD,MAAM,KAAK;MACpD,MAAM;QAAEC,EAAE,EAAEC;MAAQ,CAAC,GAAG/B,eAAe,CAAC6B,MAAM,CAACC,EAAE,CAAC;MAClD,MAAMqB,KAAK,GAAG,IAAI,CAAC7C,OAAO,CAAC8C,SAAS,CAACP,CAAC,IAAIA,CAAC,CAACd,OAAO,KAAKA,OAAO,CAAC;MAChE,IAAIoB,KAAK,IAAI,CAAC,EAAE;QACZ,OAAO0B,UAAU;MACrB;MACA,IAAI,CAACvE,OAAO,CAACwE,IAAI,CAAC;QACd,GAAGjD,MAAM;QACTE,OAAO;QACPE,YAAY,EAAET,IAAI;QAClBU,OAAO,EAAEP;MACb,CAAC,CAAC;MACF,IAAIE,MAAM,CAACG,KAAK,KAAK,QAAQ,EAAE;QAC3B,OAAO6C,UAAU;MACrB;MACAA,UAAU,CAACC,IAAI,CAAC/C,OAAO,CAAC;MACxB,OAAO8C,UAAU;IACrB,CAAC,EAAE,EAAE,CAAC;EACV;AACJ;AAEA,OAAO,MAAME,mBAAmB,GAC5BC,MAAkC,IACjB;EACjB,MAAMC,MAAM,GAAG,IAAInF,mBAAmB,CAAC;IACnCmF,MAAM,EAAED,MAAM,CAACC;EACnB,CAAC,CAAC;EAEF,MAAMpE,aAAa,GAAG,IAAIpB,0BAA0B,CAAC;IACjDwF;EACJ,CAAC,CAAC;EAEF,MAAMlE,wBAAwB,GAAG,IAAIZ,qCAAqC,CAAC;IACvE8E;EACJ,CAAC,CAAC;EAEF,MAAMC,aAAa,GAAG,IAAIxF,0BAA0B,CAAC;IACjDuF;EACJ,CAAC,CAAC;EAEF,MAAMhE,eAAe,GAAG,IAAItB,4BAA4B,CAAC;IACrDsF;EACJ,CAAC,CAAC;EAEF,MAAME,SAAS,GAAG,IAAIvF,sBAAsB,CAAC;IACzCqF;EACJ,CAAC,CAAC;EAEF,MAAM9D,WAAW,GAAG,IAAItB,wBAAwB,CAAC;IAC7CoF;EACJ,CAAC,CAAC;EAEF,MAAM5D,eAAe,GAAG,IAAInB,4BAA4B,CAAC;IACrD+E;EACJ,CAAC,CAAC;EAEF,OAAO,IAAI7E,aAAa,CAAI;IACxBO,UAAU,EAAEqE,MAAM,CAACrE,UAAU;IAC7BE,aAAa;IACbE,wBAAwB;IACxBmE,aAAa;IACbjE,eAAe;IACfI,eAAe;IACf8D,SAAS;IACThE;EACJ,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["RecordLockingGetLockRecord","RecordLockingIsEntryLocked","RecordLockingListLockRecords","RecordLockingLockEntry","RecordLockingUnlockEntry","RecordLockingClient","createRecordLockingError","parseIdentifier","createCacheKey","RecordLockingUpdateEntryLock","RecordLockingGetLockedEntryLockRecord","RecordLocking","loading","records","onErrorCb","constructor","params","_setLoading","setLoading","_getLockRecord","getLockRecord","_getLockedEntryLockRecord","getLockedEntryLockRecord","_listLockRecords","listLockRecords","_unlockEntry","unlockEntry","_updateEntryLock","updateEntryLock","setRecords","folderId","type","result","fetchAndAssignRecords","undefined","map","record","id","entryId","$type","$lockingType","$locked","$selectable","fetchLockRecord","execute","data","error","ex","fetchLockedEntryLockRecord","getLockRecordEntry","find","isRecordLocked","r","expiresOn","isExpired","isLockExpired","triggerOnError","removeEntryLock","index","findIndex","force","onError","cb","setIsLoading","input","Date","length","assignedIdList","assignRecords","where","id_in","limit","console","message","code","lockedBy","lockedOn","actions","keys","cacheKey","currentRecordsCacheKey","currentRecordType","currentFolderId","reduce","collection","push","createRecordLocking","config","client","isEntryLocked","lockEntry"],"sources":["RecordLocking.ts"],"sourcesContent":["import type {\n IRecordLocking,\n IRecordLockingUpdateEntryLockResult\n} from \"./abstractions/IRecordLocking.js\";\nimport type { ApolloClient } from \"apollo-client\";\nimport { RecordLockingGetLockRecord } from \"./RecordLockingGetLockRecord.js\";\nimport { RecordLockingIsEntryLocked } from \"./RecordLockingIsEntryLocked.js\";\nimport { RecordLockingListLockRecords } from \"./RecordLockingListLockRecords.js\";\nimport { RecordLockingLockEntry } from \"./RecordLockingLockEntry.js\";\nimport { RecordLockingUnlockEntry } from \"./RecordLockingUnlockEntry.js\";\nimport { RecordLockingClient } from \"./RecordLockingClient.js\";\nimport type { IRecordLockingGetLockRecord } from \"./abstractions/IRecordLockingGetLockRecord.js\";\nimport type { IRecordLockingIsEntryLocked } from \"./abstractions/IRecordLockingIsEntryLocked.js\";\nimport type {\n IRecordLockingListLockRecords,\n IRecordLockingListLockRecordsResult\n} from \"./abstractions/IRecordLockingListLockRecords.js\";\nimport type { IRecordLockingLockEntry } from \"./abstractions/IRecordLockingLockEntry.js\";\nimport type {\n IRecordLockingUnlockEntry,\n IRecordLockingUnlockEntryResult\n} from \"./abstractions/IRecordLockingUnlockEntry.js\";\nimport type {\n IFetchLockedEntryLockRecordParams,\n IFetchLockRecordParams,\n IFetchLockRecordResult,\n IIsRecordLockedParams,\n IPossiblyRecordLockingRecord,\n IRecordLockingError,\n IRecordLockingLockRecord,\n IRecordLockingRecord,\n IUnlockEntryParams,\n IUpdateEntryLockParams\n} from \"~/types.js\";\nimport { createRecordLockingError } from \"./utils/createRecordLockingError.js\";\nimport { parseIdentifier } from \"@webiny/utils/parseIdentifier.js\";\nimport { createCacheKey } from \"~/utils/createCacheKey.js\";\nimport { RecordLockingUpdateEntryLock } from \"~/domain/RecordLockingUpdateEntryLock.js\";\nimport type { IRecordLockingUpdateEntryLock } from \"~/domain/abstractions/IRecordLockingUpdateEntryLock.js\";\nimport { RecordLockingGetLockedEntryLockRecord } from \"~/domain/RecordLockingGetLockedEntryLockRecord.js\";\nimport type { IRecordLockingGetLockedEntryLockRecord } from \"./abstractions/IRecordLockingGetLockedEntryLockRecord.js\";\n\nexport interface ICreateRecordLockingParams {\n client: ApolloClient<any>;\n setLoading: (loading: boolean) => void;\n}\n\nexport interface IRecordLockingParams {\n setLoading: (loading: boolean) => void;\n getLockRecord: IRecordLockingGetLockRecord;\n getLockedEntryLockRecord: IRecordLockingGetLockedEntryLockRecord;\n isEntryLocked: IRecordLockingIsEntryLocked;\n listLockRecords: IRecordLockingListLockRecords;\n lockEntry: IRecordLockingLockEntry;\n unlockEntry: IRecordLockingUnlockEntry;\n updateEntryLock: IRecordLockingUpdateEntryLock;\n}\n\nexport interface IOnErrorCb {\n (error: IRecordLockingError): void;\n}\n\nclass RecordLocking<\n T extends IPossiblyRecordLockingRecord = IPossiblyRecordLockingRecord\n> implements IRecordLocking<T> {\n private currentRecordType?: string;\n private currentFolderId?: string;\n private currentRecordsCacheKey?: string;\n private readonly _setLoading: (loading: boolean) => void;\n public loading = false;\n public records: IRecordLockingRecord[] = [];\n private readonly _getLockRecord: IRecordLockingGetLockRecord;\n private readonly _getLockedEntryLockRecord: IRecordLockingGetLockedEntryLockRecord;\n private readonly _listLockRecords: IRecordLockingListLockRecords;\n private readonly _unlockEntry: IRecordLockingUnlockEntry;\n private readonly _updateEntryLock: IRecordLockingUpdateEntryLock;\n\n private onErrorCb: IOnErrorCb | null = null;\n\n public constructor(params: IRecordLockingParams) {\n this._setLoading = params.setLoading;\n this._getLockRecord = params.getLockRecord;\n this._getLockedEntryLockRecord = params.getLockedEntryLockRecord;\n this._listLockRecords = params.listLockRecords;\n this._unlockEntry = params.unlockEntry;\n this._updateEntryLock = params.updateEntryLock;\n }\n\n public async setRecords(\n folderId: string,\n type: string,\n records: T[]\n ): Promise<IRecordLockingRecord[] | undefined> {\n const result = await this.fetchAndAssignRecords(folderId, type, records);\n if (!result) {\n return undefined;\n }\n\n return result.map(record => {\n const { id: entryId } = parseIdentifier(record.id);\n return {\n ...record,\n $type: \"RECORD\",\n $lockingType: type,\n $locked: record.$locked,\n $selectable: record.$locked ? false : record.$selectable,\n entryId\n };\n });\n }\n\n public async fetchLockRecord(params: IFetchLockRecordParams): Promise<IFetchLockRecordResult> {\n const { id, $lockingType } = params;\n\n const { id: entryId } = parseIdentifier(id);\n\n try {\n const result = await this._getLockRecord.execute({\n id: entryId,\n type: $lockingType\n });\n\n return {\n data: result.data,\n error: result.error\n };\n } catch (ex) {\n return {\n data: null,\n error: ex\n };\n }\n }\n\n public async fetchLockedEntryLockRecord(\n params: IFetchLockedEntryLockRecordParams\n ): Promise<IRecordLockingLockRecord | null> {\n const { id, $lockingType } = params;\n\n const { id: entryId } = parseIdentifier(id);\n const result = await this._getLockedEntryLockRecord.execute({\n id: entryId,\n type: $lockingType\n });\n return result.data;\n }\n\n public getLockRecordEntry(id: string): IRecordLockingRecord | undefined {\n return this.records.find(record => {\n const { id: entryId } = parseIdentifier(id);\n return record.entryId === entryId;\n });\n }\n\n public isRecordLocked(record: IIsRecordLockedParams): boolean {\n const result = this.records.find(r => {\n const { id: entryId } = parseIdentifier(record.id);\n\n return r.entryId === entryId && !!r.$locked && r.$lockingType === record.$lockingType;\n });\n if (!result?.$locked?.expiresOn) {\n return false;\n }\n const isExpired = this.isLockExpired(result.$locked.expiresOn);\n return !isExpired;\n }\n\n public async updateEntryLock(\n params: IUpdateEntryLockParams\n ): Promise<IRecordLockingUpdateEntryLockResult> {\n try {\n return await this._updateEntryLock.execute({\n id: params.id,\n type: params.$lockingType\n });\n } catch (ex) {\n this.triggerOnError(ex);\n return {\n data: null,\n error: ex\n };\n }\n }\n\n public removeEntryLock(params: IUnlockEntryParams): void {\n const index = this.records.findIndex(record => {\n return record.entryId === params.id && record.$lockingType === params.$lockingType;\n });\n if (index === -1) {\n return;\n }\n this.records[index] = {\n ...this.records[index],\n $locked: null,\n $selectable: true\n };\n }\n\n public async unlockEntry(\n params: IUnlockEntryParams,\n force?: boolean\n ): Promise<IRecordLockingUnlockEntryResult> {\n try {\n const result = await this._unlockEntry.execute({\n id: params.id,\n type: params.$lockingType,\n force\n });\n\n const id = result.data?.id;\n if (!id) {\n return result;\n }\n this.removeEntryLock({\n ...params\n });\n return result;\n } catch (ex) {\n this.triggerOnError(ex);\n return {\n data: null,\n error: ex\n };\n }\n }\n\n public onError(cb: IOnErrorCb): void {\n this.onErrorCb = cb;\n }\n\n public triggerOnError(error: IRecordLockingError): void {\n this.setIsLoading(false);\n if (!this.onErrorCb) {\n return;\n }\n this.onErrorCb(error);\n }\n\n public isLockExpired(input: Date | string): boolean {\n const expiresOn = new Date(input);\n return expiresOn <= new Date();\n }\n\n private setIsLoading(loading: boolean): void {\n this._setLoading(loading);\n this.loading = loading;\n }\n\n private async fetchAndAssignRecords(\n folderId: string,\n type: string,\n records: T[]\n ): Promise<IPossiblyRecordLockingRecord[] | undefined> {\n if (records.length === 0) {\n return;\n } else if (this.loading) {\n return;\n }\n const assignedIdList = await this.assignRecords(folderId, type, records);\n if (assignedIdList.length === 0) {\n return;\n }\n this.setIsLoading(true);\n let result: IRecordLockingListLockRecordsResult;\n try {\n result = await this._listLockRecords.execute({\n where: {\n id_in: assignedIdList,\n type\n },\n limit: 10000\n });\n } catch (ex) {\n console.error(ex);\n this.triggerOnError(ex);\n return;\n } finally {\n this.setIsLoading(false);\n }\n if (result.error) {\n this.triggerOnError(result.error);\n return;\n } else if (!result.data) {\n this.triggerOnError(\n createRecordLockingError({\n message: `There is no data in the result and there is no error. Please check the network tab for more info.`,\n code: \"NO_DATA_IN_RESULT\"\n })\n );\n return;\n } else if (result.data.length === 0) {\n return;\n }\n\n for (const record of result.data) {\n const index = this.records.findIndex(r => {\n const { id: entryId } = parseIdentifier(record.id);\n return r.entryId === entryId;\n });\n if (index < 0) {\n console.error(`There is no record with id ${record.id} in the records array.`);\n continue;\n }\n this.records[index] = {\n ...this.records[index],\n $locked: {\n lockedBy: record.lockedBy,\n expiresOn: record.expiresOn,\n lockedOn: record.lockedOn,\n actions: record.actions\n }\n };\n }\n\n return this.records;\n }\n /**\n * Assign records and return the assigned ID list.\n */\n private async assignRecords(folderId: string, type: string, records: T[]): Promise<string[]> {\n /**\n * First we check the record keys against ones in the local cache.\n */\n const keys = records.map(record => {\n if (record.entryId) {\n return record.entryId;\n }\n const { id: entryId } = parseIdentifier(record.id);\n return entryId;\n });\n const cacheKey = await createCacheKey(keys);\n if (this.currentRecordsCacheKey === cacheKey) {\n return [];\n }\n this.currentRecordsCacheKey = cacheKey;\n\n /**\n * Reset records if new type is not as same as the old type / folderId.\n */\n if (this.currentRecordType !== type || this.currentFolderId !== folderId) {\n this.records = [];\n this.currentRecordType = type;\n this.currentFolderId = folderId;\n }\n\n return records.reduce<string[]>((collection, record) => {\n const { id: entryId } = parseIdentifier(record.id);\n const index = this.records.findIndex(r => r.entryId === entryId);\n if (index >= 0) {\n return collection;\n }\n this.records.push({\n ...record,\n entryId,\n $lockingType: type,\n $locked: undefined\n });\n if (record.$type !== \"RECORD\") {\n return collection;\n }\n collection.push(entryId);\n return collection;\n }, []);\n }\n}\n\nexport const createRecordLocking = <T extends IRecordLockingRecord>(\n config: ICreateRecordLockingParams\n): IRecordLocking => {\n const client = new RecordLockingClient({\n client: config.client\n });\n\n const getLockRecord = new RecordLockingGetLockRecord({\n client\n });\n\n const getLockedEntryLockRecord = new RecordLockingGetLockedEntryLockRecord({\n client\n });\n\n const isEntryLocked = new RecordLockingIsEntryLocked({\n client\n });\n\n const listLockRecords = new RecordLockingListLockRecords({\n client\n });\n\n const lockEntry = new RecordLockingLockEntry({\n client\n });\n\n const unlockEntry = new RecordLockingUnlockEntry({\n client\n });\n\n const updateEntryLock = new RecordLockingUpdateEntryLock({\n client\n });\n\n return new RecordLocking<T>({\n setLoading: config.setLoading,\n getLockRecord,\n getLockedEntryLockRecord,\n isEntryLocked,\n listLockRecords,\n updateEntryLock,\n lockEntry,\n unlockEntry\n });\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["GET_LOCKED_ENTRY_LOCK_RECORD_QUERY","WebinyError","RecordLockingGetLockedEntryLockRecord","constructor","params","client","execute","result","query","variables","data","recordLocking","getLockedEntryLockRecord","error"],"sources":["RecordLockingGetLockedEntryLockRecord.ts"],"sourcesContent":["import type { IRecordLockingClient } from \"~/domain/abstractions/IRecordLockingClient.js\";\nimport type {\n IRecordLockingGetLockedEntryLockRecordResponse,\n IRecordLockingGetLockedEntryLockRecordVariables\n} from \"~/domain/graphql/getLockedEntryLockRecord.js\";\nimport { GET_LOCKED_ENTRY_LOCK_RECORD_QUERY } from \"~/domain/graphql/getLockedEntryLockRecord.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport type {\n IRecordLockingGetLockedEntryLockRecord,\n IRecordLockingGetLockedEntryLockRecordExecuteParams,\n IRecordLockingGetLockedEntryLockRecordExecuteResult\n} from \"~/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.js\";\n\ninterface Params {\n client: IRecordLockingClient;\n}\n\nexport class RecordLockingGetLockedEntryLockRecord\n implements IRecordLockingGetLockedEntryLockRecord\n{\n private readonly client: IRecordLockingClient;\n\n public constructor(params: Params) {\n this.client = params.client;\n }\n public async execute(\n params: IRecordLockingGetLockedEntryLockRecordExecuteParams\n ): Promise<IRecordLockingGetLockedEntryLockRecordExecuteResult> {\n const result = await this.client.query<\n IRecordLockingGetLockedEntryLockRecordResponse,\n IRecordLockingGetLockedEntryLockRecordVariables\n >({\n query: GET_LOCKED_ENTRY_LOCK_RECORD_QUERY,\n variables: params\n });\n if (result.data.recordLocking.getLockedEntryLockRecord.error) {\n throw new WebinyError(result.data.recordLocking.getLockedEntryLockRecord.error);\n }\n return result.data.recordLocking.getLockedEntryLockRecord;\n }\n}\n"],"mappings":"AAKA,SAASA,kCAAkC;AAC3C,SAASC,WAAW,QAAQ,eAAe;AAW3C,OAAO,MAAMC,qCAAqC,CAElD;EAGWC,WAAWA,CAACC,MAAc,EAAE;IAC/B,IAAI,CAACC,MAAM,GAAGD,MAAM,CAACC,MAAM;EAC/B;EACA,MAAaC,OAAOA,CAChBF,MAA2D,EACC;IAC5D,MAAMG,MAAM,GAAG,MAAM,IAAI,CAACF,MAAM,CAACG,KAAK,CAGpC;MACEA,KAAK,EAAER,kCAAkC;MACzCS,SAAS,EAAEL;IACf,CAAC,CAAC;IACF,IAAIG,MAAM,CAACG,IAAI,CAACC,aAAa,CAACC,wBAAwB,CAACC,KAAK,EAAE;MAC1D,MAAM,IAAIZ,WAAW,CAACM,MAAM,CAACG,IAAI,CAACC,aAAa,CAACC,wBAAwB,CAACC,KAAK,CAAC;IACnF;IACA,OAAON,MAAM,CAACG,IAAI,CAACC,aAAa,CAACC,wBAAwB;EAC7D;AACJ","ignoreList":[]}
1
+ {"version":3,"names":["GET_LOCKED_ENTRY_LOCK_RECORD_QUERY","WebinyError","RecordLockingGetLockedEntryLockRecord","constructor","params","client","execute","result","query","variables","data","recordLocking","getLockedEntryLockRecord","error"],"sources":["RecordLockingGetLockedEntryLockRecord.ts"],"sourcesContent":["import type { IRecordLockingClient } from \"~/domain/abstractions/IRecordLockingClient.js\";\nimport type {\n IRecordLockingGetLockedEntryLockRecordResponse,\n IRecordLockingGetLockedEntryLockRecordVariables\n} from \"~/domain/graphql/getLockedEntryLockRecord.js\";\nimport { GET_LOCKED_ENTRY_LOCK_RECORD_QUERY } from \"~/domain/graphql/getLockedEntryLockRecord.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport type {\n IRecordLockingGetLockedEntryLockRecord,\n IRecordLockingGetLockedEntryLockRecordExecuteParams,\n IRecordLockingGetLockedEntryLockRecordExecuteResult\n} from \"~/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.js\";\n\ninterface Params {\n client: IRecordLockingClient;\n}\n\nexport class RecordLockingGetLockedEntryLockRecord implements IRecordLockingGetLockedEntryLockRecord {\n private readonly client: IRecordLockingClient;\n\n public constructor(params: Params) {\n this.client = params.client;\n }\n public async execute(\n params: IRecordLockingGetLockedEntryLockRecordExecuteParams\n ): Promise<IRecordLockingGetLockedEntryLockRecordExecuteResult> {\n const result = await this.client.query<\n IRecordLockingGetLockedEntryLockRecordResponse,\n IRecordLockingGetLockedEntryLockRecordVariables\n >({\n query: GET_LOCKED_ENTRY_LOCK_RECORD_QUERY,\n variables: params\n });\n if (result.data.recordLocking.getLockedEntryLockRecord.error) {\n throw new WebinyError(result.data.recordLocking.getLockedEntryLockRecord.error);\n }\n return result.data.recordLocking.getLockedEntryLockRecord;\n }\n}\n"],"mappings":"AAKA,SAASA,kCAAkC;AAC3C,SAASC,WAAW,QAAQ,eAAe;AAW3C,OAAO,MAAMC,qCAAqC,CAAmD;EAG1FC,WAAWA,CAACC,MAAc,EAAE;IAC/B,IAAI,CAACC,MAAM,GAAGD,MAAM,CAACC,MAAM;EAC/B;EACA,MAAaC,OAAOA,CAChBF,MAA2D,EACC;IAC5D,MAAMG,MAAM,GAAG,MAAM,IAAI,CAACF,MAAM,CAACG,KAAK,CAGpC;MACEA,KAAK,EAAER,kCAAkC;MACzCS,SAAS,EAAEL;IACf,CAAC,CAAC;IACF,IAAIG,MAAM,CAACG,IAAI,CAACC,aAAa,CAACC,wBAAwB,CAACC,KAAK,EAAE;MAC1D,MAAM,IAAIZ,WAAW,CAACM,MAAM,CAACG,IAAI,CAACC,aAAa,CAACC,wBAAwB,CAACC,KAAK,CAAC;IACnF;IACA,OAAON,MAAM,CAACG,IAAI,CAACC,aAAa,CAACC,wBAAwB;EAC7D;AACJ","ignoreList":[]}
@@ -4,7 +4,7 @@ export class RecordLockingLockEntry {
4
4
  this.client = params.client;
5
5
  }
6
6
  async execute(
7
- // eslint-disable-next-line
7
+ // oxlint-disable-next-line
8
8
  params) {
9
9
  throw new WebinyError("Method not implemented.");
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"names":["WebinyError","RecordLockingLockEntry","constructor","params","client","execute"],"sources":["RecordLockingLockEntry.ts"],"sourcesContent":["import { WebinyError } from \"@webiny/error\";\nimport type {\n IRecordLockingLockEntry,\n IRecordLockingLockEntryParams,\n IRecordLockingLockEntryResult\n} from \"~/domain/abstractions/IRecordLockingLockEntry.js\";\nimport type { IRecordLockingClient } from \"./abstractions/IRecordLockingClient.js\";\n\ninterface Params {\n client: IRecordLockingClient;\n}\n\nexport class RecordLockingLockEntry implements IRecordLockingLockEntry {\n private readonly client: IRecordLockingClient;\n\n public constructor(params: Params) {\n this.client = params.client;\n }\n public async execute(\n // eslint-disable-next-line\n params: IRecordLockingLockEntryParams\n ): Promise<IRecordLockingLockEntryResult> {\n throw new WebinyError(\"Method not implemented.\");\n }\n}\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,eAAe;AAY3C,OAAO,MAAMC,sBAAsB,CAAoC;EAG5DC,WAAWA,CAACC,MAAc,EAAE;IAC/B,IAAI,CAACC,MAAM,GAAGD,MAAM,CAACC,MAAM;EAC/B;EACA,MAAaC,OAAOA;EAChB;EACAF,MAAqC,EACC;IACtC,MAAM,IAAIH,WAAW,CAAC,yBAAyB,CAAC;EACpD;AACJ","ignoreList":[]}
1
+ {"version":3,"names":["WebinyError","RecordLockingLockEntry","constructor","params","client","execute"],"sources":["RecordLockingLockEntry.ts"],"sourcesContent":["import { WebinyError } from \"@webiny/error\";\nimport type {\n IRecordLockingLockEntry,\n IRecordLockingLockEntryParams,\n IRecordLockingLockEntryResult\n} from \"~/domain/abstractions/IRecordLockingLockEntry.js\";\nimport type { IRecordLockingClient } from \"./abstractions/IRecordLockingClient.js\";\n\ninterface Params {\n client: IRecordLockingClient;\n}\n\nexport class RecordLockingLockEntry implements IRecordLockingLockEntry {\n private readonly client: IRecordLockingClient;\n\n public constructor(params: Params) {\n this.client = params.client;\n }\n public async execute(\n // oxlint-disable-next-line\n params: IRecordLockingLockEntryParams\n ): Promise<IRecordLockingLockEntryResult> {\n throw new WebinyError(\"Method not implemented.\");\n }\n}\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,eAAe;AAY3C,OAAO,MAAMC,sBAAsB,CAAoC;EAG5DC,WAAWA,CAACC,MAAc,EAAE;IAC/B,IAAI,CAACC,MAAM,GAAGD,MAAM,CAACC,MAAM;EAC/B;EACA,MAAaC,OAAOA;EAChB;EACAF,MAAqC,EACC;IACtC,MAAM,IAAIH,WAAW,CAAC,yBAAyB,CAAC;EACpD;AACJ","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ export declare const RECORD_LOCKING_PERMISSIONS_SCHEMA: {
2
+ readonly prefix: "recordLocking";
3
+ readonly fullAccess: {
4
+ readonly canForceUnlock: true;
5
+ };
6
+ };
@@ -0,0 +1,9 @@
1
+ import { createPermissionSchema } from "@webiny/app-admin";
2
+ export const RECORD_LOCKING_PERMISSIONS_SCHEMA = createPermissionSchema({
3
+ prefix: "recordLocking",
4
+ fullAccess: {
5
+ canForceUnlock: true
6
+ }
7
+ });
8
+
9
+ //# sourceMappingURL=permissionsSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createPermissionSchema","RECORD_LOCKING_PERMISSIONS_SCHEMA","prefix","fullAccess","canForceUnlock"],"sources":["permissionsSchema.ts"],"sourcesContent":["import { createPermissionSchema } from \"@webiny/app-admin\";\n\nexport const RECORD_LOCKING_PERMISSIONS_SCHEMA = createPermissionSchema({\n prefix: \"recordLocking\",\n fullAccess: { canForceUnlock: true }\n});\n"],"mappings":"AAAA,SAASA,sBAAsB,QAAQ,mBAAmB;AAE1D,OAAO,MAAMC,iCAAiC,GAAGD,sBAAsB,CAAC;EACpEE,MAAM,EAAE,eAAe;EACvBC,UAAU,EAAE;IAAEC,cAAc,EAAE;EAAK;AACvC,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ import type { Permissions } from "@webiny/app-admin/exports/admin/security.js";
2
+ import { RECORD_LOCKING_PERMISSIONS_SCHEMA } from "../../domain/permissionsSchema.js";
3
+ export declare const RecordLockingPermissions: import("@webiny/di").Abstraction<{
4
+ canAccess: (entityId: never) => boolean;
5
+ canAction: (action: string, entityId: never) => boolean;
6
+ } & {
7
+ canRead: (entityId: string) => boolean;
8
+ canCreate: (entityId: string) => boolean;
9
+ canEdit: (entityId: string, item?: import("@webiny/app-admin/permissions").OwnableItem) => boolean;
10
+ canDelete: (entityId: string, item?: import("@webiny/app-admin/permissions").OwnableItem) => boolean;
11
+ } & {
12
+ canPublish: (entityId: string) => boolean;
13
+ canUnpublish: (entityId: string) => boolean;
14
+ }>;
15
+ export declare namespace RecordLockingPermissions {
16
+ type Interface = Permissions<typeof RECORD_LOCKING_PERMISSIONS_SCHEMA>;
17
+ }
@@ -0,0 +1,5 @@
1
+ import { createPermissionsAbstraction } from "@webiny/app-admin/exports/admin/security.js";
2
+ import { RECORD_LOCKING_PERMISSIONS_SCHEMA } from "../../domain/permissionsSchema.js";
3
+ export const RecordLockingPermissions = createPermissionsAbstraction(RECORD_LOCKING_PERMISSIONS_SCHEMA);
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createPermissionsAbstraction","RECORD_LOCKING_PERMISSIONS_SCHEMA","RecordLockingPermissions"],"sources":["abstractions.ts"],"sourcesContent":["import { createPermissionsAbstraction } from \"@webiny/app-admin/exports/admin/security.js\";\nimport type { Permissions } from \"@webiny/app-admin/exports/admin/security.js\";\nimport { RECORD_LOCKING_PERMISSIONS_SCHEMA } from \"~/domain/permissionsSchema.js\";\n\nexport const RecordLockingPermissions = createPermissionsAbstraction(\n RECORD_LOCKING_PERMISSIONS_SCHEMA\n);\n\nexport namespace RecordLockingPermissions {\n export type Interface = Permissions<typeof RECORD_LOCKING_PERMISSIONS_SCHEMA>;\n}\n"],"mappings":"AAAA,SAASA,4BAA4B,QAAQ,6CAA6C;AAE1F,SAASC,iCAAiC;AAE1C,OAAO,MAAMC,wBAAwB,GAAGF,4BAA4B,CAChEC,iCACJ,CAAC","ignoreList":[]}
@@ -0,0 +1,14 @@
1
+ export declare const RecordLockingPermissionsFeature: import("@webiny/feature/admin/createFeature.js").FeatureDefinition<{
2
+ permissions: {
3
+ canAccess: (entityId: never) => boolean;
4
+ canAction: (action: string, entityId: never) => boolean;
5
+ } & {
6
+ canRead: (entityId: string) => boolean;
7
+ canCreate: (entityId: string) => boolean;
8
+ canEdit: (entityId: string, item?: import("@webiny/app-admin/index.js").OwnableItem) => boolean;
9
+ canDelete: (entityId: string, item?: import("@webiny/app-admin/index.js").OwnableItem) => boolean;
10
+ } & {
11
+ canPublish: (entityId: string) => boolean;
12
+ canUnpublish: (entityId: string) => boolean;
13
+ };
14
+ }, []>;
@@ -0,0 +1,6 @@
1
+ import { createPermissionsFeature } from "@webiny/app-admin/exports/admin/security.js";
2
+ import { RECORD_LOCKING_PERMISSIONS_SCHEMA } from "../../domain/permissionsSchema.js";
3
+ import { RecordLockingPermissions } from "./abstractions.js";
4
+ export const RecordLockingPermissionsFeature = createPermissionsFeature(RECORD_LOCKING_PERMISSIONS_SCHEMA, RecordLockingPermissions);
5
+
6
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createPermissionsFeature","RECORD_LOCKING_PERMISSIONS_SCHEMA","RecordLockingPermissions","RecordLockingPermissionsFeature"],"sources":["feature.ts"],"sourcesContent":["import { createPermissionsFeature } from \"@webiny/app-admin/exports/admin/security.js\";\nimport { RECORD_LOCKING_PERMISSIONS_SCHEMA } from \"~/domain/permissionsSchema.js\";\nimport { RecordLockingPermissions } from \"./abstractions.js\";\n\nexport const RecordLockingPermissionsFeature = createPermissionsFeature(\n RECORD_LOCKING_PERMISSIONS_SCHEMA,\n RecordLockingPermissions\n);\n"],"mappings":"AAAA,SAASA,wBAAwB,QAAQ,6CAA6C;AACtF,SAASC,iCAAiC;AAC1C,SAASC,wBAAwB;AAEjC,OAAO,MAAMC,+BAA+B,GAAGH,wBAAwB,CACnEC,iCAAiC,EACjCC,wBACJ,CAAC","ignoreList":[]}
@@ -10,7 +10,7 @@ export const usePermission = () => {
10
10
  return true;
11
11
  }
12
12
  const permission = identity.getPermission("recordLocking");
13
- return permission?.canForceUnlock === "yes";
13
+ return permission?.canForceUnlock === true;
14
14
  }, [identity]);
15
15
  return {
16
16
  canForceUnlock
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","useIdentity","usePermission","identity","canForceUnlock","hasFullAccess","getPermission","permission"],"sources":["usePermission.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useIdentity } from \"@webiny/app-admin\";\n\nexport const usePermission = () => {\n const { identity } = useIdentity();\n\n const canForceUnlock = useMemo(() => {\n const hasFullAccess = !!identity.getPermission(\"recordLocking.*\");\n if (hasFullAccess) {\n return true;\n }\n const permission = identity.getPermission(\"recordLocking\");\n return permission?.canForceUnlock === \"yes\";\n }, [identity]);\n\n return {\n canForceUnlock\n };\n};\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,WAAW,QAAQ,mBAAmB;AAE/C,OAAO,MAAMC,aAAa,GAAGA,CAAA,KAAM;EAC/B,MAAM;IAAEC;EAAS,CAAC,GAAGF,WAAW,CAAC,CAAC;EAElC,MAAMG,cAAc,GAAGJ,OAAO,CAAC,MAAM;IACjC,MAAMK,aAAa,GAAG,CAAC,CAACF,QAAQ,CAACG,aAAa,CAAC,iBAAiB,CAAC;IACjE,IAAID,aAAa,EAAE;MACf,OAAO,IAAI;IACf;IACA,MAAME,UAAU,GAAGJ,QAAQ,CAACG,aAAa,CAAC,eAAe,CAAC;IAC1D,OAAOC,UAAU,EAAEH,cAAc,KAAK,KAAK;EAC/C,CAAC,EAAE,CAACD,QAAQ,CAAC,CAAC;EAEd,OAAO;IACHC;EACJ,CAAC;AACL,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useMemo","useIdentity","usePermission","identity","canForceUnlock","hasFullAccess","getPermission","permission"],"sources":["usePermission.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useIdentity } from \"@webiny/app-admin\";\n\nexport const usePermission = () => {\n const { identity } = useIdentity();\n\n const canForceUnlock = useMemo(() => {\n const hasFullAccess = !!identity.getPermission(\"recordLocking.*\");\n if (hasFullAccess) {\n return true;\n }\n const permission = identity.getPermission(\"recordLocking\");\n return permission?.canForceUnlock === true;\n }, [identity]);\n\n return {\n canForceUnlock\n };\n};\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,WAAW,QAAQ,mBAAmB;AAE/C,OAAO,MAAMC,aAAa,GAAGA,CAAA,KAAM;EAC/B,MAAM;IAAEC;EAAS,CAAC,GAAGF,WAAW,CAAC,CAAC;EAElC,MAAMG,cAAc,GAAGJ,OAAO,CAAC,MAAM;IACjC,MAAMK,aAAa,GAAG,CAAC,CAACF,QAAQ,CAACG,aAAa,CAAC,iBAAiB,CAAC;IACjE,IAAID,aAAa,EAAE;MACf,OAAO,IAAI;IACf;IACA,MAAME,UAAU,GAAGJ,QAAQ,CAACG,aAAa,CAAC,eAAe,CAAC;IAC1D,OAAOC,UAAU,EAAEH,cAAc,KAAK,IAAI;EAC9C,CAAC,EAAE,CAACD,QAAQ,CAAC,CAAC;EAEd,OAAO;IACHC;EACJ,CAAC;AACL,CAAC","ignoreList":[]}
package/index.js CHANGED
@@ -1,11 +1,12 @@
1
1
  import React from "react";
2
2
  import { Provider } from "@webiny/app";
3
+ import { RegisterFeature } from "@webiny/app-admin";
3
4
  import { RecordLockingProvider as RecordLockingProviderComponent } from "./components/RecordLockingProvider.js";
4
5
  import { HeadlessCmsActionsAcoCell } from "./components/HeadlessCmsActionsAcoCell.js";
5
6
  import { HeadlessCmsContentEntry } from "./components/HeadlessCmsContentEntry/index.js";
6
7
  import { useWcp } from "@webiny/app-admin";
7
- import { plugins } from "@webiny/plugins";
8
- import { recordLockingPermissionRenderer } from "./components/permissionRenderer/index.js";
8
+ import { SecurityPermissions } from "./components/SecurityPermissions.js";
9
+ import { RecordLockingPermissionsFeature } from "./features/permissions/feature.js";
9
10
  export * from "./components/RecordLockingProvider.js";
10
11
  export * from "./hooks/index.js";
11
12
  const RecordLockingHoc = Component => {
@@ -20,8 +21,9 @@ export const RecordLocking = () => {
20
21
  if (!wcp.canUseRecordLocking()) {
21
22
  return null;
22
23
  }
23
- plugins.register(recordLockingPermissionRenderer);
24
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Provider, {
24
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(RegisterFeature, {
25
+ feature: RecordLockingPermissionsFeature
26
+ }), /*#__PURE__*/React.createElement(SecurityPermissions, null), /*#__PURE__*/React.createElement(Provider, {
25
27
  hoc: RecordLockingHoc
26
28
  }), /*#__PURE__*/React.createElement(HeadlessCmsActionsAcoCell, null), /*#__PURE__*/React.createElement(HeadlessCmsContentEntry, null));
27
29
  };
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["React","Provider","RecordLockingProvider","RecordLockingProviderComponent","HeadlessCmsActionsAcoCell","HeadlessCmsContentEntry","useWcp","plugins","recordLockingPermissionRenderer","RecordLockingHoc","Component","children","createElement","RecordLocking","wcp","canUseRecordLocking","register","Fragment","hoc"],"sources":["index.tsx"],"sourcesContent":["import React from \"react\";\nimport { Provider } from \"@webiny/app\";\nimport { RecordLockingProvider as RecordLockingProviderComponent } from \"~/components/RecordLockingProvider.js\";\nimport { HeadlessCmsActionsAcoCell } from \"~/components/HeadlessCmsActionsAcoCell.js\";\nimport { HeadlessCmsContentEntry } from \"~/components/HeadlessCmsContentEntry/index.js\";\nimport { useWcp } from \"@webiny/app-admin\";\nimport { plugins } from \"@webiny/plugins\";\nimport { recordLockingPermissionRenderer } from \"~/components/permissionRenderer/index.js\";\n\nexport * from \"~/components/RecordLockingProvider.js\";\nexport * from \"~/hooks/index.js\";\n\nexport interface RecordLockingProviderProps {\n children: React.ReactNode;\n}\n\nconst RecordLockingHoc = (Component: React.ComponentType<RecordLockingProviderProps>) => {\n return function RecordLockingProvider({ children }: RecordLockingProviderProps) {\n return (\n <Component>\n <RecordLockingProviderComponent>{children}</RecordLockingProviderComponent>\n </Component>\n );\n };\n};\n\nexport const RecordLocking = () => {\n const wcp = useWcp();\n\n if (!wcp.canUseRecordLocking()) {\n return null;\n }\n plugins.register(recordLockingPermissionRenderer);\n\n return (\n <>\n <Provider hoc={RecordLockingHoc} />\n <HeadlessCmsActionsAcoCell />\n <HeadlessCmsContentEntry />\n </>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,QAAQ,QAAQ,aAAa;AACtC,SAASC,qBAAqB,IAAIC,8BAA8B;AAChE,SAASC,yBAAyB;AAClC,SAASC,uBAAuB;AAChC,SAASC,MAAM,QAAQ,mBAAmB;AAC1C,SAASC,OAAO,QAAQ,iBAAiB;AACzC,SAASC,+BAA+B;AAExC;AACA;AAMA,MAAMC,gBAAgB,GAAIC,SAA0D,IAAK;EACrF,OAAO,SAASR,qBAAqBA,CAAC;IAAES;EAAqC,CAAC,EAAE;IAC5E,oBACIX,KAAA,CAAAY,aAAA,CAACF,SAAS,qBACNV,KAAA,CAAAY,aAAA,CAACT,8BAA8B,QAAEQ,QAAyC,CACnE,CAAC;EAEpB,CAAC;AACL,CAAC;AAED,OAAO,MAAME,aAAa,GAAGA,CAAA,KAAM;EAC/B,MAAMC,GAAG,GAAGR,MAAM,CAAC,CAAC;EAEpB,IAAI,CAACQ,GAAG,CAACC,mBAAmB,CAAC,CAAC,EAAE;IAC5B,OAAO,IAAI;EACf;EACAR,OAAO,CAACS,QAAQ,CAACR,+BAA+B,CAAC;EAEjD,oBACIR,KAAA,CAAAY,aAAA,CAAAZ,KAAA,CAAAiB,QAAA,qBACIjB,KAAA,CAAAY,aAAA,CAACX,QAAQ;IAACiB,GAAG,EAAET;EAAiB,CAAE,CAAC,eACnCT,KAAA,CAAAY,aAAA,CAACR,yBAAyB,MAAE,CAAC,eAC7BJ,KAAA,CAAAY,aAAA,CAACP,uBAAuB,MAAE,CAC5B,CAAC;AAEX,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","Provider","RegisterFeature","RecordLockingProvider","RecordLockingProviderComponent","HeadlessCmsActionsAcoCell","HeadlessCmsContentEntry","useWcp","SecurityPermissions","RecordLockingPermissionsFeature","RecordLockingHoc","Component","children","createElement","RecordLocking","wcp","canUseRecordLocking","Fragment","feature","hoc"],"sources":["index.tsx"],"sourcesContent":["import React from \"react\";\nimport { Provider } from \"@webiny/app\";\nimport { RegisterFeature } from \"@webiny/app-admin\";\nimport { RecordLockingProvider as RecordLockingProviderComponent } from \"~/components/RecordLockingProvider.js\";\nimport { HeadlessCmsActionsAcoCell } from \"~/components/HeadlessCmsActionsAcoCell.js\";\nimport { HeadlessCmsContentEntry } from \"~/components/HeadlessCmsContentEntry/index.js\";\nimport { useWcp } from \"@webiny/app-admin\";\nimport { SecurityPermissions } from \"~/components/SecurityPermissions.js\";\nimport { RecordLockingPermissionsFeature } from \"~/features/permissions/feature.js\";\n\nexport * from \"~/components/RecordLockingProvider.js\";\nexport * from \"~/hooks/index.js\";\n\nexport interface RecordLockingProviderProps {\n children: React.ReactNode;\n}\n\nconst RecordLockingHoc = (Component: React.ComponentType<RecordLockingProviderProps>) => {\n return function RecordLockingProvider({ children }: RecordLockingProviderProps) {\n return (\n <Component>\n <RecordLockingProviderComponent>{children}</RecordLockingProviderComponent>\n </Component>\n );\n };\n};\n\nexport const RecordLocking = () => {\n const wcp = useWcp();\n\n if (!wcp.canUseRecordLocking()) {\n return null;\n }\n\n return (\n <>\n <RegisterFeature feature={RecordLockingPermissionsFeature} />\n <SecurityPermissions />\n <Provider hoc={RecordLockingHoc} />\n <HeadlessCmsActionsAcoCell />\n <HeadlessCmsContentEntry />\n </>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,QAAQ,QAAQ,aAAa;AACtC,SAASC,eAAe,QAAQ,mBAAmB;AACnD,SAASC,qBAAqB,IAAIC,8BAA8B;AAChE,SAASC,yBAAyB;AAClC,SAASC,uBAAuB;AAChC,SAASC,MAAM,QAAQ,mBAAmB;AAC1C,SAASC,mBAAmB;AAC5B,SAASC,+BAA+B;AAExC;AACA;AAMA,MAAMC,gBAAgB,GAAIC,SAA0D,IAAK;EACrF,OAAO,SAASR,qBAAqBA,CAAC;IAAES;EAAqC,CAAC,EAAE;IAC5E,oBACIZ,KAAA,CAAAa,aAAA,CAACF,SAAS,qBACNX,KAAA,CAAAa,aAAA,CAACT,8BAA8B,QAAEQ,QAAyC,CACnE,CAAC;EAEpB,CAAC;AACL,CAAC;AAED,OAAO,MAAME,aAAa,GAAGA,CAAA,KAAM;EAC/B,MAAMC,GAAG,GAAGR,MAAM,CAAC,CAAC;EAEpB,IAAI,CAACQ,GAAG,CAACC,mBAAmB,CAAC,CAAC,EAAE;IAC5B,OAAO,IAAI;EACf;EAEA,oBACIhB,KAAA,CAAAa,aAAA,CAAAb,KAAA,CAAAiB,QAAA,qBACIjB,KAAA,CAAAa,aAAA,CAACX,eAAe;IAACgB,OAAO,EAAET;EAAgC,CAAE,CAAC,eAC7DT,KAAA,CAAAa,aAAA,CAACL,mBAAmB,MAAE,CAAC,eACvBR,KAAA,CAAAa,aAAA,CAACZ,QAAQ;IAACkB,GAAG,EAAET;EAAiB,CAAE,CAAC,eACnCV,KAAA,CAAAa,aAAA,CAACR,yBAAyB,MAAE,CAAC,eAC7BL,KAAA,CAAAa,aAAA,CAACP,uBAAuB,MAAE,CAC5B,CAAC;AAEX,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@webiny/app-record-locking",
3
- "version": "0.0.0-unstable.e622468070",
3
+ "version": "0.0.0-unstable.e6f0dc8ca7",
4
4
  "type": "module",
5
- "main": "index.js",
5
+ "exports": {
6
+ ".": "./index.js",
7
+ "./*": "./*"
8
+ },
6
9
  "repository": {
7
10
  "type": "git",
8
11
  "url": "https://github.com/webiny/webiny-js.git"
@@ -15,32 +18,30 @@
15
18
  "license": "MIT",
16
19
  "dependencies": {
17
20
  "@apollo/react-hooks": "3.1.5",
18
- "@webiny/admin-ui": "0.0.0-unstable.e622468070",
19
- "@webiny/app": "0.0.0-unstable.e622468070",
20
- "@webiny/app-aco": "0.0.0-unstable.e622468070",
21
- "@webiny/app-admin": "0.0.0-unstable.e622468070",
22
- "@webiny/app-headless-cms": "0.0.0-unstable.e622468070",
23
- "@webiny/app-websockets": "0.0.0-unstable.e622468070",
24
- "@webiny/error": "0.0.0-unstable.e622468070",
25
- "@webiny/form": "0.0.0-unstable.e622468070",
26
- "@webiny/icons": "0.0.0-unstable.e622468070",
27
- "@webiny/plugins": "0.0.0-unstable.e622468070",
28
- "@webiny/utils": "0.0.0-unstable.e622468070",
21
+ "@webiny/admin-ui": "0.0.0-unstable.e6f0dc8ca7",
22
+ "@webiny/app": "0.0.0-unstable.e6f0dc8ca7",
23
+ "@webiny/app-aco": "0.0.0-unstable.e6f0dc8ca7",
24
+ "@webiny/app-admin": "0.0.0-unstable.e6f0dc8ca7",
25
+ "@webiny/app-headless-cms": "0.0.0-unstable.e6f0dc8ca7",
26
+ "@webiny/app-websockets": "0.0.0-unstable.e6f0dc8ca7",
27
+ "@webiny/error": "0.0.0-unstable.e6f0dc8ca7",
28
+ "@webiny/icons": "0.0.0-unstable.e6f0dc8ca7",
29
+ "@webiny/utils": "0.0.0-unstable.e6f0dc8ca7",
29
30
  "apollo-client": "2.6.10",
30
31
  "apollo-link": "1.2.14",
31
- "crypto-hash": "3.1.0",
32
+ "crypto-hash": "4.0.1",
32
33
  "graphql-tag": "2.12.6",
33
- "react": "18.2.0",
34
- "react-dom": "18.2.0"
34
+ "react": "18.3.1",
35
+ "react-dom": "18.3.1"
35
36
  },
36
37
  "devDependencies": {
37
- "@webiny/build-tools": "0.0.0-unstable.e622468070",
38
- "rimraf": "6.1.2",
39
- "typescript": "5.9.3"
38
+ "@webiny/build-tools": "0.0.0-unstable.e6f0dc8ca7",
39
+ "rimraf": "6.1.3",
40
+ "typescript": "6.0.3"
40
41
  },
41
42
  "publishConfig": {
42
43
  "access": "public",
43
44
  "directory": "dist"
44
45
  },
45
- "gitHead": "e622468070839dc3f9552c85bf2bbac12d2ef88f"
46
+ "gitHead": "e6f0dc8ca741c1fcc3fec9a5b9e86fdd49544641"
46
47
  }
package/types.d.ts CHANGED
@@ -88,5 +88,5 @@ export interface IRecordLockingError<T = GenericRecord> {
88
88
  data?: T;
89
89
  }
90
90
  export interface RecordLockingSecurityPermission extends Identity.Permission {
91
- canForceUnlock?: string;
91
+ canForceUnlock?: boolean;
92
92
  }
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { CmsContentEntry } from \"@webiny/app-headless-cms/types.js\";\nimport type { GenericRecord } from \"@webiny/app/types.js\";\nimport type { IRecordLockingUnlockEntryResult } from \"~/domain/abstractions/IRecordLockingUnlockEntry.js\";\nimport type { IRecordLockingUpdateEntryLockResult } from \"~/domain/abstractions/IRecordLocking.js\";\nimport { Identity } from \"@webiny/app-admin/domain/Identity.js\";\n\nexport interface IRecordLockingIdentity {\n id: string;\n displayName: string;\n type: string;\n}\n\nexport interface IRecordLockingRecordLocked {\n lockedBy: IRecordLockingIdentity;\n lockedOn: string;\n expiresOn: string;\n actions: IRecordLockingLockRecordAction[];\n}\n\nexport interface IRecordLockingCmsEntryValuesAction {\n type: string;\n message: string;\n createdBy: Identity;\n createdOn: string;\n}\n\nexport interface IRecordLockingCmsEntryValues {\n lockedBy: Identity;\n lockedOn: string;\n updatedOn: string;\n expiresOn: string;\n targetId: string;\n type: string;\n actions: IRecordLockingCmsEntryValuesAction;\n}\n\nexport interface IPossiblyRecordLockingRecord\n extends CmsContentEntry<IRecordLockingCmsEntryValues> {\n $selectable?: boolean;\n $type?: \"RECORD\";\n $lockingType?: string;\n $locked?: IRecordLockingRecordLocked | null;\n}\n\nexport interface IRecordLockingRecord extends IPossiblyRecordLockingRecord {\n $lockingType: string;\n}\n\nexport type IIsRecordLockedParams = Pick<IRecordLockingRecord, \"id\" | \"$lockingType\">;\n\nexport type IUpdateEntryLockParams = Pick<IRecordLockingRecord, \"id\" | \"$lockingType\">;\n\nexport type IUnlockEntryParams = Pick<IRecordLockingRecord, \"id\" | \"$lockingType\">;\n\nexport type IFetchLockRecordParams = Pick<IRecordLockingRecord, \"id\" | \"$lockingType\">;\n\nexport type IFetchLockedEntryLockRecordParams = Pick<IRecordLockingRecord, \"id\" | \"$lockingType\">;\n\nexport interface IFetchLockRecordResult {\n data: IRecordLockingLockRecord | null;\n error: IRecordLockingError | null;\n}\n\nexport interface IRecordLockingContext<\n T extends IPossiblyRecordLockingRecord = IPossiblyRecordLockingRecord\n> {\n readonly loading: boolean;\n readonly records: IPossiblyRecordLockingRecord[];\n readonly error?: IRecordLockingError | null;\n setRecords(folderId: string, type: string, records: T[]): Promise<void>;\n updateEntryLock(params: IUpdateEntryLockParams): Promise<IRecordLockingUpdateEntryLockResult>;\n isRecordLocked(params?: IIsRecordLockedParams): boolean;\n getLockRecordEntry(id: string): IRecordLockingRecord | undefined;\n fetchLockRecord(params: IFetchLockRecordParams): Promise<IFetchLockRecordResult>;\n fetchLockedEntryLockRecord(\n params: IFetchLockedEntryLockRecordParams\n ): Promise<IRecordLockingLockRecord | null>;\n unlockEntry(params: IUnlockEntryParams): Promise<IRecordLockingUnlockEntryResult>;\n removeEntryLock(params: IUnlockEntryParams): void;\n unlockEntryForce(params: IUnlockEntryParams): Promise<IRecordLockingUnlockEntryResult>;\n isLockExpired(input: Date | string): boolean;\n}\n\nexport interface IRecordLockingLockRecordAction {\n type: string;\n message: string;\n createdBy: IRecordLockingIdentity;\n createdOn: string;\n}\n\nexport interface IRecordLockingLockRecord {\n id: string;\n lockedOn: string;\n expiresOn: string;\n lockedBy: IRecordLockingIdentity;\n targetId: string;\n type: string;\n actions: IRecordLockingLockRecordAction[];\n}\n\nexport interface IRecordLockingMeta {\n totalCount: number;\n cursor: string | null;\n hasMoreItems: boolean;\n}\n\nexport interface IRecordLockingError<T = GenericRecord> {\n message: string;\n code: string;\n data?: T;\n}\n\nexport interface RecordLockingSecurityPermission extends Identity.Permission {\n canForceUnlock?: string;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { CmsContentEntry } from \"@webiny/app-headless-cms/types.js\";\nimport type { GenericRecord } from \"@webiny/app/types.js\";\nimport type { IRecordLockingUnlockEntryResult } from \"~/domain/abstractions/IRecordLockingUnlockEntry.js\";\nimport type { IRecordLockingUpdateEntryLockResult } from \"~/domain/abstractions/IRecordLocking.js\";\nimport { Identity } from \"@webiny/app-admin/domain/Identity.js\";\n\nexport interface IRecordLockingIdentity {\n id: string;\n displayName: string;\n type: string;\n}\n\nexport interface IRecordLockingRecordLocked {\n lockedBy: IRecordLockingIdentity;\n lockedOn: string;\n expiresOn: string;\n actions: IRecordLockingLockRecordAction[];\n}\n\nexport interface IRecordLockingCmsEntryValuesAction {\n type: string;\n message: string;\n createdBy: Identity;\n createdOn: string;\n}\n\nexport interface IRecordLockingCmsEntryValues {\n lockedBy: Identity;\n lockedOn: string;\n updatedOn: string;\n expiresOn: string;\n targetId: string;\n type: string;\n actions: IRecordLockingCmsEntryValuesAction;\n}\n\nexport interface IPossiblyRecordLockingRecord extends CmsContentEntry<IRecordLockingCmsEntryValues> {\n $selectable?: boolean;\n $type?: \"RECORD\";\n $lockingType?: string;\n $locked?: IRecordLockingRecordLocked | null;\n}\n\nexport interface IRecordLockingRecord extends IPossiblyRecordLockingRecord {\n $lockingType: string;\n}\n\nexport type IIsRecordLockedParams = Pick<IRecordLockingRecord, \"id\" | \"$lockingType\">;\n\nexport type IUpdateEntryLockParams = Pick<IRecordLockingRecord, \"id\" | \"$lockingType\">;\n\nexport type IUnlockEntryParams = Pick<IRecordLockingRecord, \"id\" | \"$lockingType\">;\n\nexport type IFetchLockRecordParams = Pick<IRecordLockingRecord, \"id\" | \"$lockingType\">;\n\nexport type IFetchLockedEntryLockRecordParams = Pick<IRecordLockingRecord, \"id\" | \"$lockingType\">;\n\nexport interface IFetchLockRecordResult {\n data: IRecordLockingLockRecord | null;\n error: IRecordLockingError | null;\n}\n\nexport interface IRecordLockingContext<\n T extends IPossiblyRecordLockingRecord = IPossiblyRecordLockingRecord\n> {\n readonly loading: boolean;\n readonly records: IPossiblyRecordLockingRecord[];\n readonly error?: IRecordLockingError | null;\n setRecords(folderId: string, type: string, records: T[]): Promise<void>;\n updateEntryLock(params: IUpdateEntryLockParams): Promise<IRecordLockingUpdateEntryLockResult>;\n isRecordLocked(params?: IIsRecordLockedParams): boolean;\n getLockRecordEntry(id: string): IRecordLockingRecord | undefined;\n fetchLockRecord(params: IFetchLockRecordParams): Promise<IFetchLockRecordResult>;\n fetchLockedEntryLockRecord(\n params: IFetchLockedEntryLockRecordParams\n ): Promise<IRecordLockingLockRecord | null>;\n unlockEntry(params: IUnlockEntryParams): Promise<IRecordLockingUnlockEntryResult>;\n removeEntryLock(params: IUnlockEntryParams): void;\n unlockEntryForce(params: IUnlockEntryParams): Promise<IRecordLockingUnlockEntryResult>;\n isLockExpired(input: Date | string): boolean;\n}\n\nexport interface IRecordLockingLockRecordAction {\n type: string;\n message: string;\n createdBy: IRecordLockingIdentity;\n createdOn: string;\n}\n\nexport interface IRecordLockingLockRecord {\n id: string;\n lockedOn: string;\n expiresOn: string;\n lockedBy: IRecordLockingIdentity;\n targetId: string;\n type: string;\n actions: IRecordLockingLockRecordAction[];\n}\n\nexport interface IRecordLockingMeta {\n totalCount: number;\n cursor: string | null;\n hasMoreItems: boolean;\n}\n\nexport interface IRecordLockingError<T = GenericRecord> {\n message: string;\n code: string;\n data?: T;\n}\n\nexport interface RecordLockingSecurityPermission extends Identity.Permission {\n canForceUnlock?: boolean;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1,7 +0,0 @@
1
- import React from "react";
2
- import type { RecordLockingSecurityPermission } from "../../types.js";
3
- export interface RecordLockingPermissionsProps {
4
- value: RecordLockingSecurityPermission[];
5
- onChange: (value: RecordLockingSecurityPermission[]) => void;
6
- }
7
- export declare const RecordLockingPermissions: ({ value, onChange }: RecordLockingPermissionsProps) => React.JSX.Element;
@@ -1,71 +0,0 @@
1
- import React, { useCallback, useMemo } from "react";
2
- import { i18n } from "@webiny/app/i18n/index.js";
3
- import { gridWithPaddingClass, PermissionInfo } from "@webiny/app-admin";
4
- import { Form } from "@webiny/form";
5
- import { Grid, Select } from "@webiny/admin-ui";
6
- const t = i18n.ns("app-record-locking/components/permissionRenderer");
7
- const RECORD_LOCKING_PERMISSION = "recordLocking";
8
- export const RecordLockingPermissions = ({
9
- value,
10
- onChange
11
- }) => {
12
- const onFormChange = useCallback(data => {
13
- const newValue = value.filter(p => {
14
- return p.name.startsWith(RECORD_LOCKING_PERMISSION) === false;
15
- });
16
- if (!data.canForceUnlock || data.canForceUnlock === "no") {
17
- onChange(newValue);
18
- return;
19
- }
20
- onChange([...newValue, {
21
- name: "recordLocking",
22
- canForceUnlock: "yes"
23
- }]);
24
- }, [value]);
25
- const formData = useMemo(() => {
26
- if (!Array.isArray(value)) {
27
- return {};
28
- }
29
- const hasFullAccess = value.some(item => item.name === "*");
30
- if (hasFullAccess) {
31
- return {
32
- canForceUnlock: "yes"
33
- };
34
- }
35
- const permissions = value.filter(item => item.name.startsWith(RECORD_LOCKING_PERMISSION));
36
- if (!permissions.length || !permissions.some(item => !!item.canForceUnlock)) {
37
- return {};
38
- }
39
- return {
40
- canForceUnlock: "yes"
41
- };
42
- }, []);
43
- return /*#__PURE__*/React.createElement(Form, {
44
- data: formData,
45
- onChange: onFormChange
46
- }, ({
47
- Bind
48
- }) => {
49
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Grid, {
50
- className: gridWithPaddingClass
51
- }, /*#__PURE__*/React.createElement(Grid.Column, {
52
- span: 6
53
- }, /*#__PURE__*/React.createElement(PermissionInfo, {
54
- title: t`Advanced Record Locking`
55
- })), /*#__PURE__*/React.createElement(Grid.Column, {
56
- span: 6
57
- }, /*#__PURE__*/React.createElement(Bind, {
58
- name: "canForceUnlock"
59
- }, /*#__PURE__*/React.createElement(Select, {
60
- options: [{
61
- label: t`No Access`,
62
- value: "no"
63
- }, {
64
- label: t`Full Access`,
65
- value: "yes"
66
- }]
67
- })))));
68
- });
69
- };
70
-
71
- //# sourceMappingURL=RecordLockingPermissions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","useCallback","useMemo","i18n","gridWithPaddingClass","PermissionInfo","Form","Grid","Select","t","ns","RECORD_LOCKING_PERMISSION","RecordLockingPermissions","value","onChange","onFormChange","data","newValue","filter","p","name","startsWith","canForceUnlock","formData","Array","isArray","hasFullAccess","some","item","permissions","length","createElement","Bind","Fragment","className","Column","span","title","options","label"],"sources":["RecordLockingPermissions.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from \"react\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { gridWithPaddingClass, PermissionInfo } from \"@webiny/app-admin\";\nimport { Form } from \"@webiny/form\";\nimport type { RecordLockingSecurityPermission } from \"~/types.js\";\nimport { Grid, Select } from \"@webiny/admin-ui\";\n\nconst t = i18n.ns(\"app-record-locking/components/permissionRenderer\");\n\nconst RECORD_LOCKING_PERMISSION = \"recordLocking\";\n\nexport interface RecordLockingPermissionsProps {\n value: RecordLockingSecurityPermission[];\n onChange: (value: RecordLockingSecurityPermission[]) => void;\n}\n\nexport const RecordLockingPermissions = ({ value, onChange }: RecordLockingPermissionsProps) => {\n const onFormChange = useCallback(\n (data: RecordLockingSecurityPermission) => {\n const newValue = value.filter(p => {\n return p.name.startsWith(RECORD_LOCKING_PERMISSION) === false;\n });\n\n if (!data.canForceUnlock || data.canForceUnlock === \"no\") {\n onChange(newValue);\n return;\n }\n\n onChange([\n ...newValue,\n {\n name: \"recordLocking\",\n canForceUnlock: \"yes\"\n }\n ]);\n },\n [value]\n );\n\n const formData = useMemo(() => {\n if (!Array.isArray(value)) {\n return {};\n }\n\n const hasFullAccess = value.some(item => item.name === \"*\");\n\n if (hasFullAccess) {\n return {\n canForceUnlock: \"yes\"\n };\n }\n\n const permissions = value.filter(item => item.name.startsWith(RECORD_LOCKING_PERMISSION));\n\n if (!permissions.length || !permissions.some(item => !!item.canForceUnlock)) {\n return {};\n }\n\n return {\n canForceUnlock: \"yes\"\n };\n }, []);\n\n return (\n <Form<RecordLockingSecurityPermission> data={formData} onChange={onFormChange}>\n {({ Bind }) => {\n return (\n <>\n <Grid className={gridWithPaddingClass}>\n <Grid.Column span={6}>\n <PermissionInfo title={t`Advanced Record Locking`} />\n </Grid.Column>\n <Grid.Column span={6}>\n <Bind name={\"canForceUnlock\"}>\n <Select\n options={[\n { label: t`No Access`, value: \"no\" },\n { label: t`Full Access`, value: \"yes\" }\n ]}\n ></Select>\n </Bind>\n </Grid.Column>\n </Grid>\n </>\n );\n }}\n </Form>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import type { AdminAppPermissionRendererPlugin } from "@webiny/app-admin/types.js";
2
- export declare const recordLockingPermissionRenderer: AdminAppPermissionRendererPlugin;
@@ -1,21 +0,0 @@
1
- import React from "react";
2
- import { ReactComponent as LockIcon } from "@webiny/icons/lock.svg";
3
- import { RecordLockingPermissions } from "./RecordLockingPermissions.js";
4
- import { Accordion } from "@webiny/admin-ui";
5
- export const recordLockingPermissionRenderer = {
6
- type: "admin-app-permissions-renderer",
7
- name: "admin-app-permissions-renderer-record-locking",
8
- render(props) {
9
- return /*#__PURE__*/React.createElement(Accordion.Item, {
10
- icon: /*#__PURE__*/React.createElement(Accordion.Item.Icon, {
11
- label: "Record Locking",
12
- icon: /*#__PURE__*/React.createElement(LockIcon, null)
13
- }),
14
- title: "Record Locking",
15
- description: "Manage Record Locking permissions.",
16
- "data-testid": "permission.recordLocking"
17
- }, /*#__PURE__*/React.createElement(RecordLockingPermissions, props));
18
- }
19
- };
20
-
21
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","ReactComponent","LockIcon","RecordLockingPermissions","Accordion","recordLockingPermissionRenderer","type","name","render","props","createElement","Item","icon","Icon","label","title","description"],"sources":["index.tsx"],"sourcesContent":["import React from \"react\";\n\nimport type { AdminAppPermissionRendererPlugin } from \"@webiny/app-admin/types.js\";\nimport { ReactComponent as LockIcon } from \"@webiny/icons/lock.svg\";\nimport { RecordLockingPermissions } from \"./RecordLockingPermissions.js\";\nimport { Accordion } from \"@webiny/admin-ui\";\n\nexport const recordLockingPermissionRenderer: AdminAppPermissionRendererPlugin = {\n type: \"admin-app-permissions-renderer\",\n name: \"admin-app-permissions-renderer-record-locking\",\n render(props) {\n return (\n <Accordion.Item\n icon={<Accordion.Item.Icon label={\"Record Locking\"} icon={<LockIcon />} />}\n title={\"Record Locking\"}\n description={\"Manage Record Locking permissions.\"}\n data-testid={\"permission.recordLocking\"}\n >\n <RecordLockingPermissions {...props} />\n </Accordion.Item>\n );\n }\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAGzB,SAASC,cAAc,IAAIC,QAAQ,QAAQ,wBAAwB;AACnE,SAASC,wBAAwB;AACjC,SAASC,SAAS,QAAQ,kBAAkB;AAE5C,OAAO,MAAMC,+BAAiE,GAAG;EAC7EC,IAAI,EAAE,gCAAgC;EACtCC,IAAI,EAAE,+CAA+C;EACrDC,MAAMA,CAACC,KAAK,EAAE;IACV,oBACIT,KAAA,CAAAU,aAAA,CAACN,SAAS,CAACO,IAAI;MACXC,IAAI,eAAEZ,KAAA,CAAAU,aAAA,CAACN,SAAS,CAACO,IAAI,CAACE,IAAI;QAACC,KAAK,EAAE,gBAAiB;QAACF,IAAI,eAAEZ,KAAA,CAAAU,aAAA,CAACR,QAAQ,MAAE;MAAE,CAAE,CAAE;MAC3Ea,KAAK,EAAE,gBAAiB;MACxBC,WAAW,EAAE,oCAAqC;MAClD,eAAa;IAA2B,gBAExChB,KAAA,CAAAU,aAAA,CAACP,wBAAwB,EAAKM,KAAQ,CAC1B,CAAC;EAEzB;AACJ,CAAC","ignoreList":[]}