@riboseinc/paneron-registry-kit 2.2.30 → 2.2.32

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/index.js +1 -0
  2. package/index.js.map +1 -1
  3. package/item-classes/Tree.d.ts +5 -0
  4. package/item-classes/Tree.js +115 -0
  5. package/item-classes/Tree.js.map +1 -0
  6. package/item-classes/treeNodes.d.ts +12 -0
  7. package/item-classes/treeNodes.js +68 -0
  8. package/item-classes/treeNodes.js.map +1 -0
  9. package/package.json +2 -2
  10. package/proposals/actionableGroups/Tree.d.ts +7 -0
  11. package/proposals/actionableGroups/Tree.js +179 -0
  12. package/proposals/actionableGroups/Tree.js.map +1 -0
  13. package/proposals/actionableGroups/queries.d.ts +5 -0
  14. package/proposals/actionableGroups/queries.js +81 -0
  15. package/proposals/actionableGroups/queries.js.map +1 -0
  16. package/proposals/actionableGroups/treeNodes.d.ts +26 -0
  17. package/proposals/actionableGroups/treeNodes.js +96 -0
  18. package/proposals/actionableGroups/treeNodes.js.map +1 -0
  19. package/proposals/actionableGroups/types.d.ts +6 -0
  20. package/proposals/actionableGroups/types.js +5 -0
  21. package/proposals/actionableGroups/types.js.map +1 -0
  22. package/types/cr.d.ts +1 -0
  23. package/types/cr.js.map +1 -1
  24. package/types/register.d.ts +4 -1
  25. package/types/register.js.map +1 -1
  26. package/types/stakeholder.d.ts +22 -41
  27. package/types/stakeholder.js +34 -16
  28. package/types/stakeholder.js.map +1 -1
  29. package/types/views.d.ts +2 -0
  30. package/types/views.js.map +1 -1
  31. package/views/BrowserCtx.d.ts +1 -1
  32. package/views/BrowserCtx.js.map +1 -1
  33. package/views/GenericRelatedItemView.js +21 -8
  34. package/views/GenericRelatedItemView.js.map +1 -1
  35. package/views/ItemDetailsDrawer.d.ts +1 -0
  36. package/views/ItemDetailsDrawer.js +4 -2
  37. package/views/ItemDetailsDrawer.js.map +1 -1
  38. package/views/ItemSearchDrawer.js +1 -1
  39. package/views/ItemSearchDrawer.js.map +1 -1
  40. package/views/RegisterStakeholder.js +2 -2
  41. package/views/RegisterStakeholder.js.map +1 -1
  42. package/views/StatefulTree.d.ts +28 -0
  43. package/views/StatefulTree.js +131 -0
  44. package/views/StatefulTree.js.map +1 -0
  45. package/views/change-request/TransitionHistory.js +6 -3
  46. package/views/change-request/TransitionHistory.js.map +1 -1
  47. package/views/change-request/TransitionOptions.js +37 -13
  48. package/views/change-request/TransitionOptions.js.map +1 -1
  49. package/views/detail/RegisterHome/index.js +20 -79
  50. package/views/detail/RegisterHome/index.js.map +1 -1
  51. package/views/detail/RegisterItem/index.d.ts +2 -2
  52. package/views/detail/RegisterItem/index.js +7 -2
  53. package/views/detail/RegisterItem/index.js.map +1 -1
  54. package/views/detail/RegisterItemClass.d.ts +12 -0
  55. package/views/detail/RegisterItemClass.js +98 -0
  56. package/views/detail/RegisterItemClass.js.map +1 -0
  57. package/views/detail/RegisterMeta/RegisterMetaForm.js +272 -114
  58. package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
  59. package/views/detail/RegisterMeta/index.js +1 -1
  60. package/views/detail/RegisterMeta/index.js.map +1 -1
  61. package/views/index.js +63 -6
  62. package/views/index.js.map +1 -1
  63. package/views/protocolRegistry.d.ts +1 -0
  64. package/views/protocolRegistry.js +4 -0
  65. package/views/protocolRegistry.js.map +1 -1
  66. package/views/sidebar/Browse/index.js +8 -44
  67. package/views/sidebar/Browse/index.js.map +1 -1
  68. package/views/sidebar/Registration/index.js.map +1 -1
  69. package/views/sidebar/index.d.ts +2 -1
  70. package/views/sidebar/index.js +77 -62
  71. package/views/sidebar/index.js.map +1 -1
  72. package/views/util.d.ts +5 -0
  73. package/views/util.js +42 -4
  74. package/views/util.js.map +1 -1
@@ -20,6 +20,8 @@ var _context = require("@riboseinc/paneron-extension-kit/context");
20
20
 
21
21
  var _BrowserCtx = require("../BrowserCtx");
22
22
 
23
+ var _stakeholder = require("../../types/stakeholder");
24
+
23
25
  var _itemPathUtils = require("../itemPathUtils");
24
26
 
25
27
  var CR = _interopRequireWildcard(require("../../types/cr"));
@@ -254,14 +256,16 @@ const applyRegisterManagerDecision = function applyRegisterManagerDecision(cr, {
254
256
  };
255
257
 
256
258
  const applyControlBodyDecision = function applyControlBodyDecision(cr, {
257
- controlBodyNotes
259
+ controlBodyNotes,
260
+ controlBodyDecisionEvent
258
261
  }) {
259
262
  if (!(controlBodyNotes === null || controlBodyNotes === void 0 ? void 0 : controlBodyNotes.trim())) {
260
263
  throw new Error("Control body decision is required.");
261
264
  }
262
265
 
263
266
  return { ...cr,
264
- controlBodyNotes
267
+ controlBodyNotes,
268
+ controlBodyDecisionEvent
265
269
  };
266
270
  };
267
271
 
@@ -364,16 +368,36 @@ const ControlBodyNotesWidget = function ({
364
368
  onChange
365
369
  }) {
366
370
  return (0, _react2.jsx)(_core.FormGroup, {
367
- label: "Control Body decision:"
371
+ label: "Control Body notes:"
368
372
  }, (0, _react2.jsx)(TransitionInputTextArea, {
369
373
  value: value.controlBodyNotes,
370
374
  required: true,
371
375
  onChange: evt => onChange === null || onChange === void 0 ? void 0 : onChange({
372
- controlBodyNotes: evt.currentTarget.value
376
+ controlBodyNotes: evt.currentTarget.value,
377
+ controlBodyDecisionEvent: value.controlBodyDecisionEvent
373
378
  })
374
379
  }));
375
380
  };
376
381
 
382
+ const ControlBodyDecisionWidget = function ({
383
+ value,
384
+ onChange
385
+ }) {
386
+ return (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(ControlBodyNotesWidget, {
387
+ value: value,
388
+ onChange: onChange
389
+ }), (0, _react2.jsx)(_core.FormGroup, {
390
+ label: "Control Body decision event:"
391
+ }, (0, _react2.jsx)(TransitionInputTextArea, {
392
+ value: value.controlBodyDecisionEvent,
393
+ required: true,
394
+ onChange: evt => onChange === null || onChange === void 0 ? void 0 : onChange({
395
+ controlBodyNotes: value.controlBodyNotes,
396
+ controlBodyDecisionEvent: evt.currentTarget.value
397
+ })
398
+ })));
399
+ };
400
+
377
401
  const AppealRequestWidget = function ({
378
402
  value,
379
403
  onChange
@@ -434,14 +458,14 @@ const TRANSITIONS = {
434
458
  [CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: {
435
459
  title: "Submit for control body review",
436
460
  targetState: CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW,
437
- canBeTransitionedBy: stakeholder => ['owner', 'manager'].indexOf(stakeholder.role) >= 0,
461
+ canBeTransitionedBy: s => (0, _stakeholder.isOwner)(s) || (0, _stakeholder.isManager)(s),
438
462
  Widget: RegisterManagerNotesWidget,
439
463
  func: applyRegisterManagerDecision
440
464
  },
441
465
  [CR.State.RETURNED_FOR_CLARIFICATION]: {
442
466
  title: "Return for clarification",
443
467
  targetState: CR.State.RETURNED_FOR_CLARIFICATION,
444
- canBeTransitionedBy: stakeholder => ['owner', 'manager'].indexOf(stakeholder.role) >= 0,
468
+ canBeTransitionedBy: s => (0, _stakeholder.isOwner)(s) || (0, _stakeholder.isManager)(s),
445
469
  Widget: RegisterManagerNotesWidget,
446
470
  func: function applyRegisterManagerReturnDecision(cr, payload) {
447
471
  var _a;
@@ -459,15 +483,15 @@ const TRANSITIONS = {
459
483
  [CR.State.RETURNED_FOR_CLARIFICATION]: {
460
484
  title: "Return for clarification",
461
485
  targetState: CR.State.RETURNED_FOR_CLARIFICATION,
462
- canBeTransitionedBy: stakeholder => ['owner', 'control-body'].indexOf(stakeholder.role) >= 0,
486
+ canBeTransitionedBy: s => (0, _stakeholder.isOwner)(s) || (0, _stakeholder.isControlBody)(s),
463
487
  Widget: ControlBodyNotesWidget,
464
488
  func: applyControlBodyDecision
465
489
  },
466
490
  [CR.State.ACCEPTED]: {
467
491
  title: "Accept",
468
492
  targetState: CR.State.ACCEPTED,
469
- canBeTransitionedBy: stakeholder => ['owner', 'control-body'].indexOf(stakeholder.role) >= 0,
470
- Widget: ControlBodyNotesWidget,
493
+ canBeTransitionedBy: s => (0, _stakeholder.isOwner)(s) || (0, _stakeholder.isControlBody)(s),
494
+ Widget: ControlBodyDecisionWidget,
471
495
  func: (cr, controlBodyInput) => ({ ...applyControlBodyDecision(cr, controlBodyInput),
472
496
  timeDisposed: new Date()
473
497
  })
@@ -475,8 +499,8 @@ const TRANSITIONS = {
475
499
  [CR.State.REJECTED]: {
476
500
  title: "Reject",
477
501
  targetState: CR.State.REJECTED,
478
- canBeTransitionedBy: stakeholder => ['owner', 'control-body'].indexOf(stakeholder.role) >= 0,
479
- Widget: ControlBodyNotesWidget,
502
+ canBeTransitionedBy: s => (0, _stakeholder.isOwner)(s) || (0, _stakeholder.isControlBody)(s),
503
+ Widget: ControlBodyDecisionWidget,
480
504
  func: (cr, controlBodyInput) => ({ ...applyControlBodyDecision(cr, controlBodyInput),
481
505
  timeDisposed: new Date()
482
506
  })
@@ -508,14 +532,14 @@ const TRANSITIONS = {
508
532
  [CR.State.ACCEPTED_ON_APPEAL]: {
509
533
  title: "Accept on appeal",
510
534
  targetState: CR.State.ACCEPTED_ON_APPEAL,
511
- canBeTransitionedBy: stakeholder => stakeholder.role === 'owner',
535
+ canBeTransitionedBy: _stakeholder.isOwner,
512
536
  Widget: RegisterOwnerNotesWidget,
513
537
  func: applyRegisterOwnerDecision
514
538
  },
515
539
  [CR.State.REJECTION_UPHELD_ON_APPEAL]: {
516
540
  title: "Uphold rejection",
517
541
  targetState: CR.State.REJECTION_UPHELD_ON_APPEAL,
518
- canBeTransitionedBy: stakeholder => stakeholder.role === 'owner',
542
+ canBeTransitionedBy: _stakeholder.isOwner,
519
543
  Widget: RegisterOwnerNotesWidget,
520
544
  func: applyRegisterOwnerDecision
521
545
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TransitionOptions.js","sourceRoot":"","sources":["../../../src/views/change-request/TransitionOptions.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, type TextAreaProps, Intent, Colors } 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\nfunction reducer(prevState: State, action: 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\nexport interface TransitionOptions<C extends CR.SomeCR> {\n cr: C\n transitions: PossibleTransitionForCR<C>[]\n stakeholder?: RegisterStakeholder\n className?: string\n}\n\n//export const TransitionOptions: C extends CR.Base ? C[\"state\"] extends keyof CR.Transitions ? React.FC<{ cr: CR.Base }> : never : never = function ({ cr }) {\nfunction TransitionOptions<C extends CR.SomeCR>\n({ cr, transitions, stakeholder, className }: TransitionOptions<C>) {\n const { subregisters, alterApprovedCR } = useContext(BrowserCtx);\n const {\n getObjectData,\n getMapReducedData,\n updateObjects,\n performOperation,\n operationKey,\n usePersistentDatasetStateReducer,\n } = useContext(DatasetContext);\n\n const isBusy = operationKey !== undefined;\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 reducer,\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) {\n dispatch({ type: 'unset-next-state' });\n }\n }, [stateRecalled]);\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 const maybeAlteredCR = alterApprovedCR\n ? await alterApprovedCR(\n cr.id,\n cr.items,\n origItemData,\n newItemData,\n { getMapReducedData })\n : { proposals: cr.items, origItemData, newItemData };\n //console.debug(\"Got altered item data\", newItemData);\n return await proposalsToObjectChangeset(\n cr.id,\n subregisters !== undefined,\n maybeAlteredCR.proposals,\n maybeAlteredCR.origItemData,\n maybeAlteredCR.newItemData);\n }, [cr.id, JSON.stringify(cr.items), subregisters === undefined, getObjectData, getMapReducedData, alterApprovedCR]);\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 newCR.pastTransitions = [\n ...(newCR.pastTransitions ?? []),\n {\n label: transitionCfg.title,\n timestamp: new Date(),\n fromState: cr.state,\n toState: newCR.state,\n stakeholder,\n input: stateInput,\n },\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,\n validatedStateInput,\n )\n : void 0\n }>\n {selectedTransitionCfg.title}\n </Button>\n : null}\n </div>\n );\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 given CR can be transitioned\n * *and* given stakeholder is eligible to transition it.\n */\nexport function canBeTransitionedBy(stakeholder: RegisterStakeholder, cr: CR.SomeCR) {\n return getTransitions(cr, stakeholder).length > 0;\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\nexport const STATE_COLOR: { [key in CR.StateType]?: typeof Colors[keyof typeof Colors] } = {\n [CR.State.PROPOSED]: Colors.BLUE2,\n [CR.State.RETURNED_FOR_CLARIFICATION]: Colors.ORANGE3,\n [CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: Colors.BLUE2,\n\n [CR.State.APPEALED]: Colors.ORANGE3,\n [CR.State.REJECTED]: Colors.RED2,\n [CR.State.REJECTION_UPHELD_ON_APPEAL]: Colors.RED2,\n\n [CR.State.ACCEPTED]: Colors.GREEN2,\n [CR.State.ACCEPTED_ON_APPEAL]: Colors.GREEN2,\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\n\nexport default TransitionOptions;\n"]}
1
+ {"version":3,"file":"TransitionOptions.js","sourceRoot":"","sources":["../../../src/views/change-request/TransitionOptions.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAA8B,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACvH,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAG1E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAkB/E,SAAS,OAAO,CAAC,SAAgB,EAAE,MAAc;IAC/C,QAAQ,MAAM,CAAC,IAAI,EAAE;QACnB,KAAK,kBAAkB;YACrB,OAAO;gBACL,GAAG,SAAS;gBACZ,eAAe,EAAE,SAAS;aAC3B,CAAC;QACJ,KAAK,mBAAmB;YACtB,OAAO;gBACL,GAAG,SAAS;gBACZ,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;aACtC,CAAC;QACJ,KAAK,yBAAyB;YAC5B,OAAO;gBACL,GAAG,SAAS;gBACZ,UAAU,EAAE,MAAM,CAAC,OAAO;aAC3B,CAAC;QACJ;YACE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;KACvC;AACH,CAAC;AASD,+JAA+J;AAC/J,SAAS,iBAAiB,CACzB,EAAE,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAwB;IAChE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,EACJ,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,gCAAgC,GACjC,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAE/B,MAAM,MAAM,GAAG,YAAY,KAAK,SAAS,CAAC;IAE1C,MAAM,YAAY,GAAU,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,sDAAsD;QACtD,eAAe,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC;YACrC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,SAAS;QACb,UAAU,EAAE,EAAE;KACf,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAEpB,MAAM,CAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAE,GACvC,gCAA8E,CAC7E,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EACtB,SAAS,EACT,SAAS,EACT,OAAO,EACP,YAAY,EACZ,IAAI,CAAC,CAAC;IAER,MAAM,qBAAqB,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE;;QAC1C,OAAA,MAAA,CACE,aAAa,IAAI,KAAK,CAAC,eAAe;YACpC,CAAC,CAAC,MAAA,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAG,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,eAAe,CAAC,0CAAG,CAAC,CAAC;YAC/D,CAAC,CAAC,SAAS,CACd,mCAAI,SAAS,CAAA;KAAA,CACf,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,aAAa,EAAE;YACjB,QAAQ,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;SACxC;IACH,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,mBAAmB;IACnB,iDAAiD;IACjD,mCAAmC;IACnC,+CAA+C;IAC/C,OAAO;IACP,KAAK;IACL,MAAM;IACN,kBAAkB;IAClB,0BAA0B;IAC1B,0BAA0B;IAC1B,KAAK;IAEL,MAAM,CAAC,mBAAmB,EAAE,0BAA0B,CAAC,GAEvD,OAAO,CAAC,GAAG,EAAE;;QACX,IAAI,EAAE,IAAI,qBAAqB,EAAE;YAC/B,IAAI;gBACF,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;aAClD;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,SAAS,EAAE,MAAC,CAAS,CAAC,OAAO,mCAAI,GAAG,CAAC,EAAE,CAAC,CAAC;aAClD;YACD,OAAO,CAAC,KAAK,CAAC,UAA2B,EAAE,SAAS,CAAC,CAAC;SACvD;aAAM;YACL,OAAO,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;SACvD;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,qBAAqB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAElE,MAAM,0BAA0B,GAAG,WAAW,CAC9C,KAAK,WAAW,EAAqC;QACnD,MAAM,YAAY,GAAG,CAAC,MAAM,aAAa,CAAC;YACxC,WAAW,EAAE;gBACX,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC;oBACzB,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC;oBAC9C,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAG,EAAE,EAAE,CAAC,QAAQ,CAAC;gBACjC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,aAAa,KAAK,cAAc,CAAC;oBAClF,OAAO,CAAC,IAAI,CAAC,EAAE,CAAE,IAAqB,CAAC,kBAAkB,CAAC;aAC7D;SACF,CAAC,CAAC,CAAC,IAAgD,CAAC;QACrD,oDAAoD;QACpD,MAAM,WAAW,GAAG,CAAC,MAAM,aAAa,CAAC;YACvC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC;gBACnC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC;gBAC/E,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAG,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;SACvD,CAAC,CAAC,CAAC,IAAgD,CAAC;QACrD,kDAAkD;QAClD,MAAM,cAAc,GAAG,eAAe;YACpC,CAAC,CAAC,MAAM,eAAe,CACnB,EAAE,CAAC,EAAE,EACL,EAAE,CAAC,KAAK,EACR,YAAY,EACZ,WAAW,EACX,EAAE,iBAAiB,EAAE,CAAC;YAC1B,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;QACvD,sDAAsD;QACtD,OAAO,MAAM,0BAA0B,CACrC,EAAE,CAAC,EAAE,EACL,YAAY,KAAK,SAAS,EAC1B,cAAc,CAAC,SAAS,EACxB,cAAc,CAAC,YAAY,EAC3B,cAAc,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,KAAK,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC,CAAC;IAErH,MAAM,gBAAgB,GAAG,WAAW,CACpC,KAAK,WAAW,aAA2C,EAAE,UAAyB;;QACpF,IAAI,aAAa,IAAI,aAAa,IAAI,WAAW,IAAI,aAAa,CAAC,mBAAmB,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE;YACvG,MAAM,KAAK,GAAG;gBACZ,GAAI,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAA8B;gBACnE,KAAK,EAAE,aAAa,CAAC,WAAW;aACjC,CAAC;YACF,KAAK,CAAC,eAAe,GAAG;gBACtB,GAAG,CAAC,MAAA,KAAK,CAAC,eAAe,mCAAI,EAAE,CAAC;gBAChC;oBACE,KAAK,EAAE,aAAa,CAAC,KAAK;oBAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;oBACrB,SAAS,EAAE,EAAE,CAAC,KAAK;oBACnB,OAAO,EAAE,KAAK,CAAC,KAAK;oBACpB,WAAW;oBACX,KAAK,EAAE,UAAU;iBAClB;aACF,CAAC;YACF,+EAA+E;YAC/E,MAAM,SAAS,GAAoB;gBACjC,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;oBACrB,QAAQ,EAAE,EAAE;oBACZ,QAAQ,EAAE,KAAK;iBAChB;aACF,CAAC;YACF,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE;gBACxD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC;aACnE;YACD,MAAM,aAAa,CAAC;gBAClB,aAAa,EAAE,GAAG,aAAa,CAAC,KAAK,KAAK;gBAC1C,eAAe,EAAE,SAAS;aAC3B,CAAC,CAAC;SACJ;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;SAC/E;IACH,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAErE,MAAM,aAAa,GAAG,qBAAqB,KAAK,SAAS,IAAI,CAAC,MAAM,IAAI,mBAAmB,KAAK,SAAS,CAAC;IAE1G,OAAO,CACL,aAAK,GAAG,EAAE,GAAG,CAAA,0CAA0C,EAAE,SAAS,EAAE,SAAS;QAC1E,WAAW,CAAC,MAAM,GAAG,CAAC;YACrB,CAAC,CAAC,IAAC,UAAU,IACP,aAAa,EAAE,KAAK,CAAC,eAAe,EACpC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC;oBACpD,CAAC,CAAC,QAAQ,CAAC;wBACP,IAAI,EAAE,mBAAmB;wBACzB,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE;qBAC5C,CAAC;oBACJ,CAAC,CAAC,KAAK,CAAC,IACX,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAChC,IAAC,KAAK,IACJ,GAAG,EAAE,KAAK,EACV,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,SACL,CACH,CACU;YACf,CAAC,CAAC,IAAI;QACP,CAAA,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,MAAM;YAC5B,CAAC,CAAC,IAAC,OAAO,IACJ,MAAM,EAAE,0BAA0B,KAAK,SAAS,EAChD,SAAS,EAAC,QAAQ,EAClB,aAAa,EAAC,KAAK,EACnB,MAAM,EAAC,SAAS,EAChB,OAAO,EAAE,0BAAG,0BAA0B,CAAI;gBAC5C,IAAC,qBAAqB,CAAC,MAAM,IAC3B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC;wBAC7C,CAAC,CAAC,KAAK,CAAC,UAAU;wBAClB,CAAC,CAAC,EAAE,EACN,QAAQ,EAAE,CAAC,MAAM;wBACf,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC;4BACpB,IAAI,EAAE,yBAAyB;4BAC/B,OAAO;yBACR,CAAC;wBACJ,CAAC,CAAC,SAAS,GACb,CACM;YACZ,CAAC,CAAC,IAAI;QACP,qBAAqB;YACpB,CAAC,CAAC,IAAC,MAAM,IACH,QAAQ,EAAE,CAAC,aAAa,EACxB,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAC7C,OAAO,EAAE,GAAG,EAAE,CACZ,mBAAmB;oBACjB,CAAC,CAAC,gBAAgB,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,CAC1D,qBAAqB,EACrB,mBAAmB,CACpB;oBACH,CAAC,CAAC,KAAK,CAAC,IAEb,qBAAqB,CAAC,KAAK,CACrB;YACX,CAAC,CAAC,IAAI,CACJ,CACP,CAAC;AACJ,CAAC;AAAA,CAAC;AAQF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,EAAM,EACN,WAAgC;IAEhC,MAAM,mBAAmB,GAAG,WAAW,CAAC,EAAE,CAAC,KAA6B,CAAC,CAAC;IAC1E,IAAI,mBAAmB,EAAE;QACvB,OAAO,CACJ,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAmC;YACtE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAC1D,CAAC;KACH;SAAM;QACL,OAAO,EAAE,CAAC;KACX;AACH,CAAC;AAGD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAgC,EAAE,EAAa;IACjF,OAAO,cAAc,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACpD,CAAC;AAGD;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAmB;;IAC9C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAA,WAAW,CAAC,KAA6B,CAAC,mCAAI,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACpF,CAAC;AAGD,MAAM,4BAA4B,GAKlC,SAAS,4BAA4B,CAAE,EAAE,EAAE,EAAE,oBAAoB,EAAE;IACjE,OAAO;QACL,GAAG,EAAE;QACL,oBAAoB,EAAE,oBAAoB,aAApB,oBAAoB,cAApB,oBAAoB,GAAI,EAAE;KACjD,CAAC;AACJ,CAAC,CAAA;AAGD,MAAM,wBAAwB,GAM9B,SAAS,wBAAwB,CAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,wBAAwB,EAAE;IACnF,IAAI,CAAC,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,EAAE,CAAA,EAAE;QAC7B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;KACvD;IACD,OAAO;QACL,GAAG,EAAE;QACL,gBAAgB;QAChB,wBAAwB;KACzB,CAAC;AACJ,CAAC,CAAA;AAGD,MAAM,WAAW,GAIjB,SAAS,WAAW,CAAE,EAAE,EAAE,EAAE,YAAY,EAAE;IACxC,IAAI,CAAC,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,EAAE,CAAA,EAAE;QACzB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;KAC/C;IACD,OAAO;QACL,GAAG,EAAE;QACL,YAAY;QACZ,YAAY,EAAE,SAAS;KACxB,CAAC;AACJ,CAAC,CAAA;AAGD,MAAM,0BAA0B,GAKhC,SAAS,0BAA0B,CAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE;IAC7D,IAAI,CAAC,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,IAAI,EAAE,CAAA,EAAE;QAC/B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;KACrD;IACD,OAAO;QACL,GAAG,EAAE;QACL,kBAAkB;QAClB,YAAY,EAAE,IAAI,IAAI,EAAE;KACzB,CAAC;AACJ,CAAC,CAAA;AAGD,MAAM,qBAAqB,GACgC;IACzD,KAAK,EAAE,UAAU;IACjB,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS;IAC/B,MAAM,EAAE,IAAI;IACZ,mBAAmB,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC;IAC9F,IAAI,EAAE,CAAC,EAAmB,EAAE,EAAE,CAAC,CAAC;QAC9B,GAAG,EAAE;QACL,YAAY,EAAE,IAAI,IAAI,EAAE;KACzB,CAAC;CACM,CAAC;AAGX,MAAM,oBAAoB,GAGrB,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;IAChC,OAAO,CACL,IAAC,SAAS,IAAC,KAAK,EAAC,gBAAgB;QAC/B,IAAC,uBAAuB,IACtB,QAAQ,QACR,KAAK,EAAE,KAAK,CAAC,aAAa,EAC1B,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAChB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,GAExD,CACQ,CACb,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,uBAAuB,GAA4B,UAAU,KAAK;IACtE,OAAO,IAAC,QAAQ,IACd,IAAI,QACJ,GAAG,EAAE,GAAG,CAAA,mBAAmB,EAC3B,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,KACrB,KAAK,GACT,CAAC;AACL,CAAC,CAAC;AAGF,MAAM,mBAAmB,GAC4C;IACnE,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ;IAC9B,mBAAmB,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,CACxC,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CACtE;IACD,MAAM,EAAE,oBAAoB;IAC5B,IAAI,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE;;QAC3B,IAAI,CAAC,CAAA,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,aAAa,0CAAE,IAAI,EAAE,CAAA,EAAE;YAC1C,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;SAC/C;QACD,OAAO;YACL,GAAG,EAAE;YACL,GAAG,cAAc;YACjB,YAAY,EAAE,IAAI,IAAI,EAAE;SACzB,CAAA;IACH,CAAC;CACF,CAAA;AAGD,MAAM,0BAA0B,GAG3B,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;IAChC,OAAO,CACL,IAAC,SAAS,IAAC,KAAK,EAAC,yBAAyB;QACxC,IAAC,uBAAuB,IACtB,KAAK,EAAE,KAAK,CAAC,oBAAoB,EACjC,QAAQ,QACR,QAAQ,EAAE,GAAG,CAAC,EAAE,CACd,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,EAAE,oBAAoB,EAAE,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,GAE/D,CACQ,CACb,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,sBAAsB,GAGvB,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;IAChC,OAAO,CACL,IAAC,SAAS,IAAC,KAAK,EAAC,qBAAqB;QACpC,IAAC,uBAAuB,IACtB,KAAK,EAAE,KAAK,CAAC,gBAAgB,EAC7B,QAAQ,QACR,QAAQ,EAAE,GAAG,CAAC,EAAE,CACd,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG;gBACT,gBAAgB,EAAE,GAAG,CAAC,aAAa,CAAC,KAAK;gBACzC,wBAAwB,EAAE,KAAK,CAAC,wBAAwB;aACzD,CAAC,GAEJ,CACQ,CACb,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,yBAAyB,GAG1B,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;IAChC,OAAO,CACL;QACE,IAAC,sBAAsB,IACrB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,GAClB;QACF,IAAC,SAAS,IAAC,KAAK,EAAC,8BAA8B;YAC7C,IAAC,uBAAuB,IACtB,KAAK,EAAE,KAAK,CAAC,wBAAwB,EACrC,QAAQ,QACR,QAAQ,EAAE,GAAG,CAAC,EAAE,CACd,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG;oBACT,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;oBACxC,wBAAwB,EAAE,GAAG,CAAC,aAAa,CAAC,KAAK;iBAClD,CAAC,GAEJ,CACQ,CACX,CACJ,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,mBAAmB,GAGpB,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;IAChC,OAAO,CACL,IAAC,SAAS,IAAC,KAAK,EAAC,mBAAmB;QAClC,IAAC,uBAAuB,IACtB,KAAK,EAAE,KAAK,CAAC,YAAY,EACzB,QAAQ,QACR,QAAQ,EAAE,GAAG,CAAC,EAAE,CACd,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,EAAE,YAAY,EAAE,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,GAEvD,CACQ,CACb,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,wBAAwB,GAGzB,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;IAChC,OAAO,CACL,IAAC,SAAS,IAAC,KAAK,EAAC,uBAAuB;QACtC,IAAC,uBAAuB,IACtB,KAAK,EAAE,KAAK,CAAC,kBAAkB,EAC/B,QAAQ,QACR,QAAQ,EAAE,GAAG,CAAC,EAAE,CACd,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,EAAE,kBAAkB,EAAE,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,GAE7D,CACQ,CACb,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,YAAY,GAAuC;IAC9D,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS;IAC9B,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,SAAS;IAChD,CAAC,EAAE,CAAC,KAAK,CAAC,iCAAiC,CAAC,EAAE,SAAS;IACvD,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS;CAC/B,CAAC;AAGF,MAAM,CAAC,MAAM,WAAW,GAAmE;IACzF,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK;IACjC,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC,OAAO;IACrD,CAAC,EAAE,CAAC,KAAK,CAAC,iCAAiC,CAAC,EAAE,MAAM,CAAC,KAAK;IAE1D,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,OAAO;IACnC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI;IAChC,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC,IAAI;IAElD,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM;IAClC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM;CAC7C,CAAC;AAIF,sEAAsE;AACtE,MAAM,WAAW,GAAmB;IAClC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAChB,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,qBAAqB;QAC3C,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,mBAAmB;KACzC;IACD,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;QACnB,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,qBAAqB;QAC3C,CAAC,EAAE,CAAC,KAAK,CAAC,iCAAiC,CAAC,EAAE;YAC5C,KAAK,EAAE,gCAAgC;YACvC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,iCAAiC;YACvD,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;YACtD,MAAM,EAAE,0BAA0B;YAClC,IAAI,EAAE,4BAA4B;SACnC;QACD,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE;YACrC,KAAK,EAAE,0BAA0B;YACjC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,0BAA0B;YAChD,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;YACtD,MAAM,EAAE,0BAA0B;YAClC,IAAI,EAAE,SAAS,kCAAkC,CAAC,EAAE,EAAE,OAAO;;gBAC3D,IAAI,CAAC,MAAA,OAAO,CAAC,oBAAoB,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;oBACtD,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;iBACvF;gBACD,OAAO,4BAA4B,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YACnD,CAAC;SACF;KACF;IACD,CAAC,EAAE,CAAC,KAAK,CAAC,iCAAiC,CAAC,EAAE;QAC5C,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,qBAAqB;QAC3C,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE;YACrC,KAAK,EAAE,0BAA0B;YACjC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,0BAA0B;YAChD,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;YAC1D,MAAM,EAAE,sBAAsB;YAC9B,IAAI,EAAE,wBAAwB;SAC/B;QACD,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;YACnB,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ;YAC9B,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;YAC1D,MAAM,EAAE,yBAAyB;YACjC,IAAI,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;gBAC/B,GAAG,wBAAwB,CAAC,EAAE,EAAE,gBAAgB,CAAC;gBACjD,YAAY,EAAE,IAAI,IAAI,EAAE;aACzB,CAAC;SACH;QACD,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;YACnB,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ;YAC9B,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;YAC1D,MAAM,EAAE,yBAAyB;YACjC,IAAI,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;gBAC/B,GAAG,wBAAwB,CAAC,EAAE,EAAE,gBAAgB,CAAC;gBACjD,YAAY,EAAE,IAAI,IAAI,EAAE;aACzB,CAAC;SACH;KACF;IACD,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE;QACrC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,mBAAmB;QACxC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,qBAAqB;KAC5C;IACD,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;QACnB,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;YACnB,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ;YAC9B,mBAAmB,EAAE,EAAE,CAAC,aAAa;YACrC,MAAM,EAAE,mBAAmB;YAC3B,IAAI,EAAE,WAAW;SAClB;KACF;IACD,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;QACnB,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE;YAC3B,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB;YACtC,mBAAmB,EAAE,EAAE,CAAC,aAAa;YACrC,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACb,GAAG,EAAE;gBACL,YAAY,EAAE,IAAI,IAAI,EAAE;aACzB,CAAC;SACH;QACD,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE;YAC7B,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB;YACxC,mBAAmB,EAAE,OAAO;YAC5B,MAAM,EAAE,wBAAwB;YAChC,IAAI,EAAE,0BAA0B;SACjC;QACD,CAAC,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE;YACrC,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,0BAA0B;YAChD,mBAAmB,EAAE,OAAO;YAC5B,MAAM,EAAE,wBAAwB;YAChC,IAAI,EAAE,0BAA0B;SACjC;KACF;CACO,CAAC;AAGX,eAAe,iBAAiB,CAAC","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, type TextAreaProps, Intent, Colors } 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 { isOwner, isControlBody, isManager } from '../../types/stakeholder';\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\nfunction reducer(prevState: State, action: 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\nexport interface TransitionOptions<C extends CR.SomeCR> {\n cr: C\n transitions: PossibleTransitionForCR<C>[]\n stakeholder?: RegisterStakeholder\n className?: string\n}\n\n//export const TransitionOptions: C extends CR.Base ? C[\"state\"] extends keyof CR.Transitions ? React.FC<{ cr: CR.Base }> : never : never = function ({ cr }) {\nfunction TransitionOptions<C extends CR.SomeCR>\n({ cr, transitions, stakeholder, className }: TransitionOptions<C>) {\n const { subregisters, alterApprovedCR } = useContext(BrowserCtx);\n const {\n getObjectData,\n getMapReducedData,\n updateObjects,\n performOperation,\n operationKey,\n usePersistentDatasetStateReducer,\n } = useContext(DatasetContext);\n\n const isBusy = operationKey !== undefined;\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 reducer,\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) {\n dispatch({ type: 'unset-next-state' });\n }\n }, [stateRecalled]);\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 const maybeAlteredCR = alterApprovedCR\n ? await alterApprovedCR(\n cr.id,\n cr.items,\n origItemData,\n newItemData,\n { getMapReducedData })\n : { proposals: cr.items, origItemData, newItemData };\n //console.debug(\"Got altered item data\", newItemData);\n return await proposalsToObjectChangeset(\n cr.id,\n subregisters !== undefined,\n maybeAlteredCR.proposals,\n maybeAlteredCR.origItemData,\n maybeAlteredCR.newItemData);\n }, [cr.id, JSON.stringify(cr.items), subregisters === undefined, getObjectData, getMapReducedData, alterApprovedCR]);\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 newCR.pastTransitions = [\n ...(newCR.pastTransitions ?? []),\n {\n label: transitionCfg.title,\n timestamp: new Date(),\n fromState: cr.state,\n toState: newCR.state,\n stakeholder,\n input: stateInput,\n },\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,\n validatedStateInput,\n )\n : void 0\n }>\n {selectedTransitionCfg.title}\n </Button>\n : null}\n </div>\n );\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 given CR can be transitioned\n * *and* given stakeholder is eligible to transition it.\n */\nexport function canBeTransitionedBy(stakeholder: RegisterStakeholder, cr: CR.SomeCR) {\n return getTransitions(cr, stakeholder).length > 0;\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, controlBodyDecisionEvent }) {\n if (!controlBodyNotes?.trim()) {\n throw new Error(\"Control body decision is required.\");\n }\n return {\n ...cr,\n controlBodyNotes,\n controlBodyDecisionEvent,\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 notes:\">\n <TransitionInputTextArea\n value={value.controlBodyNotes}\n required\n onChange={evt =>\n onChange?.({\n controlBodyNotes: evt.currentTarget.value,\n controlBodyDecisionEvent: value.controlBodyDecisionEvent,\n })\n }\n />\n </FormGroup>\n );\n};\n\n\nconst ControlBodyDecisionWidget: React.FC<{\n value: CR.ControlBodyInput\n onChange?: (newVal: CR.ControlBodyInput) => void\n}> = function ({ value, onChange }) {\n return (\n <>\n <ControlBodyNotesWidget\n value={value}\n onChange={onChange}\n />\n <FormGroup label=\"Control Body decision event:\">\n <TransitionInputTextArea\n value={value.controlBodyDecisionEvent}\n required\n onChange={evt =>\n onChange?.({\n controlBodyNotes: value.controlBodyNotes,\n controlBodyDecisionEvent: evt.currentTarget.value,\n })\n }\n />\n </FormGroup>\n </>\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\nexport const STATE_COLOR: { [key in CR.StateType]?: typeof Colors[keyof typeof Colors] } = {\n [CR.State.PROPOSED]: Colors.BLUE2,\n [CR.State.RETURNED_FOR_CLARIFICATION]: Colors.ORANGE3,\n [CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW]: Colors.BLUE2,\n\n [CR.State.APPEALED]: Colors.ORANGE3,\n [CR.State.REJECTED]: Colors.RED2,\n [CR.State.REJECTION_UPHELD_ON_APPEAL]: Colors.RED2,\n\n [CR.State.ACCEPTED]: Colors.GREEN2,\n [CR.State.ACCEPTED_ON_APPEAL]: Colors.GREEN2,\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: (s) => isOwner(s) || isManager(s),\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: (s) => isOwner(s) || isManager(s),\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: (s) => isOwner(s) || isControlBody(s),\n Widget: ControlBodyNotesWidget,\n func: applyControlBodyDecision,\n },\n [CR.State.ACCEPTED]: {\n title: \"Accept\",\n targetState: CR.State.ACCEPTED,\n canBeTransitionedBy: (s) => isOwner(s) || isControlBody(s),\n Widget: ControlBodyDecisionWidget,\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: (s) => isOwner(s) || isControlBody(s),\n Widget: ControlBodyDecisionWidget,\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: isOwner,\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: isOwner,\n Widget: RegisterOwnerNotesWidget,\n func: applyRegisterOwnerDecision,\n },\n },\n} as const;\n\n\nexport default TransitionOptions;\n"]}
@@ -29,6 +29,8 @@ var _Proposals = require("../../change-request/Proposals");
29
29
 
30
30
  var _cr = require("../../../types/cr");
31
31
 
32
+ var _queries = require("../../../proposals/actionableGroups/queries");
33
+
32
34
  var _stakeholder = require("../../../types/stakeholder");
33
35
 
34
36
  var _protocolRegistry = require("../../protocolRegistry");
@@ -56,7 +58,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
56
58
  /** @jsxFrag React.Fragment */
57
59
  //import { Helmet } from 'react-helmet';
58
60
  const RegisterHome = function () {
59
- var _a, _b;
61
+ var _a;
60
62
 
61
63
  const {
62
64
  spawnTab
@@ -65,6 +67,7 @@ const RegisterHome = function () {
65
67
  registerMetadata,
66
68
  stakeholder,
67
69
  itemClasses,
70
+ itemClassGroups,
68
71
  setActiveChangeRequestID,
69
72
  jumpTo
70
73
  } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
@@ -184,13 +187,13 @@ const RegisterHome = function () {
184
187
  }
185
188
  }, [isBusy, performOperation, updateObjects, getImportedCRChangeset, getNewEmptyCRChangeset]); // Actionable proposals v2
186
189
 
187
- const proposalGroups = (0, _react.useMemo)(() => (stakeholder === null || stakeholder === void 0 ? void 0 : stakeholder.role) ? getActionableProposalGroupsForRole(stakeholder.role) : null, [stakeholder === null || stakeholder === void 0 ? void 0 : stakeholder.role]);
190
+ const proposalGroups = (0, _react.useMemo)(() => (stakeholder === null || stakeholder === void 0 ? void 0 : stakeholder.roles[0]) ? stakeholder.roles.flatMap(_queries.getActionableProposalGroupsForRole) : null, [stakeholder === null || stakeholder === void 0 ? void 0 : stakeholder.roles.join(',')]);
188
191
  const actionableProposalsResult = useMapReducedData({
189
192
  chains: (proposalGroups !== null && proposalGroups !== void 0 ? proposalGroups : []).map(([label,, queryGetter]) => {
190
193
  const query = queryGetter(stakeholder);
191
194
  const predicateFunc = `
192
195
  const objPath = key, obj = value;
193
- return ((${CR_BASE_QUERY}) && (${query}));
196
+ return ((${_queries.CR_BASE_QUERY}) && (${query}));
194
197
  `;
195
198
  const mapFunc = `emit(value);`;
196
199
  return {
@@ -365,11 +368,15 @@ const RegisterHome = function () {
365
368
  selectProposal((0, _itemPathUtils.itemRefToItemPath)(itemRef));
366
369
  } : null;
367
370
  const itemSelectorBlocks = (0, _react.useMemo)(() => {
368
- return (0, _react2.jsx)(_react.default.Fragment, null, Object.entries(itemClasses).map(([clsID, cls]) => {
369
- var _a;
371
+ const groups = itemClassGroups ? itemClassGroups : {
372
+ '': Object.keys(itemClasses)
373
+ };
374
+ return (0, _react2.jsx)(_react.default.Fragment, null, Object.entries(groups).map(([groupLabel, clsIDs]) => (0, _react2.jsx)(_react.default.Fragment, null, groupLabel ? (0, _react2.jsx)(GridHeader, null, groupLabel, ":") : null, clsIDs.map(clsID => {
375
+ var _a, _b;
370
376
 
377
+ const cls = itemClasses[clsID];
371
378
  const actions = [{
372
- onClick: () => activateItemSelector(clsID),
379
+ onClick: () => spawnTab(`${_protocolRegistry.Protocols.ITEM_CLASS}:${clsID}`),
373
380
  icon: 'search',
374
381
  text: "Find item…",
375
382
  selected: activeItemSelector === clsID
@@ -387,19 +394,19 @@ const RegisterHome = function () {
387
394
  return (0, _react2.jsx)(_Block.HomeBlockCard, {
388
395
  key: clsID,
389
396
  css: (0, _react2.css)`flex-basis: calc(25% - 10px*3/4); flex-shrink: 0;`,
390
- description: `Search items of class ${cls.meta.title}`
397
+ description: `Search items of class ${(_a = cls === null || cls === void 0 ? void 0 : cls.meta.title) !== null && _a !== void 0 ? _a : clsID}`
391
398
  }, (0, _react2.jsx)(_core.Tag, {
392
399
  minimal: true
393
400
  }, "Class"), (0, _react2.jsx)("div", {
394
401
  css: (0, _react2.css)`padding: 5px; flex-grow: 1;`
395
402
  }, (0, _react2.jsx)(_core.H5, {
396
403
  css: (0, _react2.css)`margin: 0;`
397
- }, cls.meta.title), cls.meta.description && cls.meta.description !== cls.meta.title ? (0, _react2.jsx)("p", {
404
+ }, cls.meta.title), cls ? cls.meta.description && cls.meta.description !== cls.meta.title ? (0, _react2.jsx)("p", {
398
405
  css: (0, _react2.css)`margin: 10px 0 0 0;`
399
- }, (_a = cls.meta.description) !== null && _a !== void 0 ? _a : "(no description)") : null), (0, _react2.jsx)(_Block.HomeBlockActions, {
406
+ }, (_b = cls.meta.description) !== null && _b !== void 0 ? _b : "(no description)") : null : "(no class information available)"), (0, _react2.jsx)(_Block.HomeBlockActions, {
400
407
  actions: actions
401
408
  }));
402
- }), (0, _react2.jsx)(_ItemSearchDrawer.default, {
409
+ }))), (0, _react2.jsx)(_ItemSearchDrawer.default, {
403
410
  isOpen: jumpTo && activeItemSelector ? true : false,
404
411
  onClose: () => activateItemSelector(null),
405
412
  availableClassIDs: typeof activeItemSelector === 'string' ? [activeItemSelector] : [],
@@ -407,13 +414,13 @@ const RegisterHome = function () {
407
414
  }));
408
415
  }, [itemClasses, activeItemSelector, activeCRIsEditable, jumpTo]);
409
416
  return (0, _react2.jsx)(_util.TabContentsWithHeader, {
410
- title: (_a = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.name) !== null && _a !== void 0 ? _a : 'Register',
417
+ title: (0, _react2.jsx)(_react.default.Fragment, null),
411
418
  layoutOptions: {
412
419
  gapPx: itemGapPx,
413
420
  stretch: true
414
421
  },
415
422
  layout: "card-grid"
416
- }, activeCRBlock !== null && activeCRBlock !== void 0 ? activeCRBlock : registerMetaBlock, proposalBlock, proposedChangeBlocks ? (0, _react2.jsx)(GridHeader, null, "Proposed Changes: (", Object.keys((_b = activeCR === null || activeCR === void 0 ? void 0 : activeCR.items) !== null && _b !== void 0 ? _b : []).length, " total)") : null, proposedChangeBlocks, (0, _react2.jsx)(GridHeader, null, "Register Items:"), itemSelectorBlocks);
423
+ }, activeCRBlock !== null && activeCRBlock !== void 0 ? activeCRBlock : registerMetaBlock, proposalBlock, proposedChangeBlocks ? (0, _react2.jsx)(GridHeader, null, "Proposed Changes: (", Object.keys((_a = activeCR === null || activeCR === void 0 ? void 0 : activeCR.items) !== null && _a !== void 0 ? _a : []).length, " total)") : null, proposedChangeBlocks, !itemClassGroups ? (0, _react2.jsx)(GridHeader, null, "Register Items:") : null, itemSelectorBlocks);
417
424
  };
418
425
 
419
426
  const GridHeader = (0, _styled.default)(_core.H4)`
@@ -427,70 +434,4 @@ const GridHeader = (0, _styled.default)(_core.H4)`
427
434
  `;
428
435
  const itemGapPx = 10;
429
436
  var _default = RegisterHome;
430
- exports.default = _default;
431
-
432
- function getActionableProposalGroupsForRole(role) {
433
- return CR_QUERIES_FOR_ROLES.filter(([, roles]) => roles.has(role));
434
- }
435
-
436
- const CR_BASE_QUERY = 'objPath.indexOf("/proposals/") === 0 && objPath.endsWith("main.yaml")';
437
- const CR_QUERIES_FOR_ROLES = [['My Drafts', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {
438
- if (stakeholder && stakeholder.gitServerUsername) {
439
- const stakeholderCondition = `obj.submittingStakeholderGitServerUsername === "${stakeholder.gitServerUsername}"`;
440
- const query = `(obj.state === "${_cr.State.DRAFT}" || obj.state === "${_cr.State.RETURNED_FOR_CLARIFICATION}") && (${stakeholderCondition})`;
441
- return query;
442
- } else {
443
- return 'false';
444
- }
445
- }], ['My Rejected', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {
446
- // Rejections are actionable because they can be appealed by the submitter.
447
- if (stakeholder && stakeholder.gitServerUsername) {
448
- const stakeholderCondition = `obj.submittingStakeholderGitServerUsername === "${stakeholder.gitServerUsername}"`;
449
- const query = `(obj.state === "${_cr.State.REJECTED}") && (${stakeholderCondition})`;
450
- return query;
451
- } else {
452
- return 'false';
453
- }
454
- }], ['Everyone’s Drafts or Returned', new Set(['manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {
455
- if (stakeholder && stakeholder.gitServerUsername) {
456
- const stakeholderCondition = `obj.submittingStakeholderGitServerUsername !== "${stakeholder.gitServerUsername}"`;
457
- const query = `(obj.state === "${_cr.State.DRAFT}" || obj.state === "${_cr.State.RETURNED_FOR_CLARIFICATION}") && (${stakeholderCondition})`;
458
- return query;
459
- } else {
460
- return 'false';
461
- }
462
- }], // ['latest reviewed', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {
463
- // // TODO: Should filter only rejected perhaps?
464
- // // Approved/accepted proposals can be shown in another (public) area.
465
- // if (stakeholder && stakeholder.gitServerUsername) {
466
- // const stakeholderCondition = stakeholder?.role !== 'submitter'
467
- // ? 'true'
468
- // : `obj.submittingStakeholderGitServerUsername === "${stakeholder.gitServerUsername}"`;
469
- // // Don’t show drafts in the list of pending proposals, unless it’s user’s own drafts.
470
- // const query = `(obj.state === "${State.ACCEPTED} || obj.state === "${State.REJECTED} || obj.state === "${State.REJECTION_UPHELD_ON_APPEAL}"") && ${stakeholderCondition}`;
471
- // return query;
472
- // } else {
473
- // return 'false';
474
- // }
475
- // // TODO: Implement limit
476
- // }],
477
- // ['latest withdrawn', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {
478
- // if (stakeholder && stakeholder.gitServerUsername) {
479
- // const stakeholderCondition = stakeholder?.role !== 'submitter'
480
- // ? 'true'
481
- // : `obj.submittingStakeholderGitServerUsername === "${stakeholder.gitServerUsername}"`;
482
- // // Don’t show drafts in the list of pending proposals, unless it’s user’s own drafts.
483
- // const query = `(obj.state === "${State.WITHDRAWN}" || obj.state === "${State.APPEAL_WITHDRAWN}") && ${stakeholderCondition}`;
484
- // return query;
485
- // } else {
486
- // return 'false';
487
- // }
488
- // // TODO: Implement limit
489
- // }],
490
- ['Pending Owner Appeal Review', new Set(['owner']), function ownerProposals() {
491
- return `obj.state === "${_cr.State.APPEALED}"`;
492
- }], ['Pending Control Body Review', new Set(['control-body', 'owner']), function cbProposals() {
493
- return `obj.state === "${_cr.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW}"`;
494
- }], ['Pending Manager Review', new Set(['manager', 'control-body', 'owner']), function managerProposals() {
495
- return `obj.state === "${_cr.State.PROPOSED}"`;
496
- }]];
437
+ exports.default = _default;