@riboseinc/paneron-registry-kit 2.2.10 → 2.2.12

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 (102) hide show
  1. package/index.d.ts +2 -4
  2. package/index.js +18 -0
  3. package/index.js.map +1 -1
  4. package/package.json +2 -2
  5. package/site-builder/index.d.ts +3 -0
  6. package/site-builder/index.js +75 -0
  7. package/site-builder/index.js.map +1 -0
  8. package/site-builder/jsx-runtime.d.ts +18 -0
  9. package/site-builder/jsx-runtime.js +107 -0
  10. package/site-builder/jsx-runtime.js.map +1 -0
  11. package/site-builder/page.d.ts +6 -0
  12. package/site-builder/page.js +24 -0
  13. package/site-builder/page.js.map +1 -0
  14. package/types/cr.d.ts +22 -0
  15. package/types/cr.js +41 -1
  16. package/types/cr.js.map +1 -1
  17. package/types/item.d.ts +1 -1
  18. package/types/item.js.map +1 -1
  19. package/types/stakeholder.d.ts +3 -1
  20. package/types/stakeholder.js +20 -0
  21. package/types/stakeholder.js.map +1 -1
  22. package/types/util.d.ts +2 -0
  23. package/types/util.js.map +1 -1
  24. package/types/views.d.ts +22 -0
  25. package/types/views.js.map +1 -1
  26. package/views/AnnotatedChange.js +7 -5
  27. package/views/AnnotatedChange.js.map +1 -1
  28. package/views/BrowserCtx.d.ts +3 -11
  29. package/views/BrowserCtx.js +1 -0
  30. package/views/BrowserCtx.js.map +1 -1
  31. package/views/FilterCriteria/criteriaGroupToQueryExpression.d.ts +1 -1
  32. package/views/FilterCriteria/criteriaGroupToQueryExpression.js.map +1 -1
  33. package/views/FilterCriteria/models.d.ts +1 -1
  34. package/views/FilterCriteria/models.js.map +1 -1
  35. package/views/GenericRelatedItemView.js +11 -51
  36. package/views/GenericRelatedItemView.js.map +1 -1
  37. package/views/ItemDrawer.d.ts +11 -0
  38. package/views/ItemDrawer.js +69 -0
  39. package/views/ItemDrawer.js.map +1 -0
  40. package/views/SearchQuery.js +25 -14
  41. package/views/SearchQuery.js.map +1 -1
  42. package/views/change-request/ChangeProposalContext.d.ts +3 -0
  43. package/views/change-request/ChangeProposalContext.js +4 -0
  44. package/views/change-request/ChangeProposalContext.js.map +1 -0
  45. package/views/change-request/ChangeRequestContext.d.ts +18 -2
  46. package/views/change-request/ChangeRequestContext.js +29 -5
  47. package/views/change-request/ChangeRequestContext.js.map +1 -1
  48. package/views/change-request/Proposals.d.ts +2 -0
  49. package/views/change-request/Proposals.js +116 -80
  50. package/views/change-request/Proposals.js.map +1 -1
  51. package/views/change-request/State.d.ts +0 -0
  52. package/views/change-request/State.js +1 -0
  53. package/views/change-request/State.js.map +1 -0
  54. package/views/change-request/Summary.d.ts +12 -0
  55. package/views/change-request/Summary.js +59 -0
  56. package/views/change-request/Summary.js.map +1 -0
  57. package/views/change-request/TransitionHistory.d.ts +30 -0
  58. package/views/change-request/TransitionHistory.js +307 -0
  59. package/views/change-request/TransitionHistory.js.map +1 -0
  60. package/views/change-request/TransitionOptions.d.ts +38 -0
  61. package/views/{detail/ChangeRequest/transitions.js → change-request/TransitionOptions.js} +61 -51
  62. package/views/change-request/TransitionOptions.js.map +1 -0
  63. package/views/change-request/objectChangeset.d.ts +7 -4
  64. package/views/change-request/objectChangeset.js +60 -23
  65. package/views/change-request/objectChangeset.js.map +1 -1
  66. package/views/detail/ChangeRequest/index.js +129 -142
  67. package/views/detail/ChangeRequest/index.js.map +1 -1
  68. package/views/detail/RegisterHome/ActiveProposalDetails.d.ts +15 -0
  69. package/views/detail/RegisterHome/ActiveProposalDetails.js +104 -0
  70. package/views/detail/RegisterHome/ActiveProposalDetails.js.map +1 -0
  71. package/views/detail/RegisterHome/Block.d.ts +19 -0
  72. package/views/detail/RegisterHome/Block.js +49 -0
  73. package/views/detail/RegisterHome/Block.js.map +1 -0
  74. package/views/detail/RegisterHome/MetaSummary.d.ts +9 -0
  75. package/views/detail/RegisterHome/MetaSummary.js +39 -0
  76. package/views/detail/RegisterHome/MetaSummary.js.map +1 -0
  77. package/views/detail/RegisterHome/Proposal.d.ts +14 -0
  78. package/views/detail/RegisterHome/Proposal.js +296 -0
  79. package/views/detail/RegisterHome/Proposal.js.map +1 -0
  80. package/views/detail/RegisterHome/index.js +345 -141
  81. package/views/detail/RegisterHome/index.js.map +1 -1
  82. package/views/detail/RegisterItem/index.d.ts +2 -3
  83. package/views/detail/RegisterItem/index.js +238 -140
  84. package/views/detail/RegisterItem/index.js.map +1 -1
  85. package/views/detail/RegisterMeta/RegisterMetaForm.js +37 -45
  86. package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
  87. package/views/detail/RegisterMeta/index.js +14 -11
  88. package/views/detail/RegisterMeta/index.js.map +1 -1
  89. package/views/diffing/InlineDiff.d.ts +27 -1
  90. package/views/diffing/InlineDiff.js +113 -2
  91. package/views/diffing/InlineDiff.js.map +1 -1
  92. package/views/hooks/useCustomView.js +1 -1
  93. package/views/hooks/useCustomView.js.map +1 -1
  94. package/views/index.js +4 -2
  95. package/views/index.js.map +1 -1
  96. package/views/sidebar/Search/index.js +12 -2
  97. package/views/sidebar/Search/index.js.map +1 -1
  98. package/views/util.d.ts +43 -6
  99. package/views/util.js +240 -11
  100. package/views/util.js.map +1 -1
  101. package/views/detail/ChangeRequest/transitions.d.ts +0 -28
  102. package/views/detail/ChangeRequest/transitions.js.map +0 -1
package/views/util.js CHANGED
@@ -11,7 +11,7 @@ Object.defineProperty(exports, "GenericRelatedItemView", {
11
11
  return _GenericRelatedItemView.GenericRelatedItemView;
12
12
  }
13
13
  });
14
- exports.TabContentsWithActions = exports._getRelatedClass = exports.Datestamp = exports.PropertyDetailView = exports.RegisterHelmet = void 0;
14
+ exports.FormGroupAsCardInGrid = exports.CardInGrid = exports.TabContentsWithHeader = exports.TabContentsWithActions = exports._getRelatedClass = exports.Datestamp = exports.PropertyDetailView = exports.RegisterHelmet = void 0;
15
15
 
16
16
  var _format = _interopRequireDefault(require("date-fns/format"));
17
17
 
@@ -23,8 +23,12 @@ var _react2 = require("@emotion/react");
23
23
 
24
24
  var _core = require("@blueprintjs/core");
25
25
 
26
+ var _popover = require("@blueprintjs/popover2");
27
+
26
28
  var _context = require("@riboseinc/paneron-extension-kit/context");
27
29
 
30
+ var _HelpTooltip = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/HelpTooltip"));
31
+
28
32
  var _GenericRelatedItemView = require("./GenericRelatedItemView");
29
33
 
30
34
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -51,22 +55,47 @@ const RegisterHelmet = (0, _react.memo)(function (props) {
51
55
  defaultTitle: `${datasetTitle} register`
52
56
  }, props.children);
53
57
  });
58
+ /**
59
+ * A wrapper to show property data with its label(s).
60
+ */
61
+
54
62
  exports.RegisterHelmet = RegisterHelmet;
55
63
 
56
64
  const PropertyDetailView = function ({
65
+ label,
66
+ labelInfo,
57
67
  title,
58
68
  secondaryTitle,
59
- inline,
60
- children,
61
- className
69
+ ...props
62
70
  }) {
63
71
  return (0, _react2.jsx)(_core.FormGroup, {
64
- label: `${title}:`,
65
- labelInfo: secondaryTitle,
66
- css: (0, _react2.css)`&, &.bp4-inline { label.bp4-label { font-weight: bold; line-height: unset } }`,
67
- className: className,
68
- inline: inline
69
- }, children);
72
+ label: label || title ? `${label !== null && label !== void 0 ? label : title}:` : undefined,
73
+ labelInfo: labelInfo !== null && labelInfo !== void 0 ? labelInfo : secondaryTitle,
74
+ css: (0, _react2.css)`
75
+ &, &.bp4-inline {
76
+ label.bp4-label {
77
+ /*
78
+ * Since it’s in flex container, label expands to fill its width,
79
+ * and due to the mechanics of how labels work (?)
80
+ * any button (e.g., for deletion) within labelInfo
81
+ * would responds to events of the entire label
82
+ * (meaning you can hover space to the right of the label and labelInfo
83
+ * and the button would still be clickable).
84
+ * This makes the label not fill flex container width.
85
+ */
86
+ align-self: flex-start;
87
+
88
+ font-weight: bold;
89
+ line-height: unset;
90
+ text-transform: capitalize;
91
+ .bp4-text-muted {
92
+ text-transform: none;
93
+ }
94
+ }
95
+ }
96
+ `,
97
+ ...props
98
+ });
70
99
  };
71
100
  /** Formats given date as a span with tooltip set to full ISO date & time. */
72
101
 
@@ -142,4 +171,204 @@ const TabContentsWithActions = function ({
142
171
  }, main));
143
172
  };
144
173
 
145
- exports.TabContentsWithActions = TabContentsWithActions;
174
+ exports.TabContentsWithActions = TabContentsWithActions;
175
+ const paddingPx = 11;
176
+
177
+ function findEnabledActions(props) {
178
+ return props.map(props => props.length !== undefined ? props.filter(p => !p.disabled) : !props.disabled ? props : []).flat();
179
+ }
180
+
181
+ const TabContentsWithHeader = function ({
182
+ title,
183
+ smallTitle,
184
+ classification,
185
+ actions,
186
+ className,
187
+ layout,
188
+ children
189
+ }) {
190
+ const hasClassification = (classification !== null && classification !== void 0 ? classification : []).length > 0;
191
+ const enabledActions = actions ? findEnabledActions(actions) : [];
192
+ const hasActions = enabledActions.length > 0; // if (enabledActions.length === 1 && !enabledActions[0].intent) {
193
+ // enabledActions[0].intent = 'primary';
194
+ // }
195
+
196
+ return (0, _react2.jsx)("div", {
197
+ css: (0, _react2.css)`
198
+ position: absolute; inset: 0;
199
+ padding-top: ${paddingPx}px;
200
+ ${hasActions ? `padding-bottom: ${paddingPx}px;` : ''}
201
+ display: flex; flex-flow: column nowrap;
202
+ gap: ${paddingPx}px;
203
+ `,
204
+ className: className
205
+ }, smallTitle ? (0, _react2.jsx)(_core.H4, {
206
+ css: (0, _react2.css)`margin: 0 ${paddingPx}px;`
207
+ }, title) : (0, _react2.jsx)(_core.H2, {
208
+ css: (0, _react2.css)`margin: 0 ${paddingPx}px;`
209
+ }, title), hasClassification ? (0, _react2.jsx)("div", {
210
+ css: (0, _react2.css)`
211
+ flex: 0;
212
+ margin: 0 ${paddingPx}px;
213
+ display: flex;
214
+ flex-flow: row wrap;
215
+ gap: ${paddingPx}px;
216
+ `
217
+ }, classification.map((p, idx) => (0, _react2.jsx)(_core.Tag, {
218
+ key: idx,
219
+ minimal: true,
220
+ ...p,
221
+ large: !smallTitle,
222
+ rightIcon: p.tooltip ? (0, _react2.jsx)(_HelpTooltip.default, { ...p.tooltip
223
+ }) : undefined
224
+ }))) : null, (0, _react2.jsx)("div", {
225
+ css: (0, _react2.css)`
226
+ position: relative;
227
+ flex: 1;
228
+ overflow-y: auto;
229
+
230
+ ${layout === undefined ? `
231
+ > :only-child { position: absolute; inset: 0 }
232
+ box-shadow: black 0 0 20px -10px;
233
+ ` : `
234
+ padding: 0 10px;
235
+ &::after, &::before {
236
+ pointer-events: none;
237
+ content: " ";
238
+ display: block;
239
+ position: sticky;
240
+ width: 100%;
241
+ height: 1px;
242
+ background: ${_core.Colors.GRAY5};
243
+ .bp4-dark & { background: ${_core.Colors.DARK_GRAY2}; }
244
+ z-index: 10;
245
+ }
246
+ &::before {
247
+ top: 0;
248
+ box-shadow: ${_core.Colors.GRAY5} 0 -20px 20px 20px;
249
+ .bp4-dark & {
250
+ box-shadow: ${_core.Colors.DARK_GRAY2} 0 -20px 20px 20px;
251
+ }
252
+ }
253
+ &::after {
254
+ bottom: 0;
255
+ box-shadow: ${_core.Colors.GRAY5} 0 20px 20px 20px;
256
+ .bp4-dark & {
257
+ box-shadow: ${_core.Colors.DARK_GRAY2} 0 20px 20px 20px;
258
+ }
259
+ }
260
+ `}
261
+
262
+ ${layout === 'scrollable' || layout === 'card-grid' ? `
263
+ background: ${_core.Colors.GRAY5};
264
+ .bp4-dark & { background: ${_core.Colors.DARK_GRAY2}; }
265
+ ` : ''}
266
+
267
+ ${layout === 'card-grid' ? `
268
+ display: flex;
269
+ flex-flow: row wrap;
270
+ align-content: flex-start;
271
+ align-items: flex-start;
272
+ gap: 10px;
273
+ ` : ''}
274
+ `
275
+ }, children), hasActions ? (0, _react2.jsx)("div", {
276
+ css: (0, _react2.css)`
277
+ margin: 0 ${paddingPx}px;
278
+ flex: 0; display: flex; flex-flow: row wrap; gap: ${paddingPx}px;
279
+ `
280
+ }, actions.map((props, idx) => {
281
+ if (props.hasOwnProperty('length') && props.length !== undefined) {
282
+ return (0, _react2.jsx)(_core.ButtonGroup, {
283
+ key: idx
284
+ }, props.map(p => (0, _react2.jsx)(Action, { ...p
285
+ })));
286
+ } else {
287
+ return (0, _react2.jsx)(Action, {
288
+ key: idx,
289
+ ...props
290
+ });
291
+ }
292
+ })) : null);
293
+ };
294
+ /** Mostly a button, but with an optional popup. */
295
+
296
+
297
+ exports.TabContentsWithHeader = TabContentsWithHeader;
298
+
299
+ const Action = function ({
300
+ popup,
301
+ tooltip,
302
+ ...props
303
+ }) {
304
+ const btn = (0, _react2.jsx)(_core.Button, { ...props,
305
+ intent: props.disabled ? undefined : props.intent,
306
+ onClick: props.disabled ? undefined : props.onClick,
307
+ disabled: props.active ? false : props.disabled,
308
+ title: tooltip,
309
+ rightIcon: popup ? 'more' : undefined
310
+ });
311
+
312
+ if (popup && !props.disabled) {
313
+ return (0, _react2.jsx)(_popover.Popover2, {
314
+ content: popup,
315
+ placement: "top",
316
+ minimal: true,
317
+ interactionKind: "click"
318
+ }, btn);
319
+ } else {
320
+ return btn;
321
+ }
322
+ };
323
+
324
+ const CardInGrid = function ({
325
+ description,
326
+ className,
327
+ children
328
+ }) {
329
+ return (0, _react2.jsx)(_core.Card, {
330
+ css: (0, _react2.css)`border-radius: 5px;`,
331
+ title: description,
332
+ className: `${_core.Classes.ELEVATION_3} ${className !== null && className !== void 0 ? className : ''}`
333
+ }, children);
334
+ };
335
+ /** Useful in case of tab “card-grid” layout. */
336
+
337
+
338
+ exports.CardInGrid = CardInGrid;
339
+
340
+ const FormGroupAsCardInGrid = function ({
341
+ paddingPx,
342
+ ...props
343
+ }) {
344
+ const paddingPx_ = paddingPx !== null && paddingPx !== void 0 ? paddingPx : 11;
345
+ return (0, _react2.jsx)(_core.FormGroup, { ...props,
346
+ css: (0, _react2.css)`
347
+ margin: 0;
348
+
349
+ border-radius: 5px;
350
+ padding: ${paddingPx_}px;
351
+
352
+ > label.bp4-label {
353
+ font-weight: bold;
354
+ margin-bottom: ${paddingPx_}px;
355
+ }
356
+ > .bp4-form-content {
357
+ display: flex;
358
+ flex-flow: column nowrap;
359
+ gap: ${paddingPx_}px;
360
+
361
+ > .bp4-form-group {
362
+ margin: 0;
363
+ }
364
+ }
365
+
366
+ /* Note: these colors are picked to work with some form widgets, date input widget specifically. */
367
+ background: ${_core.Colors.WHITE};
368
+ .bp4-dark & { background: ${_core.Colors.DARK_GRAY3}; }
369
+ `,
370
+ className: _core.Classes.ELEVATION_3
371
+ });
372
+ };
373
+
374
+ exports.FormGroupAsCardInGrid = FormGroupAsCardInGrid;
package/views/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/views/util.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,iCAAiC;AACjC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAc,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,MAAM,EAAe,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAkB,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,YAAoB,EAAE;IAEtB,OAAO,GAAG,CAAC,MAAM,GAAG,SAAS;QAC3B,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;QAC/B,CAAC,CAAC,GAAG,CAAC;AACV,CAAC;AAGD,MAAM,CAAC,MAAM,cAAc,GAA0B,IAAI,CAAC,UAAU,KAAK;IACvE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAE3D,OAAO,CACL,IAAC,MAAM,IACH,aAAa,EAAE,SAAS,YAAY,WAAW,EAC/C,YAAY,EAAE,GAAG,YAAY,WAAW,IACzC,KAAK,CAAC,QAAQ,CACR,CACV,CAAC;AACJ,CAAC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,kBAAkB,GAK1B,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE;IACnE,OAAO,CACL,IAAC,SAAS,IACN,KAAK,EAAE,GAAG,KAAK,GAAG,EAClB,SAAS,EAAE,cAAc,EACzB,GAAG,EAAE,GAAG,CAAA,+EAA+E,EACvF,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,IACf,QAAQ,CACC,CACb,CAAC;AACJ,CAAC,CAAC;AAGF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,SAAS,GAIjB,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;;IACvC,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,cACH,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,EAAE,mCAAI,KAAK,EAAE,IAClE,QAAQ,CACJ,CAAC;AACV,CAAC,CAAC;AAGF,wCAAwC;AACxC,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,IAAI;QACF,OAAO,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;KACnC;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,iBAAiB,CAAC,GAAG,CAAC;KAC9B;AACH,CAAC;AAGD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAoD,EAAE,EAAE;IACvF,OAAO,CAAC,KAAa,EAAiC,EAAE;QACtD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK;YACrB,4DAA4D;YAC5D,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,YAAY;SACjC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAGF;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAI9B,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;IACzC,OAAO,CACL,aAAK,GAAG,EAAE,GAAG,CAAA;;;KAGZ,EAAE,SAAS,EAAE,SAAS;QACrB,aAAK,GAAG,EAAE,GAAG,CAAA,wEAAwE,IAClF,OAAO,CACJ;QACN,aAAK,GAAG,EAAE,GAAG,CAAA;;;;;sBAKG,MAAM,CAAC,KAAK;oCACE,MAAM,CAAC,UAAU;OAC9C,IACE,IAAI,CACD,CACF,CACP,CAAA;AACH,CAAC,CAAA","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\n//import log from 'electron-log';\nimport format from 'date-fns/format';\nimport React, { memo, useContext } from 'react';\nimport { Helmet, HelmetProps } from 'react-helmet';\nimport { css, jsx } from '@emotion/react';\nimport { FormGroup, FormGroupProps, Colors } from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { ItemClassConfiguration, RelatedItemClassConfiguration } from '../types';\nexport { GenericRelatedItemView } from './GenericRelatedItemView';\n\n\n/**\n * Get give string truncated & with ellipsis appended\n * if its length exceeds given number of characters.\n */\nexport function maybeEllipsizeString(\n str: string,\n maxLength: number = 20,\n): string {\n return str.length > maxLength\n ? `${str.slice(0, maxLength)}…`\n : str;\n}\n\n\nexport const RegisterHelmet: React.FC<HelmetProps> = memo(function (props) {\n const { title: datasetTitle } = useContext(DatasetContext);\n\n return (\n <Helmet\n titleTemplate={`%s in ${datasetTitle} register`}\n defaultTitle={`${datasetTitle} register`}>\n {props.children}\n </Helmet>\n );\n});\n\n\nexport const PropertyDetailView: React.FC<{\n title: FormGroupProps[\"label\"]\n secondaryTitle?: FormGroupProps[\"labelInfo\"]\n inline?: FormGroupProps[\"inline\"]\n className?: string\n}> = function ({ title, secondaryTitle, inline, children, className }) {\n return (\n <FormGroup\n label={`${title}:`}\n labelInfo={secondaryTitle}\n css={css`&, &.bp4-inline { label.bp4-label { font-weight: bold; line-height: unset } }`}\n className={className}\n inline={inline}>\n {children}\n </FormGroup>\n );\n};\n\n\n/** Formats given date as a span with tooltip set to full ISO date & time. */\nexport const Datestamp: React.FC<{\n date: Date\n title?: string\n className?: string\n}> = function ({ date, title, className }) {\n const asString = formatDate(date);\n return <span\n className={className}\n title={`${title ? `${title}: ` : ''}${date?.toString() ?? 'N/A'}`}>\n {asString}\n </span>;\n};\n\n\n/** Foramts given date as plain text. */\nexport function formatDate(date: Date): string {\n try {\n return format(date, 'yyyy-MM-dd');\n } catch (e) {\n return `Invalid date (${e})`;\n }\n}\n\n\nexport const _getRelatedClass = (classes: Record<string, ItemClassConfiguration<any>>) => {\n return (clsID: string): RelatedItemClassConfiguration => {\n const cfg = classes[clsID];\n return {\n title: cfg.meta.title,\n // TODO: The itemView/listItemView inconsistency is annoying\n itemView: cfg.views.listItemView,\n };\n };\n};\n\n\n/**\n * Suitable for use as tab contents for TabbedWorkspace.\n * Provides top bar with actions and main content.\n */\nexport const TabContentsWithActions: React.FC<{\n actions: JSX.Element;\n main: JSX.Element;\n className?: string;\n}> = function ({ actions, main, className }) {\n return (\n <div css={css`\n position: absolute; inset: 0;\n display: flex; flex-flow: column nowrap;\n `} className={className}>\n <div css={css`flex: 0; padding: 10px; display: flex; flex-flow: row wrap; gap: 10px;`}>\n {actions}\n </div>\n <div css={css`\n position: relative;\n flex: 1;\n padding: 10px;\n overflow-y: auto;\n background: ${Colors.GRAY5};\n .bp4-dark & { background: ${Colors.DARK_GRAY2}; }\n `}>\n {main}\n </div>\n </div>\n )\n}\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/views/util.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\n//import log from 'electron-log';\nimport format from 'date-fns/format';\nimport React, { memo, useContext } from 'react';\nimport { Helmet, type HelmetProps } from 'react-helmet';\nimport { css, jsx } from '@emotion/react';\nimport {\n Card,\n Classes,\n FormGroup, type FormGroupProps,\n H2, H4,\n Button as BaseButton, type ButtonProps,\n ButtonGroup,\n Tag, type TagProps,\n Colors,\n} from '@blueprintjs/core';\nimport { Popover2 as Popover } from '@blueprintjs/popover2';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport HelpTooltip, { type HelpTooltipProps } from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport type { ItemClassConfiguration, RelatedItemClassConfiguration } from '../types';\nexport { GenericRelatedItemView } from './GenericRelatedItemView';\n\n\n/**\n * Get give string truncated & with ellipsis appended\n * if its length exceeds given number of characters.\n */\nexport function maybeEllipsizeString(\n str: string,\n maxLength: number = 20,\n): string {\n return str.length > maxLength\n ? `${str.slice(0, maxLength)}…`\n : str;\n}\n\n\nexport const RegisterHelmet: React.FC<HelmetProps> = memo(function (props) {\n const { title: datasetTitle } = useContext(DatasetContext);\n\n return (\n <Helmet\n titleTemplate={`%s in ${datasetTitle} register`}\n defaultTitle={`${datasetTitle} register`}>\n {props.children}\n </Helmet>\n );\n});\n\n\n/**\n * A wrapper to show property data with its label(s).\n */\nexport const PropertyDetailView: React.FC<FormGroupProps & {\n /** @deprecated use `label` instead */\n title?: FormGroupProps[\"label\"]\n /** @deprecated use `labelInfo` instead */\n secondaryTitle?: FormGroupProps[\"labelInfo\"]\n}> = function ({\n label, labelInfo,\n title, secondaryTitle,\n ...props }) {\n return (\n <FormGroup\n label={label || title ? `${label ?? title}:` : undefined}\n labelInfo={labelInfo ?? secondaryTitle}\n css={css`\n &, &.bp4-inline {\n label.bp4-label {\n /*\n * Since it’s in flex container, label expands to fill its width,\n * and due to the mechanics of how labels work (?)\n * any button (e.g., for deletion) within labelInfo\n * would responds to events of the entire label\n * (meaning you can hover space to the right of the label and labelInfo\n * and the button would still be clickable).\n * This makes the label not fill flex container width.\n */\n align-self: flex-start;\n\n font-weight: bold;\n line-height: unset;\n text-transform: capitalize;\n .bp4-text-muted {\n text-transform: none;\n }\n }\n }\n `}\n {...props}\n />\n );\n};\n\n\n/** Formats given date as a span with tooltip set to full ISO date & time. */\nexport const Datestamp: React.FC<{\n date: Date\n title?: string\n className?: string\n}> = function ({ date, title, className }) {\n const asString = formatDate(date);\n return <span\n className={className}\n title={`${title ? `${title}: ` : ''}${date?.toString() ?? 'N/A'}`}>\n {asString}\n </span>;\n};\n\n\n/** Foramts given date as plain text. */\nexport function formatDate(date: Date): string {\n try {\n return format(date, 'yyyy-MM-dd');\n } catch (e) {\n return `Invalid date (${e})`;\n }\n}\n\n\nexport const _getRelatedClass = (classes: Record<string, ItemClassConfiguration<any>>) => {\n return (clsID: string): RelatedItemClassConfiguration => {\n const cfg = classes[clsID];\n return {\n title: cfg.meta.title,\n // TODO: The itemView/listItemView inconsistency is annoying\n itemView: cfg.views.listItemView,\n };\n };\n};\n\n\n/**\n * Suitable for use as tab contents for TabbedWorkspace.\n * Provides top bar with actions and main content.\n */\nexport const TabContentsWithActions: React.FC<{\n actions: JSX.Element;\n main: JSX.Element;\n className?: string;\n}> = function ({ actions, main, className }) {\n return (\n <div css={css`\n position: absolute; inset: 0;\n display: flex; flex-flow: column nowrap;\n `} className={className}>\n <div css={css`flex: 0; padding: 10px; display: flex; flex-flow: row wrap; gap: 10px;`}>\n {actions}\n </div>\n <div css={css`\n position: relative;\n flex: 1;\n padding: 10px;\n overflow-y: auto;\n background: ${Colors.GRAY5};\n .bp4-dark & { background: ${Colors.DARK_GRAY2}; }\n `}>\n {main}\n </div>\n </div>\n );\n};\n\n\nexport type ClassificationEntry = TagProps & { tooltip?: HelpTooltipProps };\nexport interface TabContentsWithHeaderProps {\n title: JSX.Element | string\n smallTitle?: boolean\n classification?: ClassificationEntry[]\n actions?: (ActionProps | ActionProps[])[]\n tooltip?: HelpTooltipProps\n className?: string\n\n /**\n * CSS to apply to child contents wrapper div.\n *\n * If 'card-grid', children would be expected to be cards\n * (e.g., `FormGroupAsCardInGrid` or `CardInGrid`)\n *\n * 'card-grid' implies 'scrollable'.\n */\n layout?: undefined | 'card-grid' | 'scrollable'\n}\nconst paddingPx = 11;\nfunction findEnabledActions\n<T extends ButtonProps | ButtonProps[] = ButtonProps | ButtonProps[]>\n(props: T[]): ButtonProps[] {\n return props.map(props =>\n (props as ButtonProps[]).length !== undefined\n ? (props as ButtonProps[]).filter(p => !p.disabled)\n : !(props as ButtonProps).disabled\n ? props\n : []\n ).flat();\n}\nexport const TabContentsWithHeader: React.FC<TabContentsWithHeaderProps> =\nfunction ({ title, smallTitle, classification, actions, className, layout, children }) {\n const hasClassification = (classification ?? []).length > 0;\n\n const enabledActions = actions ? findEnabledActions(actions) : [];\n const hasActions = enabledActions.length > 0;\n\n // if (enabledActions.length === 1 && !enabledActions[0].intent) {\n // enabledActions[0].intent = 'primary';\n // }\n\n return (\n <div css={css`\n position: absolute; inset: 0;\n padding-top: ${paddingPx}px;\n ${hasActions ? `padding-bottom: ${paddingPx}px;` : ''}\n display: flex; flex-flow: column nowrap;\n gap: ${paddingPx}px;\n `} className={className}>\n {smallTitle\n ? <H4 css={css`margin: 0 ${paddingPx}px;`}>{title}</H4>\n : <H2 css={css`margin: 0 ${paddingPx}px;`}>{title}</H2>}\n {hasClassification\n ? <div css={css`\n flex: 0;\n margin: 0 ${paddingPx}px;\n display: flex;\n flex-flow: row wrap;\n gap: ${paddingPx}px;\n `}>\n {classification!.map((p, idx) =>\n <Tag\n key={idx}\n minimal\n {...p}\n large={!smallTitle}\n rightIcon={p.tooltip\n ? <HelpTooltip {...p.tooltip} />\n : undefined}\n />\n )}\n </div>\n : null}\n <div css={css`\n position: relative;\n flex: 1;\n overflow-y: auto;\n\n ${layout === undefined\n ? `\n > :only-child { position: absolute; inset: 0 }\n box-shadow: black 0 0 20px -10px;\n `\n : `\n padding: 0 10px;\n &::after, &::before {\n pointer-events: none;\n content: \" \";\n display: block;\n position: sticky;\n width: 100%;\n height: 1px;\n background: ${Colors.GRAY5};\n .bp4-dark & { background: ${Colors.DARK_GRAY2}; }\n z-index: 10;\n }\n &::before {\n top: 0;\n box-shadow: ${Colors.GRAY5} 0 -20px 20px 20px;\n .bp4-dark & {\n box-shadow: ${Colors.DARK_GRAY2} 0 -20px 20px 20px;\n }\n }\n &::after {\n bottom: 0;\n box-shadow: ${Colors.GRAY5} 0 20px 20px 20px;\n .bp4-dark & {\n box-shadow: ${Colors.DARK_GRAY2} 0 20px 20px 20px;\n }\n }\n `}\n\n ${layout === 'scrollable' || layout === 'card-grid'\n ? `\n background: ${Colors.GRAY5};\n .bp4-dark & { background: ${Colors.DARK_GRAY2}; }\n `\n : ''}\n\n ${layout === 'card-grid'\n ? `\n display: flex;\n flex-flow: row wrap;\n align-content: flex-start;\n align-items: flex-start;\n gap: 10px;\n `\n : ''}\n `}>\n {children}\n </div>\n\n {hasActions\n ? <div css={css`\n margin: 0 ${paddingPx}px;\n flex: 0; display: flex; flex-flow: row wrap; gap: ${paddingPx}px;\n `}>\n {actions!.map((props, idx) => {\n if (props.hasOwnProperty('length') && (props as ButtonProps[]).length !== undefined) {\n return (\n <ButtonGroup key={idx}>\n {(props as ButtonProps[]).map(p =>\n <Action {...p} />\n )}\n </ButtonGroup>\n );\n } else {\n return <Action key={idx} {...(props as ButtonProps)} />;\n }\n })}\n </div>\n : null}\n </div>\n );\n};\n\n\nexport type ActionProps = ButtonProps & ({ popup?: JSX.Element, tooltip?: string });\n/** Mostly a button, but with an optional popup. */\nconst Action: React.FC<ActionProps> = function ({ popup, tooltip, ...props }) {\n const btn = <BaseButton\n {...props}\n intent={props.disabled ? undefined : props.intent}\n onClick={props.disabled ? undefined : props.onClick}\n disabled={props.active ? false : props.disabled}\n title={tooltip}\n rightIcon={popup ? 'more' : undefined}\n />;\n\n if (popup && !props.disabled) {\n return (\n <Popover content={popup} placement=\"top\" minimal interactionKind=\"click\">\n {btn}\n </Popover>\n );\n } else {\n return btn;\n }\n};\n\n\nexport const CardInGrid: React.FC<{ description: string, className?: string }> = function ({ description, className, children }) {\n return (\n <Card\n css={css`border-radius: 5px;`}\n title={description}\n className={`${Classes.ELEVATION_3} ${className ?? ''}`}>\n {children}\n </Card>\n );\n};\n\n\n/** Useful in case of tab “card-grid” layout. */\nexport const FormGroupAsCardInGrid: React.FC<FormGroupProps & { paddingPx?: number }> =\nfunction ({ paddingPx, ...props }) {\n const paddingPx_ = paddingPx ?? 11;\n return (\n <FormGroup\n {...props}\n css={css`\n margin: 0;\n\n border-radius: 5px;\n padding: ${paddingPx_}px;\n\n > label.bp4-label {\n font-weight: bold;\n margin-bottom: ${paddingPx_}px;\n }\n > .bp4-form-content {\n display: flex;\n flex-flow: column nowrap;\n gap: ${paddingPx_}px;\n\n > .bp4-form-group {\n margin: 0;\n }\n }\n\n /* Note: these colors are picked to work with some form widgets, date input widget specifically. */\n background: ${Colors.WHITE};\n .bp4-dark & { background: ${Colors.DARK_GRAY3}; }\n `}\n className={Classes.ELEVATION_3}\n />\n );\n};\n"]}
@@ -1,28 +0,0 @@
1
- /** @jsx jsx */
2
- /** @jsxFrag React.Fragment */
3
- import React from 'react';
4
- import { Intent } from '@blueprintjs/core';
5
- import type { RegisterStakeholder } from '../../../types';
6
- import * as CR from '../../../types/cr';
7
- export declare const TransitionOptions: React.FC<{
8
- cr: CR.Base;
9
- className?: string;
10
- }>;
11
- export declare function getPastTransitions(cr: CR.Base): [key: string, el: JSX.Element][];
12
- declare type PossibleTransitionForCR<CR extends CR.Base> = [
13
- targetState: CR.StateType,
14
- cfg: CR.TransitionConfig<CR, CR.SomeCR, any>
15
- ];
16
- /**
17
- * Returns a list of transitions
18
- * that can be performed on given CR by given stakeholder.
19
- */
20
- export declare function getTransitions<CR extends CR.Base>(cr: CR, stakeholder: RegisterStakeholder): PossibleTransitionForCR<CR>[];
21
- /**
22
- * Returns True if there is no possible transition for given state.
23
- */
24
- export declare function isFinalState(state: CR.StateType): boolean;
25
- export declare const STATE_INTENT: {
26
- [key in CR.StateType]?: Intent;
27
- };
28
- export {};
@@ -1 +0,0 @@
1
- {"version":3,"file":"transitions.js","sourceRoot":"","sources":["../../../../src/views/detail/ChangeRequest/transitions.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useEffect, useMemo, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Button, RadioGroup, Radio, FormGroup, TextArea, TextAreaProps, Intent } from '@blueprintjs/core';\nimport { Tooltip2 as Tooltip } from '@blueprintjs/popover2';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\nimport type { ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport type { RegisterItem, RegisterStakeholder, Supersession } from '../../../types';\nimport { itemPathInCR, crIDToCRPath } from '../../itemPathUtils';\nimport * as CR from '../../../types/cr';\nimport { proposalsToObjectChangeset } from '../../change-request/objectChangeset';\n\n\ninterface State {\n chosenNextState?: CR.StateType;\n\n /**\n * Can contain any fields. Upon transition,\n * they will be validated against selected `chosenNextState`.\n */\n stateInput: Partial<CR.StateInput>;\n}\n\ntype Action =\n | { type: 'unset-next-state' }\n | { type: 'choose-next-state'; payload: { state: CR.StateType } }\n | { type: 'update-next-state-input'; payload: Record<string, any> }\n\n//export const TransitionOptions: C extends CR.Base ? C[\"state\"] extends keyof CR.Transitions ? React.FC<{ cr: CR.Base }> : never : never = function ({ cr }) {\nexport const TransitionOptions: React.FC<{ cr: CR.Base, className?: string }> =\nfunction ({ cr, className }) {\n const { stakeholder, subregisters } = useContext(BrowserCtx);\n const {\n getObjectData,\n updateObjects,\n performOperation,\n operationKey,\n usePersistentDatasetStateReducer,\n } = useContext(DatasetContext);\n\n const isBusy = operationKey !== undefined;\n\n const transitions = useMemo((\n () => stakeholder\n ? getTransitions(cr, stakeholder)\n : []\n ), [\n JSON.stringify(stakeholder),\n // IMPORTANT: Below two dependencies arise\n // from within `getTransitions()` implementation, which in turn\n // further depends on individual transitions.\n cr.state,\n cr.submittingStakeholderGitServerUsername,\n ]);\n\n const initialState: State = useMemo((() => ({\n // Pre-select next state to first available transition\n chosenNextState: transitions.length > 0\n ? transitions[0][0]\n : undefined,\n stateInput: {},\n })), [transitions]);\n\n const [ state, dispatch, stateRecalled ] =\n (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)(\n `${cr.id}-${cr.state}`,\n undefined,\n undefined,\n (prevState, action) => {\n switch (action.type) {\n case 'unset-next-state':\n return {\n ...prevState,\n chosenNextState: undefined,\n };\n case 'choose-next-state':\n return {\n ...prevState,\n chosenNextState: action.payload.state,\n };\n case 'update-next-state-input':\n return {\n ...prevState,\n stateInput: action.payload,\n };\n default:\n throw new Error(\"Unexpected state\");\n }\n },\n initialState,\n null);\n\n const selectedTransitionCfg = useMemo((() =>\n (\n stateRecalled && state.chosenNextState\n ? transitions.find(([t, ]) => t === state.chosenNextState)?.[1]\n : undefined\n ) ?? undefined\n ), [stateRecalled, state.chosenNextState, transitions]);\n\n useEffect(() => {\n if (stateRecalled && state.chosenNextState) {\n if (!selectedTransitionCfg) {\n dispatch({ type: 'unset-next-state' });\n }\n }\n }, [\n stateRecalled,\n state.chosenNextState,\n selectedTransitionCfg,\n ]);\n\n const [validatedStateInput, stateInputValidationErrors]:\n [CR.StateInput, undefined] | [undefined, string] =\n useMemo(() => {\n if (cr && selectedTransitionCfg) {\n try {\n selectedTransitionCfg.func(cr, state.stateInput);\n } catch (e) {\n return [undefined, (e as any).message ?? `${e}`];\n }\n return [state.stateInput as CR.StateInput, undefined];\n } else {\n return [undefined, \"no CR or no transition selected\"];\n }\n }, [JSON.stringify(cr), selectedTransitionCfg, state.stateInput]);\n\n const getItemChangesetAsApproved = useCallback(\n async function (cr: CR.Accepted | CR.AcceptedOnAppeal): Promise<ObjectChangeset> {\n const origItemData = (await getObjectData({\n objectPaths: [\n ...Object.entries(cr.items).\n filter(([, prop]) => prop.type !== 'addition').\n map(([itemPath, ]) => itemPath),\n ...Object.values(cr.items).\n filter(prop => prop.type === 'amendment' && prop.amendmentType === 'supersession').\n flatMap(prop => (prop as Supersession).supersedingItemIDs),\n ],\n })).data as Record<string, RegisterItem<any> | null>;\n //console.debug(\"Got orig item data\", origItemData);\n const newItemData = (await getObjectData({\n objectPaths: Object.entries(cr.items).\n filter(([, prop]) => prop.type === 'clarification' || prop.type === 'addition').\n map(([itemPath, ]) => itemPathInCR(itemPath, cr.id)),\n })).data as Record<string, RegisterItem<any> | null>;\n //console.debug(\"Got new item data\", newItemData);\n return await proposalsToObjectChangeset(\n cr.id,\n subregisters !== undefined,\n cr.items,\n origItemData,\n newItemData);\n }, [cr.id, JSON.stringify(cr.items), subregisters === undefined, getObjectData]);\n\n const handleTransition = useCallback(\n async function (transitionCfg: typeof selectedTransitionCfg, stateInput: CR.StateInput) {\n if (transitionCfg && updateObjects && stakeholder && transitionCfg.canBeTransitionedBy(stakeholder, cr)) {\n const newCR = {\n ...(transitionCfg.func(cr, stateInput) as Omit<CR.SomeCR, 'state'>),\n state: transitionCfg.targetState,\n };\n //console.debug(\"Transitioning CR\", JSON.stringify(cr), JSON.stringify(newCR));\n const changeset: ObjectChangeset = {\n [crIDToCRPath(cr.id)]: {\n oldValue: cr,\n newValue: newCR,\n },\n };\n if (CR.isAccepted(newCR) || CR.isAcceptedOnAppeal(newCR)) {\n Object.assign(changeset, await getItemChangesetAsApproved(newCR));\n }\n await updateObjects({\n commitMessage: `${transitionCfg.title} CR`,\n objectChangeset: changeset,\n });\n } else {\n throw new Error(\"Either transition is not specified or dataset is read-only\");\n }\n }, [updateObjects, JSON.stringify(stakeholder), JSON.stringify(cr)]);\n\n const canTransition = selectedTransitionCfg !== undefined && !isBusy && validatedStateInput !== undefined;\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className}>\n {transitions.length > 0\n ? <RadioGroup\n selectedValue={state.chosenNextState}\n onChange={(evt) => CR.isState(evt.currentTarget.value)\n ? dispatch({\n type: 'choose-next-state',\n payload: { state: evt.currentTarget.value },\n })\n : void 0}>\n {transitions.map(([state, cfg]) => \n <Radio\n key={state}\n label={cfg.title}\n value={state}\n disabled={isBusy}\n large\n />\n )}\n </RadioGroup>\n : null}\n {selectedTransitionCfg?.Widget\n ? <Tooltip\n isOpen={stateInputValidationErrors !== undefined}\n placement='bottom'\n targetTagName='div'\n intent='warning'\n content={<>{stateInputValidationErrors}</>}>\n <selectedTransitionCfg.Widget\n value={Object.keys(state.stateInput).length > 0\n ? state.stateInput\n : cr}\n onChange={!isBusy\n ? (payload) => dispatch({\n type: 'update-next-state-input',\n payload,\n })\n : undefined}\n />\n </Tooltip>\n : null}\n {selectedTransitionCfg\n ? <Button\n disabled={!canTransition}\n intent={canTransition ? 'primary' : undefined}\n onClick={() =>\n validatedStateInput\n ? performOperation('transitioning CR state', handleTransition)\n (selectedTransitionCfg, validatedStateInput)\n : void 0\n }>\n {selectedTransitionCfg.title}\n </Button>\n : null}\n </div>\n );\n};\n\n\nexport function getPastTransitions(cr: CR.Base): [key: string, el: JSX.Element][] {\n const els: [key: string, el: JSX.Element][] = [];\n if (CR.hasSubmitterInput(cr)) {\n els.push(['Submitter’s justification', <>{cr.justification}</>]);\n }\n if (CR.hasRegisterManagerInput(cr)) {\n els.push(['Register manager’s notes', <>{cr.registerManagerNotes}</>]);\n }\n if (CR.hasControlBodyInput(cr)) {\n els.push(['Control body decision', <>{cr.controlBodyNotes}</>]);\n }\n if (CR.hasAppealRequest(cr)) {\n els.push(['Reason for appeal', <>{cr.appealReason}</>]);\n }\n if (CR.hasRegisterOwnerInput(cr)) {\n els.push(['Register owner notes', <>{cr.registerOwnerNotes}</>]);\n }\n return els;\n}\n\n//export const PastTransitions: React.FC<{ cr: CR.Base }> = function ({ cr }) {\n// const els: JSX.Element[] = [];\n// if (CR.hasSubmitterInput(cr)) {\n// els.push(<SubmitterInputWidget value={cr} />);\n// }\n// if (CR.hasRegisterManagerInput(cr)) {\n// els.push(<RegisterManagerNotesWidget value={cr} />);\n// }\n// if (CR.hasControlBodyInput(cr)) {\n// els.push(<ControlBodyNotesWidget value={cr} />);\n// }\n// if (CR.hasAppealRequest(cr)) {\n// els.push(<AppealRequestWidget value={cr} />);\n// }\n// if (CR.hasRegisterOwnerInput(cr)) {\n// els.push(<RegisterOwnerNotesWidget value={cr} />);\n// }\n// return <>{els}</>;\n//}\n\n\ntype PossibleTransitionForCR<CR extends CR.Base> = [\n targetState: CR.StateType,\n cfg: CR.TransitionConfig<CR, CR.SomeCR, any>,\n];\n\n/**\n * Returns a list of transitions\n * that can be performed on given CR by given stakeholder.\n */\nexport function getTransitions<CR extends CR.Base>(\n cr: CR,\n stakeholder: RegisterStakeholder,\n): PossibleTransitionForCR<CR>[] {\n const possibleTransitions = TRANSITIONS[cr.state as keyof CR.Transitions];\n if (possibleTransitions) {\n return (\n (Object.entries(possibleTransitions) as PossibleTransitionForCR<CR>[]).\n filter(([, t]) => t.canBeTransitionedBy(stakeholder, cr))\n );\n } else {\n return [];\n }\n}\n\n\n/**\n * Returns True if there is no possible transition for given state.\n */\nexport function isFinalState(state: CR.StateType): boolean {\n return (Object.keys(TRANSITIONS[state as keyof CR.Transitions] ?? {})).length < 1;\n}\n\n\nconst applyRegisterManagerDecision: CR.Transition<\n CR.Proposed,\n CR.SubmittedForControlBodyReview\n| CR.ReturnedForClarificationByManager,\n CR.RegisterManagerInput> =\nfunction applyRegisterManagerDecision (cr, { registerManagerNotes }) {\n return {\n ...cr,\n registerManagerNotes: registerManagerNotes ?? '',\n };\n}\n\n\nconst applyControlBodyDecision: CR.Transition<\n CR.SubmittedForControlBodyReview,\n CR.Accepted\n| CR.Rejected\n| CR.ReturnedForClarificationByControlBody,\n CR.ControlBodyInput> =\nfunction applyControlBodyDecision (cr, { controlBodyNotes }) {\n if (!controlBodyNotes?.trim()) {\n throw new Error(\"Control body decision is required.\");\n }\n return {\n ...cr,\n controlBodyNotes,\n };\n}\n\n\nconst applyAppeal: CR.Transition<\n CR.Rejected,\n CR.Appealed,\n CR.AppealRequest> =\nfunction applyAppeal (cr, { appealReason }) {\n if (!appealReason?.trim()) {\n throw new Error(\"Appeal reason is required.\");\n }\n return {\n ...cr,\n appealReason,\n timeDisposed: undefined,\n };\n}\n\n\nconst applyRegisterOwnerDecision: CR.Transition<\n CR.Appealed,\n CR.AcceptedOnAppeal\n| CR.RejectionUpheld,\n CR.RegisterOwnerInput> =\nfunction applyRegisterOwnerDecision (cr, { registerOwnerNotes }) {\n if (!registerOwnerNotes?.trim()) {\n throw new Error(\"Register owner note is required.\");\n }\n return {\n ...cr,\n registerOwnerNotes,\n timeDisposed: new Date(),\n };\n}\n\n\nconst WITHDRAWAL_TRANSITION:\nCR.TransitionConfig<CR.Withdrawable, CR.Withdrawn, null> = {\n title: \"Withdraw\",\n targetState: CR.State.WITHDRAWN,\n Widget: null,\n canBeTransitionedBy: (stakeholder, cr) => cr.timeProposed && CR.isSubmittedBy(stakeholder, cr),\n func: (cr: CR.Withdrawable) => ({\n ...cr,\n timeDisposed: new Date(),\n }),\n} as const;\n\n\nconst SubmitterInputWidget: React.FC<{\n value: CR.SubmitterInput\n onChange?: (newVal: CR.SubmitterInput) => void\n}> = function ({ value, onChange }) {\n return (\n <FormGroup label=\"Justification:\">\n <TransitionInputTextArea\n required\n value={value.justification}\n onChange={(evt) =>\n onChange?.({ justification: evt.currentTarget.value })\n }\n />\n </FormGroup>\n );\n};\n\n\nconst TransitionInputTextArea: React.FC<TextAreaProps> = function (props) {\n return <TextArea\n fill\n css={css`resize: vertical;`}\n readOnly={!props.onChange}\n {...props}\n />;\n};\n\n\nconst PROPOSAL_TRANSITION:\nCR.TransitionConfig<CR.Proposable, CR.Proposed, CR.SubmitterInput> = {\n title: \"Propose\",\n targetState: CR.State.PROPOSED,\n canBeTransitionedBy: ((stakeholder, cr) =>\n CR.isSubmittedBy(stakeholder, cr) && Object.keys(cr.items).length > 0\n ),\n Widget: SubmitterInputWidget,\n func: (cr, submitterInput) => {\n if (!submitterInput?.justification?.trim()) {\n throw new Error(\"Justification is required.\");\n }\n return {\n ...cr,\n ...submitterInput,\n timeProposed: new Date(),\n }\n },\n}\n\n\nconst RegisterManagerNotesWidget: React.FC<{\n value: CR.RegisterManagerInput\n onChange?: (newVal: CR.RegisterManagerInput) => void\n}> = function ({ value, onChange }) {\n return (\n <FormGroup label=\"Register manager notes:\">\n <TransitionInputTextArea\n value={value.registerManagerNotes}\n required\n onChange={evt =>\n onChange?.({ registerManagerNotes: evt.currentTarget.value })\n }\n />\n </FormGroup>\n );\n};\n\n\nconst ControlBodyNotesWidget: React.FC<{\n value: CR.ControlBodyInput\n onChange?: (newVal: CR.ControlBodyInput) => void\n}> = function ({ value, onChange }) {\n return (\n <FormGroup label=\"Control body decision:\">\n <TransitionInputTextArea\n value={value.controlBodyNotes}\n required\n onChange={evt =>\n onChange?.({\n controlBodyNotes: evt.currentTarget.value,\n })\n }\n />\n </FormGroup>\n );\n};\n\n\nconst AppealRequestWidget: React.FC<{\n value: CR.AppealRequest\n onChange?: (newVal: CR.AppealRequest) => void\n}> = function ({ value, onChange }) {\n return (\n <FormGroup label=\"Appeal reasoning:\">\n <TransitionInputTextArea\n value={value.appealReason}\n required\n onChange={evt =>\n onChange?.({ appealReason: evt.currentTarget.value })\n }\n />\n </FormGroup>\n );\n};\n\n\nconst RegisterOwnerNotesWidget: React.FC<{\n value: CR.RegisterOwnerInput\n onChange?: (newVal: CR.RegisterOwnerInput) => void\n}> = function ({ value, onChange }) {\n return (\n <FormGroup label=\"Register owner notes:\">\n <TransitionInputTextArea\n value={value.registerOwnerNotes}\n required\n onChange={evt =>\n onChange?.({ registerOwnerNotes: evt.currentTarget.value })\n }\n />\n </FormGroup>\n );\n};\n\n\nexport const STATE_INTENT: { [key in CR.StateType]?: Intent } = {\n [CR.State.PROPOSED]: 'primary',\n [CR.State.RETURNED_FOR_CLARIFICATION]: 'primary',\n [CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: 'primary',\n [CR.State.APPEALED]: 'warning',\n};\n\n\n\n/** Associates transition implementation with source/target states. */\nconst TRANSITIONS: CR.Transitions = {\n [CR.State.DRAFT]: {\n [CR.State.WITHDRAWN]: WITHDRAWAL_TRANSITION,\n [CR.State.PROPOSED]: PROPOSAL_TRANSITION,\n },\n [CR.State.PROPOSED]: {\n [CR.State.WITHDRAWN]: WITHDRAWAL_TRANSITION,\n [CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: {\n title: \"Submit for control body review\",\n targetState: CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW,\n canBeTransitionedBy: (stakeholder) => ['owner', 'manager'].indexOf(stakeholder.role) >= 0,\n Widget: RegisterManagerNotesWidget,\n func: applyRegisterManagerDecision,\n },\n [CR.State.RETURNED_FOR_CLARIFICATION]: {\n title: \"Return for clarification\",\n targetState: CR.State.RETURNED_FOR_CLARIFICATION,\n canBeTransitionedBy: (stakeholder) => ['owner', 'manager'].indexOf(stakeholder.role) >= 0,\n Widget: RegisterManagerNotesWidget,\n func: function applyRegisterManagerReturnDecision(cr, payload) {\n if ((payload.registerManagerNotes ?? '').trim() === '') {\n throw new Error(\"Register manager notes are required if returning for clarification\");\n }\n return applyRegisterManagerDecision(cr, payload);\n },\n },\n },\n [CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: {\n [CR.State.WITHDRAWN]: WITHDRAWAL_TRANSITION,\n [CR.State.RETURNED_FOR_CLARIFICATION]: {\n title: \"Return for clarification\",\n targetState: CR.State.RETURNED_FOR_CLARIFICATION,\n canBeTransitionedBy: (stakeholder) => ['owner', 'control-body'].indexOf(stakeholder.role) >= 0,\n Widget: ControlBodyNotesWidget,\n func: applyControlBodyDecision,\n },\n [CR.State.ACCEPTED]: {\n title: \"Accept\",\n targetState: CR.State.ACCEPTED,\n canBeTransitionedBy: (stakeholder) => ['owner', 'control-body'].indexOf(stakeholder.role) >= 0,\n Widget: ControlBodyNotesWidget,\n func: (cr, controlBodyInput) => ({\n ...applyControlBodyDecision(cr, controlBodyInput),\n timeDisposed: new Date(),\n }),\n },\n [CR.State.REJECTED]: {\n title: \"Reject\",\n targetState: CR.State.REJECTED,\n canBeTransitionedBy: (stakeholder) => ['owner', 'control-body'].indexOf(stakeholder.role) >= 0,\n Widget: ControlBodyNotesWidget,\n func: (cr, controlBodyInput) => ({\n ...applyControlBodyDecision(cr, controlBodyInput),\n timeDisposed: new Date(),\n }),\n },\n },\n [CR.State.RETURNED_FOR_CLARIFICATION]: {\n [CR.State.PROPOSED]: PROPOSAL_TRANSITION,\n [CR.State.WITHDRAWN]: WITHDRAWAL_TRANSITION,\n },\n [CR.State.REJECTED]: {\n [CR.State.APPEALED]: {\n title: \"Appeal\",\n targetState: CR.State.APPEALED,\n canBeTransitionedBy: CR.isSubmittedBy,\n Widget: AppealRequestWidget,\n func: applyAppeal,\n },\n },\n [CR.State.APPEALED]: {\n [CR.State.APPEAL_WITHDRAWN]: {\n title: \"Withdraw appeal\",\n targetState: CR.State.APPEAL_WITHDRAWN,\n canBeTransitionedBy: CR.isSubmittedBy,\n Widget: null,\n func: (cr) => ({\n ...cr,\n timeDisposed: new Date(),\n }),\n },\n [CR.State.ACCEPTED_ON_APPEAL]: {\n title: \"Accept on appeal\",\n targetState: CR.State.ACCEPTED_ON_APPEAL,\n canBeTransitionedBy: (stakeholder) => stakeholder.role === 'owner',\n Widget: RegisterOwnerNotesWidget,\n func: applyRegisterOwnerDecision,\n },\n [CR.State.REJECTION_UPHELD_ON_APPEAL]: {\n title: \"Uphold rejection\",\n targetState: CR.State.REJECTION_UPHELD_ON_APPEAL,\n canBeTransitionedBy: (stakeholder) => stakeholder.role === 'owner',\n Widget: RegisterOwnerNotesWidget,\n func: applyRegisterOwnerDecision,\n },\n },\n} as const;\n"]}