@riboseinc/paneron-registry-kit 2.2.11 → 2.2.13
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/index.d.ts +2 -4
- package/package.json +2 -2
- package/types/cr.d.ts +5 -1
- package/types/cr.js +6 -2
- package/types/cr.js.map +1 -1
- package/types/util.d.ts +2 -0
- package/types/util.js.map +1 -1
- package/types/views.d.ts +22 -0
- package/types/views.js.map +1 -1
- package/views/BrowserCtx.d.ts +3 -11
- package/views/BrowserCtx.js +1 -0
- package/views/BrowserCtx.js.map +1 -1
- package/views/FilterCriteria/criteriaGroupToQueryExpression.d.ts +1 -1
- package/views/FilterCriteria/criteriaGroupToQueryExpression.js.map +1 -1
- package/views/FilterCriteria/models.d.ts +1 -1
- package/views/FilterCriteria/models.js.map +1 -1
- package/views/GenericRelatedItemView.js +7 -4
- package/views/GenericRelatedItemView.js.map +1 -1
- package/views/SearchQuery.js +34 -15
- package/views/SearchQuery.js.map +1 -1
- package/views/change-request/ChangeRequestContext.d.ts +13 -6
- package/views/change-request/ChangeRequestContext.js +84 -4
- package/views/change-request/ChangeRequestContext.js.map +1 -1
- package/views/change-request/Proposals.d.ts +16 -3
- package/views/change-request/Proposals.js +175 -79
- package/views/change-request/Proposals.js.map +1 -1
- package/views/change-request/objectChangeset.d.ts +7 -4
- package/views/change-request/objectChangeset.js +59 -22
- package/views/change-request/objectChangeset.js.map +1 -1
- package/views/change-request/util.d.ts +4 -0
- package/views/change-request/util.js +14 -0
- package/views/change-request/util.js.map +1 -0
- package/views/detail/ChangeRequest/index.js +16 -16
- package/views/detail/ChangeRequest/index.js.map +1 -1
- package/views/detail/RegisterHome/ActiveProposalDetails.d.ts +15 -0
- package/views/detail/RegisterHome/ActiveProposalDetails.js +105 -0
- package/views/detail/RegisterHome/ActiveProposalDetails.js.map +1 -0
- package/views/detail/RegisterHome/Block.d.ts +29 -0
- package/views/detail/RegisterHome/Block.js +75 -0
- package/views/detail/RegisterHome/Block.js.map +1 -0
- package/views/detail/RegisterHome/MetaSummary.js +7 -3
- package/views/detail/RegisterHome/MetaSummary.js.map +1 -1
- package/views/detail/RegisterHome/Proposal.d.ts +1 -11
- package/views/detail/RegisterHome/Proposal.js +113 -45
- package/views/detail/RegisterHome/Proposal.js.map +1 -1
- package/views/detail/RegisterHome/index.js +145 -148
- package/views/detail/RegisterHome/index.js.map +1 -1
- package/views/detail/RegisterItem/index.js +5 -4
- package/views/detail/RegisterItem/index.js.map +1 -1
- package/views/hooks/useCustomView.js +1 -1
- package/views/hooks/useCustomView.js.map +1 -1
- package/views/index.js +5 -3
- package/views/index.js.map +1 -1
- package/views/sidebar/Search/index.js +12 -2
- package/views/sidebar/Search/index.js.map +1 -1
- package/views/util.d.ts +26 -17
- package/views/util.js +50 -50
- package/views/util.js.map +1 -1
|
@@ -2,31 +2,38 @@
|
|
|
2
2
|
/** @jsxFrag React.Fragment */
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { type SomeCR as CR } from '../../types/cr';
|
|
5
|
+
import type { RegisterItem, Payload, ChangeProposal, InternalItemReference } from '../../types';
|
|
5
6
|
export interface ChangeRequestContextSpec {
|
|
6
7
|
/**
|
|
7
8
|
* Change request object, undefined if not available/loading,
|
|
8
|
-
* null
|
|
9
|
+
* null is out of ordinary (i.e. changeRequestID is not given).
|
|
9
10
|
*/
|
|
10
11
|
changeRequest?: CR | null;
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
+
* Contents of current CR can be edited by current stakeholder.
|
|
13
14
|
* Always false if `changeRequest` is not defined or `null`.
|
|
14
15
|
*/
|
|
15
16
|
canEdit: boolean;
|
|
16
17
|
/**
|
|
17
|
-
* Current
|
|
18
|
+
* Current CR can be transitioned by current stsakeholder.
|
|
18
19
|
* Always false if `changeRequest` is not defined or `null`.
|
|
19
20
|
*/
|
|
20
21
|
canTransition: boolean;
|
|
21
22
|
/**
|
|
22
|
-
* Current
|
|
23
|
+
* Current CR can be deleted by current stakeholder.
|
|
23
24
|
* Always false if `changeRequest` is not defined or `null`.
|
|
24
25
|
*/
|
|
25
26
|
canDelete: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Propose new blank item of given item class.
|
|
29
|
+
* Will always be undefined if `canEdit` is not `true`.
|
|
30
|
+
*/
|
|
31
|
+
proposeBlankItem?: (clsID: string) => Promise<InternalItemReference>;
|
|
32
|
+
updateItemProposal?: (summary: string, proposal: ChangeProposal | null, itemPath: string, item?: RegisterItem<any>, itemData?: Payload) => Promise<void>;
|
|
26
33
|
/**
|
|
27
34
|
* Function that performs CR deletion.
|
|
28
|
-
* May not be present
|
|
29
|
-
*
|
|
35
|
+
* May not be present if operation is not possible right now,
|
|
36
|
+
* but otherwise is present if `canDelete` is true.
|
|
30
37
|
*/
|
|
31
38
|
deleteCR?: () => Promise<void>;
|
|
32
39
|
}
|
|
@@ -13,12 +13,16 @@ var _context = require("@riboseinc/paneron-extension-kit/context");
|
|
|
13
13
|
|
|
14
14
|
var _cr = require("../../types/cr");
|
|
15
15
|
|
|
16
|
+
var _types = require("../../types");
|
|
17
|
+
|
|
16
18
|
var _BrowserCtx = require("../BrowserCtx");
|
|
17
19
|
|
|
18
20
|
var _itemPathUtils = require("../itemPathUtils");
|
|
19
21
|
|
|
20
22
|
var _TransitionOptions = require("./TransitionOptions");
|
|
21
23
|
|
|
24
|
+
var _objectChangeset = require("./objectChangeset");
|
|
25
|
+
|
|
22
26
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
27
|
|
|
24
28
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
@@ -43,11 +47,15 @@ const ChangeRequestContextProvider = function ({
|
|
|
43
47
|
|
|
44
48
|
const {
|
|
45
49
|
useObjectData,
|
|
50
|
+
makeRandomID,
|
|
51
|
+
updateObjects,
|
|
46
52
|
updateTree,
|
|
47
53
|
performOperation,
|
|
48
54
|
isBusy
|
|
49
55
|
} = (0, _react2.useContext)(_context.DatasetContext);
|
|
50
56
|
const {
|
|
57
|
+
itemClasses,
|
|
58
|
+
subregisters,
|
|
51
59
|
stakeholder
|
|
52
60
|
} = (0, _react2.useContext)(_BrowserCtx.BrowserCtx);
|
|
53
61
|
const crPath = changeRequestID ? `/proposals/${changeRequestID}/main.yaml` : null;
|
|
@@ -60,21 +68,93 @@ const ChangeRequestContextProvider = function ({
|
|
|
60
68
|
const canDelete = changeRequest && stakeholder && (0, _cr.canBeDeletedBy)(stakeholder, changeRequest) ? true : false;
|
|
61
69
|
const crItemEntries = Object.entries((_c = changeRequest === null || changeRequest === void 0 ? void 0 : changeRequest.items) !== null && _c !== void 0 ? _c : []).map(i => JSON.stringify(i));
|
|
62
70
|
const hasItems = crItemEntries.length > 0;
|
|
63
|
-
const deleteCR = (0, _react2.useMemo)(() => !isBusy &&
|
|
71
|
+
const deleteCR = (0, _react2.useMemo)(() => !isBusy && canDelete && updateTree ? performOperation('deleting proposal', async function handleDelete() {
|
|
64
72
|
const subtreeRoot = (0, _itemPathUtils.crIDToCRPath)(changeRequest.id).replace('/main.yaml', '');
|
|
65
73
|
await updateTree({
|
|
66
74
|
subtreeRoot,
|
|
67
75
|
newSubtreeRoot: null,
|
|
68
76
|
commitMessage: 'remove unproposed CR draft'
|
|
69
77
|
});
|
|
70
|
-
}) : undefined, [isBusy, performOperation, updateTree, hasItems, canDelete
|
|
78
|
+
}) : undefined, [isBusy, performOperation, updateTree, hasItems, canDelete]);
|
|
79
|
+
const proposeBlankItem = (0, _react2.useMemo)(() => {
|
|
80
|
+
if (!updateObjects || !makeRandomID || !canEdit || !changeRequest) {
|
|
81
|
+
return undefined;
|
|
82
|
+
} else {
|
|
83
|
+
return performOperation('creating blank item', async function _createItem(classID, subregisterID) {
|
|
84
|
+
var _a;
|
|
85
|
+
|
|
86
|
+
if (subregisters && !subregisterID) {
|
|
87
|
+
throw new Error("Unable to create item: register uses subregisters, but subregister ID was not provided");
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const clsConfig = itemClasses[classID];
|
|
91
|
+
|
|
92
|
+
if (!clsConfig) {
|
|
93
|
+
throw new Error("Unable to generate new item data: item class configuration is missing");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const initialItemData = (_a = clsConfig === null || clsConfig === void 0 ? void 0 : clsConfig.defaults) !== null && _a !== void 0 ? _a : {};
|
|
97
|
+
const itemID = await makeRandomID();
|
|
98
|
+
const ref = {
|
|
99
|
+
classID,
|
|
100
|
+
itemID,
|
|
101
|
+
subregisterID
|
|
102
|
+
};
|
|
103
|
+
const registerItem = {
|
|
104
|
+
id: itemID,
|
|
105
|
+
dateAccepted: new Date(),
|
|
106
|
+
status: 'valid',
|
|
107
|
+
data: initialItemData
|
|
108
|
+
};
|
|
109
|
+
const itemPath = (0, _itemPathUtils.itemRefToItemPath)(ref);
|
|
110
|
+
await updateObjects({
|
|
111
|
+
commitMessage: `propose to add new ${ref.classID}`,
|
|
112
|
+
objectChangeset: (0, _objectChangeset.updateCRObjectChangeset)(changeRequest, {
|
|
113
|
+
[itemPath]: {
|
|
114
|
+
type: 'addition'
|
|
115
|
+
}
|
|
116
|
+
}, {
|
|
117
|
+
[itemPath]: registerItem
|
|
118
|
+
}),
|
|
119
|
+
_dangerouslySkipValidation: true
|
|
120
|
+
});
|
|
121
|
+
return ref;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}, [changeRequest, canEdit, subregisters === undefined, updateObjects, makeRandomID]);
|
|
125
|
+
const updateItemProposal = (0, _react2.useMemo)(() => changeRequest && canEdit && updateObjects ? async function _handleSetProposal(summary, proposal, itemPath, item, editedItemData) {
|
|
126
|
+
if (proposal && !item) {
|
|
127
|
+
throw new Error("Missing item");
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (proposal && (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'amendment' && (!editedItemData || !(0, _types.isRegisterItem)(editedItemData))) {
|
|
131
|
+
throw new Error("Missing item data");
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
await updateObjects({
|
|
135
|
+
commitMessage: `${summary} for ${itemPath}`,
|
|
136
|
+
objectChangeset: (0, _objectChangeset.updateCRObjectChangeset)( // TODO: We are sure it’s editable already, but casting should be avoided
|
|
137
|
+
changeRequest, {
|
|
138
|
+
[itemPath]: proposal
|
|
139
|
+
}, proposal && (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'amendment' && editedItemData && item ? {
|
|
140
|
+
[itemPath]: { ...item,
|
|
141
|
+
data: editedItemData
|
|
142
|
+
}
|
|
143
|
+
} : {}),
|
|
144
|
+
// We need this because updateCRObjectChangeset
|
|
145
|
+
// omits oldValue for item data payloads.
|
|
146
|
+
_dangerouslySkipValidation: true
|
|
147
|
+
});
|
|
148
|
+
} : undefined, [canEdit, changeRequest, updateObjects]);
|
|
71
149
|
const ctx = (0, _react2.useMemo)(() => ({
|
|
72
150
|
changeRequest,
|
|
73
151
|
canEdit,
|
|
74
152
|
canTransition,
|
|
75
153
|
canDelete,
|
|
76
|
-
deleteCR
|
|
77
|
-
|
|
154
|
+
deleteCR,
|
|
155
|
+
proposeBlankItem,
|
|
156
|
+
updateItemProposal
|
|
157
|
+
}), [changeRequest, canEdit, deleteCR, canDelete, proposeBlankItem, updateItemProposal]);
|
|
78
158
|
return (0, _react.jsx)(ChangeRequestContext.Provider, {
|
|
79
159
|
value: ctx
|
|
80
160
|
}, children);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeRequestContext.js","sourceRoot":"","sources":["../../../src/views/change-request/ChangeRequestContext.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx } from '@emotion/react';\nimport React, { useMemo, useContext } from 'react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { type SomeCR as CR, type Proposed, canBeDeletedBy, canBeEditedBy } from '../../types/cr';\nimport { BrowserCtx } from '../BrowserCtx';\nimport { crIDToCRPath } from '../itemPathUtils';\nimport { canBeTransitionedBy } from './TransitionOptions';\n\n\nexport interface ChangeRequestContextSpec {\n /**\n * Change request object, undefined if not available/loading,\n * null if not expected (i.e. changeRequestID is not given).\n */\n changeRequest?: CR | null\n\n /**\n * Current user is eligible to edit the contents of this CR.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canEdit: boolean\n\n /**\n * Current user is eligible to transition the contents of this CR.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canTransition: boolean\n\n /**\n * Current user is eligible to delete this CR.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canDelete: boolean\n\n /**\n * Function that performs CR deletion.\n * May not be present even if `canDelete` is true for variuos reasons\n * (e.g., another action is in progress).\n */\n deleteCR?: () => Promise<void>\n\n}\n\nexport const ChangeRequestContext = React.createContext<ChangeRequestContextSpec>({\n changeRequest: null,\n canEdit: false,\n canTransition: false,\n canDelete: false,\n});\n\nexport const ChangeRequestContextProvider: React.FC<{\n changeRequestID: string | null\n}> = function ({ changeRequestID, children }) {\n const { useObjectData, updateTree, performOperation, isBusy } = useContext(DatasetContext);\n const { stakeholder } = useContext(BrowserCtx);\n\n const crPath = changeRequestID\n ? `/proposals/${changeRequestID}/main.yaml`\n : null;\n\n const changeRequest = useObjectData({\n objectPaths: crPath ? [crPath] : [],\n nounLabel: 'proposal(s)',\n }).value?.data[crPath ?? ''] as CR ?? (crPath ? undefined : null);\n\n const canEdit = changeRequest\n && stakeholder\n && canBeEditedBy(stakeholder, changeRequest)\n ? true\n : false;\n\n const canTransition = changeRequest\n && stakeholder\n && canBeTransitionedBy(stakeholder, changeRequest)\n ? true\n : false;\n\n const canDelete = changeRequest\n && stakeholder\n && canBeDeletedBy(stakeholder, changeRequest)\n ? true\n : false;\n\n const crItemEntries = Object.entries(changeRequest?.items ?? []).map(i => JSON.stringify(i));\n const hasItems = crItemEntries.length > 0;\n\n const deleteCR = useMemo((() =>\n !isBusy && changeRequest?.id && canDelete && updateTree && !hasItems && !(changeRequest as Proposed).timeProposed\n ? performOperation('deleting proposal', async function handleDelete() {\n const subtreeRoot = crIDToCRPath(changeRequest.id).replace('/main.yaml', '');\n await updateTree({\n subtreeRoot,\n newSubtreeRoot: null,\n commitMessage: 'remove unproposed CR draft',\n });\n })\n : undefined\n ), [\n isBusy, performOperation,\n updateTree,\n hasItems, canDelete,\n changeRequest?.id, (changeRequest as Proposed)?.timeProposed]);\n\n const ctx: ChangeRequestContextSpec = useMemo((() => ({\n changeRequest,\n canEdit,\n canTransition,\n canDelete,\n deleteCR,\n })), [changeRequest, canEdit, deleteCR, canDelete]);\n\n return (\n <ChangeRequestContext.Provider value={ctx}>\n {children}\n </ChangeRequestContext.Provider>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ChangeRequestContext.js","sourceRoot":"","sources":["../../../src/views/change-request/ChangeRequestContext.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx } from '@emotion/react';\nimport React, { useMemo, useContext } from 'react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { type SomeCR as CR, canBeDeletedBy, canBeEditedBy } from '../../types/cr';\nimport type { RegisterItem, Payload, ChangeProposal, InternalItemReference } from '../../types';\nimport { isRegisterItem } from '../../types';\nimport { BrowserCtx } from '../BrowserCtx';\nimport { itemRefToItemPath, crIDToCRPath } from '../itemPathUtils';\nimport { canBeTransitionedBy } from './TransitionOptions';\nimport { updateCRObjectChangeset } from './objectChangeset';\n\n\nexport interface ChangeRequestContextSpec {\n /**\n * Change request object, undefined if not available/loading,\n * null is out of ordinary (i.e. changeRequestID is not given).\n */\n changeRequest?: CR | null\n\n /**\n * Contents of current CR can be edited by current stakeholder.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canEdit: boolean\n\n /**\n * Current CR can be transitioned by current stsakeholder.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canTransition: boolean\n\n /**\n * Current CR can be deleted by current stakeholder.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canDelete: boolean\n\n /**\n * Propose new blank item of given item class.\n * Will always be undefined if `canEdit` is not `true`.\n */\n proposeBlankItem?: (clsID: string) => Promise<InternalItemReference>\n\n updateItemProposal?: (\n summary: string,\n proposal: ChangeProposal | null,\n itemPath: string,\n item?: RegisterItem<any>,\n itemData?: Payload,\n ) => Promise<void>\n\n /**\n * Function that performs CR deletion.\n * May not be present if operation is not possible right now,\n * but otherwise is present if `canDelete` is true.\n */\n deleteCR?: () => Promise<void>\n\n}\n\nexport const ChangeRequestContext = React.createContext<ChangeRequestContextSpec>({\n changeRequest: null,\n canEdit: false,\n canTransition: false,\n canDelete: false,\n});\n\nexport const ChangeRequestContextProvider: React.FC<{\n changeRequestID: string | null\n}> = function ({ changeRequestID, children }) {\n const { useObjectData, makeRandomID, updateObjects, updateTree, performOperation, isBusy } = useContext(DatasetContext);\n const { itemClasses, subregisters, stakeholder } = useContext(BrowserCtx);\n\n const crPath = changeRequestID\n ? `/proposals/${changeRequestID}/main.yaml`\n : null;\n\n const changeRequest = useObjectData({\n objectPaths: crPath ? [crPath] : [],\n nounLabel: 'proposal(s)',\n }).value?.data[crPath ?? ''] as CR ?? (crPath ? undefined : null);\n\n const canEdit = changeRequest\n && stakeholder\n && canBeEditedBy(stakeholder, changeRequest)\n ? true\n : false;\n\n const canTransition = changeRequest\n && stakeholder\n && canBeTransitionedBy(stakeholder, changeRequest)\n ? true\n : false;\n\n const canDelete = changeRequest\n && stakeholder\n && canBeDeletedBy(stakeholder, changeRequest)\n ? true\n : false;\n\n const crItemEntries = Object.entries(changeRequest?.items ?? []).map(i => JSON.stringify(i));\n const hasItems = crItemEntries.length > 0;\n\n const deleteCR = useMemo((() =>\n !isBusy && canDelete && updateTree\n ? performOperation('deleting proposal', async function handleDelete() {\n const subtreeRoot = crIDToCRPath(changeRequest.id).replace('/main.yaml', '');\n await updateTree({\n subtreeRoot,\n newSubtreeRoot: null,\n commitMessage: 'remove unproposed CR draft',\n });\n })\n : undefined\n ), [\n isBusy, performOperation,\n updateTree,\n hasItems, canDelete,\n ]);\n\n const proposeBlankItem = useMemo((() => {\n if (!updateObjects || !makeRandomID || !canEdit || !changeRequest) {\n return undefined;\n } else {\n return performOperation('creating blank item', async function _createItem(classID: string, subregisterID?: string) {\n if (subregisters && !subregisterID) {\n throw new Error(\"Unable to create item: register uses subregisters, but subregister ID was not provided\");\n }\n const clsConfig = itemClasses[classID];\n if (!clsConfig) {\n throw new Error(\"Unable to generate new item data: item class configuration is missing\");\n }\n const initialItemData = clsConfig?.defaults ?? {};\n const itemID = await makeRandomID();\n const ref: InternalItemReference = { classID, itemID, subregisterID };\n const registerItem: RegisterItem<any> = {\n id: itemID,\n dateAccepted: new Date(),\n status: 'valid',\n data: initialItemData,\n };\n const itemPath = itemRefToItemPath(ref);\n await updateObjects({\n commitMessage: `propose to add new ${ref.classID}`,\n objectChangeset: updateCRObjectChangeset(\n changeRequest as any,\n { [itemPath]: { type: 'addition' } },\n { [itemPath]: registerItem },\n ),\n _dangerouslySkipValidation: true,\n });\n return ref;\n })\n }\n }), [changeRequest, canEdit, subregisters === undefined, updateObjects, makeRandomID]);\n\n const updateItemProposal = useMemo((() =>\n changeRequest && canEdit && updateObjects\n ? async function _handleSetProposal(\n summary: string,\n proposal: ChangeProposal | null,\n itemPath: string,\n item?: RegisterItem<any>,\n editedItemData?: Payload,\n ): Promise<void> {\n if (proposal && !item) {\n throw new Error(\"Missing item\");\n }\n if (proposal && proposal?.type !== 'amendment' && (!editedItemData || !isRegisterItem(editedItemData))) {\n throw new Error(\"Missing item data\");\n }\n await updateObjects({\n commitMessage: `${summary} for ${itemPath}`,\n objectChangeset: updateCRObjectChangeset(\n // TODO: We are sure it’s editable already, but casting should be avoided\n changeRequest as any,\n { [itemPath]: proposal },\n ((proposal && proposal?.type !== 'amendment') && editedItemData && item)\n ? { [itemPath]: { ...item, data: editedItemData } }\n : {},\n ),\n // We need this because updateCRObjectChangeset\n // omits oldValue for item data payloads.\n _dangerouslySkipValidation: true,\n });\n }\n : undefined\n ), [canEdit, changeRequest, updateObjects]);\n\n const ctx: ChangeRequestContextSpec = useMemo((() => ({\n changeRequest,\n canEdit,\n canTransition,\n canDelete,\n deleteCR,\n proposeBlankItem,\n updateItemProposal,\n })), [changeRequest, canEdit, deleteCR, canDelete, proposeBlankItem, updateItemProposal]);\n\n return (\n <ChangeRequestContext.Provider value={ctx}>\n {children}\n </ChangeRequestContext.Provider>\n );\n};\n"]}
|
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
/** @jsx jsx */
|
|
2
2
|
/** @jsxFrag React.Fragment */
|
|
3
3
|
import React from 'react';
|
|
4
|
+
import { jsx } from '@emotion/react';
|
|
4
5
|
import type { ChangeProposal, Clarification, InternalItemReference, Payload, RegisterItem } from '../../types';
|
|
5
6
|
import type { Drafted } from '../../types/cr';
|
|
6
|
-
|
|
7
|
-
proposals:
|
|
7
|
+
interface ProposalBrowserProps<CR extends Drafted> {
|
|
8
|
+
proposals: CR['items'];
|
|
9
|
+
/**
|
|
10
|
+
* If provided, button to delete each proposed change
|
|
11
|
+
* is shown in change card list mode.
|
|
12
|
+
*/
|
|
13
|
+
onDeleteProposalForItemAtPath?: (itemPath: string) => void;
|
|
8
14
|
className?: string;
|
|
9
|
-
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Shows a list of individual proposed changes as cards by default,
|
|
18
|
+
* allowing to expand a proposal and view item details.
|
|
19
|
+
*
|
|
20
|
+
* If no proposals exist, returns null.
|
|
21
|
+
*/
|
|
22
|
+
export declare function Proposals<CR extends Drafted>({ proposals, onDeleteProposalForItemAtPath, className }: ProposalBrowserProps<CR>): jsx.JSX.Element | null;
|
|
10
23
|
interface ProposalProps<P extends ChangeProposal> {
|
|
11
24
|
proposal: P;
|
|
12
25
|
/** Highlight changes. */
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.Proposals = Proposals;
|
|
6
7
|
exports.default = exports.ProposalSummary = exports.ProposalDetail = void 0;
|
|
7
8
|
|
|
8
9
|
var _react = _interopRequireWildcard(require("react"));
|
|
@@ -29,6 +30,10 @@ var _useItemClassConfig = _interopRequireDefault(require("../hooks/useItemClassC
|
|
|
29
30
|
|
|
30
31
|
var _InlineDiff = require("../diffing/InlineDiff");
|
|
31
32
|
|
|
33
|
+
var _util = require("./util");
|
|
34
|
+
|
|
35
|
+
var _Block = require("../detail/RegisterHome/Block");
|
|
36
|
+
|
|
32
37
|
var _RegisterItem = require("../detail/RegisterItem");
|
|
33
38
|
|
|
34
39
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -43,9 +48,17 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
43
48
|
function stringifiedJSONEqual(i1, i2) {
|
|
44
49
|
return JSON.stringify(i1) === JSON.stringify(i2);
|
|
45
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Shows a list of individual proposed changes as cards by default,
|
|
53
|
+
* allowing to expand a proposal and view item details.
|
|
54
|
+
*
|
|
55
|
+
* If no proposals exist, returns null.
|
|
56
|
+
*/
|
|
46
57
|
|
|
47
|
-
|
|
58
|
+
|
|
59
|
+
function Proposals({
|
|
48
60
|
proposals,
|
|
61
|
+
onDeleteProposalForItemAtPath,
|
|
49
62
|
className
|
|
50
63
|
}) {
|
|
51
64
|
var _a, _b;
|
|
@@ -138,17 +151,24 @@ const Proposals = function ({
|
|
|
138
151
|
}), [proposals, getCurrentItem, getProposedItem]);
|
|
139
152
|
const haveSelectedItem = selectedProposal && selectedItemRef && proposals[selectedProposal] && (selectedItemProposed || selectedItemCurrent);
|
|
140
153
|
const proposalCount = Object.keys(proposals).length;
|
|
154
|
+
const selectedProposalDetailRef = (0, _react.useRef)(null);
|
|
141
155
|
(0, _react.useEffect)(() => {
|
|
142
|
-
if (!selectedProposal) {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
156
|
+
// if (!selectedProposal) {
|
|
157
|
+
// const firstProposal = Object.keys(proposals)[0];
|
|
158
|
+
// if (firstProposal) {
|
|
159
|
+
// if (getCurrentItem(firstProposal) || getProposedItem(firstProposal)) {
|
|
160
|
+
// selectProposal(firstProposal);
|
|
161
|
+
// }
|
|
162
|
+
// }
|
|
163
|
+
// }
|
|
164
|
+
if (selectedProposal) {
|
|
165
|
+
if (selectedProposalDetailRef.current) {
|
|
166
|
+
selectedProposalDetailRef.current.scrollIntoView({
|
|
167
|
+
block: 'center'
|
|
168
|
+
});
|
|
149
169
|
}
|
|
150
170
|
}
|
|
151
|
-
}, [
|
|
171
|
+
}, [selectedProposal === null]);
|
|
152
172
|
const canShowDiff = haveSelectedItem && ((_a = proposals[selectedProposal]) === null || _a === void 0 ? void 0 : _a.type) === 'clarification' ? true : false;
|
|
153
173
|
const showDiff = canShowDiff && preferDiff;
|
|
154
174
|
|
|
@@ -160,67 +180,144 @@ const Proposals = function ({
|
|
|
160
180
|
proposal: proposals[selectedProposal]
|
|
161
181
|
}) : (0, _react2.jsx)(_react.default.Fragment, null, "Select item\u2026");
|
|
162
182
|
const icon = haveSelectedItem ? getProposalIcon(proposals[selectedProposal]) : undefined;
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
},
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
183
|
+
|
|
184
|
+
if (proposalCount > 0 && haveSelectedItem) {
|
|
185
|
+
return (0, _react2.jsx)(_core.Card, {
|
|
186
|
+
key: selectedProposal,
|
|
187
|
+
elevation: 0,
|
|
188
|
+
css: (0, _react2.css)`
|
|
189
|
+
flex: 100%;
|
|
190
|
+
background: ${_core.Colors.LIGHT_GRAY3};
|
|
191
|
+
padding: 0;
|
|
192
|
+
min-height: 70vh;
|
|
193
|
+
|
|
194
|
+
overflow: hidden;
|
|
195
|
+
|
|
196
|
+
border-radius: 5px;
|
|
197
|
+
display: flex;
|
|
198
|
+
flex-flow: column nowrap;
|
|
199
|
+
transition:
|
|
200
|
+
width .5s linear
|
|
201
|
+
height .5s linear;
|
|
202
|
+
`,
|
|
203
|
+
className: className
|
|
204
|
+
}, (0, _react2.jsx)(_core.ButtonGroup, null, (0, _react2.jsx)(_core.Button, {
|
|
205
|
+
disabled: !jumpTo || ((_b = proposals[selectedProposal]) === null || _b === void 0 ? void 0 : _b.type) === 'addition',
|
|
206
|
+
icon: 'open-application',
|
|
207
|
+
onClick: () => jumpTo === null || jumpTo === void 0 ? void 0 : jumpTo(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${selectedProposal}`),
|
|
208
|
+
title: "Open selected item in a new tab (not applicable to proposed additions)"
|
|
209
|
+
}), (0, _react2.jsx)(_core.Button, {
|
|
210
|
+
active: preferDiff,
|
|
211
|
+
onClick: () => setPreferDiff(v => !v),
|
|
212
|
+
// Diffing only makes sense for clarifications.
|
|
213
|
+
// Additions are entire new items, and for amendments
|
|
214
|
+
// item data is unchanged.
|
|
215
|
+
disabled: !canShowDiff,
|
|
216
|
+
text: "Compare",
|
|
217
|
+
title: "Annotate proposed clarifications for this item"
|
|
218
|
+
}), (0, _react2.jsx)(_react2.ClassNames, null, ({
|
|
219
|
+
css: css2
|
|
220
|
+
}) => (0, _react2.jsx)(_select.Select2, {
|
|
221
|
+
filterable: false,
|
|
222
|
+
itemsEqual: stringifiedJSONEqual,
|
|
223
|
+
menuProps: {
|
|
224
|
+
className: css2(`max-height: 50vh; overflow-y: auto;`)
|
|
225
|
+
},
|
|
226
|
+
activeItem: activeItem,
|
|
227
|
+
items: allItems,
|
|
228
|
+
popoverProps: {
|
|
229
|
+
minimal: true,
|
|
230
|
+
matchTargetWidth: true
|
|
231
|
+
},
|
|
232
|
+
fill: true,
|
|
233
|
+
itemRenderer: ChangeProposalItemView,
|
|
234
|
+
onItemSelect: handleItemSelect
|
|
235
|
+
}, (0, _react2.jsx)(_core.Button, {
|
|
236
|
+
fill: true,
|
|
237
|
+
rightIcon: "chevron-down",
|
|
238
|
+
icon: icon,
|
|
239
|
+
css: (0, _react2.css)`white-space: nowrap;`
|
|
240
|
+
}, selectedItemSummary))), (0, _react2.jsx)(_core.Button, {
|
|
241
|
+
onClick: () => selectProposal(null),
|
|
242
|
+
icon: "minimize",
|
|
243
|
+
title: "Minimize proposed change view",
|
|
244
|
+
text: "Minimize"
|
|
245
|
+
})), (0, _react2.jsx)("div", {
|
|
246
|
+
css: (0, _react2.css)`position: relative; flex: 1;`,
|
|
247
|
+
ref: selectedProposalDetailRef
|
|
248
|
+
}, (0, _react2.jsx)(_BrowserCtx.BrowserCtx.Provider, {
|
|
249
|
+
value: proposalBrowserCtx
|
|
250
|
+
}, (0, _react2.jsx)(_ErrorBoundary.default, {
|
|
251
|
+
viewName: "Proposal detail"
|
|
252
|
+
}, (0, _react2.jsx)(ProposalDetail, {
|
|
253
|
+
itemRef: selectedItemRef,
|
|
254
|
+
showDiff: showDiff,
|
|
255
|
+
//showOnlyChanged={showOnlyChanged}
|
|
256
|
+
item: selectedItemProposed !== null && selectedItemProposed !== void 0 ? selectedItemProposed : selectedItemCurrent,
|
|
257
|
+
itemBefore: selectedItemCurrent !== null && selectedItemCurrent !== void 0 ? selectedItemCurrent : undefined,
|
|
258
|
+
proposal: proposals[selectedProposal]
|
|
259
|
+
})))));
|
|
260
|
+
} else {
|
|
261
|
+
return (0, _react2.jsx)(_react.default.Fragment, null, allItems.map(cpi => {
|
|
262
|
+
const actions = [{
|
|
263
|
+
onClick: () => selectProposal(cpi.itemPath),
|
|
264
|
+
text: "Expand",
|
|
265
|
+
title: "Expand proposed change to see item details",
|
|
266
|
+
icon: 'maximize'
|
|
267
|
+
}];
|
|
268
|
+
|
|
269
|
+
if (onDeleteProposalForItemAtPath) {
|
|
270
|
+
actions.push({
|
|
271
|
+
text: "Delete this proposal",
|
|
272
|
+
intent: 'danger',
|
|
273
|
+
onClick: () => onDeleteProposalForItemAtPath(cpi.itemPath),
|
|
274
|
+
icon: 'trash'
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return (0, _react2.jsx)(_Block.HomeBlockCard, {
|
|
279
|
+
css: (0, _react2.css)`
|
|
280
|
+
flex-basis: calc(33.33% - 10px*2/3);
|
|
281
|
+
`,
|
|
282
|
+
description: `${cpi.proposal.type} proposal`,
|
|
283
|
+
key: cpi.itemPath
|
|
284
|
+
}, (0, _react2.jsx)(ProposalType, {
|
|
285
|
+
item: cpi
|
|
286
|
+
}), (0, _react2.jsx)("div", {
|
|
287
|
+
css: (0, _react2.css)`padding: 5px; flex-grow: 1;`
|
|
288
|
+
}, cpi.item !== null ? (0, _react2.jsx)(_core.H5, {
|
|
289
|
+
css: (0, _react2.css)`margin: 0; overflow: hidden; text-overflow: ellipsis;`
|
|
290
|
+
}, (0, _react2.jsx)(ProposalSummary, {
|
|
291
|
+
itemRef: cpi.itemRef,
|
|
292
|
+
proposal: cpi.proposal,
|
|
293
|
+
itemBefore: cpi.itemBefore,
|
|
294
|
+
item: cpi.item
|
|
295
|
+
})) : (0, _react2.jsx)(_react.default.Fragment, null, "Problem reading proposed item data.")), actions.length > 0 ? (0, _react2.jsx)(_Block.HomeBlockActions, {
|
|
296
|
+
actions: actions
|
|
297
|
+
}) : null);
|
|
298
|
+
}));
|
|
299
|
+
}
|
|
216
300
|
} else {
|
|
217
|
-
return
|
|
218
|
-
icon: 'clean',
|
|
219
|
-
className: className,
|
|
220
|
-
title: "Nothing is proposed here yet."
|
|
221
|
-
});
|
|
301
|
+
return null;
|
|
222
302
|
}
|
|
223
|
-
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
;
|
|
306
|
+
|
|
307
|
+
function ProposalType({
|
|
308
|
+
item
|
|
309
|
+
}) {
|
|
310
|
+
const proposalConfig = item.proposal.type === 'amendment' ? PROPOSAL_VIEWS[item.proposal.amendmentType] : PROPOSAL_VIEWS[item.proposal.type]; //const ProposalTypeLabel: React.FC<ProposalProps<any>> = proposalConfig.summary;
|
|
311
|
+
|
|
312
|
+
const tagProps = (0, _util.proposalToTagProps)(item.proposal);
|
|
313
|
+
return (0, _react2.jsx)(_core.Tag, {
|
|
314
|
+
minimal: true,
|
|
315
|
+
...tagProps,
|
|
316
|
+
rightIcon: (0, _react2.jsx)(_HelpTooltip.default, {
|
|
317
|
+
content: (0, _react2.jsx)(_react.default.Fragment, null, "Proposed to be ", proposalConfig.hint)
|
|
318
|
+
})
|
|
319
|
+
});
|
|
320
|
+
}
|
|
224
321
|
|
|
225
322
|
const ChangeProposalItemView = (item, {
|
|
226
323
|
handleClick,
|
|
@@ -229,15 +326,12 @@ const ChangeProposalItemView = (item, {
|
|
|
229
326
|
}) => {
|
|
230
327
|
if (item.item !== null) {
|
|
231
328
|
const i = item;
|
|
232
|
-
const proposalConfig = item.proposal.type === 'amendment' ? PROPOSAL_VIEWS[item.proposal.amendmentType] : PROPOSAL_VIEWS[item.proposal.type];
|
|
233
|
-
const ProposalTypeLabel = proposalConfig.summary;
|
|
234
329
|
return (0, _react2.jsx)(_core.MenuItem, {
|
|
235
330
|
active: modifiers.active,
|
|
236
331
|
disabled: modifiers.disabled,
|
|
237
|
-
labelElement: (0, _react2.jsx)(
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
})),
|
|
332
|
+
labelElement: (0, _react2.jsx)(ProposalType, {
|
|
333
|
+
item: i
|
|
334
|
+
}),
|
|
241
335
|
key: item.itemPath,
|
|
242
336
|
onClick: handleClick,
|
|
243
337
|
icon: getProposalIcon(item.proposal),
|
|
@@ -302,7 +396,7 @@ const ProposalSummary = function ({
|
|
|
302
396
|
itemBefore,
|
|
303
397
|
onChange
|
|
304
398
|
}) {
|
|
305
|
-
var _a
|
|
399
|
+
var _a;
|
|
306
400
|
|
|
307
401
|
const {
|
|
308
402
|
itemClasses
|
|
@@ -310,13 +404,15 @@ const ProposalSummary = function ({
|
|
|
310
404
|
const {
|
|
311
405
|
classID
|
|
312
406
|
} = itemRef;
|
|
313
|
-
const
|
|
407
|
+
const cls = itemClasses[classID];
|
|
408
|
+
const ListItemView = (_a = cls === null || cls === void 0 ? void 0 : cls.views) === null || _a === void 0 ? void 0 : _a.listItemView;
|
|
314
409
|
|
|
315
410
|
if (ListItemView) {
|
|
316
|
-
return (0, _react2.jsx)(ListItemView, {
|
|
411
|
+
return (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(ListItemView, {
|
|
317
412
|
itemRef: itemRef,
|
|
318
|
-
itemData: item.data
|
|
319
|
-
|
|
413
|
+
itemData: item.data,
|
|
414
|
+
css: (0, _react2.css)`text-overflow: ellipsis; overflow: hidden;`
|
|
415
|
+
}), "\u2003", (0, _react2.jsx)("small", null, cls.meta.title));
|
|
320
416
|
} else {
|
|
321
417
|
return (0, _react2.jsx)(_ErrorState.default, {
|
|
322
418
|
viewName: "list item view",
|