@riboseinc/paneron-registry-kit 2.2.10 → 2.2.11
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.js +18 -0
- package/index.js.map +1 -1
- package/package.json +2 -2
- package/types/cr.d.ts +18 -0
- package/types/cr.js +37 -1
- package/types/cr.js.map +1 -1
- package/types/item.d.ts +1 -1
- package/types/item.js.map +1 -1
- package/types/stakeholder.d.ts +3 -1
- package/types/stakeholder.js +20 -0
- package/types/stakeholder.js.map +1 -1
- package/views/AnnotatedChange.js +7 -5
- package/views/AnnotatedChange.js.map +1 -1
- package/views/GenericRelatedItemView.js +4 -47
- package/views/GenericRelatedItemView.js.map +1 -1
- package/views/ItemDrawer.d.ts +11 -0
- package/views/ItemDrawer.js +69 -0
- package/views/ItemDrawer.js.map +1 -0
- package/views/change-request/ChangeRequestContext.d.ts +17 -1
- package/views/change-request/ChangeRequestContext.js +29 -5
- package/views/change-request/ChangeRequestContext.js.map +1 -1
- package/views/change-request/Proposals.d.ts +2 -0
- package/views/change-request/Proposals.js +116 -80
- package/views/change-request/Proposals.js.map +1 -1
- package/views/change-request/Summary.d.ts +12 -0
- package/views/change-request/Summary.js +59 -0
- package/views/change-request/Summary.js.map +1 -0
- package/views/change-request/TransitionHistory.d.ts +30 -0
- package/views/change-request/TransitionHistory.js +307 -0
- package/views/change-request/TransitionHistory.js.map +1 -0
- package/views/change-request/TransitionOptions.d.ts +38 -0
- package/views/{detail/ChangeRequest/transitions.js → change-request/TransitionOptions.js} +61 -51
- package/views/change-request/TransitionOptions.js.map +1 -0
- package/views/change-request/objectChangeset.d.ts +1 -1
- package/views/change-request/objectChangeset.js +1 -1
- package/views/change-request/objectChangeset.js.map +1 -1
- package/views/detail/ChangeRequest/index.js +129 -142
- package/views/detail/ChangeRequest/index.js.map +1 -1
- package/views/detail/RegisterHome/MetaSummary.d.ts +9 -0
- package/views/detail/RegisterHome/MetaSummary.js +35 -0
- package/views/detail/RegisterHome/MetaSummary.js.map +1 -0
- package/views/detail/RegisterHome/Proposal.d.ts +24 -0
- package/views/detail/RegisterHome/Proposal.js +228 -0
- package/views/detail/RegisterHome/Proposal.js.map +1 -0
- package/views/detail/RegisterHome/index.js +427 -137
- package/views/detail/RegisterHome/index.js.map +1 -1
- package/views/detail/RegisterItem/index.d.ts +2 -3
- package/views/detail/RegisterItem/index.js +239 -140
- package/views/detail/RegisterItem/index.js.map +1 -1
- package/views/detail/RegisterMeta/RegisterMetaForm.js +37 -45
- package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
- package/views/detail/RegisterMeta/index.js +14 -11
- package/views/detail/RegisterMeta/index.js.map +1 -1
- package/views/diffing/InlineDiff.d.ts +27 -1
- package/views/diffing/InlineDiff.js +113 -2
- package/views/diffing/InlineDiff.js.map +1 -1
- package/views/util.d.ts +36 -2
- package/views/util.js +203 -2
- package/views/util.js.map +1 -1
- package/views/detail/ChangeRequest/transitions.d.ts +0 -28
- package/views/detail/ChangeRequest/transitions.js.map +0 -1
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.getPastTransitions = getPastTransitions;
|
|
7
6
|
exports.getTransitions = getTransitions;
|
|
7
|
+
exports.canBeTransitionedBy = canBeTransitionedBy;
|
|
8
8
|
exports.isFinalState = isFinalState;
|
|
9
|
-
exports.
|
|
9
|
+
exports.default = exports.STATE_COLOR = exports.STATE_INTENT = void 0;
|
|
10
10
|
|
|
11
11
|
var _react = _interopRequireWildcard(require("react"));
|
|
12
12
|
|
|
@@ -18,13 +18,13 @@ var _popover = require("@blueprintjs/popover2");
|
|
|
18
18
|
|
|
19
19
|
var _context = require("@riboseinc/paneron-extension-kit/context");
|
|
20
20
|
|
|
21
|
-
var _BrowserCtx = require("
|
|
21
|
+
var _BrowserCtx = require("../BrowserCtx");
|
|
22
22
|
|
|
23
|
-
var _itemPathUtils = require("
|
|
23
|
+
var _itemPathUtils = require("../itemPathUtils");
|
|
24
24
|
|
|
25
|
-
var CR = _interopRequireWildcard(require("
|
|
25
|
+
var CR = _interopRequireWildcard(require("../../types/cr"));
|
|
26
26
|
|
|
27
|
-
var _objectChangeset = require("
|
|
27
|
+
var _objectChangeset = require("../change-request/objectChangeset");
|
|
28
28
|
|
|
29
29
|
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); }
|
|
30
30
|
|
|
@@ -34,12 +34,13 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
34
34
|
|
|
35
35
|
/** @jsxFrag React.Fragment */
|
|
36
36
|
//export const TransitionOptions: C extends CR.Base ? C["state"] extends keyof CR.Transitions ? React.FC<{ cr: CR.Base }> : never : never = function ({ cr }) {
|
|
37
|
-
|
|
37
|
+
function TransitionOptions({
|
|
38
38
|
cr,
|
|
39
|
+
transitions,
|
|
40
|
+
stakeholder,
|
|
39
41
|
className
|
|
40
42
|
}) {
|
|
41
43
|
const {
|
|
42
|
-
stakeholder,
|
|
43
44
|
subregisters
|
|
44
45
|
} = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
|
|
45
46
|
const {
|
|
@@ -50,10 +51,6 @@ const TransitionOptions = function ({
|
|
|
50
51
|
usePersistentDatasetStateReducer
|
|
51
52
|
} = (0, _react.useContext)(_context.DatasetContext);
|
|
52
53
|
const isBusy = operationKey !== undefined;
|
|
53
|
-
const transitions = (0, _react.useMemo)(() => stakeholder ? getTransitions(cr, stakeholder) : [], [JSON.stringify(stakeholder), // IMPORTANT: Below two dependencies arise
|
|
54
|
-
// from within `getTransitions()` implementation, which in turn
|
|
55
|
-
// further depends on individual transitions.
|
|
56
|
-
cr.state, cr.submittingStakeholderGitServerUsername]);
|
|
57
54
|
const initialState = (0, _react.useMemo)(() => ({
|
|
58
55
|
// Pre-select next state to first available transition
|
|
59
56
|
chosenNextState: transitions.length > 0 ? transitions[0][0] : undefined,
|
|
@@ -86,14 +83,23 @@ const TransitionOptions = function ({
|
|
|
86
83
|
return (_b = stateRecalled && state.chosenNextState ? (_a = transitions.find(([t]) => t === state.chosenNextState)) === null || _a === void 0 ? void 0 : _a[1] : undefined) !== null && _b !== void 0 ? _b : undefined;
|
|
87
84
|
}, [stateRecalled, state.chosenNextState, transitions]);
|
|
88
85
|
(0, _react.useEffect)(() => {
|
|
89
|
-
if (stateRecalled
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
});
|
|
94
|
-
}
|
|
86
|
+
if (stateRecalled) {
|
|
87
|
+
dispatch({
|
|
88
|
+
type: 'unset-next-state'
|
|
89
|
+
});
|
|
95
90
|
}
|
|
96
|
-
}, [stateRecalled
|
|
91
|
+
}, [stateRecalled]); //useEffect(() => {
|
|
92
|
+
// if (stateRecalled && state.chosenNextState) {
|
|
93
|
+
// if (!selectedTransitionCfg) {
|
|
94
|
+
// dispatch({ type: 'unset-next-state' });
|
|
95
|
+
// }
|
|
96
|
+
// }
|
|
97
|
+
//}, [
|
|
98
|
+
// stateRecalled,
|
|
99
|
+
// state.chosenNextState,
|
|
100
|
+
// selectedTransitionCfg,
|
|
101
|
+
//]);
|
|
102
|
+
|
|
97
103
|
const [validatedStateInput, stateInputValidationErrors] = (0, _react.useMemo)(() => {
|
|
98
104
|
var _a;
|
|
99
105
|
|
|
@@ -124,7 +130,16 @@ const TransitionOptions = function ({
|
|
|
124
130
|
if (transitionCfg && updateObjects && stakeholder && transitionCfg.canBeTransitionedBy(stakeholder, cr)) {
|
|
125
131
|
const newCR = { ...transitionCfg.func(cr, stateInput),
|
|
126
132
|
state: transitionCfg.targetState
|
|
127
|
-
};
|
|
133
|
+
};
|
|
134
|
+
newCR.pastTransitions || (newCR.pastTransitions = []);
|
|
135
|
+
newCR.pastTransitions.push({
|
|
136
|
+
label: transitionCfg.title,
|
|
137
|
+
timestamp: new Date(),
|
|
138
|
+
fromState: cr.state,
|
|
139
|
+
toState: newCR.state,
|
|
140
|
+
stakeholder,
|
|
141
|
+
input: stateInput
|
|
142
|
+
}); //console.debug("Transitioning CR", JSON.stringify(cr), JSON.stringify(newCR));
|
|
128
143
|
|
|
129
144
|
const changeset = {
|
|
130
145
|
[(0, _itemPathUtils.crIDToCRPath)(cr.id)]: {
|
|
@@ -180,41 +195,14 @@ const TransitionOptions = function ({
|
|
|
180
195
|
intent: canTransition ? 'primary' : undefined,
|
|
181
196
|
onClick: () => validatedStateInput ? performOperation('transitioning CR state', handleTransition)(selectedTransitionCfg, validatedStateInput) : void 0
|
|
182
197
|
}, selectedTransitionCfg.title) : null);
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
exports.TransitionOptions = TransitionOptions;
|
|
186
|
-
|
|
187
|
-
function getPastTransitions(cr) {
|
|
188
|
-
const els = [];
|
|
189
|
-
|
|
190
|
-
if (CR.hasSubmitterInput(cr)) {
|
|
191
|
-
els.push(['Submitter’s justification', (0, _react2.jsx)(_react.default.Fragment, null, cr.justification)]);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
if (CR.hasRegisterManagerInput(cr)) {
|
|
195
|
-
els.push(['Register manager’s notes', (0, _react2.jsx)(_react.default.Fragment, null, cr.registerManagerNotes)]);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
if (CR.hasControlBodyInput(cr)) {
|
|
199
|
-
els.push(['Control body decision', (0, _react2.jsx)(_react.default.Fragment, null, cr.controlBodyNotes)]);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
if (CR.hasAppealRequest(cr)) {
|
|
203
|
-
els.push(['Reason for appeal', (0, _react2.jsx)(_react.default.Fragment, null, cr.appealReason)]);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
if (CR.hasRegisterOwnerInput(cr)) {
|
|
207
|
-
els.push(['Register owner notes', (0, _react2.jsx)(_react.default.Fragment, null, cr.registerOwnerNotes)]);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return els;
|
|
211
198
|
}
|
|
199
|
+
|
|
200
|
+
;
|
|
212
201
|
/**
|
|
213
202
|
* Returns a list of transitions
|
|
214
203
|
* that can be performed on given CR by given stakeholder.
|
|
215
204
|
*/
|
|
216
205
|
|
|
217
|
-
|
|
218
206
|
function getTransitions(cr, stakeholder) {
|
|
219
207
|
const possibleTransitions = TRANSITIONS[cr.state];
|
|
220
208
|
|
|
@@ -224,6 +212,15 @@ function getTransitions(cr, stakeholder) {
|
|
|
224
212
|
return [];
|
|
225
213
|
}
|
|
226
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* Returns true if given CR can be transitioned
|
|
217
|
+
* *and* given stakeholder is eligible to transition it.
|
|
218
|
+
*/
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
function canBeTransitionedBy(stakeholder, cr) {
|
|
222
|
+
return getTransitions(cr, stakeholder).length > 0;
|
|
223
|
+
}
|
|
227
224
|
/**
|
|
228
225
|
* Returns True if there is no possible transition for given state.
|
|
229
226
|
*/
|
|
@@ -400,9 +397,20 @@ const STATE_INTENT = {
|
|
|
400
397
|
[CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: 'primary',
|
|
401
398
|
[CR.State.APPEALED]: 'warning'
|
|
402
399
|
};
|
|
400
|
+
exports.STATE_INTENT = STATE_INTENT;
|
|
401
|
+
const STATE_COLOR = {
|
|
402
|
+
[CR.State.PROPOSED]: _core.Colors.BLUE2,
|
|
403
|
+
[CR.State.RETURNED_FOR_CLARIFICATION]: _core.Colors.ORANGE3,
|
|
404
|
+
[CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: _core.Colors.BLUE2,
|
|
405
|
+
[CR.State.APPEALED]: _core.Colors.ORANGE3,
|
|
406
|
+
[CR.State.REJECTED]: _core.Colors.RED2,
|
|
407
|
+
[CR.State.REJECTION_UPHELD_ON_APPEAL]: _core.Colors.RED2,
|
|
408
|
+
[CR.State.ACCEPTED]: _core.Colors.GREEN2,
|
|
409
|
+
[CR.State.ACCEPTED_ON_APPEAL]: _core.Colors.GREEN2
|
|
410
|
+
};
|
|
403
411
|
/** Associates transition implementation with source/target states. */
|
|
404
412
|
|
|
405
|
-
exports.
|
|
413
|
+
exports.STATE_COLOR = STATE_COLOR;
|
|
406
414
|
const TRANSITIONS = {
|
|
407
415
|
[CR.State.DRAFT]: {
|
|
408
416
|
[CR.State.WITHDRAWN]: WITHDRAWAL_TRANSITION,
|
|
@@ -499,4 +507,6 @@ const TRANSITIONS = {
|
|
|
499
507
|
func: applyRegisterOwnerDecision
|
|
500
508
|
}
|
|
501
509
|
}
|
|
502
|
-
};
|
|
510
|
+
};
|
|
511
|
+
var _default = TransitionOptions;
|
|
512
|
+
exports.default = _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransitionOptions.js","sourceRoot":"","sources":["../../../src/views/change-request/TransitionOptions.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useEffect, useMemo, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Button, RadioGroup, Radio, FormGroup, TextArea, TextAreaProps, Intent, Colors } from '@blueprintjs/core';\nimport { Tooltip2 as Tooltip } from '@blueprintjs/popover2';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\nimport type { ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\nimport { BrowserCtx } from '../BrowserCtx';\nimport type { RegisterItem, RegisterStakeholder, Supersession } from '../../types';\nimport { itemPathInCR, crIDToCRPath } from '../itemPathUtils';\nimport * as CR from '../../types/cr';\nimport { proposalsToObjectChangeset } from '../change-request/objectChangeset';\n\n\ninterface State {\n chosenNextState?: CR.StateType;\n\n /**\n * Can contain any fields. Upon transition,\n * they will be validated against selected `chosenNextState`.\n */\n stateInput: Partial<CR.StateInput>;\n}\n\ntype Action =\n | { type: 'unset-next-state' }\n | { type: 'choose-next-state'; payload: { state: CR.StateType } }\n | { type: 'update-next-state-input'; payload: Record<string, any> }\n\nexport interface TransitionOptions<C extends CR.SomeCR> {\n cr: C\n transitions: PossibleTransitionForCR<C>[]\n stakeholder?: RegisterStakeholder\n className?: string\n}\n\n//export const TransitionOptions: C extends CR.Base ? C[\"state\"] extends keyof CR.Transitions ? React.FC<{ cr: CR.Base }> : never : never = function ({ cr }) {\nfunction TransitionOptions<C extends CR.SomeCR>\n({ cr, transitions, stakeholder, className }: TransitionOptions<C>) {\n const { subregisters } = useContext(BrowserCtx);\n const {\n getObjectData,\n updateObjects,\n performOperation,\n operationKey,\n usePersistentDatasetStateReducer,\n } = useContext(DatasetContext);\n\n const isBusy = operationKey !== undefined;\n\n const initialState: State = useMemo((() => ({\n // Pre-select next state to first available transition\n chosenNextState: transitions.length > 0\n ? transitions[0][0]\n : undefined,\n stateInput: {},\n })), [transitions]);\n\n const [ state, dispatch, stateRecalled ] =\n (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)(\n `${cr.id}-${cr.state}`,\n undefined,\n undefined,\n (prevState, action) => {\n switch (action.type) {\n case 'unset-next-state':\n return {\n ...prevState,\n chosenNextState: undefined,\n };\n case 'choose-next-state':\n return {\n ...prevState,\n chosenNextState: action.payload.state,\n };\n case 'update-next-state-input':\n return {\n ...prevState,\n stateInput: action.payload,\n };\n default:\n throw new Error(\"Unexpected state\");\n }\n },\n initialState,\n null);\n\n const selectedTransitionCfg = useMemo((() =>\n (\n stateRecalled && state.chosenNextState\n ? transitions.find(([t, ]) => t === state.chosenNextState)?.[1]\n : undefined\n ) ?? undefined\n ), [stateRecalled, state.chosenNextState, transitions]);\n\n useEffect(() => {\n if (stateRecalled) {\n dispatch({ type: 'unset-next-state' });\n }\n }, [stateRecalled]);\n\n //useEffect(() => {\n // if (stateRecalled && state.chosenNextState) {\n // if (!selectedTransitionCfg) {\n // dispatch({ type: 'unset-next-state' });\n // }\n // }\n //}, [\n // stateRecalled,\n // state.chosenNextState,\n // selectedTransitionCfg,\n //]);\n\n const [validatedStateInput, stateInputValidationErrors]:\n [CR.StateInput, undefined] | [undefined, string] =\n useMemo(() => {\n if (cr && selectedTransitionCfg) {\n try {\n selectedTransitionCfg.func(cr, state.stateInput);\n } catch (e) {\n return [undefined, (e as any).message ?? `${e}`];\n }\n return [state.stateInput as CR.StateInput, undefined];\n } else {\n return [undefined, \"no CR or no transition selected\"];\n }\n }, [JSON.stringify(cr), selectedTransitionCfg, state.stateInput]);\n\n const getItemChangesetAsApproved = useCallback(\n async function (cr: CR.Accepted | CR.AcceptedOnAppeal): Promise<ObjectChangeset> {\n const origItemData = (await getObjectData({\n objectPaths: [\n ...Object.entries(cr.items).\n filter(([, prop]) => prop.type !== 'addition').\n map(([itemPath, ]) => itemPath),\n ...Object.values(cr.items).\n filter(prop => prop.type === 'amendment' && prop.amendmentType === 'supersession').\n flatMap(prop => (prop as Supersession).supersedingItemIDs),\n ],\n })).data as Record<string, RegisterItem<any> | null>;\n //console.debug(\"Got orig item data\", origItemData);\n const newItemData = (await getObjectData({\n objectPaths: Object.entries(cr.items).\n filter(([, prop]) => prop.type === 'clarification' || prop.type === 'addition').\n map(([itemPath, ]) => itemPathInCR(itemPath, cr.id)),\n })).data as Record<string, RegisterItem<any> | null>;\n //console.debug(\"Got new item data\", newItemData);\n return await proposalsToObjectChangeset(\n cr.id,\n subregisters !== undefined,\n cr.items,\n origItemData,\n newItemData);\n }, [cr.id, JSON.stringify(cr.items), subregisters === undefined, getObjectData]);\n\n const handleTransition = useCallback(\n async function (transitionCfg: typeof selectedTransitionCfg, stateInput: CR.StateInput) {\n if (transitionCfg && updateObjects && stakeholder && transitionCfg.canBeTransitionedBy(stakeholder, cr)) {\n const newCR = {\n ...(transitionCfg.func(cr, stateInput) as Omit<CR.SomeCR, 'state'>),\n state: transitionCfg.targetState,\n };\n newCR.pastTransitions ||= [];\n newCR.pastTransitions.push({\n label: transitionCfg.title,\n timestamp: new Date(),\n fromState: cr.state,\n toState: newCR.state,\n stakeholder,\n input: stateInput,\n });\n //console.debug(\"Transitioning CR\", JSON.stringify(cr), JSON.stringify(newCR));\n const changeset: ObjectChangeset = {\n [crIDToCRPath(cr.id)]: {\n oldValue: cr,\n newValue: newCR,\n },\n };\n if (CR.isAccepted(newCR) || CR.isAcceptedOnAppeal(newCR)) {\n Object.assign(changeset, await getItemChangesetAsApproved(newCR));\n }\n await updateObjects({\n commitMessage: `${transitionCfg.title} CR`,\n objectChangeset: changeset,\n });\n } else {\n throw new Error(\"Either transition is not specified or dataset is read-only\");\n }\n }, [updateObjects, JSON.stringify(stakeholder), JSON.stringify(cr)]);\n\n const canTransition = selectedTransitionCfg !== undefined && !isBusy && validatedStateInput !== undefined;\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className}>\n {transitions.length > 0\n ? <RadioGroup\n selectedValue={state.chosenNextState}\n onChange={(evt) => CR.isState(evt.currentTarget.value)\n ? dispatch({\n type: 'choose-next-state',\n payload: { state: evt.currentTarget.value },\n })\n : void 0}>\n {transitions.map(([state, cfg]) => \n <Radio\n key={state}\n label={cfg.title}\n value={state}\n disabled={isBusy}\n large\n />\n )}\n </RadioGroup>\n : null}\n {selectedTransitionCfg?.Widget\n ? <Tooltip\n isOpen={stateInputValidationErrors !== undefined}\n placement='bottom'\n targetTagName='div'\n intent='warning'\n content={<>{stateInputValidationErrors}</>}>\n <selectedTransitionCfg.Widget\n value={Object.keys(state.stateInput).length > 0\n ? state.stateInput\n : cr}\n onChange={!isBusy\n ? (payload) => dispatch({\n type: 'update-next-state-input',\n payload,\n })\n : undefined}\n />\n </Tooltip>\n : null}\n {selectedTransitionCfg\n ? <Button\n disabled={!canTransition}\n intent={canTransition ? 'primary' : undefined}\n onClick={() =>\n validatedStateInput\n ? performOperation('transitioning CR state', handleTransition)\n (selectedTransitionCfg, validatedStateInput)\n : void 0\n }>\n {selectedTransitionCfg.title}\n </Button>\n : null}\n </div>\n );\n};\n\n\ntype PossibleTransitionForCR<CR extends CR.Base> = [\n targetState: CR.StateType,\n cfg: CR.TransitionConfig<CR, CR.SomeCR, any>,\n];\n\n/**\n * Returns a list of transitions\n * that can be performed on given CR by given stakeholder.\n */\nexport function getTransitions<CR extends CR.Base>(\n cr: CR,\n stakeholder: RegisterStakeholder,\n): PossibleTransitionForCR<CR>[] {\n const possibleTransitions = TRANSITIONS[cr.state as keyof CR.Transitions];\n if (possibleTransitions) {\n return (\n (Object.entries(possibleTransitions) as PossibleTransitionForCR<CR>[]).\n filter(([, t]) => t.canBeTransitionedBy(stakeholder, cr))\n );\n } else {\n return [];\n }\n}\n\n\n/**\n * Returns true if given CR can be transitioned\n * *and* given stakeholder is eligible to transition it.\n */\nexport function canBeTransitionedBy(stakeholder: RegisterStakeholder, cr: CR.SomeCR) {\n return getTransitions(cr, stakeholder).length > 0;\n}\n\n\n/**\n * Returns True if there is no possible transition for given state.\n */\nexport function isFinalState(state: CR.StateType): boolean {\n return (Object.keys(TRANSITIONS[state as keyof CR.Transitions] ?? {})).length < 1;\n}\n\n\nconst applyRegisterManagerDecision: CR.Transition<\n CR.Proposed,\n CR.SubmittedForControlBodyReview\n| CR.ReturnedForClarificationByManager,\n CR.RegisterManagerInput> =\nfunction applyRegisterManagerDecision (cr, { registerManagerNotes }) {\n return {\n ...cr,\n registerManagerNotes: registerManagerNotes ?? '',\n };\n}\n\n\nconst applyControlBodyDecision: CR.Transition<\n CR.SubmittedForControlBodyReview,\n CR.Accepted\n| CR.Rejected\n| CR.ReturnedForClarificationByControlBody,\n CR.ControlBodyInput> =\nfunction applyControlBodyDecision (cr, { controlBodyNotes }) {\n if (!controlBodyNotes?.trim()) {\n throw new Error(\"Control body decision is required.\");\n }\n return {\n ...cr,\n controlBodyNotes,\n };\n}\n\n\nconst applyAppeal: CR.Transition<\n CR.Rejected,\n CR.Appealed,\n CR.AppealRequest> =\nfunction applyAppeal (cr, { appealReason }) {\n if (!appealReason?.trim()) {\n throw new Error(\"Appeal reason is required.\");\n }\n return {\n ...cr,\n appealReason,\n timeDisposed: undefined,\n };\n}\n\n\nconst applyRegisterOwnerDecision: CR.Transition<\n CR.Appealed,\n CR.AcceptedOnAppeal\n| CR.RejectionUpheld,\n CR.RegisterOwnerInput> =\nfunction applyRegisterOwnerDecision (cr, { registerOwnerNotes }) {\n if (!registerOwnerNotes?.trim()) {\n throw new Error(\"Register owner note is required.\");\n }\n return {\n ...cr,\n registerOwnerNotes,\n timeDisposed: new Date(),\n };\n}\n\n\nconst WITHDRAWAL_TRANSITION:\nCR.TransitionConfig<CR.Withdrawable, CR.Withdrawn, null> = {\n title: \"Withdraw\",\n targetState: CR.State.WITHDRAWN,\n Widget: null,\n canBeTransitionedBy: (stakeholder, cr) => cr.timeProposed && CR.isSubmittedBy(stakeholder, cr),\n func: (cr: CR.Withdrawable) => ({\n ...cr,\n timeDisposed: new Date(),\n }),\n} as const;\n\n\nconst SubmitterInputWidget: React.FC<{\n value: CR.SubmitterInput\n onChange?: (newVal: CR.SubmitterInput) => void\n}> = function ({ value, onChange }) {\n return (\n <FormGroup label=\"Justification:\">\n <TransitionInputTextArea\n required\n value={value.justification}\n onChange={(evt) =>\n onChange?.({ justification: evt.currentTarget.value })\n }\n />\n </FormGroup>\n );\n};\n\n\nconst TransitionInputTextArea: React.FC<TextAreaProps> = function (props) {\n return <TextArea\n fill\n css={css`resize: vertical;`}\n readOnly={!props.onChange}\n {...props}\n />;\n};\n\n\nconst PROPOSAL_TRANSITION:\nCR.TransitionConfig<CR.Proposable, CR.Proposed, CR.SubmitterInput> = {\n title: \"Propose\",\n targetState: CR.State.PROPOSED,\n canBeTransitionedBy: ((stakeholder, cr) =>\n CR.isSubmittedBy(stakeholder, cr) && Object.keys(cr.items).length > 0\n ),\n Widget: SubmitterInputWidget,\n func: (cr, submitterInput) => {\n if (!submitterInput?.justification?.trim()) {\n throw new Error(\"Justification is required.\");\n }\n return {\n ...cr,\n ...submitterInput,\n timeProposed: new Date(),\n }\n },\n}\n\n\nconst RegisterManagerNotesWidget: React.FC<{\n value: CR.RegisterManagerInput\n onChange?: (newVal: CR.RegisterManagerInput) => void\n}> = function ({ value, onChange }) {\n return (\n <FormGroup label=\"Register manager notes:\">\n <TransitionInputTextArea\n value={value.registerManagerNotes}\n required\n onChange={evt =>\n onChange?.({ registerManagerNotes: evt.currentTarget.value })\n }\n />\n </FormGroup>\n );\n};\n\n\nconst ControlBodyNotesWidget: React.FC<{\n value: CR.ControlBodyInput\n onChange?: (newVal: CR.ControlBodyInput) => void\n}> = function ({ value, onChange }) {\n return (\n <FormGroup label=\"Control body decision:\">\n <TransitionInputTextArea\n value={value.controlBodyNotes}\n required\n onChange={evt =>\n onChange?.({\n controlBodyNotes: evt.currentTarget.value,\n })\n }\n />\n </FormGroup>\n );\n};\n\n\nconst AppealRequestWidget: React.FC<{\n value: CR.AppealRequest\n onChange?: (newVal: CR.AppealRequest) => void\n}> = function ({ value, onChange }) {\n return (\n <FormGroup label=\"Appeal reasoning:\">\n <TransitionInputTextArea\n value={value.appealReason}\n required\n onChange={evt =>\n onChange?.({ appealReason: evt.currentTarget.value })\n }\n />\n </FormGroup>\n );\n};\n\n\nconst RegisterOwnerNotesWidget: React.FC<{\n value: CR.RegisterOwnerInput\n onChange?: (newVal: CR.RegisterOwnerInput) => void\n}> = function ({ value, onChange }) {\n return (\n <FormGroup label=\"Register owner notes:\">\n <TransitionInputTextArea\n value={value.registerOwnerNotes}\n required\n onChange={evt =>\n onChange?.({ registerOwnerNotes: evt.currentTarget.value })\n }\n />\n </FormGroup>\n );\n};\n\n\nexport const STATE_INTENT: { [key in CR.StateType]?: Intent } = {\n [CR.State.PROPOSED]: 'primary',\n [CR.State.RETURNED_FOR_CLARIFICATION]: 'primary',\n [CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: 'primary',\n [CR.State.APPEALED]: 'warning',\n};\n\n\nexport const STATE_COLOR: { [key in CR.StateType]?: typeof Colors[keyof typeof Colors] } = {\n [CR.State.PROPOSED]: Colors.BLUE2,\n [CR.State.RETURNED_FOR_CLARIFICATION]: Colors.ORANGE3,\n [CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: Colors.BLUE2,\n\n [CR.State.APPEALED]: Colors.ORANGE3,\n [CR.State.REJECTED]: Colors.RED2,\n [CR.State.REJECTION_UPHELD_ON_APPEAL]: Colors.RED2,\n\n [CR.State.ACCEPTED]: Colors.GREEN2,\n [CR.State.ACCEPTED_ON_APPEAL]: Colors.GREEN2,\n};\n\n\n\n/** Associates transition implementation with source/target states. */\nconst TRANSITIONS: CR.Transitions = {\n [CR.State.DRAFT]: {\n [CR.State.WITHDRAWN]: WITHDRAWAL_TRANSITION,\n [CR.State.PROPOSED]: PROPOSAL_TRANSITION,\n },\n [CR.State.PROPOSED]: {\n [CR.State.WITHDRAWN]: WITHDRAWAL_TRANSITION,\n [CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: {\n title: \"Submit for control body review\",\n targetState: CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW,\n canBeTransitionedBy: (stakeholder) => ['owner', 'manager'].indexOf(stakeholder.role) >= 0,\n Widget: RegisterManagerNotesWidget,\n func: applyRegisterManagerDecision,\n },\n [CR.State.RETURNED_FOR_CLARIFICATION]: {\n title: \"Return for clarification\",\n targetState: CR.State.RETURNED_FOR_CLARIFICATION,\n canBeTransitionedBy: (stakeholder) => ['owner', 'manager'].indexOf(stakeholder.role) >= 0,\n Widget: RegisterManagerNotesWidget,\n func: function applyRegisterManagerReturnDecision(cr, payload) {\n if ((payload.registerManagerNotes ?? '').trim() === '') {\n throw new Error(\"Register manager notes are required if returning for clarification\");\n }\n return applyRegisterManagerDecision(cr, payload);\n },\n },\n },\n [CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: {\n [CR.State.WITHDRAWN]: WITHDRAWAL_TRANSITION,\n [CR.State.RETURNED_FOR_CLARIFICATION]: {\n title: \"Return for clarification\",\n targetState: CR.State.RETURNED_FOR_CLARIFICATION,\n canBeTransitionedBy: (stakeholder) => ['owner', 'control-body'].indexOf(stakeholder.role) >= 0,\n Widget: ControlBodyNotesWidget,\n func: applyControlBodyDecision,\n },\n [CR.State.ACCEPTED]: {\n title: \"Accept\",\n targetState: CR.State.ACCEPTED,\n canBeTransitionedBy: (stakeholder) => ['owner', 'control-body'].indexOf(stakeholder.role) >= 0,\n Widget: ControlBodyNotesWidget,\n func: (cr, controlBodyInput) => ({\n ...applyControlBodyDecision(cr, controlBodyInput),\n timeDisposed: new Date(),\n }),\n },\n [CR.State.REJECTED]: {\n title: \"Reject\",\n targetState: CR.State.REJECTED,\n canBeTransitionedBy: (stakeholder) => ['owner', 'control-body'].indexOf(stakeholder.role) >= 0,\n Widget: ControlBodyNotesWidget,\n func: (cr, controlBodyInput) => ({\n ...applyControlBodyDecision(cr, controlBodyInput),\n timeDisposed: new Date(),\n }),\n },\n },\n [CR.State.RETURNED_FOR_CLARIFICATION]: {\n [CR.State.PROPOSED]: PROPOSAL_TRANSITION,\n [CR.State.WITHDRAWN]: WITHDRAWAL_TRANSITION,\n },\n [CR.State.REJECTED]: {\n [CR.State.APPEALED]: {\n title: \"Appeal\",\n targetState: CR.State.APPEALED,\n canBeTransitionedBy: CR.isSubmittedBy,\n Widget: AppealRequestWidget,\n func: applyAppeal,\n },\n },\n [CR.State.APPEALED]: {\n [CR.State.APPEAL_WITHDRAWN]: {\n title: \"Withdraw appeal\",\n targetState: CR.State.APPEAL_WITHDRAWN,\n canBeTransitionedBy: CR.isSubmittedBy,\n Widget: null,\n func: (cr) => ({\n ...cr,\n timeDisposed: new Date(),\n }),\n },\n [CR.State.ACCEPTED_ON_APPEAL]: {\n title: \"Accept on appeal\",\n targetState: CR.State.ACCEPTED_ON_APPEAL,\n canBeTransitionedBy: (stakeholder) => stakeholder.role === 'owner',\n Widget: RegisterOwnerNotesWidget,\n func: applyRegisterOwnerDecision,\n },\n [CR.State.REJECTION_UPHELD_ON_APPEAL]: {\n title: \"Uphold rejection\",\n targetState: CR.State.REJECTION_UPHELD_ON_APPEAL,\n canBeTransitionedBy: (stakeholder) => stakeholder.role === 'owner',\n Widget: RegisterOwnerNotesWidget,\n func: applyRegisterOwnerDecision,\n },\n },\n} as const;\n\n\nexport default TransitionOptions;\n"]}
|
|
@@ -20,7 +20,7 @@ importingStakeholderGitServerUsername: string, getObjectData: (opts: {
|
|
|
20
20
|
objectPaths: string[];
|
|
21
21
|
}) => Promise<{
|
|
22
22
|
data: ObjectDataset;
|
|
23
|
-
}>, findObjects: (predicate: string) => Promise<any[]>): Promise<ObjectChangeset>;
|
|
23
|
+
}>, findObjects: (predicate: string) => Promise<any[]>): Promise<[changeset: ObjectChangeset, id: string]>;
|
|
24
24
|
/**
|
|
25
25
|
* When importable CR wants to link to preexisting register items,
|
|
26
26
|
* and it does not know their exact UUIDs but knows some other properties,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"objectChangeset.js","sourceRoot":"","sources":["../../../src/views/change-request/objectChangeset.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Change, Changeset } from '@riboseinc/paneron-extension-kit/types/changes';\nimport type { ObjectDataset, ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\nimport type {\n InternalItemReference,\n RegisterItem,\n ProposalSet,\n ChangeProposal,\n Amendment,\n Supersession,\n ItemClassConfigurationSet,\n} from '../../types';\nimport { isRegisterItem } from '../../types';\nimport type { Version as RegisterVersion } from '../../types/register';\nimport {\n State,\n type Drafted,\n type ReturnedForClarificationByManager,\n type ReturnedForClarificationByControlBody,\n ImportableCR,\n} from '../../types/cr';\nimport {\n crIDToCRPath,\n itemPathInCR,\n itemPathNotInCR,\n itemPathToItemRef,\n itemRefToItemPath,\n} from '../itemPathUtils';\n\n\n/** Takes a justification and ID, returns an object changeset. */\nexport function newCRObjectChangeset(\n id: string,\n justification: string,\n registerVersion: RegisterVersion,\n stakeholderGitServerUsername: string,\n): ObjectChangeset {\n\n const timeStarted = new Date();\n const cr: Drafted = {\n id,\n timeStarted,\n timeEdited: timeStarted,\n justification,\n submittingStakeholderGitServerUsername: stakeholderGitServerUsername,\n items: {},\n state: State.DRAFT,\n registerVersion: registerVersion!.id,\n };\n const crObjectPath = crIDToCRPath(id);\n return {\n [crObjectPath]: {\n oldValue: null,\n newValue: cr,\n },\n }\n}\n\n\n/**\n * Returns an object changeset given an importable proposal,\n * item class definitions for register to import it to,\n * and a function to fetch register item data.\n *\n * Throws an error if importable proposal data isn’t compatible\n * with item class definitions or existing register data.\n */\nexport async function importedProposalToCRObjectChangeset(\n importableCR: ImportableCR,\n /** Available item classes per register configuration. */\n itemClasses: ItemClassConfigurationSet,\n /** VCS username of the person performing the import. */\n importingStakeholderGitServerUsername: string,\n getObjectData: (opts: { objectPaths: string[] }) => Promise<{ data: ObjectDataset }>,\n findObjects: (predicate: string) => Promise<any[]>,\n): Promise<ObjectChangeset> {\n const proposalDraft: Drafted = importableCR.proposalDraft;\n proposalDraft.submittingStakeholderGitServerUsername = importingStakeholderGitServerUsername;\n const crID = proposalDraft.id;\n const crPath = crIDToCRPath(crID);\n\n const itemPaths = Object.keys(proposalDraft.items);\n const proposals = Object.values(proposalDraft.items);\n\n for (const itemPath of itemPaths) {\n const itemRef = itemPathToItemRef(false, itemPath);\n if (!itemClasses[itemRef.classID]) {\n throw new Error(`Imported proposal contains item(s) of unknown class ${itemRef.classID}`);\n }\n }\n\n if (proposals.find(prop => prop.type !== 'addition')) {\n throw new Error(\"Only addition proposals can be imported at this time\");\n }\n\n const existingItems = (await getObjectData({ objectPaths: itemPaths })).data;\n if (Object.values(existingItems).find(v => v !== null)) {\n throw new Error(\"Register already contains item(s) in this proposal\");\n }\n\n const changeset: ObjectChangeset = {\n [crPath]: {\n oldValue: null,\n newValue: proposalDraft,\n },\n };\n\n for (const [itemPath, itemPayload] of Object.entries(importableCR.itemPayloads ?? {})) {\n if (itemPaths.indexOf(itemPath) < 0) {\n throw new Error(`No proposal found for item at ${itemPath}, but item data is given`);\n }\n if (!isRegisterItem(itemPayload)) {\n throw new Error(`Invalid register item data at ${itemPath}`);\n }\n changeset[itemPathInCR(itemPath, crID)] = {\n oldValue: null,\n newValue: await resolvePredicates(itemPayload, async function resolveRef(predicate: string) {\n const objects = (await findObjects(predicate)).\n filter((o: any) => o.objectPath === itemPathNotInCR(o.objectPath));\n if (objects.length < 1) {\n throw new Error(`Unable to resolve predicate to item UUID: no item found matching ${predicate}`);\n } else if (objects.length > 1) {\n const objectOverview = objects.map((o: any) => JSON.stringify(o)).join(', ')\n throw new Error(`Unable to resolve predicate to item UUID: more than one item matches ${predicate}: ${objectOverview}`);\n } else {\n return itemPathToItemRef(false, objects[0].objectPath);\n }\n }),\n };\n }\n\n return changeset;\n}\n\n\n/**\n * When importable CR wants to link to preexisting register items,\n * and it does not know their exact UUIDs but knows some other properties,\n * it can provide this structure in place of a reference.\n *\n * `resolvePredicates()` will resolve any such placeholders to item UUIDs\n * at import time.\n *\n * `mode` should specify whether the predicate should be replaced with\n * only a UUID string ('id', if classID is already known)\n * or full InternalItemReference ('generic').\n */\nexport interface Predicate {\n __isPredicate: true\n /**\n * Predicate expression to resolve.\n * Example: `data.identifier && parseInt(data.identifier, 10) === 123`.\n */\n predicate: string\n // TODO: Specify different subtypes for generic and ID?\n mode: 'generic' | 'id'\n}\n\ntype WithPredicatesResolved<T> = ReplaceType<T, Predicate, string | InternalItemReference>;\n\nfunction isPredicate(val: any): val is Predicate {\n return val && val.__isPredicate === true;\n}\n/**\n * Resolves any properties that should reference register item UUIDs,\n * but have predicates instead.\n */\nasync function resolvePredicates<T>(\n value: T,\n resolveRef: (predicate: string) => Promise<InternalItemReference>,\n): Promise<T extends Predicate ? string : WithPredicatesResolved<T>> {\n // NOTE: Return types are cast because https://github.com/microsoft/TypeScript/issues/33912.\n if (isPredicate(value)) {\n const ref = await resolveRef(value.predicate) as any;\n if (value.mode === 'generic') {\n return ref;\n } else {\n return ref.itemID;\n }\n } else if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n return await Promise.all(value.map((v: any) => resolvePredicates(v, resolveRef))) as any;\n } else {\n // Assume plain non-array object.\n for (const [key, v] of Object.entries(value)) {\n value[key as keyof typeof value] = await resolvePredicates(v, resolveRef);\n }\n return value as any;\n }\n } else {\n return value as any;\n }\n}\n\n\n/**\n * Returns an object changeset to update CR with new given proposal items.\n * Only applicable to CR at draft edit stage.\n */\nexport function updateCRObjectChangeset(\n /**\n * Change request data.\n */\n cr: Drafted | ReturnedForClarificationByManager | ReturnedForClarificationByControlBody,\n\n /**\n * Proposals by item path.\n * Will be merged with those already existing in `cr`.\n * If a proposal is undefined, it will be removed.\n */\n proposalItems: Record<string, ChangeProposal | null>,\n\n /**\n * New item data must be provided for additions and clarifications,\n * keyed by item path.\n */\n itemData: Record<string, RegisterItem<any>> = {},\n): ObjectChangeset {\n const changeset: ObjectChangeset = {};\n const newItems = { ...cr.items };\n for (const [itemPath, proposal] of Object.entries(proposalItems)) {\n // Update proposals on CR\n if (proposal !== null) {\n newItems[itemPath] = proposal;\n } else if (newItems[itemPath]) {\n delete newItems[itemPath];\n }\n // Add/remove item data\n if (proposal?.type === 'addition' || proposal?.type === 'clarification') {\n const proposedItemData = itemData[itemPath];\n if (proposedItemData === null || !isRegisterItem(proposedItemData)) {\n console.error(\"Unable to convert proposals to object changeset: original item data is missing\", itemPath);\n throw new Error(\"Unable to convert proposals to object changeset: original item data is missing\");\n }\n changeset[itemPathInCR(itemPath, cr.id)] = {\n // When editing a draft, we don’t care\n // about overwriting proposed item data so we omit oldValue.\n newValue: proposedItemData,\n };\n } else {\n changeset[itemPathInCR(itemPath, cr.id)] = {\n // When editing a draft, we don’t care\n // about overwriting proposed item data so we omit oldValue.\n newValue: null,\n };\n }\n }\n // Update main CR data\n const crPath = crIDToCRPath(cr.id);\n changeset[crPath] = {\n oldValue: cr,\n newValue: { ...cr, items: newItems, timeEdited: new Date() },\n };\n return changeset;\n}\n\n\n/**\n * Given change proposals, returns applicable changes\n * to objects in the dataset.\n */\nexport async function proposalsToObjectChangeset(\n crID: string,\n hasSubregisters: boolean,\n proposals: ProposalSet,\n itemData: Record<string, RegisterItem<any> | null>,\n newItemData: Record<string, RegisterItem<any> | null>,\n): Promise<ObjectChangeset> {\n const cs: ObjectChangeset = {};\n\n for (const [itemPath, proposal] of Object.entries(proposals)) {\n //const originalItem: RegisterItem<any> | undefined = (itemData[itemPath] ?? undefined);\n const itemRef = itemPathToItemRef(hasSubregisters, itemPath);\n\n if (proposal.type !== 'addition') {\n if (itemData[itemPath] === undefined) {\n console.error(\"Unable to convert proposals to object changeset: original item data is missing\", itemPath);\n throw new Error(\"Unable to convert proposals to object changeset: original item data is missing\");\n }\n if (proposal.type === 'amendment' && proposal.amendmentType === 'supersession') {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n } else {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n }\n } else {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n }\n }\n\n return cs;\n}\n\n// TODO: Refactor out the business logic of proposal approval.\n/**\n * Given a change proposal, returns applicable changes\n * to objects in the dataset.\n * Core logic of approving a proposal.\n * Takes a proposal and extra options (depending on proposal type).\n * Returns a Changeset containing register items at appropriate paths.\n */\nasync function proposalToObjectChangeset(\n crID: string,\n proposal: ChangeProposal,\n itemRef: InternalItemReference,\n itemPath: string,\n itemData: Record<string, RegisterItem<any> | null>,\n newItemData: Record<string, RegisterItem<any> | null>,\n): Promise<Changeset<Change<RegisterItem<any>>>> {\n let updatedItem: RegisterItem<any>;\n const changeset: Changeset<Change<RegisterItem<any>>> = {};\n\n const origItem = itemData[itemPath] ?? null;\n const newItem = newItemData[itemPathInCR(itemPath, crID)] ?? null;\n\n if (proposal.type !== 'addition') {\n if (origItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires original item data for non-additions\");\n }\n\n updatedItem = { ...origItem };\n\n switch (proposal.type) {\n case 'clarification':\n if (newItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires new item data for clarifications\");\n }\n //const clarification = proposal as Clarification;\n updatedItem.data = newItem.data //clarification.payload;\n break;\n case 'amendment':\n const amendment = proposal as Amendment;\n updatedItem.amendedInCR = crID;\n\n switch (amendment.amendmentType) {\n case 'retirement':\n updatedItem.status = 'retired';\n break;\n case 'invalidation':\n updatedItem.status = 'invalid';\n break;\n case 'supersession':\n const supersession = proposal as Supersession;\n updatedItem.status = 'superseded';\n updatedItem.supersededBy = supersession.supersedingItemIDs.map(itemID => ({\n itemID,\n classID: itemRef.classID,\n subregisterID: itemRef.subregisterID,\n }));\n for (const supersedingItemPath of updatedItem.supersededBy.map(ip => itemRefToItemPath(ip))) {\n const supersedingItemData = itemData[supersedingItemPath];\n if (supersedingItemData) {\n changeset[supersedingItemPath] = {\n oldValue: supersedingItemData,\n newValue: {\n ...supersedingItemData,\n supersedes: [ ...(supersedingItemData.supersedes ?? []), itemRef ],\n },\n };\n }\n }\n break;\n }\n break;\n }\n } else {\n if (newItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires new item data for additions\");\n }\n updatedItem = {\n id: itemRef.itemID,\n data: newItem.data,\n status: 'valid',\n dateAccepted: new Date(),\n };\n }\n\n changeset[itemPath] = {\n oldValue: origItem,\n newValue: updatedItem,\n };\n\n return changeset;\n}\n\n\n// Helper\n\ntype ReplaceType<Type, FromType, ToType> = Type extends FromType\n ? ToType\n : Type extends object\n ? ReplaceTypes<Type, FromType, ToType>\n : Type;\n\ntype ReplaceTypes<ObjType extends object, FromType, ToType> = {\n [KeyType in keyof ObjType]:\n ReplaceType<ObjType[KeyType], FromType, ToType>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"objectChangeset.js","sourceRoot":"","sources":["../../../src/views/change-request/objectChangeset.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Change, Changeset } from '@riboseinc/paneron-extension-kit/types/changes';\nimport type { ObjectDataset, ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\nimport type {\n InternalItemReference,\n RegisterItem,\n ProposalSet,\n ChangeProposal,\n Amendment,\n Supersession,\n ItemClassConfigurationSet,\n} from '../../types';\nimport { isRegisterItem } from '../../types';\nimport type { Version as RegisterVersion } from '../../types/register';\nimport {\n State,\n type Drafted,\n type ReturnedForClarificationByManager,\n type ReturnedForClarificationByControlBody,\n ImportableCR,\n} from '../../types/cr';\nimport {\n crIDToCRPath,\n itemPathInCR,\n itemPathNotInCR,\n itemPathToItemRef,\n itemRefToItemPath,\n} from '../itemPathUtils';\n\n\n/** Takes a justification and ID, returns an object changeset. */\nexport function newCRObjectChangeset(\n id: string,\n justification: string,\n registerVersion: RegisterVersion,\n stakeholderGitServerUsername: string,\n): ObjectChangeset {\n\n const timeStarted = new Date();\n const cr: Drafted = {\n id,\n timeStarted,\n timeEdited: timeStarted,\n justification,\n submittingStakeholderGitServerUsername: stakeholderGitServerUsername,\n items: {},\n state: State.DRAFT,\n registerVersion: registerVersion!.id,\n };\n const crObjectPath = crIDToCRPath(id);\n return {\n [crObjectPath]: {\n oldValue: null,\n newValue: cr,\n },\n }\n}\n\n\n/**\n * Returns an object changeset given an importable proposal,\n * item class definitions for register to import it to,\n * and a function to fetch register item data.\n *\n * Throws an error if importable proposal data isn’t compatible\n * with item class definitions or existing register data.\n */\nexport async function importedProposalToCRObjectChangeset(\n importableCR: ImportableCR,\n /** Available item classes per register configuration. */\n itemClasses: ItemClassConfigurationSet,\n /** VCS username of the person performing the import. */\n importingStakeholderGitServerUsername: string,\n getObjectData: (opts: { objectPaths: string[] }) => Promise<{ data: ObjectDataset }>,\n findObjects: (predicate: string) => Promise<any[]>,\n): Promise<[changeset: ObjectChangeset, id: string]> {\n const proposalDraft: Drafted = importableCR.proposalDraft;\n proposalDraft.submittingStakeholderGitServerUsername = importingStakeholderGitServerUsername;\n const crID = proposalDraft.id;\n const crPath = crIDToCRPath(crID);\n\n const itemPaths = Object.keys(proposalDraft.items);\n const proposals = Object.values(proposalDraft.items);\n\n for (const itemPath of itemPaths) {\n const itemRef = itemPathToItemRef(false, itemPath);\n if (!itemClasses[itemRef.classID]) {\n throw new Error(`Imported proposal contains item(s) of unknown class ${itemRef.classID}`);\n }\n }\n\n if (proposals.find(prop => prop.type !== 'addition')) {\n throw new Error(\"Only addition proposals can be imported at this time\");\n }\n\n const existingItems = (await getObjectData({ objectPaths: itemPaths })).data;\n if (Object.values(existingItems).find(v => v !== null)) {\n throw new Error(\"Register already contains item(s) in this proposal\");\n }\n\n const changeset: ObjectChangeset = {\n [crPath]: {\n oldValue: null,\n newValue: proposalDraft,\n },\n };\n\n for (const [itemPath, itemPayload] of Object.entries(importableCR.itemPayloads ?? {})) {\n if (itemPaths.indexOf(itemPath) < 0) {\n throw new Error(`No proposal found for item at ${itemPath}, but item data is given`);\n }\n if (!isRegisterItem(itemPayload)) {\n throw new Error(`Invalid register item data at ${itemPath}`);\n }\n changeset[itemPathInCR(itemPath, crID)] = {\n oldValue: null,\n newValue: await resolvePredicates(itemPayload, async function resolveRef(predicate: string) {\n const objects = (await findObjects(predicate)).\n filter((o: any) => o.objectPath === itemPathNotInCR(o.objectPath));\n if (objects.length < 1) {\n throw new Error(`Unable to resolve predicate to item UUID: no item found matching ${predicate}`);\n } else if (objects.length > 1) {\n const objectOverview = objects.map((o: any) => JSON.stringify(o)).join(', ')\n throw new Error(`Unable to resolve predicate to item UUID: more than one item matches ${predicate}: ${objectOverview}`);\n } else {\n return itemPathToItemRef(false, objects[0].objectPath);\n }\n }),\n };\n }\n\n return [changeset, crID];\n}\n\n\n/**\n * When importable CR wants to link to preexisting register items,\n * and it does not know their exact UUIDs but knows some other properties,\n * it can provide this structure in place of a reference.\n *\n * `resolvePredicates()` will resolve any such placeholders to item UUIDs\n * at import time.\n *\n * `mode` should specify whether the predicate should be replaced with\n * only a UUID string ('id', if classID is already known)\n * or full InternalItemReference ('generic').\n */\nexport interface Predicate {\n __isPredicate: true\n /**\n * Predicate expression to resolve.\n * Example: `data.identifier && parseInt(data.identifier, 10) === 123`.\n */\n predicate: string\n // TODO: Specify different subtypes for generic and ID?\n mode: 'generic' | 'id'\n}\n\ntype WithPredicatesResolved<T> = ReplaceType<T, Predicate, string | InternalItemReference>;\n\nfunction isPredicate(val: any): val is Predicate {\n return val && val.__isPredicate === true;\n}\n/**\n * Resolves any properties that should reference register item UUIDs,\n * but have predicates instead.\n */\nasync function resolvePredicates<T>(\n value: T,\n resolveRef: (predicate: string) => Promise<InternalItemReference>,\n): Promise<T extends Predicate ? string : WithPredicatesResolved<T>> {\n // NOTE: Return types are cast because https://github.com/microsoft/TypeScript/issues/33912.\n if (isPredicate(value)) {\n const ref = await resolveRef(value.predicate) as any;\n if (value.mode === 'generic') {\n return ref;\n } else {\n return ref.itemID;\n }\n } else if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n return await Promise.all(value.map((v: any) => resolvePredicates(v, resolveRef))) as any;\n } else {\n // Assume plain non-array object.\n for (const [key, v] of Object.entries(value)) {\n value[key as keyof typeof value] = await resolvePredicates(v, resolveRef);\n }\n return value as any;\n }\n } else {\n return value as any;\n }\n}\n\n\n/**\n * Returns an object changeset to update CR with new given proposal items.\n * Only applicable to CR at draft edit stage.\n */\nexport function updateCRObjectChangeset(\n /**\n * Change request data.\n */\n cr: Drafted | ReturnedForClarificationByManager | ReturnedForClarificationByControlBody,\n\n /**\n * Proposals by item path.\n * Will be merged with those already existing in `cr`.\n * If a proposal is undefined, it will be removed.\n */\n proposalItems: Record<string, ChangeProposal | null>,\n\n /**\n * New item data must be provided for additions and clarifications,\n * keyed by item path.\n */\n itemData: Record<string, RegisterItem<any>> = {},\n): ObjectChangeset {\n const changeset: ObjectChangeset = {};\n const newItems = { ...cr.items };\n for (const [itemPath, proposal] of Object.entries(proposalItems)) {\n // Update proposals on CR\n if (proposal !== null) {\n newItems[itemPath] = proposal;\n } else if (newItems[itemPath]) {\n delete newItems[itemPath];\n }\n // Add/remove item data\n if (proposal?.type === 'addition' || proposal?.type === 'clarification') {\n const proposedItemData = itemData[itemPath];\n if (proposedItemData === null || !isRegisterItem(proposedItemData)) {\n console.error(\"Unable to convert proposals to object changeset: original item data is missing\", itemPath);\n throw new Error(\"Unable to convert proposals to object changeset: original item data is missing\");\n }\n changeset[itemPathInCR(itemPath, cr.id)] = {\n // When editing a draft, we don’t care\n // about overwriting proposed item data so we omit oldValue.\n newValue: proposedItemData,\n };\n } else {\n changeset[itemPathInCR(itemPath, cr.id)] = {\n // When editing a draft, we don’t care\n // about overwriting proposed item data so we omit oldValue.\n newValue: null,\n };\n }\n }\n // Update main CR data\n const crPath = crIDToCRPath(cr.id);\n changeset[crPath] = {\n oldValue: cr,\n newValue: { ...cr, items: newItems, timeEdited: new Date() },\n };\n return changeset;\n}\n\n\n/**\n * Given change proposals, returns applicable changes\n * to objects in the dataset.\n */\nexport async function proposalsToObjectChangeset(\n crID: string,\n hasSubregisters: boolean,\n proposals: ProposalSet,\n itemData: Record<string, RegisterItem<any> | null>,\n newItemData: Record<string, RegisterItem<any> | null>,\n): Promise<ObjectChangeset> {\n const cs: ObjectChangeset = {};\n\n for (const [itemPath, proposal] of Object.entries(proposals)) {\n //const originalItem: RegisterItem<any> | undefined = (itemData[itemPath] ?? undefined);\n const itemRef = itemPathToItemRef(hasSubregisters, itemPath);\n\n if (proposal.type !== 'addition') {\n if (itemData[itemPath] === undefined) {\n console.error(\"Unable to convert proposals to object changeset: original item data is missing\", itemPath);\n throw new Error(\"Unable to convert proposals to object changeset: original item data is missing\");\n }\n if (proposal.type === 'amendment' && proposal.amendmentType === 'supersession') {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n } else {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n }\n } else {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n }\n }\n\n return cs;\n}\n\n// TODO: Refactor out the business logic of proposal approval.\n/**\n * Given a change proposal, returns applicable changes\n * to objects in the dataset.\n * Core logic of approving a proposal.\n * Takes a proposal and extra options (depending on proposal type).\n * Returns a Changeset containing register items at appropriate paths.\n */\nasync function proposalToObjectChangeset(\n crID: string,\n proposal: ChangeProposal,\n itemRef: InternalItemReference,\n itemPath: string,\n itemData: Record<string, RegisterItem<any> | null>,\n newItemData: Record<string, RegisterItem<any> | null>,\n): Promise<Changeset<Change<RegisterItem<any>>>> {\n let updatedItem: RegisterItem<any>;\n const changeset: Changeset<Change<RegisterItem<any>>> = {};\n\n const origItem = itemData[itemPath] ?? null;\n const newItem = newItemData[itemPathInCR(itemPath, crID)] ?? null;\n\n if (proposal.type !== 'addition') {\n if (origItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires original item data for non-additions\");\n }\n\n updatedItem = { ...origItem };\n\n switch (proposal.type) {\n case 'clarification':\n if (newItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires new item data for clarifications\");\n }\n //const clarification = proposal as Clarification;\n updatedItem.data = newItem.data //clarification.payload;\n break;\n case 'amendment':\n const amendment = proposal as Amendment;\n updatedItem.amendedInCR = crID;\n\n switch (amendment.amendmentType) {\n case 'retirement':\n updatedItem.status = 'retired';\n break;\n case 'invalidation':\n updatedItem.status = 'invalid';\n break;\n case 'supersession':\n const supersession = proposal as Supersession;\n updatedItem.status = 'superseded';\n updatedItem.supersededBy = supersession.supersedingItemIDs.map(itemID => ({\n itemID,\n classID: itemRef.classID,\n subregisterID: itemRef.subregisterID,\n }));\n for (const supersedingItemPath of updatedItem.supersededBy.map(ip => itemRefToItemPath(ip))) {\n const supersedingItemData = itemData[supersedingItemPath];\n if (supersedingItemData) {\n changeset[supersedingItemPath] = {\n oldValue: supersedingItemData,\n newValue: {\n ...supersedingItemData,\n supersedes: [ ...(supersedingItemData.supersedes ?? []), itemRef ],\n },\n };\n }\n }\n break;\n }\n break;\n }\n } else {\n if (newItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires new item data for additions\");\n }\n updatedItem = {\n id: itemRef.itemID,\n data: newItem.data,\n status: 'valid',\n dateAccepted: new Date(),\n };\n }\n\n changeset[itemPath] = {\n oldValue: origItem,\n newValue: updatedItem,\n };\n\n return changeset;\n}\n\n\n// Helper\n\ntype ReplaceType<Type, FromType, ToType> = Type extends FromType\n ? ToType\n : Type extends object\n ? ReplaceTypes<Type, FromType, ToType>\n : Type;\n\ntype ReplaceTypes<ObjType extends object, FromType, ToType> = {\n [KeyType in keyof ObjType]:\n ReplaceType<ObjType[KeyType], FromType, ToType>;\n}\n"]}
|