@webiny/app-record-locking 6.0.0-beta.0 → 6.0.0-rc.1

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 (149) hide show
  1. package/README.md +8 -9
  2. package/components/HeadlessCmsActionsAcoCell.js +46 -57
  3. package/components/HeadlessCmsActionsAcoCell.js.map +1 -1
  4. package/components/HeadlessCmsContentEntry/ContentEntryGuard.d.ts +4 -0
  5. package/components/HeadlessCmsContentEntry/ContentEntryGuard.js +24 -70
  6. package/components/HeadlessCmsContentEntry/ContentEntryGuard.js.map +1 -1
  7. package/components/HeadlessCmsContentEntry/ContentEntryLocker.d.ts +7 -3
  8. package/components/HeadlessCmsContentEntry/ContentEntryLocker.js +82 -84
  9. package/components/HeadlessCmsContentEntry/ContentEntryLocker.js.map +1 -1
  10. package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js +66 -40
  11. package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js.map +1 -1
  12. package/components/HeadlessCmsContentEntry/index.d.ts +1 -1
  13. package/components/HeadlessCmsContentEntry/index.js +1 -16
  14. package/components/HeadlessCmsContentEntry/index.js.map +1 -1
  15. package/components/LockedRecord/LockedRecord.d.ts +1 -1
  16. package/components/LockedRecord/LockedRecord.js +51 -146
  17. package/components/LockedRecord/LockedRecord.js.map +1 -1
  18. package/components/LockedRecord/LockedRecordForceUnlock.d.ts +1 -1
  19. package/components/LockedRecord/LockedRecordForceUnlock.js +49 -95
  20. package/components/LockedRecord/LockedRecordForceUnlock.js.map +1 -1
  21. package/components/LockedRecord/index.d.ts +1 -1
  22. package/components/LockedRecord/index.js +1 -16
  23. package/components/LockedRecord/index.js.map +1 -1
  24. package/components/RecordLockingProvider.d.ts +1 -1
  25. package/components/RecordLockingProvider.js +63 -68
  26. package/components/RecordLockingProvider.js.map +1 -1
  27. package/components/SecurityPermissions.d.ts +2 -0
  28. package/components/SecurityPermissions.js +23 -0
  29. package/components/SecurityPermissions.js.map +1 -0
  30. package/components/decorators/UseContentEntriesListHookDecorator.d.ts +1 -2
  31. package/components/decorators/UseContentEntriesListHookDecorator.js +13 -18
  32. package/components/decorators/UseContentEntriesListHookDecorator.js.map +1 -1
  33. package/components/decorators/UseRecordsDecorator.d.ts +1 -2
  34. package/components/decorators/UseRecordsDecorator.js +11 -16
  35. package/components/decorators/UseRecordsDecorator.js.map +1 -1
  36. package/components/decorators/UseSaveEntryDecorator.d.ts +1 -2
  37. package/components/decorators/UseSaveEntryDecorator.js +34 -34
  38. package/components/decorators/UseSaveEntryDecorator.js.map +1 -1
  39. package/domain/RecordLocking.d.ts +10 -14
  40. package/domain/RecordLocking.js +272 -330
  41. package/domain/RecordLocking.js.map +1 -1
  42. package/domain/RecordLockingClient.d.ts +3 -3
  43. package/domain/RecordLockingClient.js +15 -29
  44. package/domain/RecordLockingClient.js.map +1 -1
  45. package/domain/RecordLockingGetLockRecord.d.ts +2 -2
  46. package/domain/RecordLockingGetLockRecord.js +16 -29
  47. package/domain/RecordLockingGetLockRecord.js.map +1 -1
  48. package/domain/RecordLockingGetLockedEntryLockRecord.d.ts +2 -2
  49. package/domain/RecordLockingGetLockedEntryLockRecord.js +14 -27
  50. package/domain/RecordLockingGetLockedEntryLockRecord.js.map +1 -1
  51. package/domain/RecordLockingIsEntryLocked.d.ts +2 -2
  52. package/domain/RecordLockingIsEntryLocked.js +14 -27
  53. package/domain/RecordLockingIsEntryLocked.js.map +1 -1
  54. package/domain/RecordLockingListLockRecords.d.ts +3 -3
  55. package/domain/RecordLockingListLockRecords.js +26 -37
  56. package/domain/RecordLockingListLockRecords.js.map +1 -1
  57. package/domain/RecordLockingLockEntry.d.ts +2 -2
  58. package/domain/RecordLockingLockEntry.js +9 -24
  59. package/domain/RecordLockingLockEntry.js.map +1 -1
  60. package/domain/RecordLockingUnlockEntry.d.ts +2 -2
  61. package/domain/RecordLockingUnlockEntry.js +14 -27
  62. package/domain/RecordLockingUnlockEntry.js.map +1 -1
  63. package/domain/RecordLockingUpdateEntryLock.d.ts +2 -2
  64. package/domain/RecordLockingUpdateEntryLock.js +14 -27
  65. package/domain/RecordLockingUpdateEntryLock.js.map +1 -1
  66. package/domain/abstractions/IRecordLocking.d.ts +8 -2
  67. package/domain/abstractions/IRecordLocking.js +1 -5
  68. package/domain/abstractions/IRecordLocking.js.map +1 -1
  69. package/domain/abstractions/IRecordLockingClient.d.ts +2 -2
  70. package/domain/abstractions/IRecordLockingClient.js +1 -5
  71. package/domain/abstractions/IRecordLockingClient.js.map +1 -1
  72. package/domain/abstractions/IRecordLockingGetLockRecord.d.ts +1 -1
  73. package/domain/abstractions/IRecordLockingGetLockRecord.js +1 -5
  74. package/domain/abstractions/IRecordLockingGetLockRecord.js.map +1 -1
  75. package/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.d.ts +1 -1
  76. package/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.js +1 -5
  77. package/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.js.map +1 -1
  78. package/domain/abstractions/IRecordLockingIsEntryLocked.d.ts +1 -1
  79. package/domain/abstractions/IRecordLockingIsEntryLocked.js +1 -5
  80. package/domain/abstractions/IRecordLockingListLockRecords.d.ts +1 -1
  81. package/domain/abstractions/IRecordLockingListLockRecords.js +1 -5
  82. package/domain/abstractions/IRecordLockingListLockRecords.js.map +1 -1
  83. package/domain/abstractions/IRecordLockingLockEntry.d.ts +1 -1
  84. package/domain/abstractions/IRecordLockingLockEntry.js +1 -5
  85. package/domain/abstractions/IRecordLockingLockEntry.js.map +1 -1
  86. package/domain/abstractions/IRecordLockingUnlockEntry.d.ts +1 -1
  87. package/domain/abstractions/IRecordLockingUnlockEntry.js +1 -5
  88. package/domain/abstractions/IRecordLockingUnlockEntry.js.map +1 -1
  89. package/domain/abstractions/IRecordLockingUpdateEntryLock.d.ts +1 -1
  90. package/domain/abstractions/IRecordLockingUpdateEntryLock.js +1 -5
  91. package/domain/abstractions/IRecordLockingUpdateEntryLock.js.map +1 -1
  92. package/domain/graphql/fields.js +28 -8
  93. package/domain/graphql/fields.js.map +1 -1
  94. package/domain/graphql/getLockRecord.d.ts +3 -3
  95. package/domain/graphql/getLockRecord.js +16 -12
  96. package/domain/graphql/getLockRecord.js.map +1 -1
  97. package/domain/graphql/getLockedEntryLockRecord.d.ts +3 -3
  98. package/domain/graphql/getLockedEntryLockRecord.js +16 -12
  99. package/domain/graphql/getLockedEntryLockRecord.js.map +1 -1
  100. package/domain/graphql/isEntryLocked.d.ts +3 -3
  101. package/domain/graphql/isEntryLocked.js +14 -12
  102. package/domain/graphql/isEntryLocked.js.map +1 -1
  103. package/domain/graphql/listLockRecords.d.ts +3 -3
  104. package/domain/graphql/listLockRecords.js +23 -14
  105. package/domain/graphql/listLockRecords.js.map +1 -1
  106. package/domain/graphql/lockEntry.d.ts +3 -3
  107. package/domain/graphql/lockEntry.js +17 -13
  108. package/domain/graphql/lockEntry.js.map +1 -1
  109. package/domain/graphql/unlockEntry.d.ts +3 -3
  110. package/domain/graphql/unlockEntry.js +16 -12
  111. package/domain/graphql/unlockEntry.js.map +1 -1
  112. package/domain/graphql/updateEntryLock.d.ts +3 -3
  113. package/domain/graphql/updateEntryLock.js +16 -12
  114. package/domain/graphql/updateEntryLock.js.map +1 -1
  115. package/domain/utils/createRecordLockingClient.d.ts +1 -1
  116. package/domain/utils/createRecordLockingClient.js +6 -12
  117. package/domain/utils/createRecordLockingClient.js.map +1 -1
  118. package/domain/utils/createRecordLockingError.d.ts +1 -1
  119. package/domain/utils/createRecordLockingError.js +1 -7
  120. package/domain/utils/createRecordLockingError.js.map +1 -1
  121. package/hooks/index.d.ts +2 -2
  122. package/hooks/index.js +2 -27
  123. package/hooks/index.js.map +1 -1
  124. package/hooks/usePermission.d.ts +1 -1
  125. package/hooks/usePermission.js +14 -15
  126. package/hooks/usePermission.js.map +1 -1
  127. package/hooks/useRecordLocking.d.ts +1 -1
  128. package/hooks/useRecordLocking.js +6 -12
  129. package/hooks/useRecordLocking.js.map +1 -1
  130. package/index.d.ts +2 -2
  131. package/index.js +19 -49
  132. package/index.js.map +1 -1
  133. package/package.json +16 -31
  134. package/types.d.ts +32 -12
  135. package/types.js +1 -5
  136. package/types.js.map +1 -1
  137. package/utils/createCacheKey.d.ts +2 -2
  138. package/utils/createCacheKey.js +5 -11
  139. package/utils/createCacheKey.js.map +1 -1
  140. package/components/assets/lock.svg +0 -13
  141. package/domain/RecordLockingUnlockEntryRequest.d.ts +0 -11
  142. package/domain/RecordLockingUnlockEntryRequest.js +0 -28
  143. package/domain/RecordLockingUnlockEntryRequest.js.map +0 -1
  144. package/domain/abstractions/IRecordLockingUnlockEntryRequest.d.ts +0 -12
  145. package/domain/abstractions/IRecordLockingUnlockEntryRequest.js +0 -7
  146. package/domain/abstractions/IRecordLockingUnlockEntryRequest.js.map +0 -1
  147. package/domain/graphql/unlockEntryRequest.d.ts +0 -12
  148. package/domain/graphql/unlockEntryRequest.js +0 -16
  149. package/domain/graphql/unlockEntryRequest.js.map +0 -1
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ import { AdminConfig } from "@webiny/app-admin";
3
+ import { ReactComponent as LockIcon } from "@webiny/icons/lock.svg";
4
+ const {
5
+ Security
6
+ } = AdminConfig;
7
+ export const SecurityPermissions = () => {
8
+ return /*#__PURE__*/React.createElement(AdminConfig, null, /*#__PURE__*/React.createElement(Security.Permissions, {
9
+ name: "record-locking",
10
+ title: "Record Locking",
11
+ description: "Manage Record Locking permissions.",
12
+ icon: /*#__PURE__*/React.createElement(LockIcon, null),
13
+ schema: {
14
+ prefix: "recordLocking",
15
+ fullAccess: {
16
+ name: "recordLocking",
17
+ canForceUnlock: true
18
+ }
19
+ }
20
+ }));
21
+ };
22
+
23
+ //# sourceMappingURL=SecurityPermissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","AdminConfig","ReactComponent","LockIcon","Security","SecurityPermissions","createElement","Permissions","name","title","description","icon","schema","prefix","fullAccess","canForceUnlock"],"sources":["SecurityPermissions.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig } from \"@webiny/app-admin\";\nimport { ReactComponent as LockIcon } from \"@webiny/icons/lock.svg\";\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={{\n prefix: \"recordLocking\",\n fullAccess: { name: \"recordLocking\", canForceUnlock: true }\n }}\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;AAEnE,MAAM;EAAEC;AAAS,CAAC,GAAGH,WAAW;AAEhC,OAAO,MAAMI,mBAAmB,GAAGA,CAAA,KAAM;EACrC,oBACIL,KAAA,CAAAM,aAAA,CAACL,WAAW,qBACRD,KAAA,CAAAM,aAAA,CAACF,QAAQ,CAACG,WAAW;IACjBC,IAAI,EAAC,gBAAgB;IACrBC,KAAK,EAAC,gBAAgB;IACtBC,WAAW,EAAC,oCAAoC;IAChDC,IAAI,eAAEX,KAAA,CAAAM,aAAA,CAACH,QAAQ,MAAE,CAAE;IACnBS,MAAM,EAAE;MACJC,MAAM,EAAE,eAAe;MACvBC,UAAU,EAAE;QAAEN,IAAI,EAAE,eAAe;QAAEO,cAAc,EAAE;MAAK;IAC9D;EAAE,CACL,CACQ,CAAC;AAEtB,CAAC","ignoreList":[]}
@@ -1,2 +1 @@
1
- /// <reference types="react" />
2
- export declare const UseContentEntriesListHookDecorator: () => import("react").JSX.Element;
1
+ export declare const UseContentEntriesListHookDecorator: () => React.JSX.Element;
@@ -1,27 +1,22 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.UseContentEntriesListHookDecorator = void 0;
8
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
- var _react = require("react");
10
- var _appHeadlessCms = require("@webiny/app-headless-cms");
11
- var _hooks = require("../../hooks");
12
- var UseContentEntriesListHookDecorator = exports.UseContentEntriesListHookDecorator = _appHeadlessCms.ContentEntryListConfig.ContentEntries.useContentEntriesList.createDecorator(function (originalHook) {
1
+ import { useEffect } from "react";
2
+ import { ContentEntryListConfig } from "@webiny/app-headless-cms";
3
+ import { useRecordLocking } from "../../hooks/index.js";
4
+ export const UseContentEntriesListHookDecorator = ContentEntryListConfig.ContentEntries.useContentEntriesList.createDecorator(originalHook => {
13
5
  return function RecordLockingUseContentEntriesList() {
14
- var value = originalHook();
15
- var recordLocking = (0, _hooks.useRecordLocking)();
16
- (0, _react.useEffect)(function () {
6
+ const value = originalHook();
7
+ const recordLocking = useRecordLocking();
8
+ useEffect(() => {
17
9
  if (!value.records) {
18
10
  return;
19
11
  }
20
- recordLocking.setRecords(value.folderId, value.modelId, value.records);
12
+ recordLocking.setRecords(value.folderId, value.modelId,
13
+ // TODO determine if this is correct
14
+ value.records);
21
15
  }, [value.folderId, value.modelId, value.records, recordLocking]);
22
- return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, value), {}, {
16
+ return {
17
+ ...value,
23
18
  records: recordLocking.records
24
- });
19
+ };
25
20
  };
26
21
  });
27
22
 
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_appHeadlessCms","_hooks","UseContentEntriesListHookDecorator","exports","ContentEntryListConfig","ContentEntries","useContentEntriesList","createDecorator","originalHook","RecordLockingUseContentEntriesList","value","recordLocking","useRecordLocking","useEffect","records","setRecords","folderId","modelId","_objectSpread2","default"],"sources":["UseContentEntriesListHookDecorator.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { ContentEntryListConfig } from \"@webiny/app-headless-cms\";\nimport { useRecordLocking } from \"~/hooks\";\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\n recordLocking.setRecords(value.folderId, value.modelId, value.records);\n }, [value.folderId, value.modelId, value.records, recordLocking]);\n\n return {\n ...value,\n records: recordLocking.records\n };\n };\n });\n"],"mappings":";;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAEO,IAAMG,kCAAkC,GAAAC,OAAA,CAAAD,kCAAA,GAC3CE,sCAAsB,CAACC,cAAc,CAACC,qBAAqB,CAACC,eAAe,CAAC,UAAAC,YAAY,EAAI;EACxF,OAAO,SAASC,kCAAkCA,CAAA,EAAG;IACjD,IAAMC,KAAK,GAAGF,YAAY,CAAC,CAAC;IAC5B,IAAMG,aAAa,GAAG,IAAAC,uBAAgB,EAAC,CAAC;IAExC,IAAAC,gBAAS,EAAC,YAAM;MACZ,IAAI,CAACH,KAAK,CAACI,OAAO,EAAE;QAChB;MACJ;MAEAH,aAAa,CAACI,UAAU,CAACL,KAAK,CAACM,QAAQ,EAAEN,KAAK,CAACO,OAAO,EAAEP,KAAK,CAACI,OAAO,CAAC;IAC1E,CAAC,EAAE,CAACJ,KAAK,CAACM,QAAQ,EAAEN,KAAK,CAACO,OAAO,EAAEP,KAAK,CAACI,OAAO,EAAEH,aAAa,CAAC,CAAC;IAEjE,WAAAO,cAAA,CAAAC,OAAA,MAAAD,cAAA,CAAAC,OAAA,MACOT,KAAK;MACRI,OAAO,EAAEH,aAAa,CAACG;IAAO;EAEtC,CAAC;AACL,CAAC,CAAC","ignoreList":[]}
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,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  /**
3
2
  * When record locking mechanism is checking for records equality, it compares record `id` and `savedOn`.
4
3
  * When you're updating ACO cache, you're just passing the new content entry value(s), and sometimes you might
@@ -6,4 +5,4 @@
6
5
  *
7
6
  * This decorator ensures that calls to `updateRecordInCache` always include a `savedOn` timestamp.
8
7
  */
9
- export declare const UseRecordsDecorator: () => import("react").JSX.Element;
8
+ export declare const UseRecordsDecorator: () => React.JSX.Element;
@@ -1,12 +1,5 @@
1
- "use strict";
1
+ import { useRecords } from "@webiny/app-aco";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.UseRecordsDecorator = void 0;
8
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
- var _appAco = require("@webiny/app-aco");
10
3
  /**
11
4
  * When record locking mechanism is checking for records equality, it compares record `id` and `savedOn`.
12
5
  * When you're updating ACO cache, you're just passing the new content entry value(s), and sometimes you might
@@ -14,16 +7,18 @@ var _appAco = require("@webiny/app-aco");
14
7
  *
15
8
  * This decorator ensures that calls to `updateRecordInCache` always include a `savedOn` timestamp.
16
9
  */
17
- var UseRecordsDecorator = exports.UseRecordsDecorator = _appAco.useRecords.createDecorator(function (baseHook) {
18
- return function (folderId) {
19
- var hook = baseHook(folderId);
20
- return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, hook), {}, {
21
- updateRecordInCache: function updateRecordInCache(record) {
22
- hook.updateRecordInCache((0, _objectSpread2.default)((0, _objectSpread2.default)({}, record), {}, {
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,
23
18
  savedOn: new Date().toISOString()
24
- }));
19
+ });
25
20
  }
26
- });
21
+ };
27
22
  };
28
23
  });
29
24
 
@@ -1 +1 @@
1
- {"version":3,"names":["_appAco","require","UseRecordsDecorator","exports","useRecords","createDecorator","baseHook","folderId","hook","_objectSpread2","default","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,IAAAA,OAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,IAAMC,mBAAmB,GAAAC,OAAA,CAAAD,mBAAA,GAAGE,kBAAU,CAACC,eAAe,CAAC,UAAAC,QAAQ,EAAI;EACtE,OAAO,UAACC,QAAiB,EAAK;IAC1B,IAAMC,IAAI,GAAGF,QAAQ,CAACC,QAAQ,CAAC;IAE/B,WAAAE,cAAA,CAAAC,OAAA,MAAAD,cAAA,CAAAC,OAAA,MACOF,IAAI;MACPG,mBAAmB,WAAAA,oBAACC,MAAW,EAAE;QAC7BJ,IAAI,CAACG,mBAAmB,KAAAF,cAAA,CAAAC,OAAA,MAAAD,cAAA,CAAAC,OAAA,MACjBE,MAAM;UACTC,OAAO,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC;QAAC,EACpC,CAAC;MACN;IAAC;EAET,CAAC;AACL,CAAC,CAAC","ignoreList":[]}
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,2 +1 @@
1
- /// <reference types="react" />
2
- export declare const UseSaveEntryDecorator: () => import("react").JSX.Element;
1
+ export declare const UseSaveEntryDecorator: () => React.JSX.Element;
@@ -1,43 +1,42 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.UseSaveEntryDecorator = void 0;
8
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
- var _react = require("react");
10
- var _hooks = require("../../hooks");
11
- var _appHeadlessCms = require("@webiny/app-headless-cms");
12
- var _appAdmin = require("@webiny/app-admin");
13
- var _ContentEntryEditorCo = _appHeadlessCms.ContentEntryEditorConfig.ContentEntry,
14
- ContentEntryForm = _ContentEntryEditorCo.ContentEntryForm,
15
- useContentEntry = _ContentEntryEditorCo.useContentEntry;
16
- var UseSaveEntryDecorator = exports.UseSaveEntryDecorator = ContentEntryForm.useContentEntryForm.createDecorator(function (originalHook) {
1
+ import { useCallback } from "react";
2
+ import { useRecordLocking } from "../../hooks/index.js";
3
+ import { ContentEntryEditorConfig, useModel } from "@webiny/app-headless-cms";
4
+ import { useSnackbar } from "@webiny/app-admin";
5
+ const {
6
+ ContentEntry: {
7
+ ContentEntryForm
8
+ }
9
+ } = ContentEntryEditorConfig;
10
+ export const UseSaveEntryDecorator = ContentEntryForm.useContentEntryForm.createDecorator(originalHook => {
17
11
  return function useRecordLockingUseSave() {
18
- var hook = originalHook();
19
- var _useContentEntry = useContentEntry(),
20
- entry = _useContentEntry.entry,
21
- model = _useContentEntry.contentModel;
22
- var _useRecordLocking = (0, _hooks.useRecordLocking)(),
23
- fetchLockedEntryLockRecord = _useRecordLocking.fetchLockedEntryLockRecord,
24
- updateEntryLock = _useRecordLocking.updateEntryLock;
25
- var _useSnackbar = (0, _appAdmin.useSnackbar)(),
26
- showSnackbar = _useSnackbar.showSnackbar;
27
- var saveEntry = (0, _react.useCallback)(async function () {
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) => {
28
27
  if (!entry.id) {
29
- return hook.saveEntry.apply(hook, arguments);
28
+ return hook.saveEntry(...params);
30
29
  }
31
- var result = await fetchLockedEntryLockRecord({
30
+ const result = await fetchLockedEntryLockRecord({
32
31
  id: entry.id,
33
32
  $lockingType: model.modelId
34
33
  });
35
34
  if (result?.lockedBy) {
36
- var lockedBy = result.lockedBy;
37
- showSnackbar("It seems that the entry is locked by ".concat(lockedBy.displayName || lockedBy.id, ". You can't save your changes."));
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.`);
38
37
  return null;
39
38
  }
40
- var saveResult = await hook.saveEntry.apply(hook, arguments);
39
+ const saveResult = await hook.saveEntry(...params);
41
40
  if (saveResult) {
42
41
  await updateEntryLock({
43
42
  id: saveResult.id,
@@ -46,9 +45,10 @@ var UseSaveEntryDecorator = exports.UseSaveEntryDecorator = ContentEntryForm.use
46
45
  }
47
46
  return saveResult;
48
47
  }, [entry?.id, model.modelId, updateEntryLock]);
49
- return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, hook), {}, {
50
- saveEntry: saveEntry
51
- });
48
+ return {
49
+ ...hook,
50
+ saveEntry
51
+ };
52
52
  };
53
53
  });
54
54
 
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_hooks","_appHeadlessCms","_appAdmin","_ContentEntryEditorCo","ContentEntryEditorConfig","ContentEntry","ContentEntryForm","useContentEntry","UseSaveEntryDecorator","exports","useContentEntryForm","createDecorator","originalHook","useRecordLockingUseSave","hook","_useContentEntry","entry","model","contentModel","_useRecordLocking","useRecordLocking","fetchLockedEntryLockRecord","updateEntryLock","_useSnackbar","useSnackbar","showSnackbar","saveEntry","useCallback","id","apply","arguments","result","$lockingType","modelId","lockedBy","concat","displayName","saveResult","_objectSpread2","default"],"sources":["UseSaveEntryDecorator.tsx"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useRecordLocking } from \"~/hooks\";\nimport { ContentEntryEditorConfig } from \"@webiny/app-headless-cms\";\nimport { useSnackbar } from \"@webiny/app-admin\";\n\nconst {\n ContentEntry: { ContentEntryForm, useContentEntry }\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 { entry, contentModel: model } = useContentEntry();\n const { fetchLockedEntryLockRecord, updateEntryLock } = useRecordLocking();\n const { showSnackbar } = useSnackbar();\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,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,SAAA,GAAAH,OAAA;AAEA,IAAAI,qBAAA,GAEIC,wCAAwB,CADxBC,YAAY;EAAIC,gBAAgB,GAAAH,qBAAA,CAAhBG,gBAAgB;EAAEC,eAAe,GAAAJ,qBAAA,CAAfI,eAAe;AAK9C,IAAMC,qBAAqB,GAAAC,OAAA,CAAAD,qBAAA,GAAGF,gBAAgB,CAACI,mBAAmB,CAACC,eAAe,CACrF,UAAAC,YAAY,EAAI;EACZ,OAAO,SAASC,uBAAuBA,CAAA,EAAG;IACtC,IAAMC,IAAI,GAAGF,YAAY,CAAC,CAAC;IAC3B,IAAAG,gBAAA,GAAuCR,eAAe,CAAC,CAAC;MAAhDS,KAAK,GAAAD,gBAAA,CAALC,KAAK;MAAgBC,KAAK,GAAAF,gBAAA,CAAnBG,YAAY;IAC3B,IAAAC,iBAAA,GAAwD,IAAAC,uBAAgB,EAAC,CAAC;MAAlEC,0BAA0B,GAAAF,iBAAA,CAA1BE,0BAA0B;MAAEC,eAAe,GAAAH,iBAAA,CAAfG,eAAe;IACnD,IAAAC,YAAA,GAAyB,IAAAC,qBAAW,EAAC,CAAC;MAA9BC,YAAY,GAAAF,YAAA,CAAZE,YAAY;IAEpB,IAAMC,SAAoB,GAAG,IAAAC,kBAAW,EACpC,kBAAqB;MACjB,IAAI,CAACX,KAAK,CAACY,EAAE,EAAE;QACX,OAAOd,IAAI,CAACY,SAAS,CAAAG,KAAA,CAAdf,IAAI,EAAAgB,SAAoB,CAAC;MACpC;MAEA,IAAMC,MAAM,GAAG,MAAMV,0BAA0B,CAAC;QAC5CO,EAAE,EAAEZ,KAAK,CAACY,EAAE;QACZI,YAAY,EAAEf,KAAK,CAACgB;MACxB,CAAC,CAAC;MAEF,IAAIF,MAAM,EAAEG,QAAQ,EAAE;QAClB,IAAMA,QAAQ,GAAGH,MAAM,CAACG,QAAQ;QAChCT,YAAY,yCAAAU,MAAA,CAEJD,QAAQ,CAACE,WAAW,IAAIF,QAAQ,CAACN,EAAE,mCAE3C,CAAC;QACD,OAAO,IAAI;MACf;MAEA,IAAMS,UAAU,GAAG,MAAMvB,IAAI,CAACY,SAAS,CAAAG,KAAA,CAAdf,IAAI,EAAAgB,SAAoB,CAAC;MAClD,IAAIO,UAAU,EAAE;QACZ,MAAMf,eAAe,CAAC;UAClBM,EAAE,EAAES,UAAU,CAACT,EAAE;UACjBI,YAAY,EAAEf,KAAK,CAACgB;QACxB,CAAC,CAAC;MACN;MAEA,OAAOI,UAAU;IACrB,CAAC,EACD,CAACrB,KAAK,EAAEY,EAAE,EAAEX,KAAK,CAACgB,OAAO,EAAEX,eAAe,CAC9C,CAAC;IAED,WAAAgB,cAAA,CAAAC,OAAA,MAAAD,cAAA,CAAAC,OAAA,MACOzB,IAAI;MACPY,SAAS,EAATA;IAAS;EAEjB,CAAC;AACL,CACJ,CAAC","ignoreList":[]}
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,21 +1,18 @@
1
- import { IRecordLocking } from "./abstractions/IRecordLocking";
2
- import { ApolloClient } from "apollo-client";
3
- import { IRecordLockingGetLockRecord } from "./abstractions/IRecordLockingGetLockRecord";
4
- import { IRecordLockingIsEntryLocked } from "./abstractions/IRecordLockingIsEntryLocked";
5
- import { IRecordLockingListLockRecords } from "./abstractions/IRecordLockingListLockRecords";
6
- import { IRecordLockingLockEntry } from "./abstractions/IRecordLockingLockEntry";
7
- import { IRecordLockingUnlockEntry } from "./abstractions/IRecordLockingUnlockEntry";
8
- import { IRecordLockingUnlockEntryRequest } from "./abstractions/IRecordLockingUnlockEntryRequest";
9
- import { IRecordLockingError, IRecordLockingRecord } from "../types";
10
- import { IRecordLockingClient } from "./abstractions/IRecordLockingClient";
11
- import { IRecordLockingUpdateEntryLock } from "./abstractions/IRecordLockingUpdateEntryLock";
12
- import { IRecordLockingGetLockedEntryLockRecord } from "./abstractions/IRecordLockingGetLockedEntryLockRecord";
1
+ import type { IRecordLocking } from "./abstractions/IRecordLocking.js";
2
+ import type { ApolloClient } from "apollo-client";
3
+ import type { IRecordLockingGetLockRecord } from "./abstractions/IRecordLockingGetLockRecord.js";
4
+ import type { IRecordLockingIsEntryLocked } from "./abstractions/IRecordLockingIsEntryLocked.js";
5
+ import type { IRecordLockingListLockRecords } from "./abstractions/IRecordLockingListLockRecords.js";
6
+ import type { IRecordLockingLockEntry } from "./abstractions/IRecordLockingLockEntry.js";
7
+ import type { IRecordLockingUnlockEntry } from "./abstractions/IRecordLockingUnlockEntry.js";
8
+ import type { IRecordLockingError, IRecordLockingRecord } from "../types.js";
9
+ import type { IRecordLockingUpdateEntryLock } from "../domain/abstractions/IRecordLockingUpdateEntryLock.js";
10
+ import type { IRecordLockingGetLockedEntryLockRecord } from "./abstractions/IRecordLockingGetLockedEntryLockRecord.js";
13
11
  export interface ICreateRecordLockingParams {
14
12
  client: ApolloClient<any>;
15
13
  setLoading: (loading: boolean) => void;
16
14
  }
17
15
  export interface IRecordLockingParams {
18
- client: IRecordLockingClient;
19
16
  setLoading: (loading: boolean) => void;
20
17
  getLockRecord: IRecordLockingGetLockRecord;
21
18
  getLockedEntryLockRecord: IRecordLockingGetLockedEntryLockRecord;
@@ -23,7 +20,6 @@ export interface IRecordLockingParams {
23
20
  listLockRecords: IRecordLockingListLockRecords;
24
21
  lockEntry: IRecordLockingLockEntry;
25
22
  unlockEntry: IRecordLockingUnlockEntry;
26
- unlockEntryRequest: IRecordLockingUnlockEntryRequest;
27
23
  updateEntryLock: IRecordLockingUpdateEntryLock;
28
24
  }
29
25
  export interface IOnErrorCb {