@webiny/app-record-locking 0.0.0-unstable.6844005670 → 0.0.0-unstable.7be00a75a9

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 (105) 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.d.ts +1 -1
  6. package/components/HeadlessCmsContentEntry/ContentEntryLocker.js +70 -89
  7. package/components/HeadlessCmsContentEntry/ContentEntryLocker.js.map +1 -1
  8. package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js +38 -83
  9. package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js.map +1 -1
  10. package/components/HeadlessCmsContentEntry/index.js +0 -2
  11. package/components/LockedRecord/LockedRecord.js +45 -57
  12. package/components/LockedRecord/LockedRecord.js.map +1 -1
  13. package/components/LockedRecord/LockedRecordForceUnlock.js +49 -63
  14. package/components/LockedRecord/LockedRecordForceUnlock.js.map +1 -1
  15. package/components/LockedRecord/index.js +0 -2
  16. package/components/RecordLockingProvider.js +103 -117
  17. package/components/RecordLockingProvider.js.map +1 -1
  18. package/components/SecurityPermissions.js +12 -19
  19. package/components/SecurityPermissions.js.map +1 -1
  20. package/components/decorators/UseContentEntriesListHookDecorator.js +18 -18
  21. package/components/decorators/UseContentEntriesListHookDecorator.js.map +1 -1
  22. package/components/decorators/UseRecordsDecorator.js +13 -22
  23. package/components/decorators/UseRecordsDecorator.js.map +1 -1
  24. package/components/decorators/UseSaveEntryDecorator.js +35 -49
  25. package/components/decorators/UseSaveEntryDecorator.js.map +1 -1
  26. package/domain/RecordLocking.js +229 -291
  27. package/domain/RecordLocking.js.map +1 -1
  28. package/domain/RecordLockingClient.js +17 -16
  29. package/domain/RecordLockingClient.js.map +1 -1
  30. package/domain/RecordLockingGetLockRecord.js +13 -15
  31. package/domain/RecordLockingGetLockRecord.js.map +1 -1
  32. package/domain/RecordLockingGetLockedEntryLockRecord.js +12 -13
  33. package/domain/RecordLockingGetLockedEntryLockRecord.js.map +1 -1
  34. package/domain/RecordLockingIsEntryLocked.js +15 -14
  35. package/domain/RecordLockingIsEntryLocked.js.map +1 -1
  36. package/domain/RecordLockingListLockRecords.js +18 -24
  37. package/domain/RecordLockingListLockRecords.js.map +1 -1
  38. package/domain/RecordLockingLockEntry.js +8 -9
  39. package/domain/RecordLockingLockEntry.js.map +1 -1
  40. package/domain/RecordLockingUnlockEntry.js +12 -13
  41. package/domain/RecordLockingUnlockEntry.js.map +1 -1
  42. package/domain/RecordLockingUpdateEntryLock.js +12 -13
  43. package/domain/RecordLockingUpdateEntryLock.js.map +1 -1
  44. package/domain/abstractions/IRecordLocking.js +0 -3
  45. package/domain/abstractions/IRecordLockingClient.js +0 -3
  46. package/domain/abstractions/IRecordLockingGetLockRecord.js +0 -3
  47. package/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.js +0 -3
  48. package/domain/abstractions/IRecordLockingIsEntryLocked.js +0 -3
  49. package/domain/abstractions/IRecordLockingListLockRecords.js +0 -3
  50. package/domain/abstractions/IRecordLockingLockEntry.js +0 -3
  51. package/domain/abstractions/IRecordLockingUnlockEntry.js +0 -3
  52. package/domain/abstractions/IRecordLockingUpdateEntryLock.js +0 -3
  53. package/domain/graphql/fields.js +3 -2
  54. package/domain/graphql/fields.js.map +1 -1
  55. package/domain/graphql/getLockRecord.js +3 -2
  56. package/domain/graphql/getLockRecord.js.map +1 -1
  57. package/domain/graphql/getLockedEntryLockRecord.js +3 -2
  58. package/domain/graphql/getLockedEntryLockRecord.js.map +1 -1
  59. package/domain/graphql/isEntryLocked.js +3 -2
  60. package/domain/graphql/isEntryLocked.js.map +1 -1
  61. package/domain/graphql/listLockRecords.js +4 -5
  62. package/domain/graphql/listLockRecords.js.map +1 -1
  63. package/domain/graphql/lockEntry.js +3 -4
  64. package/domain/graphql/lockEntry.js.map +1 -1
  65. package/domain/graphql/unlockEntry.js +3 -2
  66. package/domain/graphql/unlockEntry.js.map +1 -1
  67. package/domain/graphql/updateEntryLock.js +3 -2
  68. package/domain/graphql/updateEntryLock.js.map +1 -1
  69. package/domain/permissionsSchema.d.ts +6 -0
  70. package/domain/permissionsSchema.js +10 -0
  71. package/domain/permissionsSchema.js.map +1 -0
  72. package/domain/utils/createRecordLockingClient.js +5 -6
  73. package/domain/utils/createRecordLockingClient.js.map +1 -1
  74. package/domain/utils/createRecordLockingError.js +10 -11
  75. package/domain/utils/createRecordLockingError.js.map +1 -1
  76. package/features/permissions/abstractions.d.ts +17 -0
  77. package/features/permissions/abstractions.js +6 -0
  78. package/features/permissions/abstractions.js.map +1 -0
  79. package/features/permissions/feature.d.ts +14 -0
  80. package/features/permissions/feature.js +7 -0
  81. package/features/permissions/feature.js.map +1 -0
  82. package/hooks/index.js +0 -2
  83. package/hooks/usePermission.js +14 -15
  84. package/hooks/usePermission.js.map +1 -1
  85. package/hooks/useRecordLocking.js +5 -6
  86. package/hooks/useRecordLocking.js.map +1 -1
  87. package/index.js +16 -18
  88. package/index.js.map +1 -1
  89. package/package.json +24 -19
  90. package/types.js +0 -3
  91. package/utils/createCacheKey.js +9 -10
  92. package/utils/createCacheKey.js.map +1 -1
  93. package/components/HeadlessCmsContentEntry/index.js.map +0 -1
  94. package/components/LockedRecord/index.js.map +0 -1
  95. package/domain/abstractions/IRecordLocking.js.map +0 -1
  96. package/domain/abstractions/IRecordLockingClient.js.map +0 -1
  97. package/domain/abstractions/IRecordLockingGetLockRecord.js.map +0 -1
  98. package/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.js.map +0 -1
  99. package/domain/abstractions/IRecordLockingIsEntryLocked.js.map +0 -1
  100. package/domain/abstractions/IRecordLockingListLockRecords.js.map +0 -1
  101. package/domain/abstractions/IRecordLockingLockEntry.js.map +0 -1
  102. package/domain/abstractions/IRecordLockingUnlockEntry.js.map +0 -1
  103. package/domain/abstractions/IRecordLockingUpdateEntryLock.js.map +0 -1
  104. package/hooks/index.js.map +0 -1
  105. package/types.js.map +0 -1
@@ -1,60 +1,38 @@
1
- import React from "react";
1
+ import react from "react";
2
2
  import { ContentEntryListConfig, useModel } from "@webiny/app-headless-cms";
3
- import { ReactComponent as LockedIcon } from "@webiny/icons/lock.svg";
3
+ import { ReactComponent } from "@webiny/icons/lock.svg";
4
4
  import { useRecordLocking } from "../hooks/index.js";
5
5
  import { UseContentEntriesListHookDecorator } from "./decorators/UseContentEntriesListHookDecorator.js";
6
6
  import { UseSaveEntryDecorator } from "./decorators/UseSaveEntryDecorator.js";
7
7
  import { UseRecordsDecorator } from "./decorators/UseRecordsDecorator.js";
8
8
  import { Icon, Tooltip } from "@webiny/admin-ui";
9
- const {
10
- Browser
11
- } = ContentEntryListConfig;
12
- const ActionsCell = ({
13
- children
14
- }) => {
15
- const {
16
- model
17
- } = useModel();
18
- const {
19
- getLockRecordEntry,
20
- isRecordLocked
21
- } = useRecordLocking();
22
- const {
23
- useTableRow,
24
- isFolderRow
25
- } = Browser.Table.Column;
26
- const {
27
- row
28
- } = useTableRow();
29
- if (isFolderRow(row)) {
30
- return /*#__PURE__*/React.createElement(React.Fragment, null, children);
31
- }
32
- const entry = getLockRecordEntry(row.id);
33
- if (!isRecordLocked(entry) || !entry?.$locked) {
34
- return /*#__PURE__*/React.createElement(React.Fragment, null, children);
35
- }
36
- return /*#__PURE__*/React.createElement(Tooltip, {
37
- side: "left",
38
- content: `This ${model.name} is currently locked by ${entry.$locked.lockedBy.displayName}.`,
39
- trigger: /*#__PURE__*/React.createElement(Icon, {
40
- icon: /*#__PURE__*/React.createElement(LockedIcon, null),
41
- label: "Locked entry",
42
- color: "neutral-light"
43
- })
44
- });
45
- };
46
- const RecordLockingCellActions = Browser.Table.Column.createDecorator(Original => {
47
- return function RecordLockingCellActions(props) {
48
- if (props.name === "actions" && props.cell) {
49
- return /*#__PURE__*/React.createElement(Original, Object.assign({}, props, {
50
- cell: /*#__PURE__*/React.createElement(ActionsCell, null, props.cell)
51
- }));
52
- }
53
- return /*#__PURE__*/React.createElement(Original, props);
54
- };
55
- });
56
- export const HeadlessCmsActionsAcoCell = () => {
57
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(UseContentEntriesListHookDecorator, null), /*#__PURE__*/React.createElement(UseSaveEntryDecorator, null), /*#__PURE__*/React.createElement(RecordLockingCellActions, null), /*#__PURE__*/React.createElement(UseRecordsDecorator, null));
9
+ const { Browser: Browser } = ContentEntryListConfig;
10
+ const ActionsCell = ({ children })=>{
11
+ const { model } = useModel();
12
+ const { getLockRecordEntry, isRecordLocked } = useRecordLocking();
13
+ const { useTableRow, isFolderRow } = Browser.Table.Column;
14
+ const { row } = useTableRow();
15
+ if (isFolderRow(row)) return /*#__PURE__*/ react.createElement(react.Fragment, null, children);
16
+ const entry = getLockRecordEntry(row.id);
17
+ if (!isRecordLocked(entry) || !entry?.$locked) return /*#__PURE__*/ react.createElement(react.Fragment, null, children);
18
+ return /*#__PURE__*/ react.createElement(Tooltip, {
19
+ side: "left",
20
+ content: `This ${model.name} is currently locked by ${entry.$locked.lockedBy.displayName}.`,
21
+ trigger: /*#__PURE__*/ react.createElement(Icon, {
22
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
23
+ label: "Locked entry",
24
+ color: "neutral-light"
25
+ })
26
+ });
58
27
  };
28
+ const HeadlessCmsActionsAcoCell_RecordLockingCellActions = Browser.Table.Column.createDecorator((Original)=>function(props) {
29
+ if ("actions" === props.name && props.cell) return /*#__PURE__*/ react.createElement(Original, {
30
+ ...props,
31
+ cell: /*#__PURE__*/ react.createElement(ActionsCell, null, props.cell)
32
+ });
33
+ return /*#__PURE__*/ react.createElement(Original, props);
34
+ });
35
+ const HeadlessCmsActionsAcoCell = ()=>/*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(UseContentEntriesListHookDecorator, null), /*#__PURE__*/ react.createElement(UseSaveEntryDecorator, null), /*#__PURE__*/ react.createElement(HeadlessCmsActionsAcoCell_RecordLockingCellActions, null), /*#__PURE__*/ react.createElement(UseRecordsDecorator, null));
36
+ export { HeadlessCmsActionsAcoCell };
59
37
 
60
38
  //# sourceMappingURL=HeadlessCmsActionsAcoCell.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","ContentEntryListConfig","useModel","ReactComponent","LockedIcon","useRecordLocking","UseContentEntriesListHookDecorator","UseSaveEntryDecorator","UseRecordsDecorator","Icon","Tooltip","Browser","ActionsCell","children","model","getLockRecordEntry","isRecordLocked","useTableRow","isFolderRow","Table","Column","row","createElement","Fragment","entry","id","$locked","side","content","name","lockedBy","displayName","trigger","icon","label","color","RecordLockingCellActions","createDecorator","Original","props","cell","Object","assign","HeadlessCmsActionsAcoCell"],"sources":["HeadlessCmsActionsAcoCell.tsx"],"sourcesContent":["import React from \"react\";\nimport { ContentEntryListConfig, useModel } from \"@webiny/app-headless-cms\";\nimport { ReactComponent as LockedIcon } from \"@webiny/icons/lock.svg\";\nimport { useRecordLocking } from \"~/hooks/index.js\";\nimport { UseContentEntriesListHookDecorator } from \"./decorators/UseContentEntriesListHookDecorator.js\";\nimport { UseSaveEntryDecorator } from \"~/components/decorators/UseSaveEntryDecorator.js\";\nimport { UseRecordsDecorator } from \"./decorators/UseRecordsDecorator.js\";\nimport { Icon, Tooltip } from \"@webiny/admin-ui\";\n\nconst { Browser } = ContentEntryListConfig;\n\ninterface ActionsCellProps {\n children: React.ReactNode;\n}\n\nconst ActionsCell = ({ children }: ActionsCellProps) => {\n const { model } = useModel();\n const { getLockRecordEntry, isRecordLocked } = useRecordLocking();\n\n const { useTableRow, isFolderRow } = Browser.Table.Column;\n const { row } = useTableRow();\n\n if (isFolderRow(row)) {\n return <>{children}</>;\n }\n\n const entry = getLockRecordEntry(row.id);\n\n if (!isRecordLocked(entry) || !entry?.$locked) {\n return <>{children}</>;\n }\n return (\n <Tooltip\n side={\"left\"}\n content={`This ${model.name} is currently locked by ${entry.$locked.lockedBy.displayName}.`}\n trigger={<Icon icon={<LockedIcon />} label={\"Locked entry\"} color={\"neutral-light\"} />}\n />\n );\n};\n\nconst RecordLockingCellActions = Browser.Table.Column.createDecorator(Original => {\n return function RecordLockingCellActions(props) {\n if (props.name === \"actions\" && props.cell) {\n return <Original {...props} cell={<ActionsCell>{props.cell}</ActionsCell>} />;\n }\n\n return <Original {...props} />;\n };\n});\n\nexport const HeadlessCmsActionsAcoCell = () => {\n return (\n <>\n <UseContentEntriesListHookDecorator />\n <UseSaveEntryDecorator />\n <RecordLockingCellActions />\n <UseRecordsDecorator />\n </>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,sBAAsB,EAAEC,QAAQ,QAAQ,0BAA0B;AAC3E,SAASC,cAAc,IAAIC,UAAU,QAAQ,wBAAwB;AACrE,SAASC,gBAAgB;AACzB,SAASC,kCAAkC;AAC3C,SAASC,qBAAqB;AAC9B,SAASC,mBAAmB;AAC5B,SAASC,IAAI,EAAEC,OAAO,QAAQ,kBAAkB;AAEhD,MAAM;EAAEC;AAAQ,CAAC,GAAGV,sBAAsB;AAM1C,MAAMW,WAAW,GAAGA,CAAC;EAAEC;AAA2B,CAAC,KAAK;EACpD,MAAM;IAAEC;EAAM,CAAC,GAAGZ,QAAQ,CAAC,CAAC;EAC5B,MAAM;IAAEa,kBAAkB;IAAEC;EAAe,CAAC,GAAGX,gBAAgB,CAAC,CAAC;EAEjE,MAAM;IAAEY,WAAW;IAAEC;EAAY,CAAC,GAAGP,OAAO,CAACQ,KAAK,CAACC,MAAM;EACzD,MAAM;IAAEC;EAAI,CAAC,GAAGJ,WAAW,CAAC,CAAC;EAE7B,IAAIC,WAAW,CAACG,GAAG,CAAC,EAAE;IAClB,oBAAOrB,KAAA,CAAAsB,aAAA,CAAAtB,KAAA,CAAAuB,QAAA,QAAGV,QAAW,CAAC;EAC1B;EAEA,MAAMW,KAAK,GAAGT,kBAAkB,CAACM,GAAG,CAACI,EAAE,CAAC;EAExC,IAAI,CAACT,cAAc,CAACQ,KAAK,CAAC,IAAI,CAACA,KAAK,EAAEE,OAAO,EAAE;IAC3C,oBAAO1B,KAAA,CAAAsB,aAAA,CAAAtB,KAAA,CAAAuB,QAAA,QAAGV,QAAW,CAAC;EAC1B;EACA,oBACIb,KAAA,CAAAsB,aAAA,CAACZ,OAAO;IACJiB,IAAI,EAAE,MAAO;IACbC,OAAO,EAAE,QAAQd,KAAK,CAACe,IAAI,2BAA2BL,KAAK,CAACE,OAAO,CAACI,QAAQ,CAACC,WAAW,GAAI;IAC5FC,OAAO,eAAEhC,KAAA,CAAAsB,aAAA,CAACb,IAAI;MAACwB,IAAI,eAAEjC,KAAA,CAAAsB,aAAA,CAAClB,UAAU,MAAE,CAAE;MAAC8B,KAAK,EAAE,cAAe;MAACC,KAAK,EAAE;IAAgB,CAAE;EAAE,CAC1F,CAAC;AAEV,CAAC;AAED,MAAMC,wBAAwB,GAAGzB,OAAO,CAACQ,KAAK,CAACC,MAAM,CAACiB,eAAe,CAACC,QAAQ,IAAI;EAC9E,OAAO,SAASF,wBAAwBA,CAACG,KAAK,EAAE;IAC5C,IAAIA,KAAK,CAACV,IAAI,KAAK,SAAS,IAAIU,KAAK,CAACC,IAAI,EAAE;MACxC,oBAAOxC,KAAA,CAAAsB,aAAA,CAACgB,QAAQ,EAAAG,MAAA,CAAAC,MAAA,KAAKH,KAAK;QAAEC,IAAI,eAAExC,KAAA,CAAAsB,aAAA,CAACV,WAAW,QAAE2B,KAAK,CAACC,IAAkB;MAAE,EAAE,CAAC;IACjF;IAEA,oBAAOxC,KAAA,CAAAsB,aAAA,CAACgB,QAAQ,EAAKC,KAAQ,CAAC;EAClC,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,MAAMI,yBAAyB,GAAGA,CAAA,KAAM;EAC3C,oBACI3C,KAAA,CAAAsB,aAAA,CAAAtB,KAAA,CAAAuB,QAAA,qBACIvB,KAAA,CAAAsB,aAAA,CAAChB,kCAAkC,MAAE,CAAC,eACtCN,KAAA,CAAAsB,aAAA,CAACf,qBAAqB,MAAE,CAAC,eACzBP,KAAA,CAAAsB,aAAA,CAACc,wBAAwB,MAAE,CAAC,eAC5BpC,KAAA,CAAAsB,aAAA,CAACd,mBAAmB,MAAE,CACxB,CAAC;AAEX,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"components/HeadlessCmsActionsAcoCell.js","sources":["../../src/components/HeadlessCmsActionsAcoCell.tsx"],"sourcesContent":["import React from \"react\";\nimport { ContentEntryListConfig, useModel } from \"@webiny/app-headless-cms\";\nimport { ReactComponent as LockedIcon } from \"@webiny/icons/lock.svg\";\nimport { useRecordLocking } from \"~/hooks/index.js\";\nimport { UseContentEntriesListHookDecorator } from \"./decorators/UseContentEntriesListHookDecorator.js\";\nimport { UseSaveEntryDecorator } from \"~/components/decorators/UseSaveEntryDecorator.js\";\nimport { UseRecordsDecorator } from \"./decorators/UseRecordsDecorator.js\";\nimport { Icon, Tooltip } from \"@webiny/admin-ui\";\n\nconst { Browser } = ContentEntryListConfig;\n\ninterface ActionsCellProps {\n children: React.ReactNode;\n}\n\nconst ActionsCell = ({ children }: ActionsCellProps) => {\n const { model } = useModel();\n const { getLockRecordEntry, isRecordLocked } = useRecordLocking();\n\n const { useTableRow, isFolderRow } = Browser.Table.Column;\n const { row } = useTableRow();\n\n if (isFolderRow(row)) {\n return <>{children}</>;\n }\n\n const entry = getLockRecordEntry(row.id);\n\n if (!isRecordLocked(entry) || !entry?.$locked) {\n return <>{children}</>;\n }\n return (\n <Tooltip\n side={\"left\"}\n content={`This ${model.name} is currently locked by ${entry.$locked.lockedBy.displayName}.`}\n trigger={<Icon icon={<LockedIcon />} label={\"Locked entry\"} color={\"neutral-light\"} />}\n />\n );\n};\n\nconst RecordLockingCellActions = Browser.Table.Column.createDecorator(Original => {\n return function RecordLockingCellActions(props) {\n if (props.name === \"actions\" && props.cell) {\n return <Original {...props} cell={<ActionsCell>{props.cell}</ActionsCell>} />;\n }\n\n return <Original {...props} />;\n };\n});\n\nexport const HeadlessCmsActionsAcoCell = () => {\n return (\n <>\n <UseContentEntriesListHookDecorator />\n <UseSaveEntryDecorator />\n <RecordLockingCellActions />\n <UseRecordsDecorator />\n </>\n );\n};\n"],"names":["Browser","ContentEntryListConfig","ActionsCell","children","model","useModel","getLockRecordEntry","isRecordLocked","useRecordLocking","useTableRow","isFolderRow","row","entry","Tooltip","Icon","LockedIcon","RecordLockingCellActions","Original","props","HeadlessCmsActionsAcoCell","UseContentEntriesListHookDecorator","UseSaveEntryDecorator","UseRecordsDecorator"],"mappings":";;;;;;;;AASA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AAMpB,MAAMC,cAAc,CAAC,EAAEC,QAAQ,EAAoB;IAC/C,MAAM,EAAEC,KAAK,EAAE,GAAGC;IAClB,MAAM,EAAEC,kBAAkB,EAAEC,cAAc,EAAE,GAAGC;IAE/C,MAAM,EAAEC,WAAW,EAAEC,WAAW,EAAE,GAAGV,QAAQ,KAAK,CAAC,MAAM;IACzD,MAAM,EAAEW,GAAG,EAAE,GAAGF;IAEhB,IAAIC,YAAYC,MACZ,OAAO,WAAP,GAAO,0CAAGR;IAGd,MAAMS,QAAQN,mBAAmBK,IAAI,EAAE;IAEvC,IAAI,CAACJ,eAAeK,UAAU,CAACA,OAAO,SAClC,OAAO,WAAP,GAAO,0CAAGT;IAEd,OAAO,WAAP,GACI,oBAACU,SAAOA;QACJ,MAAM;QACN,SAAS,CAAC,KAAK,EAAET,MAAM,IAAI,CAAC,wBAAwB,EAAEQ,MAAM,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QAC3F,uBAAS,oBAACE,MAAIA;YAAC,oBAAM,oBAACC,gBAAUA;YAAK,OAAO;YAAgB,OAAO;;;AAG/E;AAEA,MAAMC,qDAA2BhB,QAAQ,KAAK,CAAC,MAAM,CAAC,eAAe,CAACiB,CAAAA,WAC3D,SAAkCC,KAAK;QAC1C,IAAIA,AAAe,cAAfA,MAAM,IAAI,IAAkBA,MAAM,IAAI,EACtC,OAAO,WAAP,GAAO,oBAACD,UAAAA;YAAU,GAAGC,KAAK;YAAE,oBAAM,oBAAChB,aAAWA,MAAEgB,MAAM,IAAI;;QAG9D,OAAO,WAAP,GAAO,oBAACD,UAAaC;IACzB;AAGG,MAAMC,4BAA4B,IAC9B,WAAP,GACI,wDACI,oBAACC,oCAAkCA,OAAAA,WAAAA,GACnC,oBAACC,uBAAqBA,OAAAA,WAAAA,GACtB,oBAACL,oDAAwBA,OAAAA,WAAAA,GACzB,oBAACM,qBAAmBA"}
@@ -1,42 +1,34 @@
1
- import React, { useEffect, useState } from "react";
1
+ import react, { useEffect, useState } from "react";
2
2
  import { useRecordLocking } from "../../hooks/index.js";
3
3
  import { LockedRecord } from "../LockedRecord/index.js";
4
4
  import { OverlayLoader } from "@webiny/admin-ui";
5
- export const ContentEntryGuard = props => {
6
- const {
7
- loading,
8
- entry,
9
- model,
10
- children
11
- } = props;
12
- const {
13
- fetchLockedEntryLockRecord
14
- } = useRecordLocking();
15
- const [locked, setLocked] = useState(undefined);
16
- useEffect(() => {
17
- if (!entry.id || loading || locked !== undefined) {
18
- return;
19
- }
20
- (async () => {
21
- const result = await fetchLockedEntryLockRecord({
22
- id: entry.id,
23
- $lockingType: model.modelId
24
- });
25
- setLocked(result);
26
- })();
27
- }, [entry.id, loading]);
28
- if (locked === undefined) {
29
- return /*#__PURE__*/React.createElement("div", {
30
- className: "h-screen w-screen fixed top-0 left-0 z-20"
31
- }, /*#__PURE__*/React.createElement(OverlayLoader, {
32
- text: "Checking record status..."
5
+ const ContentEntryGuard = (props)=>{
6
+ const { loading, entry, model, children } = props;
7
+ const { fetchLockedEntryLockRecord } = useRecordLocking();
8
+ const [locked, setLocked] = useState(void 0);
9
+ useEffect(()=>{
10
+ if (!entry.id || loading || void 0 !== locked) return;
11
+ (async ()=>{
12
+ const result = await fetchLockedEntryLockRecord({
13
+ id: entry.id,
14
+ $lockingType: model.modelId
15
+ });
16
+ setLocked(result);
17
+ })();
18
+ }, [
19
+ entry.id,
20
+ loading
21
+ ]);
22
+ if (void 0 === locked) return /*#__PURE__*/ react.createElement("div", {
23
+ className: "h-screen w-screen fixed top-0 left-0 z-20"
24
+ }, /*#__PURE__*/ react.createElement(OverlayLoader, {
25
+ text: "Checking record status..."
33
26
  }));
34
- } else if (locked) {
35
- return /*#__PURE__*/React.createElement(LockedRecord, {
36
- record: locked
27
+ if (locked) return /*#__PURE__*/ react.createElement(LockedRecord, {
28
+ record: locked
37
29
  });
38
- }
39
- return children;
30
+ return children;
40
31
  };
32
+ export { ContentEntryGuard };
41
33
 
42
34
  //# sourceMappingURL=ContentEntryGuard.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useState","useRecordLocking","LockedRecord","OverlayLoader","ContentEntryGuard","props","loading","entry","model","children","fetchLockedEntryLockRecord","locked","setLocked","undefined","id","result","$lockingType","modelId","createElement","className","text","record"],"sources":["ContentEntryGuard.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { useRecordLocking } from \"~/hooks/index.js\";\nimport { LockedRecord } from \"../LockedRecord/index.js\";\nimport type { IRecordLockingLockRecord } from \"~/types.js\";\nimport type { CmsContentEntry, CmsModel } from \"@webiny/app-headless-cms/types.js\";\nimport { OverlayLoader } from \"@webiny/admin-ui\";\n\nexport interface IContentEntryGuardProps {\n loading: boolean;\n entry: CmsContentEntry;\n model: CmsModel;\n children: React.ReactElement;\n}\n\nexport const ContentEntryGuard = (props: IContentEntryGuardProps) => {\n const { loading, entry, model, children } = props;\n const { fetchLockedEntryLockRecord } = useRecordLocking();\n\n const [locked, setLocked] = useState<IRecordLockingLockRecord | null | undefined>(undefined);\n\n useEffect(() => {\n if (!entry.id || loading || locked !== undefined) {\n return;\n }\n (async () => {\n const result = await fetchLockedEntryLockRecord({\n id: entry.id,\n $lockingType: model.modelId\n });\n setLocked(result);\n })();\n }, [entry.id, loading]);\n\n if (locked === undefined) {\n return (\n <div className={\"h-screen w-screen fixed top-0 left-0 z-20\"}>\n <OverlayLoader text={\"Checking record status...\"} />\n </div>\n );\n } else if (locked) {\n return <LockedRecord record={locked} />;\n }\n\n return children;\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAClD,SAASC,gBAAgB;AACzB,SAASC,YAAY;AAGrB,SAASC,aAAa,QAAQ,kBAAkB;AAShD,OAAO,MAAMC,iBAAiB,GAAIC,KAA8B,IAAK;EACjE,MAAM;IAAEC,OAAO;IAAEC,KAAK;IAAEC,KAAK;IAAEC;EAAS,CAAC,GAAGJ,KAAK;EACjD,MAAM;IAAEK;EAA2B,CAAC,GAAGT,gBAAgB,CAAC,CAAC;EAEzD,MAAM,CAACU,MAAM,EAAEC,SAAS,CAAC,GAAGZ,QAAQ,CAA8Ca,SAAS,CAAC;EAE5Fd,SAAS,CAAC,MAAM;IACZ,IAAI,CAACQ,KAAK,CAACO,EAAE,IAAIR,OAAO,IAAIK,MAAM,KAAKE,SAAS,EAAE;MAC9C;IACJ;IACA,CAAC,YAAY;MACT,MAAME,MAAM,GAAG,MAAML,0BAA0B,CAAC;QAC5CI,EAAE,EAAEP,KAAK,CAACO,EAAE;QACZE,YAAY,EAAER,KAAK,CAACS;MACxB,CAAC,CAAC;MACFL,SAAS,CAACG,MAAM,CAAC;IACrB,CAAC,EAAE,CAAC;EACR,CAAC,EAAE,CAACR,KAAK,CAACO,EAAE,EAAER,OAAO,CAAC,CAAC;EAEvB,IAAIK,MAAM,KAAKE,SAAS,EAAE;IACtB,oBACIf,KAAA,CAAAoB,aAAA;MAAKC,SAAS,EAAE;IAA4C,gBACxDrB,KAAA,CAAAoB,aAAA,CAACf,aAAa;MAACiB,IAAI,EAAE;IAA4B,CAAE,CAClD,CAAC;EAEd,CAAC,MAAM,IAAIT,MAAM,EAAE;IACf,oBAAOb,KAAA,CAAAoB,aAAA,CAAChB,YAAY;MAACmB,MAAM,EAAEV;IAAO,CAAE,CAAC;EAC3C;EAEA,OAAOF,QAAQ;AACnB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"components/HeadlessCmsContentEntry/ContentEntryGuard.js","sources":["../../../src/components/HeadlessCmsContentEntry/ContentEntryGuard.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { useRecordLocking } from \"~/hooks/index.js\";\nimport { LockedRecord } from \"../LockedRecord/index.js\";\nimport type { IRecordLockingLockRecord } from \"~/types.js\";\nimport type { CmsContentEntry, CmsModel } from \"@webiny/app-headless-cms/types.js\";\nimport { OverlayLoader } from \"@webiny/admin-ui\";\n\nexport interface IContentEntryGuardProps {\n loading: boolean;\n entry: CmsContentEntry;\n model: CmsModel;\n children: React.ReactElement;\n}\n\nexport const ContentEntryGuard = (props: IContentEntryGuardProps) => {\n const { loading, entry, model, children } = props;\n const { fetchLockedEntryLockRecord } = useRecordLocking();\n\n const [locked, setLocked] = useState<IRecordLockingLockRecord | null | undefined>(undefined);\n\n useEffect(() => {\n if (!entry.id || loading || locked !== undefined) {\n return;\n }\n (async () => {\n const result = await fetchLockedEntryLockRecord({\n id: entry.id,\n $lockingType: model.modelId\n });\n setLocked(result);\n })();\n }, [entry.id, loading]);\n\n if (locked === undefined) {\n return (\n <div className={\"h-screen w-screen fixed top-0 left-0 z-20\"}>\n <OverlayLoader text={\"Checking record status...\"} />\n </div>\n );\n } else if (locked) {\n return <LockedRecord record={locked} />;\n }\n\n return children;\n};\n"],"names":["ContentEntryGuard","props","loading","entry","model","children","fetchLockedEntryLockRecord","useRecordLocking","locked","setLocked","useState","undefined","useEffect","result","OverlayLoader","LockedRecord"],"mappings":";;;;AAcO,MAAMA,oBAAoB,CAACC;IAC9B,MAAM,EAAEC,OAAO,EAAEC,KAAK,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGJ;IAC5C,MAAM,EAAEK,0BAA0B,EAAE,GAAGC;IAEvC,MAAM,CAACC,QAAQC,UAAU,GAAGC,SAAsDC;IAElFC,UAAU;QACN,IAAI,CAACT,MAAM,EAAE,IAAID,WAAWM,AAAWG,WAAXH,QACxB;QAEH;YACG,MAAMK,SAAS,MAAMP,2BAA2B;gBAC5C,IAAIH,MAAM,EAAE;gBACZ,cAAcC,MAAM,OAAO;YAC/B;YACAK,UAAUI;QACd;IACJ,GAAG;QAACV,MAAM,EAAE;QAAED;KAAQ;IAEtB,IAAIM,AAAWG,WAAXH,QACA,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAACM,eAAaA;QAAC,MAAM;;IAG1B,IAAIN,QACP,OAAO,WAAP,GAAO,oBAACO,cAAYA;QAAC,QAAQP;;IAGjC,OAAOH;AACX"}
@@ -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 {
@@ -1,99 +1,80 @@
1
- import React, { useEffect, useRef } from "react";
1
+ import react, { useEffect, useRef } from "react";
2
2
  import { useRecordLocking } from "../../hooks/index.js";
3
3
  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
- export const ContentEntryLocker = ({
8
- onEntryUnlocked,
9
- onDisablePrompt,
10
- entry,
11
- model,
12
- children
13
- }) => {
14
- const {
15
- updateEntryLock,
16
- removeEntryLock
17
- } = useRecordLocking();
18
- const websockets = useWebsockets();
19
- const {
20
- showDialog
21
- } = useDialogs();
22
- const entryLockerTimeout = useRef(null);
23
- useEffect(() => {
24
- if (!entry.id) {
25
- return;
26
- }
27
- const {
28
- id: entryId
29
- } = parseIdentifier(entry.id);
30
- let onMessageSub = websockets.onMessage(`recordLocking.entry.kickOut.${entryId}`, async incoming => {
31
- const {
32
- user
33
- } = incoming.data;
34
- onDisablePrompt(true);
35
- removeEntryLock({
36
- id: entryId,
37
- $lockingType: model.modelId
38
- });
39
- showDialog({
40
- title: "Entry was forcefully unlocked!",
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."),
42
- acceptLabel: "Ok",
43
- onClose: undefined,
44
- cancelLabel: null
45
- });
46
- onEntryUnlocked();
47
- });
48
- return () => {
49
- onMessageSub.off();
50
- /**
51
- * Lets null subscriptions, just in case it...
52
- */
53
- // @ts-expect-error
54
- onMessageSub = null;
55
- };
56
- }, [entry.id, onEntryUnlocked, model.modelId]);
57
- useEffect(() => {
58
- if (!entry.id) {
59
- return;
60
- }
61
- if (entryLockerTimeout.current) {
62
- return;
63
- }
64
- const updateLock = async () => {
65
- const result = await updateEntryLock({
66
- id: entry.id,
67
- $lockingType: model.modelId
68
- });
69
- if (result.error) {
70
- showDialog({
71
- title: "There was an error while updating the entry lock.",
72
- content: result.error.message,
73
- acceptLabel: "Ok",
74
- onClose: undefined,
75
- cancelLabel: null
7
+ const ContentEntryLocker = ({ onEntryUnlocked, onDisablePrompt, entry, model, children })=>{
8
+ const { updateEntryLock, removeEntryLock } = useRecordLocking();
9
+ const websockets = useWebsockets();
10
+ const { showDialog } = useDialogs();
11
+ const entryLockerTimeout = useRef(null);
12
+ useEffect(()=>{
13
+ if (!entry.id) return;
14
+ const { id: entryId } = parseIdentifier(entry.id);
15
+ let onMessageSub = websockets.onMessage(`recordLocking.entry.kickOut.${entryId}`, async (incoming)=>{
16
+ const { user } = incoming.data;
17
+ onDisablePrompt();
18
+ removeEntryLock({
19
+ id: entryId,
20
+ $lockingType: model.modelId
21
+ });
22
+ showDialog({
23
+ title: "Entry was forcefully unlocked!",
24
+ 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."),
25
+ acceptLabel: "Ok",
26
+ onClose: void 0,
27
+ cancelLabel: null
28
+ });
29
+ onEntryUnlocked();
76
30
  });
77
- onEntryUnlocked();
78
- return;
79
- }
80
- createTimeout();
81
- };
82
- const createTimeout = () => {
83
- entryLockerTimeout.current = window.setTimeout(() => {
31
+ return ()=>{
32
+ onMessageSub.off();
33
+ onMessageSub = null;
34
+ };
35
+ }, [
36
+ entry.id,
37
+ onEntryUnlocked,
38
+ model.modelId
39
+ ]);
40
+ useEffect(()=>{
41
+ if (!entry.id) return;
42
+ if (entryLockerTimeout.current) return;
43
+ const updateLock = async ()=>{
44
+ const result = await updateEntryLock({
45
+ id: entry.id,
46
+ $lockingType: model.modelId
47
+ });
48
+ if (result.error) {
49
+ showDialog({
50
+ title: "There was an error while updating the entry lock.",
51
+ content: result.error.message,
52
+ acceptLabel: "Ok",
53
+ onClose: void 0,
54
+ cancelLabel: null
55
+ });
56
+ onEntryUnlocked();
57
+ return;
58
+ }
59
+ createTimeout();
60
+ };
61
+ const createTimeout = ()=>{
62
+ entryLockerTimeout.current = window.setTimeout(()=>{
63
+ updateLock();
64
+ }, 1000 * autoUpdateTimeout);
65
+ };
84
66
  updateLock();
85
- }, autoUpdateTimeout * 1000);
86
- };
87
- updateLock();
88
- return () => {
89
- if (!entryLockerTimeout.current) {
90
- return;
91
- }
92
- clearTimeout(entryLockerTimeout.current);
93
- entryLockerTimeout.current = null;
94
- };
95
- }, [entry.id, onEntryUnlocked]);
96
- return /*#__PURE__*/React.createElement(React.Fragment, null, children);
67
+ return ()=>{
68
+ if (!entryLockerTimeout.current) return;
69
+ clearTimeout(entryLockerTimeout.current);
70
+ entryLockerTimeout.current = null;
71
+ };
72
+ }, [
73
+ entry.id,
74
+ onEntryUnlocked
75
+ ]);
76
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, children);
97
77
  };
78
+ export { ContentEntryLocker };
98
79
 
99
80
  //# sourceMappingURL=ContentEntryLocker.js.map
@@ -1 +1 @@
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: (flag: boolean) => 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(true);\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
+ {"version":3,"file":"components/HeadlessCmsContentEntry/ContentEntryLocker.js","sources":["../../../src/components/HeadlessCmsContentEntry/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"],"names":["autoUpdateTimeout","ContentEntryLocker","onEntryUnlocked","onDisablePrompt","entry","model","children","updateEntryLock","removeEntryLock","useRecordLocking","websockets","useWebsockets","showDialog","useDialogs","entryLockerTimeout","useRef","useEffect","entryId","parseIdentifier","onMessageSub","incoming","user","undefined","updateLock","result","createTimeout","window","clearTimeout"],"mappings":";;;;;AASA,MAAMA,oBAAoB;AAiBnB,MAAMC,qBAAqB,CAAC,EAC/BC,eAAe,EACfC,eAAe,EACfC,KAAK,EACLC,KAAK,EACLC,QAAQ,EACe;IACvB,MAAM,EAAEC,eAAe,EAAEC,eAAe,EAAE,GAAGC;IAC7C,MAAMC,aAAaC;IACnB,MAAM,EAAEC,UAAU,EAAE,GAAGC;IAEvB,MAAMC,qBAAqBC,OAAsB;IAEjDC,UAAU;QACN,IAAI,CAACZ,MAAM,EAAE,EACT;QAEJ,MAAM,EAAE,IAAIa,OAAO,EAAE,GAAGC,gBAAgBd,MAAM,EAAE;QAEhD,IAAIe,eAAeT,WAAW,SAAS,CACnC,CAAC,4BAA4B,EAAEO,SAAS,EACxC,OAAMG;YACF,MAAM,EAAEC,IAAI,EAAE,GAAGD,SAAS,IAAI;YAC9BjB;YACAK,gBAAgB;gBACZ,IAAIS;gBACJ,cAAcZ,MAAM,OAAO;YAC/B;YACAO,WAAW;gBACP,OAAO;gBACP,SAAS,WAAT,GACI,0CAAE,yDACwD,mBACtD,oBAAC,gBAAQS,KAAK,WAAW,IAAI,iBAAwB;gBAI7D,aAAa;gBACb,SAASC;gBACT,aAAa;YACjB;YACApB;QACJ;QAGJ,OAAO;YACHiB,aAAa,GAAG;YAKhBA,eAAe;QACnB;IACJ,GAAG;QAACf,MAAM,EAAE;QAAEF;QAAiBG,MAAM,OAAO;KAAC;IAE7CW,UAAU;QACN,IAAI,CAACZ,MAAM,EAAE,EACT;QAGJ,IAAIU,mBAAmB,OAAO,EAC1B;QAGJ,MAAMS,aAAa;YACf,MAAMC,SAAS,MAAMjB,gBAAgB;gBACjC,IAAIH,MAAM,EAAE;gBACZ,cAAcC,MAAM,OAAO;YAC/B;YACA,IAAImB,OAAO,KAAK,EAAE;gBACdZ,WAAW;oBACP,OAAO;oBACP,SAASY,OAAO,KAAK,CAAC,OAAO;oBAC7B,aAAa;oBACb,SAASF;oBACT,aAAa;gBACjB;gBACApB;gBACA;YACJ;YACAuB;QACJ;QAEA,MAAMA,gBAAgB;YAClBX,mBAAmB,OAAO,GAAGY,OAAO,UAAU,CAAC;gBAC3CH;YACJ,GAAGvB,AAAoB,OAApBA;QACP;QAEAuB;QACA,OAAO;YACH,IAAI,CAACT,mBAAmB,OAAO,EAC3B;YAEJa,aAAab,mBAAmB,OAAO;YACvCA,mBAAmB,OAAO,GAAG;QACjC;IACJ,GAAG;QAACV,MAAM,EAAE;QAAEF;KAAgB;IAE9B,OAAO,WAAP,GAAO,0CAAGI;AACd"}
@@ -1,89 +1,44 @@
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";
6
- const {
7
- ContentEntry,
8
- SingletonContentEntry
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
6
+ const { ContentEntry: ContentEntry, SingletonContentEntry: SingletonContentEntry } = ContentEntryEditorConfig;
7
+ const ContentEntryDecorator = ContentEntry.createDecorator((Original)=>function() {
8
+ const router = useRouter();
9
+ const { entry, contentModel, loading } = ContentEntry.useContentEntry();
10
+ const { navigateTo } = ContentEntryListConfig.ContentEntries.useContentEntriesList();
11
+ if (!entry?.id) return /*#__PURE__*/ react.createElement(Original, null);
12
+ const props = {
13
+ entry,
14
+ model: contentModel
15
+ };
16
+ return /*#__PURE__*/ react.createElement(ContentEntryGuard, {
17
+ ...props,
18
+ loading: loading
19
+ }, /*#__PURE__*/ react.createElement(ContentEntryLocker, {
20
+ ...props,
21
+ onDisablePrompt: ()=>router.unblockTransition(),
22
+ onEntryUnlocked: navigateTo
23
+ }, /*#__PURE__*/ react.createElement(Original, null)));
20
24
  });
21
- };
22
- });
23
- const ContentEntryDecorator = ContentEntry.createDecorator(Original => {
24
- return function RecordLockingContentEntry() {
25
- const [disablePrompt, setDisablePrompt] = useState(false);
26
- const {
27
- entry,
28
- contentModel,
29
- loading
30
- } = ContentEntry.useContentEntry();
31
- const {
32
- navigateTo
33
- } = ContentEntryListConfig.ContentEntries.useContentEntriesList();
34
- /**
35
- * New entry does not have ID yet.
36
- */
37
- if (!entry?.id) {
38
- return /*#__PURE__*/React.createElement(DisablePrompt.Provider, {
39
- disablePrompt: disablePrompt
40
- }, /*#__PURE__*/React.createElement(Original, null));
41
- }
42
- /**
43
- * Continue with existing entry.
44
- */
45
- const props = {
46
- entry,
47
- model: contentModel
48
- };
49
- return /*#__PURE__*/React.createElement(ContentEntryGuard, Object.assign({}, props, {
50
- loading: loading
51
- }), /*#__PURE__*/React.createElement(ContentEntryLocker, Object.assign({}, props, {
52
- onDisablePrompt: flag => setDisablePrompt(flag),
53
- onEntryUnlocked: navigateTo
54
- }), /*#__PURE__*/React.createElement(DisablePrompt.Provider, {
55
- disablePrompt: disablePrompt
56
- }, /*#__PURE__*/React.createElement(Original, null))));
57
- };
58
- });
59
- const SingletonContentEntryDecorator = SingletonContentEntry.createDecorator(Original => {
60
- return function RecordLockingSingletonContentEntry() {
61
- const [disablePrompt, setDisablePrompt] = useState(false);
62
- const {
63
- entry,
64
- contentModel,
65
- loading
66
- } = SingletonContentEntry.useSingletonContentEntry();
67
- const props = {
68
- entry,
69
- model: contentModel
70
- };
71
- return /*#__PURE__*/React.createElement(ContentEntryGuard, Object.assign({}, props, {
72
- loading: loading
73
- }), /*#__PURE__*/React.createElement(ContentEntryLocker, Object.assign({}, props, {
74
- onDisablePrompt: flag => setDisablePrompt(flag),
75
- onEntryUnlocked: () => {
76
- // There's nowhere to go, since singleton entry doesn't have a list view.
77
- }
78
- }), /*#__PURE__*/React.createElement(DisablePrompt.Provider, {
79
- disablePrompt: disablePrompt
80
- }, /*#__PURE__*/React.createElement(Original, null))));
81
- };
82
- });
83
- 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)));
87
- };
25
+ const SingletonContentEntryDecorator = SingletonContentEntry.createDecorator((Original)=>function() {
26
+ const router = useRouter();
27
+ const { entry, contentModel, loading } = SingletonContentEntry.useSingletonContentEntry();
28
+ const props = {
29
+ entry,
30
+ model: contentModel
31
+ };
32
+ return /*#__PURE__*/ react.createElement(ContentEntryGuard, {
33
+ ...props,
34
+ loading: loading
35
+ }, /*#__PURE__*/ react.createElement(ContentEntryLocker, {
36
+ ...props,
37
+ onDisablePrompt: ()=>router.unblockTransition(),
38
+ onEntryUnlocked: ()=>{}
39
+ }, /*#__PURE__*/ react.createElement(Original, null)));
40
+ });
41
+ const HeadlessCmsContentEntry = ()=>/*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(ContentEntryDecorator, null), /*#__PURE__*/ react.createElement(SingletonContentEntryDecorator, null));
42
+ export { HeadlessCmsContentEntry };
88
43
 
89
44
  //# 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,"file":"components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js","sources":["../../../src/components/HeadlessCmsContentEntry/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"],"names":["ContentEntry","SingletonContentEntry","ContentEntryEditorConfig","ContentEntryDecorator","Original","router","useRouter","entry","contentModel","loading","navigateTo","ContentEntryListConfig","props","ContentEntryGuard","ContentEntryLocker","SingletonContentEntryDecorator","HeadlessCmsContentEntry"],"mappings":";;;;;AAMA,MAAM,EAAEA,cAAAA,YAAY,EAAEC,uBAAAA,qBAAqB,EAAE,GAAGC;AAEhD,MAAMC,wBAAwBH,aAAa,eAAe,CAACI,CAAAA,WAChD;QACH,MAAMC,SAASC;QACf,MAAM,EAAEC,KAAK,EAAEC,YAAY,EAAEC,OAAO,EAAE,GAAGT,aAAa,eAAe;QACrE,MAAM,EAAEU,UAAU,EAAE,GAAGC,uBAAuB,cAAc,CAAC,qBAAqB;QAIlF,IAAI,CAACJ,OAAO,IACR,OAAO,WAAP,GAAO,oBAACH,UAAAA;QAKZ,MAAMQ,QAAQ;YAAEL;YAAO,OAAOC;QAAa;QAE3C,OAAO,WAAP,GACI,oBAACK,mBAAiBA;YAAE,GAAGD,KAAK;YAAE,SAASH;yBACnC,oBAACK,oBAAkBA;YACd,GAAGF,KAAK;YACT,iBAAiB,IAAMP,OAAO,iBAAiB;YAC/C,iBAAiBK;yBAEjB,oBAACN,UAAAA;IAIjB;AAGJ,MAAMW,iCAAiCd,sBAAsB,eAAe,CAACG,CAAAA,WAClE;QACH,MAAMC,SAASC;QACf,MAAM,EAAEC,KAAK,EAAEC,YAAY,EAAEC,OAAO,EAAE,GAAGR,sBAAsB,wBAAwB;QAEvF,MAAMW,QAAQ;YAAEL;YAAO,OAAOC;QAAa;QAE3C,OAAO,WAAP,GACI,oBAACK,mBAAiBA;YAAE,GAAGD,KAAK;YAAE,SAASH;yBACnC,oBAACK,oBAAkBA;YACd,GAAGF,KAAK;YACT,iBAAiB,IAAMP,OAAO,iBAAiB;YAC/C,iBAAiB,KAEjB;yBAEA,oBAACD,UAAAA;IAIjB;AAGG,MAAMY,0BAA0B,IAC5B,WAAP,GACI,wDACI,oBAACb,uBAAqBA,OAAAA,WAAAA,GACtB,oBAACY,gCAA8BA"}
@@ -1,3 +1 @@
1
1
  export * from "./HeadlessCmsContentEntry.js";
2
-
3
- //# sourceMappingURL=index.js.map