@riboseinc/paneron-registry-kit 2.2.33 → 2.2.34
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/item-classes/Tree.js +2 -2
- package/item-classes/Tree.js.map +1 -1
- package/package.json +4 -3
- package/proposals/ChangeRequestContext.js +1 -1
- package/proposals/ChangeRequestContext.js.map +1 -1
- package/proposals/ListItem.d.ts +8 -0
- package/proposals/ListItem.js +40 -0
- package/proposals/ListItem.js.map +1 -0
- package/proposals/MetaProperties.js +41 -11
- package/proposals/MetaProperties.js.map +1 -1
- package/proposals/NewProposalMenu.d.ts +10 -0
- package/proposals/NewProposalMenu.js +113 -0
- package/proposals/NewProposalMenu.js.map +1 -0
- package/proposals/ProposalBrowser.js +2 -58
- package/proposals/ProposalBrowser.js.map +1 -1
- package/proposals/ProposalDetail.js +1 -0
- package/proposals/ProposalDetail.js.map +1 -1
- package/proposals/ProposalItem.js.map +1 -1
- package/proposals/ProposalTab.d.ts +12 -0
- package/proposals/ProposalTab.js +102 -0
- package/proposals/ProposalTab.js.map +1 -0
- package/proposals/ProposalWorkspace.d.ts +13 -0
- package/proposals/ProposalWorkspace.js +132 -0
- package/proposals/ProposalWorkspace.js.map +1 -0
- package/proposals/Search.js +5 -4
- package/proposals/Search.js.map +1 -1
- package/proposals/actionableGroups/Tree.js +11 -11
- package/proposals/actionableGroups/Tree.js.map +1 -1
- package/proposals/actionableGroups/treeNodes.d.ts +1 -0
- package/proposals/actionableGroups/treeNodes.js +41 -9
- package/proposals/actionableGroups/treeNodes.js.map +1 -1
- package/proposals/objectChangeset.d.ts +1 -2
- package/proposals/objectChangeset.js +1 -1
- package/proposals/objectChangeset.js.map +1 -1
- package/proposals/types.d.ts +2 -1
- package/proposals/types.js +4 -1
- package/proposals/types.js.map +1 -1
- package/types/util.d.ts +1 -1
- package/types/util.js.map +1 -1
- package/views/detail/ChangeRequest/index.js +11 -159
- package/views/detail/ChangeRequest/index.js.map +1 -1
- package/views/detail/ProposalWork.js +150 -110
- package/views/detail/ProposalWork.js.map +1 -1
- package/views/detail/RegisterHome/index.js +3 -3
- package/views/detail/RegisterHome/index.js.map +1 -1
- package/views/detail/RegisterHome2/index.d.ts +5 -0
- package/views/detail/RegisterHome2/index.js +58 -0
- package/views/detail/RegisterHome2/index.js.map +1 -0
- package/views/detail/RegisterItem/index.d.ts +1 -0
- package/views/detail/RegisterItem/index.js +55 -14
- package/views/detail/RegisterItem/index.js.map +1 -1
- package/views/detail/RegisterMeta/RegisterMetaForm.js +1 -46
- package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
- package/views/hooks/useLatestAcceptedProposal.d.ts +2 -0
- package/views/hooks/useLatestAcceptedProposal.js +48 -0
- package/views/hooks/useLatestAcceptedProposal.js.map +1 -0
- package/views/hooks/useRegisterVersion.d.ts +4 -0
- package/views/hooks/useRegisterVersion.js +4 -0
- package/views/hooks/useRegisterVersion.js.map +1 -1
- package/views/index.js +26 -10
- package/views/index.js.map +1 -1
- package/views/itemQueryUtils.js +12 -7
- package/views/itemQueryUtils.js.map +1 -1
- package/views/sidebar/Registration/index.js +5 -32
- package/views/sidebar/Registration/index.js.map +1 -1
- package/views/sidebar/Search/index.js +4 -7
- package/views/sidebar/Search/index.js.map +1 -1
- package/views/sidebar/index.js +40 -10
- package/views/sidebar/index.js.map +1 -1
- package/views/util.d.ts +6 -1
- package/views/util.js +29 -7
- package/views/util.js.map +1 -1
|
@@ -15,29 +15,17 @@ var _context = require("@riboseinc/paneron-extension-kit/context");
|
|
|
15
15
|
|
|
16
16
|
var _context2 = require("@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context");
|
|
17
17
|
|
|
18
|
-
var _util = require("@riboseinc/paneron-extension-kit/util");
|
|
19
|
-
|
|
20
|
-
var _DL = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/DL"));
|
|
21
|
-
|
|
22
18
|
var _BrowserCtx = require("../../BrowserCtx");
|
|
23
19
|
|
|
24
20
|
var _itemPathUtils = require("../../itemPathUtils");
|
|
25
21
|
|
|
26
22
|
var _ChangeRequestContext = require("../../../proposals/ChangeRequestContext");
|
|
27
23
|
|
|
28
|
-
var
|
|
29
|
-
|
|
30
|
-
var _TransitionOptions = _interopRequireWildcard(require("../../../proposals/TransitionOptions"));
|
|
31
|
-
|
|
32
|
-
var _TransitionHistory = _interopRequireWildcard(require("../../../proposals/TransitionHistory"));
|
|
33
|
-
|
|
34
|
-
var _MetaProperties = _interopRequireDefault(require("../../../proposals/MetaProperties"));
|
|
35
|
-
|
|
36
|
-
var _types = require("../../../proposals/types");
|
|
24
|
+
var _ProposalTab = _interopRequireDefault(require("../../../proposals/ProposalTab"));
|
|
37
25
|
|
|
38
26
|
var _protocolRegistry = require("../../protocolRegistry");
|
|
39
27
|
|
|
40
|
-
var
|
|
28
|
+
var _util = require("../../util");
|
|
41
29
|
|
|
42
30
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
43
31
|
|
|
@@ -66,29 +54,21 @@ const MaybeChangeRequest = (0, _react.memo)(function ({
|
|
|
66
54
|
} = (0, _react.useContext)(_context2.TabbedWorkspaceContext);
|
|
67
55
|
const {
|
|
68
56
|
changeRequest: cr,
|
|
69
|
-
|
|
70
|
-
deleteCR,
|
|
71
|
-
updateItemProposal
|
|
57
|
+
deleteCR
|
|
72
58
|
} = (0, _react.useContext)(_ChangeRequestContext.ChangeRequestContext);
|
|
59
|
+
const {
|
|
60
|
+
registerMetadata
|
|
61
|
+
} = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
|
|
73
62
|
const handleDelete = (0, _react.useCallback)(async () => {
|
|
74
63
|
if (deleteCR) {
|
|
75
64
|
await deleteCR();
|
|
76
65
|
closeTabWithURI(`${_protocolRegistry.Protocols.CHANGE_REQUEST}:${uri}`);
|
|
77
66
|
}
|
|
78
67
|
}, [deleteCR, closeTabWithURI]);
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
cr: cr,
|
|
84
|
-
canTransition: canTransition,
|
|
85
|
-
onDelete: deleteCR ? handleDelete : undefined,
|
|
86
|
-
onDeleteProposalForItemAtPath: updateItemProposal ? handleDeleteProposalAtItemPath : undefined,
|
|
87
|
-
css: (0, _react2.css)`
|
|
88
|
-
position: absolute;
|
|
89
|
-
inset: 0;
|
|
90
|
-
overflow-y: auto;
|
|
91
|
-
`
|
|
68
|
+
return cr && registerMetadata ? (0, _react2.jsx)(_ProposalTab.default, {
|
|
69
|
+
proposal: cr,
|
|
70
|
+
register: registerMetadata,
|
|
71
|
+
onDelete: deleteCR ? handleDelete : undefined
|
|
92
72
|
}) : (0, _react2.jsx)(_core.NonIdealState, {
|
|
93
73
|
icon: (0, _react2.jsx)(_core.Spinner, null),
|
|
94
74
|
css: (0, _react2.css)`
|
|
@@ -99,134 +79,6 @@ const MaybeChangeRequest = (0, _react.memo)(function ({
|
|
|
99
79
|
description: "Unable to load proposal"
|
|
100
80
|
});
|
|
101
81
|
});
|
|
102
|
-
const ChangeRequestDetails = (0, _react.memo)(function ({
|
|
103
|
-
cr,
|
|
104
|
-
canTransition,
|
|
105
|
-
onDelete,
|
|
106
|
-
onDeleteProposalForItemAtPath,
|
|
107
|
-
className
|
|
108
|
-
}) {
|
|
109
|
-
const {
|
|
110
|
-
activeChangeRequestID,
|
|
111
|
-
setActiveChangeRequestID,
|
|
112
|
-
stakeholder,
|
|
113
|
-
registerMetadata
|
|
114
|
-
} = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
|
|
115
|
-
const helmet = (0, _react.useMemo)(() => {
|
|
116
|
-
var _a;
|
|
117
|
-
|
|
118
|
-
return (0, _react2.jsx)(_util2.RegisterHelmet, null, (0, _react2.jsx)("title", null, "Viewing proposal: ", (_a = cr.justification) !== null && _a !== void 0 ? _a : "N/A"));
|
|
119
|
-
}, [cr.justification]);
|
|
120
|
-
const isActive = activeChangeRequestID === cr.id;
|
|
121
|
-
const anotherIsActive = activeChangeRequestID && activeChangeRequestID !== cr.id;
|
|
122
|
-
const crItemEntries = Object.entries(cr.items).map(i => JSON.stringify(i));
|
|
123
|
-
const hasItems = crItemEntries.length > 0;
|
|
124
|
-
const [selectedProposal, selectProposal] = (0, _react.useState)(null);
|
|
125
|
-
const proposals = (0, _react.useMemo)(() => hasItems ? (0, _react2.jsx)(_ProposalBrowser.default, {
|
|
126
|
-
proposals: cr.items,
|
|
127
|
-
selectedItem: selectedProposal,
|
|
128
|
-
onSelectItem: selectProposal,
|
|
129
|
-
onDeleteProposalForItemAtPath: onDeleteProposalForItemAtPath
|
|
130
|
-
}) : (0, _react2.jsx)(_core.NonIdealState, {
|
|
131
|
-
icon: "clean",
|
|
132
|
-
title: "Nothing is proposed here yet.",
|
|
133
|
-
description: onDelete ? (0, _react2.jsx)(_core.Button, {
|
|
134
|
-
onClick: onDelete
|
|
135
|
-
}, "Delete this CR draft") : undefined
|
|
136
|
-
}), [onDelete, onDeleteProposalForItemAtPath, selectedProposal, selectProposal, hasItems]);
|
|
137
|
-
const classification = (0, _react.useMemo)(() => {
|
|
138
|
-
var _a;
|
|
139
|
-
|
|
140
|
-
const classification = [];
|
|
141
|
-
classification.push({
|
|
142
|
-
icon: 'lightbulb',
|
|
143
|
-
children: "Proposal",
|
|
144
|
-
tooltip: {
|
|
145
|
-
icon: 'info-sign',
|
|
146
|
-
content: (0, _react2.jsx)(_core.UL, {
|
|
147
|
-
css: (0, _react2.css)`margin: 0;`
|
|
148
|
-
}, (0, _react2.jsx)("li", null, "Proposal ID: ", cr.id))
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
classification.push({
|
|
152
|
-
children: ((_a = cr.state) === null || _a === void 0 ? void 0 : _a.replaceAll('-', ' ')) || 'N/A',
|
|
153
|
-
tooltip: {
|
|
154
|
-
icon: 'history',
|
|
155
|
-
content: (0, _react2.jsx)(_core.UL, {
|
|
156
|
-
css: (0, _react2.css)`margin: 0;`
|
|
157
|
-
}, (0, _react2.jsx)("li", null, "Edited: ", (0, _react2.jsx)(_util2.Datestamp, {
|
|
158
|
-
date: cr.timeEdited
|
|
159
|
-
})), (0, _react2.jsx)("li", null, "Proposed: ", (0, _types.hadBeenProposed)(cr) ? (0, _react2.jsx)(_util2.Datestamp, {
|
|
160
|
-
date: cr.timeProposed
|
|
161
|
-
}) : 'not yet'), (0, _react2.jsx)("li", null, "Disposed: ", (0, _types.isDisposed)(cr) ? (0, _react2.jsx)(_util2.Datestamp, {
|
|
162
|
-
date: cr.timeDisposed
|
|
163
|
-
}) : 'not yet'))
|
|
164
|
-
},
|
|
165
|
-
intent: cr.state === 'accepted' ? 'success' : cr.state === 'returned-for-clarification' ? 'warning' : cr.state === 'withdrawn' || cr.state === 'rejected' ? 'danger' : cr.state === 'draft' ? undefined : 'primary'
|
|
166
|
-
});
|
|
167
|
-
return classification;
|
|
168
|
-
}, [(0, _util.toJSONNormalized)(cr)]);
|
|
169
|
-
const actions = (0, _react.useMemo)(() => {
|
|
170
|
-
const actions = [];
|
|
171
|
-
const handleChangeActiveStatus = !anotherIsActive && setActiveChangeRequestID ? active => active ? setActiveChangeRequestID === null || setActiveChangeRequestID === void 0 ? void 0 : setActiveChangeRequestID(cr.id) : setActiveChangeRequestID === null || setActiveChangeRequestID === void 0 ? void 0 : setActiveChangeRequestID(null) : undefined; //const htmlTitle = anotherIsActive
|
|
172
|
-
// ? "You are in another proposal so you can’t enter this one. "
|
|
173
|
-
// : canEdit && !isActive
|
|
174
|
-
// ? "Enter proposal to preview or add to proposed changes. "
|
|
175
|
-
// : !isActive
|
|
176
|
-
// ? "Enter proposal to preview the register as proposed."
|
|
177
|
-
// : "You’re previewing the register with this proposal applied."
|
|
178
|
-
|
|
179
|
-
if (handleChangeActiveStatus && isActive) {
|
|
180
|
-
actions.push({
|
|
181
|
-
children: "Exit proposal",
|
|
182
|
-
intent: 'warning',
|
|
183
|
-
disabled: !handleChangeActiveStatus,
|
|
184
|
-
onClick: () => handleChangeActiveStatus === null || handleChangeActiveStatus === void 0 ? void 0 : handleChangeActiveStatus(false) //title: htmlTitle,
|
|
185
|
-
|
|
186
|
-
});
|
|
187
|
-
} else {
|
|
188
|
-
actions.push({
|
|
189
|
-
children: "Work on this proposal",
|
|
190
|
-
intent: 'primary',
|
|
191
|
-
disabled: !handleChangeActiveStatus,
|
|
192
|
-
onClick: () => handleChangeActiveStatus === null || handleChangeActiveStatus === void 0 ? void 0 : handleChangeActiveStatus(true) //title: htmlTitle,
|
|
193
|
-
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return actions;
|
|
198
|
-
}, [isActive, anotherIsActive]);
|
|
199
|
-
return (0, _react2.jsx)(_util2.TabContentsWithHeader, {
|
|
200
|
-
className: className,
|
|
201
|
-
title: (0, _util2.maybeEllipsizeString)(cr.justification, 70),
|
|
202
|
-
classification: classification,
|
|
203
|
-
layout: "card-grid",
|
|
204
|
-
layoutOptions: {
|
|
205
|
-
stretch: true
|
|
206
|
-
},
|
|
207
|
-
actions: actions
|
|
208
|
-
}, helmet, proposals, (0, _react2.jsx)(_core.Card, {
|
|
209
|
-
elevation: 1,
|
|
210
|
-
css: (0, _react2.css)`flex: 100%; padding: 11px;`
|
|
211
|
-
}, (0, _react2.jsx)(_DL.default, null, (0, _react2.jsx)(_MetaProperties.default, {
|
|
212
|
-
cr: cr,
|
|
213
|
-
currentStakeholder: stakeholder,
|
|
214
|
-
registerMetadata: registerMetadata !== null && registerMetadata !== void 0 ? registerMetadata : undefined
|
|
215
|
-
}))), (0, _react2.jsx)(_core.Card, {
|
|
216
|
-
elevation: 1,
|
|
217
|
-
css: (0, _react2.css)`flex: calc(50% - 10px); flex-grow: 1; padding: 11px;`
|
|
218
|
-
}, (0, _react2.jsx)(_TransitionHistory.default, {
|
|
219
|
-
pastTransitions: (0, _TransitionHistory.getTransitionHistory)(cr),
|
|
220
|
-
isFinal: (0, _TransitionOptions.isFinalState)(cr.state)
|
|
221
|
-
})), canTransition ? (0, _react2.jsx)(_core.Card, {
|
|
222
|
-
elevation: 3,
|
|
223
|
-
css: (0, _react2.css)`flex: calc(50% - 10px); flex-grow: 1; padding: 11px;`
|
|
224
|
-
}, (0, _react2.jsx)(_TransitionOptions.default, {
|
|
225
|
-
transitions: stakeholder ? (0, _TransitionOptions.getTransitions)(cr, stakeholder) : [],
|
|
226
|
-
stakeholder: stakeholder,
|
|
227
|
-
cr: cr
|
|
228
|
-
})) : null);
|
|
229
|
-
});
|
|
230
82
|
const CRTitle = (0, _react.memo)(function ({
|
|
231
83
|
uri
|
|
232
84
|
}) {
|
|
@@ -238,7 +90,7 @@ const CRTitle = (0, _react.memo)(function ({
|
|
|
238
90
|
const justification = (_b = (_a = useObjectData({
|
|
239
91
|
objectPaths: [uri]
|
|
240
92
|
}).value.data) === null || _a === void 0 ? void 0 : _a[uri]) === null || _b === void 0 ? void 0 : _b.justification;
|
|
241
|
-
return (0, _react2.jsx)(_react.default.Fragment, null, "Proposal \u201C", (0,
|
|
93
|
+
return (0, _react2.jsx)(_react.default.Fragment, null, "Proposal \u201C", (0, _util.maybeEllipsizeString)(justification !== null && justification !== void 0 ? justification : uri), "\u201D");
|
|
242
94
|
});
|
|
243
95
|
var _default = {
|
|
244
96
|
main: View,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/ChangeRequest/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useState, useContext, useMemo, memo, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n Button,\n Card,\n NonIdealState,\n Spinner,\n UL,\n} from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport { toJSONNormalized } from '@riboseinc/paneron-extension-kit/util';\nimport DL from '@riboseinc/paneron-extension-kit/widgets/DL';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport { crPathToCRID } from '../../itemPathUtils';\nimport {\n ChangeRequestContextProvider,\n ChangeRequestContext,\n} from '../../../proposals/ChangeRequestContext';\nimport Proposals from '../../../proposals/ProposalBrowser';\nimport TransitionOptions, { isFinalState, getTransitions } from '../../../proposals/TransitionOptions';\nimport TransitionsAndStatus, { getTransitionHistory } from '../../../proposals/TransitionHistory';\nimport Summary from '../../../proposals/MetaProperties';\nimport { type SomeCR, hadBeenProposed, isDisposed } from '../../../proposals/types';\nimport { Protocols } from '../../protocolRegistry';\nimport {\n TabContentsWithHeader,\n type TabContentsWithHeaderProps,\n RegisterHelmet as Helmet,\n maybeEllipsizeString,\n Datestamp,\n} from '../../util';\n\n\nconst View: React.VoidFunctionComponent<{ uri: string }> =\nmemo(function ({ uri }) {\n const crID = crPathToCRID(uri);\n return (\n <ChangeRequestContextProvider changeRequestID={crID}>\n <MaybeChangeRequest uri={uri} />\n </ChangeRequestContextProvider>\n );\n});\n\n\nconst MaybeChangeRequest: React.VoidFunctionComponent<{ uri: string }> =\nmemo(function ({ uri }) {\n const { closeTabWithURI } = useContext(TabbedWorkspaceContext);\n const {\n changeRequest: cr,\n canTransition,\n deleteCR,\n updateItemProposal,\n } = useContext(ChangeRequestContext);\n\n const handleDelete = useCallback(\n (async () => {\n if (deleteCR) {\n await deleteCR();\n closeTabWithURI(`${Protocols.CHANGE_REQUEST}:${uri}`);\n }\n }),\n [deleteCR, closeTabWithURI]);\n\n const handleDeleteProposalAtItemPath = useCallback(\n async function handleDeleteProposalAtItemPath(itemPath: string) {\n return await updateItemProposal?.(\"remove proposed change from proposal draft\", null, itemPath);\n },\n [updateItemProposal],\n );\n\n return (cr\n ? <ChangeRequestDetails\n cr={cr}\n canTransition={canTransition}\n onDelete={deleteCR\n ? handleDelete\n : undefined}\n onDeleteProposalForItemAtPath={updateItemProposal\n ? handleDeleteProposalAtItemPath\n : undefined}\n css={css`\n position: absolute;\n inset: 0;\n overflow-y: auto;\n `}\n />\n : <NonIdealState\n icon={<Spinner />}\n css={css`\n position: absolute;\n inset: 0;\n overflow-y: auto;\n `}\n description={\"Unable to load proposal\"}\n />\n );\n});\n\n\nconst ChangeRequestDetails: React.VoidFunctionComponent<{\n cr: SomeCR,\n canTransition: boolean,\n onDelete?: () => void,\n onDeleteProposalForItemAtPath?: (itemPath: string) => void,\n className?: string,\n}> = memo(function ({ cr, canTransition, onDelete, onDeleteProposalForItemAtPath, className }) {\n const {\n activeChangeRequestID,\n setActiveChangeRequestID,\n stakeholder,\n registerMetadata,\n } = useContext(BrowserCtx);\n\n const helmet = useMemo((() =>\n <Helmet>\n <title>Viewing proposal: {cr.justification ?? \"N/A\"}</title>\n </Helmet>\n ), [cr.justification]);\n\n const isActive = activeChangeRequestID === cr.id;\n const anotherIsActive = activeChangeRequestID && activeChangeRequestID !== cr.id;\n\n const crItemEntries = Object.entries(cr.items).map(i => JSON.stringify(i));\n const hasItems = crItemEntries.length > 0;\n\n const [selectedProposal, selectProposal] = useState<string | null>(null);\n const proposals = useMemo((() =>\n hasItems\n ? <Proposals\n proposals={cr.items}\n selectedItem={selectedProposal}\n onSelectItem={selectProposal}\n onDeleteProposalForItemAtPath={onDeleteProposalForItemAtPath}\n />\n : <NonIdealState\n icon=\"clean\"\n title=\"Nothing is proposed here yet.\"\n description={onDelete\n ? <Button onClick={onDelete}>\n Delete this CR draft\n </Button>\n : undefined}\n />\n ), [onDelete, onDeleteProposalForItemAtPath, selectedProposal, selectProposal, hasItems]);\n\n const classification = useMemo(() => {\n const classification: TabContentsWithHeaderProps[\"classification\"] = [];\n classification.push({\n icon: 'lightbulb',\n children: \"Proposal\",\n tooltip: {\n icon: 'info-sign',\n content: <UL css={css`margin: 0;`}><li>Proposal ID: {cr.id}</li></UL>,\n },\n });\n classification.push({\n children: cr.state?.replaceAll('-', ' ') || 'N/A',\n tooltip: {\n icon: 'history',\n content: <UL css={css`margin: 0;`}>\n <li>Edited: <Datestamp date={cr.timeEdited} /></li>\n <li>Proposed: {hadBeenProposed(cr) ? <Datestamp date={cr.timeProposed} /> : 'not yet'}</li>\n <li>Disposed: {isDisposed(cr) ? <Datestamp date={cr.timeDisposed} /> : 'not yet'}</li>\n </UL>,\n },\n intent: cr.state === 'accepted'\n ? 'success'\n : cr.state === 'returned-for-clarification'\n ? 'warning'\n : cr.state === 'withdrawn' || cr.state === 'rejected'\n ? 'danger'\n : cr.state === 'draft'\n ? undefined\n : 'primary',\n });\n return classification;\n }, [toJSONNormalized(cr)]);\n\n const actions = useMemo(() => {\n const actions: TabContentsWithHeaderProps[\"actions\"] = [];\n const handleChangeActiveStatus = !anotherIsActive && setActiveChangeRequestID\n ? ((active: boolean) => active\n ? setActiveChangeRequestID?.(cr.id)\n : setActiveChangeRequestID?.(null)\n )\n : undefined;\n //const htmlTitle = anotherIsActive\n // ? \"You are in another proposal so you can’t enter this one. \"\n // : canEdit && !isActive\n // ? \"Enter proposal to preview or add to proposed changes. \"\n // : !isActive\n // ? \"Enter proposal to preview the register as proposed.\"\n // : \"You’re previewing the register with this proposal applied.\"\n if (handleChangeActiveStatus && isActive) {\n actions.push({\n children: \"Exit proposal\",\n intent: 'warning',\n disabled: !handleChangeActiveStatus,\n onClick: () => handleChangeActiveStatus?.(false)\n //title: htmlTitle,\n });\n } else {\n actions.push({\n children: \"Work on this proposal\",\n intent: 'primary',\n disabled: !handleChangeActiveStatus,\n onClick: () => handleChangeActiveStatus?.(true)\n //title: htmlTitle,\n });\n }\n return actions;\n }, [isActive, anotherIsActive]);\n\n return (\n <TabContentsWithHeader\n className={className}\n title={maybeEllipsizeString(cr.justification, 70)}\n classification={classification}\n layout=\"card-grid\"\n layoutOptions={{ stretch: true }}\n actions={actions}>\n\n {helmet}\n\n {proposals}\n\n <Card elevation={1} css={css`flex: 100%; padding: 11px;`}>\n <DL>\n <Summary\n cr={cr}\n currentStakeholder={stakeholder}\n registerMetadata={registerMetadata ?? undefined}\n />\n </DL>\n </Card>\n\n <Card elevation={1} css={css`flex: calc(50% - 10px); flex-grow: 1; padding: 11px;`}>\n <TransitionsAndStatus\n pastTransitions={getTransitionHistory(cr)}\n isFinal={isFinalState(cr.state)}\n />\n </Card>\n\n {canTransition\n ? <Card elevation={3} css={css`flex: calc(50% - 10px); flex-grow: 1; padding: 11px;`}>\n <TransitionOptions\n transitions={stakeholder ? getTransitions(cr, stakeholder) : []}\n stakeholder={stakeholder}\n cr={cr}\n />\n </Card>\n : null}\n </TabContentsWithHeader>\n );\n});\n\n\nconst CRTitle: React.FC<{ uri: string }> = memo(function ({ uri }) {\n const { useObjectData } = useContext(DatasetContext);\n const justification = useObjectData({ objectPaths: [uri] }).value.data?.[uri]?.justification;\n return <>Proposal “{maybeEllipsizeString(justification ?? uri)}”</>;\n});\n\nexport default { main: View, title: CRTitle };\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/ChangeRequest/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,aAAa,EACb,OAAO,GACR,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,yCAAyC,CAAC;AACjD,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,IAAI,GACV,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;IACpB,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,CACL,IAAC,4BAA4B,IAAC,eAAe,EAAE,IAAI;QACjD,IAAC,kBAAkB,IAAC,GAAG,EAAE,GAAG,GAAI,CACH,CAChC,CAAC;AACJ,CAAC,CAAC,CAAC;AAGH,MAAM,kBAAkB,GACxB,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;IACpB,MAAM,EAAE,eAAe,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC/D,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACzE,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAEpD,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,KAAK,IAAI,EAAE;QACV,IAAI,QAAQ,EAAE;YACZ,MAAM,QAAQ,EAAE,CAAC;YACjB,eAAe,CAAC,GAAG,SAAS,CAAC,cAAc,IAAI,GAAG,EAAE,CAAC,CAAC;SACvD;IACH,CAAC,CAAC,EACF,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;IAE/B,OAAO,CAAC,EAAE,IAAI,gBAAgB;QAC5B,CAAC,CAAC,IAAC,WAAW,IACV,QAAQ,EAAE,EAAE,EACZ,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,QAAQ;gBAChB,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,SAAS,GACb;QACJ,CAAC,CAAC,IAAC,aAAa,IACZ,IAAI,EAAE,IAAC,OAAO,OAAG,EACjB,GAAG,EAAE,GAAG,CAAA;;;;SAIP,EACD,WAAW,EAAE,yBAAyB,GACtC,CACL,CAAC;AACJ,CAAC,CAAC,CAAC;AAGH,MAAM,OAAO,GAA8B,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;;IAC/D,MAAM,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,MAAA,MAAA,aAAa,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,0CAAG,GAAG,CAAC,0CAAE,aAAa,CAAC;IAC7F,OAAO;;QAAa,oBAAoB,CAAC,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,GAAG,CAAC;iBAAK,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, memo, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n NonIdealState,\n Spinner,\n} from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport { crPathToCRID } from '../../itemPathUtils';\nimport {\n ChangeRequestContextProvider,\n ChangeRequestContext,\n} from '../../../proposals/ChangeRequestContext';\nimport ProposalTab from '../../../proposals/ProposalTab';\nimport { Protocols } from '../../protocolRegistry';\nimport { maybeEllipsizeString } from '../../util';\n\n\nconst View: React.VoidFunctionComponent<{ uri: string }> =\nmemo(function ({ uri }) {\n const crID = crPathToCRID(uri);\n return (\n <ChangeRequestContextProvider changeRequestID={crID}>\n <MaybeChangeRequest uri={uri} />\n </ChangeRequestContextProvider>\n );\n});\n\n\nconst MaybeChangeRequest: React.VoidFunctionComponent<{ uri: string }> =\nmemo(function ({ uri }) {\n const { closeTabWithURI } = useContext(TabbedWorkspaceContext);\n const { changeRequest: cr, deleteCR } = useContext(ChangeRequestContext);\n const { registerMetadata } = useContext(BrowserCtx);\n\n const handleDelete = useCallback(\n (async () => {\n if (deleteCR) {\n await deleteCR();\n closeTabWithURI(`${Protocols.CHANGE_REQUEST}:${uri}`);\n }\n }),\n [deleteCR, closeTabWithURI]);\n\n return (cr && registerMetadata\n ? <ProposalTab\n proposal={cr}\n register={registerMetadata}\n onDelete={deleteCR\n ? handleDelete\n : undefined}\n />\n : <NonIdealState\n icon={<Spinner />}\n css={css`\n position: absolute;\n inset: 0;\n overflow-y: auto;\n `}\n description={\"Unable to load proposal\"}\n />\n );\n});\n\n\nconst CRTitle: React.FC<{ uri: string }> = memo(function ({ uri }) {\n const { useObjectData } = useContext(DatasetContext);\n const justification = useObjectData({ objectPaths: [uri] }).value.data?.[uri]?.justification;\n return <>Proposal “{maybeEllipsizeString(justification ?? uri)}”</>;\n});\n\nexport default { main: View, title: CRTitle };\n"]}
|
|
@@ -11,31 +11,27 @@ var _react2 = require("@emotion/react");
|
|
|
11
11
|
|
|
12
12
|
var _core = require("@blueprintjs/core");
|
|
13
13
|
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
var _Workspace = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/Workspace"));
|
|
17
|
-
|
|
18
|
-
var _SuperSidebar = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/SuperSidebar"));
|
|
14
|
+
var _context = require("@riboseinc/paneron-extension-kit/context");
|
|
19
15
|
|
|
20
16
|
var _BrowserCtx = require("../BrowserCtx");
|
|
21
17
|
|
|
22
|
-
var _models = require("../FilterCriteria/models");
|
|
23
|
-
|
|
24
18
|
var _stakeholder = require("../../types/stakeholder");
|
|
25
19
|
|
|
26
|
-
var
|
|
20
|
+
var _ChangeRequestContext = require("../../proposals/ChangeRequestContext");
|
|
27
21
|
|
|
28
|
-
var
|
|
22
|
+
var _ProposalTab = _interopRequireDefault(require("../../proposals/ProposalTab"));
|
|
29
23
|
|
|
30
|
-
var
|
|
24
|
+
var _NewProposalMenu = _interopRequireDefault(require("../../proposals/NewProposalMenu"));
|
|
31
25
|
|
|
32
|
-
var
|
|
26
|
+
var _types = require("../../proposals/types");
|
|
33
27
|
|
|
34
|
-
var
|
|
28
|
+
var _itemPathUtils = require("../itemPathUtils");
|
|
29
|
+
|
|
30
|
+
var _util = require("../util");
|
|
35
31
|
|
|
36
|
-
var
|
|
32
|
+
var _useLatestAcceptedProposal = _interopRequireDefault(require("../../views/hooks/useLatestAcceptedProposal"));
|
|
37
33
|
|
|
38
|
-
var
|
|
34
|
+
var _proposals = require("../../proposals");
|
|
39
35
|
|
|
40
36
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
41
37
|
|
|
@@ -48,27 +44,157 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
48
44
|
/** @jsxFrag React.Fragment */
|
|
49
45
|
const ProposalWork = (0, _react.memo)(function () {
|
|
50
46
|
const {
|
|
51
|
-
changeRequest: activeCR
|
|
47
|
+
changeRequest: activeCR,
|
|
48
|
+
deleteCR
|
|
52
49
|
} = (0, _react.useContext)(_ChangeRequestContext.ChangeRequestContext);
|
|
53
50
|
const {
|
|
54
51
|
registerMetadata: register,
|
|
55
|
-
stakeholder
|
|
52
|
+
stakeholder,
|
|
53
|
+
setActiveChangeRequestID,
|
|
54
|
+
itemClasses
|
|
56
55
|
} = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
|
|
56
|
+
const {
|
|
57
|
+
getMapReducedData,
|
|
58
|
+
requestFileFromFilesystem,
|
|
59
|
+
updateObjects,
|
|
60
|
+
performOperation,
|
|
61
|
+
getObjectData,
|
|
62
|
+
isBusy
|
|
63
|
+
} = (0, _react.useContext)(_context.DatasetContext);
|
|
64
|
+
const handleDelete = (0, _react.useCallback)(async () => {
|
|
65
|
+
if (deleteCR && activeCR && setActiveChangeRequestID) {
|
|
66
|
+
await deleteCR();
|
|
67
|
+
setActiveChangeRequestID(null);
|
|
68
|
+
}
|
|
69
|
+
}, [deleteCR, setActiveChangeRequestID]);
|
|
70
|
+
let latestAcceptedProposal;
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
latestAcceptedProposal = (0, _useLatestAcceptedProposal.default)();
|
|
74
|
+
} catch (e) {
|
|
75
|
+
console.error("Failed to obtain latest accepted proposal");
|
|
76
|
+
latestAcceptedProposal = undefined;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const getNewEmptyCRChangeset = (0, _react.useMemo)(() => {
|
|
80
|
+
if (stakeholder && (0, _stakeholder.canCreateCR)(stakeholder) && latestAcceptedProposal !== undefined) {
|
|
81
|
+
return async function getNewEmptyCRChangeset(newIdea) {
|
|
82
|
+
var _a;
|
|
83
|
+
|
|
84
|
+
const crID = crypto.randomUUID();
|
|
85
|
+
return [(0, _proposals.newCRObjectChangeset)(crID, newIdea, (_a = latestAcceptedProposal === null || latestAcceptedProposal === void 0 ? void 0 : latestAcceptedProposal.id) !== null && _a !== void 0 ? _a : 'initial', stakeholder.gitServerUsername), crID];
|
|
86
|
+
};
|
|
87
|
+
} else {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
}, [stakeholder, latestAcceptedProposal === null || latestAcceptedProposal === void 0 ? void 0 : latestAcceptedProposal.id]);
|
|
91
|
+
const getImportedCRChangeset = (0, _react.useMemo)(() => {
|
|
92
|
+
if (requestFileFromFilesystem && stakeholder && (0, _stakeholder.canImportCR)(stakeholder)) {
|
|
93
|
+
return async function getImportedCRChangeset() {
|
|
94
|
+
const data = await requestFileFromFilesystem({
|
|
95
|
+
prompt: "Select one register proposal JSON file",
|
|
96
|
+
filters: [{
|
|
97
|
+
name: "JSON files",
|
|
98
|
+
extensions: ['.json']
|
|
99
|
+
}]
|
|
100
|
+
});
|
|
101
|
+
const fileData = Object.values(data)[0];
|
|
102
|
+
|
|
103
|
+
if (!fileData) {
|
|
104
|
+
throw new Error("No file was selected");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if ((0, _types.isImportableCR)(fileData)) {
|
|
108
|
+
try {
|
|
109
|
+
const [changeset, crID] = await (0, _proposals.importedProposalToCRObjectChangeset)(fileData, itemClasses, stakeholder.gitServerUsername, getObjectData, async function resolvePredicates(predicates) {
|
|
110
|
+
const mapReduceChains = [...predicates.values()].map(predicate => ({
|
|
111
|
+
[predicate]: {
|
|
112
|
+
mapFunc: `
|
|
113
|
+
const data = value.data;
|
|
114
|
+
if (!key.startsWith('/proposals/') && data && (${predicate})) {
|
|
115
|
+
emit({ objectPath: key, objectData: value });
|
|
116
|
+
}
|
|
117
|
+
`
|
|
118
|
+
}
|
|
119
|
+
})).reduce((prev, curr) => ({ ...prev,
|
|
120
|
+
...curr
|
|
121
|
+
}), {});
|
|
122
|
+
const result = await getMapReducedData({
|
|
123
|
+
chains: mapReduceChains
|
|
124
|
+
});
|
|
125
|
+
return Object.entries(result).map(([chainLabel, chainResult]) => {
|
|
126
|
+
const objects = Array.isArray(chainResult) ? chainResult : [];
|
|
127
|
+
|
|
128
|
+
if (objects.length < 1) {
|
|
129
|
+
throw new Error(`Unable to resolve predicate to item UUID: no item found matching predicate ${chainLabel}`);
|
|
130
|
+
} else if (objects.length > 1) {
|
|
131
|
+
const objectOverview = objects.map(o => JSON.stringify(o)).join(', ');
|
|
132
|
+
throw new Error(`Unable to resolve predicate to item UUID: more than one item matches predicate ${chainLabel}: ${objectOverview}`);
|
|
133
|
+
} else {
|
|
134
|
+
return {
|
|
135
|
+
// There’s just one item anyway, hence `objects[0]`.
|
|
136
|
+
[chainLabel]: (0, _itemPathUtils.itemPathToItemRef)(false, objects[0].objectPath)
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}).reduce((prev, curr) => ({ ...prev,
|
|
140
|
+
...curr
|
|
141
|
+
}), {});
|
|
142
|
+
});
|
|
143
|
+
return [changeset, crID];
|
|
144
|
+
} catch (e) {
|
|
145
|
+
console.error("Error reading proposal data", e);
|
|
146
|
+
throw new Error("Error reading proposal data");
|
|
147
|
+
}
|
|
148
|
+
} else {
|
|
149
|
+
throw new Error("Invalid proposal format");
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
} else {
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
}, [getMapReducedData, requestFileFromFilesystem, getObjectData, stakeholder]);
|
|
156
|
+
const [importCR, createCR] = (0, _react.useMemo)(() => {
|
|
157
|
+
if (updateObjects && setActiveChangeRequestID && !isBusy) {
|
|
158
|
+
return [getImportedCRChangeset ? performOperation('importing proposal', async function () {
|
|
159
|
+
const [objectChangeset, crID] = await getImportedCRChangeset();
|
|
160
|
+
await updateObjects({
|
|
161
|
+
commitMessage: 'import proposal',
|
|
162
|
+
objectChangeset
|
|
163
|
+
});
|
|
164
|
+
setActiveChangeRequestID(crID);
|
|
165
|
+
}) : undefined, getNewEmptyCRChangeset ? performOperation('creating blank proposal', async function (newIdea) {
|
|
166
|
+
const [objectChangeset, crID] = await getNewEmptyCRChangeset(newIdea);
|
|
167
|
+
await updateObjects({
|
|
168
|
+
commitMessage: `start new empty proposal ${newIdea}`,
|
|
169
|
+
objectChangeset
|
|
170
|
+
});
|
|
171
|
+
setActiveChangeRequestID(crID);
|
|
172
|
+
}) : undefined];
|
|
173
|
+
} else {
|
|
174
|
+
return [undefined, undefined];
|
|
175
|
+
}
|
|
176
|
+
}, [isBusy, performOperation, updateObjects, getImportedCRChangeset, getNewEmptyCRChangeset]);
|
|
57
177
|
|
|
58
178
|
if (!activeCR || !register || !stakeholder) {
|
|
59
179
|
return (0, _react2.jsx)(_core.NonIdealState, {
|
|
60
180
|
icon: "clean",
|
|
61
181
|
title: "Not working on any proposal",
|
|
62
|
-
description: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)("p", null, "Choose an actionable proposal from the sidebar to the left and activate it by double-clicking"), register && stakeholder && (0, _stakeholder.canCreateCR)(stakeholder) ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)("p", null, "\u2014or\u2014"), (0, _react2.jsx)(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
182
|
+
description: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)("p", null, "Choose an actionable proposal from the sidebar to the left and activate it by double-clicking"), register && stakeholder && (0, _stakeholder.canCreateCR)(stakeholder) && latestAcceptedProposal !== undefined ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)("p", null, "\u2014or\u2014"), (0, _react2.jsx)(_NewProposalMenu.default, {
|
|
183
|
+
css: (0, _react2.css)`height: 200px;`,
|
|
184
|
+
previousVersion: (latestAcceptedProposal === null || latestAcceptedProposal === void 0 ? void 0 : latestAcceptedProposal.timeDisposed) ? (0, _util.formatDate)(latestAcceptedProposal.timeDisposed, {
|
|
185
|
+
showTime: true,
|
|
186
|
+
useUTC: true
|
|
187
|
+
}) : null,
|
|
188
|
+
onImport: importCR,
|
|
189
|
+
onCreateBlank: createCR
|
|
190
|
+
})) : null)
|
|
66
191
|
});
|
|
67
192
|
} else {
|
|
68
|
-
return (0, _react2.jsx)(
|
|
193
|
+
return (0, _react2.jsx)(_ProposalTab.default, {
|
|
69
194
|
proposal: activeCR,
|
|
70
195
|
register: register,
|
|
71
|
-
stakeholder: stakeholder
|
|
196
|
+
stakeholder: stakeholder,
|
|
197
|
+
onDelete: deleteCR ? handleDelete : undefined
|
|
72
198
|
});
|
|
73
199
|
}
|
|
74
200
|
});
|
|
@@ -77,97 +203,11 @@ const ProposalWorkTitle = function () {
|
|
|
77
203
|
const {
|
|
78
204
|
changeRequest: activeCR
|
|
79
205
|
} = (0, _react.useContext)(_ChangeRequestContext.ChangeRequestContext);
|
|
80
|
-
return (0, _react2.jsx)(_react.default.Fragment, null, activeCR ? (0, _react2.jsx)("strong", null, "
|
|
206
|
+
return (0, _react2.jsx)(_react.default.Fragment, null, activeCR ? (0, _react2.jsx)("strong", null, "Active proposal") : (0, _react2.jsx)(_react.default.Fragment, null, "Proposal dashboard"));
|
|
81
207
|
};
|
|
82
208
|
|
|
83
209
|
var _default = {
|
|
84
210
|
main: ProposalWork,
|
|
85
211
|
title: ProposalWorkTitle
|
|
86
212
|
};
|
|
87
|
-
exports.default = _default;
|
|
88
|
-
|
|
89
|
-
const ActiveProposal = function ({
|
|
90
|
-
proposal,
|
|
91
|
-
register,
|
|
92
|
-
stakeholder
|
|
93
|
-
}) {
|
|
94
|
-
var _a;
|
|
95
|
-
|
|
96
|
-
return (0, _react2.jsx)(_util.TabContentsWithHeader, {
|
|
97
|
-
title: (0, _react2.jsx)(_react.default.Fragment, null, proposal.justification),
|
|
98
|
-
classification: [{
|
|
99
|
-
children: (0, _react2.jsx)(_react.default.Fragment, null, proposal.state)
|
|
100
|
-
}]
|
|
101
|
-
}, (0, _react2.jsx)(_Workspace.default, {
|
|
102
|
-
sidebarPosition: "right",
|
|
103
|
-
sidebar: (0, _react2.jsx)(_SuperSidebar.default, {
|
|
104
|
-
sidebarIDs: ['meta'],
|
|
105
|
-
css: (0, _react2.css)`width: 30% !important; min-width: 300px;`,
|
|
106
|
-
selectedSidebarID: 'meta',
|
|
107
|
-
config: {
|
|
108
|
-
meta: {
|
|
109
|
-
icon: () => (0, _react2.jsx)(_core.Icon, {
|
|
110
|
-
icon: "document"
|
|
111
|
-
}),
|
|
112
|
-
title: "Meta",
|
|
113
|
-
blocks: [{
|
|
114
|
-
key: 'summary',
|
|
115
|
-
title: "Summary",
|
|
116
|
-
content: (0, _react2.jsx)("div", {
|
|
117
|
-
css: (0, _react2.css)`padding: 0 5px;`
|
|
118
|
-
}, "\u201C", (_a = proposal.justification) === null || _a === void 0 ? void 0 : _a.trim(), "\u201D", (0, _react2.jsx)("br", null), (0, _react2.jsx)(_DL.default, null, (0, _react2.jsx)(_MetaProperties.default, {
|
|
119
|
-
cr: proposal,
|
|
120
|
-
currentStakeholder: stakeholder,
|
|
121
|
-
registerMetadata: register
|
|
122
|
-
})))
|
|
123
|
-
}, {
|
|
124
|
-
key: 'transitions',
|
|
125
|
-
title: "Transitions",
|
|
126
|
-
content: (0, _react2.jsx)(TransitionBlockContents, {
|
|
127
|
-
proposal: proposal,
|
|
128
|
-
stakeholder: stakeholder
|
|
129
|
-
})
|
|
130
|
-
}]
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
})
|
|
134
|
-
}, (0, _react2.jsx)(_util.RegisterHelmet, null, (0, _react2.jsx)("title", null, "Working on proposal ", proposal.justification)), (0, _react2.jsx)("div", {
|
|
135
|
-
css: (0, _react2.css)`padding: 10px; flex: 1; display: flex; flex-flow: column nowrap; overflow: hidden;`
|
|
136
|
-
}, (0, _react2.jsx)(_Search2.default, {
|
|
137
|
-
css: (0, _react2.css)`flex: 1;`,
|
|
138
|
-
//style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}
|
|
139
|
-
implicitCriteria: _models.MATCHES_ANY_CRITERIA,
|
|
140
|
-
stateName: `proposal-${proposal.id}-search`,
|
|
141
|
-
List: _Search.default,
|
|
142
|
-
extraData: {
|
|
143
|
-
proposal
|
|
144
|
-
}
|
|
145
|
-
}))));
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
const TransitionBlockContents = function ({
|
|
149
|
-
proposal,
|
|
150
|
-
stakeholder
|
|
151
|
-
}) {
|
|
152
|
-
const transitions = (0, _react.useMemo)(() => stakeholder ? (0, _TransitionOptions.getTransitions)(proposal, stakeholder) : [], [proposal, stakeholder]);
|
|
153
|
-
const [showDetailedHistory, setShowDetailedHistory] = (0, _react.useState)(false);
|
|
154
|
-
const transitionsBlock = (0, _react.useMemo)(() => (0, _react2.jsx)("div", {
|
|
155
|
-
css: (0, _react2.css)`overflow-y: auto; max-height: 300px;`
|
|
156
|
-
}, (0, _react2.jsx)(_core.Checkbox // NOTE: left margin aligns with transition history bullets…
|
|
157
|
-
, {
|
|
158
|
-
// NOTE: left margin aligns with transition history bullets…
|
|
159
|
-
css: (0, _react2.css)`margin: 5px 15px;`,
|
|
160
|
-
checked: showDetailedHistory,
|
|
161
|
-
onChange: evt => setShowDetailedHistory(evt.currentTarget.checked)
|
|
162
|
-
}, "Show detailed history"), (0, _react2.jsx)(_TransitionHistory.default, {
|
|
163
|
-
pastTransitions: (0, _TransitionHistory.getTransitionHistory)(proposal),
|
|
164
|
-
isFinal: (0, _TransitionOptions.isFinalState)(proposal.state),
|
|
165
|
-
detailed: showDetailedHistory
|
|
166
|
-
}), !showDetailedHistory && transitions.length > 0 ? (0, _react2.jsx)(_TransitionOptions.default, {
|
|
167
|
-
stakeholder: stakeholder,
|
|
168
|
-
transitions: transitions,
|
|
169
|
-
cr: proposal,
|
|
170
|
-
css: (0, _react2.css)`padding: 12px;`
|
|
171
|
-
}) : null), [proposal, transitions, setShowDetailedHistory, showDetailedHistory]);
|
|
172
|
-
return transitionsBlock;
|
|
173
|
-
};
|
|
213
|
+
exports.default = _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProposalWork.js","sourceRoot":"","sources":["../../../src/views/detail/ProposalWork.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo, useState, useContext, memo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n Button,\n NonIdealState,\n Icon,\n Checkbox,\n} from '@blueprintjs/core';\nimport DL from '@riboseinc/paneron-extension-kit/widgets/DL';\nimport Workspace from '@riboseinc/paneron-extension-kit/widgets/Workspace';\nimport SuperSidebar from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/SuperSidebar';\nimport { BrowserCtx } from '../BrowserCtx';\nimport { MATCHES_ANY_CRITERIA } from '../FilterCriteria/models';\nimport type { Register, RegisterStakeholder } from '../../types';\nimport { canCreateCR } from '../../types/stakeholder';\nimport { type SomeCR as CR } from '../../proposals/types';\nimport MetaProperties from '../../proposals/MetaProperties';\nimport ProposalSearch from '../../proposals/Search';\nimport Search from '../../views/sidebar/Search';\nimport { RegisterHelmet as Helmet } from '../util';\nimport { ChangeRequestContext } from '../../proposals/ChangeRequestContext';\nimport { TabContentsWithHeader } from '../util';\nimport TransitionOptions, { getTransitions, isFinalState } from '../../proposals/TransitionOptions';\nimport TransitionsAndStatus, { getTransitionHistory } from '../../proposals/TransitionHistory';\n\n\nconst ProposalWork: React.VoidFunctionComponent<Record<never, never>> =\nmemo(function () {\n const { changeRequest: activeCR } = useContext(ChangeRequestContext);\n const { registerMetadata: register, stakeholder, } = useContext(BrowserCtx);\n if (!activeCR || !register || !stakeholder) {\n return <NonIdealState\n icon=\"clean\"\n title=\"Not working on any proposal\"\n description={<>\n <p>\n Choose an actionable proposal from the sidebar to the left\n and activate it by double-clicking\n </p>\n {register && stakeholder && canCreateCR(stakeholder)\n ? <>\n <p>—or—</p>\n <Button large intent=\"primary\">Start a new proposal</Button>\n </>\n : null}\n </>}\n />;\n } else {\n return <ActiveProposal\n proposal={activeCR}\n register={register}\n stakeholder={stakeholder}\n />;\n }\n});\n\n\nconst ProposalWorkTitle: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { changeRequest: activeCR } = useContext(ChangeRequestContext);\n return <>{activeCR\n ? <strong> Active proposal</strong>\n : <>Proposal dashboard</>}</>;\n};\n\n\nexport default {\n main: ProposalWork,\n title: ProposalWorkTitle,\n} as const;\n\n\nconst ActiveProposal: React.VoidFunctionComponent<{\n proposal: CR\n register: Register\n stakeholder?: RegisterStakeholder\n}> = function ({ proposal, register, stakeholder }) {\n return (\n <TabContentsWithHeader\n title={<>{proposal.justification}</>}\n classification={[{ children: <>{proposal.state}</> }]}>\n <Workspace sidebarPosition=\"right\" sidebar={\n <SuperSidebar\n sidebarIDs={['meta']}\n css={css`width: 30% !important; min-width: 300px;`}\n selectedSidebarID='meta'\n config={{\n meta: {\n icon: () => <Icon icon=\"document\" />,\n title: \"Meta\",\n blocks: [{\n key: 'summary',\n title: \"Summary\",\n content: <div css={css`padding: 0 5px;`}>\n “{proposal.justification?.trim()}”\n <br />\n <DL>\n <MetaProperties\n cr={proposal}\n currentStakeholder={stakeholder}\n registerMetadata={register}\n />\n </DL>\n </div>,\n }, {\n key: 'transitions',\n title: \"Transitions\",\n content: <TransitionBlockContents\n proposal={proposal}\n stakeholder={stakeholder}\n />,\n }],\n },\n }}\n />\n }>\n <Helmet><title>Working on proposal {proposal.justification}</title></Helmet>\n <div css={css`padding: 10px; flex: 1; display: flex; flex-flow: column nowrap; overflow: hidden;`}>\n <Search\n css={css`flex: 1;`}\n //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}\n implicitCriteria={MATCHES_ANY_CRITERIA}\n stateName={`proposal-${proposal.id}-search`}\n List={ProposalSearch as any}\n extraData={{ proposal }}\n //onOpenItem={onChooseItem ? handleOpenItem : undefined}\n />\n </div>\n </Workspace>\n </TabContentsWithHeader>\n );\n};\n\n\nconst TransitionBlockContents: React.VoidFunctionComponent<{\n proposal: CR\n stakeholder?: RegisterStakeholder\n}> = function ({ proposal, stakeholder }) {\n const transitions = useMemo(\n (() => stakeholder\n ? getTransitions(proposal, stakeholder)\n : []),\n [proposal, stakeholder]);\n\n const [showDetailedHistory, setShowDetailedHistory] = useState(false);\n\n const transitionsBlock = useMemo(\n (() =>\n <div css={css`overflow-y: auto; max-height: 300px;`}>\n <Checkbox\n // NOTE: left margin aligns with transition history bullets…\n css={css`margin: 5px 15px;`}\n checked={showDetailedHistory}\n onChange={(evt) => setShowDetailedHistory(evt.currentTarget.checked)}>\n Show detailed history\n </Checkbox>\n <TransitionsAndStatus\n pastTransitions={getTransitionHistory(proposal)}\n isFinal={isFinalState(proposal.state)}\n detailed={showDetailedHistory}\n />\n {!showDetailedHistory && transitions.length > 0\n ? <TransitionOptions\n stakeholder={stakeholder}\n transitions={transitions}\n cr={proposal}\n css={css`padding: 12px;`}\n />\n : null}\n </div>),\n [proposal, transitions, setShowDetailedHistory, showDetailedHistory]);\n\n return transitionsBlock;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ProposalWork.js","sourceRoot":"","sources":["../../../src/views/detail/ProposalWork.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo, useContext, useCallback, memo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { NonIdealState } from '@blueprintjs/core';\n\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\n\nimport { BrowserCtx } from '../BrowserCtx';\nimport { canImportCR, canCreateCR } from '../../types/stakeholder';\nimport { ChangeRequestContext } from '../../proposals/ChangeRequestContext';\nimport ProposalTab from '../../proposals/ProposalTab';\nimport NewProposalMenu from '../../proposals/NewProposalMenu';\nimport { isImportableCR } from '../../proposals/types';\nimport { itemPathToItemRef } from '../itemPathUtils';\nimport { formatDate } from '../util';\nimport useLatestAcceptedProposal from '../../views/hooks/useLatestAcceptedProposal';\nimport {\n newCRObjectChangeset,\n importedProposalToCRObjectChangeset,\n} from '../../proposals';\n\n\nconst ProposalWork: React.VoidFunctionComponent<Record<never, never>> =\nmemo(function () {\n const { changeRequest: activeCR, deleteCR } = useContext(ChangeRequestContext);\n const {\n registerMetadata: register,\n stakeholder,\n setActiveChangeRequestID,\n itemClasses,\n } = useContext(BrowserCtx);\n const {\n getMapReducedData,\n requestFileFromFilesystem,\n updateObjects,\n performOperation,\n getObjectData,\n isBusy,\n } = useContext(DatasetContext);\n\n const handleDelete = useCallback(async () => {\n if (deleteCR && activeCR && setActiveChangeRequestID) {\n await deleteCR();\n setActiveChangeRequestID(null);\n }\n }, [deleteCR, setActiveChangeRequestID]);\n\n let latestAcceptedProposal: ReturnType<typeof useLatestAcceptedProposal> | undefined;\n try {\n latestAcceptedProposal = useLatestAcceptedProposal();\n } catch (e) {\n console.error(\"Failed to obtain latest accepted proposal\");\n latestAcceptedProposal = undefined;\n }\n const getNewEmptyCRChangeset:\n undefined | ((idea: string) => Promise<[ObjectChangeset, string]>) =\n useMemo(() => {\n if (stakeholder && canCreateCR(stakeholder) && latestAcceptedProposal !== undefined) {\n return async function getNewEmptyCRChangeset (newIdea: string) {\n const crID = crypto.randomUUID();\n return [newCRObjectChangeset(\n crID,\n newIdea,\n latestAcceptedProposal?.id ?? 'initial',\n stakeholder!.gitServerUsername!,\n ), crID];\n };\n } else {\n return undefined;\n }\n }, [stakeholder, latestAcceptedProposal?.id]);\n\n const getImportedCRChangeset:\n undefined | (() => Promise<[ObjectChangeset, string]>) =\n useMemo(() => {\n if (requestFileFromFilesystem && stakeholder && canImportCR(stakeholder)) {\n return async function getImportedCRChangeset() {\n const data = await requestFileFromFilesystem({\n prompt: \"Select one register proposal JSON file\",\n filters: [\n { name: \"JSON files\", extensions: ['.json'] },\n ],\n });\n const fileData = Object.values(data)[0]!;\n if (!fileData) {\n throw new Error(\"No file was selected\");\n }\n if (isImportableCR(fileData)) {\n try {\n const [changeset, crID] = await importedProposalToCRObjectChangeset(\n fileData,\n itemClasses,\n stakeholder!.gitServerUsername!,\n getObjectData,\n async function resolvePredicates(predicates) {\n const mapReduceChains = [...predicates.values()].map(predicate => ({\n [predicate]: {\n mapFunc: `\n const data = value.data;\n if (!key.startsWith('/proposals/') && data && (${predicate})) {\n emit({ objectPath: key, objectData: value });\n }\n `,\n },\n })).reduce((prev, curr) => ({ ...prev, ...curr }), {});\n\n const result:\n Record<string, { objectPath: string, objectData: any }[] | {}> =\n await getMapReducedData({\n chains: mapReduceChains,\n });\n\n return Object.entries(result).map(([chainLabel, chainResult]) => {\n const objects =\n // Map returns an empty object if there’re no items,\n // but we promise to return a list.\n (Array.isArray(chainResult) ? chainResult : []);\n if (objects.length < 1) {\n throw new Error(`Unable to resolve predicate to item UUID: no item found matching predicate ${chainLabel}`);\n } else if (objects.length > 1) {\n const objectOverview = objects.map((o: any) => JSON.stringify(o)).join(', ')\n throw new Error(`Unable to resolve predicate to item UUID: more than one item matches predicate ${chainLabel}: ${objectOverview}`);\n } else {\n return {\n // There’s just one item anyway, hence `objects[0]`.\n [chainLabel]: itemPathToItemRef(false, objects[0].objectPath),\n };\n }\n }).reduce((prev, curr) => ({ ...prev, ...curr }), {});\n },\n );\n return [changeset, crID];\n } catch (e) {\n console.error(\"Error reading proposal data\", e);\n throw new Error(\"Error reading proposal data\");\n }\n } else {\n throw new Error(\"Invalid proposal format\");\n }\n }\n } else {\n return undefined;\n }\n }, [getMapReducedData, requestFileFromFilesystem, getObjectData, stakeholder]);\n\n const [importCR, createCR] = useMemo(() => {\n if (updateObjects && setActiveChangeRequestID && !isBusy) {\n return [\n getImportedCRChangeset\n ? performOperation('importing proposal', async function () {\n const [objectChangeset, crID] = await getImportedCRChangeset(); \n await updateObjects({\n commitMessage: 'import proposal',\n objectChangeset,\n });\n setActiveChangeRequestID(crID);\n })\n : undefined,\n getNewEmptyCRChangeset\n ? performOperation('creating blank proposal', async function (newIdea: string) {\n const [objectChangeset, crID] = await getNewEmptyCRChangeset(newIdea);\n await updateObjects({\n commitMessage: `start new empty proposal ${newIdea}`,\n objectChangeset,\n });\n setActiveChangeRequestID(crID);\n })\n : undefined,\n ];\n } else {\n return [undefined, undefined];\n }\n }, [isBusy, performOperation, updateObjects, getImportedCRChangeset, getNewEmptyCRChangeset]);\n\n if (!activeCR || !register || !stakeholder) {\n return <NonIdealState\n icon=\"clean\"\n title=\"Not working on any proposal\"\n description={<>\n <p>\n Choose an actionable proposal from the sidebar to the left\n and activate it by double-clicking\n </p>\n {register && stakeholder && canCreateCR(stakeholder) && latestAcceptedProposal !== undefined\n ? <>\n <p>—or—</p>\n <NewProposalMenu\n css={css`height: 200px;`}\n previousVersion={\n latestAcceptedProposal?.timeDisposed\n ? formatDate(\n latestAcceptedProposal.timeDisposed,\n { showTime: true, useUTC: true })\n : null}\n onImport={importCR}\n onCreateBlank={createCR}\n />\n </>\n : null}\n </>}\n />;\n } else {\n return <ProposalTab\n proposal={activeCR}\n register={register}\n stakeholder={stakeholder}\n onDelete={deleteCR ? handleDelete : undefined}\n />;\n }\n});\n\n\nconst ProposalWorkTitle: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { changeRequest: activeCR } = useContext(ChangeRequestContext);\n return <>{activeCR\n ? <strong>Active proposal</strong>\n : <>Proposal dashboard</>}</>;\n};\n\n\nexport default {\n main: ProposalWork,\n title: ProposalWorkTitle,\n} as const;\n"]}
|