@webiny/app-record-locking 6.0.0-beta.0 → 6.0.0-rc.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/README.md +8 -9
- package/components/HeadlessCmsActionsAcoCell.js +46 -57
- package/components/HeadlessCmsActionsAcoCell.js.map +1 -1
- package/components/HeadlessCmsContentEntry/ContentEntryGuard.d.ts +4 -0
- package/components/HeadlessCmsContentEntry/ContentEntryGuard.js +24 -70
- package/components/HeadlessCmsContentEntry/ContentEntryGuard.js.map +1 -1
- package/components/HeadlessCmsContentEntry/ContentEntryLocker.d.ts +7 -3
- package/components/HeadlessCmsContentEntry/ContentEntryLocker.js +82 -84
- package/components/HeadlessCmsContentEntry/ContentEntryLocker.js.map +1 -1
- package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js +66 -40
- package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js.map +1 -1
- package/components/HeadlessCmsContentEntry/index.d.ts +1 -1
- package/components/HeadlessCmsContentEntry/index.js +1 -16
- package/components/HeadlessCmsContentEntry/index.js.map +1 -1
- package/components/LockedRecord/LockedRecord.d.ts +1 -1
- package/components/LockedRecord/LockedRecord.js +51 -146
- package/components/LockedRecord/LockedRecord.js.map +1 -1
- package/components/LockedRecord/LockedRecordForceUnlock.d.ts +1 -1
- package/components/LockedRecord/LockedRecordForceUnlock.js +49 -95
- package/components/LockedRecord/LockedRecordForceUnlock.js.map +1 -1
- package/components/LockedRecord/index.d.ts +1 -1
- package/components/LockedRecord/index.js +1 -16
- package/components/LockedRecord/index.js.map +1 -1
- package/components/RecordLockingProvider.d.ts +1 -1
- package/components/RecordLockingProvider.js +63 -68
- package/components/RecordLockingProvider.js.map +1 -1
- package/components/SecurityPermissions.d.ts +2 -0
- package/components/SecurityPermissions.js +23 -0
- package/components/SecurityPermissions.js.map +1 -0
- package/components/decorators/UseContentEntriesListHookDecorator.d.ts +1 -2
- package/components/decorators/UseContentEntriesListHookDecorator.js +13 -18
- package/components/decorators/UseContentEntriesListHookDecorator.js.map +1 -1
- package/components/decorators/UseRecordsDecorator.d.ts +1 -2
- package/components/decorators/UseRecordsDecorator.js +11 -16
- package/components/decorators/UseRecordsDecorator.js.map +1 -1
- package/components/decorators/UseSaveEntryDecorator.d.ts +1 -2
- package/components/decorators/UseSaveEntryDecorator.js +34 -34
- package/components/decorators/UseSaveEntryDecorator.js.map +1 -1
- package/domain/RecordLocking.d.ts +10 -14
- package/domain/RecordLocking.js +272 -330
- package/domain/RecordLocking.js.map +1 -1
- package/domain/RecordLockingClient.d.ts +3 -3
- package/domain/RecordLockingClient.js +15 -29
- package/domain/RecordLockingClient.js.map +1 -1
- package/domain/RecordLockingGetLockRecord.d.ts +2 -2
- package/domain/RecordLockingGetLockRecord.js +16 -29
- package/domain/RecordLockingGetLockRecord.js.map +1 -1
- package/domain/RecordLockingGetLockedEntryLockRecord.d.ts +2 -2
- package/domain/RecordLockingGetLockedEntryLockRecord.js +14 -27
- package/domain/RecordLockingGetLockedEntryLockRecord.js.map +1 -1
- package/domain/RecordLockingIsEntryLocked.d.ts +2 -2
- package/domain/RecordLockingIsEntryLocked.js +14 -27
- package/domain/RecordLockingIsEntryLocked.js.map +1 -1
- package/domain/RecordLockingListLockRecords.d.ts +3 -3
- package/domain/RecordLockingListLockRecords.js +26 -37
- package/domain/RecordLockingListLockRecords.js.map +1 -1
- package/domain/RecordLockingLockEntry.d.ts +2 -2
- package/domain/RecordLockingLockEntry.js +9 -24
- package/domain/RecordLockingLockEntry.js.map +1 -1
- package/domain/RecordLockingUnlockEntry.d.ts +2 -2
- package/domain/RecordLockingUnlockEntry.js +14 -27
- package/domain/RecordLockingUnlockEntry.js.map +1 -1
- package/domain/RecordLockingUpdateEntryLock.d.ts +2 -2
- package/domain/RecordLockingUpdateEntryLock.js +14 -27
- package/domain/RecordLockingUpdateEntryLock.js.map +1 -1
- package/domain/abstractions/IRecordLocking.d.ts +8 -2
- package/domain/abstractions/IRecordLocking.js +1 -5
- package/domain/abstractions/IRecordLocking.js.map +1 -1
- package/domain/abstractions/IRecordLockingClient.d.ts +2 -2
- package/domain/abstractions/IRecordLockingClient.js +1 -5
- package/domain/abstractions/IRecordLockingClient.js.map +1 -1
- package/domain/abstractions/IRecordLockingGetLockRecord.d.ts +1 -1
- package/domain/abstractions/IRecordLockingGetLockRecord.js +1 -5
- package/domain/abstractions/IRecordLockingGetLockRecord.js.map +1 -1
- package/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.d.ts +1 -1
- package/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.js +1 -5
- package/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.js.map +1 -1
- package/domain/abstractions/IRecordLockingIsEntryLocked.d.ts +1 -1
- package/domain/abstractions/IRecordLockingIsEntryLocked.js +1 -5
- package/domain/abstractions/IRecordLockingListLockRecords.d.ts +1 -1
- package/domain/abstractions/IRecordLockingListLockRecords.js +1 -5
- package/domain/abstractions/IRecordLockingListLockRecords.js.map +1 -1
- package/domain/abstractions/IRecordLockingLockEntry.d.ts +1 -1
- package/domain/abstractions/IRecordLockingLockEntry.js +1 -5
- package/domain/abstractions/IRecordLockingLockEntry.js.map +1 -1
- package/domain/abstractions/IRecordLockingUnlockEntry.d.ts +1 -1
- package/domain/abstractions/IRecordLockingUnlockEntry.js +1 -5
- package/domain/abstractions/IRecordLockingUnlockEntry.js.map +1 -1
- package/domain/abstractions/IRecordLockingUpdateEntryLock.d.ts +1 -1
- package/domain/abstractions/IRecordLockingUpdateEntryLock.js +1 -5
- package/domain/abstractions/IRecordLockingUpdateEntryLock.js.map +1 -1
- package/domain/graphql/fields.js +28 -8
- package/domain/graphql/fields.js.map +1 -1
- package/domain/graphql/getLockRecord.d.ts +3 -3
- package/domain/graphql/getLockRecord.js +16 -12
- package/domain/graphql/getLockRecord.js.map +1 -1
- package/domain/graphql/getLockedEntryLockRecord.d.ts +3 -3
- package/domain/graphql/getLockedEntryLockRecord.js +16 -12
- package/domain/graphql/getLockedEntryLockRecord.js.map +1 -1
- package/domain/graphql/isEntryLocked.d.ts +3 -3
- package/domain/graphql/isEntryLocked.js +14 -12
- package/domain/graphql/isEntryLocked.js.map +1 -1
- package/domain/graphql/listLockRecords.d.ts +3 -3
- package/domain/graphql/listLockRecords.js +23 -14
- package/domain/graphql/listLockRecords.js.map +1 -1
- package/domain/graphql/lockEntry.d.ts +3 -3
- package/domain/graphql/lockEntry.js +17 -13
- package/domain/graphql/lockEntry.js.map +1 -1
- package/domain/graphql/unlockEntry.d.ts +3 -3
- package/domain/graphql/unlockEntry.js +16 -12
- package/domain/graphql/unlockEntry.js.map +1 -1
- package/domain/graphql/updateEntryLock.d.ts +3 -3
- package/domain/graphql/updateEntryLock.js +16 -12
- package/domain/graphql/updateEntryLock.js.map +1 -1
- package/domain/utils/createRecordLockingClient.d.ts +1 -1
- package/domain/utils/createRecordLockingClient.js +6 -12
- package/domain/utils/createRecordLockingClient.js.map +1 -1
- package/domain/utils/createRecordLockingError.d.ts +1 -1
- package/domain/utils/createRecordLockingError.js +1 -7
- package/domain/utils/createRecordLockingError.js.map +1 -1
- package/hooks/index.d.ts +2 -2
- package/hooks/index.js +2 -27
- package/hooks/index.js.map +1 -1
- package/hooks/usePermission.d.ts +1 -1
- package/hooks/usePermission.js +14 -15
- package/hooks/usePermission.js.map +1 -1
- package/hooks/useRecordLocking.d.ts +1 -1
- package/hooks/useRecordLocking.js +6 -12
- package/hooks/useRecordLocking.js.map +1 -1
- package/index.d.ts +2 -2
- package/index.js +19 -49
- package/index.js.map +1 -1
- package/package.json +16 -31
- package/types.d.ts +32 -12
- package/types.js +1 -5
- package/types.js.map +1 -1
- package/utils/createCacheKey.d.ts +2 -2
- package/utils/createCacheKey.js +5 -11
- package/utils/createCacheKey.js.map +1 -1
- package/components/assets/lock.svg +0 -13
- package/domain/RecordLockingUnlockEntryRequest.d.ts +0 -11
- package/domain/RecordLockingUnlockEntryRequest.js +0 -28
- package/domain/RecordLockingUnlockEntryRequest.js.map +0 -1
- package/domain/abstractions/IRecordLockingUnlockEntryRequest.d.ts +0 -12
- package/domain/abstractions/IRecordLockingUnlockEntryRequest.js +0 -7
- package/domain/abstractions/IRecordLockingUnlockEntryRequest.js.map +0 -1
- package/domain/graphql/unlockEntryRequest.d.ts +0 -12
- package/domain/graphql/unlockEntryRequest.js +0 -16
- package/domain/graphql/unlockEntryRequest.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
# @webiny/app-record-locking
|
|
2
|
-
[](https://www.npmjs.com/package/@webiny/app-record-locking)
|
|
3
|
-
[](https://www.npmjs.com/package/@webiny/app-record-locking)
|
|
4
|
-
[](https://github.com/prettier/prettier)
|
|
5
|
-
[](http://makeapullrequest.com)
|
|
6
2
|
|
|
7
|
-
|
|
3
|
+
> [!NOTE]
|
|
4
|
+
> This package is part of the [Webiny](https://www.webiny.com) monorepo.
|
|
5
|
+
> It’s **included in every Webiny project by default** and is not meant to be used as a standalone package.
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
📘 **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
_This README file is automatically generated during the publish process._
|
|
@@ -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/index.js";
|
|
5
|
+
import { UseContentEntriesListHookDecorator } from "./decorators/UseContentEntriesListHookDecorator.js";
|
|
6
|
+
import { UseSaveEntryDecorator } from "./decorators/UseSaveEntryDecorator.js";
|
|
7
|
+
import { UseRecordsDecorator } from "./decorators/UseRecordsDecorator.js";
|
|
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/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,5 +1,9 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
+
import type { CmsContentEntry, CmsModel } from "@webiny/app-headless-cms/types.js";
|
|
2
3
|
export interface IContentEntryGuardProps {
|
|
4
|
+
loading: boolean;
|
|
5
|
+
entry: CmsContentEntry;
|
|
6
|
+
model: CmsModel;
|
|
3
7
|
children: React.ReactElement;
|
|
4
8
|
}
|
|
5
9
|
export declare const ContentEntryGuard: (props: IContentEntryGuardProps) => React.JSX.Element;
|
|
@@ -1,71 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
var _LockedRecord = require("../LockedRecord");
|
|
18
|
-
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)."; }
|
|
19
|
-
var DetailsContainer = /*#__PURE__*/(0, _base.default)("div", process.env.NODE_ENV === "production" ? {
|
|
20
|
-
target: "ecb7tlj1"
|
|
21
|
-
} : {
|
|
22
|
-
target: "ecb7tlj1",
|
|
23
|
-
label: "DetailsContainer"
|
|
24
|
-
})(process.env.NODE_ENV === "production" ? {
|
|
25
|
-
name: "1ypyu3l",
|
|
26
|
-
styles: "height:calc(100% - 10px);overflow:hidden;position:relative;nav{background-color:var(--mdc-theme-surface);}"
|
|
27
|
-
} : {
|
|
28
|
-
name: "1ypyu3l",
|
|
29
|
-
styles: "height:calc(100% - 10px);overflow:hidden;position:relative;nav{background-color:var(--mdc-theme-surface);}",
|
|
30
|
-
map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnRlbnRFbnRyeUd1YXJkLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVeUIiLCJmaWxlIjoiQ29udGVudEVudHJ5R3VhcmQudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlQ29udGVudEVudHJ5IH0gZnJvbSBcIkB3ZWJpbnkvYXBwLWhlYWRsZXNzLWNtc1wiO1xuaW1wb3J0IHsgdXNlUmVjb3JkTG9ja2luZyB9IGZyb20gXCJ+L2hvb2tzXCI7XG5pbXBvcnQgeyBFbGV2YXRpb24gfSBmcm9tIFwiQHdlYmlueS91aS9FbGV2YXRpb25cIjtcbmltcG9ydCB7IENpcmN1bGFyUHJvZ3Jlc3MgfSBmcm9tIFwiQHdlYmlueS91aS9Qcm9ncmVzc1wiO1xuaW1wb3J0IHsgY3NzIH0gZnJvbSBcImVtb3Rpb25cIjtcbmltcG9ydCBzdHlsZWQgZnJvbSBcIkBlbW90aW9uL3N0eWxlZFwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IExvY2tlZFJlY29yZCB9IGZyb20gXCIuLi9Mb2NrZWRSZWNvcmRcIjtcbmltcG9ydCB7IElSZWNvcmRMb2NraW5nTG9ja1JlY29yZCB9IGZyb20gXCJ+L3R5cGVzXCI7XG5cbmNvbnN0IERldGFpbHNDb250YWluZXIgPSBzdHlsZWQoXCJkaXZcIikoe1xuICAgIGhlaWdodDogXCJjYWxjKDEwMCUgLSAxMHB4KVwiLFxuICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgbmF2OiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1tZGMtdGhlbWUtc3VyZmFjZSlcIlxuICAgIH1cbn0pO1xuXG5jb25zdCBSZW5kZXJCbG9jayA9IHN0eWxlZChcImRpdlwiKSh7XG4gICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcbiAgICB6SW5kZXg6IDAsXG4gICAgYmFja2dyb3VuZENvbG9yOiBcInZhcigtLW1kYy10aGVtZS1iYWNrZ3JvdW5kKVwiLFxuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgcGFkZGluZzogMjVcbn0pO1xuXG5jb25zdCBlbGV2YXRpb25TdHlsZXMgPSBjc3Moe1xuICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgaGVpZ2h0OiBcIjEwMCVcIlxufSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRlbnRFbnRyeUd1YXJkUHJvcHMge1xuICAgIGNoaWxkcmVuOiBSZWFjdC5SZWFjdEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBDb250ZW50RW50cnlHdWFyZCA9IChwcm9wczogSUNvbnRlbnRFbnRyeUd1YXJkUHJvcHMpID0+IHtcbiAgICBjb25zdCB7IGxvYWRpbmcsIGVudHJ5LCBjb250ZW50TW9kZWw6IG1vZGVsIH0gPSB1c2VDb250ZW50RW50cnkoKTtcbiAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSBwcm9wcztcbiAgICBjb25zdCB7IGZldGNoTG9ja2VkRW50cnlMb2NrUmVjb3JkIH0gPSB1c2VSZWNvcmRMb2NraW5nKCk7XG5cbiAgICBjb25zdCBbbG9ja2VkLCBzZXRMb2NrZWRdID0gdXNlU3RhdGU8SVJlY29yZExvY2tpbmdMb2NrUmVjb3JkIHwgbnVsbCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICghZW50cnkuaWQgfHwgbG9hZGluZyB8fCBsb2NrZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaExvY2tlZEVudHJ5TG9ja1JlY29yZCh7XG4gICAgICAgICAgICAgICAgaWQ6IGVudHJ5LmlkLFxuICAgICAgICAgICAgICAgICRsb2NraW5nVHlwZTogbW9kZWwubW9kZWxJZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZXRMb2NrZWQocmVzdWx0KTtcbiAgICAgICAgfSkoKTtcbiAgICB9LCBbZW50cnkuaWQsIGxvYWRpbmddKTtcblxuICAgIGlmIChsb2NrZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPERldGFpbHNDb250YWluZXI+XG4gICAgICAgICAgICAgICAgPFJlbmRlckJsb2NrPlxuICAgICAgICAgICAgICAgICAgICA8RWxldmF0aW9uIHo9ezJ9IGNsYXNzTmFtZT17ZWxldmF0aW9uU3R5bGVzfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRWxldmF0aW9uPlxuICAgICAgICAgICAgICAgIDwvUmVuZGVyQmxvY2s+XG4gICAgICAgICAgICA8L0RldGFpbHNDb250YWluZXI+XG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChsb2NrZWQpIHtcbiAgICAgICAgcmV0dXJuIDxMb2NrZWRSZWNvcmQgcmVjb3JkPXtsb2NrZWR9IC8+O1xuICAgIH1cblxuICAgIHJldHVybiBjaGlsZHJlbjtcbn07XG4iXX0= */",
|
|
31
|
-
toString: _EMOTION_STRINGIFIED_CSS_ERROR__
|
|
32
|
-
});
|
|
33
|
-
var RenderBlock = /*#__PURE__*/(0, _base.default)("div", process.env.NODE_ENV === "production" ? {
|
|
34
|
-
target: "ecb7tlj0"
|
|
35
|
-
} : {
|
|
36
|
-
target: "ecb7tlj0",
|
|
37
|
-
label: "RenderBlock"
|
|
38
|
-
})(process.env.NODE_ENV === "production" ? {
|
|
39
|
-
name: "8nvd3k",
|
|
40
|
-
styles: "position:relative;z-index:0;background-color:var(--mdc-theme-background);height:100%;padding:25px"
|
|
41
|
-
} : {
|
|
42
|
-
name: "8nvd3k",
|
|
43
|
-
styles: "position:relative;z-index:0;background-color:var(--mdc-theme-background);height:100%;padding:25px",
|
|
44
|
-
map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnRlbnRFbnRyeUd1YXJkLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtQm9CIiwiZmlsZSI6IkNvbnRlbnRFbnRyeUd1YXJkLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUNvbnRlbnRFbnRyeSB9IGZyb20gXCJAd2ViaW55L2FwcC1oZWFkbGVzcy1jbXNcIjtcbmltcG9ydCB7IHVzZVJlY29yZExvY2tpbmcgfSBmcm9tIFwifi9ob29rc1wiO1xuaW1wb3J0IHsgRWxldmF0aW9uIH0gZnJvbSBcIkB3ZWJpbnkvdWkvRWxldmF0aW9uXCI7XG5pbXBvcnQgeyBDaXJjdWxhclByb2dyZXNzIH0gZnJvbSBcIkB3ZWJpbnkvdWkvUHJvZ3Jlc3NcIjtcbmltcG9ydCB7IGNzcyB9IGZyb20gXCJlbW90aW9uXCI7XG5pbXBvcnQgc3R5bGVkIGZyb20gXCJAZW1vdGlvbi9zdHlsZWRcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBMb2NrZWRSZWNvcmQgfSBmcm9tIFwiLi4vTG9ja2VkUmVjb3JkXCI7XG5pbXBvcnQgeyBJUmVjb3JkTG9ja2luZ0xvY2tSZWNvcmQgfSBmcm9tIFwifi90eXBlc1wiO1xuXG5jb25zdCBEZXRhaWxzQ29udGFpbmVyID0gc3R5bGVkKFwiZGl2XCIpKHtcbiAgICBoZWlnaHQ6IFwiY2FsYygxMDAlIC0gMTBweClcIixcbiAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgIG5hdjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tbWRjLXRoZW1lLXN1cmZhY2UpXCJcbiAgICB9XG59KTtcblxuY29uc3QgUmVuZGVyQmxvY2sgPSBzdHlsZWQoXCJkaXZcIikoe1xuICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgekluZGV4OiAwLFxuICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1tZGMtdGhlbWUtYmFja2dyb3VuZClcIixcbiAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgIHBhZGRpbmc6IDI1XG59KTtcblxuY29uc3QgZWxldmF0aW9uU3R5bGVzID0gY3NzKHtcbiAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgIGhlaWdodDogXCIxMDAlXCJcbn0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb250ZW50RW50cnlHdWFyZFByb3BzIHtcbiAgICBjaGlsZHJlbjogUmVhY3QuUmVhY3RFbGVtZW50O1xufVxuXG5leHBvcnQgY29uc3QgQ29udGVudEVudHJ5R3VhcmQgPSAocHJvcHM6IElDb250ZW50RW50cnlHdWFyZFByb3BzKSA9PiB7XG4gICAgY29uc3QgeyBsb2FkaW5nLCBlbnRyeSwgY29udGVudE1vZGVsOiBtb2RlbCB9ID0gdXNlQ29udGVudEVudHJ5KCk7XG4gICAgY29uc3QgeyBjaGlsZHJlbiB9ID0gcHJvcHM7XG4gICAgY29uc3QgeyBmZXRjaExvY2tlZEVudHJ5TG9ja1JlY29yZCB9ID0gdXNlUmVjb3JkTG9ja2luZygpO1xuXG4gICAgY29uc3QgW2xvY2tlZCwgc2V0TG9ja2VkXSA9IHVzZVN0YXRlPElSZWNvcmRMb2NraW5nTG9ja1JlY29yZCB8IG51bGwgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoIWVudHJ5LmlkIHx8IGxvYWRpbmcgfHwgbG9ja2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hMb2NrZWRFbnRyeUxvY2tSZWNvcmQoe1xuICAgICAgICAgICAgICAgIGlkOiBlbnRyeS5pZCxcbiAgICAgICAgICAgICAgICAkbG9ja2luZ1R5cGU6IG1vZGVsLm1vZGVsSWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2V0TG9ja2VkKHJlc3VsdCk7XG4gICAgICAgIH0pKCk7XG4gICAgfSwgW2VudHJ5LmlkLCBsb2FkaW5nXSk7XG5cbiAgICBpZiAobG9ja2VkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxEZXRhaWxzQ29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxSZW5kZXJCbG9jaz5cbiAgICAgICAgICAgICAgICAgICAgPEVsZXZhdGlvbiB6PXsyfSBjbGFzc05hbWU9e2VsZXZhdGlvblN0eWxlc30+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Q2lyY3VsYXJQcm9ncmVzcyAvPlxuICAgICAgICAgICAgICAgICAgICA8L0VsZXZhdGlvbj5cbiAgICAgICAgICAgICAgICA8L1JlbmRlckJsb2NrPlxuICAgICAgICAgICAgPC9EZXRhaWxzQ29udGFpbmVyPlxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZiAobG9ja2VkKSB7XG4gICAgICAgIHJldHVybiA8TG9ja2VkUmVjb3JkIHJlY29yZD17bG9ja2VkfSAvPjtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hpbGRyZW47XG59O1xuIl19 */",
|
|
45
|
-
toString: _EMOTION_STRINGIFIED_CSS_ERROR__
|
|
46
|
-
});
|
|
47
|
-
var elevationStyles = (0, _emotion.css)({
|
|
48
|
-
position: "relative",
|
|
49
|
-
height: "100%"
|
|
50
|
-
});
|
|
51
|
-
var ContentEntryGuard = exports.ContentEntryGuard = function ContentEntryGuard(props) {
|
|
52
|
-
var _useContentEntry = (0, _appHeadlessCms.useContentEntry)(),
|
|
53
|
-
loading = _useContentEntry.loading,
|
|
54
|
-
entry = _useContentEntry.entry,
|
|
55
|
-
model = _useContentEntry.contentModel;
|
|
56
|
-
var children = props.children;
|
|
57
|
-
var _useRecordLocking = (0, _hooks.useRecordLocking)(),
|
|
58
|
-
fetchLockedEntryLockRecord = _useRecordLocking.fetchLockedEntryLockRecord;
|
|
59
|
-
var _useState = (0, _react.useState)(undefined),
|
|
60
|
-
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
61
|
-
locked = _useState2[0],
|
|
62
|
-
setLocked = _useState2[1];
|
|
63
|
-
(0, _react.useEffect)(function () {
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
|
2
|
+
import { useRecordLocking } from "../../hooks/index.js";
|
|
3
|
+
import { LockedRecord } from "../LockedRecord/index.js";
|
|
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(() => {
|
|
64
17
|
if (!entry.id || loading || locked !== undefined) {
|
|
65
18
|
return;
|
|
66
19
|
}
|
|
67
|
-
(async
|
|
68
|
-
|
|
20
|
+
(async () => {
|
|
21
|
+
const result = await fetchLockedEntryLockRecord({
|
|
69
22
|
id: entry.id,
|
|
70
23
|
$lockingType: model.modelId
|
|
71
24
|
});
|
|
@@ -73,12 +26,13 @@ var ContentEntryGuard = exports.ContentEntryGuard = function ContentEntryGuard(p
|
|
|
73
26
|
})();
|
|
74
27
|
}, [entry.id, loading]);
|
|
75
28
|
if (locked === undefined) {
|
|
76
|
-
return /*#__PURE__*/
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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..."
|
|
33
|
+
}));
|
|
80
34
|
} else if (locked) {
|
|
81
|
-
return /*#__PURE__*/
|
|
35
|
+
return /*#__PURE__*/React.createElement(LockedRecord, {
|
|
82
36
|
record: locked
|
|
83
37
|
});
|
|
84
38
|
}
|
|
@@ -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","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,7 +1,11 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { IRecordLockingIdentity, IRecordLockingLockRecord } from "../../types";
|
|
3
|
-
import { IncomingGenericData } from "@webiny/app-websockets";
|
|
2
|
+
import type { IRecordLockingIdentity, IRecordLockingLockRecord } from "../../types.js";
|
|
3
|
+
import type { IncomingGenericData } from "@webiny/app-websockets";
|
|
4
|
+
import type { CmsContentEntry, CmsModel } from "@webiny/app-headless-cms/types.js";
|
|
4
5
|
export interface IContentEntryLockerProps {
|
|
6
|
+
entry: CmsContentEntry;
|
|
7
|
+
model: CmsModel;
|
|
8
|
+
onEntryUnlocked: () => void;
|
|
5
9
|
onDisablePrompt: (flag: boolean) => void;
|
|
6
10
|
children: React.ReactElement;
|
|
7
11
|
}
|
|
@@ -11,4 +15,4 @@ export interface IKickOutWebsocketsMessage extends IncomingGenericData {
|
|
|
11
15
|
user: IRecordLockingIdentity;
|
|
12
16
|
};
|
|
13
17
|
}
|
|
14
|
-
export declare const ContentEntryLocker: ({ onDisablePrompt, children }: IContentEntryLockerProps) => React.JSX.Element;
|
|
18
|
+
export declare const ContentEntryLocker: ({ onEntryUnlocked, onDisablePrompt, entry, model, children }: IContentEntryLockerProps) => React.JSX.Element;
|
|
@@ -1,108 +1,106 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var _react = _interopRequireWildcard(require("react"));
|
|
12
|
-
var _hooks = require("../../hooks");
|
|
13
|
-
var _appWebsockets = require("@webiny/app-websockets");
|
|
14
|
-
var _utils = require("@webiny/utils");
|
|
15
|
-
var _appAdmin = require("@webiny/app-admin");
|
|
16
|
-
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)."; }
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnRlbnRFbnRyeUxvY2tlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYXdCIiwiZmlsZSI6IkNvbnRlbnRFbnRyeUxvY2tlci50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VDb250ZW50RW50cmllc0xpc3QsIHVzZUNvbnRlbnRFbnRyeSB9IGZyb20gXCJAd2ViaW55L2FwcC1oZWFkbGVzcy1jbXNcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlUmVjb3JkTG9ja2luZyB9IGZyb20gXCJ+L2hvb2tzXCI7XG5pbXBvcnQgeyBJSXNSZWNvcmRMb2NrZWRQYXJhbXMsIElSZWNvcmRMb2NraW5nSWRlbnRpdHksIElSZWNvcmRMb2NraW5nTG9ja1JlY29yZCB9IGZyb20gXCJ+L3R5cGVzXCI7XG5pbXBvcnQge1xuICAgIEluY29taW5nR2VuZXJpY0RhdGEsXG4gICAgSVdlYnNvY2tldHNTdWJzY3JpcHRpb24sXG4gICAgdXNlV2Vic29ja2V0c1xufSBmcm9tIFwiQHdlYmlueS9hcHAtd2Vic29ja2V0c1wiO1xuaW1wb3J0IHsgcGFyc2VJZGVudGlmaWVyIH0gZnJvbSBcIkB3ZWJpbnkvdXRpbHNcIjtcbmltcG9ydCB7IHVzZURpYWxvZ3MgfSBmcm9tIFwiQHdlYmlueS9hcHAtYWRtaW5cIjtcbmltcG9ydCBzdHlsZWQgZnJvbSBcIkBlbW90aW9uL3N0eWxlZFwiO1xuXG5jb25zdCBCb2xkID0gc3R5bGVkLnNwYW5gXG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcbmA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRlbnRFbnRyeUxvY2tlclByb3BzIHtcbiAgICBvbkRpc2FibGVQcm9tcHQ6IChmbGFnOiBib29sZWFuKSA9PiB2b2lkO1xuICAgIGNoaWxkcmVuOiBSZWFjdC5SZWFjdEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUtpY2tPdXRXZWJzb2NrZXRzTWVzc2FnZSBleHRlbmRzIEluY29taW5nR2VuZXJpY0RhdGEge1xuICAgIGRhdGE6IHtcbiAgICAgICAgcmVjb3JkOiBJUmVjb3JkTG9ja2luZ0xvY2tSZWNvcmQ7XG4gICAgICAgIHVzZXI6IElSZWNvcmRMb2NraW5nSWRlbnRpdHk7XG4gICAgfTtcbn1cbmludGVyZmFjZSBJRm9yY2VVbmxvY2tlZFByb3BzIHtcbiAgICB1c2VyOiBJUmVjb3JkTG9ja2luZ0lkZW50aXR5O1xufVxuY29uc3QgRm9yY2VVbmxvY2tlZCA9ICh7IHVzZXIgfTogSUZvcmNlVW5sb2NrZWRQcm9wcykgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgICBUaGUgZW50cnkgeW91IHdlcmUgZWRpdGluZyB3YXMgZm9yY2VmdWxseSB1bmxvY2tlZCBieXtcIiBcIn1cbiAgICAgICAgICAgIDxCb2xkPnt1c2VyLmRpc3BsYXlOYW1lIHx8IFwiVW5rbm93biB1c2VyXCJ9PC9Cb2xkPi4gVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyB5b3UgbG9zdFxuICAgICAgICAgICAgdGhlIHVuc2F2ZWQgY2hhbmdlcy5cbiAgICAgICAgPC8+XG4gICAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBDb250ZW50RW50cnlMb2NrZXIgPSAoeyBvbkRpc2FibGVQcm9tcHQsIGNoaWxkcmVuIH06IElDb250ZW50RW50cnlMb2NrZXJQcm9wcykgPT4ge1xuICAgIGNvbnN0IHsgZW50cnksIGNvbnRlbnRNb2RlbDogbW9kZWwgfSA9IHVzZUNvbnRlbnRFbnRyeSgpO1xuICAgIGNvbnN0IHsgdXBkYXRlRW50cnlMb2NrLCB1bmxvY2tFbnRyeSwgZmV0Y2hMb2NrZWRFbnRyeUxvY2tSZWNvcmQsIHJlbW92ZUVudHJ5TG9jayB9ID1cbiAgICAgICAgdXNlUmVjb3JkTG9ja2luZygpO1xuXG4gICAgY29uc3QgeyBuYXZpZ2F0ZVRvIH0gPSB1c2VDb250ZW50RW50cmllc0xpc3QoKTtcblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHVzZVJlZjxJV2Vic29ja2V0c1N1YnNjcmlwdGlvbjxhbnk+PigpO1xuXG4gICAgY29uc3Qgd2Vic29ja2V0cyA9IHVzZVdlYnNvY2tldHMoKTtcblxuICAgIGNvbnN0IHsgc2hvd0RpYWxvZyB9ID0gdXNlRGlhbG9ncygpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFlbnRyeS5pZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnNjcmlwdGlvbi5jdXJyZW50KSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uY3VycmVudC5vZmYoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGlkOiBlbnRyeUlkIH0gPSBwYXJzZUlkZW50aWZpZXIoZW50cnkuaWQpO1xuXG4gICAgICAgIHN1YnNjcmlwdGlvbi5jdXJyZW50ID0gd2Vic29ja2V0cy5vbk1lc3NhZ2U8SUtpY2tPdXRXZWJzb2NrZXRzTWVzc2FnZT4oXG4gICAgICAgICAgICBgcmVjb3JkTG9ja2luZy5lbnRyeS5raWNrT3V0LiR7ZW50cnlJZH1gLFxuICAgICAgICAgICAgYXN5bmMgaW5jb21pbmcgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdXNlciB9ID0gaW5jb21pbmcuZGF0YTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWNvcmQ6IElJc1JlY29yZExvY2tlZFBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVudHJ5SWQsXG4gICAgICAgICAgICAgICAgICAgICRsb2NraW5nVHlwZTogbW9kZWwubW9kZWxJZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmVtb3ZlRW50cnlMb2NrKHJlY29yZCk7XG4gICAgICAgICAgICAgICAgb25EaXNhYmxlUHJvbXB0KHRydWUpO1xuICAgICAgICAgICAgICAgIHNob3dEaWFsb2coe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJFbnRyeSB3YXMgZm9yY2VmdWxseSB1bmxvY2tlZCFcIixcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogPEZvcmNlVW5sb2NrZWQgdXNlcj17dXNlcn0gLz4sXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdExhYmVsOiBcIk9rXCIsXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsTGFiZWw6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5hdmlnYXRlVG8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24uY3VycmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5jdXJyZW50Lm9mZigpO1xuICAgICAgICB9O1xuICAgIH0sIFtlbnRyeS5pZCwgbmF2aWdhdGVUbywgbW9kZWwubW9kZWxJZF0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFlbnRyeS5pZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkOiBJSXNSZWNvcmRMb2NrZWRQYXJhbXMgPSB7XG4gICAgICAgICAgICBpZDogZW50cnkuaWQsXG4gICAgICAgICAgICAkbG9ja2luZ1R5cGU6IG1vZGVsLm1vZGVsSWRcbiAgICAgICAgfTtcbiAgICAgICAgdXBkYXRlRW50cnlMb2NrKHJlY29yZCk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hMb2NrZWRFbnRyeUxvY2tSZWNvcmQocmVjb3JkKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdW5sb2NrRW50cnkocmVjb3JkKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH07XG4gICAgfSwgW2VudHJ5LmlkXSk7XG5cbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+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/index.js";
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
(0, _react.useEffect)(function () {
|
|
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(() => {
|
|
53
29
|
if (!entry.id) {
|
|
54
30
|
return;
|
|
55
|
-
} else if (subscription.current) {
|
|
56
|
-
subscription.current.off();
|
|
57
31
|
}
|
|
58
|
-
|
|
59
|
-
entryId
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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;
|
|
39
|
+
onDisablePrompt(true);
|
|
40
|
+
removeEntryLock({
|
|
63
41
|
id: entryId,
|
|
64
42
|
$lockingType: model.modelId
|
|
65
|
-
};
|
|
66
|
-
removeEntryLock(record);
|
|
67
|
-
onDisablePrompt(true);
|
|
43
|
+
});
|
|
68
44
|
showDialog({
|
|
69
45
|
title: "Entry was forcefully unlocked!",
|
|
70
|
-
content: /*#__PURE__*/
|
|
46
|
+
content: /*#__PURE__*/React.createElement(ForceUnlocked, {
|
|
71
47
|
user: user
|
|
72
48
|
}),
|
|
73
49
|
acceptLabel: "Ok",
|
|
74
50
|
onClose: undefined,
|
|
75
51
|
cancelLabel: undefined
|
|
76
52
|
});
|
|
77
|
-
|
|
53
|
+
onEntryUnlocked();
|
|
78
54
|
});
|
|
79
|
-
return
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
55
|
+
return () => {
|
|
56
|
+
onMessageSub.off();
|
|
57
|
+
/**
|
|
58
|
+
* Lets null subscriptions, just in case it...
|
|
59
|
+
*/
|
|
60
|
+
// @ts-expect-error
|
|
61
|
+
onMessageSub = null;
|
|
84
62
|
};
|
|
85
|
-
}, [entry.id,
|
|
86
|
-
|
|
63
|
+
}, [entry.id, onEntryUnlocked, model.modelId]);
|
|
64
|
+
useEffect(() => {
|
|
87
65
|
if (!entry.id) {
|
|
88
66
|
return;
|
|
89
67
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
68
|
+
if (entryLockerTimeout.current) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const updateLock = async () => {
|
|
72
|
+
const result = await updateEntryLock({
|
|
73
|
+
id: entry.id,
|
|
74
|
+
$lockingType: model.modelId
|
|
75
|
+
});
|
|
76
|
+
if (result.error) {
|
|
77
|
+
showDialog({
|
|
78
|
+
title: "There was an error while updating the entry lock.",
|
|
79
|
+
content: result.error.message,
|
|
80
|
+
acceptLabel: "Ok",
|
|
81
|
+
onClose: undefined,
|
|
82
|
+
cancelLabel: undefined
|
|
83
|
+
});
|
|
84
|
+
onEntryUnlocked();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
createTimeout();
|
|
93
88
|
};
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
89
|
+
const createTimeout = () => {
|
|
90
|
+
entryLockerTimeout.current = window.setTimeout(() => {
|
|
91
|
+
updateLock();
|
|
92
|
+
}, autoUpdateTimeout * 1000);
|
|
93
|
+
};
|
|
94
|
+
updateLock();
|
|
95
|
+
return () => {
|
|
96
|
+
if (!entryLockerTimeout.current) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
clearTimeout(entryLockerTimeout.current);
|
|
100
|
+
entryLockerTimeout.current = null;
|
|
103
101
|
};
|
|
104
|
-
}, [entry.id]);
|
|
105
|
-
return /*#__PURE__*/
|
|
102
|
+
}, [entry.id, onEntryUnlocked]);
|
|
103
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, children);
|
|
106
104
|
};
|
|
107
105
|
|
|
108
106
|
//# sourceMappingURL=ContentEntryLocker.js.map
|