@riboseinc/paneron-registry-kit 2.2.33 → 2.2.35

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 (74) hide show
  1. package/item-classes/Tree.js +2 -2
  2. package/item-classes/Tree.js.map +1 -1
  3. package/package.json +4 -3
  4. package/proposals/ChangeRequestContext.js +1 -1
  5. package/proposals/ChangeRequestContext.js.map +1 -1
  6. package/proposals/HistoryDrawer.js +1 -0
  7. package/proposals/HistoryDrawer.js.map +1 -1
  8. package/proposals/ListItem.d.ts +8 -0
  9. package/proposals/ListItem.js +40 -0
  10. package/proposals/ListItem.js.map +1 -0
  11. package/proposals/MetaProperties.js +41 -11
  12. package/proposals/MetaProperties.js.map +1 -1
  13. package/proposals/NewProposalMenu.d.ts +10 -0
  14. package/proposals/NewProposalMenu.js +113 -0
  15. package/proposals/NewProposalMenu.js.map +1 -0
  16. package/proposals/ProposalBrowser.js +2 -58
  17. package/proposals/ProposalBrowser.js.map +1 -1
  18. package/proposals/ProposalDetail.js +1 -0
  19. package/proposals/ProposalDetail.js.map +1 -1
  20. package/proposals/ProposalItem.js.map +1 -1
  21. package/proposals/ProposalTab.d.ts +12 -0
  22. package/proposals/ProposalTab.js +102 -0
  23. package/proposals/ProposalTab.js.map +1 -0
  24. package/proposals/ProposalWorkspace.d.ts +13 -0
  25. package/proposals/ProposalWorkspace.js +132 -0
  26. package/proposals/ProposalWorkspace.js.map +1 -0
  27. package/proposals/Search.js +20 -8
  28. package/proposals/Search.js.map +1 -1
  29. package/proposals/actionableGroups/Tree.js +13 -14
  30. package/proposals/actionableGroups/Tree.js.map +1 -1
  31. package/proposals/actionableGroups/treeNodes.d.ts +1 -0
  32. package/proposals/actionableGroups/treeNodes.js +41 -9
  33. package/proposals/actionableGroups/treeNodes.js.map +1 -1
  34. package/proposals/objectChangeset.d.ts +1 -2
  35. package/proposals/objectChangeset.js +1 -1
  36. package/proposals/objectChangeset.js.map +1 -1
  37. package/proposals/types.d.ts +2 -1
  38. package/proposals/types.js +4 -1
  39. package/proposals/types.js.map +1 -1
  40. package/types/util.d.ts +1 -1
  41. package/types/util.js.map +1 -1
  42. package/views/detail/ChangeRequest/index.js +11 -159
  43. package/views/detail/ChangeRequest/index.js.map +1 -1
  44. package/views/detail/ProposalWork.js +150 -110
  45. package/views/detail/ProposalWork.js.map +1 -1
  46. package/views/detail/RegisterHome/index.js +3 -3
  47. package/views/detail/RegisterHome/index.js.map +1 -1
  48. package/views/detail/RegisterHome2/index.d.ts +5 -0
  49. package/views/detail/RegisterHome2/index.js +58 -0
  50. package/views/detail/RegisterHome2/index.js.map +1 -0
  51. package/views/detail/RegisterItem/index.d.ts +1 -0
  52. package/views/detail/RegisterItem/index.js +55 -14
  53. package/views/detail/RegisterItem/index.js.map +1 -1
  54. package/views/detail/RegisterMeta/RegisterMetaForm.js +1 -46
  55. package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
  56. package/views/hooks/useLatestAcceptedProposal.d.ts +2 -0
  57. package/views/hooks/useLatestAcceptedProposal.js +48 -0
  58. package/views/hooks/useLatestAcceptedProposal.js.map +1 -0
  59. package/views/hooks/useRegisterVersion.d.ts +4 -0
  60. package/views/hooks/useRegisterVersion.js +4 -0
  61. package/views/hooks/useRegisterVersion.js.map +1 -1
  62. package/views/index.js +26 -10
  63. package/views/index.js.map +1 -1
  64. package/views/itemQueryUtils.js +12 -7
  65. package/views/itemQueryUtils.js.map +1 -1
  66. package/views/sidebar/Registration/index.js +6 -32
  67. package/views/sidebar/Registration/index.js.map +1 -1
  68. package/views/sidebar/Search/index.js +4 -7
  69. package/views/sidebar/Search/index.js.map +1 -1
  70. package/views/sidebar/index.js +40 -10
  71. package/views/sidebar/index.js.map +1 -1
  72. package/views/util.d.ts +6 -1
  73. package/views/util.js +29 -7
  74. 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 _ProposalBrowser = _interopRequireDefault(require("../../../proposals/ProposalBrowser"));
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 _util2 = require("../../util");
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
- canTransition,
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
- const handleDeleteProposalAtItemPath = (0, _react.useCallback)(async function handleDeleteProposalAtItemPath(itemPath) {
80
- return await (updateItemProposal === null || updateItemProposal === void 0 ? void 0 : updateItemProposal("remove proposed change from proposal draft", null, itemPath));
81
- }, [updateItemProposal]);
82
- return cr ? (0, _react2.jsx)(ChangeRequestDetails, {
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, _util2.maybeEllipsizeString)(justification !== null && justification !== void 0 ? justification : uri), "\u201D");
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":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAChF,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,MAAM,EACN,IAAI,EACJ,aAAa,EACb,OAAO,EACP,EAAE,GACH,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,MAAM,6CAA6C,CAAC;AAC7D,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,SAAS,MAAM,oCAAoC,CAAC;AAC3D,OAAO,iBAAiB,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACvG,OAAO,oBAAoB,EAAE,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAClG,OAAO,OAAO,MAAM,mCAAmC,CAAC;AACxD,OAAO,EAAe,eAAe,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,qBAAqB,EAErB,cAAc,IAAI,MAAM,EACxB,oBAAoB,EACpB,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,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,EACJ,aAAa,EAAE,EAAE,EACjB,aAAa,EACb,QAAQ,EACR,kBAAkB,GACnB,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAErC,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,MAAM,8BAA8B,GAAG,WAAW,CAChD,KAAK,UAAU,8BAA8B,CAAC,QAAgB;QAC5D,OAAO,MAAM,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAG,4CAA4C,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA,CAAC;IAClG,CAAC,EACD,CAAC,kBAAkB,CAAC,CACrB,CAAC;IAEF,OAAO,CAAC,EAAE;QACR,CAAC,CAAC,IAAC,oBAAoB,IACnB,EAAE,EAAE,EAAE,EACN,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,QAAQ;gBAChB,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,SAAS,EACb,6BAA6B,EAAE,kBAAkB;gBAC/C,CAAC,CAAC,8BAA8B;gBAChC,CAAC,CAAC,SAAS,EACb,GAAG,EAAE,GAAG,CAAA;;;;SAIP,GACD;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,oBAAoB,GAMrB,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,6BAA6B,EAAE,SAAS,EAAE;IAC3F,MAAM,EACJ,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,gBAAgB,GACjB,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAE3B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE;;QAC3B,OAAA,IAAC,MAAM;YACL;sCAA0B,MAAA,EAAE,CAAC,aAAa,mCAAI,KAAK,CAAS,CACrD,CAAA;KAAA,CACV,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEvB,MAAM,QAAQ,GAAG,qBAAqB,KAAK,EAAE,CAAC,EAAE,CAAC;IACjD,MAAM,eAAe,GAAG,qBAAqB,IAAI,qBAAqB,KAAK,EAAE,CAAC,EAAE,CAAC;IAEjF,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAE1C,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,CAC9B,QAAQ;QACN,CAAC,CAAC,IAAC,SAAS,IACR,SAAS,EAAE,EAAE,CAAC,KAAK,EACnB,YAAY,EAAE,gBAAgB,EAC9B,YAAY,EAAE,cAAc,EAC5B,6BAA6B,EAAE,6BAA6B,GAC5D;QACJ,CAAC,CAAC,IAAC,aAAa,IACZ,IAAI,EAAC,OAAO,EACZ,KAAK,EAAC,+BAA+B,EACrC,WAAW,EAAE,QAAQ;gBACnB,CAAC,CAAC,IAAC,MAAM,IAAC,OAAO,EAAE,QAAQ,2BAEhB;gBACX,CAAC,CAAC,SAAS,GACb,CACP,EAAE,CAAC,QAAQ,EAAE,6BAA6B,EAAE,gBAAgB,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1F,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;;QAClC,MAAM,cAAc,GAAiD,EAAE,CAAC;QACxE,cAAc,CAAC,IAAI,CAAC;YAClB,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,IAAC,EAAE,IAAC,GAAG,EAAE,GAAG,CAAA,YAAY;oBAAE;;wBAAkB,EAAE,CAAC,EAAE,CAAM,CAAK;aACtE;SACF,CAAC,CAAC;QACH,cAAc,CAAC,IAAI,CAAC;YAClB,QAAQ,EAAE,CAAA,MAAA,EAAE,CAAC,KAAK,0CAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,KAAI,KAAK;YACjD,OAAO,EAAE;gBACP,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,IAAC,EAAE,IAAC,GAAG,EAAE,GAAG,CAAA,YAAY;oBAC/B;;wBAAY,IAAC,SAAS,IAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAI,CAAK;oBACnD;;wBAAe,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAC,SAAS,IAAC,IAAI,EAAE,EAAE,CAAC,YAAY,GAAI,CAAC,CAAC,CAAC,SAAS,CAAM;oBAC3F;;wBAAe,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAC,SAAS,IAAC,IAAI,EAAE,EAAE,CAAC,YAAY,GAAI,CAAC,CAAC,CAAC,SAAS,CAAM,CACnF;aACN;YACD,MAAM,EAAE,EAAE,CAAC,KAAK,KAAK,UAAU;gBAC7B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,4BAA4B;oBACzC,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,WAAW,IAAI,EAAE,CAAC,KAAK,KAAK,UAAU;wBACnD,CAAC,CAAC,QAAQ;wBACV,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,OAAO;4BACpB,CAAC,CAAC,SAAS;4BACX,CAAC,CAAC,SAAS;SACpB,CAAC,CAAC;QACH,OAAO,cAAc,CAAC;IACxB,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;QAC3B,MAAM,OAAO,GAA0C,EAAE,CAAC;QAC1D,MAAM,wBAAwB,GAAG,CAAC,eAAe,IAAI,wBAAwB;YAC3E,CAAC,CAAC,CAAC,CAAC,MAAe,EAAE,EAAE,CAAC,MAAM;gBAC1B,CAAC,CAAC,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAG,EAAE,CAAC,EAAE,CAAC;gBACnC,CAAC,CAAC,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAG,IAAI,CAAC,CACnC;YACH,CAAC,CAAC,SAAS,CAAC;QACd,mCAAmC;QACnC,iEAAiE;QACjE,0BAA0B;QAC1B,gEAAgE;QAChE,iBAAiB;QACjB,+DAA+D;QAC/D,sEAAsE;QACtE,IAAI,wBAAwB,IAAI,QAAQ,EAAE;YACxC,OAAO,CAAC,IAAI,CAAC;gBACX,QAAQ,EAAE,eAAe;gBACzB,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC,wBAAwB;gBACnC,OAAO,EAAE,GAAG,EAAE,CAAC,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAG,KAAK,CAAC;gBAChD,mBAAmB;aACpB,CAAC,CAAC;SACJ;aAAM;YACL,OAAO,CAAC,IAAI,CAAC;gBACX,QAAQ,EAAE,uBAAuB;gBACjC,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,CAAC,wBAAwB;gBACnC,OAAO,EAAE,GAAG,EAAE,CAAC,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAG,IAAI,CAAC;gBAC/C,mBAAmB;aACpB,CAAC,CAAC;SACJ;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;IAEhC,OAAO,CACL,IAAC,qBAAqB,IAClB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,oBAAoB,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,EACjD,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAC,WAAW,EAClB,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAChC,OAAO,EAAE,OAAO;QAEjB,MAAM;QAEN,SAAS;QAEV,IAAC,IAAI,IAAC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAA,4BAA4B;YACtD,IAAC,EAAE;gBACD,IAAC,OAAO,IACN,EAAE,EAAE,EAAE,EACN,kBAAkB,EAAE,WAAW,EAC/B,gBAAgB,EAAE,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,SAAS,GAC/C,CACC,CACA;QAEP,IAAC,IAAI,IAAC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAA,sDAAsD;YAChF,IAAC,oBAAoB,IACnB,eAAe,EAAE,oBAAoB,CAAC,EAAE,CAAC,EACzC,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,GAC/B,CACG;QAEN,aAAa;YACZ,CAAC,CAAC,IAAC,IAAI,IAAC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAA,sDAAsD;gBAChF,IAAC,iBAAiB,IAChB,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,EAC/D,WAAW,EAAE,WAAW,EACxB,EAAE,EAAE,EAAE,GACN,CACG;YACT,CAAC,CAAC,IAAI,CACc,CACzB,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, { 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 _DL = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/DL"));
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 _MetaProperties = _interopRequireDefault(require("../../proposals/MetaProperties"));
20
+ var _ChangeRequestContext = require("../../proposals/ChangeRequestContext");
27
21
 
28
- var _Search = _interopRequireDefault(require("../../proposals/Search"));
22
+ var _ProposalTab = _interopRequireDefault(require("../../proposals/ProposalTab"));
29
23
 
30
- var _Search2 = _interopRequireDefault(require("../../views/sidebar/Search"));
24
+ var _NewProposalMenu = _interopRequireDefault(require("../../proposals/NewProposalMenu"));
31
25
 
32
- var _util = require("../util");
26
+ var _types = require("../../proposals/types");
33
27
 
34
- var _ChangeRequestContext = require("../../proposals/ChangeRequestContext");
28
+ var _itemPathUtils = require("../itemPathUtils");
29
+
30
+ var _util = require("../util");
35
31
 
36
- var _TransitionOptions = _interopRequireWildcard(require("../../proposals/TransitionOptions"));
32
+ var _useLatestAcceptedProposal = _interopRequireDefault(require("../../views/hooks/useLatestAcceptedProposal"));
37
33
 
38
- var _TransitionHistory = _interopRequireWildcard(require("../../proposals/TransitionHistory"));
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)(_core.Button, {
63
- large: true,
64
- intent: "primary"
65
- }, "Start a new proposal")) : null)
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)(ActiveProposal, {
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, " Active proposal") : (0, _react2.jsx)(_react.default.Fragment, null, "Proposal dashboard"));
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"]}