@webiny/app-record-locking 6.3.0-beta.4 → 6.4.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/components/HeadlessCmsActionsAcoCell.js +29 -51
  2. package/components/HeadlessCmsActionsAcoCell.js.map +1 -1
  3. package/components/HeadlessCmsContentEntry/ContentEntryGuard.js +26 -34
  4. package/components/HeadlessCmsContentEntry/ContentEntryGuard.js.map +1 -1
  5. package/components/HeadlessCmsContentEntry/ContentEntryLocker.js +70 -89
  6. package/components/HeadlessCmsContentEntry/ContentEntryLocker.js.map +1 -1
  7. package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js +38 -62
  8. package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js.map +1 -1
  9. package/components/HeadlessCmsContentEntry/index.js +0 -2
  10. package/components/LockedRecord/LockedRecord.js +45 -57
  11. package/components/LockedRecord/LockedRecord.js.map +1 -1
  12. package/components/LockedRecord/LockedRecordForceUnlock.js +49 -63
  13. package/components/LockedRecord/LockedRecordForceUnlock.js.map +1 -1
  14. package/components/LockedRecord/index.js +0 -2
  15. package/components/RecordLockingProvider.js +103 -117
  16. package/components/RecordLockingProvider.js.map +1 -1
  17. package/components/SecurityPermissions.js +11 -14
  18. package/components/SecurityPermissions.js.map +1 -1
  19. package/components/decorators/UseContentEntriesListHookDecorator.js +18 -18
  20. package/components/decorators/UseContentEntriesListHookDecorator.js.map +1 -1
  21. package/components/decorators/UseRecordsDecorator.js +13 -22
  22. package/components/decorators/UseRecordsDecorator.js.map +1 -1
  23. package/components/decorators/UseSaveEntryDecorator.js +35 -49
  24. package/components/decorators/UseSaveEntryDecorator.js.map +1 -1
  25. package/domain/RecordLocking.js +229 -291
  26. package/domain/RecordLocking.js.map +1 -1
  27. package/domain/RecordLockingClient.js +17 -16
  28. package/domain/RecordLockingClient.js.map +1 -1
  29. package/domain/RecordLockingGetLockRecord.js +13 -15
  30. package/domain/RecordLockingGetLockRecord.js.map +1 -1
  31. package/domain/RecordLockingGetLockedEntryLockRecord.js +12 -13
  32. package/domain/RecordLockingGetLockedEntryLockRecord.js.map +1 -1
  33. package/domain/RecordLockingIsEntryLocked.js +15 -14
  34. package/domain/RecordLockingIsEntryLocked.js.map +1 -1
  35. package/domain/RecordLockingListLockRecords.js +18 -24
  36. package/domain/RecordLockingListLockRecords.js.map +1 -1
  37. package/domain/RecordLockingLockEntry.js +8 -9
  38. package/domain/RecordLockingLockEntry.js.map +1 -1
  39. package/domain/RecordLockingUnlockEntry.js +12 -13
  40. package/domain/RecordLockingUnlockEntry.js.map +1 -1
  41. package/domain/RecordLockingUpdateEntryLock.js +12 -13
  42. package/domain/RecordLockingUpdateEntryLock.js.map +1 -1
  43. package/domain/abstractions/IRecordLocking.js +0 -3
  44. package/domain/abstractions/IRecordLockingClient.js +0 -3
  45. package/domain/abstractions/IRecordLockingGetLockRecord.js +0 -3
  46. package/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.js +0 -3
  47. package/domain/abstractions/IRecordLockingIsEntryLocked.js +0 -3
  48. package/domain/abstractions/IRecordLockingListLockRecords.js +0 -3
  49. package/domain/abstractions/IRecordLockingLockEntry.js +0 -3
  50. package/domain/abstractions/IRecordLockingUnlockEntry.js +0 -3
  51. package/domain/abstractions/IRecordLockingUpdateEntryLock.js +0 -3
  52. package/domain/graphql/fields.js +3 -2
  53. package/domain/graphql/fields.js.map +1 -1
  54. package/domain/graphql/getLockRecord.js +3 -2
  55. package/domain/graphql/getLockRecord.js.map +1 -1
  56. package/domain/graphql/getLockedEntryLockRecord.js +3 -2
  57. package/domain/graphql/getLockedEntryLockRecord.js.map +1 -1
  58. package/domain/graphql/isEntryLocked.js +3 -2
  59. package/domain/graphql/isEntryLocked.js.map +1 -1
  60. package/domain/graphql/listLockRecords.js +4 -5
  61. package/domain/graphql/listLockRecords.js.map +1 -1
  62. package/domain/graphql/lockEntry.js +3 -4
  63. package/domain/graphql/lockEntry.js.map +1 -1
  64. package/domain/graphql/unlockEntry.js +3 -2
  65. package/domain/graphql/unlockEntry.js.map +1 -1
  66. package/domain/graphql/updateEntryLock.js +3 -2
  67. package/domain/graphql/updateEntryLock.js.map +1 -1
  68. package/domain/permissionsSchema.js +6 -5
  69. package/domain/permissionsSchema.js.map +1 -1
  70. package/domain/utils/createRecordLockingClient.js +5 -6
  71. package/domain/utils/createRecordLockingClient.js.map +1 -1
  72. package/domain/utils/createRecordLockingError.js +10 -11
  73. package/domain/utils/createRecordLockingError.js.map +1 -1
  74. package/features/permissions/abstractions.js +2 -1
  75. package/features/permissions/abstractions.js.map +1 -1
  76. package/features/permissions/feature.js +2 -1
  77. package/features/permissions/feature.js.map +1 -1
  78. package/hooks/index.js +0 -2
  79. package/hooks/usePermission.js +14 -15
  80. package/hooks/usePermission.js.map +1 -1
  81. package/hooks/useRecordLocking.js +5 -6
  82. package/hooks/useRecordLocking.js.map +1 -1
  83. package/index.js +15 -21
  84. package/index.js.map +1 -1
  85. package/package.json +12 -12
  86. package/types.js +0 -3
  87. package/utils/createCacheKey.js +9 -10
  88. package/utils/createCacheKey.js.map +1 -1
  89. package/components/HeadlessCmsContentEntry/index.js.map +0 -1
  90. package/components/LockedRecord/index.js.map +0 -1
  91. package/domain/abstractions/IRecordLocking.js.map +0 -1
  92. package/domain/abstractions/IRecordLockingClient.js.map +0 -1
  93. package/domain/abstractions/IRecordLockingGetLockRecord.js.map +0 -1
  94. package/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.js.map +0 -1
  95. package/domain/abstractions/IRecordLockingIsEntryLocked.js.map +0 -1
  96. package/domain/abstractions/IRecordLockingListLockRecords.js.map +0 -1
  97. package/domain/abstractions/IRecordLockingLockEntry.js.map +0 -1
  98. package/domain/abstractions/IRecordLockingUnlockEntry.js.map +0 -1
  99. package/domain/abstractions/IRecordLockingUpdateEntryLock.js.map +0 -1
  100. package/hooks/index.js.map +0 -1
  101. package/types.js.map +0 -1
@@ -1,18 +1,15 @@
1
- import React from "react";
1
+ import react from "react";
2
2
  import { AdminConfig } from "@webiny/app-admin";
3
- import { ReactComponent as LockIcon } from "@webiny/icons/lock.svg";
3
+ import { ReactComponent } from "@webiny/icons/lock.svg";
4
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
- };
5
+ const { Security: Security } = AdminConfig;
6
+ const SecurityPermissions = ()=>/*#__PURE__*/ react.createElement(AdminConfig, null, /*#__PURE__*/ react.createElement(Security.Permissions, {
7
+ name: "record-locking",
8
+ title: "Record Locking",
9
+ description: "Manage Record Locking permissions.",
10
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
11
+ schema: RECORD_LOCKING_PERMISSIONS_SCHEMA
12
+ }));
13
+ export { SecurityPermissions };
17
14
 
18
15
  //# sourceMappingURL=SecurityPermissions.js.map
@@ -1 +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
+ {"version":3,"file":"components/SecurityPermissions.js","sources":["../../src/components/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"],"names":["Security","AdminConfig","SecurityPermissions","LockIcon","RECORD_LOCKING_PERMISSIONS_SCHEMA"],"mappings":";;;;AAKA,MAAM,EAAEA,UAAAA,QAAQ,EAAE,GAAGC;AAEd,MAAMC,sBAAsB,IACxB,WAAP,GACI,oBAACD,aAAWA,MAAAA,WAAAA,GACR,oBAACD,SAAS,WAAW;QACjB,MAAK;QACL,OAAM;QACN,aAAY;QACZ,oBAAM,oBAACG,gBAAQA;QACf,QAAQC"}
@@ -1,23 +1,23 @@
1
1
  import { useEffect } from "react";
2
2
  import { ContentEntryListConfig } from "@webiny/app-headless-cms";
3
3
  import { useRecordLocking } from "../../hooks/index.js";
4
- export const UseContentEntriesListHookDecorator = ContentEntryListConfig.ContentEntries.useContentEntriesList.createDecorator(originalHook => {
5
- return function RecordLockingUseContentEntriesList() {
6
- const value = originalHook();
7
- const recordLocking = useRecordLocking();
8
- useEffect(() => {
9
- if (!value.records) {
10
- return;
11
- }
12
- recordLocking.setRecords(value.folderId, value.modelId,
13
- // TODO determine if this is correct
14
- value.records);
15
- }, [value.folderId, value.modelId, value.records, recordLocking]);
16
- return {
17
- ...value,
18
- records: recordLocking.records
19
- };
20
- };
21
- });
4
+ const UseContentEntriesListHookDecorator = ContentEntryListConfig.ContentEntries.useContentEntriesList.createDecorator((originalHook)=>function() {
5
+ const value = originalHook();
6
+ const recordLocking = useRecordLocking();
7
+ useEffect(()=>{
8
+ if (!value.records) return;
9
+ recordLocking.setRecords(value.folderId, value.modelId, value.records);
10
+ }, [
11
+ value.folderId,
12
+ value.modelId,
13
+ value.records,
14
+ recordLocking
15
+ ]);
16
+ return {
17
+ ...value,
18
+ records: recordLocking.records
19
+ };
20
+ });
21
+ export { UseContentEntriesListHookDecorator };
22
22
 
23
23
  //# sourceMappingURL=UseContentEntriesListHookDecorator.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","ContentEntryListConfig","useRecordLocking","UseContentEntriesListHookDecorator","ContentEntries","useContentEntriesList","createDecorator","originalHook","RecordLockingUseContentEntriesList","value","recordLocking","records","setRecords","folderId","modelId"],"sources":["UseContentEntriesListHookDecorator.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms\";\nimport { useRecordLocking } from \"~/hooks/index.js\";\nimport type { IPossiblyRecordLockingRecord } from \"~/types.js\";\n\nexport const UseContentEntriesListHookDecorator =\n ContentEntryListConfig.ContentEntries.useContentEntriesList.createDecorator(originalHook => {\n return function RecordLockingUseContentEntriesList() {\n const value = originalHook();\n const recordLocking = useRecordLocking();\n\n useEffect(() => {\n if (!value.records) {\n return;\n }\n recordLocking.setRecords(\n value.folderId,\n value.modelId,\n // TODO determine if this is correct\n value.records as IPossiblyRecordLockingRecord[]\n );\n }, [value.folderId, value.modelId, value.records, recordLocking]);\n\n return {\n ...value,\n records: recordLocking.records\n };\n };\n });\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAASC,sBAAsB,QAAQ,0BAA0B;AACjE,SAASC,gBAAgB;AAGzB,OAAO,MAAMC,kCAAkC,GAC3CF,sBAAsB,CAACG,cAAc,CAACC,qBAAqB,CAACC,eAAe,CAACC,YAAY,IAAI;EACxF,OAAO,SAASC,kCAAkCA,CAAA,EAAG;IACjD,MAAMC,KAAK,GAAGF,YAAY,CAAC,CAAC;IAC5B,MAAMG,aAAa,GAAGR,gBAAgB,CAAC,CAAC;IAExCF,SAAS,CAAC,MAAM;MACZ,IAAI,CAACS,KAAK,CAACE,OAAO,EAAE;QAChB;MACJ;MACAD,aAAa,CAACE,UAAU,CACpBH,KAAK,CAACI,QAAQ,EACdJ,KAAK,CAACK,OAAO;MACb;MACAL,KAAK,CAACE,OACV,CAAC;IACL,CAAC,EAAE,CAACF,KAAK,CAACI,QAAQ,EAAEJ,KAAK,CAACK,OAAO,EAAEL,KAAK,CAACE,OAAO,EAAED,aAAa,CAAC,CAAC;IAEjE,OAAO;MACH,GAAGD,KAAK;MACRE,OAAO,EAAED,aAAa,CAACC;IAC3B,CAAC;EACL,CAAC;AACL,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"components/decorators/UseContentEntriesListHookDecorator.js","sources":["../../../src/components/decorators/UseContentEntriesListHookDecorator.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms\";\nimport { useRecordLocking } from \"~/hooks/index.js\";\nimport type { IPossiblyRecordLockingRecord } from \"~/types.js\";\n\nexport const UseContentEntriesListHookDecorator =\n ContentEntryListConfig.ContentEntries.useContentEntriesList.createDecorator(originalHook => {\n return function RecordLockingUseContentEntriesList() {\n const value = originalHook();\n const recordLocking = useRecordLocking();\n\n useEffect(() => {\n if (!value.records) {\n return;\n }\n recordLocking.setRecords(\n value.folderId,\n value.modelId,\n // TODO determine if this is correct\n value.records as IPossiblyRecordLockingRecord[]\n );\n }, [value.folderId, value.modelId, value.records, recordLocking]);\n\n return {\n ...value,\n records: recordLocking.records\n };\n };\n });\n"],"names":["UseContentEntriesListHookDecorator","ContentEntryListConfig","originalHook","value","recordLocking","useRecordLocking","useEffect"],"mappings":";;;AAKO,MAAMA,qCACTC,uBAAuB,cAAc,CAAC,qBAAqB,CAAC,eAAe,CAACC,CAAAA,eACjE;QACH,MAAMC,QAAQD;QACd,MAAME,gBAAgBC;QAEtBC,UAAU;YACN,IAAI,CAACH,MAAM,OAAO,EACd;YAEJC,cAAc,UAAU,CACpBD,MAAM,QAAQ,EACdA,MAAM,OAAO,EAEbA,MAAM,OAAO;QAErB,GAAG;YAACA,MAAM,QAAQ;YAAEA,MAAM,OAAO;YAAEA,MAAM,OAAO;YAAEC;SAAc;QAEhE,OAAO;YACH,GAAGD,KAAK;YACR,SAASC,cAAc,OAAO;QAClC;IACJ"}
@@ -1,25 +1,16 @@
1
1
  import { useRecords } from "@webiny/app-aco";
2
-
3
- /**
4
- * When record locking mechanism is checking for records equality, it compares record `id` and `savedOn`.
5
- * When you're updating ACO cache, you're just passing the new content entry value(s), and sometimes you might
6
- * be doing it without the `savedOn`, and that causes record locking to keep its old state.
7
- *
8
- * This decorator ensures that calls to `updateRecordInCache` always include a `savedOn` timestamp.
9
- */
10
- export const UseRecordsDecorator = useRecords.createDecorator(baseHook => {
11
- return folderId => {
12
- const hook = baseHook(folderId);
13
- return {
14
- ...hook,
15
- updateRecordInCache(record) {
16
- hook.updateRecordInCache({
17
- ...record,
18
- savedOn: new Date().toISOString()
19
- });
20
- }
21
- };
22
- };
23
- });
2
+ const UseRecordsDecorator = useRecords.createDecorator((baseHook)=>(folderId)=>{
3
+ const hook = baseHook(folderId);
4
+ return {
5
+ ...hook,
6
+ updateRecordInCache (record) {
7
+ hook.updateRecordInCache({
8
+ ...record,
9
+ savedOn: new Date().toISOString()
10
+ });
11
+ }
12
+ };
13
+ });
14
+ export { UseRecordsDecorator };
24
15
 
25
16
  //# sourceMappingURL=UseRecordsDecorator.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useRecords","UseRecordsDecorator","createDecorator","baseHook","folderId","hook","updateRecordInCache","record","savedOn","Date","toISOString"],"sources":["UseRecordsDecorator.tsx"],"sourcesContent":["import { useRecords } from \"@webiny/app-aco\";\n\n/**\n * When record locking mechanism is checking for records equality, it compares record `id` and `savedOn`.\n * When you're updating ACO cache, you're just passing the new content entry value(s), and sometimes you might\n * be doing it without the `savedOn`, and that causes record locking to keep its old state.\n *\n * This decorator ensures that calls to `updateRecordInCache` always include a `savedOn` timestamp.\n */\nexport const UseRecordsDecorator = useRecords.createDecorator(baseHook => {\n return (folderId?: string) => {\n const hook = baseHook(folderId);\n\n return {\n ...hook,\n updateRecordInCache(record: any) {\n hook.updateRecordInCache({\n ...record,\n savedOn: new Date().toISOString()\n });\n }\n };\n };\n});\n"],"mappings":"AAAA,SAASA,UAAU,QAAQ,iBAAiB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,mBAAmB,GAAGD,UAAU,CAACE,eAAe,CAACC,QAAQ,IAAI;EACtE,OAAQC,QAAiB,IAAK;IAC1B,MAAMC,IAAI,GAAGF,QAAQ,CAACC,QAAQ,CAAC;IAE/B,OAAO;MACH,GAAGC,IAAI;MACPC,mBAAmBA,CAACC,MAAW,EAAE;QAC7BF,IAAI,CAACC,mBAAmB,CAAC;UACrB,GAAGC,MAAM;UACTC,OAAO,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC;QACpC,CAAC,CAAC;MACN;IACJ,CAAC;EACL,CAAC;AACL,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"components/decorators/UseRecordsDecorator.js","sources":["../../../src/components/decorators/UseRecordsDecorator.tsx"],"sourcesContent":["import { useRecords } from \"@webiny/app-aco\";\n\n/**\n * When record locking mechanism is checking for records equality, it compares record `id` and `savedOn`.\n * When you're updating ACO cache, you're just passing the new content entry value(s), and sometimes you might\n * be doing it without the `savedOn`, and that causes record locking to keep its old state.\n *\n * This decorator ensures that calls to `updateRecordInCache` always include a `savedOn` timestamp.\n */\nexport const UseRecordsDecorator = useRecords.createDecorator(baseHook => {\n return (folderId?: string) => {\n const hook = baseHook(folderId);\n\n return {\n ...hook,\n updateRecordInCache(record: any) {\n hook.updateRecordInCache({\n ...record,\n savedOn: new Date().toISOString()\n });\n }\n };\n };\n});\n"],"names":["UseRecordsDecorator","useRecords","baseHook","folderId","hook","record","Date"],"mappings":";AASO,MAAMA,sBAAsBC,WAAW,eAAe,CAACC,CAAAA,WACnD,CAACC;QACJ,MAAMC,OAAOF,SAASC;QAEtB,OAAO;YACH,GAAGC,IAAI;YACP,qBAAoBC,MAAW;gBAC3BD,KAAK,mBAAmB,CAAC;oBACrB,GAAGC,MAAM;oBACT,SAAS,IAAIC,OAAO,WAAW;gBACnC;YACJ;QACJ;IACJ"}
@@ -2,54 +2,40 @@ import { useCallback } from "react";
2
2
  import { useRecordLocking } from "../../hooks/index.js";
3
3
  import { ContentEntryEditorConfig, useModel } from "@webiny/app-headless-cms";
4
4
  import { useSnackbar } from "@webiny/app-admin";
5
- const {
6
- ContentEntry: {
7
- ContentEntryForm
8
- }
9
- } = ContentEntryEditorConfig;
10
- export const UseSaveEntryDecorator = ContentEntryForm.useContentEntryForm.createDecorator(originalHook => {
11
- return function useRecordLockingUseSave() {
12
- const hook = originalHook();
13
- const {
14
- fetchLockedEntryLockRecord,
15
- updateEntryLock
16
- } = useRecordLocking();
17
- const {
18
- showSnackbar
19
- } = useSnackbar();
20
- const {
21
- model
22
- } = useModel();
23
- const {
24
- entry
25
- } = hook;
26
- const saveEntry = useCallback(async (...params) => {
27
- if (!entry.id) {
28
- return hook.saveEntry(...params);
29
- }
30
- const result = await fetchLockedEntryLockRecord({
31
- id: entry.id,
32
- $lockingType: model.modelId
33
- });
34
- if (result?.lockedBy) {
35
- const lockedBy = result.lockedBy;
36
- showSnackbar(`It seems that the entry is locked by ${lockedBy.displayName || lockedBy.id}. You can't save your changes.`);
37
- return null;
38
- }
39
- const saveResult = await hook.saveEntry(...params);
40
- if (saveResult) {
41
- await updateEntryLock({
42
- id: saveResult.id,
43
- $lockingType: model.modelId
44
- });
45
- }
46
- return saveResult;
47
- }, [entry?.id, model.modelId, updateEntryLock]);
48
- return {
49
- ...hook,
50
- saveEntry
51
- };
52
- };
53
- });
5
+ const { ContentEntry: { ContentEntryForm: ContentEntryForm } } = ContentEntryEditorConfig;
6
+ const UseSaveEntryDecorator = ContentEntryForm.useContentEntryForm.createDecorator((originalHook)=>function() {
7
+ const hook = originalHook();
8
+ const { fetchLockedEntryLockRecord, updateEntryLock } = useRecordLocking();
9
+ const { showSnackbar } = useSnackbar();
10
+ const { model } = useModel();
11
+ const { entry } = hook;
12
+ const saveEntry = useCallback(async (...params)=>{
13
+ if (!entry.id) return hook.saveEntry(...params);
14
+ const result = await fetchLockedEntryLockRecord({
15
+ id: entry.id,
16
+ $lockingType: model.modelId
17
+ });
18
+ if (result?.lockedBy) {
19
+ const lockedBy = result.lockedBy;
20
+ showSnackbar(`It seems that the entry is locked by ${lockedBy.displayName || lockedBy.id}. You can't save your changes.`);
21
+ return null;
22
+ }
23
+ const saveResult = await hook.saveEntry(...params);
24
+ if (saveResult) await updateEntryLock({
25
+ id: saveResult.id,
26
+ $lockingType: model.modelId
27
+ });
28
+ return saveResult;
29
+ }, [
30
+ entry?.id,
31
+ model.modelId,
32
+ updateEntryLock
33
+ ]);
34
+ return {
35
+ ...hook,
36
+ saveEntry
37
+ };
38
+ });
39
+ export { UseSaveEntryDecorator };
54
40
 
55
41
  //# sourceMappingURL=UseSaveEntryDecorator.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useRecordLocking","ContentEntryEditorConfig","useModel","useSnackbar","ContentEntry","ContentEntryForm","UseSaveEntryDecorator","useContentEntryForm","createDecorator","originalHook","useRecordLockingUseSave","hook","fetchLockedEntryLockRecord","updateEntryLock","showSnackbar","model","entry","saveEntry","params","id","result","$lockingType","modelId","lockedBy","displayName","saveResult"],"sources":["UseSaveEntryDecorator.tsx"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useRecordLocking } from \"~/hooks/index.js\";\nimport { ContentEntryEditorConfig, useModel } from \"@webiny/app-headless-cms\";\nimport { useSnackbar } from \"@webiny/app-admin\";\n\nconst {\n ContentEntry: { ContentEntryForm }\n} = ContentEntryEditorConfig;\n\ntype SaveEntry = ReturnType<typeof ContentEntryForm.useContentEntryForm>[\"saveEntry\"];\n\nexport const UseSaveEntryDecorator = ContentEntryForm.useContentEntryForm.createDecorator(\n originalHook => {\n return function useRecordLockingUseSave() {\n const hook = originalHook();\n const { fetchLockedEntryLockRecord, updateEntryLock } = useRecordLocking();\n const { showSnackbar } = useSnackbar();\n const { model } = useModel();\n\n const { entry } = hook;\n\n const saveEntry: SaveEntry = useCallback(\n async (...params) => {\n if (!entry.id) {\n return hook.saveEntry(...params);\n }\n\n const result = await fetchLockedEntryLockRecord({\n id: entry.id,\n $lockingType: model.modelId\n });\n\n if (result?.lockedBy) {\n const lockedBy = result.lockedBy;\n showSnackbar(\n `It seems that the entry is locked by ${\n lockedBy.displayName || lockedBy.id\n }. You can't save your changes.`\n );\n return null;\n }\n\n const saveResult = await hook.saveEntry(...params);\n if (saveResult) {\n await updateEntryLock({\n id: saveResult.id,\n $lockingType: model.modelId\n });\n }\n\n return saveResult;\n },\n [entry?.id, model.modelId, updateEntryLock]\n );\n\n return {\n ...hook,\n saveEntry\n };\n };\n }\n);\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,OAAO;AACnC,SAASC,gBAAgB;AACzB,SAASC,wBAAwB,EAAEC,QAAQ,QAAQ,0BAA0B;AAC7E,SAASC,WAAW,QAAQ,mBAAmB;AAE/C,MAAM;EACFC,YAAY,EAAE;IAAEC;EAAiB;AACrC,CAAC,GAAGJ,wBAAwB;AAI5B,OAAO,MAAMK,qBAAqB,GAAGD,gBAAgB,CAACE,mBAAmB,CAACC,eAAe,CACrFC,YAAY,IAAI;EACZ,OAAO,SAASC,uBAAuBA,CAAA,EAAG;IACtC,MAAMC,IAAI,GAAGF,YAAY,CAAC,CAAC;IAC3B,MAAM;MAAEG,0BAA0B;MAAEC;IAAgB,CAAC,GAAGb,gBAAgB,CAAC,CAAC;IAC1E,MAAM;MAAEc;IAAa,CAAC,GAAGX,WAAW,CAAC,CAAC;IACtC,MAAM;MAAEY;IAAM,CAAC,GAAGb,QAAQ,CAAC,CAAC;IAE5B,MAAM;MAAEc;IAAM,CAAC,GAAGL,IAAI;IAEtB,MAAMM,SAAoB,GAAGlB,WAAW,CACpC,OAAO,GAAGmB,MAAM,KAAK;MACjB,IAAI,CAACF,KAAK,CAACG,EAAE,EAAE;QACX,OAAOR,IAAI,CAACM,SAAS,CAAC,GAAGC,MAAM,CAAC;MACpC;MAEA,MAAME,MAAM,GAAG,MAAMR,0BAA0B,CAAC;QAC5CO,EAAE,EAAEH,KAAK,CAACG,EAAE;QACZE,YAAY,EAAEN,KAAK,CAACO;MACxB,CAAC,CAAC;MAEF,IAAIF,MAAM,EAAEG,QAAQ,EAAE;QAClB,MAAMA,QAAQ,GAAGH,MAAM,CAACG,QAAQ;QAChCT,YAAY,CACR,wCACIS,QAAQ,CAACC,WAAW,IAAID,QAAQ,CAACJ,EAAE,gCAE3C,CAAC;QACD,OAAO,IAAI;MACf;MAEA,MAAMM,UAAU,GAAG,MAAMd,IAAI,CAACM,SAAS,CAAC,GAAGC,MAAM,CAAC;MAClD,IAAIO,UAAU,EAAE;QACZ,MAAMZ,eAAe,CAAC;UAClBM,EAAE,EAAEM,UAAU,CAACN,EAAE;UACjBE,YAAY,EAAEN,KAAK,CAACO;QACxB,CAAC,CAAC;MACN;MAEA,OAAOG,UAAU;IACrB,CAAC,EACD,CAACT,KAAK,EAAEG,EAAE,EAAEJ,KAAK,CAACO,OAAO,EAAET,eAAe,CAC9C,CAAC;IAED,OAAO;MACH,GAAGF,IAAI;MACPM;IACJ,CAAC;EACL,CAAC;AACL,CACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"components/decorators/UseSaveEntryDecorator.js","sources":["../../../src/components/decorators/UseSaveEntryDecorator.tsx"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useRecordLocking } from \"~/hooks/index.js\";\nimport { ContentEntryEditorConfig, useModel } from \"@webiny/app-headless-cms\";\nimport { useSnackbar } from \"@webiny/app-admin\";\n\nconst {\n ContentEntry: { ContentEntryForm }\n} = ContentEntryEditorConfig;\n\ntype SaveEntry = ReturnType<typeof ContentEntryForm.useContentEntryForm>[\"saveEntry\"];\n\nexport const UseSaveEntryDecorator = ContentEntryForm.useContentEntryForm.createDecorator(\n originalHook => {\n return function useRecordLockingUseSave() {\n const hook = originalHook();\n const { fetchLockedEntryLockRecord, updateEntryLock } = useRecordLocking();\n const { showSnackbar } = useSnackbar();\n const { model } = useModel();\n\n const { entry } = hook;\n\n const saveEntry: SaveEntry = useCallback(\n async (...params) => {\n if (!entry.id) {\n return hook.saveEntry(...params);\n }\n\n const result = await fetchLockedEntryLockRecord({\n id: entry.id,\n $lockingType: model.modelId\n });\n\n if (result?.lockedBy) {\n const lockedBy = result.lockedBy;\n showSnackbar(\n `It seems that the entry is locked by ${\n lockedBy.displayName || lockedBy.id\n }. You can't save your changes.`\n );\n return null;\n }\n\n const saveResult = await hook.saveEntry(...params);\n if (saveResult) {\n await updateEntryLock({\n id: saveResult.id,\n $lockingType: model.modelId\n });\n }\n\n return saveResult;\n },\n [entry?.id, model.modelId, updateEntryLock]\n );\n\n return {\n ...hook,\n saveEntry\n };\n };\n }\n);\n"],"names":["ContentEntryForm","ContentEntryEditorConfig","UseSaveEntryDecorator","originalHook","hook","fetchLockedEntryLockRecord","updateEntryLock","useRecordLocking","showSnackbar","useSnackbar","model","useModel","entry","saveEntry","useCallback","params","result","lockedBy","saveResult"],"mappings":";;;;AAKA,MAAM,EACF,cAAc,EAAEA,kBAAAA,gBAAgB,EAAE,EACrC,GAAGC;AAIG,MAAMC,wBAAwBF,iBAAiB,mBAAmB,CAAC,eAAe,CACrFG,CAAAA,eACW;QACH,MAAMC,OAAOD;QACb,MAAM,EAAEE,0BAA0B,EAAEC,eAAe,EAAE,GAAGC;QACxD,MAAM,EAAEC,YAAY,EAAE,GAAGC;QACzB,MAAM,EAAEC,KAAK,EAAE,GAAGC;QAElB,MAAM,EAAEC,KAAK,EAAE,GAAGR;QAElB,MAAMS,YAAuBC,YACzB,OAAO,GAAGC;YACN,IAAI,CAACH,MAAM,EAAE,EACT,OAAOR,KAAK,SAAS,IAAIW;YAG7B,MAAMC,SAAS,MAAMX,2BAA2B;gBAC5C,IAAIO,MAAM,EAAE;gBACZ,cAAcF,MAAM,OAAO;YAC/B;YAEA,IAAIM,QAAQ,UAAU;gBAClB,MAAMC,WAAWD,OAAO,QAAQ;gBAChCR,aACI,CAAC,qCAAqC,EAClCS,SAAS,WAAW,IAAIA,SAAS,EAAE,CACtC,8BAA8B,CAAC;gBAEpC,OAAO;YACX;YAEA,MAAMC,aAAa,MAAMd,KAAK,SAAS,IAAIW;YAC3C,IAAIG,YACA,MAAMZ,gBAAgB;gBAClB,IAAIY,WAAW,EAAE;gBACjB,cAAcR,MAAM,OAAO;YAC/B;YAGJ,OAAOQ;QACX,GACA;YAACN,OAAO;YAAIF,MAAM,OAAO;YAAEJ;SAAgB;QAG/C,OAAO;YACH,GAAGF,IAAI;YACPS;QACJ;IACJ"}