@riboseinc/paneron-registry-kit 2.2.2 → 2.2.5
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/package.json +4 -3
- package/types/item.d.ts +1 -0
- package/types/item.js +8 -0
- package/types/item.js.map +1 -1
- package/views/GenericRelatedItemView.js +89 -75
- package/views/GenericRelatedItemView.js.map +1 -1
- package/views/change-request/ChangeRequestContext.js +8 -5
- package/views/change-request/ChangeRequestContext.js.map +1 -1
- package/views/change-request/objectChangeset.d.ts +3 -1
- package/views/change-request/objectChangeset.js +4 -1
- package/views/change-request/objectChangeset.js.map +1 -1
- package/views/detail/ChangeRequest/index.d.ts +0 -1
- package/views/detail/ChangeRequest/index.js +143 -128
- package/views/detail/ChangeRequest/index.js.map +1 -1
- package/views/detail/ChangeRequest/transitions.js +14 -9
- package/views/detail/ChangeRequest/transitions.js.map +1 -1
- package/views/detail/RegisterHome/index.js +1 -1
- package/views/detail/RegisterHome/index.js.map +1 -1
- package/views/detail/RegisterItem/index.js +34 -48
- package/views/detail/RegisterItem/index.js.map +1 -1
- package/views/hooks/useItemClassConfig.d.ts +1 -2
- package/views/hooks/useItemClassConfig.js +1 -7
- package/views/hooks/useItemClassConfig.js.map +1 -1
- package/views/hooks/useSingleRegisterItemData.d.ts +1 -1
- package/views/hooks/useSingleRegisterItemData.js +4 -3
- package/views/hooks/useSingleRegisterItemData.js.map +1 -1
- package/views/index.js +34 -24
- package/views/index.js.map +1 -1
- package/views/itemPathUtils.d.ts +3 -8
- package/views/itemPathUtils.js +26 -1
- package/views/itemPathUtils.js.map +1 -1
- package/views/protocolRegistry.d.ts +1 -1
- package/views/protocolRegistry.js.map +1 -1
- package/views/sidebar/Browse/index.js +43 -35
- package/views/sidebar/Browse/index.js.map +1 -1
- package/views/sidebar/Registration/index.js +12 -11
- package/views/sidebar/Registration/index.js.map +1 -1
- package/views/sidebar/Search/index.js +48 -43
- package/views/sidebar/Search/index.js.map +1 -1
- package/views/util.d.ts +1 -0
- package/views/util.js +3 -1
- package/views/util.js.map +1 -1
|
@@ -48,33 +48,52 @@ const View = function ({
|
|
|
48
48
|
uri
|
|
49
49
|
}) {
|
|
50
50
|
const crID = (0, _itemPathUtils.crPathToCRID)(uri);
|
|
51
|
+
return (0, _react2.jsx)(_ChangeRequestContext.ChangeRequestContextProvider, {
|
|
52
|
+
changeRequestID: crID
|
|
53
|
+
}, (0, _react2.jsx)(MaybeChangeRequest, {
|
|
54
|
+
uri: uri
|
|
55
|
+
}));
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const MaybeChangeRequest = function ({
|
|
59
|
+
uri
|
|
60
|
+
}) {
|
|
51
61
|
const {
|
|
52
62
|
closeTabWithURI
|
|
53
63
|
} = (0, _react.useContext)(_context2.TabbedWorkspaceContext);
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
64
|
+
const {
|
|
65
|
+
changeRequest: cr,
|
|
66
|
+
canEdit
|
|
67
|
+
} = (0, _react.useContext)(_ChangeRequestContext.ChangeRequestContext);
|
|
68
|
+
const handleAfterDelete = (0, _react.useCallback)(() => closeTabWithURI(`${_protocolRegistry.Protocols.CHANGE_REQUEST}:${uri}`), [closeTabWithURI]);
|
|
69
|
+
return cr ? (0, _react2.jsx)(ChangeRequestDetails, {
|
|
70
|
+
cr: cr,
|
|
71
|
+
canEdit: canEdit,
|
|
57
72
|
css: (0, _react2.css)`
|
|
58
73
|
position: absolute;
|
|
59
74
|
inset: 0;
|
|
60
75
|
overflow-y: auto;
|
|
61
76
|
`,
|
|
62
|
-
afterDelete:
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
77
|
+
afterDelete: handleAfterDelete
|
|
78
|
+
}) : (0, _react2.jsx)(_core.NonIdealState, {
|
|
79
|
+
icon: (0, _react2.jsx)(_core.Spinner, null),
|
|
80
|
+
css: (0, _react2.css)`
|
|
81
|
+
position: absolute;
|
|
82
|
+
inset: 0;
|
|
83
|
+
overflow-y: auto;
|
|
84
|
+
`,
|
|
85
|
+
description: "Unable to load proposal"
|
|
86
|
+
});
|
|
66
87
|
};
|
|
67
88
|
|
|
68
89
|
const ChangeRequestDetails = function ({
|
|
90
|
+
cr,
|
|
91
|
+
canEdit,
|
|
69
92
|
afterDelete,
|
|
70
93
|
className
|
|
71
94
|
}) {
|
|
72
|
-
var _a, _b, _c, _d, _e, _f
|
|
95
|
+
var _a, _b, _c, _d, _e, _f;
|
|
73
96
|
|
|
74
|
-
const {
|
|
75
|
-
changeRequest: cr,
|
|
76
|
-
canEdit
|
|
77
|
-
} = (0, _react.useContext)(_ChangeRequestContext.ChangeRequestContext);
|
|
78
97
|
const {
|
|
79
98
|
performOperation,
|
|
80
99
|
updateTree
|
|
@@ -85,123 +104,120 @@ const ChangeRequestDetails = function ({
|
|
|
85
104
|
activeChangeRequestID,
|
|
86
105
|
setActiveChangeRequestID
|
|
87
106
|
} = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
|
|
88
|
-
const helmet = (0,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
+
const helmet = (0, _react.useMemo)(() => {
|
|
108
|
+
var _a;
|
|
109
|
+
|
|
110
|
+
return (0, _react2.jsx)(_util.RegisterHelmet, null, (0, _react2.jsx)("title", null, "Viewing proposal: ", (_a = cr === null || cr === void 0 ? void 0 : cr.justification) !== null && _a !== void 0 ? _a : "N/A"));
|
|
111
|
+
}, [cr === null || cr === void 0 ? void 0 : cr.justification]);
|
|
112
|
+
const isActive = activeChangeRequestID === cr.id;
|
|
113
|
+
const anotherIsActive = activeChangeRequestID && activeChangeRequestID !== cr.id;
|
|
114
|
+
const canTransition = stakeholder && (0, _transitions.getTransitions)(cr, stakeholder).length > 0;
|
|
115
|
+
const crStakeholder = ((_a = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.stakeholders) !== null && _a !== void 0 ? _a : []).find(s => s.gitServerUsername === cr.submittingStakeholderGitServerUsername);
|
|
116
|
+
const authorIsCurrentUser = (stakeholder === null || stakeholder === void 0 ? void 0 : stakeholder.gitServerUsername) && cr.submittingStakeholderGitServerUsername === stakeholder.gitServerUsername;
|
|
117
|
+
|
|
118
|
+
async function handleDelete() {
|
|
119
|
+
if (authorIsCurrentUser && cr && updateTree && !isActive && Object.keys(cr.items).length < 1) {
|
|
120
|
+
const subtreeRoot = (0, _itemPathUtils.crIDToCRPath)(cr.id).replace('/main.yaml', '');
|
|
121
|
+
await updateTree({
|
|
122
|
+
subtreeRoot,
|
|
123
|
+
newSubtreeRoot: null,
|
|
124
|
+
commitMessage: 'remove CR draft'
|
|
125
|
+
});
|
|
126
|
+
afterDelete === null || afterDelete === void 0 ? void 0 : afterDelete();
|
|
107
127
|
}
|
|
128
|
+
}
|
|
108
129
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
flex: 100%;
|
|
138
|
-
background: ${_core.Colors.LIGHT_GRAY3};
|
|
139
|
-
padding: 11px;
|
|
130
|
+
const crItemEntries = Object.entries(cr.items);
|
|
131
|
+
const proposals = (0, _react.useMemo)(() => crItemEntries.length > 0 ? (0, _react2.jsx)(_Proposals.default, {
|
|
132
|
+
proposals: cr.items,
|
|
133
|
+
css: (0, _react2.css)`flex: 1;`
|
|
134
|
+
}) : (0, _react2.jsx)(_core.NonIdealState, {
|
|
135
|
+
icon: "clean",
|
|
136
|
+
title: "Nothing is proposed here yet.",
|
|
137
|
+
description: authorIsCurrentUser && updateTree && !cr.timeProposed && !isActive ? (0, _react2.jsx)(_core.Button, {
|
|
138
|
+
onClick: performOperation('deleting proposal', handleDelete)
|
|
139
|
+
}, "Delete this CR draft") : undefined
|
|
140
|
+
}), [crItemEntries.length, crItemEntries.map(i => JSON.stringify(i)).toString(), performOperation, handleDelete, updateTree, authorIsCurrentUser, isActive]);
|
|
141
|
+
return (0, _react2.jsx)(_util.TabContentsWithActions, {
|
|
142
|
+
className: className,
|
|
143
|
+
actions: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.FormGroup, {
|
|
144
|
+
inline: true,
|
|
145
|
+
labelInfo: (0, _react2.jsx)(_HelpTooltip.default, {
|
|
146
|
+
icon: 'info-sign',
|
|
147
|
+
content: (0, _react2.jsx)(_core.UL, null, (0, _react2.jsx)("li", null, "Proposal ID: ", cr.id))
|
|
148
|
+
}),
|
|
149
|
+
label: (0, _react2.jsx)("strong", null, "Proposal"),
|
|
150
|
+
css: (0, _react2.css)`margin: 0; .bp4-form-content { display: flex; flex-flow: row wrap; gap: 10px; }`
|
|
151
|
+
}, (0, _react2.jsx)(CRActivation, {
|
|
152
|
+
isActive: isActive,
|
|
153
|
+
htmlTitle: anotherIsActive ? "You are in another proposal so you can’t enter this one. " : canEdit && !isActive ? "Enter proposal to preview or add to proposed changes. " : !isActive ? "Enter proposal to preview the register as proposed." : "You’re previewing the register with this proposal applied.",
|
|
154
|
+
onChangeActiveStatus: !anotherIsActive && setActiveChangeRequestID ? active => active ? setActiveChangeRequestID === null || setActiveChangeRequestID === void 0 ? void 0 : setActiveChangeRequestID(cr.id) : setActiveChangeRequestID === null || setActiveChangeRequestID === void 0 ? void 0 : setActiveChangeRequestID(null) : undefined
|
|
155
|
+
}))),
|
|
156
|
+
main: (0, _react2.jsx)("div", {
|
|
157
|
+
css: (0, _react2.css)`
|
|
140
158
|
display: flex;
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
});
|
|
204
|
-
}
|
|
159
|
+
flex-flow: row wrap;
|
|
160
|
+
padding: 10px;
|
|
161
|
+
gap: 10px;
|
|
162
|
+
align-content: flex-start;
|
|
163
|
+
align-items: flex-start;
|
|
164
|
+
`,
|
|
165
|
+
className: className
|
|
166
|
+
}, helmet, (0, _react2.jsx)(_core.Card, {
|
|
167
|
+
elevation: 0,
|
|
168
|
+
css: (0, _react2.css)`
|
|
169
|
+
flex: 100%;
|
|
170
|
+
background: ${_core.Colors.LIGHT_GRAY3};
|
|
171
|
+
padding: 11px;
|
|
172
|
+
display: flex;
|
|
173
|
+
min-height: 70vh;
|
|
174
|
+
`
|
|
175
|
+
}, proposals), (0, _react2.jsx)(_core.Card, {
|
|
176
|
+
elevation: 1,
|
|
177
|
+
css: (0, _react2.css)`flex: 30%; padding: 11px;`
|
|
178
|
+
}, crStakeholder ? (0, _react2.jsx)("div", null, "Author: ", (0, _react2.jsx)(_RegisterStakeholder.RegisterStakeholderListItem, {
|
|
179
|
+
stakeholder: crStakeholder,
|
|
180
|
+
isCurrentUser: authorIsCurrentUser || undefined
|
|
181
|
+
})) : null, (0, _react2.jsx)(_core.Divider, null), (0, _react2.jsx)("div", null, "Register\u00A0version before\u00A0proposal: ", (0, _react2.jsx)("strong", null, (_b = cr.registerVersion) !== null && _b !== void 0 ? _b : 'N/A'), "\u2002", cr.registerVersion === ((_c = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.version) === null || _c === void 0 ? void 0 : _c.id) ? (0, _react2.jsx)(_core.Tag, {
|
|
182
|
+
css: (0, _react2.css)`display: inline;`,
|
|
183
|
+
intent: 'success',
|
|
184
|
+
minimal: true,
|
|
185
|
+
round: true
|
|
186
|
+
}, "current", " ", (0, _react2.jsx)(_HelpTooltip.default, {
|
|
187
|
+
intent: 'success',
|
|
188
|
+
content: (0, _react2.jsx)(_react.default.Fragment, null, "Published version of the register", " ", "had not changed since this proposal started.")
|
|
189
|
+
})) : (0, _react2.jsx)(_core.Tag, {
|
|
190
|
+
css: (0, _react2.css)`display: inline;`,
|
|
191
|
+
intent: 'warning',
|
|
192
|
+
minimal: true,
|
|
193
|
+
round: true
|
|
194
|
+
}, "not current", " ", (0, _react2.jsx)(_HelpTooltip.default, {
|
|
195
|
+
intent: 'warning',
|
|
196
|
+
icon: 'warning-sign',
|
|
197
|
+
content: (0, _react2.jsx)(_react.default.Fragment, null, "Register is currently at version ", (0, _react2.jsx)("strong", null, (_e = (_d = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.version) === null || _d === void 0 ? void 0 : _d.id) !== null && _e !== void 0 ? _e : 'N/A'), ",", " ", "which is different from version proposal author may have had in mind.", " ", "It is recommended that proposed changes are reviewed to avoid unintentionally", " ", "undoing a prior change.")
|
|
198
|
+
}))), (0, _react2.jsx)(_core.Divider, null), (0, _react2.jsx)("div", null, "Edited: ", (0, _react2.jsx)(_util.Datestamp, {
|
|
199
|
+
date: cr.timeEdited
|
|
200
|
+
})), (0, _react2.jsx)(_core.Divider, null), (0, _react2.jsx)("div", null, "Proposed: ", (0, _cr.hadBeenProposed)(cr) ? (0, _react2.jsx)(_util.Datestamp, {
|
|
201
|
+
date: cr.timeProposed
|
|
202
|
+
}) : 'not yet'), (0, _react2.jsx)(_core.Divider, null), (0, _react2.jsx)("div", null, "Disposed: ", (0, _cr.isDisposed)(cr) ? (0, _react2.jsx)(_util.Datestamp, {
|
|
203
|
+
date: cr.timeDisposed
|
|
204
|
+
}) : 'not yet'), (0, _react2.jsx)(_core.Divider, null), (0, _react2.jsx)(_core.H5, null, ((_f = cr.state) === null || _f === void 0 ? void 0 : _f.replaceAll('-', ' ')) || 'N/A')), (0, _react2.jsx)(_core.Card, {
|
|
205
|
+
elevation: 1,
|
|
206
|
+
css: (0, _react2.css)`flex: 30%; padding: 11px;`
|
|
207
|
+
}, (0, _transitions.getPastTransitions)(cr).map(([key, el], idx) => (0, _react2.jsx)(_react.default.Fragment, {
|
|
208
|
+
key: key
|
|
209
|
+
}, idx !== 0 ? (0, _react2.jsx)(_core.Divider, null) : null, (0, _react2.jsx)(_core.FormGroup, {
|
|
210
|
+
label: `${key}:`
|
|
211
|
+
}, (0, _react2.jsx)("div", {
|
|
212
|
+
css: (0, _react2.css)`white-space: pre-wrap;`,
|
|
213
|
+
className: _core.Classes.RUNNING_TEXT
|
|
214
|
+
}, el))))), canTransition ? (0, _react2.jsx)(_core.Card, {
|
|
215
|
+
elevation: 3,
|
|
216
|
+
css: (0, _react2.css)`flex: 30%; padding: 11px;`
|
|
217
|
+
}, (0, _react2.jsx)(_transitions.TransitionOptions, {
|
|
218
|
+
cr: cr
|
|
219
|
+
})) : null)
|
|
220
|
+
});
|
|
205
221
|
};
|
|
206
222
|
|
|
207
223
|
const CRActivation = function ({
|
|
@@ -241,7 +257,6 @@ const CRTitle = function ({
|
|
|
241
257
|
|
|
242
258
|
var _default = {
|
|
243
259
|
main: View,
|
|
244
|
-
title: CRTitle
|
|
245
|
-
plainTitle: async uri => `proposal ${uri}`
|
|
260
|
+
title: CRTitle
|
|
246
261
|
};
|
|
247
262
|
exports.default = _default;
|
|
@@ -1 +1 @@
|
|
|
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,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,MAAM,EACN,IAAI,EACJ,SAAS,EACT,MAAM,EACN,aAAa,EACb,OAAO,EACP,EAAE,EACF,EAAE,EACF,GAAG,EACH,OAAO,EACP,OAAO,GACR,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,WAAW,MAAM,sDAAsD,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,2CAA2C,CAAC;AACnD,OAAO,SAAS,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAY,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,sBAAsB,EACtB,cAAc,IAAI,MAAM,EACxB,oBAAoB,EACpB,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGtF,MAAM,IAAI,GAA8B,UAAU,EAAE,GAAG,EAAE;IACvD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,EAAE,eAAe,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAE/D,OAAO,CACL,IAAC,4BAA4B,IAAC,eAAe,EAAE,IAAI;QACjD,IAAC,oBAAoB,IACnB,GAAG,EAAE,GAAG,CAAA;;;;SAIP,EACD,WAAW,EAAE,GAAG,EAAE;gBAChB,eAAe,CAAC,GAAG,SAAS,CAAC,cAAc,IAAI,GAAG,EAAE,CAAC,CAAC;YACxD,CAAC,GACD,CAC2B,CAChC,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,oBAAoB,GAE1B,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE;;IAClC,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACxE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACpE,MAAM,EACJ,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,wBAAwB,GACzB,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAE3B,MAAM,MAAM,GACV,IAAC,MAAM;QACL;kCAA0B,MAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,aAAa,mCAAI,KAAK,CAAS,CACtD,CAAC;IAEZ,IAAI,EAAE,EAAE;QACN,MAAM,QAAQ,GAAG,qBAAqB,KAAK,EAAE,CAAC,EAAE,CAAC;QACjD,MAAM,eAAe,GAAG,qBAAqB,IAAI,qBAAqB,KAAK,EAAE,CAAC,EAAE,CAAC;QACjF,MAAM,aAAa,GAAG,WAAW,IAAI,cAAc,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAEhF,MAAM,aAAa,GAAG,CAAC,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,YAAY,mCAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,KAAK,EAAE,CAAC,sCAAsC,CAAC,CAAC;QAE/E,MAAM,mBAAmB,GAAG,CAC1B,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,iBAAiB;YAC9B,EAAE,CAAC,sCAAsC,KAAK,WAAW,CAAC,iBAAiB,CAAC,CAAC;QAE/E,KAAK,UAAU,YAAY;YACzB,IAAI,mBAAmB,IAAI,EAAE,IAAI,UAAU,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC5F,MAAM,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBAClE,MAAM,UAAU,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBAC1F,WAAW,aAAX,WAAW,uBAAX,WAAW,EAAI,CAAC;aACjB;QACH,CAAC;QAED,OAAO,CACL,IAAC,sBAAsB,IACrB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE;gBACP,IAAC,SAAS,IACN,MAAM,QACN,SAAS,EAAE,IAAC,WAAW,IACrB,IAAI,EAAC,WAAW,EAChB,OAAO,EAAE,IAAC,EAAE;4BAAC;;gCAAkB,EAAE,CAAC,EAAE,CAAM,CAAK,GAC/C,EACF,KAAK,EAAE,+BAAyB,EAChC,GAAG,EAAE,GAAG,CAAA,iFAAiF;oBAC3F,IAAC,YAAY,IACX,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,eAAe;4BAC1B,CAAC,CAAC,2DAA2D;4BAC7D,CAAC,CAAC,OAAO,IAAI,CAAC,QAAQ;gCACpB,CAAC,CAAC,wDAAwD;gCAC1D,CAAC,CAAC,CAAC,QAAQ;oCACT,CAAC,CAAC,qDAAqD;oCACvD,CAAC,CAAC,4DAA4D,EAClE,oBAAoB,EAAE,CAAC,eAAe,IAAI,wBAAwB;4BAChE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM;gCACjB,CAAC,CAAC,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAG,EAAE,CAAC,EAAE,CAAC;gCACnC,CAAC,CAAC,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAG,IAAI,CAAC,CACnC;4BACH,CAAC,CAAC,SAAS,GACb,CACQ,CACX,EACH,IAAI,EACF,aACI,GAAG,EAAE,GAAG,CAAA;;;;;;;eAOP,EACD,SAAS,EAAE,SAAS;gBACrB,MAAM;gBAEP,IAAC,IAAI,IAAC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAA;;4BAEZ,MAAM,CAAC,WAAW;;;;aAIjC,IACE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;oBAC/B,CAAC,CAAC,IAAC,SAAS,IAAC,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAA,UAAU,GAAI;oBACxD,CAAC,CAAC,IAAC,aAAa,IACZ,IAAI,EAAC,OAAO,EACZ,KAAK,EAAC,+BAA+B,EACrC,WAAW,EAAE,mBAAmB,IAAI,UAAU,IAAI,CAAE,EAAe,CAAC,YAAY,IAAI,CAAC,QAAQ;4BAC3F,CAAC,CAAC,IAAC,MAAM,IAAC,OAAO,EAAE,gBAAgB,CAAC,mBAAmB,EAAE,YAAY,CAAC,2BAE3D;4BACX,CAAC,CAAC,SAAS,GACb,CACD;gBAEP,IAAC,IAAI,IAAC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAA,2BAA2B;oBAEpD,aAAa;wBACZ,CAAC,CAAC;;4BACU,IAAC,2BAA2B,IAClC,WAAW,EAAE,aAAa,EAC1B,aAAa,EAAE,mBAAmB,IAAI,SAAS,GAC/C,CACE;wBACR,CAAC,CAAC,IAAI;oBAER,IAAC,OAAO,OAAG;oBACX;;wBAC8C,oBAAS,MAAA,EAAE,CAAC,eAAe,mCAAI,KAAK,CAAU;;wBAEzF,EAAE,CAAC,eAAe,MAAK,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,OAAO,0CAAE,EAAE,CAAA;4BACnD,CAAC,CAAC,IAAC,GAAG,IAAC,GAAG,EAAE,GAAG,CAAA,kBAAkB,EAAE,MAAM,EAAC,SAAS,EAAC,OAAO,QAAC,KAAK;;gCAE5D,GAAG;gCACJ,IAAC,WAAW,IAAC,MAAM,EAAC,SAAS,EAAC,OAAO,EAAE;;wCAEpC,GAAG;uFAEH,GAAI,CACH;4BACR,CAAC,CAAC,IAAC,GAAG,IAAC,GAAG,EAAE,GAAG,CAAA,kBAAkB,EAAE,MAAM,EAAC,SAAS,EAAC,OAAO,QAAC,KAAK;;gCAE5D,GAAG;gCACJ,IAAC,WAAW,IAAC,MAAM,EAAC,SAAS,EAAC,IAAI,EAAC,cAAc,EAAC,OAAO,EAAE;;wCACxB,oBAAS,MAAA,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,OAAO,0CAAE,EAAE,mCAAI,KAAK,CAAU;;wCACzF,GAAG;;wCAEH,GAAG;;wCAEH,GAAG;kEAEH,GAAI,CACH,CACN;oBACN,IAAC,OAAO,OAAG;oBACX;;wBAAa,IAAC,SAAS,IAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAI,CAAM;oBACrD,IAAC,OAAO,OAAG;oBACX;;wBAAgB,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAC,SAAS,IAAC,IAAI,EAAE,EAAE,CAAC,YAAY,GAAI,CAAC,CAAC,CAAC,SAAS,CAAO;oBAC7F,IAAC,OAAO,OAAG;oBACX;;wBAAgB,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAC,SAAS,IAAC,IAAI,EAAE,EAAE,CAAC,YAAY,GAAI,CAAC,CAAC,CAAC,SAAS,CAAO;oBACxF,IAAC,OAAO,OAAG;oBAEX,IAAC,EAAE,QACA,CAAA,MAAA,EAAE,CAAC,KAAK,0CAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,KAAI,KAAK,CACrC,CACA;gBAEP,IAAC,IAAI,IAAC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAA,2BAA2B,IACpD,kBAAkB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAC7C,IAAC,KAAK,CAAC,QAAQ,IAAC,GAAG,EAAE,GAAG;oBACrB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAC,OAAO,OAAG,CAAC,CAAC,CAAC,IAAI;oBAC/B,IAAC,SAAS,IAAC,KAAK,EAAE,GAAG,GAAG,GAAG;wBACzB,aACI,GAAG,EAAE,GAAG,CAAA,wBAAwB,EAChC,SAAS,EAAE,OAAO,CAAC,YAAY,IAChC,EAAE,CACC,CACI,CACG,CAClB,CACI;gBAEN,aAAa;oBACZ,CAAC,CAAC,IAAC,IAAI,IAAC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAA,2BAA2B;wBACrD,IAAC,iBAAiB,IAAC,EAAE,EAAE,EAAE,GAAI,CACxB;oBACT,CAAC,CAAC,IAAI,CACJ,GACR,CACH,CAAC;KACH;SAAM;QACL,OAAO,IAAC,aAAa,IACnB,IAAI,EAAE,IAAC,OAAO,OAAG,EACjB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,MAAM,GACnB,CAAC;KACJ;AACH,CAAC,CAAC;AAGF,MAAM,YAAY,GAQb,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE;;IAClE,OAAO,oBAAoB,IAAI,QAAQ;QACrC,CAAC,CAAC,IAAC,MAAM,IACH,KAAK,EAAE,SAAS,EAChB,MAAM,EAAC,SAAS,EAChB,QAAQ,EAAE,CAAC,oBAAoB,EAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAG,KAAK,CAAC,IAC7C,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,mCAAI,eAAe,CAC/B;QACX,CAAC,CAAC,IAAC,MAAM,IACH,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACpD,QAAQ,EAAE,CAAC,oBAAoB,EAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAG,IAAI,CAAC,IAC5C,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,mCAAI,uBAAuB,CACrC,CAAC;AAChB,CAAC,CAAC;AAGF,MAAM,OAAO,GAA8B,UAAU,EAAE,GAAG,EAAE;;IAC1D,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,CAAA;AAED,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE,CAAC,YAAY,GAAG,EAAE,EAAE,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n Button,\n Card,\n FormGroup,\n Colors,\n NonIdealState,\n Spinner,\n H5,\n UL,\n Tag,\n Divider,\n Classes,\n} from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport { crPathToCRID, crIDToCRPath } from '../../itemPathUtils';\nimport {\n ChangeRequestContextProvider,\n ChangeRequestContext,\n} from '../../change-request/ChangeRequestContext';\nimport Proposals from '../../change-request/Proposals';\nimport { Proposed, hadBeenProposed, isDisposed } from '../../../types/cr';\nimport { RegisterStakeholderListItem } from '../../RegisterStakeholder';\nimport { Protocols } from '../../protocolRegistry';\nimport {\n TabContentsWithActions,\n RegisterHelmet as Helmet,\n maybeEllipsizeString,\n Datestamp,\n} from '../../util';\nimport { TransitionOptions, getPastTransitions, getTransitions } from './transitions';\n\n\nconst View: React.FC<{ uri: string }> = function ({ uri }) {\n const crID = crPathToCRID(uri);\n const { closeTabWithURI } = useContext(TabbedWorkspaceContext);\n\n return (\n <ChangeRequestContextProvider changeRequestID={crID}>\n <ChangeRequestDetails\n css={css`\n position: absolute;\n inset: 0;\n overflow-y: auto;\n `}\n afterDelete={() => {\n closeTabWithURI(`${Protocols.CHANGE_REQUEST}:${uri}`);\n }}\n />\n </ChangeRequestContextProvider>\n );\n};\n\n\nconst ChangeRequestDetails:\nReact.VoidFunctionComponent<{ afterDelete?: () => void, className?: string }> =\nfunction ({ afterDelete, className }) {\n const { changeRequest: cr, canEdit } = useContext(ChangeRequestContext);\n const { performOperation, updateTree } = useContext(DatasetContext);\n const {\n registerMetadata,\n stakeholder,\n activeChangeRequestID,\n setActiveChangeRequestID,\n } = useContext(BrowserCtx);\n\n const helmet = \n <Helmet>\n <title>Viewing proposal: {cr?.justification ?? \"N/A\"}</title>\n </Helmet>;\n\n if (cr) {\n const isActive = activeChangeRequestID === cr.id;\n const anotherIsActive = activeChangeRequestID && activeChangeRequestID !== cr.id;\n const canTransition = stakeholder && getTransitions(cr, stakeholder).length > 0;\n\n const crStakeholder = (registerMetadata?.stakeholders ?? []).\n find(s => s.gitServerUsername === cr.submittingStakeholderGitServerUsername);\n\n const authorIsCurrentUser = (\n stakeholder?.gitServerUsername &&\n cr.submittingStakeholderGitServerUsername === stakeholder.gitServerUsername);\n\n async function handleDelete() {\n if (authorIsCurrentUser && cr && updateTree && !isActive && Object.keys(cr.items).length < 1) {\n const subtreeRoot = crIDToCRPath(cr.id).replace('/main.yaml', '');\n await updateTree({ subtreeRoot, newSubtreeRoot: null, commitMessage: 'remove CR draft' });\n afterDelete?.();\n }\n }\n\n return (\n <TabContentsWithActions\n className={className}\n actions={<>\n <FormGroup\n inline\n labelInfo={<HelpTooltip\n icon='info-sign'\n content={<UL><li>Proposal ID: {cr.id}</li></UL>}\n />}\n label={<strong>Proposal</strong>}\n css={css`margin: 0; .bp4-form-content { display: flex; flex-flow: row wrap; gap: 10px; }`}>\n <CRActivation\n isActive={isActive}\n 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 onChangeActiveStatus={!anotherIsActive && setActiveChangeRequestID\n ? ((active) => active\n ? setActiveChangeRequestID?.(cr.id)\n : setActiveChangeRequestID?.(null)\n )\n : undefined}\n />\n </FormGroup>\n </>}\n main={\n <div\n css={css`\n display: flex;\n flex-flow: row wrap;\n padding: 10px;\n gap: 10px;\n align-content: flex-start;\n align-items: flex-start;\n `}\n className={className}>\n {helmet}\n\n <Card elevation={0} css={css`\n flex: 100%;\n background: ${Colors.LIGHT_GRAY3};\n padding: 11px;\n display: flex;\n min-height: 70vh;\n `}>\n {Object.keys(cr.items).length > 0\n ? <Proposals proposals={cr.items} css={css`flex: 1;`} />\n : <NonIdealState\n icon=\"clean\"\n title=\"Nothing is proposed here yet.\"\n description={authorIsCurrentUser && updateTree && !(cr as Proposed).timeProposed && !isActive\n ? <Button onClick={performOperation('deleting proposal', handleDelete)}>\n Delete this CR draft\n </Button>\n : undefined}\n />}\n </Card>\n\n <Card elevation={1} css={css`flex: 30%; padding: 11px;`}>\n\n {crStakeholder\n ? <div>\n Author: <RegisterStakeholderListItem\n stakeholder={crStakeholder}\n isCurrentUser={authorIsCurrentUser || undefined}\n />\n </div>\n : null}\n\n <Divider />\n <div>\n Register version before proposal: <strong>{cr.registerVersion ?? 'N/A'}</strong>\n  \n {cr.registerVersion === registerMetadata?.version?.id\n ? <Tag css={css`display: inline;`} intent='success' minimal round>\n current\n {\" \"}\n <HelpTooltip intent='success' content={<>\n Published version of the register\n {\" \"}\n had not changed since this proposal started.\n </>} />\n </Tag>\n : <Tag css={css`display: inline;`} intent='warning' minimal round>\n not current\n {\" \"}\n <HelpTooltip intent='warning' icon='warning-sign' content={<>\n Register is currently at version <strong>{registerMetadata?.version?.id ?? 'N/A'}</strong>,\n {\" \"}\n which is different from version proposal author may have had in mind.\n {\" \"}\n It is recommended that proposed changes are reviewed to avoid unintentionally\n {\" \"}\n undoing a prior change.\n </>} />\n </Tag>}\n </div>\n <Divider />\n <div>Edited: <Datestamp date={cr.timeEdited} /></div>\n <Divider />\n <div>Proposed: {hadBeenProposed(cr) ? <Datestamp date={cr.timeProposed} /> : 'not yet'}</div>\n <Divider />\n <div>Disposed: {isDisposed(cr) ? <Datestamp date={cr.timeDisposed} /> : 'not yet'}</div>\n <Divider />\n\n <H5>\n {cr.state?.replaceAll('-', ' ') || 'N/A'}\n </H5>\n </Card>\n\n <Card elevation={1} css={css`flex: 30%; padding: 11px;`}>\n {getPastTransitions(cr).map(([key, el], idx) =>\n <React.Fragment key={key}>\n {idx !== 0 ? <Divider /> : null}\n <FormGroup label={`${key}:`}>\n <div\n css={css`white-space: pre-wrap;`}\n className={Classes.RUNNING_TEXT}>\n {el}\n </div>\n </FormGroup>\n </React.Fragment>\n )}\n </Card>\n\n {canTransition\n ? <Card elevation={3} css={css`flex: 30%; padding: 11px;`}>\n <TransitionOptions cr={cr} />\n </Card>\n : null}\n </div>}\n />\n );\n } else {\n return <NonIdealState\n icon={<Spinner />}\n className={className}\n description={helmet}\n />;\n }\n};\n\n\nconst CRActivation: React.FC<{\n isActive: boolean;\n htmlTitle?: string;\n\n /** Labels for the “activate” and “deactivate” buttons. */\n labels?: { activate?: string, deactivate?: string };\n\n onChangeActiveStatus?: (newStatus: boolean) => void;\n}> = function ({ isActive, htmlTitle, labels, onChangeActiveStatus }) {\n return onChangeActiveStatus && isActive\n ? <Button\n title={htmlTitle}\n intent=\"warning\"\n disabled={!onChangeActiveStatus}\n onClick={() => onChangeActiveStatus?.(false)}>\n {labels?.deactivate ?? \"Exit proposal\"}\n </Button>\n : <Button\n title={htmlTitle}\n intent={onChangeActiveStatus ? 'primary' : undefined}\n disabled={!onChangeActiveStatus}\n onClick={() => onChangeActiveStatus?.(true)}>\n {labels?.activate ?? \"Work on this proposal\"}\n </Button>;\n};\n\n\nconst CRTitle: React.FC<{ uri: string }> = 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, plainTitle: async (uri: string) => `proposal ${uri}` };\n"]}
|
|
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, { useContext, useMemo, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n Button,\n Card,\n FormGroup,\n Colors,\n NonIdealState,\n Spinner,\n H5,\n UL,\n Tag,\n Divider,\n Classes,\n} from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport { crPathToCRID, crIDToCRPath } from '../../itemPathUtils';\nimport {\n ChangeRequestContextProvider,\n ChangeRequestContext,\n} from '../../change-request/ChangeRequestContext';\nimport Proposals from '../../change-request/Proposals';\nimport { type SomeCR, type Proposed, hadBeenProposed, isDisposed } from '../../../types/cr';\nimport { RegisterStakeholderListItem } from '../../RegisterStakeholder';\nimport { Protocols } from '../../protocolRegistry';\nimport {\n TabContentsWithActions,\n RegisterHelmet as Helmet,\n maybeEllipsizeString,\n Datestamp,\n} from '../../util';\nimport { TransitionOptions, getPastTransitions, getTransitions } from './transitions';\n\n\nconst View: React.FC<{ uri: string }> = 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<{\n uri: string\n}> = function ({ uri }) {\n const { closeTabWithURI } = useContext(TabbedWorkspaceContext);\n const { changeRequest: cr, canEdit } = useContext(ChangeRequestContext);\n const handleAfterDelete = useCallback(\n (() => closeTabWithURI(`${Protocols.CHANGE_REQUEST}:${uri}`)),\n [closeTabWithURI]);\n\n return (cr\n ? <ChangeRequestDetails\n cr={cr}\n canEdit={canEdit}\n css={css`\n position: absolute;\n inset: 0;\n overflow-y: auto;\n `}\n afterDelete={handleAfterDelete}\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 canEdit: boolean,\n afterDelete?: () => void,\n className?: string,\n}> = function ({ cr, canEdit, afterDelete, className }) {\n const { performOperation, updateTree } = useContext(DatasetContext);\n const {\n registerMetadata,\n stakeholder,\n activeChangeRequestID,\n setActiveChangeRequestID,\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 const canTransition = stakeholder && getTransitions(cr, stakeholder).length > 0;\n\n const crStakeholder = (registerMetadata?.stakeholders ?? []).\n find(s => s.gitServerUsername === cr.submittingStakeholderGitServerUsername);\n\n const authorIsCurrentUser = (\n stakeholder?.gitServerUsername &&\n cr.submittingStakeholderGitServerUsername === stakeholder.gitServerUsername);\n\n async function handleDelete() {\n if (authorIsCurrentUser && cr && updateTree && !isActive && Object.keys(cr.items).length < 1) {\n const subtreeRoot = crIDToCRPath(cr.id).replace('/main.yaml', '');\n await updateTree({ subtreeRoot, newSubtreeRoot: null, commitMessage: 'remove CR draft' });\n afterDelete?.();\n }\n }\n\n const crItemEntries = Object.entries(cr.items);\n const proposals = useMemo((() =>\n crItemEntries.length > 0\n ? <Proposals proposals={cr.items} css={css`flex: 1;`} />\n : <NonIdealState\n icon=\"clean\"\n title=\"Nothing is proposed here yet.\"\n description={authorIsCurrentUser && updateTree && !(cr as Proposed).timeProposed && !isActive\n ? <Button onClick={performOperation('deleting proposal', handleDelete)}>\n Delete this CR draft\n </Button>\n : undefined}\n />\n ), [\n crItemEntries.length,\n crItemEntries.map(i => JSON.stringify(i)).toString(),\n performOperation,\n handleDelete,\n updateTree,\n authorIsCurrentUser,\n isActive,\n ]);\n\n return (\n <TabContentsWithActions\n className={className}\n actions={<>\n <FormGroup\n inline\n labelInfo={<HelpTooltip\n icon='info-sign'\n content={<UL><li>Proposal ID: {cr.id}</li></UL>}\n />}\n label={<strong>Proposal</strong>}\n css={css`margin: 0; .bp4-form-content { display: flex; flex-flow: row wrap; gap: 10px; }`}>\n <CRActivation\n isActive={isActive}\n 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 onChangeActiveStatus={!anotherIsActive && setActiveChangeRequestID\n ? ((active) => active\n ? setActiveChangeRequestID?.(cr.id)\n : setActiveChangeRequestID?.(null)\n )\n : undefined}\n />\n </FormGroup>\n </>}\n main={\n <div\n css={css`\n display: flex;\n flex-flow: row wrap;\n padding: 10px;\n gap: 10px;\n align-content: flex-start;\n align-items: flex-start;\n `}\n className={className}>\n {helmet}\n\n <Card elevation={0} css={css`\n flex: 100%;\n background: ${Colors.LIGHT_GRAY3};\n padding: 11px;\n display: flex;\n min-height: 70vh;\n `}>\n {proposals}\n </Card>\n\n <Card elevation={1} css={css`flex: 30%; padding: 11px;`}>\n\n {crStakeholder\n ? <div>\n Author: <RegisterStakeholderListItem\n stakeholder={crStakeholder}\n isCurrentUser={authorIsCurrentUser || undefined}\n />\n </div>\n : null}\n\n <Divider />\n <div>\n Register version before proposal: <strong>{cr.registerVersion ?? 'N/A'}</strong>\n  \n {cr.registerVersion === registerMetadata?.version?.id\n ? <Tag css={css`display: inline;`} intent='success' minimal round>\n current\n {\" \"}\n <HelpTooltip intent='success' content={<>\n Published version of the register\n {\" \"}\n had not changed since this proposal started.\n </>} />\n </Tag>\n : <Tag css={css`display: inline;`} intent='warning' minimal round>\n not current\n {\" \"}\n <HelpTooltip intent='warning' icon='warning-sign' content={<>\n Register is currently at version <strong>{registerMetadata?.version?.id ?? 'N/A'}</strong>,\n {\" \"}\n which is different from version proposal author may have had in mind.\n {\" \"}\n It is recommended that proposed changes are reviewed to avoid unintentionally\n {\" \"}\n undoing a prior change.\n </>} />\n </Tag>}\n </div>\n <Divider />\n <div>Edited: <Datestamp date={cr.timeEdited} /></div>\n <Divider />\n <div>Proposed: {hadBeenProposed(cr) ? <Datestamp date={cr.timeProposed} /> : 'not yet'}</div>\n <Divider />\n <div>Disposed: {isDisposed(cr) ? <Datestamp date={cr.timeDisposed} /> : 'not yet'}</div>\n <Divider />\n\n <H5>\n {cr.state?.replaceAll('-', ' ') || 'N/A'}\n </H5>\n </Card>\n\n <Card elevation={1} css={css`flex: 30%; padding: 11px;`}>\n {getPastTransitions(cr).map(([key, el], idx) =>\n <React.Fragment key={key}>\n {idx !== 0 ? <Divider /> : null}\n <FormGroup label={`${key}:`}>\n <div\n css={css`white-space: pre-wrap;`}\n className={Classes.RUNNING_TEXT}>\n {el}\n </div>\n </FormGroup>\n </React.Fragment>\n )}\n </Card>\n\n {canTransition\n ? <Card elevation={3} css={css`flex: 30%; padding: 11px;`}>\n <TransitionOptions cr={cr} />\n </Card>\n : null}\n </div>}\n />\n );\n};\n\n\nconst CRActivation: React.FC<{\n isActive: boolean;\n htmlTitle?: string;\n\n /** Labels for the “activate” and “deactivate” buttons. */\n labels?: { activate?: string, deactivate?: string };\n\n onChangeActiveStatus?: (newStatus: boolean) => void;\n}> = function ({ isActive, htmlTitle, labels, onChangeActiveStatus }) {\n return onChangeActiveStatus && isActive\n ? <Button\n title={htmlTitle}\n intent=\"warning\"\n disabled={!onChangeActiveStatus}\n onClick={() => onChangeActiveStatus?.(false)}>\n {labels?.deactivate ?? \"Exit proposal\"}\n </Button>\n : <Button\n title={htmlTitle}\n intent={onChangeActiveStatus ? 'primary' : undefined}\n disabled={!onChangeActiveStatus}\n onClick={() => onChangeActiveStatus?.(true)}>\n {labels?.activate ?? \"Work on this proposal\"}\n </Button>;\n};\n\n\nconst CRTitle: React.FC<{ uri: string }> = 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"]}
|
|
@@ -38,8 +38,6 @@ const TransitionOptions = function ({
|
|
|
38
38
|
cr,
|
|
39
39
|
className
|
|
40
40
|
}) {
|
|
41
|
-
var _a, _b;
|
|
42
|
-
|
|
43
41
|
const {
|
|
44
42
|
stakeholder,
|
|
45
43
|
subregisters
|
|
@@ -52,12 +50,15 @@ const TransitionOptions = function ({
|
|
|
52
50
|
usePersistentDatasetStateReducer
|
|
53
51
|
} = (0, _react.useContext)(_context.DatasetContext);
|
|
54
52
|
const isBusy = operationKey !== undefined;
|
|
55
|
-
const transitions = (0, _react.useMemo)(() => stakeholder ? getTransitions(cr, stakeholder) : [], [JSON.stringify(stakeholder),
|
|
56
|
-
|
|
53
|
+
const transitions = (0, _react.useMemo)(() => stakeholder ? getTransitions(cr, stakeholder) : [], [JSON.stringify(stakeholder), // IMPORTANT: Below two dependencies arise
|
|
54
|
+
// from within `getTransitions()` implementation, which in turn
|
|
55
|
+
// further depends on individual transitions.
|
|
56
|
+
cr.state, cr.submittingStakeholderGitServerUsername]);
|
|
57
|
+
const initialState = (0, _react.useMemo)(() => ({
|
|
57
58
|
// Pre-select next state to first available transition
|
|
58
59
|
chosenNextState: transitions.length > 0 ? transitions[0][0] : undefined,
|
|
59
60
|
stateInput: {}
|
|
60
|
-
};
|
|
61
|
+
}), [transitions]);
|
|
61
62
|
const [state, dispatch, stateRecalled] = usePersistentDatasetStateReducer(`${cr.id}-${cr.state}`, undefined, undefined, (prevState, action) => {
|
|
62
63
|
switch (action.type) {
|
|
63
64
|
case 'unset-next-state':
|
|
@@ -79,7 +80,11 @@ const TransitionOptions = function ({
|
|
|
79
80
|
throw new Error("Unexpected state");
|
|
80
81
|
}
|
|
81
82
|
}, initialState, null);
|
|
82
|
-
const selectedTransitionCfg = (
|
|
83
|
+
const selectedTransitionCfg = (0, _react.useMemo)(() => {
|
|
84
|
+
var _a, _b;
|
|
85
|
+
|
|
86
|
+
return (_b = stateRecalled && state.chosenNextState ? (_a = transitions.find(([t]) => t === state.chosenNextState)) === null || _a === void 0 ? void 0 : _a[1] : undefined) !== null && _b !== void 0 ? _b : undefined;
|
|
87
|
+
}, [stateRecalled, state.chosenNextState, transitions]);
|
|
83
88
|
(0, _react.useEffect)(() => {
|
|
84
89
|
if (stateRecalled && state.chosenNextState) {
|
|
85
90
|
if (!selectedTransitionCfg) {
|
|
@@ -88,7 +93,7 @@ const TransitionOptions = function ({
|
|
|
88
93
|
});
|
|
89
94
|
}
|
|
90
95
|
}
|
|
91
|
-
}, [stateRecalled, state.chosenNextState,
|
|
96
|
+
}, [stateRecalled, state.chosenNextState, selectedTransitionCfg]);
|
|
92
97
|
const [validatedStateInput, stateInputValidationErrors] = (0, _react.useMemo)(() => {
|
|
93
98
|
var _a;
|
|
94
99
|
|
|
@@ -103,7 +108,7 @@ const TransitionOptions = function ({
|
|
|
103
108
|
} else {
|
|
104
109
|
return [undefined, "no CR or no transition selected"];
|
|
105
110
|
}
|
|
106
|
-
}, [JSON.stringify(cr),
|
|
111
|
+
}, [JSON.stringify(cr), selectedTransitionCfg, state.stateInput]);
|
|
107
112
|
const getItemChangesetAsApproved = (0, _react.useCallback)(async function (cr) {
|
|
108
113
|
const origItemData = (await getObjectData({
|
|
109
114
|
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)]
|
|
@@ -114,7 +119,7 @@ const TransitionOptions = function ({
|
|
|
114
119
|
})).data; //console.debug("Got new item data", newItemData);
|
|
115
120
|
|
|
116
121
|
return await (0, _objectChangeset.proposalsToObjectChangeset)(cr.id, subregisters !== undefined, cr.items, origItemData, newItemData);
|
|
117
|
-
}, [JSON.stringify(cr),
|
|
122
|
+
}, [cr.id, JSON.stringify(cr.items), subregisters === undefined, getObjectData]);
|
|
118
123
|
const handleTransition = (0, _react.useCallback)(async function (transitionCfg, stateInput) {
|
|
119
124
|
if (transitionCfg && updateObjects && stakeholder && transitionCfg.canBeTransitionedBy(stakeholder, cr)) {
|
|
120
125
|
const newCR = { ...transitionCfg.func(cr, stateInput),
|