@riboseinc/paneron-registry-kit 2.2.32 → 2.2.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +2 -2
- package/index.js +3 -3
- package/index.js.map +1 -1
- package/item-classes/Tree.js +4 -6
- package/item-classes/Tree.js.map +1 -1
- package/package.json +2 -2
- package/{views/change-request → proposals}/ChangeRequestContext.d.ts +3 -2
- package/{views/change-request → proposals}/ChangeRequestContext.js +7 -7
- package/proposals/ChangeRequestContext.js.map +1 -0
- package/{views/ProposalHistoryDrawer.js → proposals/HistoryDrawer.js} +11 -13
- package/proposals/HistoryDrawer.js.map +1 -0
- package/{views/change-request/Summary.d.ts → proposals/MetaProperties.d.ts} +4 -3
- package/{views/change-request/Summary.js → proposals/MetaProperties.js} +9 -4
- package/proposals/MetaProperties.js.map +1 -0
- package/proposals/ProposalBrowser.d.ts +22 -0
- package/{views/change-request/Proposals.js → proposals/ProposalBrowser.js} +22 -204
- package/proposals/ProposalBrowser.js.map +1 -0
- package/proposals/ProposalDetail.d.ts +6 -0
- package/proposals/ProposalDetail.js +66 -0
- package/proposals/ProposalDetail.js.map +1 -0
- package/proposals/ProposalItem.d.ts +16 -0
- package/proposals/ProposalItem.js +57 -0
- package/proposals/ProposalItem.js.map +1 -0
- package/proposals/ProposalSummary.d.ts +6 -0
- package/proposals/ProposalSummary.js +62 -0
- package/proposals/ProposalSummary.js.map +1 -0
- package/proposals/ProposalType.d.ts +11 -0
- package/proposals/ProposalType.js +99 -0
- package/proposals/ProposalType.js.map +1 -0
- package/proposals/Search.d.ts +26 -0
- package/proposals/Search.js +108 -0
- package/proposals/Search.js.map +1 -0
- package/{views/change-request → proposals}/TransitionHistory.d.ts +3 -2
- package/{views/change-request → proposals}/TransitionHistory.js +18 -14
- package/proposals/TransitionHistory.js.map +1 -0
- package/{views/change-request → proposals}/TransitionOptions.d.ts +3 -3
- package/{views/change-request → proposals}/TransitionOptions.js +34 -12
- package/proposals/TransitionOptions.js.map +1 -0
- package/proposals/actionableGroups/Tree.js +22 -4
- package/proposals/actionableGroups/Tree.js.map +1 -1
- package/proposals/actionableGroups/queries.d.ts +0 -1
- package/proposals/actionableGroups/queries.js +7 -10
- package/proposals/actionableGroups/queries.js.map +1 -1
- package/proposals/actionableGroups/treeNodes.d.ts +1 -1
- package/proposals/actionableGroups/treeNodes.js +1 -1
- package/proposals/actionableGroups/treeNodes.js.map +1 -1
- package/proposals/index.d.ts +6 -0
- package/proposals/index.js +83 -0
- package/proposals/index.js.map +1 -0
- package/{views/change-request → proposals}/objectChangeset.d.ts +4 -3
- package/{views/change-request → proposals}/objectChangeset.js +5 -5
- package/proposals/objectChangeset.js.map +1 -0
- package/proposals/queries.d.ts +4 -0
- package/proposals/queries.js +14 -0
- package/proposals/queries.js.map +1 -0
- package/{types/cr.d.ts → proposals/types.d.ts} +78 -4
- package/{types/cr.js → proposals/types.js} +68 -2
- package/proposals/types.js.map +1 -0
- package/types/index.d.ts +0 -1
- package/types/index.js +0 -13
- package/types/index.js.map +1 -1
- package/types/views.d.ts +1 -1
- package/types/views.js.map +1 -1
- package/views/FilterCriteria/models.d.ts +2 -0
- package/views/FilterCriteria/models.js +12 -2
- package/views/FilterCriteria/models.js.map +1 -1
- package/views/GenericRelatedItemView.js +4 -4
- package/views/GenericRelatedItemView.js.map +1 -1
- package/views/RegisterStakeholder.d.ts +4 -1
- package/views/RegisterStakeholder.js +19 -13
- package/views/RegisterStakeholder.js.map +1 -1
- package/views/detail/ChangeRequest/index.js +10 -10
- package/views/detail/ChangeRequest/index.js.map +1 -1
- package/views/detail/ProposalWork.d.ts +8 -0
- package/views/detail/ProposalWork.js +173 -0
- package/views/detail/ProposalWork.js.map +1 -0
- package/views/detail/RegisterHome/ActiveProposalDetails.d.ts +1 -1
- package/views/detail/RegisterHome/ActiveProposalDetails.js +4 -4
- package/views/detail/RegisterHome/ActiveProposalDetails.js.map +1 -1
- package/views/detail/RegisterHome/Proposal.d.ts +1 -1
- package/views/detail/RegisterHome/Proposal.js +2 -6
- package/views/detail/RegisterHome/Proposal.js.map +1 -1
- package/views/detail/RegisterHome/index.js +10 -14
- package/views/detail/RegisterHome/index.js.map +1 -1
- package/views/detail/RegisterItem/index.d.ts +1 -1
- package/views/detail/RegisterItem/index.js +7 -7
- package/views/detail/RegisterItem/index.js.map +1 -1
- package/views/detail/RegisterItemClass.js +1 -1
- package/views/detail/RegisterItemClass.js.map +1 -1
- package/views/hooks/useRegisterVersion.d.ts +1 -0
- package/views/hooks/useRegisterVersion.js +43 -0
- package/views/hooks/useRegisterVersion.js.map +1 -0
- package/views/hooks/useSingleRegisterItemData.js.map +1 -1
- package/views/index.js +18 -12
- package/views/index.js.map +1 -1
- package/views/itemQueryUtils.d.ts +1 -1
- package/views/itemQueryUtils.js.map +1 -1
- package/views/protocolRegistry.d.ts +1 -0
- package/views/protocolRegistry.js +4 -0
- package/views/protocolRegistry.js.map +1 -1
- package/views/sidebar/Browse/index.js +2 -2
- package/views/sidebar/Browse/index.js.map +1 -1
- package/views/sidebar/Registration/index.d.ts +0 -1
- package/views/sidebar/Registration/index.js +9 -10
- package/views/sidebar/Registration/index.js.map +1 -1
- package/views/sidebar/Search/index.d.ts +3 -0
- package/views/sidebar/Search/index.js +8 -4
- package/views/sidebar/Search/index.js.map +1 -1
- package/views/util.js +1 -0
- package/views/util.js.map +1 -1
- package/types/cr.js.map +0 -1
- package/types/proposal.d.ts +0 -90
- package/types/proposal.js +0 -71
- package/types/proposal.js.map +0 -1
- package/views/ProposalHistoryDrawer.js.map +0 -1
- package/views/change-request/ChangeRequestContext.js.map +0 -1
- package/views/change-request/Proposals.d.ts +0 -40
- package/views/change-request/Proposals.js.map +0 -1
- package/views/change-request/Summary.js.map +0 -1
- package/views/change-request/TransitionHistory.js.map +0 -1
- package/views/change-request/TransitionOptions.js.map +0 -1
- package/views/change-request/objectChangeset.js.map +0 -1
- package/views/change-request/util.d.ts +0 -4
- package/views/change-request/util.js +0 -14
- package/views/change-request/util.js.map +0 -1
- /package/{views/ProposalHistoryDrawer.d.ts → proposals/HistoryDrawer.d.ts} +0 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.proposalToTagProps = proposalToTagProps;
|
|
7
|
+
exports.ProposalType = ProposalType;
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = require("@emotion/react");
|
|
11
|
+
|
|
12
|
+
var _react2 = _interopRequireWildcard(require("react"));
|
|
13
|
+
|
|
14
|
+
var _core = require("@blueprintjs/core");
|
|
15
|
+
|
|
16
|
+
var _HelpTooltip = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/HelpTooltip"));
|
|
17
|
+
|
|
18
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
+
|
|
20
|
+
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); }
|
|
21
|
+
|
|
22
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
23
|
+
|
|
24
|
+
/** @jsx jsx */
|
|
25
|
+
|
|
26
|
+
/** @jsxFrag React.Fragment */
|
|
27
|
+
|
|
28
|
+
/** Returns props for a Tag that classifies this proposal. */
|
|
29
|
+
function proposalToTagProps(proposal) {
|
|
30
|
+
return {
|
|
31
|
+
children: proposal.type === 'amendment' ? proposal.amendmentType : proposal.type === 'addition' ? "addition" : proposal.type === 'clarification' ? "clarification" : "(unknown proposal type)",
|
|
32
|
+
intent: proposal.type === 'amendment' ? 'warning' : proposal.type === 'addition' || proposal.type === 'clarification' ? 'primary' : undefined
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function ProposalType({
|
|
37
|
+
proposal
|
|
38
|
+
}) {
|
|
39
|
+
const proposalConfig = proposal.type === 'amendment' ? PROPOSAL_VIEWS[proposal.amendmentType] : PROPOSAL_VIEWS[proposal.type]; //const ProposalTypeLabel: React.FC<ProposalProps<any>> = proposalConfig.summary;
|
|
40
|
+
|
|
41
|
+
const tagProps = proposalToTagProps(proposal);
|
|
42
|
+
return (0, _react.jsx)(_core.Tag, {
|
|
43
|
+
minimal: true,
|
|
44
|
+
...tagProps,
|
|
45
|
+
rightIcon: (0, _react.jsx)(_HelpTooltip.default, {
|
|
46
|
+
content: (0, _react.jsx)(_react2.default.Fragment, null, "Proposed to be ", proposalConfig.hint)
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const clarification = {
|
|
52
|
+
hint: (0, _react.jsx)(_react2.default.Fragment, null, "altered to represent the same concept more clearly."),
|
|
53
|
+
summary: (0, _react2.memo)(({
|
|
54
|
+
proposal,
|
|
55
|
+
item,
|
|
56
|
+
itemRef
|
|
57
|
+
}) => (0, _react.jsx)(_react2.default.Fragment, null, "Clarification"), () => true)
|
|
58
|
+
};
|
|
59
|
+
const addition = {
|
|
60
|
+
hint: (0, _react.jsx)(_react2.default.Fragment, null, "added to this register."),
|
|
61
|
+
summary: (0, _react2.memo)(({
|
|
62
|
+
proposal,
|
|
63
|
+
item,
|
|
64
|
+
itemRef
|
|
65
|
+
}) => (0, _react.jsx)(_react2.default.Fragment, null, "Addition"), () => true)
|
|
66
|
+
};
|
|
67
|
+
const retirement = {
|
|
68
|
+
hint: (0, _react.jsx)(_react2.default.Fragment, null, "marked as no longer current. (Note that this register is append-only, so the item cannot be removed altogether.)"),
|
|
69
|
+
summary: (0, _react2.memo)(({
|
|
70
|
+
proposal,
|
|
71
|
+
itemRef,
|
|
72
|
+
item
|
|
73
|
+
}) => (0, _react.jsx)(_react2.default.Fragment, null, "Retirement"), () => true)
|
|
74
|
+
};
|
|
75
|
+
const supersession = {
|
|
76
|
+
hint: (0, _react.jsx)(_react2.default.Fragment, null, "removed from the register with another item recommended for use in its place. A relation between the superseding and superseded item will be created, though the exact semantics of that relation depend on the register."),
|
|
77
|
+
summary: (0, _react2.memo)(({
|
|
78
|
+
proposal,
|
|
79
|
+
itemRef,
|
|
80
|
+
item
|
|
81
|
+
}) => (0, _react.jsx)(_react2.default.Fragment, null, "Supersession"), () => true)
|
|
82
|
+
};
|
|
83
|
+
const invalidation = {
|
|
84
|
+
hint: (0, _react.jsx)(_react2.default.Fragment, null, "marked as invalid. The exact semantics of invalidation depend on the register."),
|
|
85
|
+
summary: (0, _react2.memo)(({
|
|
86
|
+
proposal,
|
|
87
|
+
itemRef,
|
|
88
|
+
item
|
|
89
|
+
}) => (0, _react.jsx)(_react2.default.Fragment, null, "Invalidation"), () => true)
|
|
90
|
+
};
|
|
91
|
+
const PROPOSAL_VIEWS = {
|
|
92
|
+
clarification,
|
|
93
|
+
addition,
|
|
94
|
+
retirement,
|
|
95
|
+
supersession,
|
|
96
|
+
invalidation
|
|
97
|
+
};
|
|
98
|
+
var _default = ProposalType;
|
|
99
|
+
exports.default = _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProposalType.js","sourceRoot":"","sources":["../../src/proposals/ProposalType.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx } from '@emotion/react';\nimport React, { memo } from 'react';\nimport {\n Tag,\n type TagProps,\n} from '@blueprintjs/core';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\n\nimport {\n type ChangeProposal,\n type Clarification,\n type Invalidation,\n type Supersession,\n type Addition,\n type Retirement,\n PROPOSAL_TYPES,\n AMENDMENT_TYPES,\n ProposalProps,\n} from './types';\n\n\n/** Returns props for a Tag that classifies this proposal. */\nexport function proposalToTagProps(proposal: ChangeProposal): TagProps {\n return {\n children: proposal.type === 'amendment'\n ? proposal.amendmentType\n : proposal.type === 'addition'\n ? \"addition\"\n : proposal.type === 'clarification'\n ? \"clarification\"\n : \"(unknown proposal type)\",\n intent: proposal.type === 'amendment'\n ? 'warning'\n : proposal.type === 'addition' || proposal.type === 'clarification'\n ? 'primary'\n : undefined,\n }\n}\n\n\n\ntype ProposalOrAmendmentType =\n | Exclude<typeof PROPOSAL_TYPES[number], 'amendment'>\n | typeof AMENDMENT_TYPES[number];\n\n\ninterface ProposalViewConfig<P extends ChangeProposal> {\n summary: React.FC<ProposalProps<P>>\n hint: JSX.Element | string\n}\n\n\n\nexport function ProposalType({ proposal }: { proposal: ChangeProposal }) {\n const proposalConfig = \n proposal.type === 'amendment'\n ? PROPOSAL_VIEWS[proposal.amendmentType]\n : PROPOSAL_VIEWS[proposal.type];\n //const ProposalTypeLabel: React.FC<ProposalProps<any>> = proposalConfig.summary;\n const tagProps = proposalToTagProps(proposal);\n return (\n <Tag\n minimal\n {...tagProps}\n rightIcon={<HelpTooltip content={<>Proposed to be {proposalConfig.hint}</>} />}\n />\n \n );\n}\n\n\n\nconst clarification: ProposalViewConfig<Clarification> = {\n hint: <>\n altered to represent the same concept more clearly.\n </>,\n summary: memo(({ proposal, item, itemRef }) => <>Clarification</>, () => true),\n};\n\n\nconst addition: ProposalViewConfig<Addition> = {\n hint: <>added to this register.</>,\n summary: memo(({ proposal, item, itemRef }) => <>Addition</>, () => true),\n};\n\n\nconst retirement: ProposalViewConfig<Retirement> = {\n hint: <>\n marked as no longer current.\n (Note that this register is append-only, so the item cannot be removed altogether.)\n </>,\n summary: memo(({ proposal, itemRef, item }) => <>Retirement</>, () => true),\n};\n\n\nconst supersession: ProposalViewConfig<Supersession> = {\n hint: <>\n removed from the register with another item recommended for use in its place.\n A relation between the superseding and superseded item will be created,\n though the exact semantics of that relation depend on the register.\n </>,\n summary: memo(({ proposal, itemRef, item }) => <>Supersession</>, () => true),\n};\n\n\nconst invalidation: ProposalViewConfig<Invalidation> = {\n hint: <>\n marked as invalid. The exact semantics of invalidation depend on the register.\n </>,\n summary: memo(({ proposal, itemRef, item }) => <>Invalidation</>, () => true),\n}\n\n\nconst PROPOSAL_VIEWS: { [type in ProposalOrAmendmentType]: ProposalViewConfig<any> } = {\n clarification,\n addition,\n retirement,\n supersession,\n invalidation,\n} as const;\n\n\nexport default ProposalType;\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
/** @jsxFrag React.Fragment */
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import type { RegisterItem } from '../types/item';
|
|
5
|
+
import type { SomeCR } from './types';
|
|
6
|
+
export interface ProposalListData {
|
|
7
|
+
selectedItemPath: string | null;
|
|
8
|
+
extraItemViewData: {
|
|
9
|
+
proposal: SomeCR;
|
|
10
|
+
itemData: Record<string, RegisterItem<any> | null>;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface SearchResultListProps {
|
|
14
|
+
queryExpression: string;
|
|
15
|
+
selectedItemPath: string | null;
|
|
16
|
+
onSelectItem: (itemPath: string | null) => void;
|
|
17
|
+
onOpenItem?: (itemPath: string) => void;
|
|
18
|
+
keyExpression?: string;
|
|
19
|
+
extraItemViewData: {
|
|
20
|
+
proposal: SomeCR;
|
|
21
|
+
itemData: Record<string, RegisterItem<any> | null>;
|
|
22
|
+
};
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare const ProposalSearchResultList: React.FC<SearchResultListProps>;
|
|
26
|
+
export default ProposalSearchResultList;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.ProposalSearchResultList = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
|
|
10
|
+
var _react2 = require("@emotion/react");
|
|
11
|
+
|
|
12
|
+
var _List = _interopRequireWildcard(require("@riboseinc/paneron-extension-kit/widgets/List"));
|
|
13
|
+
|
|
14
|
+
var _itemPathUtils = require("../views/itemPathUtils");
|
|
15
|
+
|
|
16
|
+
var _BrowserCtx = require("../views/BrowserCtx");
|
|
17
|
+
|
|
18
|
+
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); }
|
|
19
|
+
|
|
20
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
21
|
+
|
|
22
|
+
/** @jsx jsx */
|
|
23
|
+
|
|
24
|
+
/** @jsxFrag React.Fragment */
|
|
25
|
+
const ProposalItem = function ({
|
|
26
|
+
onSelect,
|
|
27
|
+
onOpen,
|
|
28
|
+
extraData,
|
|
29
|
+
itemRef: itemPath
|
|
30
|
+
}) {
|
|
31
|
+
var _a, _b;
|
|
32
|
+
|
|
33
|
+
const {
|
|
34
|
+
subregisters,
|
|
35
|
+
getRelatedItemClassConfiguration
|
|
36
|
+
} = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
|
|
37
|
+
const proposalItem = extraData.extraItemViewData.proposal.items[itemPath];
|
|
38
|
+
const registerItem = (_a = extraData.extraItemViewData.itemData[itemPath]) !== null && _a !== void 0 ? _a : null;
|
|
39
|
+
const itemRef = (0, _itemPathUtils.itemPathToItemRef)(subregisters !== undefined, itemPath);
|
|
40
|
+
const clsConfig = getRelatedItemClassConfiguration(itemRef.classID);
|
|
41
|
+
const ListItemView = clsConfig.itemView;
|
|
42
|
+
const itemPayload = (_b = registerItem === null || registerItem === void 0 ? void 0 : registerItem.data) !== null && _b !== void 0 ? _b : null;
|
|
43
|
+
const itemView = itemPayload ? (0, _react2.jsx)(ListItemView, {
|
|
44
|
+
itemData: itemPayload,
|
|
45
|
+
itemRef: itemRef
|
|
46
|
+
}) : (0, _react2.jsx)("span", {
|
|
47
|
+
css: (0, _react2.css)`opacity: .4`
|
|
48
|
+
}, "(missing item data at ", itemPath, ")");
|
|
49
|
+
return (0, _react2.jsx)(_List.LabelledListIcon, {
|
|
50
|
+
isSelected: extraData.selectedItemPath === itemPath,
|
|
51
|
+
onSelect: onSelect,
|
|
52
|
+
onOpen: onOpen,
|
|
53
|
+
//contentClassName={(isUpdating && !objData) ? Classes.SKELETON : undefined}
|
|
54
|
+
entityType: {
|
|
55
|
+
name: proposalItem.type
|
|
56
|
+
}
|
|
57
|
+
}, itemView);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const List = (0, _List.default)(ProposalItem);
|
|
61
|
+
const ProposalSearchResultList = (0, _react.memo)(function ({
|
|
62
|
+
extraItemViewData,
|
|
63
|
+
queryExpression,
|
|
64
|
+
selectedItemPath,
|
|
65
|
+
onSelectItem,
|
|
66
|
+
onOpenItem,
|
|
67
|
+
className
|
|
68
|
+
}) {
|
|
69
|
+
const {
|
|
70
|
+
useRegisterItemData
|
|
71
|
+
} = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
|
|
72
|
+
const proposal = extraItemViewData.proposal;
|
|
73
|
+
const expressionParsed = new Function('objPath', 'obj', queryExpression);
|
|
74
|
+
const proposedItemDataReq = useRegisterItemData({
|
|
75
|
+
itemPaths: Object.keys(proposal.items)
|
|
76
|
+
});
|
|
77
|
+
const itemData = proposedItemDataReq.value;
|
|
78
|
+
const predicate = (0, _react.useCallback)(([objPath, obj]) => {
|
|
79
|
+
return expressionParsed(objPath, itemData[objPath]) || expressionParsed(objPath, obj);
|
|
80
|
+
}, [queryExpression, itemData]);
|
|
81
|
+
const validItems = Object.entries(proposal.items).filter(predicate);
|
|
82
|
+
const matchingItemIDs = validItems.map(([p]) => p);
|
|
83
|
+
const extraData = (0, _react.useMemo)(() => ({
|
|
84
|
+
extraItemViewData: {
|
|
85
|
+
proposal,
|
|
86
|
+
itemData
|
|
87
|
+
},
|
|
88
|
+
selectedItemPath
|
|
89
|
+
}), [selectedItemPath, proposal, itemData]);
|
|
90
|
+
const getListData = (0, _react.useCallback)(function _getListData() {
|
|
91
|
+
return {
|
|
92
|
+
items: matchingItemIDs,
|
|
93
|
+
selectedItem: selectedItemPath,
|
|
94
|
+
selectItem: onSelectItem,
|
|
95
|
+
openItem: onOpenItem,
|
|
96
|
+
itemHeight: 32,
|
|
97
|
+
padding: 0,
|
|
98
|
+
extraData
|
|
99
|
+
};
|
|
100
|
+
}, [matchingItemIDs.join(','), extraData, onOpenItem, onSelectItem]);
|
|
101
|
+
return (0, _react2.jsx)(List, {
|
|
102
|
+
className: className,
|
|
103
|
+
getListData: getListData
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
exports.ProposalSearchResultList = ProposalSearchResultList;
|
|
107
|
+
var _default = ProposalSearchResultList;
|
|
108
|
+
exports.default = _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Search.js","sourceRoot":"","sources":["../../src/proposals/Search.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAc,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACtE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,QAAQ,EAAE,EAAkB,gBAAgB,EAAiB,MAAM,+CAA+C,CAAC;AAG1H,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAsBjD,MAAM,YAAY,GAClB,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE;;IAC1D,MAAM,EAAE,YAAY,EAAE,gCAAgC,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAElF,MAAM,YAAY,GAAG,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,MAAA,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,mCAAI,IAAI,CAAC;IAE5E,MAAM,OAAO,GAAG,iBAAiB,CAAC,YAAY,KAAK,SAAS,EAAE,QAAQ,CAAC,CAAC;IAExE,MAAM,SAAS,GAAG,gCAAgC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC;IACxC,MAAM,WAAW,GAA+B,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,mCAAI,IAAI,CAAC;IAE3E,MAAM,QAAQ,GAAG,WAAW;QAC1B,CAAC,CAAC,IAAC,YAAY,IACX,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,OAAO,GAChB;QACJ,CAAC,CAAC,cAAM,GAAG,EAAE,GAAG,CAAA,aAAa;;YACF,QAAQ;gBAC1B,CAAC;IAEZ,OAAO,CACL,IAAC,gBAAgB,IACb,UAAU,EAAE,SAAS,CAAC,gBAAgB,KAAK,QAAQ,EACnD,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM;QACd,4EAA4E;QAC5E,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,IAExC,QAAQ,CACQ,CACpB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,QAAQ,CAAmB,YAAY,CAAC,CAAC;AAEtD,MAAM,CAAC,MAAM,wBAAwB,GACrC,IAAI,CAAC,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE;IAC1G,MAAM,EAAE,mBAAmB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC;IAE5C,MAAM,gBAAgB,GACpB,IAAI,QAAQ,CAAC,SAAS,EAAE,KAAK,EAAE,eAAe,CAAiF,CAAC;IAElI,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;QAC9C,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;KACvC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC;IAE3C,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAA2B,EAAE,EAAE;QACzE,OAAO,CACL,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;eACzC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAClC,CAAC;IACJ,CAAC,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEhC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEpE,MAAM,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAErD,MAAM,SAAS,GAAqB,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAClD,iBAAiB,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACzC,gBAAgB;KACjB,CAAC,CAAC,EAAE,CAAC,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE7C,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,YAAY;QACnD,OAAO;YACL,KAAK,EAAE,eAAe;YACtB,YAAY,EAAE,gBAAgB;YAC9B,UAAU,EAAE,YAAY;YACxB,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,EAAE;YACd,OAAO,EAAE,CAAC;YACV,SAAS;SACV,CAAC;IACJ,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IAErE,OAAO,IAAC,IAAI,IACV,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,GACxB,CAAC;AACL,CAAC,CAAC,CAAC;AAGH,eAAe,wBAAwB,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useContext, useCallback, useMemo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport makeList, { type ItemProps, LabelledListIcon, type ListData } from '@riboseinc/paneron-extension-kit/widgets/List';\n\nimport type { RegisterItem } from '../types/item';\nimport { itemPathToItemRef } from '../views/itemPathUtils';\nimport { BrowserCtx } from '../views/BrowserCtx';\n\nimport type { SomeCR } from './types';\nimport type { ChangeProposal } from './types';\n\n\nexport interface ProposalListData {\n selectedItemPath: string | null;\n extraItemViewData: { proposal: SomeCR, itemData: Record<string, RegisterItem<any> | null> }\n}\n\nexport interface SearchResultListProps {\n queryExpression: string;\n selectedItemPath: string | null;\n onSelectItem: (itemPath: string | null) => void;\n onOpenItem?: (itemPath: string) => void;\n keyExpression?: string;\n extraItemViewData: { proposal: SomeCR, itemData: Record<string, RegisterItem<any> | null> }\n className?: string;\n}\n\n\nconst ProposalItem: React.FC<ItemProps<ProposalListData>> =\nfunction ({ onSelect, onOpen, extraData, itemRef: itemPath }) {\n const { subregisters, getRelatedItemClassConfiguration } = useContext(BrowserCtx);\n\n const proposalItem = extraData.extraItemViewData.proposal.items[itemPath];\n const registerItem = extraData.extraItemViewData.itemData[itemPath] ?? null;\n\n const itemRef = itemPathToItemRef(subregisters !== undefined, itemPath);\n\n const clsConfig = getRelatedItemClassConfiguration(itemRef.classID);\n const ListItemView = clsConfig.itemView;\n const itemPayload: Record<string, any> | null = registerItem?.data ?? null;\n \n const itemView = itemPayload\n ? <ListItemView\n itemData={itemPayload}\n itemRef={itemRef}\n />\n : <span css={css`opacity: .4`}>\n (missing item data at {itemPath})\n </span>;\n\n return (\n <LabelledListIcon\n isSelected={extraData.selectedItemPath === itemPath}\n onSelect={onSelect}\n onOpen={onOpen}\n //contentClassName={(isUpdating && !objData) ? Classes.SKELETON : undefined}\n entityType={{ name: proposalItem.type }}\n >\n {itemView}\n </LabelledListIcon>\n );\n};\n\nconst List = makeList<ProposalListData>(ProposalItem);\n\nexport const ProposalSearchResultList: React.FC<SearchResultListProps> =\nmemo(function ({ extraItemViewData, queryExpression, selectedItemPath, onSelectItem, onOpenItem, className }) {\n const { useRegisterItemData } = useContext(BrowserCtx);\n const proposal = extraItemViewData.proposal;\n\n const expressionParsed =\n new Function('objPath', 'obj', queryExpression) as (objPath: string, obj: null | RegisterItem<any> | ChangeProposal) => boolean;\n\n const proposedItemDataReq = useRegisterItemData({\n itemPaths: Object.keys(proposal.items),\n });\n\n const itemData = proposedItemDataReq.value;\n\n const predicate = useCallback(([objPath, obj]: [string, ChangeProposal]) => {\n return (\n expressionParsed(objPath, itemData[objPath])\n || expressionParsed(objPath, obj)\n );\n }, [queryExpression, itemData]);\n\n const validItems = Object.entries(proposal.items).filter(predicate);\n\n const matchingItemIDs = validItems.map(([p, ]) => p);\n\n const extraData: ProposalListData = useMemo((() => ({\n extraItemViewData: { proposal, itemData },\n selectedItemPath,\n })), [selectedItemPath, proposal, itemData]);\n\n const getListData = useCallback(function _getListData(): ListData<ProposalListData> | null {\n return {\n items: matchingItemIDs,\n selectedItem: selectedItemPath,\n selectItem: onSelectItem,\n openItem: onOpenItem,\n itemHeight: 32,\n padding: 0,\n extraData,\n };\n }, [matchingItemIDs.join(','), extraData, onOpenItem, onSelectItem]);\n\n return <List\n className={className}\n getListData={getListData}\n />;\n});\n\n\nexport default ProposalSearchResultList;\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/** @jsx jsx */
|
|
2
2
|
/** @jsxFrag React.Fragment */
|
|
3
3
|
import React from 'react';
|
|
4
|
-
import
|
|
5
|
-
import
|
|
4
|
+
import { type RegisterStakeholder } from '../types/stakeholder';
|
|
5
|
+
import * as CR from './types';
|
|
6
6
|
/**
|
|
7
7
|
* Transition history entry is mostly like `CR.TransitionEntry`,
|
|
8
8
|
* except it has optional fields and can be `undefined` to represent
|
|
@@ -26,5 +26,6 @@ export declare function getTransitionHistory(cr: CR.Base): TransitionHistoryEntr
|
|
|
26
26
|
export declare const TransitionsAndStatus: React.VoidFunctionComponent<{
|
|
27
27
|
pastTransitions: TransitionHistoryEntry[];
|
|
28
28
|
isFinal?: boolean;
|
|
29
|
+
detailed?: boolean;
|
|
29
30
|
}>;
|
|
30
31
|
export default TransitionsAndStatus;
|
|
@@ -18,11 +18,11 @@ var _util = require("@riboseinc/paneron-extension-kit/util");
|
|
|
18
18
|
|
|
19
19
|
var _HelpTooltip = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/HelpTooltip"));
|
|
20
20
|
|
|
21
|
-
var _InlineDiff = require("../diffing/InlineDiff");
|
|
21
|
+
var _InlineDiff = require("../views/diffing/InlineDiff");
|
|
22
22
|
|
|
23
|
-
var _RegisterStakeholder = require("../RegisterStakeholder");
|
|
23
|
+
var _RegisterStakeholder = require("../views/RegisterStakeholder");
|
|
24
24
|
|
|
25
|
-
var CR = _interopRequireWildcard(require("
|
|
25
|
+
var CR = _interopRequireWildcard(require("./types"));
|
|
26
26
|
|
|
27
27
|
var _TransitionOptions = require("./TransitionOptions");
|
|
28
28
|
|
|
@@ -169,7 +169,8 @@ function getTransitionHistory(cr) {
|
|
|
169
169
|
|
|
170
170
|
const TransitionsAndStatus = function ({
|
|
171
171
|
pastTransitions,
|
|
172
|
-
isFinal
|
|
172
|
+
isFinal,
|
|
173
|
+
detailed
|
|
173
174
|
}) {
|
|
174
175
|
return (0, _react.jsx)(_react2.default.Fragment, null, pastTransitions.map((entry, idx) => {
|
|
175
176
|
var _a, _b, _c;
|
|
@@ -183,18 +184,25 @@ const TransitionsAndStatus = function ({
|
|
|
183
184
|
input,
|
|
184
185
|
timestamp
|
|
185
186
|
} = entry;
|
|
187
|
+
const details = input || timestamp || stakeholder ? (0, _react.jsx)(_react2.default.Fragment, null, input ? (0, _react.jsx)("div", {
|
|
188
|
+
css: (0, _react.css)`margin: .25em 0;`
|
|
189
|
+
}, (0, _react.jsx)(_InlineDiff.Val, {
|
|
190
|
+
val: (0, _util.normalizeObjectRecursively)(input)
|
|
191
|
+
})) : null, (0, _react.jsx)("small", {
|
|
192
|
+
css: (0, _react.css)`display: block;`
|
|
193
|
+
}, stakeholder ? (0, _react.jsx)("span", null, (0, _RegisterStakeholder.registerStakeholderPlain)(stakeholder)) : 'unknown stakeholder', (0, _react.jsx)("br", null), "at ", timestamp ? ((_a = timestamp.toISOString) === null || _a === void 0 ? void 0 : _a.call(timestamp)) || timestamp : 'unknown time')) : null;
|
|
186
194
|
return (0, _react.jsx)(TransitionEntryWrapper, {
|
|
187
195
|
title: `Transition ${fromState ? `from ${fromState} ` : ''}to ${toState}`,
|
|
188
196
|
css: (0, _react.css)`
|
|
189
197
|
background: linear-gradient(
|
|
190
198
|
345deg,
|
|
191
|
-
${(
|
|
192
|
-
${(
|
|
199
|
+
${(_b = _TransitionOptions.STATE_COLOR[toState]) !== null && _b !== void 0 ? _b : _core.Colors.GRAY1}aa,
|
|
200
|
+
${(_c = _TransitionOptions.STATE_COLOR[toState]) !== null && _c !== void 0 ? _c : _core.Colors.GRAY1} 50%);
|
|
193
201
|
position: sticky;
|
|
194
202
|
top: ${idx * 3}px;
|
|
195
203
|
z-index: 1;
|
|
196
204
|
${idx === pastTransitions.length - 1 ? `
|
|
197
|
-
font-weight: bold;
|
|
205
|
+
${!detailed ? 'font-weight: bold;' : ''}
|
|
198
206
|
${isFinal ? `
|
|
199
207
|
&::before {
|
|
200
208
|
${transitionEntryDecorativeMarkerFinal}
|
|
@@ -208,16 +216,12 @@ const TransitionsAndStatus = function ({
|
|
|
208
216
|
` : ''}
|
|
209
217
|
`,
|
|
210
218
|
key: idx
|
|
211
|
-
}, label,
|
|
219
|
+
}, label, detailed && details ? details : null, !detailed && details ? (0, _react.jsx)(_react2.default.Fragment, null, "\u00A0", (0, _react.jsx)(_HelpTooltip.default, {
|
|
212
220
|
icon: "info-sign",
|
|
213
221
|
content: (0, _react.jsx)("div", {
|
|
214
222
|
css: (0, _react.css)`display: flex; flex-flow: column nowrap;`
|
|
215
|
-
},
|
|
216
|
-
|
|
217
|
-
})) : null, timestamp ? ((_c = timestamp.toISOString) === null || _c === void 0 ? void 0 : _c.call(timestamp)) || timestamp : null, input ? (0, _react.jsx)("div", null, (0, _react.jsx)(_InlineDiff.Val, {
|
|
218
|
-
val: (0, _util.normalizeObjectRecursively)(input)
|
|
219
|
-
})) : null)
|
|
220
|
-
})) : undefined);
|
|
223
|
+
}, details)
|
|
224
|
+
})) : null);
|
|
221
225
|
} else {
|
|
222
226
|
if (idx > 0 && pastTransitions[idx - 1] !== undefined) {
|
|
223
227
|
return (0, _react.jsx)(MissingTransitionEntries, null);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransitionHistory.js","sourceRoot":"","sources":["../../src/proposals/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 '../views/diffing/InlineDiff';\nimport { registerStakeholderPlain } from '../views/RegisterStakeholder';\nimport { type RegisterStakeholder } from '../types/stakeholder';\n\nimport * as CR from './types';\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 detailed?: boolean\n}> = function ({ pastTransitions, isFinal, detailed }) {\n return (\n <>\n {pastTransitions.map((entry, idx) => {\n if (entry) {\n const { label, stakeholder, fromState, toState, input, timestamp } = entry;\n const details = input || timestamp || stakeholder\n ? <>\n {input\n ? <div css={css`margin: .25em 0;`}><Val val={normalizeObjectRecursively(input)} /></div>\n : null}\n <small css={css`display: block;`}>\n {stakeholder\n ? <span>{registerStakeholderPlain(stakeholder)}</span>\n : 'unknown stakeholder'}\n <br />\n at {timestamp\n ? (timestamp.toISOString?.() || timestamp)\n : 'unknown time'}\n </small>\n </>\n : null;\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 ${!detailed ? '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 {detailed && details ? details : null}\n {!detailed && details\n ? <> <HelpTooltip icon=\"info-sign\" content={<div css={css`display: flex; flex-flow: column nowrap;`}>{details}</div>} />\n </>\n : null}\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,9 +1,9 @@
|
|
|
1
1
|
/** @jsx jsx */
|
|
2
2
|
/** @jsxFrag React.Fragment */
|
|
3
3
|
import { jsx } from '@emotion/react';
|
|
4
|
-
import { Intent, Colors } from '@blueprintjs/core';
|
|
5
|
-
import type { RegisterStakeholder } from '
|
|
6
|
-
import * as CR from '
|
|
4
|
+
import { type Intent, Colors } from '@blueprintjs/core';
|
|
5
|
+
import type { RegisterStakeholder } from '../types';
|
|
6
|
+
import * as CR from './types';
|
|
7
7
|
export interface TransitionOptions<C extends CR.SomeCR> {
|
|
8
8
|
cr: C;
|
|
9
9
|
transitions: PossibleTransitionForCR<C>[];
|
|
@@ -18,15 +18,15 @@ var _popover = require("@blueprintjs/popover2");
|
|
|
18
18
|
|
|
19
19
|
var _context = require("@riboseinc/paneron-extension-kit/context");
|
|
20
20
|
|
|
21
|
-
var _BrowserCtx = require("../BrowserCtx");
|
|
21
|
+
var _BrowserCtx = require("../views/BrowserCtx");
|
|
22
22
|
|
|
23
|
-
var _stakeholder = require("
|
|
23
|
+
var _stakeholder = require("../types/stakeholder");
|
|
24
24
|
|
|
25
|
-
var _itemPathUtils = require("../itemPathUtils");
|
|
25
|
+
var _itemPathUtils = require("../views/itemPathUtils");
|
|
26
26
|
|
|
27
|
-
var
|
|
27
|
+
var _objectChangeset = require("./objectChangeset");
|
|
28
28
|
|
|
29
|
-
var
|
|
29
|
+
var CR = _interopRequireWildcard(require("./types"));
|
|
30
30
|
|
|
31
31
|
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); }
|
|
32
32
|
|
|
@@ -81,15 +81,22 @@ function TransitionOptions({
|
|
|
81
81
|
// Pre-select next state to first available transition
|
|
82
82
|
chosenNextState: transitions.length > 0 ? transitions[0][0] : undefined,
|
|
83
83
|
stateInput: {}
|
|
84
|
-
}), [transitions]);
|
|
84
|
+
}), [transitions]); // Set to a number of milliseconds to wait for, e.g. after selecting a new action,
|
|
85
|
+
// to avoid accidental transitions.
|
|
86
|
+
|
|
87
|
+
const [waitingForCooldown, setWaitingForCooldown] = (0, _react.useState)(0);
|
|
85
88
|
const [state, dispatch, stateRecalled] = usePersistentDatasetStateReducer(`${cr.id}-${cr.state}`, undefined, undefined, reducer, initialState, null);
|
|
86
89
|
const selectedTransitionCfg = (0, _react.useMemo)(() => {
|
|
87
90
|
var _a, _b;
|
|
88
91
|
|
|
89
92
|
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;
|
|
90
93
|
}, [stateRecalled, state.chosenNextState, transitions]);
|
|
94
|
+
(0, _react.useEffect)(() => setWaitingForCooldown(2000), [state.chosenNextState]);
|
|
91
95
|
(0, _react.useEffect)(() => {
|
|
92
96
|
if (stateRecalled) {
|
|
97
|
+
// Don’t pre-select the next state checkbox.
|
|
98
|
+
// Persisting the state is still useful, since this remembers state input
|
|
99
|
+
// (such as register manager notes)
|
|
93
100
|
dispatch({
|
|
94
101
|
type: 'unset-next-state'
|
|
95
102
|
});
|
|
@@ -121,6 +128,23 @@ function TransitionOptions({
|
|
|
121
128
|
return [undefined, "no CR or no transition selected"];
|
|
122
129
|
}
|
|
123
130
|
}, [JSON.stringify(cr), selectedTransitionCfg, state.stateInput]);
|
|
131
|
+
const handleSetStateInput = (0, _react.useCallback)(payload => {
|
|
132
|
+
dispatch({
|
|
133
|
+
type: 'update-next-state-input',
|
|
134
|
+
payload
|
|
135
|
+
});
|
|
136
|
+
setWaitingForCooldown(5000);
|
|
137
|
+
}, [dispatch, setWaitingForCooldown]);
|
|
138
|
+
(0, _react.useEffect)(() => {
|
|
139
|
+
if (waitingForCooldown) {
|
|
140
|
+
const timeout = setTimeout(() => setWaitingForCooldown(v => v > 0 ? v - 100 : v), 100);
|
|
141
|
+
return function cleanUp() {
|
|
142
|
+
clearTimeout(timeout);
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return function noop() {};
|
|
147
|
+
}, [waitingForCooldown, setWaitingForCooldown]);
|
|
124
148
|
const getItemChangesetAsApproved = (0, _react.useCallback)(async function (cr) {
|
|
125
149
|
const origItemData = (await getObjectData({
|
|
126
150
|
objectPaths: [...Object.entries(cr.items).filter(([, prop]) => prop.type !== 'addition').map(([itemPath]) => itemPath), ...Object.values(cr.items).filter(prop => prop.type === 'amendment' && prop.amendmentType === 'supersession').flatMap(prop => prop.supersedingItemIDs)]
|
|
@@ -175,7 +199,7 @@ function TransitionOptions({
|
|
|
175
199
|
throw new Error("Either transition is not specified or dataset is read-only");
|
|
176
200
|
}
|
|
177
201
|
}, [updateObjects, JSON.stringify(stakeholder), JSON.stringify(cr)]);
|
|
178
|
-
const canTransition = selectedTransitionCfg !== undefined && !isBusy && validatedStateInput !== undefined;
|
|
202
|
+
const canTransition = selectedTransitionCfg !== undefined && !isBusy && validatedStateInput !== undefined && !waitingForCooldown;
|
|
179
203
|
return (0, _react2.jsx)("div", {
|
|
180
204
|
css: (0, _react2.css)`display: flex; flex-flow: column nowrap;`,
|
|
181
205
|
className: className
|
|
@@ -198,18 +222,16 @@ function TransitionOptions({
|
|
|
198
222
|
placement: 'bottom',
|
|
199
223
|
targetTagName: 'div',
|
|
200
224
|
intent: 'warning',
|
|
225
|
+
css: (0, _react2.css)`flex: 1;`,
|
|
201
226
|
content: (0, _react2.jsx)(_react.default.Fragment, null, stateInputValidationErrors)
|
|
202
227
|
}, (0, _react2.jsx)(selectedTransitionCfg.Widget, {
|
|
203
228
|
value: Object.keys(state.stateInput).length > 0 ? state.stateInput : cr,
|
|
204
|
-
onChange: !isBusy ?
|
|
205
|
-
type: 'update-next-state-input',
|
|
206
|
-
payload
|
|
207
|
-
}) : undefined
|
|
229
|
+
onChange: !isBusy ? handleSetStateInput : undefined
|
|
208
230
|
})) : null, selectedTransitionCfg ? (0, _react2.jsx)(_core.Button, {
|
|
209
231
|
disabled: !canTransition,
|
|
210
232
|
intent: canTransition ? 'primary' : undefined,
|
|
211
233
|
onClick: () => validatedStateInput ? performOperation('transitioning CR state', handleTransition)(selectedTransitionCfg, validatedStateInput) : void 0
|
|
212
|
-
}, selectedTransitionCfg.title) : null);
|
|
234
|
+
}, waitingForCooldown ? (0, _react2.jsx)(_react.default.Fragment, null, "Almost ready", Array(Math.floor(3 - 3 / 5000 * waitingForCooldown + 1)).fill(undefined).map(() => (0, _react2.jsx)(_react.default.Fragment, null, "."))) : selectedTransitionCfg.title) : null);
|
|
213
235
|
}
|
|
214
236
|
|
|
215
237
|
;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransitionOptions.js","sourceRoot":"","sources":["../../src/proposals/TransitionOptions.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useState, useContext, useEffect, useMemo, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Button, RadioGroup, Radio, FormGroup, TextArea, type TextAreaProps, type 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 '../views/BrowserCtx';\nimport type { RegisterItem, RegisterStakeholder } from '../types';\nimport { isOwner, isControlBody, isManager } from '../types/stakeholder';\nimport { itemPathInCR, crIDToCRPath } from '../views/itemPathUtils';\n\nimport { proposalsToObjectChangeset } from './objectChangeset';\nimport type { Supersession } from './types';\nimport * as CR from './types';\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 // Set to a number of milliseconds to wait for, e.g. after selecting a new action,\n // to avoid accidental transitions.\n const [ waitingForCooldown, setWaitingForCooldown ] = useState(0);\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((() => setWaitingForCooldown(2000)), [state.chosenNextState]);\n\n useEffect(() => {\n if (stateRecalled) {\n // Don’t pre-select the next state checkbox.\n // Persisting the state is still useful, since this remembers state input\n // (such as register manager notes)\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 handleSetStateInput = useCallback((payload: any) => {\n dispatch({\n type: 'update-next-state-input',\n payload,\n });\n setWaitingForCooldown(5000);\n }, [dispatch, setWaitingForCooldown]);\n\n useEffect(() => {\n if (waitingForCooldown) {\n const timeout = setTimeout(\n (() => setWaitingForCooldown(v => v > 0 ? (v - 100) : v)),\n 100);\n return function cleanUp() { clearTimeout(timeout) };\n }\n return function noop() {};\n }, [waitingForCooldown, setWaitingForCooldown]);\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 = (\n selectedTransitionCfg !== undefined\n && !isBusy\n && validatedStateInput !== undefined\n && !waitingForCooldown\n );\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 css={css`flex: 1;`}\n content={<>{stateInputValidationErrors}</>}>\n <selectedTransitionCfg.Widget\n value={Object.keys(state.stateInput).length > 0\n ? state.stateInput\n : cr}\n onChange={!isBusy\n ? handleSetStateInput\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 {waitingForCooldown\n ? <>Almost ready{Array(Math.floor(3 - (3 / 5000 * waitingForCooldown) + 1)).fill(undefined).map(() => <>.</>)}</>\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"]}
|