@riboseinc/paneron-registry-kit 2.2.29 → 2.2.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/index.d.ts +4 -1
  2. package/index.js +26 -0
  3. package/index.js.map +1 -1
  4. package/item-classes/Tree.d.ts +5 -0
  5. package/item-classes/Tree.js +115 -0
  6. package/item-classes/Tree.js.map +1 -0
  7. package/item-classes/treeNodes.d.ts +12 -0
  8. package/item-classes/treeNodes.js +68 -0
  9. package/item-classes/treeNodes.js.map +1 -0
  10. package/package.json +2 -2
  11. package/proposals/actionableGroups/Tree.d.ts +7 -0
  12. package/proposals/actionableGroups/Tree.js +179 -0
  13. package/proposals/actionableGroups/Tree.js.map +1 -0
  14. package/proposals/actionableGroups/queries.d.ts +5 -0
  15. package/proposals/actionableGroups/queries.js +81 -0
  16. package/proposals/actionableGroups/queries.js.map +1 -0
  17. package/proposals/actionableGroups/treeNodes.d.ts +26 -0
  18. package/proposals/actionableGroups/treeNodes.js +94 -0
  19. package/proposals/actionableGroups/treeNodes.js.map +1 -0
  20. package/proposals/actionableGroups/types.d.ts +6 -0
  21. package/proposals/actionableGroups/types.js +5 -0
  22. package/proposals/actionableGroups/types.js.map +1 -0
  23. package/types/cr.d.ts +2 -1
  24. package/types/cr.js.map +1 -1
  25. package/types/item.d.ts +4 -1
  26. package/types/item.js.map +1 -1
  27. package/types/register.d.ts +4 -1
  28. package/types/register.js.map +1 -1
  29. package/types/stakeholder.d.ts +24 -41
  30. package/types/stakeholder.js +48 -16
  31. package/types/stakeholder.js.map +1 -1
  32. package/types/views.d.ts +4 -0
  33. package/types/views.js.map +1 -1
  34. package/views/BrowserCtx.d.ts +1 -1
  35. package/views/BrowserCtx.js.map +1 -1
  36. package/views/GenericRelatedItemView.js +21 -8
  37. package/views/GenericRelatedItemView.js.map +1 -1
  38. package/views/ItemDetailsDrawer.d.ts +1 -0
  39. package/views/ItemDetailsDrawer.js +4 -2
  40. package/views/ItemDetailsDrawer.js.map +1 -1
  41. package/views/ItemSearchDrawer.js +1 -1
  42. package/views/ItemSearchDrawer.js.map +1 -1
  43. package/views/Party.d.ts +0 -0
  44. package/views/Party.js +154 -0
  45. package/views/Party.js.map +1 -0
  46. package/views/RegisterStakeholder.js +2 -2
  47. package/views/RegisterStakeholder.js.map +1 -1
  48. package/views/StatefulTree.d.ts +19 -0
  49. package/views/StatefulTree.js +128 -0
  50. package/views/StatefulTree.js.map +1 -0
  51. package/views/change-request/ChangeRequestContext.js.map +1 -1
  52. package/views/change-request/TransitionHistory.js +6 -3
  53. package/views/change-request/TransitionHistory.js.map +1 -1
  54. package/views/change-request/TransitionOptions.js +37 -13
  55. package/views/change-request/TransitionOptions.js.map +1 -1
  56. package/views/detail/RegisterHome/index.js +20 -79
  57. package/views/detail/RegisterHome/index.js.map +1 -1
  58. package/views/detail/RegisterItem/index.d.ts +2 -2
  59. package/views/detail/RegisterItem/index.js +21 -14
  60. package/views/detail/RegisterItem/index.js.map +1 -1
  61. package/views/detail/RegisterItemClass.d.ts +12 -0
  62. package/views/detail/RegisterItemClass.js +98 -0
  63. package/views/detail/RegisterItemClass.js.map +1 -0
  64. package/views/detail/RegisterMeta/RegisterMetaForm.js +272 -114
  65. package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
  66. package/views/detail/RegisterMeta/index.js +1 -1
  67. package/views/detail/RegisterMeta/index.js.map +1 -1
  68. package/views/hooks/useStakeholder.d.ts +0 -0
  69. package/views/hooks/useStakeholder.js +1 -0
  70. package/views/hooks/useStakeholder.js.map +1 -0
  71. package/views/index.d.ts +1 -0
  72. package/views/index.js +71 -8
  73. package/views/index.js.map +1 -1
  74. package/views/protocolRegistry.d.ts +1 -0
  75. package/views/protocolRegistry.js +4 -0
  76. package/views/protocolRegistry.js.map +1 -1
  77. package/views/sidebar/Browse/index.js +8 -44
  78. package/views/sidebar/Browse/index.js.map +1 -1
  79. package/views/sidebar/Registration/index.js.map +1 -1
  80. package/views/sidebar/index.d.ts +2 -1
  81. package/views/sidebar/index.js +77 -62
  82. package/views/sidebar/index.js.map +1 -1
  83. package/views/util.d.ts +5 -0
  84. package/views/util.js +42 -4
  85. package/views/util.js.map +1 -1
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.GenericStatefulTree = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _immutabilityHelper = _interopRequireDefault(require("immutability-helper"));
11
+
12
+ var _react2 = require("@emotion/react");
13
+
14
+ var _core = require("@blueprintjs/core");
15
+
16
+ var _paneronExtensionKit = require("@riboseinc/paneron-extension-kit");
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ /** @jsx jsx */
21
+
22
+ /** @jsxFrag React.Fragment */
23
+ const initialState = {
24
+ //selectedFolderID: null,
25
+ selectedItemID: null,
26
+ expandedItemIDs: []
27
+ };
28
+ /** A tree that also uses persistent state reducer. */
29
+
30
+ const GenericStatefulTree = function ({
31
+ getNodes,
32
+ stateKey,
33
+ onItemDoubleClick,
34
+ className
35
+ }) {
36
+ const {
37
+ usePersistentDatasetStateReducer
38
+ } = (0, _react.useContext)(_paneronExtensionKit.DatasetContext);
39
+ const [state, dispatch] = usePersistentDatasetStateReducer(stateKey, undefined, undefined, function reduce(prevState, action) {
40
+ switch (action.type) {
41
+ case 'select-item':
42
+ if (prevState.selectedItemID !== action.payload.itemID) {
43
+ return { ...prevState,
44
+ selectedItemID: action.payload.itemID
45
+ };
46
+ } else {
47
+ return prevState;
48
+ }
49
+
50
+ case 'enter-item':
51
+ if (!prevState.expandedItemIDs.includes(action.payload.itemID)) {
52
+ return { ...prevState,
53
+ selectedItemID: action.payload.itemID,
54
+ expandedItemIDs: (0, _immutabilityHelper.default)(prevState.expandedItemIDs, {
55
+ $push: [action.payload.itemID]
56
+ })
57
+ };
58
+ } else {
59
+ return prevState;
60
+ }
61
+
62
+ case 'exit-item':
63
+ const idx = prevState.expandedItemIDs.indexOf(action.payload.itemID);
64
+
65
+ if (idx >= 0) {
66
+ return { ...prevState,
67
+ selectedItemID: action.payload.itemID,
68
+ expandedItemIDs: (0, _immutabilityHelper.default)(prevState.expandedItemIDs, {
69
+ $splice: [[idx, 1]]
70
+ })
71
+ };
72
+ } else {
73
+ return prevState;
74
+ }
75
+
76
+ default:
77
+ throw new Error("Unexpected browse state");
78
+ }
79
+ }, initialState, null);
80
+ const nodes = (0, _react.useMemo)(() => getNodes(state), [state, getNodes]);
81
+ const eventHandlers = (0, _react.useMemo)(() => ({
82
+ onNodeClick: node => dispatch({
83
+ type: 'select-item',
84
+ payload: {
85
+ itemID: node.id
86
+ }
87
+ }),
88
+ onNodeExpand: node => {
89
+ var _a;
90
+
91
+ return ((_a = node.nodeData) === null || _a === void 0 ? void 0 : _a.type) === 'group' ? dispatch({
92
+ type: 'enter-item',
93
+ payload: {
94
+ itemID: node.id
95
+ }
96
+ }) : void 0;
97
+ },
98
+ onNodeCollapse: node => {
99
+ var _a;
100
+
101
+ return ((_a = node.nodeData) === null || _a === void 0 ? void 0 : _a.type) === 'group' ? dispatch({
102
+ type: 'exit-item',
103
+ payload: {
104
+ itemID: node.id
105
+ }
106
+ }) : void 0;
107
+ },
108
+ onNodeDoubleClick: node => {
109
+ var _a;
110
+
111
+ return ((_a = node.nodeData) === null || _a === void 0 ? void 0 : _a.type) === 'group' ? dispatch({
112
+ type: 'enter-item',
113
+ payload: {
114
+ itemID: node.id
115
+ }
116
+ }) : onItemDoubleClick === null || onItemDoubleClick === void 0 ? void 0 : onItemDoubleClick(node);
117
+ }
118
+ }), [dispatch, onItemDoubleClick]);
119
+ return (0, _react2.jsx)(_core.Tree, {
120
+ className: className,
121
+ contents: nodes,
122
+ ...eventHandlers
123
+ });
124
+ };
125
+
126
+ exports.GenericStatefulTree = GenericStatefulTree;
127
+ var _default = GenericStatefulTree;
128
+ exports.default = _default;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatefulTree.js","sourceRoot":"","sources":["../../src/views/StatefulTree.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useMemo } from 'react';\nimport update from 'immutability-helper';\nimport { jsx } from '@emotion/react';\nimport { Tree, type TreeNodeInfo } from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\n\nexport type ItemOrGroupTreeNode = TreeNodeInfo<{ type: 'group' | 'item' }>;\n\nexport interface State {\n //selectedFolderID: string | null\n selectedItemID: string | null\n expandedItemIDs: readonly string[]\n}\n\nconst initialState: State = {\n //selectedFolderID: null,\n selectedItemID: null,\n expandedItemIDs: [],\n} as const;\n\ntype Action =\n | { type: 'select-item'; payload: { itemID: string | null; }; }\n | { type: 'enter-item'; payload: { itemID: string; }; }\n | { type: 'exit-item'; payload: { itemID: string; }; }\n\n\n/** A tree that also uses persistent state reducer. */\nexport const GenericStatefulTree: React.FC<{\n getNodes: (state: State) => ItemOrGroupTreeNode[]\n stateKey: string\n onItemDoubleClick?: (node: TreeNodeInfo<any>) => void\n className?: string\n}> =\nfunction ({ getNodes, stateKey, onItemDoubleClick, className }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n\n const [ state, dispatch, ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)(\n stateKey,\n undefined,\n undefined,\n function reduce(prevState, action) {\n switch (action.type) {\n case 'select-item':\n if (prevState.selectedItemID !== action.payload.itemID) {\n return {\n ...prevState,\n selectedItemID: action.payload.itemID,\n };\n } else {\n return prevState;\n }\n case 'enter-item':\n if (!prevState.expandedItemIDs.includes(action.payload.itemID)) {\n return {\n ...prevState,\n selectedItemID: action.payload.itemID,\n expandedItemIDs: update(\n prevState.expandedItemIDs,\n { $push: [action.payload.itemID] }),\n };\n } else {\n return prevState;\n }\n case 'exit-item':\n const idx = prevState.expandedItemIDs.indexOf(action.payload.itemID);\n if (idx >= 0) {\n return {\n ...prevState,\n selectedItemID: action.payload.itemID,\n expandedItemIDs: update(\n prevState.expandedItemIDs,\n { $splice: [[idx, 1]] }),\n };\n } else {\n return prevState;\n }\n default:\n throw new Error(\"Unexpected browse state\");\n }\n },\n initialState,\n null);\n\n const nodes = useMemo(\n (() => getNodes(state)),\n [state, getNodes]);\n\n const eventHandlers = useMemo((() => ({\n onNodeClick: (node: ItemOrGroupTreeNode) =>\n dispatch({\n type: 'select-item',\n payload: { itemID: node.id as string },\n }),\n onNodeExpand: (node: ItemOrGroupTreeNode) =>\n node.nodeData?.type === 'group'\n ? dispatch({\n type: 'enter-item',\n payload: { itemID: node.id as string },\n })\n : void 0,\n onNodeCollapse: (node: ItemOrGroupTreeNode) =>\n node.nodeData?.type === 'group'\n ? dispatch({\n type: 'exit-item',\n payload: { itemID: node.id as string },\n })\n : void 0,\n onNodeDoubleClick: (node: ItemOrGroupTreeNode) =>\n node.nodeData?.type === 'group'\n ? dispatch({\n type: 'enter-item',\n payload: { itemID: node.id as string },\n })\n : onItemDoubleClick?.(node),\n })), [dispatch, onItemDoubleClick]);\n\n return <Tree\n className={className}\n contents={nodes}\n {...eventHandlers}\n />;\n};\n\nexport default GenericStatefulTree;\n"]}
@@ -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, 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 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 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
+ {"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 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 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"]}
@@ -88,7 +88,8 @@ function getTransitionHistory(cr) {
88
88
  toState: CR.State.RETURNED_FOR_CLARIFICATION,
89
89
  input: {
90
90
  registerManagerNotes: cr.registerManagerNotes,
91
- controlBodyNotes: cr.controlBodyNotes
91
+ controlBodyNotes: cr.controlBodyNotes,
92
+ controlBodyDecisionEvent: cr.controlBodyDecisionEvent
92
93
  }
93
94
  });
94
95
  }
@@ -105,7 +106,8 @@ function getTransitionHistory(cr) {
105
106
  toState: CR.State.ACCEPTED,
106
107
  timestamp: cr.timeDisposed,
107
108
  input: {
108
- controlBodyNotes: cr.controlBodyNotes
109
+ controlBodyNotes: cr.controlBodyNotes,
110
+ controlBodyDecisionEvent: cr.controlBodyDecisionEvent
109
111
  }
110
112
  });
111
113
  } else if (CR.isRejected(cr)) {
@@ -114,7 +116,8 @@ function getTransitionHistory(cr) {
114
116
  toState: CR.State.REJECTED,
115
117
  timestamp: cr.timeDisposed,
116
118
  input: {
117
- controlBodyNotes: cr.controlBodyNotes
119
+ controlBodyNotes: cr.controlBodyNotes,
120
+ controlBodyDecisionEvent: cr.controlBodyDecisionEvent
118
121
  }
119
122
  });
120
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TransitionHistory.js","sourceRoot":"","sources":["../../../src/views/change-request/TransitionHistory.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport styled from '@emotion/styled';\nimport { jsx, css } from '@emotion/react';\nimport React from 'react';\nimport { Icon, Colors } from '@blueprintjs/core';\n\nimport { normalizeObjectRecursively } from '@riboseinc/paneron-extension-kit/util';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\n\nimport { Val } from '../diffing/InlineDiff';\nimport { RegisterStakeholderListItem } from '../RegisterStakeholder';\nimport * as CR from '../../types/cr';\nimport { type RegisterStakeholder } from '../../types/stakeholder';\nimport { STATE_COLOR } from './TransitionOptions';\n\n\n/**\n * Transition history entry is mostly like `CR.TransitionEntry`,\n * except it has optional fields and can be `undefined` to represent\n * missing parts of history.\n */\nexport type TransitionHistoryEntry = Omit<CR.TransitionEntry, 'timestamp' | 'fromState' | 'stakeholder' | 'input'> & {\n timestamp?: Date\n fromState?: CR.StateType\n stakeholder?: RegisterStakeholder\n input?: CR.StateInput\n} | undefined;\n\n\n/**\n * Outputs transition history,\n * back-filling it from state and timestamps if `pastTransitions` is not present.\n */\nexport function getTransitionHistory(cr: CR.Base): TransitionHistoryEntry[] {\n if (cr.pastTransitions && cr.pastTransitions.length > 0) {\n return [{\n label: \"Create\",\n toState: CR.State.DRAFT,\n timestamp: (cr as CR.Drafted).timeStarted,\n }, ...cr.pastTransitions];\n\n } else {\n const els: TransitionHistoryEntry[] = [];\n\n els.push({\n label: \"Create\",\n toState: CR.State.DRAFT,\n timestamp: (cr as CR.Drafted).timeStarted,\n });\n\n if (!CR.isDrafted(cr)) {\n els.push(undefined);\n }\n\n // Backward compatibility\n\n if (CR.isProposed(cr)) {\n els.push({\n label: \"Propose\",\n toState: CR.State.PROPOSED,\n timestamp: cr.timeProposed,\n input: { justification: cr.justification },\n });\n }\n\n if (CR.isSubmittedForControlBodyReview(cr)) {\n els.push({\n label: \"Submit for control body review\",\n fromState: CR.State.PROPOSED,\n toState: CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW,\n input: { registerManagerNotes: cr.registerManagerNotes },\n });\n }\n\n if (CR.isReturnedForClarification(cr)) {\n els.push({\n label: \"Return for clarification\",\n toState: CR.State.RETURNED_FOR_CLARIFICATION,\n input: {\n registerManagerNotes: cr.registerManagerNotes,\n controlBodyNotes: (cr as any).controlBodyNotes,\n },\n });\n }\n\n if (CR.isWithdrawn(cr)) {\n els.push({\n label: \"Withdraw\",\n toState: CR.State.WITHDRAWN,\n timestamp: cr.timeDisposed,\n });\n } else if (CR.isAccepted(cr)) {\n els.push({\n label: \"Accept\",\n toState: CR.State.ACCEPTED,\n timestamp: cr.timeDisposed,\n input: {\n controlBodyNotes: (cr as any).controlBodyNotes,\n },\n });\n } else if (CR.isRejected(cr)) {\n els.push({\n label: \"Reject\",\n toState: CR.State.REJECTED,\n timestamp: cr.timeDisposed,\n input: {\n controlBodyNotes: (cr as any).controlBodyNotes,\n },\n });\n }\n\n if (CR.isAppealed(cr)) {\n els.push({\n label: \"Appeal\",\n toState: CR.State.APPEALED,\n input: {\n appealReason: cr.appealReason,\n },\n });\n }\n\n if (CR.isRejectedWithAppealWithdrawn(cr)) {\n els.push({\n label: \"Withdraw appeal\",\n toState: CR.State.APPEAL_WITHDRAWN,\n timestamp: cr.timeDisposed,\n });\n } else if (CR.isAcceptedOnAppeal(cr)) {\n els.push({\n label: \"Accept on appeal\",\n toState: CR.State.ACCEPTED_ON_APPEAL,\n timestamp: cr.timeDisposed,\n input: {\n registerOwnerNotes: cr.registerOwnerNotes,\n },\n });\n } else if (CR.isRejectedOnAppeal(cr)) {\n els.push({\n label: \"Uphold rejection\",\n toState: CR.State.REJECTION_UPHELD_ON_APPEAL,\n timestamp: cr.timeDisposed,\n input: {\n registerOwnerNotes: cr.registerOwnerNotes,\n },\n });\n }\n return els;\n }\n}\n\n\n/**\n * Lists transitions between states,\n * emphasizing the end (current as of now) state.\n */\nexport const TransitionsAndStatus: React.VoidFunctionComponent<{\n pastTransitions: TransitionHistoryEntry[]\n isFinal?: boolean\n}> = function ({ pastTransitions, isFinal }) {\n return (\n <>\n {pastTransitions.map((entry, idx) => {\n if (entry) {\n const { label, stakeholder, fromState, toState, input, timestamp } = entry;\n return <TransitionEntryWrapper\n title={`Transition ${fromState ? `from ${fromState} ` : ''}to ${toState}`}\n css={css`\n background: linear-gradient(\n 345deg,\n ${STATE_COLOR[toState] ?? Colors.GRAY1}aa,\n ${STATE_COLOR[toState] ?? Colors.GRAY1} 50%);\n position: sticky;\n top: ${idx * 3}px;\n z-index: 1;\n ${idx === pastTransitions.length - 1\n ? `\n font-weight: bold;\n ${isFinal\n ? `\n &::before {\n ${transitionEntryDecorativeMarkerFinal}\n }\n `\n : ''}\n `\n : ''}\n ${idx === 0\n ? `\n &::before {\n ${transitionEntryDecorativeMarkerInitial}\n }\n `\n : ''}\n `}\n key={idx}>\n {label}\n {input || timestamp || stakeholder\n ? <>&nbsp;<HelpTooltip icon=\"info-sign\" content={<div css={css`display: flex; flex-flow: column nowrap;`}>\n {stakeholder\n ? <span><RegisterStakeholderListItem stakeholder={stakeholder} /></span>\n : null}\n {timestamp\n ? (timestamp.toISOString?.() || timestamp)\n : null}\n {input\n ? <div><Val val={normalizeObjectRecursively(input)} /></div>\n : null}\n </div>} /></>\n : undefined}\n </TransitionEntryWrapper>\n } else {\n if (idx > 0 && pastTransitions[idx - 1] !== undefined) {\n return <MissingTransitionEntries />;\n } else {\n // Don’t output multiple missing steps in a row.\n return null;\n }\n }\n })}\n </>\n );\n};\n\n\n/** Shown in place of transition entries, if some are missing. */\nconst MissingTransitionEntries: React.VoidFunctionComponent<Record<never, never>> = function () {\n return (\n <div title=\"No detailed state transitions available\">\n <Icon\n icon=\"more\"\n css={css`\n position: relative;\n left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX}px;\n transform: translateX(-50%);\n `}\n />\n </div>\n );\n};\n\n\nconst TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX = 22;\n\n/**\n * Style rules for pseudo-element that contains decorative marker line with a circle.\n */\nconst transitionEntryDecorativeMarker = `\n content: \" \";\n background: white;\n display: block;\n overflow: hidden;\n z-index: 1;\n position: absolute;\n left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX}px;\n\n transform: translateX(-50%);\n top: 0;\n width: 2px;\n bottom: 0;\n`;\n\n/**\n * Style rules for pseudo-element that contains decorative marker line with a circle.\n */\nconst transitionEntryDecorativeMarkerInitial = `\n top: 50%;\n`;\n\n/**\n * Style rules for pseudo-element that contains decorative marker line with a circle.\n */\nconst transitionEntryDecorativeMarkerFinal = `\n bottom: 50%;\n`;\n\n\nconst TransitionEntryWrapper = styled.div`\n position: relative;\n color: white;\n padding: 10px;\n padding-left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX + 20}px;\n margin-bottom: 1px;\n\n &::after {\n content: \" \";\n background: white;\n display: block;\n overflow: hidden;\n z-index: 1;\n position: absolute;\n left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX}px;\n\n transform: translateX(-50%) translateY(-50%);\n top: 50%;\n width: 10px;\n height: 10px;\n border-radius: 100%;\n }\n\n &::before {\n ${transitionEntryDecorativeMarker}\n }\n`;\n\n\nexport default TransitionsAndStatus;\n"]}
1
+ {"version":3,"file":"TransitionHistory.js","sourceRoot":"","sources":["../../../src/views/change-request/TransitionHistory.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport styled from '@emotion/styled';\nimport { jsx, css } from '@emotion/react';\nimport React from 'react';\nimport { Icon, Colors } from '@blueprintjs/core';\n\nimport { normalizeObjectRecursively } from '@riboseinc/paneron-extension-kit/util';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\n\nimport { Val } from '../diffing/InlineDiff';\nimport { RegisterStakeholderListItem } from '../RegisterStakeholder';\nimport * as CR from '../../types/cr';\nimport { type RegisterStakeholder } from '../../types/stakeholder';\nimport { STATE_COLOR } from './TransitionOptions';\n\n\n/**\n * Transition history entry is mostly like `CR.TransitionEntry`,\n * except it has optional fields and can be `undefined` to represent\n * missing parts of history.\n */\nexport type TransitionHistoryEntry = Omit<CR.TransitionEntry, 'timestamp' | 'fromState' | 'stakeholder' | 'input'> & {\n timestamp?: Date\n fromState?: CR.StateType\n stakeholder?: RegisterStakeholder\n input?: CR.StateInput\n} | undefined;\n\n\n/**\n * Outputs transition history,\n * back-filling it from state and timestamps if `pastTransitions` is not present.\n */\nexport function getTransitionHistory(cr: CR.Base): TransitionHistoryEntry[] {\n if (cr.pastTransitions && cr.pastTransitions.length > 0) {\n return [{\n label: \"Create\",\n toState: CR.State.DRAFT,\n timestamp: (cr as CR.Drafted).timeStarted,\n }, ...cr.pastTransitions];\n\n } else {\n const els: TransitionHistoryEntry[] = [];\n\n els.push({\n label: \"Create\",\n toState: CR.State.DRAFT,\n timestamp: (cr as CR.Drafted).timeStarted,\n });\n\n if (!CR.isDrafted(cr)) {\n els.push(undefined);\n }\n\n // Backward compatibility\n\n if (CR.isProposed(cr)) {\n els.push({\n label: \"Propose\",\n toState: CR.State.PROPOSED,\n timestamp: cr.timeProposed,\n input: { justification: cr.justification },\n });\n }\n\n if (CR.isSubmittedForControlBodyReview(cr)) {\n els.push({\n label: \"Submit for control body review\",\n fromState: CR.State.PROPOSED,\n toState: CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW,\n input: { registerManagerNotes: cr.registerManagerNotes },\n });\n }\n\n if (CR.isReturnedForClarification(cr)) {\n els.push({\n label: \"Return for clarification\",\n toState: CR.State.RETURNED_FOR_CLARIFICATION,\n input: {\n registerManagerNotes: cr.registerManagerNotes,\n controlBodyNotes: (cr as any).controlBodyNotes,\n controlBodyDecisionEvent: (cr as any).controlBodyDecisionEvent,\n },\n });\n }\n\n if (CR.isWithdrawn(cr)) {\n els.push({\n label: \"Withdraw\",\n toState: CR.State.WITHDRAWN,\n timestamp: cr.timeDisposed,\n });\n } else if (CR.isAccepted(cr)) {\n els.push({\n label: \"Accept\",\n toState: CR.State.ACCEPTED,\n timestamp: cr.timeDisposed,\n input: {\n controlBodyNotes: (cr as any).controlBodyNotes,\n controlBodyDecisionEvent: (cr as any).controlBodyDecisionEvent,\n },\n });\n } else if (CR.isRejected(cr)) {\n els.push({\n label: \"Reject\",\n toState: CR.State.REJECTED,\n timestamp: cr.timeDisposed,\n input: {\n controlBodyNotes: (cr as any).controlBodyNotes,\n controlBodyDecisionEvent: (cr as any).controlBodyDecisionEvent,\n },\n });\n }\n\n if (CR.isAppealed(cr)) {\n els.push({\n label: \"Appeal\",\n toState: CR.State.APPEALED,\n input: {\n appealReason: cr.appealReason,\n },\n });\n }\n\n if (CR.isRejectedWithAppealWithdrawn(cr)) {\n els.push({\n label: \"Withdraw appeal\",\n toState: CR.State.APPEAL_WITHDRAWN,\n timestamp: cr.timeDisposed,\n });\n } else if (CR.isAcceptedOnAppeal(cr)) {\n els.push({\n label: \"Accept on appeal\",\n toState: CR.State.ACCEPTED_ON_APPEAL,\n timestamp: cr.timeDisposed,\n input: {\n registerOwnerNotes: cr.registerOwnerNotes,\n },\n });\n } else if (CR.isRejectedOnAppeal(cr)) {\n els.push({\n label: \"Uphold rejection\",\n toState: CR.State.REJECTION_UPHELD_ON_APPEAL,\n timestamp: cr.timeDisposed,\n input: {\n registerOwnerNotes: cr.registerOwnerNotes,\n },\n });\n }\n return els;\n }\n}\n\n\n/**\n * Lists transitions between states,\n * emphasizing the end (current as of now) state.\n */\nexport const TransitionsAndStatus: React.VoidFunctionComponent<{\n pastTransitions: TransitionHistoryEntry[]\n isFinal?: boolean\n}> = function ({ pastTransitions, isFinal }) {\n return (\n <>\n {pastTransitions.map((entry, idx) => {\n if (entry) {\n const { label, stakeholder, fromState, toState, input, timestamp } = entry;\n return <TransitionEntryWrapper\n title={`Transition ${fromState ? `from ${fromState} ` : ''}to ${toState}`}\n css={css`\n background: linear-gradient(\n 345deg,\n ${STATE_COLOR[toState] ?? Colors.GRAY1}aa,\n ${STATE_COLOR[toState] ?? Colors.GRAY1} 50%);\n position: sticky;\n top: ${idx * 3}px;\n z-index: 1;\n ${idx === pastTransitions.length - 1\n ? `\n font-weight: bold;\n ${isFinal\n ? `\n &::before {\n ${transitionEntryDecorativeMarkerFinal}\n }\n `\n : ''}\n `\n : ''}\n ${idx === 0\n ? `\n &::before {\n ${transitionEntryDecorativeMarkerInitial}\n }\n `\n : ''}\n `}\n key={idx}>\n {label}\n {input || timestamp || stakeholder\n ? <>&nbsp;<HelpTooltip icon=\"info-sign\" content={<div css={css`display: flex; flex-flow: column nowrap;`}>\n {stakeholder\n ? <span><RegisterStakeholderListItem stakeholder={stakeholder} /></span>\n : null}\n {timestamp\n ? (timestamp.toISOString?.() || timestamp)\n : null}\n {input\n ? <div><Val val={normalizeObjectRecursively(input)} /></div>\n : null}\n </div>} /></>\n : undefined}\n </TransitionEntryWrapper>\n } else {\n if (idx > 0 && pastTransitions[idx - 1] !== undefined) {\n return <MissingTransitionEntries />;\n } else {\n // Don’t output multiple missing steps in a row.\n return null;\n }\n }\n })}\n </>\n );\n};\n\n\n/** Shown in place of transition entries, if some are missing. */\nconst MissingTransitionEntries: React.VoidFunctionComponent<Record<never, never>> = function () {\n return (\n <div title=\"No detailed state transitions available\">\n <Icon\n icon=\"more\"\n css={css`\n position: relative;\n left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX}px;\n transform: translateX(-50%);\n `}\n />\n </div>\n );\n};\n\n\nconst TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX = 22;\n\n/**\n * Style rules for pseudo-element that contains decorative marker line with a circle.\n */\nconst transitionEntryDecorativeMarker = `\n content: \" \";\n background: white;\n display: block;\n overflow: hidden;\n z-index: 1;\n position: absolute;\n left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX}px;\n\n transform: translateX(-50%);\n top: 0;\n width: 2px;\n bottom: 0;\n`;\n\n/**\n * Style rules for pseudo-element that contains decorative marker line with a circle.\n */\nconst transitionEntryDecorativeMarkerInitial = `\n top: 50%;\n`;\n\n/**\n * Style rules for pseudo-element that contains decorative marker line with a circle.\n */\nconst transitionEntryDecorativeMarkerFinal = `\n bottom: 50%;\n`;\n\n\nconst TransitionEntryWrapper = styled.div`\n position: relative;\n color: white;\n padding: 10px;\n padding-left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX + 20}px;\n margin-bottom: 1px;\n\n &::after {\n content: \" \";\n background: white;\n display: block;\n overflow: hidden;\n z-index: 1;\n position: absolute;\n left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX}px;\n\n transform: translateX(-50%) translateY(-50%);\n top: 50%;\n width: 10px;\n height: 10px;\n border-radius: 100%;\n }\n\n &::before {\n ${transitionEntryDecorativeMarker}\n }\n`;\n\n\nexport default TransitionsAndStatus;\n"]}
@@ -20,6 +20,8 @@ var _context = require("@riboseinc/paneron-extension-kit/context");
20
20
 
21
21
  var _BrowserCtx = require("../BrowserCtx");
22
22
 
23
+ var _stakeholder = require("../../types/stakeholder");
24
+
23
25
  var _itemPathUtils = require("../itemPathUtils");
24
26
 
25
27
  var CR = _interopRequireWildcard(require("../../types/cr"));
@@ -254,14 +256,16 @@ const applyRegisterManagerDecision = function applyRegisterManagerDecision(cr, {
254
256
  };
255
257
 
256
258
  const applyControlBodyDecision = function applyControlBodyDecision(cr, {
257
- controlBodyNotes
259
+ controlBodyNotes,
260
+ controlBodyDecisionEvent
258
261
  }) {
259
262
  if (!(controlBodyNotes === null || controlBodyNotes === void 0 ? void 0 : controlBodyNotes.trim())) {
260
263
  throw new Error("Control body decision is required.");
261
264
  }
262
265
 
263
266
  return { ...cr,
264
- controlBodyNotes
267
+ controlBodyNotes,
268
+ controlBodyDecisionEvent
265
269
  };
266
270
  };
267
271
 
@@ -364,16 +368,36 @@ const ControlBodyNotesWidget = function ({
364
368
  onChange
365
369
  }) {
366
370
  return (0, _react2.jsx)(_core.FormGroup, {
367
- label: "Control Body decision:"
371
+ label: "Control Body notes:"
368
372
  }, (0, _react2.jsx)(TransitionInputTextArea, {
369
373
  value: value.controlBodyNotes,
370
374
  required: true,
371
375
  onChange: evt => onChange === null || onChange === void 0 ? void 0 : onChange({
372
- controlBodyNotes: evt.currentTarget.value
376
+ controlBodyNotes: evt.currentTarget.value,
377
+ controlBodyDecisionEvent: value.controlBodyDecisionEvent
373
378
  })
374
379
  }));
375
380
  };
376
381
 
382
+ const ControlBodyDecisionWidget = function ({
383
+ value,
384
+ onChange
385
+ }) {
386
+ return (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(ControlBodyNotesWidget, {
387
+ value: value,
388
+ onChange: onChange
389
+ }), (0, _react2.jsx)(_core.FormGroup, {
390
+ label: "Control Body decision event:"
391
+ }, (0, _react2.jsx)(TransitionInputTextArea, {
392
+ value: value.controlBodyDecisionEvent,
393
+ required: true,
394
+ onChange: evt => onChange === null || onChange === void 0 ? void 0 : onChange({
395
+ controlBodyNotes: value.controlBodyNotes,
396
+ controlBodyDecisionEvent: evt.currentTarget.value
397
+ })
398
+ })));
399
+ };
400
+
377
401
  const AppealRequestWidget = function ({
378
402
  value,
379
403
  onChange
@@ -434,14 +458,14 @@ const TRANSITIONS = {
434
458
  [CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: {
435
459
  title: "Submit for control body review",
436
460
  targetState: CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW,
437
- canBeTransitionedBy: stakeholder => ['owner', 'manager'].indexOf(stakeholder.role) >= 0,
461
+ canBeTransitionedBy: s => (0, _stakeholder.isOwner)(s) || (0, _stakeholder.isManager)(s),
438
462
  Widget: RegisterManagerNotesWidget,
439
463
  func: applyRegisterManagerDecision
440
464
  },
441
465
  [CR.State.RETURNED_FOR_CLARIFICATION]: {
442
466
  title: "Return for clarification",
443
467
  targetState: CR.State.RETURNED_FOR_CLARIFICATION,
444
- canBeTransitionedBy: stakeholder => ['owner', 'manager'].indexOf(stakeholder.role) >= 0,
468
+ canBeTransitionedBy: s => (0, _stakeholder.isOwner)(s) || (0, _stakeholder.isManager)(s),
445
469
  Widget: RegisterManagerNotesWidget,
446
470
  func: function applyRegisterManagerReturnDecision(cr, payload) {
447
471
  var _a;
@@ -459,15 +483,15 @@ const TRANSITIONS = {
459
483
  [CR.State.RETURNED_FOR_CLARIFICATION]: {
460
484
  title: "Return for clarification",
461
485
  targetState: CR.State.RETURNED_FOR_CLARIFICATION,
462
- canBeTransitionedBy: stakeholder => ['owner', 'control-body'].indexOf(stakeholder.role) >= 0,
486
+ canBeTransitionedBy: s => (0, _stakeholder.isOwner)(s) || (0, _stakeholder.isControlBody)(s),
463
487
  Widget: ControlBodyNotesWidget,
464
488
  func: applyControlBodyDecision
465
489
  },
466
490
  [CR.State.ACCEPTED]: {
467
491
  title: "Accept",
468
492
  targetState: CR.State.ACCEPTED,
469
- canBeTransitionedBy: stakeholder => ['owner', 'control-body'].indexOf(stakeholder.role) >= 0,
470
- Widget: ControlBodyNotesWidget,
493
+ canBeTransitionedBy: s => (0, _stakeholder.isOwner)(s) || (0, _stakeholder.isControlBody)(s),
494
+ Widget: ControlBodyDecisionWidget,
471
495
  func: (cr, controlBodyInput) => ({ ...applyControlBodyDecision(cr, controlBodyInput),
472
496
  timeDisposed: new Date()
473
497
  })
@@ -475,8 +499,8 @@ const TRANSITIONS = {
475
499
  [CR.State.REJECTED]: {
476
500
  title: "Reject",
477
501
  targetState: CR.State.REJECTED,
478
- canBeTransitionedBy: stakeholder => ['owner', 'control-body'].indexOf(stakeholder.role) >= 0,
479
- Widget: ControlBodyNotesWidget,
502
+ canBeTransitionedBy: s => (0, _stakeholder.isOwner)(s) || (0, _stakeholder.isControlBody)(s),
503
+ Widget: ControlBodyDecisionWidget,
480
504
  func: (cr, controlBodyInput) => ({ ...applyControlBodyDecision(cr, controlBodyInput),
481
505
  timeDisposed: new Date()
482
506
  })
@@ -508,14 +532,14 @@ const TRANSITIONS = {
508
532
  [CR.State.ACCEPTED_ON_APPEAL]: {
509
533
  title: "Accept on appeal",
510
534
  targetState: CR.State.ACCEPTED_ON_APPEAL,
511
- canBeTransitionedBy: stakeholder => stakeholder.role === 'owner',
535
+ canBeTransitionedBy: _stakeholder.isOwner,
512
536
  Widget: RegisterOwnerNotesWidget,
513
537
  func: applyRegisterOwnerDecision
514
538
  },
515
539
  [CR.State.REJECTION_UPHELD_ON_APPEAL]: {
516
540
  title: "Uphold rejection",
517
541
  targetState: CR.State.REJECTION_UPHELD_ON_APPEAL,
518
- canBeTransitionedBy: stakeholder => stakeholder.role === 'owner',
542
+ canBeTransitionedBy: _stakeholder.isOwner,
519
543
  Widget: RegisterOwnerNotesWidget,
520
544
  func: applyRegisterOwnerDecision
521
545
  }
@@ -1 +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, type 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\nfunction reducer(prevState: State, action: 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\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, alterApprovedCR } = useContext(BrowserCtx);\n const {\n getObjectData,\n getMapReducedData,\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 reducer,\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 const maybeAlteredCR = alterApprovedCR\n ? await alterApprovedCR(\n cr.id,\n cr.items,\n origItemData,\n newItemData,\n { getMapReducedData })\n : { proposals: cr.items, origItemData, newItemData };\n //console.debug(\"Got altered item data\", newItemData);\n return await proposalsToObjectChangeset(\n cr.id,\n subregisters !== undefined,\n maybeAlteredCR.proposals,\n maybeAlteredCR.origItemData,\n maybeAlteredCR.newItemData);\n }, [cr.id, JSON.stringify(cr.items), subregisters === undefined, getObjectData, getMapReducedData, alterApprovedCR]);\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 ?? []),\n {\n label: transitionCfg.title,\n timestamp: new Date(),\n fromState: cr.state,\n toState: newCR.state,\n stakeholder,\n input: stateInput,\n },\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"]}
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, type 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 { isOwner, isControlBody, isManager } from '../../types/stakeholder';\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\nfunction reducer(prevState: State, action: 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\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, alterApprovedCR } = useContext(BrowserCtx);\n const {\n getObjectData,\n getMapReducedData,\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 reducer,\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 const maybeAlteredCR = alterApprovedCR\n ? await alterApprovedCR(\n cr.id,\n cr.items,\n origItemData,\n newItemData,\n { getMapReducedData })\n : { proposals: cr.items, origItemData, newItemData };\n //console.debug(\"Got altered item data\", newItemData);\n return await proposalsToObjectChangeset(\n cr.id,\n subregisters !== undefined,\n maybeAlteredCR.proposals,\n maybeAlteredCR.origItemData,\n maybeAlteredCR.newItemData);\n }, [cr.id, JSON.stringify(cr.items), subregisters === undefined, getObjectData, getMapReducedData, alterApprovedCR]);\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 ?? []),\n {\n label: transitionCfg.title,\n timestamp: new Date(),\n fromState: cr.state,\n toState: newCR.state,\n stakeholder,\n input: stateInput,\n },\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,\n validatedStateInput,\n )\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, controlBodyDecisionEvent }) {\n if (!controlBodyNotes?.trim()) {\n throw new Error(\"Control body decision is required.\");\n }\n return {\n ...cr,\n controlBodyNotes,\n controlBodyDecisionEvent,\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 notes:\">\n <TransitionInputTextArea\n value={value.controlBodyNotes}\n required\n onChange={evt =>\n onChange?.({\n controlBodyNotes: evt.currentTarget.value,\n controlBodyDecisionEvent: value.controlBodyDecisionEvent,\n })\n }\n />\n </FormGroup>\n );\n};\n\n\nconst ControlBodyDecisionWidget: React.FC<{\n value: CR.ControlBodyInput\n onChange?: (newVal: CR.ControlBodyInput) => void\n}> = function ({ value, onChange }) {\n return (\n <>\n <ControlBodyNotesWidget\n value={value}\n onChange={onChange}\n />\n <FormGroup label=\"Control Body decision event:\">\n <TransitionInputTextArea\n value={value.controlBodyDecisionEvent}\n required\n onChange={evt =>\n onChange?.({\n controlBodyNotes: value.controlBodyNotes,\n controlBodyDecisionEvent: evt.currentTarget.value,\n })\n }\n />\n </FormGroup>\n </>\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: (s) => isOwner(s) || isManager(s),\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: (s) => isOwner(s) || isManager(s),\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: (s) => isOwner(s) || isControlBody(s),\n Widget: ControlBodyNotesWidget,\n func: applyControlBodyDecision,\n },\n [CR.State.ACCEPTED]: {\n title: \"Accept\",\n targetState: CR.State.ACCEPTED,\n canBeTransitionedBy: (s) => isOwner(s) || isControlBody(s),\n Widget: ControlBodyDecisionWidget,\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: (s) => isOwner(s) || isControlBody(s),\n Widget: ControlBodyDecisionWidget,\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: isOwner,\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: isOwner,\n Widget: RegisterOwnerNotesWidget,\n func: applyRegisterOwnerDecision,\n },\n },\n} as const;\n\n\nexport default TransitionOptions;\n"]}