@webiny/app-record-locking 5.43.2 → 6.0.0-alpha.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.
- package/components/HeadlessCmsActionsAcoCell.js +46 -57
- package/components/HeadlessCmsActionsAcoCell.js.map +1 -1
- package/components/HeadlessCmsContentEntry/ContentEntryGuard.js +22 -29
- package/components/HeadlessCmsContentEntry/ContentEntryGuard.js.map +1 -1
- package/components/HeadlessCmsContentEntry/ContentEntryLocker.js +43 -60
- package/components/HeadlessCmsContentEntry/ContentEntryLocker.js.map +1 -1
- package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js +54 -67
- package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js.map +1 -1
- package/components/HeadlessCmsContentEntry/index.js +1 -16
- package/components/HeadlessCmsContentEntry/index.js.map +1 -1
- package/components/LockedRecord/LockedRecord.js +49 -144
- package/components/LockedRecord/LockedRecord.js.map +1 -1
- package/components/LockedRecord/LockedRecordForceUnlock.js +51 -93
- package/components/LockedRecord/LockedRecordForceUnlock.js.map +1 -1
- package/components/LockedRecord/index.js +1 -16
- package/components/LockedRecord/index.js.map +1 -1
- package/components/RecordLockingProvider.js +47 -67
- package/components/RecordLockingProvider.js.map +1 -1
- package/components/decorators/UseContentEntriesListHookDecorator.js +10 -17
- package/components/decorators/UseContentEntriesListHookDecorator.js.map +1 -1
- package/components/decorators/UseRecordsDecorator.js +11 -16
- package/components/decorators/UseRecordsDecorator.js.map +1 -1
- package/components/decorators/UseSaveEntryDecorator.js +34 -32
- package/components/decorators/UseSaveEntryDecorator.js.map +1 -1
- package/components/permissionRenderer/RecordLockingPermissions.js +39 -53
- package/components/permissionRenderer/RecordLockingPermissions.js.map +1 -1
- package/components/permissionRenderer/index.js +13 -17
- package/components/permissionRenderer/index.js.map +1 -1
- package/domain/RecordLocking.js +271 -311
- package/domain/RecordLocking.js.map +1 -1
- package/domain/RecordLockingClient.js +15 -29
- package/domain/RecordLockingClient.js.map +1 -1
- package/domain/RecordLockingGetLockRecord.js +16 -29
- package/domain/RecordLockingGetLockRecord.js.map +1 -1
- package/domain/RecordLockingGetLockedEntryLockRecord.js +14 -27
- package/domain/RecordLockingGetLockedEntryLockRecord.js.map +1 -1
- package/domain/RecordLockingIsEntryLocked.js +14 -27
- package/domain/RecordLockingIsEntryLocked.js.map +1 -1
- package/domain/RecordLockingListLockRecords.js +26 -37
- package/domain/RecordLockingListLockRecords.js.map +1 -1
- package/domain/RecordLockingLockEntry.js +9 -22
- package/domain/RecordLockingLockEntry.js.map +1 -1
- package/domain/RecordLockingUnlockEntry.js +14 -27
- package/domain/RecordLockingUnlockEntry.js.map +1 -1
- package/domain/RecordLockingUpdateEntryLock.js +14 -27
- package/domain/RecordLockingUpdateEntryLock.js.map +1 -1
- package/domain/abstractions/IRecordLocking.js +1 -5
- package/domain/abstractions/IRecordLockingClient.js +1 -5
- package/domain/abstractions/IRecordLockingGetLockRecord.js +1 -5
- package/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.js +1 -5
- package/domain/abstractions/IRecordLockingIsEntryLocked.js +1 -5
- package/domain/abstractions/IRecordLockingListLockRecords.js +1 -5
- package/domain/abstractions/IRecordLockingLockEntry.js +1 -5
- package/domain/abstractions/IRecordLockingUnlockEntry.js +1 -5
- package/domain/abstractions/IRecordLockingUpdateEntryLock.js +1 -5
- package/domain/graphql/fields.js +28 -8
- package/domain/graphql/fields.js.map +1 -1
- package/domain/graphql/getLockRecord.js +16 -12
- package/domain/graphql/getLockRecord.js.map +1 -1
- package/domain/graphql/getLockedEntryLockRecord.js +16 -12
- package/domain/graphql/getLockedEntryLockRecord.js.map +1 -1
- package/domain/graphql/isEntryLocked.js +14 -12
- package/domain/graphql/isEntryLocked.js.map +1 -1
- package/domain/graphql/listLockRecords.js +23 -14
- package/domain/graphql/listLockRecords.js.map +1 -1
- package/domain/graphql/lockEntry.js +17 -13
- package/domain/graphql/lockEntry.js.map +1 -1
- package/domain/graphql/unlockEntry.js +16 -12
- package/domain/graphql/unlockEntry.js.map +1 -1
- package/domain/graphql/updateEntryLock.js +16 -12
- package/domain/graphql/updateEntryLock.js.map +1 -1
- package/domain/utils/createRecordLockingClient.js +6 -12
- package/domain/utils/createRecordLockingClient.js.map +1 -1
- package/domain/utils/createRecordLockingError.js +1 -7
- package/domain/utils/createRecordLockingError.js.map +1 -1
- package/hooks/index.js +2 -27
- package/hooks/index.js.map +1 -1
- package/hooks/usePermission.js +11 -16
- package/hooks/usePermission.js.map +1 -1
- package/hooks/useRecordLocking.js +6 -12
- package/hooks/useRecordLocking.js.map +1 -1
- package/index.js +20 -50
- package/index.js.map +1 -1
- package/package.json +17 -18
- package/types.js +1 -5
- package/utils/createCacheKey.js +5 -11
- package/utils/createCacheKey.js.map +1 -1
- package/components/assets/lock.svg +0 -13
|
@@ -1,71 +1,60 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkhlYWRsZXNzQ21zQWN0aW9uc0Fjb0NlbGwudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVrQyIsImZpbGUiOiJIZWFkbGVzc0Ntc0FjdGlvbnNBY29DZWxsLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IENvbnRlbnRFbnRyeUxpc3RDb25maWcsIHVzZU1vZGVsIH0gZnJvbSBcIkB3ZWJpbnkvYXBwLWhlYWRsZXNzLWNtc1wiO1xuaW1wb3J0IHsgUmVhY3RDb21wb25lbnQgYXMgTG9ja2VkSWNvbiB9IGZyb20gXCJAbWF0ZXJpYWwtZGVzaWduLWljb25zL3N2Zy9yb3VuZC9sb2NrLnN2Z1wiO1xuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gXCJAd2ViaW55L3VpL1Rvb2x0aXBcIjtcbmltcG9ydCB7IHVzZVJlY29yZExvY2tpbmcgfSBmcm9tIFwifi9ob29rc1wiO1xuaW1wb3J0IHsgVXNlQ29udGVudEVudHJpZXNMaXN0SG9va0RlY29yYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnMvVXNlQ29udGVudEVudHJpZXNMaXN0SG9va0RlY29yYXRvclwiO1xuaW1wb3J0IHN0eWxlZCBmcm9tIFwiQGVtb3Rpb24vc3R5bGVkXCI7XG5pbXBvcnQgeyBVc2VTYXZlRW50cnlEZWNvcmF0b3IgfSBmcm9tIFwifi9jb21wb25lbnRzL2RlY29yYXRvcnMvVXNlU2F2ZUVudHJ5RGVjb3JhdG9yXCI7XG5pbXBvcnQgeyBVc2VSZWNvcmRzRGVjb3JhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy9Vc2VSZWNvcmRzRGVjb3JhdG9yXCI7XG5cbmNvbnN0IENlbnRlckFsaWdubWVudCA9IHN0eWxlZC5kaXZgXG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgc3ZnIHtcbiAgICAgICAgZmlsbDogdmFyKC0tbWRjLXRoZW1lLXRleHQtc2Vjb25kYXJ5LW9uLWJhY2tncm91bmQpO1xuICAgIH1cbmA7XG5cbmNvbnN0IHsgQnJvd3NlciB9ID0gQ29udGVudEVudHJ5TGlzdENvbmZpZztcblxuaW50ZXJmYWNlIEFjdGlvbnNDZWxsUHJvcHMge1xuICAgIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbmNvbnN0IEFjdGlvbnNDZWxsID0gKHsgY2hpbGRyZW4gfTogQWN0aW9uc0NlbGxQcm9wcykgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwgfSA9IHVzZU1vZGVsKCk7XG4gICAgY29uc3QgeyBnZXRMb2NrUmVjb3JkRW50cnksIGlzUmVjb3JkTG9ja2VkIH0gPSB1c2VSZWNvcmRMb2NraW5nKCk7XG5cbiAgICBjb25zdCB7IHVzZVRhYmxlUm93LCBpc0ZvbGRlclJvdyB9ID0gQnJvd3Nlci5UYWJsZS5Db2x1bW47XG4gICAgY29uc3QgeyByb3cgfSA9IHVzZVRhYmxlUm93KCk7XG5cbiAgICBpZiAoaXNGb2xkZXJSb3cocm93KSkge1xuICAgICAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5ID0gZ2V0TG9ja1JlY29yZEVudHJ5KHJvdy5pZCk7XG5cbiAgICBpZiAoIWlzUmVjb3JkTG9ja2VkKGVudHJ5KSB8fCAhZW50cnk/LiRsb2NrZWQpIHtcbiAgICAgICAgcmV0dXJuIDw+e2NoaWxkcmVufTwvPjtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgICAgPENlbnRlckFsaWdubWVudD5cbiAgICAgICAgICAgIDxUb29sdGlwXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PXtcImxlZnRcIn1cbiAgICAgICAgICAgICAgICBjb250ZW50PXtgVGhpcyAke21vZGVsLm5hbWV9IGlzIGN1cnJlbnRseSBsb2NrZWQgYnkgJHtlbnRyeS4kbG9ja2VkLmxvY2tlZEJ5LmRpc3BsYXlOYW1lfS5gfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxMb2NrZWRJY29uIC8+XG4gICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgIDwvQ2VudGVyQWxpZ25tZW50PlxuICAgICk7XG59O1xuXG5jb25zdCBSZWNvcmRMb2NraW5nQ2VsbEFjdGlvbnMgPSBCcm93c2VyLlRhYmxlLkNvbHVtbi5jcmVhdGVEZWNvcmF0b3IoT3JpZ2luYWwgPT4ge1xuICAgIHJldHVybiBmdW5jdGlvbiBSZWNvcmRMb2NraW5nQ2VsbEFjdGlvbnMocHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3BzLm5hbWUgPT09IFwiYWN0aW9uc1wiICYmIHByb3BzLmNlbGwpIHtcbiAgICAgICAgICAgIHJldHVybiA8T3JpZ2luYWwgey4uLnByb3BzfSBjZWxsPXs8QWN0aW9uc0NlbGw+e3Byb3BzLmNlbGx9PC9BY3Rpb25zQ2VsbD59IC8+O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDxPcmlnaW5hbCB7Li4ucHJvcHN9IC8+O1xuICAgIH07XG59KTtcblxuZXhwb3J0IGNvbnN0IEhlYWRsZXNzQ21zQWN0aW9uc0Fjb0NlbGwgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICAgIDxVc2VDb250ZW50RW50cmllc0xpc3RIb29rRGVjb3JhdG9yIC8+XG4gICAgICAgICAgICA8VXNlU2F2ZUVudHJ5RGVjb3JhdG9yIC8+XG4gICAgICAgICAgICA8UmVjb3JkTG9ja2luZ0NlbGxBY3Rpb25zIC8+XG4gICAgICAgICAgICA8VXNlUmVjb3Jkc0RlY29yYXRvciAvPlxuICAgICAgICA8Lz5cbiAgICApO1xufTtcbiJdfQ== */",
|
|
30
|
-
toString: _EMOTION_STRINGIFIED_CSS_ERROR__
|
|
31
|
-
});
|
|
32
|
-
var Browser = _appHeadlessCms.ContentEntryListConfig.Browser;
|
|
33
|
-
var ActionsCell = function ActionsCell(_ref) {
|
|
34
|
-
var children = _ref.children;
|
|
35
|
-
var _useModel = (0, _appHeadlessCms.useModel)(),
|
|
36
|
-
model = _useModel.model;
|
|
37
|
-
var _useRecordLocking = (0, _hooks.useRecordLocking)(),
|
|
38
|
-
getLockRecordEntry = _useRecordLocking.getLockRecordEntry,
|
|
39
|
-
isRecordLocked = _useRecordLocking.isRecordLocked;
|
|
40
|
-
var _Browser$Table$Column = Browser.Table.Column,
|
|
41
|
-
useTableRow = _Browser$Table$Column.useTableRow,
|
|
42
|
-
isFolderRow = _Browser$Table$Column.isFolderRow;
|
|
43
|
-
var _useTableRow = useTableRow(),
|
|
44
|
-
row = _useTableRow.row;
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ContentEntryListConfig, useModel } from "@webiny/app-headless-cms";
|
|
3
|
+
import { ReactComponent as LockedIcon } from "@webiny/icons/lock.svg";
|
|
4
|
+
import { useRecordLocking } from "../hooks";
|
|
5
|
+
import { UseContentEntriesListHookDecorator } from "./decorators/UseContentEntriesListHookDecorator";
|
|
6
|
+
import { UseSaveEntryDecorator } from "./decorators/UseSaveEntryDecorator";
|
|
7
|
+
import { UseRecordsDecorator } from "./decorators/UseRecordsDecorator";
|
|
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();
|
|
45
29
|
if (isFolderRow(row)) {
|
|
46
|
-
return /*#__PURE__*/
|
|
30
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, children);
|
|
47
31
|
}
|
|
48
|
-
|
|
32
|
+
const entry = getLockRecordEntry(row.id);
|
|
49
33
|
if (!isRecordLocked(entry) || !entry?.$locked) {
|
|
50
|
-
return /*#__PURE__*/
|
|
34
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, children);
|
|
51
35
|
}
|
|
52
|
-
return /*#__PURE__*/
|
|
53
|
-
|
|
54
|
-
content:
|
|
55
|
-
|
|
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
|
+
});
|
|
56
45
|
};
|
|
57
|
-
|
|
46
|
+
const RecordLockingCellActions = Browser.Table.Column.createDecorator(Original => {
|
|
58
47
|
return function RecordLockingCellActions(props) {
|
|
59
48
|
if (props.name === "actions" && props.cell) {
|
|
60
|
-
return /*#__PURE__*/
|
|
61
|
-
cell: /*#__PURE__*/
|
|
49
|
+
return /*#__PURE__*/React.createElement(Original, Object.assign({}, props, {
|
|
50
|
+
cell: /*#__PURE__*/React.createElement(ActionsCell, null, props.cell)
|
|
62
51
|
}));
|
|
63
52
|
}
|
|
64
|
-
return /*#__PURE__*/
|
|
53
|
+
return /*#__PURE__*/React.createElement(Original, props);
|
|
65
54
|
};
|
|
66
55
|
});
|
|
67
|
-
|
|
68
|
-
return /*#__PURE__*/
|
|
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));
|
|
69
58
|
};
|
|
70
59
|
|
|
71
60
|
//# sourceMappingURL=HeadlessCmsActionsAcoCell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
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\";\nimport { UseContentEntriesListHookDecorator } from \"./decorators/UseContentEntriesListHookDecorator\";\nimport { UseSaveEntryDecorator } from \"~/components/decorators/UseSaveEntryDecorator\";\nimport { UseRecordsDecorator } from \"./decorators/UseRecordsDecorator\";\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,33 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
model = props.model,
|
|
18
|
-
children = props.children;
|
|
19
|
-
var _useRecordLocking = (0, _hooks.useRecordLocking)(),
|
|
20
|
-
fetchLockedEntryLockRecord = _useRecordLocking.fetchLockedEntryLockRecord;
|
|
21
|
-
var _useState = (0, _react.useState)(undefined),
|
|
22
|
-
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
23
|
-
locked = _useState2[0],
|
|
24
|
-
setLocked = _useState2[1];
|
|
25
|
-
(0, _react.useEffect)(function () {
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
|
2
|
+
import { useRecordLocking } from "../../hooks";
|
|
3
|
+
import { LockedRecord } from "../LockedRecord";
|
|
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(() => {
|
|
26
17
|
if (!entry.id || loading || locked !== undefined) {
|
|
27
18
|
return;
|
|
28
19
|
}
|
|
29
|
-
(async
|
|
30
|
-
|
|
20
|
+
(async () => {
|
|
21
|
+
const result = await fetchLockedEntryLockRecord({
|
|
31
22
|
id: entry.id,
|
|
32
23
|
$lockingType: model.modelId
|
|
33
24
|
});
|
|
@@ -35,9 +26,11 @@ var ContentEntryGuard = exports.ContentEntryGuard = function ContentEntryGuard(p
|
|
|
35
26
|
})();
|
|
36
27
|
}, [entry.id, loading]);
|
|
37
28
|
if (locked === undefined) {
|
|
38
|
-
return /*#__PURE__*/
|
|
29
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
30
|
+
className: "wby-h-screen wby-w-screen wby-fixed wby-top-0 wby-left-0 wby-z-20"
|
|
31
|
+
}, /*#__PURE__*/React.createElement(OverlayLoader, null));
|
|
39
32
|
} else if (locked) {
|
|
40
|
-
return /*#__PURE__*/
|
|
33
|
+
return /*#__PURE__*/React.createElement(LockedRecord, {
|
|
41
34
|
record: locked
|
|
42
35
|
});
|
|
43
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
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","record"],"sources":["ContentEntryGuard.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { useRecordLocking } from \"~/hooks\";\nimport { LockedRecord } from \"../LockedRecord\";\nimport { IRecordLockingLockRecord } from \"~/types\";\nimport { CmsContentEntry, CmsModel } from \"@webiny/app-headless-cms/types\";\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={\"wby-h-screen wby-w-screen wby-fixed wby-top-0 wby-left-0 wby-z-20\"}>\n <OverlayLoader />\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;IAAoE,gBAChFrB,KAAA,CAAAoB,aAAA,CAACf,aAAa,MAAE,CACf,CAAC;EAEd,CAAC,MAAM,IAAIQ,MAAM,EAAE;IACf,oBAAOb,KAAA,CAAAoB,aAAA,CAAChB,YAAY;MAACkB,MAAM,EAAET;IAAO,CAAE,CAAC;EAC3C;EAEA,OAAOF,QAAQ;AACnB,CAAC","ignoreList":[]}
|
|
@@ -1,58 +1,41 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var _hooks = require("../../hooks");
|
|
12
|
-
var _appWebsockets = require("@webiny/app-websockets");
|
|
13
|
-
var _utils = require("@webiny/utils");
|
|
14
|
-
var _appAdmin = require("@webiny/app-admin");
|
|
15
|
-
function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
|
|
16
|
-
var autoUpdateTimeout = 20;
|
|
17
|
-
var Bold = /*#__PURE__*/(0, _base.default)("span", process.env.NODE_ENV === "production" ? {
|
|
18
|
-
target: "e11fa9fc0"
|
|
19
|
-
} : {
|
|
20
|
-
target: "e11fa9fc0",
|
|
21
|
-
label: "Bold"
|
|
22
|
-
})(process.env.NODE_ENV === "production" ? {
|
|
23
|
-
name: "16ceglb",
|
|
24
|
-
styles: "font-weight:600"
|
|
25
|
-
} : {
|
|
26
|
-
name: "16ceglb",
|
|
27
|
-
styles: "font-weight:600",
|
|
28
|
-
map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnRlbnRFbnRyeUxvY2tlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBWXdCIiwiZmlsZSI6IkNvbnRlbnRFbnRyeUxvY2tlci50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVJlY29yZExvY2tpbmcgfSBmcm9tIFwifi9ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBJUmVjb3JkTG9ja2luZ0lkZW50aXR5LCBJUmVjb3JkTG9ja2luZ0xvY2tSZWNvcmQgfSBmcm9tIFwifi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ0dlbmVyaWNEYXRhIH0gZnJvbSBcIkB3ZWJpbnkvYXBwLXdlYnNvY2tldHNcIjtcbmltcG9ydCB7IHVzZVdlYnNvY2tldHMgfSBmcm9tIFwiQHdlYmlueS9hcHAtd2Vic29ja2V0c1wiO1xuaW1wb3J0IHsgcGFyc2VJZGVudGlmaWVyIH0gZnJvbSBcIkB3ZWJpbnkvdXRpbHNcIjtcbmltcG9ydCB7IHVzZURpYWxvZ3MgfSBmcm9tIFwiQHdlYmlueS9hcHAtYWRtaW5cIjtcbmltcG9ydCBzdHlsZWQgZnJvbSBcIkBlbW90aW9uL3N0eWxlZFwiO1xuaW1wb3J0IHsgQ21zQ29udGVudEVudHJ5LCBDbXNNb2RlbCB9IGZyb20gXCJAd2ViaW55L2FwcC1oZWFkbGVzcy1jbXMvdHlwZXNcIjtcblxuY29uc3QgYXV0b1VwZGF0ZVRpbWVvdXQgPSAyMDtcblxuY29uc3QgQm9sZCA9IHN0eWxlZC5zcGFuYFxuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG5gO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb250ZW50RW50cnlMb2NrZXJQcm9wcyB7XG4gICAgZW50cnk6IENtc0NvbnRlbnRFbnRyeTtcbiAgICBtb2RlbDogQ21zTW9kZWw7XG4gICAgb25FbnRyeVVubG9ja2VkOiAoKSA9PiB2b2lkO1xuICAgIG9uRGlzYWJsZVByb21wdDogKGZsYWc6IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgY2hpbGRyZW46IFJlYWN0LlJlYWN0RWxlbWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJS2lja091dFdlYnNvY2tldHNNZXNzYWdlIGV4dGVuZHMgSW5jb21pbmdHZW5lcmljRGF0YSB7XG4gICAgZGF0YToge1xuICAgICAgICByZWNvcmQ6IElSZWNvcmRMb2NraW5nTG9ja1JlY29yZDtcbiAgICAgICAgdXNlcjogSVJlY29yZExvY2tpbmdJZGVudGl0eTtcbiAgICB9O1xufVxuaW50ZXJmYWNlIElGb3JjZVVubG9ja2VkUHJvcHMge1xuICAgIHVzZXI6IElSZWNvcmRMb2NraW5nSWRlbnRpdHk7XG59XG5jb25zdCBGb3JjZVVubG9ja2VkID0gKHsgdXNlciB9OiBJRm9yY2VVbmxvY2tlZFByb3BzKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICAgIFRoZSBlbnRyeSB5b3Ugd2VyZSBlZGl0aW5nIHdhcyBmb3JjZWZ1bGx5IHVubG9ja2VkIGJ5e1wiIFwifVxuICAgICAgICAgICAgPEJvbGQ+e3VzZXIuZGlzcGxheU5hbWUgfHwgXCJVbmtub3duIHVzZXJcIn08L0JvbGQ+LiBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zIHlvdSBsb3N0XG4gICAgICAgICAgICB0aGUgdW5zYXZlZCBjaGFuZ2VzLlxuICAgICAgICA8Lz5cbiAgICApO1xufTtcblxuZXhwb3J0IGNvbnN0IENvbnRlbnRFbnRyeUxvY2tlciA9ICh7XG4gICAgb25FbnRyeVVubG9ja2VkLFxuICAgIG9uRGlzYWJsZVByb21wdCxcbiAgICBlbnRyeSxcbiAgICBtb2RlbCxcbiAgICBjaGlsZHJlblxufTogSUNvbnRlbnRFbnRyeUxvY2tlclByb3BzKSA9PiB7XG4gICAgY29uc3QgeyB1cGRhdGVFbnRyeUxvY2ssIHJlbW92ZUVudHJ5TG9jayB9ID0gdXNlUmVjb3JkTG9ja2luZygpO1xuICAgIGNvbnN0IHdlYnNvY2tldHMgPSB1c2VXZWJzb2NrZXRzKCk7XG4gICAgY29uc3QgeyBzaG93RGlhbG9nIH0gPSB1c2VEaWFsb2dzKCk7XG5cbiAgICBjb25zdCBlbnRyeUxvY2tlclRpbWVvdXQgPSB1c2VSZWY8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoIWVudHJ5LmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpZDogZW50cnlJZCB9ID0gcGFyc2VJZGVudGlmaWVyKGVudHJ5LmlkKTtcblxuICAgICAgICBsZXQgb25NZXNzYWdlU3ViID0gd2Vic29ja2V0cy5vbk1lc3NhZ2U8SUtpY2tPdXRXZWJzb2NrZXRzTWVzc2FnZT4oXG4gICAgICAgICAgICBgcmVjb3JkTG9ja2luZy5lbnRyeS5raWNrT3V0LiR7ZW50cnlJZH1gLFxuICAgICAgICAgICAgYXN5bmMgaW5jb21pbmcgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdXNlciB9ID0gaW5jb21pbmcuZGF0YTtcbiAgICAgICAgICAgICAgICBvbkRpc2FibGVQcm9tcHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlRW50cnlMb2NrKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVudHJ5SWQsXG4gICAgICAgICAgICAgICAgICAgICRsb2NraW5nVHlwZTogbW9kZWwubW9kZWxJZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNob3dEaWFsb2coe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJFbnRyeSB3YXMgZm9yY2VmdWxseSB1bmxvY2tlZCFcIixcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogPEZvcmNlVW5sb2NrZWQgdXNlcj17dXNlcn0gLz4sXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdExhYmVsOiBcIk9rXCIsXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsTGFiZWw6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG9uRW50cnlVbmxvY2tlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBvbk1lc3NhZ2VTdWIub2ZmKCk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIExldHMgbnVsbCBzdWJzY3JpcHRpb25zLCBqdXN0IGluIGNhc2UgaXQuLi5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgb25NZXNzYWdlU3ViID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICB9LCBbZW50cnkuaWQsIG9uRW50cnlVbmxvY2tlZCwgbW9kZWwubW9kZWxJZF0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFlbnRyeS5pZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5TG9ja2VyVGltZW91dC5jdXJyZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cGRhdGVMb2NrID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXBkYXRlRW50cnlMb2NrKHtcbiAgICAgICAgICAgICAgICBpZDogZW50cnkuaWQsXG4gICAgICAgICAgICAgICAgJGxvY2tpbmdUeXBlOiBtb2RlbC5tb2RlbElkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBzaG93RGlhbG9nKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBlbnRyeSBsb2NrLlwiLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiByZXN1bHQuZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgYWNjZXB0TGFiZWw6IFwiT2tcIixcbiAgICAgICAgICAgICAgICAgICAgb25DbG9zZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxMYWJlbDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb25FbnRyeVVubG9ja2VkKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3JlYXRlVGltZW91dCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVRpbWVvdXQgPSAoKSA9PiB7XG4gICAgICAgICAgICBlbnRyeUxvY2tlclRpbWVvdXQuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVMb2NrKCk7XG4gICAgICAgICAgICB9LCBhdXRvVXBkYXRlVGltZW91dCAqIDEwMDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHVwZGF0ZUxvY2soKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGlmICghZW50cnlMb2NrZXJUaW1lb3V0LmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZW50cnlMb2NrZXJUaW1lb3V0LmN1cnJlbnQpO1xuICAgICAgICAgICAgZW50cnlMb2NrZXJUaW1lb3V0LmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9O1xuICAgIH0sIFtlbnRyeS5pZCwgb25FbnRyeVVubG9ja2VkXSk7XG5cbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xufTtcbiJdfQ== */",
|
|
29
|
-
toString: _EMOTION_STRINGIFIED_CSS_ERROR__
|
|
30
|
-
});
|
|
31
|
-
var ForceUnlocked = function ForceUnlocked(_ref) {
|
|
32
|
-
var user = _ref.user;
|
|
33
|
-
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "The entry you were editing was forcefully unlocked by", " ", /*#__PURE__*/_react.default.createElement(Bold, null, user.displayName || "Unknown user"), ". Unfortunately, this means you lost the unsaved changes.");
|
|
1
|
+
import React, { useEffect, useRef } from "react";
|
|
2
|
+
import { useRecordLocking } from "../../hooks";
|
|
3
|
+
import { useWebsockets } from "@webiny/app-websockets";
|
|
4
|
+
import { parseIdentifier } from "@webiny/utils";
|
|
5
|
+
import { useDialogs } from "@webiny/app-admin";
|
|
6
|
+
const autoUpdateTimeout = 20;
|
|
7
|
+
const ForceUnlocked = ({
|
|
8
|
+
user
|
|
9
|
+
}) => {
|
|
10
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, "The entry you were editing was forcefully unlocked by", " ", /*#__PURE__*/React.createElement("strong", null, user.displayName || "Unknown user"), ". Unfortunately, this means you lost the unsaved changes.");
|
|
34
11
|
};
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
12
|
+
export const ContentEntryLocker = ({
|
|
13
|
+
onEntryUnlocked,
|
|
14
|
+
onDisablePrompt,
|
|
15
|
+
entry,
|
|
16
|
+
model,
|
|
17
|
+
children
|
|
18
|
+
}) => {
|
|
19
|
+
const {
|
|
20
|
+
updateEntryLock,
|
|
21
|
+
removeEntryLock
|
|
22
|
+
} = useRecordLocking();
|
|
23
|
+
const websockets = useWebsockets();
|
|
24
|
+
const {
|
|
25
|
+
showDialog
|
|
26
|
+
} = useDialogs();
|
|
27
|
+
const entryLockerTimeout = useRef(null);
|
|
28
|
+
useEffect(() => {
|
|
49
29
|
if (!entry.id) {
|
|
50
30
|
return;
|
|
51
31
|
}
|
|
52
|
-
|
|
53
|
-
entryId
|
|
54
|
-
|
|
55
|
-
|
|
32
|
+
const {
|
|
33
|
+
id: entryId
|
|
34
|
+
} = parseIdentifier(entry.id);
|
|
35
|
+
let onMessageSub = websockets.onMessage(`recordLocking.entry.kickOut.${entryId}`, async incoming => {
|
|
36
|
+
const {
|
|
37
|
+
user
|
|
38
|
+
} = incoming.data;
|
|
56
39
|
onDisablePrompt(true);
|
|
57
40
|
removeEntryLock({
|
|
58
41
|
id: entryId,
|
|
@@ -60,7 +43,7 @@ var ContentEntryLocker = exports.ContentEntryLocker = function ContentEntryLocke
|
|
|
60
43
|
});
|
|
61
44
|
showDialog({
|
|
62
45
|
title: "Entry was forcefully unlocked!",
|
|
63
|
-
content: /*#__PURE__*/
|
|
46
|
+
content: /*#__PURE__*/React.createElement(ForceUnlocked, {
|
|
64
47
|
user: user
|
|
65
48
|
}),
|
|
66
49
|
acceptLabel: "Ok",
|
|
@@ -69,7 +52,7 @@ var ContentEntryLocker = exports.ContentEntryLocker = function ContentEntryLocke
|
|
|
69
52
|
});
|
|
70
53
|
onEntryUnlocked();
|
|
71
54
|
});
|
|
72
|
-
return
|
|
55
|
+
return () => {
|
|
73
56
|
onMessageSub.off();
|
|
74
57
|
/**
|
|
75
58
|
* Lets null subscriptions, just in case it...
|
|
@@ -78,15 +61,15 @@ var ContentEntryLocker = exports.ContentEntryLocker = function ContentEntryLocke
|
|
|
78
61
|
onMessageSub = null;
|
|
79
62
|
};
|
|
80
63
|
}, [entry.id, onEntryUnlocked, model.modelId]);
|
|
81
|
-
|
|
64
|
+
useEffect(() => {
|
|
82
65
|
if (!entry.id) {
|
|
83
66
|
return;
|
|
84
67
|
}
|
|
85
68
|
if (entryLockerTimeout.current) {
|
|
86
69
|
return;
|
|
87
70
|
}
|
|
88
|
-
|
|
89
|
-
|
|
71
|
+
const updateLock = async () => {
|
|
72
|
+
const result = await updateEntryLock({
|
|
90
73
|
id: entry.id,
|
|
91
74
|
$lockingType: model.modelId
|
|
92
75
|
});
|
|
@@ -103,13 +86,13 @@ var ContentEntryLocker = exports.ContentEntryLocker = function ContentEntryLocke
|
|
|
103
86
|
}
|
|
104
87
|
createTimeout();
|
|
105
88
|
};
|
|
106
|
-
|
|
107
|
-
entryLockerTimeout.current = window.setTimeout(
|
|
89
|
+
const createTimeout = () => {
|
|
90
|
+
entryLockerTimeout.current = window.setTimeout(() => {
|
|
108
91
|
updateLock();
|
|
109
92
|
}, autoUpdateTimeout * 1000);
|
|
110
93
|
};
|
|
111
94
|
updateLock();
|
|
112
|
-
return
|
|
95
|
+
return () => {
|
|
113
96
|
if (!entryLockerTimeout.current) {
|
|
114
97
|
return;
|
|
115
98
|
}
|
|
@@ -117,7 +100,7 @@ var ContentEntryLocker = exports.ContentEntryLocker = function ContentEntryLocke
|
|
|
117
100
|
entryLockerTimeout.current = null;
|
|
118
101
|
};
|
|
119
102
|
}, [entry.id, onEntryUnlocked]);
|
|
120
|
-
return /*#__PURE__*/
|
|
103
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, children);
|
|
121
104
|
};
|
|
122
105
|
|
|
123
106
|
//# sourceMappingURL=ContentEntryLocker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["React","useEffect","useRef","useRecordLocking","useWebsockets","parseIdentifier","useDialogs","autoUpdateTimeout","ForceUnlocked","user","createElement","Fragment","displayName","ContentEntryLocker","onEntryUnlocked","onDisablePrompt","entry","model","children","updateEntryLock","removeEntryLock","websockets","showDialog","entryLockerTimeout","id","entryId","onMessageSub","onMessage","incoming","data","$lockingType","modelId","title","content","acceptLabel","onClose","undefined","cancelLabel","off","current","updateLock","result","error","message","createTimeout","window","setTimeout","clearTimeout"],"sources":["ContentEntryLocker.tsx"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { useRecordLocking } from \"~/hooks\";\nimport type { IRecordLockingIdentity, IRecordLockingLockRecord } from \"~/types\";\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 { CmsContentEntry, CmsModel } from \"@webiny/app-headless-cms/types\";\n\nconst autoUpdateTimeout = 20;\n\nexport interface IContentEntryLockerProps {\n entry: CmsContentEntry;\n model: CmsModel;\n onEntryUnlocked: () => void;\n onDisablePrompt: (flag: boolean) => void;\n children: React.ReactElement;\n}\n\nexport interface IKickOutWebsocketsMessage extends IncomingGenericData {\n data: {\n record: IRecordLockingLockRecord;\n user: IRecordLockingIdentity;\n };\n}\ninterface IForceUnlockedProps {\n user: IRecordLockingIdentity;\n}\nconst ForceUnlocked = ({ user }: IForceUnlockedProps) => {\n return (\n <>\n The entry you were editing was forcefully unlocked by{\" \"}\n <strong>{user.displayName || \"Unknown user\"}</strong>. Unfortunately, this means you\n lost the unsaved changes.\n </>\n );\n};\n\nexport const ContentEntryLocker = ({\n onEntryUnlocked,\n onDisablePrompt,\n entry,\n model,\n children\n}: IContentEntryLockerProps) => {\n const { updateEntryLock, removeEntryLock } = useRecordLocking();\n const websockets = useWebsockets();\n const { showDialog } = useDialogs();\n\n const entryLockerTimeout = useRef<number | null>(null);\n\n useEffect(() => {\n if (!entry.id) {\n return;\n }\n const { id: entryId } = parseIdentifier(entry.id);\n\n let onMessageSub = websockets.onMessage<IKickOutWebsocketsMessage>(\n `recordLocking.entry.kickOut.${entryId}`,\n async incoming => {\n const { user } = incoming.data;\n onDisablePrompt(true);\n removeEntryLock({\n id: entryId,\n $lockingType: model.modelId\n });\n showDialog({\n title: \"Entry was forcefully unlocked!\",\n content: <ForceUnlocked user={user} />,\n acceptLabel: \"Ok\",\n onClose: undefined,\n cancelLabel: undefined\n });\n onEntryUnlocked();\n }\n );\n\n return () => {\n onMessageSub.off();\n /**\n * Lets null subscriptions, just in case it...\n */\n // @ts-expect-error\n onMessageSub = null;\n };\n }, [entry.id, onEntryUnlocked, model.modelId]);\n\n useEffect(() => {\n if (!entry.id) {\n return;\n }\n\n if (entryLockerTimeout.current) {\n return;\n }\n\n const updateLock = async () => {\n const result = await updateEntryLock({\n id: entry.id,\n $lockingType: model.modelId\n });\n if (result.error) {\n showDialog({\n title: \"There was an error while updating the entry lock.\",\n content: result.error.message,\n acceptLabel: \"Ok\",\n onClose: undefined,\n cancelLabel: undefined\n });\n onEntryUnlocked();\n return;\n }\n createTimeout();\n };\n\n const createTimeout = () => {\n entryLockerTimeout.current = window.setTimeout(() => {\n updateLock();\n }, autoUpdateTimeout * 1000);\n };\n\n updateLock();\n return () => {\n if (!entryLockerTimeout.current) {\n return;\n }\n clearTimeout(entryLockerTimeout.current);\n entryLockerTimeout.current = null;\n };\n }, [entry.id, onEntryUnlocked]);\n\n return <>{children}</>;\n};\n"],"mappings":"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","ignoreList":[]}
|