@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.
Files changed (42) hide show
  1. package/package.json +4 -3
  2. package/types/item.d.ts +1 -0
  3. package/types/item.js +8 -0
  4. package/types/item.js.map +1 -1
  5. package/views/GenericRelatedItemView.js +89 -75
  6. package/views/GenericRelatedItemView.js.map +1 -1
  7. package/views/change-request/ChangeRequestContext.js +8 -5
  8. package/views/change-request/ChangeRequestContext.js.map +1 -1
  9. package/views/change-request/objectChangeset.d.ts +3 -1
  10. package/views/change-request/objectChangeset.js +4 -1
  11. package/views/change-request/objectChangeset.js.map +1 -1
  12. package/views/detail/ChangeRequest/index.d.ts +0 -1
  13. package/views/detail/ChangeRequest/index.js +143 -128
  14. package/views/detail/ChangeRequest/index.js.map +1 -1
  15. package/views/detail/ChangeRequest/transitions.js +14 -9
  16. package/views/detail/ChangeRequest/transitions.js.map +1 -1
  17. package/views/detail/RegisterHome/index.js +1 -1
  18. package/views/detail/RegisterHome/index.js.map +1 -1
  19. package/views/detail/RegisterItem/index.js +34 -48
  20. package/views/detail/RegisterItem/index.js.map +1 -1
  21. package/views/hooks/useItemClassConfig.d.ts +1 -2
  22. package/views/hooks/useItemClassConfig.js +1 -7
  23. package/views/hooks/useItemClassConfig.js.map +1 -1
  24. package/views/hooks/useSingleRegisterItemData.d.ts +1 -1
  25. package/views/hooks/useSingleRegisterItemData.js +4 -3
  26. package/views/hooks/useSingleRegisterItemData.js.map +1 -1
  27. package/views/index.js +34 -24
  28. package/views/index.js.map +1 -1
  29. package/views/itemPathUtils.d.ts +3 -8
  30. package/views/itemPathUtils.js +26 -1
  31. package/views/itemPathUtils.js.map +1 -1
  32. package/views/protocolRegistry.d.ts +1 -1
  33. package/views/protocolRegistry.js.map +1 -1
  34. package/views/sidebar/Browse/index.js +43 -35
  35. package/views/sidebar/Browse/index.js.map +1 -1
  36. package/views/sidebar/Registration/index.js +12 -11
  37. package/views/sidebar/Registration/index.js.map +1 -1
  38. package/views/sidebar/Search/index.js +48 -43
  39. package/views/sidebar/Search/index.js.map +1 -1
  40. package/views/util.d.ts +1 -0
  41. package/views/util.js +3 -1
  42. 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
- return (0, _react2.jsx)(_ChangeRequestContext.ChangeRequestContextProvider, {
55
- changeRequestID: crID
56
- }, (0, _react2.jsx)(ChangeRequestDetails, {
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
- closeTabWithURI(`${_protocolRegistry.Protocols.CHANGE_REQUEST}:${uri}`);
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, _g;
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, _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"));
89
-
90
- if (cr) {
91
- const isActive = activeChangeRequestID === cr.id;
92
- const anotherIsActive = activeChangeRequestID && activeChangeRequestID !== cr.id;
93
- const canTransition = stakeholder && (0, _transitions.getTransitions)(cr, stakeholder).length > 0;
94
- const crStakeholder = ((_b = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.stakeholders) !== null && _b !== void 0 ? _b : []).find(s => s.gitServerUsername === cr.submittingStakeholderGitServerUsername);
95
- const authorIsCurrentUser = (stakeholder === null || stakeholder === void 0 ? void 0 : stakeholder.gitServerUsername) && cr.submittingStakeholderGitServerUsername === stakeholder.gitServerUsername;
96
-
97
- async function handleDelete() {
98
- if (authorIsCurrentUser && cr && updateTree && !isActive && Object.keys(cr.items).length < 1) {
99
- const subtreeRoot = (0, _itemPathUtils.crIDToCRPath)(cr.id).replace('/main.yaml', '');
100
- await updateTree({
101
- subtreeRoot,
102
- newSubtreeRoot: null,
103
- commitMessage: 'remove CR draft'
104
- });
105
- afterDelete === null || afterDelete === void 0 ? void 0 : afterDelete();
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
- return (0, _react2.jsx)(_util.TabContentsWithActions, {
110
- className: className,
111
- actions: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.FormGroup, {
112
- inline: true,
113
- labelInfo: (0, _react2.jsx)(_HelpTooltip.default, {
114
- icon: 'info-sign',
115
- content: (0, _react2.jsx)(_core.UL, null, (0, _react2.jsx)("li", null, "Proposal ID: ", cr.id))
116
- }),
117
- label: (0, _react2.jsx)("strong", null, "Proposal"),
118
- css: (0, _react2.css)`margin: 0; .bp4-form-content { display: flex; flex-flow: row wrap; gap: 10px; }`
119
- }, (0, _react2.jsx)(CRActivation, {
120
- isActive: isActive,
121
- 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.",
122
- 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
123
- }))),
124
- main: (0, _react2.jsx)("div", {
125
- css: (0, _react2.css)`
126
- display: flex;
127
- flex-flow: row wrap;
128
- padding: 10px;
129
- gap: 10px;
130
- align-content: flex-start;
131
- align-items: flex-start;
132
- `,
133
- className: className
134
- }, helmet, (0, _react2.jsx)(_core.Card, {
135
- elevation: 0,
136
- css: (0, _react2.css)`
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
- min-height: 70vh;
142
- `
143
- }, Object.keys(cr.items).length > 0 ? (0, _react2.jsx)(_Proposals.default, {
144
- proposals: cr.items,
145
- css: (0, _react2.css)`flex: 1;`
146
- }) : (0, _react2.jsx)(_core.NonIdealState, {
147
- icon: "clean",
148
- title: "Nothing is proposed here yet.",
149
- description: authorIsCurrentUser && updateTree && !cr.timeProposed && !isActive ? (0, _react2.jsx)(_core.Button, {
150
- onClick: performOperation('deleting proposal', handleDelete)
151
- }, "Delete this CR draft") : undefined
152
- })), (0, _react2.jsx)(_core.Card, {
153
- elevation: 1,
154
- css: (0, _react2.css)`flex: 30%; padding: 11px;`
155
- }, crStakeholder ? (0, _react2.jsx)("div", null, "Author: ", (0, _react2.jsx)(_RegisterStakeholder.RegisterStakeholderListItem, {
156
- stakeholder: crStakeholder,
157
- isCurrentUser: authorIsCurrentUser || undefined
158
- })) : null, (0, _react2.jsx)(_core.Divider, null), (0, _react2.jsx)("div", null, "Register\u00A0version before\u00A0proposal: ", (0, _react2.jsx)("strong", null, (_c = cr.registerVersion) !== null && _c !== void 0 ? _c : 'N/A'), "\u2002", cr.registerVersion === ((_d = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.version) === null || _d === void 0 ? void 0 : _d.id) ? (0, _react2.jsx)(_core.Tag, {
159
- css: (0, _react2.css)`display: inline;`,
160
- intent: 'success',
161
- minimal: true,
162
- round: true
163
- }, "current", " ", (0, _react2.jsx)(_HelpTooltip.default, {
164
- intent: 'success',
165
- content: (0, _react2.jsx)(_react.default.Fragment, null, "Published version of the register", " ", "had not changed since this proposal started.")
166
- })) : (0, _react2.jsx)(_core.Tag, {
167
- css: (0, _react2.css)`display: inline;`,
168
- intent: 'warning',
169
- minimal: true,
170
- round: true
171
- }, "not current", " ", (0, _react2.jsx)(_HelpTooltip.default, {
172
- intent: 'warning',
173
- icon: 'warning-sign',
174
- content: (0, _react2.jsx)(_react.default.Fragment, null, "Register is currently at version ", (0, _react2.jsx)("strong", null, (_f = (_e = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.version) === null || _e === void 0 ? void 0 : _e.id) !== null && _f !== void 0 ? _f : '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.")
175
- }))), (0, _react2.jsx)(_core.Divider, null), (0, _react2.jsx)("div", null, "Edited: ", (0, _react2.jsx)(_util.Datestamp, {
176
- date: cr.timeEdited
177
- })), (0, _react2.jsx)(_core.Divider, null), (0, _react2.jsx)("div", null, "Proposed: ", (0, _cr.hadBeenProposed)(cr) ? (0, _react2.jsx)(_util.Datestamp, {
178
- date: cr.timeProposed
179
- }) : 'not yet'), (0, _react2.jsx)(_core.Divider, null), (0, _react2.jsx)("div", null, "Disposed: ", (0, _cr.isDisposed)(cr) ? (0, _react2.jsx)(_util.Datestamp, {
180
- date: cr.timeDisposed
181
- }) : 'not yet'), (0, _react2.jsx)(_core.Divider, null), (0, _react2.jsx)(_core.H5, null, ((_g = cr.state) === null || _g === void 0 ? void 0 : _g.replaceAll('-', ' ')) || 'N/A')), (0, _react2.jsx)(_core.Card, {
182
- elevation: 1,
183
- css: (0, _react2.css)`flex: 30%; padding: 11px;`
184
- }, (0, _transitions.getPastTransitions)(cr).map(([key, el], idx) => (0, _react2.jsx)(_react.default.Fragment, {
185
- key: key
186
- }, idx !== 0 ? (0, _react2.jsx)(_core.Divider, null) : null, (0, _react2.jsx)(_core.FormGroup, {
187
- label: `${key}:`
188
- }, (0, _react2.jsx)("div", {
189
- css: (0, _react2.css)`white-space: pre-wrap;`,
190
- className: _core.Classes.RUNNING_TEXT
191
- }, el))))), canTransition ? (0, _react2.jsx)(_core.Card, {
192
- elevation: 3,
193
- css: (0, _react2.css)`flex: 30%; padding: 11px;`
194
- }, (0, _react2.jsx)(_transitions.TransitionOptions, {
195
- cr: cr
196
- })) : null)
197
- });
198
- } else {
199
- return (0, _react2.jsx)(_core.NonIdealState, {
200
- icon: (0, _react2.jsx)(_core.Spinner, null),
201
- className: className,
202
- description: helmet
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":"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","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&nbsp;version before&nbsp;proposal: <strong>{cr.registerVersion ?? 'N/A'}</strong>\n &ensp;\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&nbsp;version before&nbsp;proposal: <strong>{cr.registerVersion ?? 'N/A'}</strong>\n &ensp;\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), JSON.stringify(cr)]);
56
- const initialState = {
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 = (_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;
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, JSON.stringify(selectedTransitionCfg)]);
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), JSON.stringify(selectedTransitionCfg), JSON.stringify(state.stateInput)]);
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), JSON.stringify(subregisters)]);
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),