@riboseinc/paneron-registry-kit 2.2.36 → 2.2.38

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 (36) hide show
  1. package/package.json +2 -2
  2. package/proposals/ListItem.d.ts +1 -0
  3. package/proposals/ListItem.js +4 -1
  4. package/proposals/ListItem.js.map +1 -1
  5. package/proposals/MetaProperties.d.ts +4 -3
  6. package/proposals/MetaProperties.js +26 -19
  7. package/proposals/MetaProperties.js.map +1 -1
  8. package/proposals/ProposalTab.d.ts +2 -0
  9. package/proposals/ProposalTab.js +12 -1
  10. package/proposals/ProposalTab.js.map +1 -1
  11. package/proposals/ProposalWorkspace.d.ts +3 -1
  12. package/proposals/ProposalWorkspace.js +9 -7
  13. package/proposals/ProposalWorkspace.js.map +1 -1
  14. package/proposals/TransitionHistory.js +10 -4
  15. package/proposals/TransitionHistory.js.map +1 -1
  16. package/proposals/actionableGroups/Tree.js +15 -0
  17. package/proposals/actionableGroups/Tree.js.map +1 -1
  18. package/proposals/actionableGroups/treeNodes.js +9 -5
  19. package/proposals/actionableGroups/treeNodes.js.map +1 -1
  20. package/views/detail/AllItems.d.ts +8 -0
  21. package/views/detail/AllItems.js +45 -0
  22. package/views/detail/AllItems.js.map +1 -0
  23. package/views/detail/ProposalWork.js +3 -1
  24. package/views/detail/ProposalWork.js.map +1 -1
  25. package/views/detail/RegisterHome/ActiveProposalDetails.js +6 -1
  26. package/views/detail/RegisterHome/ActiveProposalDetails.js.map +1 -1
  27. package/views/detail/RegisterHome2/index.js +12 -3
  28. package/views/detail/RegisterHome2/index.js.map +1 -1
  29. package/views/sidebar/Search/index.d.ts +2 -0
  30. package/views/sidebar/Search/index.js +15 -3
  31. package/views/sidebar/Search/index.js.map +1 -1
  32. package/views/sidebar/index.js +9 -3
  33. package/views/sidebar/index.js.map +1 -1
  34. package/views/util.d.ts +8 -0
  35. package/views/util.js +10 -3
  36. package/views/util.js.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riboseinc/paneron-registry-kit",
3
- "version": "2.2.36",
3
+ "version": "2.2.38",
4
4
  "main": "index.js",
5
5
  "author": "Ribose Inc. <open.source@ribose.com>",
6
6
  "scripts": {
@@ -28,7 +28,7 @@
28
28
  "@blueprintjs/select": "~4.9.10",
29
29
  "@emotion/react": "^11.10.6",
30
30
  "@emotion/styled": "^11.10.6",
31
- "@riboseinc/paneron-extension-kit": "2.2.22",
31
+ "@riboseinc/paneron-extension-kit": "2.2.25",
32
32
  "@types/react": "17.0.53",
33
33
  "@types/react-dom": "^17.0.2",
34
34
  "@types/react-helmet": "^6.1.2",
@@ -4,5 +4,6 @@ import React from 'react';
4
4
  import { type SomeCR } from './types';
5
5
  export declare const ProposalAsListItem: React.FC<{
6
6
  proposal: SomeCR;
7
+ showTime?: boolean;
7
8
  }>;
8
9
  export default ProposalAsListItem;
@@ -19,17 +19,20 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
19
19
 
20
20
  /** @jsxFrag React.Fragment */
21
21
  const ProposalAsListItem = function ({
22
- proposal
22
+ proposal,
23
+ showTime
23
24
  }) {
24
25
  const justification = (0, _types.hasSubmitterInput)(proposal) ? proposal.justification : 'N/A';
25
26
  return (0, _react2.jsx)("span", {
26
27
  title: `${justification} (proposal ID: ${proposal.id})`
27
28
  }, (0, _types.isDisposed)(proposal) ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_util.Datestamp, {
28
29
  useUTC: true,
30
+ showTimeIfNonZero: showTime,
29
31
  date: proposal.timeDisposed,
30
32
  title: "Disposed"
31
33
  }), ": ") : (0, _types.hadBeenProposed)(proposal) ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_util.Datestamp, {
32
34
  useUTC: true,
35
+ showTimeIfNonZero: showTime,
33
36
  date: proposal.timeProposed,
34
37
  title: "Proposed"
35
38
  }), ": ") : null, justification);
@@ -1 +1 @@
1
- {"version":3,"file":"ListItem.js","sourceRoot":"","sources":["../../src/proposals/ListItem.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAe,MAAM,SAAS,CAAC;AAItF,MAAM,CAAC,MAAM,kBAAkB,GAAmC,UAAU,EAAE,QAAQ,EAAE;IACtF,MAAM,aAAa,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;IAEnF,OAAO,cAAM,KAAK,EAAE,GAAG,aAAa,kBAAkB,QAAQ,CAAC,EAAE,GAAG;QACjE,UAAU,CAAC,QAAQ,CAAC;YACnB,CAAC,CAAC;gBAAE,IAAC,SAAS,IAAC,MAAM,QAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAC,UAAU,GAAG;qBAAK;YAC3E,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC;gBACzB,CAAC,CAAC;oBAAE,IAAC,SAAS,IAAC,MAAM,QAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAC,UAAU,GAAG;yBAAK;gBAC3E,CAAC,CAAC,IAAI;QACT,aAAa,CACT,CAAC;AACV,CAAC,CAAC;AAGF,eAAe,kBAAkB,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React from 'react';\nimport { jsx } from '@emotion/react';\nimport { Datestamp } from '../views/util';\nimport { isDisposed, hadBeenProposed, hasSubmitterInput, type SomeCR } from './types';\n\n\n\nexport const ProposalAsListItem: React.FC<{ proposal: SomeCR }> = function ({ proposal }) {\n const justification = hasSubmitterInput(proposal) ? proposal.justification : 'N/A';\n\n return <span title={`${justification} (proposal ID: ${proposal.id})`}>\n {isDisposed(proposal)\n ? <><Datestamp useUTC date={proposal.timeDisposed} title=\"Disposed\" />: </>\n : hadBeenProposed(proposal)\n ? <><Datestamp useUTC date={proposal.timeProposed} title=\"Proposed\" />: </>\n : null}\n {justification}\n </span>;\n};\n\n\nexport default ProposalAsListItem;\n"]}
1
+ {"version":3,"file":"ListItem.js","sourceRoot":"","sources":["../../src/proposals/ListItem.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAe,MAAM,SAAS,CAAC;AAItF,MAAM,CAAC,MAAM,kBAAkB,GAG1B,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACnC,MAAM,aAAa,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;IAEnF,OAAO,cAAM,KAAK,EAAE,GAAG,aAAa,kBAAkB,QAAQ,CAAC,EAAE,GAAG;QACjE,UAAU,CAAC,QAAQ,CAAC;YACnB,CAAC,CAAC;gBAAE,IAAC,SAAS,IAAC,MAAM,QAAC,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAC,UAAU,GAAG;qBAAK;YACxG,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC;gBACzB,CAAC,CAAC;oBAAE,IAAC,SAAS,IAAC,MAAM,QAAC,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,YAAY,EAAE,KAAK,EAAC,UAAU,GAAG;yBAAK;gBACxG,CAAC,CAAC,IAAI;QACT,aAAa,CACT,CAAC;AACV,CAAC,CAAC;AAGF,eAAe,kBAAkB,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React from 'react';\nimport { jsx } from '@emotion/react';\nimport { Datestamp } from '../views/util';\nimport { isDisposed, hadBeenProposed, hasSubmitterInput, type SomeCR } from './types';\n\n\n\nexport const ProposalAsListItem: React.FC<{\n proposal: SomeCR\n showTime?: boolean\n}> = function ({ proposal, showTime }) {\n const justification = hasSubmitterInput(proposal) ? proposal.justification : 'N/A';\n\n return <span title={`${justification} (proposal ID: ${proposal.id})`}>\n {isDisposed(proposal)\n ? <><Datestamp useUTC showTimeIfNonZero={showTime} date={proposal.timeDisposed} title=\"Disposed\" />: </>\n : hadBeenProposed(proposal)\n ? <><Datestamp useUTC showTimeIfNonZero={showTime} date={proposal.timeProposed} title=\"Proposed\" />: </>\n : null}\n {justification}\n </span>;\n};\n\n\nexport default ProposalAsListItem;\n"]}
@@ -1,13 +1,14 @@
1
1
  /** @jsx jsx */
2
2
  /** @jsxFrag React.Fragment */
3
3
  import React from 'react';
4
- import type { Register } from '../types/register';
5
- import type { RegisterStakeholder } from '../types/stakeholder';
4
+ import type { Register, RegisterStakeholder } from '../types';
6
5
  import { type SomeCR } from './types';
7
6
  /** Proposal meta properties, must be nested within a DL. */
8
7
  declare const Summary: React.FC<{
9
8
  cr: SomeCR;
9
+ register?: Register;
10
10
  currentStakeholder?: RegisterStakeholder;
11
- registerMetadata?: Register;
11
+ submittingStakeholder?: RegisterStakeholder;
12
+ compareRegisterVersion?: boolean;
12
13
  }>;
13
14
  export default Summary;
@@ -39,31 +39,38 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
39
39
  const Summary = function ({
40
40
  cr,
41
41
  currentStakeholder,
42
- registerMetadata
42
+ register,
43
+ compareRegisterVersion
43
44
  }) {
44
- var _a, _b, _c, _d, _e, _f;
45
+ var _a, _b, _c, _d, _e;
45
46
 
46
- const crStakeholder = ((_a = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.stakeholders) !== null && _a !== void 0 ? _a : []).find(s => s.gitServerUsername === cr.submittingStakeholderGitServerUsername);
47
47
  const {
48
48
  useObjectData
49
49
  } = (0, _react.useContext)(_context.DatasetContext);
50
- let latestAcceptedProposalID;
50
+ const crPath = (0, _itemPathUtils.crIDToCRPath)(cr.registerVersion);
51
+ const previousProposal = (_b = (_a = useObjectData({
52
+ objectPaths: crPath ? [crPath] : [],
53
+ nounLabel: 'proposal(s)'
54
+ }).value) === null || _a === void 0 ? void 0 : _a.data[crPath !== null && crPath !== void 0 ? crPath : '']) !== null && _b !== void 0 ? _b : crPath ? undefined : null;
55
+ const registerVersion = previousProposal && (0, _types.hasSubmitterInput)(previousProposal) ? (0, _react2.jsx)(_ListItem.default, {
56
+ showTime: true,
57
+ proposal: previousProposal
58
+ }) : (_c = cr.registerVersion) !== null && _c !== void 0 ? _c : 'N/A';
59
+ let currentVersion;
51
60
 
52
61
  try {
53
- latestAcceptedProposalID = (_c = (_b = (0, _useLatestAcceptedProposal.default)()) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : null;
62
+ currentVersion = (_e = (_d = (0, _useLatestAcceptedProposal.default)()) === null || _d === void 0 ? void 0 : _d.id) !== null && _e !== void 0 ? _e : undefined;
54
63
  } catch (e) {
55
64
  console.error("Failed to obtain latest accepted proposal");
56
- latestAcceptedProposalID = undefined;
65
+ currentVersion = undefined;
57
66
  }
58
67
 
59
- const crPath = (0, _itemPathUtils.crIDToCRPath)(cr.registerVersion);
60
- const previousProposal = (_e = (_d = useObjectData({
61
- objectPaths: crPath ? [crPath] : [],
62
- nounLabel: 'proposal(s)'
63
- }).value) === null || _d === void 0 ? void 0 : _d.data[crPath !== null && crPath !== void 0 ? crPath : '']) !== null && _e !== void 0 ? _e : crPath ? undefined : null;
64
- const versionView = previousProposal && (0, _types.hasSubmitterInput)(previousProposal) ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_ListItem.default, {
65
- proposal: previousProposal
66
- }), latestAcceptedProposalID ? (0, _react2.jsx)(_react.default.Fragment, null, "\u2002", cr.registerVersion === latestAcceptedProposalID ? (0, _react2.jsx)(_core.Tag, {
68
+ const submittingStakeholder = (0, _react.useMemo)(() => {
69
+ var _a;
70
+
71
+ return ((_a = register === null || register === void 0 ? void 0 : register.stakeholders) !== null && _a !== void 0 ? _a : []).find(s => (0, _types.isCreatedBy)(s, cr));
72
+ }, [register, cr]);
73
+ const isCurrentMarker = cr.registerVersion && compareRegisterVersion ? cr.registerVersion === currentVersion ? (0, _react2.jsx)(_core.Tag, {
67
74
  css: (0, _react2.css)`display: inline;`,
68
75
  intent: 'success',
69
76
  minimal: true,
@@ -79,13 +86,13 @@ const Summary = function ({
79
86
  }, "not current", " ", (0, _react2.jsx)(_HelpTooltip.default, {
80
87
  intent: 'warning',
81
88
  icon: 'warning-sign',
82
- content: (0, _react2.jsx)(_react.default.Fragment, null, "Register is currently at version ", (0, _react2.jsx)("strong", null, latestAcceptedProposalID), ",", " ", "which is different from version proposal author may have had in mind.", " ", "It is recommended that proposed changes are reviewed to avoid unintentionally", " ", "undoing a prior change.")
83
- }))) : null) : (_f = cr.registerVersion) !== null && _f !== void 0 ? _f : 'N/A';
84
- return (0, _react2.jsx)(_react.default.Fragment, null, crStakeholder ? (0, _react2.jsx)("div", null, (0, _react2.jsx)("dt", null, "Author:"), (0, _react2.jsx)("dd", null, (0, _react2.jsx)(_RegisterStakeholder.RegisterStakeholderListItem, {
85
- stakeholder: crStakeholder,
89
+ content: (0, _react2.jsx)(_react.default.Fragment, null, "Register is currently at version ", (0, _react2.jsx)("strong", null, currentVersion), ",", " ", "which is different from version proposal author may have had in mind.", " ", "It is recommended that proposed changes are reviewed to avoid unintentionally", " ", "undoing a prior change.")
90
+ })) : null;
91
+ return (0, _react2.jsx)(_react.default.Fragment, null, submittingStakeholder ? (0, _react2.jsx)("div", null, (0, _react2.jsx)("dt", null, "Author:"), (0, _react2.jsx)("dd", null, (0, _react2.jsx)(_RegisterStakeholder.RegisterStakeholderListItem, {
92
+ stakeholder: submittingStakeholder,
86
93
  showRole: true,
87
94
  isCurrentUser: (currentStakeholder ? (0, _types.isCreatedBy)(currentStakeholder, cr) : false) || undefined
88
- }))) : null, (0, _react2.jsx)("div", null, (0, _react2.jsx)("dt", null, "Register\u00A0version before\u00A0proposal:"), (0, _react2.jsx)("dd", null, versionView)), (0, _react2.jsx)("div", null, (0, _react2.jsx)("dt", null, "Proposal\u00A0ID:"), (0, _react2.jsx)("dd", null, (0, _react2.jsx)("code", {
95
+ }))) : null, (0, _react2.jsx)("div", null, (0, _react2.jsx)("dt", null, "Register\u00A0version before\u00A0proposal:"), (0, _react2.jsx)("dd", null, registerVersion, isCurrentMarker ? (0, _react2.jsx)(_react.default.Fragment, null, "\u2002", isCurrentMarker) : null)), (0, _react2.jsx)("div", null, (0, _react2.jsx)("dt", null, "Proposal\u00A0ID:"), (0, _react2.jsx)("dd", null, (0, _react2.jsx)("code", {
89
96
  css: (0, _react2.css)`white-space: nowrap;`
90
97
  }, cr.id))));
91
98
  };
@@ -1 +1 @@
1
- {"version":3,"file":"MetaProperties.js","sourceRoot":"","sources":["../../src/proposals/MetaProperties.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Tag } from '@blueprintjs/core';\n\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\n\nimport type { Register } from '../types/register';\nimport { RegisterStakeholderListItem } from '../views/RegisterStakeholder';\nimport type { RegisterStakeholder } from '../types/stakeholder';\nimport { crIDToCRPath } from '../views/itemPathUtils';\nimport useLatestAcceptedProposal from '../views/hooks/useLatestAcceptedProposal';\n\nimport ProposalAsListItem from './ListItem';\nimport { hasSubmitterInput, isCreatedBy, type SomeCR } from './types';\n\n\n/** Proposal meta properties, must be nested within a DL. */\nconst Summary: React.FC<{\n cr: SomeCR\n currentStakeholder?: RegisterStakeholder\n registerMetadata?: Register\n}> = function ({ cr, currentStakeholder, registerMetadata }) {\n const crStakeholder = (registerMetadata?.stakeholders ?? []).\n find(s => s.gitServerUsername === cr.submittingStakeholderGitServerUsername);\n\n const { useObjectData } = useContext(DatasetContext);\n\n let latestAcceptedProposalID: string | null | undefined;\n try {\n latestAcceptedProposalID = useLatestAcceptedProposal()?.id ?? null;\n } catch (e) {\n console.error(\"Failed to obtain latest accepted proposal\");\n latestAcceptedProposalID = undefined;\n }\n\n const crPath = crIDToCRPath(cr.registerVersion);\n const previousProposal = useObjectData({\n objectPaths: crPath ? [crPath] : [],\n nounLabel: 'proposal(s)',\n }).value?.data[crPath ?? ''] as unknown ?? (crPath ? undefined : null);\n const versionView = previousProposal && hasSubmitterInput(previousProposal)\n ? <>\n <ProposalAsListItem proposal={previousProposal as SomeCR} />\n {latestAcceptedProposalID\n ? <>\n &ensp;\n {cr.registerVersion === latestAcceptedProposalID\n ? <Tag css={css`display: inline;`} intent='success' minimal round>\n current\n {\" \"}\n <HelpTooltip intent='success' content={<>\n Published version of the register\n {\" \"}\n had not changed since this proposal started.\n </>} />\n </Tag>\n : <Tag css={css`display: inline;`} intent='warning' minimal round>\n not current\n {\" \"}\n <HelpTooltip intent='warning' icon='warning-sign' content={<>\n Register is currently at version <strong>{latestAcceptedProposalID}</strong>,\n {\" \"}\n which is different from version proposal author may have had in mind.\n {\" \"}\n It is recommended that proposed changes are reviewed to avoid unintentionally\n {\" \"}\n undoing a prior change.\n </>} />\n </Tag>}\n </>\n : null}\n </>\n : cr.registerVersion ?? 'N/A';\n\n return (\n <>\n {crStakeholder\n ? <div>\n <dt>Author:</dt>\n <dd>\n <RegisterStakeholderListItem\n stakeholder={crStakeholder}\n showRole\n isCurrentUser={(currentStakeholder\n ? isCreatedBy(currentStakeholder, cr)\n : false) || undefined}\n />\n </dd>\n </div>\n : null}\n\n <div>\n <dt>\n Register&nbsp;version before&nbsp;proposal:\n </dt>\n <dd>\n {versionView}\n </dd>\n </div>\n\n <div>\n <dt>Proposal&nbsp;ID:</dt>\n <dd><code css={css`white-space: nowrap;`}>{cr.id}</code></dd>\n </div>\n </>\n );\n};\n\nexport default Summary;\n"]}
1
+ {"version":3,"file":"MetaProperties.js","sourceRoot":"","sources":["../../src/proposals/MetaProperties.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useMemo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Tag } from '@blueprintjs/core';\n\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\n\nimport { RegisterStakeholderListItem } from '../views/RegisterStakeholder';\nimport type { Register, RegisterStakeholder } from '../types';\nimport { crIDToCRPath } from '../views/itemPathUtils';\nimport useLatestAcceptedProposal from '../views/hooks/useLatestAcceptedProposal';\n\nimport ProposalAsListItem from './ListItem';\nimport { hasSubmitterInput, isCreatedBy, type SomeCR } from './types';\n\n\n/** Proposal meta properties, must be nested within a DL. */\nconst Summary: React.FC<{\n cr: SomeCR\n register?: Register\n currentStakeholder?: RegisterStakeholder\n submittingStakeholder?: RegisterStakeholder\n compareRegisterVersion?: boolean\n}> = function ({ cr, currentStakeholder, register, compareRegisterVersion }) {\n const { useObjectData } = useContext(DatasetContext);\n\n const crPath = crIDToCRPath(cr.registerVersion);\n const previousProposal = useObjectData({\n objectPaths: crPath ? [crPath] : [],\n nounLabel: 'proposal(s)',\n }).value?.data[crPath ?? ''] as unknown ?? (crPath ? undefined : null);\n\n const registerVersion = previousProposal && hasSubmitterInput(previousProposal)\n ? <ProposalAsListItem showTime proposal={previousProposal as SomeCR} />\n : cr.registerVersion ?? 'N/A';\n\n let currentVersion: string | undefined;\n try {\n currentVersion = useLatestAcceptedProposal()?.id ?? undefined;\n } catch (e) {\n console.error(\"Failed to obtain latest accepted proposal\");\n currentVersion = undefined;\n }\n\n const submittingStakeholder = useMemo(\n (() => (register?.stakeholders ?? []).find(s => isCreatedBy(s, cr))),\n [register, cr]);\n\n const isCurrentMarker = cr.registerVersion && compareRegisterVersion\n ? cr.registerVersion === currentVersion\n ? <Tag css={css`display: inline;`} intent='success' minimal round>\n current\n {\" \"}\n <HelpTooltip intent='success' content={<>\n Published version of the register\n {\" \"}\n had not changed since this proposal started.\n </>} />\n </Tag>\n : <Tag css={css`display: inline;`} intent='warning' minimal round>\n not current\n {\" \"}\n <HelpTooltip intent='warning' icon='warning-sign' content={<>\n Register is currently at version <strong>{currentVersion}</strong>,\n {\" \"}\n which is different from version proposal author may have had in mind.\n {\" \"}\n It is recommended that proposed changes are reviewed to avoid unintentionally\n {\" \"}\n undoing a prior change.\n </>} />\n </Tag>\n : null;\n\n return (\n <>\n {submittingStakeholder\n ? <div>\n <dt>Author:</dt>\n <dd>\n <RegisterStakeholderListItem\n stakeholder={submittingStakeholder}\n showRole\n isCurrentUser={(currentStakeholder\n ? isCreatedBy(currentStakeholder, cr)\n : false) || undefined}\n />\n </dd>\n </div>\n : null}\n\n <div>\n <dt>\n Register&nbsp;version before&nbsp;proposal:\n </dt>\n <dd>\n {registerVersion}\n {isCurrentMarker ? <>&ensp;{isCurrentMarker}</> : null}\n </dd>\n </div>\n\n <div>\n <dt>Proposal&nbsp;ID:</dt>\n <dd><code css={css`white-space: nowrap;`}>{cr.id}</code></dd>\n </div>\n </>\n );\n};\n\nexport default Summary;\n"]}
@@ -5,8 +5,10 @@ import type { Register, RegisterStakeholder } from '../types';
5
5
  import { type SomeCR as CR } from './types';
6
6
  declare const ProposalTab: React.VoidFunctionComponent<{
7
7
  proposal: CR;
8
+ onDeactivate?: () => void;
8
9
  onDelete?: () => void;
9
10
  register: Register;
11
+ /** Currently active stakeholder. */
10
12
  stakeholder?: RegisterStakeholder;
11
13
  }>;
12
14
  export default ProposalTab;
@@ -30,6 +30,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
30
30
  /** @jsxFrag React.Fragment */
31
31
  const ProposalTab = function ({
32
32
  proposal,
33
+ onDeactivate,
33
34
  onDelete,
34
35
  register,
35
36
  stakeholder
@@ -80,14 +81,24 @@ const ProposalTab = function ({
80
81
  });
81
82
  }
82
83
 
84
+ if (onDeactivate) {
85
+ actions.push({
86
+ text: "Exit proposal",
87
+ title: "Click to deactivate this proposal and leave it as is for now.",
88
+ intent: "primary",
89
+ onClick: onDeactivate
90
+ });
91
+ }
92
+
83
93
  return actions;
84
- }, [onDelete]);
94
+ }, [onDelete, onDeactivate]);
85
95
  return (0, _react2.jsx)(_util.TabContentsWithHeader, {
86
96
  title: (0, _react2.jsx)(_react.default.Fragment, null, proposal.justification),
87
97
  classification: classification,
88
98
  actions: actions
89
99
  }, (0, _react2.jsx)(_ProposalWorkspace.default, {
90
100
  proposal: proposal,
101
+ compareRegisterVersion: !(0, _types.hadBeenAccepted)(proposal),
91
102
  register: register,
92
103
  stakeholder: stakeholder,
93
104
  onOpenItem: selectItem
@@ -1 +1 @@
1
- {"version":3,"file":"ProposalTab.js","sourceRoot":"","sources":["../../src/proposals/ProposalTab.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo, useState } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n UL,\n type Intent,\n type IconName,\n} from '@blueprintjs/core';\n\nimport type { Register, RegisterStakeholder } from '../types';\nimport { TabContentsWithHeader, Datestamp } from '../views/util';\nimport { type SomeCR as CR, isDisposed, hadBeenProposed, hadBeenAccepted } from './types';\n\nimport Workspace from './ProposalWorkspace';\nimport ProposalBrowser from './ProposalBrowser';\n\n\nconst ProposalTab: React.VoidFunctionComponent<{\n proposal: CR\n onDelete?: () => void\n register: Register\n stakeholder?: RegisterStakeholder\n}> = function ({ proposal, onDelete, register, stakeholder }) {\n const pending = !isDisposed(proposal);\n const proposedMarker = <>\n Proposed: {hadBeenProposed(proposal)\n ? <Datestamp date={proposal.timeProposed} />\n : 'not yet'}\n </>;\n const disposedMarker = <>\n Disposed: {!pending\n ? <Datestamp date={proposal.timeDisposed} />\n : 'not yet'}\n </>;\n const editedMarker = <>Edited: <Datestamp date={proposal.timeEdited} /></>;\n const classification = useMemo(() => {\n return [{\n icon: 'lightbulb' as IconName,\n children: \"Proposal\",\n tooltip: {\n icon: 'info-sign' as IconName,\n content: <UL css={css`margin: 0;`}>\n <li>Proposal ID: {proposal.id}</li>\n </UL>,\n },\n }, {\n children: pending\n ? <>pending</>\n : <>disposed</>,\n }, {\n children: proposal.state?.replaceAll('-', ' ') || 'N/A',\n tooltip: {\n icon: 'history' as IconName,\n content: <UL css={css`margin: 0;`}>\n <li>{editedMarker}</li>\n <li>{proposedMarker}</li>\n <li>{disposedMarker}</li>\n </UL>,\n },\n intent: proposal.state === 'accepted'\n ? 'success'\n : proposal.state === 'returned-for-clarification'\n ? 'warning'\n : proposal.state === 'withdrawn' || proposal.state === 'rejected'\n ? 'danger'\n : proposal.state === 'draft'\n ? undefined\n : 'primary' as Intent,\n }];\n }, [\n proposal.state,\n pending,\n editedMarker, proposedMarker, disposedMarker,\n ]);\n\n const [selectedItem, selectItem] = useState<string | null>(null);\n\n const actions = useMemo(() => {\n const actions = [];\n if (onDelete) {\n actions.push({\n text: \"Delete this proposal\",\n onClick: onDelete,\n });\n }\n return actions;\n }, [onDelete]);\n\n return (\n <TabContentsWithHeader\n title={<>{proposal.justification}</>}\n classification={classification}\n actions={actions}>\n <Workspace\n proposal={proposal}\n register={register}\n stakeholder={stakeholder}\n onOpenItem={selectItem}\n />\n <ProposalBrowser\n hadBeenAccepted={hadBeenAccepted(proposal)}\n proposals={proposal.items}\n onSelectItem={selectItem}\n selectedItem={selectedItem}\n />\n </TabContentsWithHeader>\n );\n\n};\n\nexport default ProposalTab;\n"]}
1
+ {"version":3,"file":"ProposalTab.js","sourceRoot":"","sources":["../../src/proposals/ProposalTab.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo, useState } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n UL,\n type Intent,\n type IconName,\n} from '@blueprintjs/core';\n\nimport type { Register, RegisterStakeholder } from '../types';\nimport { TabContentsWithHeader, Datestamp } from '../views/util';\n\nimport { type SomeCR as CR, isDisposed, hadBeenProposed, hadBeenAccepted } from './types';\nimport Workspace from './ProposalWorkspace';\nimport ProposalBrowser from './ProposalBrowser';\n\n\nconst ProposalTab: React.VoidFunctionComponent<{\n proposal: CR\n onDeactivate?: () => void\n onDelete?: () => void\n register: Register\n /** Currently active stakeholder. */\n stakeholder?: RegisterStakeholder\n}> = function ({ proposal, onDeactivate, onDelete, register, stakeholder }) {\n const pending = !isDisposed(proposal);\n const proposedMarker = <>\n Proposed: {hadBeenProposed(proposal)\n ? <Datestamp date={proposal.timeProposed} />\n : 'not yet'}\n </>;\n const disposedMarker = <>\n Disposed: {!pending\n ? <Datestamp date={proposal.timeDisposed} />\n : 'not yet'}\n </>;\n const editedMarker = <>\n Edited: <Datestamp date={proposal.timeEdited} />\n </>;\n const classification = useMemo(() => {\n return [{\n icon: 'lightbulb' as IconName,\n children: \"Proposal\",\n tooltip: {\n icon: 'info-sign' as IconName,\n content: <UL css={css`margin: 0;`}>\n <li>Proposal ID: {proposal.id}</li>\n </UL>,\n },\n }, {\n children: pending\n ? <>pending</>\n : <>disposed</>,\n }, {\n children: proposal.state?.replaceAll('-', ' ') || 'N/A',\n tooltip: {\n icon: 'history' as IconName,\n content: <UL css={css`margin: 0;`}>\n <li>{editedMarker}</li>\n <li>{proposedMarker}</li>\n <li>{disposedMarker}</li>\n </UL>,\n },\n intent: proposal.state === 'accepted'\n ? 'success'\n : proposal.state === 'returned-for-clarification'\n ? 'warning'\n : proposal.state === 'withdrawn' || proposal.state === 'rejected'\n ? 'danger'\n : proposal.state === 'draft'\n ? undefined\n : 'primary' as Intent,\n }];\n }, [\n proposal.state,\n pending,\n editedMarker, proposedMarker, disposedMarker,\n ]);\n\n const [selectedItem, selectItem] = useState<string | null>(null);\n\n const actions = useMemo(() => {\n const actions = [];\n if (onDelete) {\n actions.push({\n text: \"Delete this proposal\",\n onClick: onDelete,\n });\n }\n if (onDeactivate) {\n actions.push({\n text: \"Exit proposal\",\n title: \"Click to deactivate this proposal and leave it as is for now.\",\n intent: \"primary\" as Intent,\n onClick: onDeactivate,\n });\n }\n return actions;\n }, [onDelete, onDeactivate]);\n\n return (\n <TabContentsWithHeader\n title={<>{proposal.justification}</>}\n classification={classification}\n actions={actions}>\n <Workspace\n proposal={proposal}\n compareRegisterVersion={!hadBeenAccepted(proposal)}\n register={register}\n stakeholder={stakeholder}\n onOpenItem={selectItem}\n />\n <ProposalBrowser\n hadBeenAccepted={hadBeenAccepted(proposal)}\n proposals={proposal.items}\n onSelectItem={selectItem}\n selectedItem={selectedItem}\n />\n </TabContentsWithHeader>\n );\n\n};\n\nexport default ProposalTab;\n"]}
@@ -5,7 +5,9 @@ import type { Register, RegisterStakeholder } from '../types';
5
5
  import { type SomeCR as CR } from './types';
6
6
  declare const ProposalWorkspace: React.VoidFunctionComponent<{
7
7
  proposal: CR;
8
- register: Register;
8
+ compareRegisterVersion?: boolean;
9
+ register?: Register;
10
+ /** Current stakeholder. */
9
11
  stakeholder?: RegisterStakeholder;
10
12
  /** If not specified, opening an item will spawn its tab. */
11
13
  onOpenItem?: (itemPath: string | null) => void;
@@ -17,15 +17,15 @@ var _Workspace = _interopRequireDefault(require("@riboseinc/paneron-extension-ki
17
17
 
18
18
  var _SuperSidebar = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/SuperSidebar"));
19
19
 
20
+ var _Search = _interopRequireDefault(require("../views/sidebar/Search"));
21
+
20
22
  var _util = require("../views/util");
21
23
 
22
24
  var _models = require("../views/FilterCriteria/models");
23
25
 
24
26
  var _MetaProperties = _interopRequireDefault(require("./MetaProperties"));
25
27
 
26
- var _Search = _interopRequireDefault(require("./Search"));
27
-
28
- var _Search2 = _interopRequireDefault(require("../views/sidebar/Search"));
28
+ var _Search2 = _interopRequireDefault(require("./Search"));
29
29
 
30
30
  var _TransitionOptions = _interopRequireWildcard(require("./TransitionOptions"));
31
31
 
@@ -44,6 +44,7 @@ const SIDEBAR_IDS = ['meta'];
44
44
 
45
45
  const ProposalWorkspace = function ({
46
46
  proposal,
47
+ compareRegisterVersion,
47
48
  register,
48
49
  stakeholder,
49
50
  onOpenItem
@@ -65,7 +66,8 @@ const ProposalWorkspace = function ({
65
66
  }, "\u201C", (_a = proposal.justification) === null || _a === void 0 ? void 0 : _a.trim(), "\u201D", (0, _react2.jsx)("br", null), (0, _react2.jsx)(_DL.WrappableDL, null, (0, _react2.jsx)(_MetaProperties.default, {
66
67
  cr: proposal,
67
68
  currentStakeholder: stakeholder,
68
- registerMetadata: register
69
+ register: register,
70
+ compareRegisterVersion: compareRegisterVersion
69
71
  })))
70
72
  }, {
71
73
  key: 'transitions',
@@ -77,7 +79,7 @@ const ProposalWorkspace = function ({
77
79
  }]
78
80
  }
79
81
  };
80
- }, [register, stakeholder, proposal]);
82
+ }, [compareRegisterVersion, register, stakeholder, proposal]);
81
83
  return (0, _react2.jsx)(_Workspace.default, {
82
84
  sidebarPosition: "right",
83
85
  sidebar: (0, _react2.jsx)(_SuperSidebar.default, {
@@ -88,12 +90,12 @@ const ProposalWorkspace = function ({
88
90
  })
89
91
  }, (0, _react2.jsx)(_util.RegisterHelmet, null, (0, _react2.jsx)("title", null, "Working on proposal ", proposal.justification)), (0, _react2.jsx)("div", {
90
92
  css: (0, _react2.css)`padding: 10px; flex: 1; display: flex; flex-flow: column nowrap; overflow: hidden;`
91
- }, (0, _react2.jsx)(_Search2.default, {
93
+ }, (0, _react2.jsx)(_Search.default, {
92
94
  css: (0, _react2.css)`flex: 1;`,
93
95
  //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}
94
96
  implicitCriteria: _models.MATCHES_ANY_CRITERIA,
95
97
  stateName: `proposal-${proposal.id}-search`,
96
- List: _Search.default,
98
+ List: _Search2.default,
97
99
  extraData: {
98
100
  proposal
99
101
  },
@@ -1 +1 @@
1
- {"version":3,"file":"ProposalWorkspace.js","sourceRoot":"","sources":["../../src/proposals/ProposalWorkspace.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo, useState } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n Icon,\n Checkbox,\n} from '@blueprintjs/core';\n\nimport { WrappableDL as DL } from '@riboseinc/paneron-extension-kit/widgets/DL';\nimport Workspace from '@riboseinc/paneron-extension-kit/widgets/Workspace';\nimport SuperSidebar from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/SuperSidebar';\n\nimport type { Register, RegisterStakeholder } from '../types';\nimport { RegisterHelmet as Helmet } from '../views/util';\nimport { MATCHES_ANY_CRITERIA } from '../views/FilterCriteria/models';\nimport { type SomeCR as CR } from './types';\nimport MetaProperties from './MetaProperties';\nimport ProposalSearch from './Search';\nimport Search from '../views/sidebar/Search';\nimport TransitionOptions, { getTransitions, isFinalState } from './TransitionOptions';\nimport TransitionsAndStatus, { getTransitionHistory } from './TransitionHistory';\n\n\nconst SIDEBAR_IDS = ['meta'] as const;\n\n\nconst ProposalWorkspace: React.VoidFunctionComponent<{\n proposal: CR\n register: Register\n stakeholder?: RegisterStakeholder\n\n /** If not specified, opening an item will spawn its tab. */\n onOpenItem?: (itemPath: string | null) => void\n}> = function ({ proposal, register, stakeholder, onOpenItem }) {\n const sidebarConfig = useMemo(() => {\n return {\n meta: {\n icon: () => <Icon icon=\"document\" />,\n title: \"Meta\",\n blocks: [{\n key: 'summary',\n title: \"Summary\",\n content: <div css={css`padding: 0 5px;`}>\n “{proposal.justification?.trim()}”\n <br />\n <DL>\n <MetaProperties\n cr={proposal}\n currentStakeholder={stakeholder}\n registerMetadata={register}\n />\n </DL>\n </div>,\n }, {\n key: 'transitions',\n title: \"Transitions\",\n content: <TransitionBlockContents\n proposal={proposal}\n stakeholder={stakeholder}\n />,\n }],\n },\n };\n }, [register, stakeholder, proposal]);\n return (\n <Workspace sidebarPosition=\"right\" sidebar={\n <SuperSidebar\n sidebarIDs={SIDEBAR_IDS}\n css={css`width: 30% !important; min-width: 300px;`}\n selectedSidebarID='meta'\n config={sidebarConfig}\n />\n }>\n <Helmet><title>Working on proposal {proposal.justification}</title></Helmet>\n <div css={css`padding: 10px; flex: 1; display: flex; flex-flow: column nowrap; overflow: hidden;`}>\n <Search\n css={css`flex: 1;`}\n //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}\n implicitCriteria={MATCHES_ANY_CRITERIA}\n stateName={`proposal-${proposal.id}-search`}\n List={ProposalSearch as any}\n extraData={{ proposal }}\n onOpenItem={onOpenItem}\n />\n </div>\n </Workspace>\n );\n};\n\nexport default ProposalWorkspace;\n\n\nconst TransitionBlockContents: React.VoidFunctionComponent<{\n proposal: CR\n stakeholder?: RegisterStakeholder\n}> = function ({ proposal, stakeholder }) {\n const transitions = useMemo(\n (() => stakeholder\n ? getTransitions(proposal, stakeholder)\n : []),\n [proposal, stakeholder]);\n\n const [showDetailedHistory, setShowDetailedHistory] = useState(false);\n\n const transitionsBlock = useMemo(\n (() =>\n <div css={css`overflow-y: auto; max-height: 300px;`}>\n <Checkbox\n // NOTE: left margin aligns with transition history bullets…\n css={css`margin: 5px 15px;`}\n checked={showDetailedHistory}\n onChange={(evt) => setShowDetailedHistory(evt.currentTarget.checked)}>\n Show detailed history\n </Checkbox>\n <TransitionsAndStatus\n pastTransitions={getTransitionHistory(proposal)}\n isFinal={isFinalState(proposal.state)}\n detailed={showDetailedHistory}\n />\n {!showDetailedHistory && transitions.length > 0\n ? <TransitionOptions\n stakeholder={stakeholder}\n transitions={transitions}\n cr={proposal}\n css={css`padding: 12px;`}\n />\n : null}\n </div>),\n [proposal, transitions, setShowDetailedHistory, showDetailedHistory]);\n\n return transitionsBlock;\n}\n"]}
1
+ {"version":3,"file":"ProposalWorkspace.js","sourceRoot":"","sources":["../../src/proposals/ProposalWorkspace.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo, useState } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n Icon,\n Checkbox,\n} from '@blueprintjs/core';\n\nimport { WrappableDL as DL } from '@riboseinc/paneron-extension-kit/widgets/DL';\nimport Workspace from '@riboseinc/paneron-extension-kit/widgets/Workspace';\nimport SuperSidebar from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/SuperSidebar';\n\nimport type { Register, RegisterStakeholder } from '../types';\nimport Search from '../views/sidebar/Search';\nimport { RegisterHelmet as Helmet } from '../views/util';\nimport { MATCHES_ANY_CRITERIA } from '../views/FilterCriteria/models';\nimport { type SomeCR as CR } from './types';\nimport MetaProperties from './MetaProperties';\nimport ProposalSearch from './Search';\nimport TransitionOptions, { getTransitions, isFinalState } from './TransitionOptions';\nimport TransitionsAndStatus, { getTransitionHistory } from './TransitionHistory';\n\n\nconst SIDEBAR_IDS = ['meta'] as const;\n\n\nconst ProposalWorkspace: React.VoidFunctionComponent<{\n proposal: CR\n compareRegisterVersion?: boolean\n register?: Register\n\n /** Current stakeholder. */\n stakeholder?: RegisterStakeholder\n\n /** If not specified, opening an item will spawn its tab. */\n onOpenItem?: (itemPath: string | null) => void\n}> = function ({ proposal, compareRegisterVersion, register, stakeholder, onOpenItem }) {\n\n const sidebarConfig = useMemo(() => {\n return {\n meta: {\n icon: () => <Icon icon=\"document\" />,\n title: \"Meta\",\n blocks: [{\n key: 'summary',\n title: \"Summary\",\n content: <div css={css`padding: 0 5px;`}>\n “{proposal.justification?.trim()}”\n <br />\n <DL>\n <MetaProperties\n cr={proposal}\n currentStakeholder={stakeholder}\n register={register}\n compareRegisterVersion={compareRegisterVersion}\n />\n </DL>\n </div>,\n }, {\n key: 'transitions',\n title: \"Transitions\",\n content: <TransitionBlockContents\n proposal={proposal}\n stakeholder={stakeholder}\n />,\n }],\n },\n };\n }, [compareRegisterVersion, register, stakeholder, proposal]);\n\n return (\n <Workspace sidebarPosition=\"right\" sidebar={\n <SuperSidebar\n sidebarIDs={SIDEBAR_IDS}\n css={css`width: 30% !important; min-width: 300px;`}\n selectedSidebarID='meta'\n config={sidebarConfig}\n />\n }>\n <Helmet><title>Working on proposal {proposal.justification}</title></Helmet>\n <div css={css`padding: 10px; flex: 1; display: flex; flex-flow: column nowrap; overflow: hidden;`}>\n <Search\n css={css`flex: 1;`}\n //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}\n implicitCriteria={MATCHES_ANY_CRITERIA}\n stateName={`proposal-${proposal.id}-search`}\n List={ProposalSearch as any}\n extraData={{ proposal }}\n onOpenItem={onOpenItem}\n />\n </div>\n </Workspace>\n );\n};\n\nexport default ProposalWorkspace;\n\n\nconst TransitionBlockContents: React.VoidFunctionComponent<{\n proposal: CR\n stakeholder?: RegisterStakeholder\n}> = function ({ proposal, stakeholder }) {\n const transitions = useMemo(\n (() => stakeholder\n ? getTransitions(proposal, stakeholder)\n : []),\n [proposal, stakeholder]);\n\n const [showDetailedHistory, setShowDetailedHistory] = useState(false);\n\n const transitionsBlock = useMemo(\n (() =>\n <div css={css`overflow-y: auto; max-height: 300px;`}>\n <Checkbox\n // NOTE: left margin aligns with transition history bullets…\n css={css`margin: 5px 15px;`}\n checked={showDetailedHistory}\n onChange={(evt) => setShowDetailedHistory(evt.currentTarget.checked)}>\n Show detailed history\n </Checkbox>\n <TransitionsAndStatus\n pastTransitions={getTransitionHistory(proposal)}\n isFinal={isFinalState(proposal.state)}\n detailed={showDetailedHistory}\n />\n {!showDetailedHistory && transitions.length > 0\n ? <TransitionOptions\n stakeholder={stakeholder}\n transitions={transitions}\n cr={proposal}\n css={css`padding: 12px;`}\n />\n : null}\n </div>),\n [proposal, transitions, setShowDetailedHistory, showDetailedHistory]);\n\n return transitionsBlock;\n}\n"]}
@@ -20,6 +20,8 @@ var _HelpTooltip = _interopRequireDefault(require("@riboseinc/paneron-extension-
20
20
 
21
21
  var _InlineDiff = require("../views/diffing/InlineDiff");
22
22
 
23
+ var _util2 = require("../views/util");
24
+
23
25
  var _RegisterStakeholder = require("../views/RegisterStakeholder");
24
26
 
25
27
  var CR = _interopRequireWildcard(require("./types"));
@@ -173,7 +175,7 @@ const TransitionsAndStatus = function ({
173
175
  detailed
174
176
  }) {
175
177
  return (0, _react.jsx)(_react2.default.Fragment, null, pastTransitions.map((entry, idx) => {
176
- var _a, _b, _c;
178
+ var _a, _b;
177
179
 
178
180
  if (entry) {
179
181
  const {
@@ -190,14 +192,18 @@ const TransitionsAndStatus = function ({
190
192
  val: (0, _util.normalizeObjectRecursively)(input)
191
193
  })) : null, (0, _react.jsx)("small", {
192
194
  css: (0, _react.css)`display: block;`
193
- }, stakeholder ? (0, _react.jsx)("span", null, (0, _RegisterStakeholder.registerStakeholderPlain)(stakeholder)) : 'unknown stakeholder', (0, _react.jsx)("br", null), "at ", timestamp ? ((_a = timestamp.toISOString) === null || _a === void 0 ? void 0 : _a.call(timestamp)) || timestamp : 'unknown time')) : null;
195
+ }, stakeholder ? (0, _react.jsx)("span", null, (0, _RegisterStakeholder.registerStakeholderPlain)(stakeholder)) : 'unknown stakeholder', (0, _react.jsx)("br", null), "at ", timestamp ? (0, _react.jsx)(_util2.Datestamp, {
196
+ useUTC: true,
197
+ showTime: true,
198
+ date: timestamp
199
+ }) : "unknown time")) : null;
194
200
  return (0, _react.jsx)(TransitionEntryWrapper, {
195
201
  title: `Transition ${fromState ? `from ${fromState} ` : ''}to ${toState}`,
196
202
  css: (0, _react.css)`
197
203
  background: linear-gradient(
198
204
  345deg,
199
- ${(_b = _TransitionOptions.STATE_COLOR[toState]) !== null && _b !== void 0 ? _b : _core.Colors.GRAY1}aa,
200
- ${(_c = _TransitionOptions.STATE_COLOR[toState]) !== null && _c !== void 0 ? _c : _core.Colors.GRAY1} 50%);
205
+ ${(_a = _TransitionOptions.STATE_COLOR[toState]) !== null && _a !== void 0 ? _a : _core.Colors.GRAY1}aa,
206
+ ${(_b = _TransitionOptions.STATE_COLOR[toState]) !== null && _b !== void 0 ? _b : _core.Colors.GRAY1} 50%);
201
207
  position: sticky;
202
208
  top: ${idx * 3}px;
203
209
  z-index: 1;
@@ -1 +1 @@
1
- {"version":3,"file":"TransitionHistory.js","sourceRoot":"","sources":["../../src/proposals/TransitionHistory.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport styled from '@emotion/styled';\nimport { jsx, css } from '@emotion/react';\nimport React from 'react';\nimport { Icon, Colors } from '@blueprintjs/core';\n\nimport { normalizeObjectRecursively } from '@riboseinc/paneron-extension-kit/util';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\n\nimport { Val } from '../views/diffing/InlineDiff';\nimport { registerStakeholderPlain } from '../views/RegisterStakeholder';\nimport { type RegisterStakeholder } from '../types/stakeholder';\n\nimport * as CR from './types';\nimport { STATE_COLOR } from './TransitionOptions';\n\n\n/**\n * Transition history entry is mostly like `CR.TransitionEntry`,\n * except it has optional fields and can be `undefined` to represent\n * missing parts of history.\n */\nexport type TransitionHistoryEntry = Omit<CR.TransitionEntry, 'timestamp' | 'fromState' | 'stakeholder' | 'input'> & {\n timestamp?: Date\n fromState?: CR.StateType\n stakeholder?: RegisterStakeholder\n input?: CR.StateInput\n} | undefined;\n\n\n/**\n * Outputs transition history,\n * back-filling it from state and timestamps if `pastTransitions` is not present.\n */\nexport function getTransitionHistory(cr: CR.Base): TransitionHistoryEntry[] {\n if (cr.pastTransitions && cr.pastTransitions.length > 0) {\n return [{\n label: \"Create\",\n toState: CR.State.DRAFT,\n timestamp: (cr as CR.Drafted).timeStarted,\n }, ...cr.pastTransitions];\n\n } else {\n const els: TransitionHistoryEntry[] = [];\n\n els.push({\n label: \"Create\",\n toState: CR.State.DRAFT,\n timestamp: (cr as CR.Drafted).timeStarted,\n });\n\n if (!CR.isDrafted(cr)) {\n els.push(undefined);\n }\n\n // Backward compatibility\n\n if (CR.isProposed(cr)) {\n els.push({\n label: \"Propose\",\n toState: CR.State.PROPOSED,\n timestamp: cr.timeProposed,\n input: { justification: cr.justification },\n });\n }\n\n if (CR.isSubmittedForControlBodyReview(cr)) {\n els.push({\n label: \"Submit for control body review\",\n fromState: CR.State.PROPOSED,\n toState: CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW,\n input: { registerManagerNotes: cr.registerManagerNotes },\n });\n }\n\n if (CR.isReturnedForClarification(cr)) {\n els.push({\n label: \"Return for clarification\",\n toState: CR.State.RETURNED_FOR_CLARIFICATION,\n input: {\n registerManagerNotes: cr.registerManagerNotes,\n controlBodyNotes: (cr as any).controlBodyNotes,\n controlBodyDecisionEvent: (cr as any).controlBodyDecisionEvent,\n },\n });\n }\n\n if (CR.isWithdrawn(cr)) {\n els.push({\n label: \"Withdraw\",\n toState: CR.State.WITHDRAWN,\n timestamp: cr.timeDisposed,\n });\n } else if (CR.isAccepted(cr)) {\n els.push({\n label: \"Accept\",\n toState: CR.State.ACCEPTED,\n timestamp: cr.timeDisposed,\n input: {\n controlBodyNotes: (cr as any).controlBodyNotes,\n controlBodyDecisionEvent: (cr as any).controlBodyDecisionEvent,\n },\n });\n } else if (CR.isRejected(cr)) {\n els.push({\n label: \"Reject\",\n toState: CR.State.REJECTED,\n timestamp: cr.timeDisposed,\n input: {\n controlBodyNotes: (cr as any).controlBodyNotes,\n controlBodyDecisionEvent: (cr as any).controlBodyDecisionEvent,\n },\n });\n }\n\n if (CR.isAppealed(cr)) {\n els.push({\n label: \"Appeal\",\n toState: CR.State.APPEALED,\n input: {\n appealReason: cr.appealReason,\n },\n });\n }\n\n if (CR.isRejectedWithAppealWithdrawn(cr)) {\n els.push({\n label: \"Withdraw appeal\",\n toState: CR.State.APPEAL_WITHDRAWN,\n timestamp: cr.timeDisposed,\n });\n } else if (CR.isAcceptedOnAppeal(cr)) {\n els.push({\n label: \"Accept on appeal\",\n toState: CR.State.ACCEPTED_ON_APPEAL,\n timestamp: cr.timeDisposed,\n input: {\n registerOwnerNotes: cr.registerOwnerNotes,\n },\n });\n } else if (CR.isRejectedOnAppeal(cr)) {\n els.push({\n label: \"Uphold rejection\",\n toState: CR.State.REJECTION_UPHELD_ON_APPEAL,\n timestamp: cr.timeDisposed,\n input: {\n registerOwnerNotes: cr.registerOwnerNotes,\n },\n });\n }\n return els;\n }\n}\n\n\n/**\n * Lists transitions between states,\n * emphasizing the end (current as of now) state.\n */\nexport const TransitionsAndStatus: React.VoidFunctionComponent<{\n pastTransitions: TransitionHistoryEntry[]\n isFinal?: boolean\n detailed?: boolean\n}> = function ({ pastTransitions, isFinal, detailed }) {\n return (\n <>\n {pastTransitions.map((entry, idx) => {\n if (entry) {\n const { label, stakeholder, fromState, toState, input, timestamp } = entry;\n const details = input || timestamp || stakeholder\n ? <>\n {input\n ? <div css={css`margin: .25em 0;`}><Val val={normalizeObjectRecursively(input)} /></div>\n : null}\n <small css={css`display: block;`}>\n {stakeholder\n ? <span>{registerStakeholderPlain(stakeholder)}</span>\n : 'unknown stakeholder'}\n <br />\n at {timestamp\n ? (timestamp.toISOString?.() || timestamp)\n : 'unknown time'}\n </small>\n </>\n : null;\n return <TransitionEntryWrapper\n title={`Transition ${fromState ? `from ${fromState} ` : ''}to ${toState}`}\n css={css`\n background: linear-gradient(\n 345deg,\n ${STATE_COLOR[toState] ?? Colors.GRAY1}aa,\n ${STATE_COLOR[toState] ?? Colors.GRAY1} 50%);\n position: sticky;\n top: ${idx * 3}px;\n z-index: 1;\n ${idx === pastTransitions.length - 1\n ? `\n ${!detailed ? 'font-weight: bold;' : ''}\n ${isFinal\n ? `\n &::before {\n ${transitionEntryDecorativeMarkerFinal}\n }\n `\n : ''}\n `\n : ''}\n ${idx === 0\n ? `\n &::before {\n ${transitionEntryDecorativeMarkerInitial}\n }\n `\n : ''}\n `}\n key={idx}>\n {label}\n {detailed && details ? details : null}\n {!detailed && details\n ? <>&nbsp;<HelpTooltip icon=\"info-sign\" content={<div css={css`display: flex; flex-flow: column nowrap;`}>{details}</div>} />\n </>\n : null}\n </TransitionEntryWrapper>\n } else {\n if (idx > 0 && pastTransitions[idx - 1] !== undefined) {\n return <MissingTransitionEntries />;\n } else {\n // Don’t output multiple missing steps in a row.\n return null;\n }\n }\n })}\n </>\n );\n};\n\n\n/** Shown in place of transition entries, if some are missing. */\nconst MissingTransitionEntries: React.VoidFunctionComponent<Record<never, never>> = function () {\n return (\n <div title=\"No detailed state transitions available\">\n <Icon\n icon=\"more\"\n css={css`\n position: relative;\n left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX}px;\n transform: translateX(-50%);\n `}\n />\n </div>\n );\n};\n\n\nconst TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX = 22;\n\n/**\n * Style rules for pseudo-element that contains decorative marker line with a circle.\n */\nconst transitionEntryDecorativeMarker = `\n content: \" \";\n background: white;\n display: block;\n overflow: hidden;\n z-index: 1;\n position: absolute;\n left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX}px;\n\n transform: translateX(-50%);\n top: 0;\n width: 2px;\n bottom: 0;\n`;\n\n/**\n * Style rules for pseudo-element that contains decorative marker line with a circle.\n */\nconst transitionEntryDecorativeMarkerInitial = `\n top: 50%;\n`;\n\n/**\n * Style rules for pseudo-element that contains decorative marker line with a circle.\n */\nconst transitionEntryDecorativeMarkerFinal = `\n bottom: 50%;\n`;\n\n\nconst TransitionEntryWrapper = styled.div`\n position: relative;\n color: white;\n padding: 10px;\n padding-left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX + 20}px;\n margin-bottom: 1px;\n\n &::after {\n content: \" \";\n background: white;\n display: block;\n overflow: hidden;\n z-index: 1;\n position: absolute;\n left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX}px;\n\n transform: translateX(-50%) translateY(-50%);\n top: 50%;\n width: 10px;\n height: 10px;\n border-radius: 100%;\n }\n\n &::before {\n ${transitionEntryDecorativeMarker}\n }\n`;\n\n\nexport default TransitionsAndStatus;\n"]}
1
+ {"version":3,"file":"TransitionHistory.js","sourceRoot":"","sources":["../../src/proposals/TransitionHistory.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport styled from '@emotion/styled';\nimport { jsx, css } from '@emotion/react';\nimport React from 'react';\nimport { Icon, Colors } from '@blueprintjs/core';\n\nimport { normalizeObjectRecursively } from '@riboseinc/paneron-extension-kit/util';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\n\nimport { Val } from '../views/diffing/InlineDiff';\nimport { Datestamp } from '../views/util';\nimport { registerStakeholderPlain } from '../views/RegisterStakeholder';\nimport { type RegisterStakeholder } from '../types/stakeholder';\n\nimport * as CR from './types';\nimport { STATE_COLOR } from './TransitionOptions';\n\n\n/**\n * Transition history entry is mostly like `CR.TransitionEntry`,\n * except it has optional fields and can be `undefined` to represent\n * missing parts of history.\n */\nexport type TransitionHistoryEntry = Omit<CR.TransitionEntry, 'timestamp' | 'fromState' | 'stakeholder' | 'input'> & {\n timestamp?: Date\n fromState?: CR.StateType\n stakeholder?: RegisterStakeholder\n input?: CR.StateInput\n} | undefined;\n\n\n/**\n * Outputs transition history,\n * back-filling it from state and timestamps if `pastTransitions` is not present.\n */\nexport function getTransitionHistory(cr: CR.Base): TransitionHistoryEntry[] {\n if (cr.pastTransitions && cr.pastTransitions.length > 0) {\n return [{\n label: \"Create\",\n toState: CR.State.DRAFT,\n timestamp: (cr as CR.Drafted).timeStarted,\n }, ...cr.pastTransitions];\n\n } else {\n const els: TransitionHistoryEntry[] = [];\n\n els.push({\n label: \"Create\",\n toState: CR.State.DRAFT,\n timestamp: (cr as CR.Drafted).timeStarted,\n });\n\n if (!CR.isDrafted(cr)) {\n els.push(undefined);\n }\n\n // Backward compatibility\n\n if (CR.isProposed(cr)) {\n els.push({\n label: \"Propose\",\n toState: CR.State.PROPOSED,\n timestamp: cr.timeProposed,\n input: { justification: cr.justification },\n });\n }\n\n if (CR.isSubmittedForControlBodyReview(cr)) {\n els.push({\n label: \"Submit for control body review\",\n fromState: CR.State.PROPOSED,\n toState: CR.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW,\n input: { registerManagerNotes: cr.registerManagerNotes },\n });\n }\n\n if (CR.isReturnedForClarification(cr)) {\n els.push({\n label: \"Return for clarification\",\n toState: CR.State.RETURNED_FOR_CLARIFICATION,\n input: {\n registerManagerNotes: cr.registerManagerNotes,\n controlBodyNotes: (cr as any).controlBodyNotes,\n controlBodyDecisionEvent: (cr as any).controlBodyDecisionEvent,\n },\n });\n }\n\n if (CR.isWithdrawn(cr)) {\n els.push({\n label: \"Withdraw\",\n toState: CR.State.WITHDRAWN,\n timestamp: cr.timeDisposed,\n });\n } else if (CR.isAccepted(cr)) {\n els.push({\n label: \"Accept\",\n toState: CR.State.ACCEPTED,\n timestamp: cr.timeDisposed,\n input: {\n controlBodyNotes: (cr as any).controlBodyNotes,\n controlBodyDecisionEvent: (cr as any).controlBodyDecisionEvent,\n },\n });\n } else if (CR.isRejected(cr)) {\n els.push({\n label: \"Reject\",\n toState: CR.State.REJECTED,\n timestamp: cr.timeDisposed,\n input: {\n controlBodyNotes: (cr as any).controlBodyNotes,\n controlBodyDecisionEvent: (cr as any).controlBodyDecisionEvent,\n },\n });\n }\n\n if (CR.isAppealed(cr)) {\n els.push({\n label: \"Appeal\",\n toState: CR.State.APPEALED,\n input: {\n appealReason: cr.appealReason,\n },\n });\n }\n\n if (CR.isRejectedWithAppealWithdrawn(cr)) {\n els.push({\n label: \"Withdraw appeal\",\n toState: CR.State.APPEAL_WITHDRAWN,\n timestamp: cr.timeDisposed,\n });\n } else if (CR.isAcceptedOnAppeal(cr)) {\n els.push({\n label: \"Accept on appeal\",\n toState: CR.State.ACCEPTED_ON_APPEAL,\n timestamp: cr.timeDisposed,\n input: {\n registerOwnerNotes: cr.registerOwnerNotes,\n },\n });\n } else if (CR.isRejectedOnAppeal(cr)) {\n els.push({\n label: \"Uphold rejection\",\n toState: CR.State.REJECTION_UPHELD_ON_APPEAL,\n timestamp: cr.timeDisposed,\n input: {\n registerOwnerNotes: cr.registerOwnerNotes,\n },\n });\n }\n return els;\n }\n}\n\n\n/**\n * Lists transitions between states,\n * emphasizing the end (current as of now) state.\n */\nexport const TransitionsAndStatus: React.VoidFunctionComponent<{\n pastTransitions: TransitionHistoryEntry[]\n isFinal?: boolean\n detailed?: boolean\n}> = function ({ pastTransitions, isFinal, detailed }) {\n return (\n <>\n {pastTransitions.map((entry, idx) => {\n if (entry) {\n const { label, stakeholder, fromState, toState, input, timestamp } = entry;\n const details = input || timestamp || stakeholder\n ? <>\n {input\n ? <div css={css`margin: .25em 0;`}>\n <Val val={normalizeObjectRecursively(input)} />\n </div>\n : null}\n <small css={css`display: block;`}>\n {stakeholder\n ? <span>{registerStakeholderPlain(stakeholder)}</span>\n : 'unknown stakeholder'}\n <br />\n at {timestamp\n ? <Datestamp useUTC showTime date={timestamp} />\n : \"unknown time\"}\n </small>\n </>\n : null;\n return <TransitionEntryWrapper\n title={`Transition ${fromState ? `from ${fromState} ` : ''}to ${toState}`}\n css={css`\n background: linear-gradient(\n 345deg,\n ${STATE_COLOR[toState] ?? Colors.GRAY1}aa,\n ${STATE_COLOR[toState] ?? Colors.GRAY1} 50%);\n position: sticky;\n top: ${idx * 3}px;\n z-index: 1;\n ${idx === pastTransitions.length - 1\n ? `\n ${!detailed ? 'font-weight: bold;' : ''}\n ${isFinal\n ? `\n &::before {\n ${transitionEntryDecorativeMarkerFinal}\n }\n `\n : ''}\n `\n : ''}\n ${idx === 0\n ? `\n &::before {\n ${transitionEntryDecorativeMarkerInitial}\n }\n `\n : ''}\n `}\n key={idx}>\n {label}\n {detailed && details ? details : null}\n {!detailed && details\n ? <>&nbsp;<HelpTooltip icon=\"info-sign\" content={<div css={css`display: flex; flex-flow: column nowrap;`}>{details}</div>} />\n </>\n : null}\n </TransitionEntryWrapper>\n } else {\n if (idx > 0 && pastTransitions[idx - 1] !== undefined) {\n return <MissingTransitionEntries />;\n } else {\n // Don’t output multiple missing steps in a row.\n return null;\n }\n }\n })}\n </>\n );\n};\n\n\n/** Shown in place of transition entries, if some are missing. */\nconst MissingTransitionEntries: React.VoidFunctionComponent<Record<never, never>> = function () {\n return (\n <div title=\"No detailed state transitions available\">\n <Icon\n icon=\"more\"\n css={css`\n position: relative;\n left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX}px;\n transform: translateX(-50%);\n `}\n />\n </div>\n );\n};\n\n\nconst TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX = 22;\n\n/**\n * Style rules for pseudo-element that contains decorative marker line with a circle.\n */\nconst transitionEntryDecorativeMarker = `\n content: \" \";\n background: white;\n display: block;\n overflow: hidden;\n z-index: 1;\n position: absolute;\n left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX}px;\n\n transform: translateX(-50%);\n top: 0;\n width: 2px;\n bottom: 0;\n`;\n\n/**\n * Style rules for pseudo-element that contains decorative marker line with a circle.\n */\nconst transitionEntryDecorativeMarkerInitial = `\n top: 50%;\n`;\n\n/**\n * Style rules for pseudo-element that contains decorative marker line with a circle.\n */\nconst transitionEntryDecorativeMarkerFinal = `\n bottom: 50%;\n`;\n\n\nconst TransitionEntryWrapper = styled.div`\n position: relative;\n color: white;\n padding: 10px;\n padding-left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX + 20}px;\n margin-bottom: 1px;\n\n &::after {\n content: \" \";\n background: white;\n display: block;\n overflow: hidden;\n z-index: 1;\n position: absolute;\n left: ${TRANSITION_ENTRY_MARKER_SIDE_OFFSET_PX}px;\n\n transform: translateX(-50%) translateY(-50%);\n top: 50%;\n width: 10px;\n height: 10px;\n border-radius: 100%;\n }\n\n &::before {\n ${transitionEntryDecorativeMarker}\n }\n`;\n\n\nexport default TransitionsAndStatus;\n"]}
@@ -188,6 +188,21 @@ const ActionableCRTree = function ({
188
188
  return (0, _react2.jsx)(_core.Tree, {
189
189
  className: className,
190
190
  contents: nodes,
191
+ css: (0, _react2.css)`
192
+ .bp4-tree-node {
193
+ &.tree-node-active-proposal, &.tree-node-proposal-group-with-active-proposal:not(.bp4-tree-node-expanded) {
194
+ > .bp4-tree-node-content {
195
+ background: ${_core.Colors.RED5};
196
+ .bp4-dark & {
197
+ background: ${_core.Colors.RED2};
198
+ }
199
+ }
200
+ &.bp4-tree-node-selected > .bp4-tree-node-content {
201
+ background: ${_core.Colors.RED3};
202
+ }
203
+ }
204
+ }
205
+ `,
191
206
  ...eventHandlers
192
207
  });
193
208
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Tree.js","sourceRoot":"","sources":["../../../src/proposals/actionableGroups/Tree.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAc,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAG1G,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,mCAAmC,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAEL,6CAA6C,EAC7C,sCAAsC,GACvC,MAAM,aAAa,CAAC;AASrB,MAAM,YAAY,GAAU;IAC1B,yBAAyB;IACzB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,EAAE;CACb,CAAC;AASX,MAAM,gBAAgB,GAGtB,UAAU,EAAE,SAAS,EAAE;;IACrB,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACrE,MAAM,EAAE,wBAAwB,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,EAAE,gCAAgC,EAAE,iBAAiB,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3F,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAExD,MAAM,CAAE,KAAK,EAAE,QAAQ,EAAG,GAAI,gCAA8E,CAC1G,sBAAsB,EACtB,SAAS,EACT,SAAS,EACT,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;QACpB,QAAQ,MAAM,CAAC,IAAI,EAAE;YACnB,KAAK,eAAe;gBAClB,IAAI,SAAS,CAAC,cAAc,KAAK,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;oBACxD,OAAO;wBACL,GAAG,SAAS;wBACZ,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;qBACxC,CAAC;iBACH;qBAAM;oBACL,OAAO,SAAS,CAAC;iBAClB;YACH,KAAK,cAAc;gBACjB,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;oBAClE,OAAO;wBACL,GAAG,SAAS;wBACZ,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;wBACvC,iBAAiB,EAAE,MAAM,CACvB,SAAS,CAAC,iBAAiB,EAC3B,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;qBACxC,CAAC;iBACH;qBAAM;oBACL,OAAO,SAAS,CAAC;iBAClB;YACH,KAAK,aAAa;gBAChB,MAAM,GAAG,GAAG,SAAS,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACzE,IAAI,GAAG,IAAI,CAAC,EAAE;oBACZ,OAAO;wBACL,GAAG,SAAS;wBACZ,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;wBACvC,iBAAiB,EAAE,MAAM,CACvB,SAAS,CAAC,iBAAiB,EAC3B,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC3B,CAAC;iBACH;qBAAM;oBACL,OAAO,SAAS,CAAC;iBAClB;YACH,KAAK,aAAa;gBAChB,IAAI,SAAS,CAAC,cAAc,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;oBACtD,OAAO;wBACL,GAAG,SAAS;wBACZ,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;qBACtC,CAAC;iBACH;qBAAM;oBACL,OAAO,SAAS,CAAC;iBAClB;YACH;gBACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC9C;IACH,CAAC,EACD,YAAY,EACZ,IAAI,CAAC,CAAC;IAER,MAAM,MAAM,GAAG,mCAAmC,CAAC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,mCAAI,EAAE,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAG,WAAW;QACxB,CAAC,CAAC,6CAA6C,CAAC,MAAM,EAAE,WAAW,CAAC;QACpE,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,yBAAyB,GAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEhE,MAAM,mBAAmB,GAAG,OAAO,CACjC,CAAC,GAAG,EAAE,CACN,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,CAAC;QAC7C,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,UAAU,EAAE,OAAO;QACnB,SAAS,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YACpC,yBAAyB;YACzB,CAAC,CAAE,WAAoB;YACvB,CAAC,CAAC,SAAS,CAAC,IAAI,SAAS;KAC5B,CAAC,CAAC,CACJ,EACD,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;IAErC,MAAM,KAAK,GAAG,OAAO,CACnB,CAAC,GAAG,EAAE,CACJ,sCAAsC,CAAC,mBAAmB,EAAE;QAC1D,UAAU,EAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,EAAE;QACxB,mBAAmB,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC;QACrD,YAAY,EAAE,wBAAwB;QACtC,aAAa,EAAE,KAAK,CAAC,cAAc;YACjC,CAAC,CAAC,mBAAmB;gBACnB,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,KAAK,KAAK,CAAC,cAAc,CAAC;gBAC3D,CAAC,CAAC,KAAK,CAAC,cAAc;gBACtB,CAAC,CAAC,SAAS;YACf,CAAC,CAAC,SAAS;QACb,YAAY,EAAE,KAAK,CAAC,cAAc;YAChC,CAAC,CAAC,mBAAmB;gBACnB,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,CAAC;gBAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,cAAc,CAAC;gBACtC,CAAC,CAAC,KAAK,CAAC,cAAc;gBACtB,CAAC,CAAC,SAAS;YACf,CAAC,CAAC,SAAS;KACd,CAAC,CACH,EACD,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,EAAE,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAE1H,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,UAAkB,EAAE,EAAE;QACnD,IAAI,UAAU,MAAK,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,EAAE,CAAA,EAAE;YAC/B,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAG,UAAoB,CAAC,CAAA;SACjD;QACD,qCAAqC;QACrC,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,EAAE,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,EAAE,EAAE,wBAAwB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAExD,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACpC,WAAW,EAAE,CAAC,IAAgC,EAAE,EAAE;;YAChD,OAAA,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,IAAI,MAAK,OAAO;gBAC7B,CAAC,CAAC,QAAQ,CAAC;oBACP,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAY,EAAE;iBACzC,CAAC;gBACJ,CAAC,CAAC,QAAQ,CAAC;oBACP,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAY,EAAE;iBACvC,CAAC,CAAA;SAAA;QACR,YAAY,EAAE,CAAC,IAAgC,EAAE,EAAE;;YACjD,OAAA,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,IAAI,MAAK,OAAO;gBAC7B,CAAC,CAAC,QAAQ,CAAC;oBACP,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAY,EAAE;iBACzC,CAAC;gBACJ,CAAC,CAAC,KAAK,CAAC,CAAA;SAAA;QACZ,cAAc,EAAE,CAAC,IAAgC,EAAE,EAAE;;YACnD,OAAA,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,IAAI,MAAK,OAAO;gBAC7B,CAAC,CAAC,QAAQ,CAAC;oBACP,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAY,EAAE;iBACzC,CAAC;gBACJ,CAAC,CAAC,KAAK,CAAC,CAAA;SAAA;QACZ,iBAAiB,EAAE,CAAC,IAAgC,EAAE,EAAE;;YACtD,OAAA,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,IAAI,MAAK,OAAO;gBAC7B,CAAC,CAAC,QAAQ,CAAC;oBACP,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAY,EAAE;iBACzC,CAAC;gBACJ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAY,CAAC,CAAA;SAAA;KAClC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE3B,OAAO,IAAC,IAAI,IACV,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,KAAK,KACX,aAAa,GACjB,CAAC;AACL,CAAC,CAAA;AAED,eAAe,gBAAgB,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useCallback, useMemo } from 'react';\nimport update from 'immutability-helper';\nimport { jsx } from '@emotion/react';\nimport { Tree } from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\nimport type { SomeCR as CR } from '../types';\nimport { ChangeRequestContext } from '../ChangeRequestContext';\nimport { BrowserCtx } from '../../views/BrowserCtx';\nimport { getActionableProposalGroupsForRoles } from './queries';\nimport { Protocols } from '../../views/protocolRegistry';\nimport {\n type ActionableProposalTreeNode,\n getMapReduceChainsForActionableProposalGroups,\n getActionableProposalGroupsAsTreeNodes,\n} from './treeNodes';\n\n\ninterface State {\n //selectedFolderID: string | null\n selectedItemID: string | null\n expandedFolderIDs: readonly string[]\n}\n\nconst initialState: State = {\n //selectedFolderID: null,\n selectedItemID: null,\n expandedFolderIDs: [],\n} as const;\n\ntype Action =\n | { type: 'select-folder'; payload: { folderID: string | null; }; }\n | { type: 'enter-folder'; payload: { folderID: string; }; }\n | { type: 'exit-folder'; payload: { folderID: string; }; }\n | { type: 'select-item'; payload: { itemID: string | null; }; }\n\n\nconst ActionableCRTree: React.FC<{\n className?: string\n}> =\nfunction ({ className }) {\n const { changeRequest: activeCR } = useContext(ChangeRequestContext);\n const { setActiveChangeRequestID, stakeholder } = useContext(BrowserCtx);\n const { usePersistentDatasetStateReducer, useMapReducedData } = useContext(DatasetContext);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n\n const [ state, dispatch, ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)(\n 'actionable-proposals',\n undefined,\n undefined,\n (prevState, action) => {\n switch (action.type) {\n case 'select-folder':\n if (prevState.selectedItemID !== action.payload.folderID) {\n return {\n ...prevState,\n selectedItemID: action.payload.folderID,\n };\n } else {\n return prevState;\n }\n case 'enter-folder':\n if (!prevState.expandedFolderIDs.includes(action.payload.folderID)) {\n return {\n ...prevState,\n selectedItemID: action.payload.folderID,\n expandedFolderIDs: update(\n prevState.expandedFolderIDs,\n { $push: [action.payload.folderID] }),\n };\n } else {\n return prevState;\n }\n case 'exit-folder':\n const idx = prevState.expandedFolderIDs.indexOf(action.payload.folderID);\n if (idx >= 0) {\n return {\n ...prevState,\n selectedItemID: action.payload.folderID,\n expandedFolderIDs: update(\n prevState.expandedFolderIDs,\n { $splice: [[idx, 1]] }),\n };\n } else {\n return prevState;\n }\n case 'select-item':\n if (prevState.selectedItemID !== action.payload.itemID) {\n return {\n ...prevState,\n selectedItemID: action.payload.itemID,\n };\n } else {\n return prevState;\n }\n default:\n throw new Error(\"Unexpected browse state\");\n }\n },\n initialState,\n null);\n\n const groups = getActionableProposalGroupsForRoles(stakeholder?.roles ?? []);\n\n const chains = stakeholder\n ? getMapReduceChainsForActionableProposalGroups(groups, stakeholder)\n : {};\n\n const actionableProposalsResult = useMapReducedData({ chains });\n\n const actionableProposals = useMemo(\n (() =>\n Object.entries(actionableProposalsResult.value).\n map(([chainID, chainResult]) => ({\n groupLabel: chainID,\n proposals: (Array.isArray(chainResult)\n // TODO: Validate results\n ? (chainResult as CR[])\n : undefined) || undefined\n }))\n ),\n [actionableProposalsResult.value]);\n\n const nodes = useMemo(\n (() =>\n getActionableProposalGroupsAsTreeNodes(actionableProposals, {\n activeCRID: activeCR?.id,\n expandedGroupLabels: new Set(state.expandedFolderIDs),\n onActivateCR: setActiveChangeRequestID,\n selectedGroup: state.selectedItemID\n ? actionableProposals.\n find(({ groupLabel }) => groupLabel === state.selectedItemID)\n ? state.selectedItemID\n : undefined\n : undefined,\n selectedCRID: state.selectedItemID\n ? actionableProposals.\n flatMap(({ proposals }) => proposals ?? []).\n find(p => p.id === state.selectedItemID)\n ? state.selectedItemID\n : undefined\n : undefined,\n })\n ),\n [activeCR?.id, setActiveChangeRequestID, actionableProposals, state.selectedItemID, state.expandedFolderIDs.join(',')]);\n\n const activate = useCallback(((proposalID: string) => {\n if (proposalID !== activeCR?.id) {\n setActiveChangeRequestID?.(proposalID as string)\n }\n // open proposal dashboard regardless\n spawnTab(Protocols.PROPOSAL_WORK, { atIdx: 0 });\n }), [activeCR?.id, setActiveChangeRequestID, spawnTab]);\n\n const eventHandlers = useMemo((() => ({\n onNodeClick: (node: ActionableProposalTreeNode) =>\n node.nodeData?.type === 'group'\n ? dispatch({\n type: 'select-folder',\n payload: { folderID: node.id as string },\n })\n : dispatch({\n type: 'select-item',\n payload: { itemID: node.id as string },\n }),\n onNodeExpand: (node: ActionableProposalTreeNode) =>\n node.nodeData?.type === 'group'\n ? dispatch({\n type: 'enter-folder',\n payload: { folderID: node.id as string },\n })\n : void 0,\n onNodeCollapse: (node: ActionableProposalTreeNode) =>\n node.nodeData?.type === 'group'\n ? dispatch({\n type: 'exit-folder',\n payload: { folderID: node.id as string },\n })\n : void 0,\n onNodeDoubleClick: (node: ActionableProposalTreeNode) =>\n node.nodeData?.type === 'group'\n ? dispatch({\n type: 'enter-folder',\n payload: { folderID: node.id as string },\n })\n : activate(node.id as string),\n })), [dispatch, activate]);\n\n return <Tree\n className={className}\n contents={nodes}\n {...eventHandlers}\n />;\n}\n\nexport default ActionableCRTree;\n"]}
1
+ {"version":3,"file":"Tree.js","sourceRoot":"","sources":["../../../src/proposals/actionableGroups/Tree.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useCallback, useMemo } from 'react';\nimport update from 'immutability-helper';\nimport { jsx, css } from '@emotion/react';\nimport { Colors, Tree } from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\nimport type { SomeCR as CR } from '../types';\nimport { ChangeRequestContext } from '../ChangeRequestContext';\nimport { BrowserCtx } from '../../views/BrowserCtx';\nimport { getActionableProposalGroupsForRoles } from './queries';\nimport { Protocols } from '../../views/protocolRegistry';\nimport {\n type ActionableProposalTreeNode,\n getMapReduceChainsForActionableProposalGroups,\n getActionableProposalGroupsAsTreeNodes,\n} from './treeNodes';\n\n\ninterface State {\n //selectedFolderID: string | null\n selectedItemID: string | null\n expandedFolderIDs: readonly string[]\n}\n\nconst initialState: State = {\n //selectedFolderID: null,\n selectedItemID: null,\n expandedFolderIDs: [],\n} as const;\n\ntype Action =\n | { type: 'select-folder'; payload: { folderID: string | null; }; }\n | { type: 'enter-folder'; payload: { folderID: string; }; }\n | { type: 'exit-folder'; payload: { folderID: string; }; }\n | { type: 'select-item'; payload: { itemID: string | null; }; }\n\n\nconst ActionableCRTree: React.FC<{\n className?: string\n}> =\nfunction ({ className }) {\n const { changeRequest: activeCR } = useContext(ChangeRequestContext);\n const { setActiveChangeRequestID, stakeholder } = useContext(BrowserCtx);\n const { usePersistentDatasetStateReducer, useMapReducedData } = useContext(DatasetContext);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n\n const [ state, dispatch, ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)(\n 'actionable-proposals',\n undefined,\n undefined,\n (prevState, action) => {\n switch (action.type) {\n case 'select-folder':\n if (prevState.selectedItemID !== action.payload.folderID) {\n return {\n ...prevState,\n selectedItemID: action.payload.folderID,\n };\n } else {\n return prevState;\n }\n case 'enter-folder':\n if (!prevState.expandedFolderIDs.includes(action.payload.folderID)) {\n return {\n ...prevState,\n selectedItemID: action.payload.folderID,\n expandedFolderIDs: update(\n prevState.expandedFolderIDs,\n { $push: [action.payload.folderID] }),\n };\n } else {\n return prevState;\n }\n case 'exit-folder':\n const idx = prevState.expandedFolderIDs.indexOf(action.payload.folderID);\n if (idx >= 0) {\n return {\n ...prevState,\n selectedItemID: action.payload.folderID,\n expandedFolderIDs: update(\n prevState.expandedFolderIDs,\n { $splice: [[idx, 1]] }),\n };\n } else {\n return prevState;\n }\n case 'select-item':\n if (prevState.selectedItemID !== action.payload.itemID) {\n return {\n ...prevState,\n selectedItemID: action.payload.itemID,\n };\n } else {\n return prevState;\n }\n default:\n throw new Error(\"Unexpected browse state\");\n }\n },\n initialState,\n null);\n\n const groups = getActionableProposalGroupsForRoles(stakeholder?.roles ?? []);\n\n const chains = stakeholder\n ? getMapReduceChainsForActionableProposalGroups(groups, stakeholder)\n : {};\n\n const actionableProposalsResult = useMapReducedData({ chains });\n\n const actionableProposals = useMemo(\n (() =>\n Object.entries(actionableProposalsResult.value).\n map(([chainID, chainResult]) => ({\n groupLabel: chainID,\n proposals: (Array.isArray(chainResult)\n // TODO: Validate results\n ? (chainResult as CR[])\n : undefined) || undefined\n }))\n ),\n [actionableProposalsResult.value]);\n\n const nodes = useMemo(\n (() =>\n getActionableProposalGroupsAsTreeNodes(actionableProposals, {\n activeCRID: activeCR?.id,\n expandedGroupLabels: new Set(state.expandedFolderIDs),\n onActivateCR: setActiveChangeRequestID,\n selectedGroup: state.selectedItemID\n ? actionableProposals.\n find(({ groupLabel }) => groupLabel === state.selectedItemID)\n ? state.selectedItemID\n : undefined\n : undefined,\n selectedCRID: state.selectedItemID\n ? actionableProposals.\n flatMap(({ proposals }) => proposals ?? []).\n find(p => p.id === state.selectedItemID)\n ? state.selectedItemID\n : undefined\n : undefined,\n })\n ),\n [activeCR?.id, setActiveChangeRequestID, actionableProposals, state.selectedItemID, state.expandedFolderIDs.join(',')]);\n\n const activate = useCallback(((proposalID: string) => {\n if (proposalID !== activeCR?.id) {\n setActiveChangeRequestID?.(proposalID as string)\n }\n // open proposal dashboard regardless\n spawnTab(Protocols.PROPOSAL_WORK, { atIdx: 0 });\n }), [activeCR?.id, setActiveChangeRequestID, spawnTab]);\n\n const eventHandlers = useMemo((() => ({\n onNodeClick: (node: ActionableProposalTreeNode) =>\n node.nodeData?.type === 'group'\n ? dispatch({\n type: 'select-folder',\n payload: { folderID: node.id as string },\n })\n : dispatch({\n type: 'select-item',\n payload: { itemID: node.id as string },\n }),\n onNodeExpand: (node: ActionableProposalTreeNode) =>\n node.nodeData?.type === 'group'\n ? dispatch({\n type: 'enter-folder',\n payload: { folderID: node.id as string },\n })\n : void 0,\n onNodeCollapse: (node: ActionableProposalTreeNode) =>\n node.nodeData?.type === 'group'\n ? dispatch({\n type: 'exit-folder',\n payload: { folderID: node.id as string },\n })\n : void 0,\n onNodeDoubleClick: (node: ActionableProposalTreeNode) =>\n node.nodeData?.type === 'group'\n ? dispatch({\n type: 'enter-folder',\n payload: { folderID: node.id as string },\n })\n : activate(node.id as string),\n })), [dispatch, activate]);\n\n return <Tree\n className={className}\n contents={nodes}\n css={css`\n .bp4-tree-node {\n &.tree-node-active-proposal, &.tree-node-proposal-group-with-active-proposal:not(.bp4-tree-node-expanded) {\n > .bp4-tree-node-content {\n background: ${Colors.RED5};\n .bp4-dark & {\n background: ${Colors.RED2};\n }\n }\n &.bp4-tree-node-selected > .bp4-tree-node-content {\n background: ${Colors.RED3};\n }\n }\n }\n `}\n {...eventHandlers}\n />;\n}\n\nexport default ActionableCRTree;\n"]}