@riboseinc/paneron-registry-kit 2.2.11 → 2.2.13

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 (58) hide show
  1. package/index.d.ts +2 -4
  2. package/package.json +2 -2
  3. package/types/cr.d.ts +5 -1
  4. package/types/cr.js +6 -2
  5. package/types/cr.js.map +1 -1
  6. package/types/util.d.ts +2 -0
  7. package/types/util.js.map +1 -1
  8. package/types/views.d.ts +22 -0
  9. package/types/views.js.map +1 -1
  10. package/views/BrowserCtx.d.ts +3 -11
  11. package/views/BrowserCtx.js +1 -0
  12. package/views/BrowserCtx.js.map +1 -1
  13. package/views/FilterCriteria/criteriaGroupToQueryExpression.d.ts +1 -1
  14. package/views/FilterCriteria/criteriaGroupToQueryExpression.js.map +1 -1
  15. package/views/FilterCriteria/models.d.ts +1 -1
  16. package/views/FilterCriteria/models.js.map +1 -1
  17. package/views/GenericRelatedItemView.js +7 -4
  18. package/views/GenericRelatedItemView.js.map +1 -1
  19. package/views/SearchQuery.js +34 -15
  20. package/views/SearchQuery.js.map +1 -1
  21. package/views/change-request/ChangeRequestContext.d.ts +13 -6
  22. package/views/change-request/ChangeRequestContext.js +84 -4
  23. package/views/change-request/ChangeRequestContext.js.map +1 -1
  24. package/views/change-request/Proposals.d.ts +16 -3
  25. package/views/change-request/Proposals.js +175 -79
  26. package/views/change-request/Proposals.js.map +1 -1
  27. package/views/change-request/objectChangeset.d.ts +7 -4
  28. package/views/change-request/objectChangeset.js +59 -22
  29. package/views/change-request/objectChangeset.js.map +1 -1
  30. package/views/change-request/util.d.ts +4 -0
  31. package/views/change-request/util.js +14 -0
  32. package/views/change-request/util.js.map +1 -0
  33. package/views/detail/ChangeRequest/index.js +16 -16
  34. package/views/detail/ChangeRequest/index.js.map +1 -1
  35. package/views/detail/RegisterHome/ActiveProposalDetails.d.ts +15 -0
  36. package/views/detail/RegisterHome/ActiveProposalDetails.js +105 -0
  37. package/views/detail/RegisterHome/ActiveProposalDetails.js.map +1 -0
  38. package/views/detail/RegisterHome/Block.d.ts +29 -0
  39. package/views/detail/RegisterHome/Block.js +75 -0
  40. package/views/detail/RegisterHome/Block.js.map +1 -0
  41. package/views/detail/RegisterHome/MetaSummary.js +7 -3
  42. package/views/detail/RegisterHome/MetaSummary.js.map +1 -1
  43. package/views/detail/RegisterHome/Proposal.d.ts +1 -11
  44. package/views/detail/RegisterHome/Proposal.js +113 -45
  45. package/views/detail/RegisterHome/Proposal.js.map +1 -1
  46. package/views/detail/RegisterHome/index.js +145 -148
  47. package/views/detail/RegisterHome/index.js.map +1 -1
  48. package/views/detail/RegisterItem/index.js +5 -4
  49. package/views/detail/RegisterItem/index.js.map +1 -1
  50. package/views/hooks/useCustomView.js +1 -1
  51. package/views/hooks/useCustomView.js.map +1 -1
  52. package/views/index.js +5 -3
  53. package/views/index.js.map +1 -1
  54. package/views/sidebar/Search/index.js +12 -2
  55. package/views/sidebar/Search/index.js.map +1 -1
  56. package/views/util.d.ts +26 -17
  57. package/views/util.js +50 -50
  58. package/views/util.js.map +1 -1
@@ -0,0 +1,15 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import React from 'react';
4
+ import type { Register, RegisterStakeholder } from '../../../types';
5
+ import { type SomeCR as CR } from '../../../types/cr';
6
+ declare const CurrentProposalBlock: React.VoidFunctionComponent<{
7
+ proposal: CR;
8
+ register: Register;
9
+ stakeholder?: RegisterStakeholder;
10
+ canDelete?: boolean;
11
+ onDelete?: () => (void | Promise<void>);
12
+ onOpen?: () => void;
13
+ className?: string;
14
+ }>;
15
+ export default CurrentProposalBlock;
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _react2 = require("@emotion/react");
11
+
12
+ var _DL = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/DL"));
13
+
14
+ var _Summary = _interopRequireDefault(require("../../change-request/Summary"));
15
+
16
+ var _TransitionOptions = _interopRequireWildcard(require("../../change-request/TransitionOptions"));
17
+
18
+ var _TransitionHistory = _interopRequireWildcard(require("../../change-request/TransitionHistory"));
19
+
20
+ var _Block = _interopRequireDefault(require("./Block"));
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
+
26
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
+
28
+ /** @jsx jsx */
29
+
30
+ /** @jsxFrag React.Fragment */
31
+ const CurrentProposalBlock = function ({
32
+ proposal,
33
+ stakeholder,
34
+ register,
35
+ onDelete,
36
+ onOpen,
37
+ canDelete,
38
+ className
39
+ }) {
40
+ const actions = (0, _react.useMemo)(() => {
41
+ const actions = stakeholder && (0, _TransitionOptions.canBeTransitionedBy)(stakeholder, proposal) ? [
42
+ /*{
43
+ // Action is taken from within the widget.
44
+ text: "Take action",
45
+ onClick: () => void 0,
46
+ icon: 'take-action',
47
+ intent: 'primary',
48
+ }*/
49
+ ] : canDelete ? [{
50
+ text: "Delete this proposal draft",
51
+ onClick: onDelete,
52
+ disabled: !onDelete,
53
+ icon: 'delete',
54
+ intent: 'danger'
55
+ }] : [];
56
+ actions.push({
57
+ text: "View proposal in a new tab",
58
+ icon: 'open-application',
59
+ disabled: !onOpen,
60
+ onClick: onOpen
61
+ });
62
+ return actions;
63
+ }, [onDelete, onOpen, stakeholder, proposal, canDelete]);
64
+ return (0, _react2.jsx)(_Block.default, {
65
+ View: CurrentProposal,
66
+ description: "Active proposal",
67
+ props: {
68
+ proposal,
69
+ stakeholder,
70
+ register
71
+ },
72
+ className: className,
73
+ actions: actions
74
+ });
75
+ };
76
+
77
+ var _default = CurrentProposalBlock;
78
+ exports.default = _default;
79
+
80
+ const CurrentProposal = function ({
81
+ stakeholder,
82
+ register,
83
+ proposal
84
+ }) {
85
+ const transitions = stakeholder ? (0, _TransitionOptions.getTransitions)(proposal, stakeholder) : [];
86
+ return (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_DL.default, {
87
+ css: (0, _react2.css)`padding: 10px 12px 10px 12px; flex-grow: 1; flex-basis: max-content;`
88
+ }, (0, _react2.jsx)("div", null, (0, _react2.jsx)("dt", null, "Viewing\u00A0proposal:"), (0, _react2.jsx)("dd", {
89
+ css: (0, _react2.css)`max-height: 40px; overflow-y: auto;`
90
+ }, "\u201C", proposal.justification.trim() || '(justification N/A)', "\u201D")), (0, _react2.jsx)(_Summary.default, {
91
+ cr: proposal,
92
+ currentStakeholder: stakeholder,
93
+ registerMetadata: register
94
+ })), (0, _react2.jsx)("div", {
95
+ css: (0, _react2.css)`overflow-y: auto; flex-basis: min-content;`
96
+ }, (0, _react2.jsx)(_TransitionHistory.default, {
97
+ pastTransitions: (0, _TransitionHistory.getTransitionHistory)(proposal),
98
+ isFinal: (0, _TransitionOptions.isFinalState)(proposal.state)
99
+ }), transitions.length > 0 ? (0, _react2.jsx)(_TransitionOptions.default, {
100
+ stakeholder: stakeholder,
101
+ transitions: transitions,
102
+ cr: proposal,
103
+ css: (0, _react2.css)`padding: 12px;`
104
+ }) : null));
105
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActiveProposalDetails.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/ActiveProposalDetails.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { type MenuItemProps } from '@blueprintjs/core';\n\nimport DL from '@riboseinc/paneron-extension-kit/widgets/DL';\n\nimport Summary from '../../change-request/Summary';\nimport type { Register, RegisterStakeholder } from '../../../types';\nimport { type SomeCR as CR } from '../../../types/cr';\nimport TransitionOptions, { isFinalState, getTransitions, canBeTransitionedBy } from '../../change-request/TransitionOptions';\nimport TransitionsAndStatus, { getTransitionHistory } from '../../change-request/TransitionHistory';\nimport HomeBlock from './Block';\n\n\nconst CurrentProposalBlock: React.VoidFunctionComponent<{\n proposal: CR\n register: Register\n stakeholder?: RegisterStakeholder\n canDelete?: boolean\n onDelete?: () => (void | Promise<void>)\n onOpen?: () => void\n className?: string\n}> = function ({ proposal, stakeholder, register, onDelete, onOpen, canDelete, className }) {\n const actions = useMemo(() => {\n const actions: MenuItemProps[] = stakeholder && canBeTransitionedBy(stakeholder, proposal)\n ? [/*{\n // Action is taken from within the widget.\n text: \"Take action\",\n onClick: () => void 0,\n icon: 'take-action',\n intent: 'primary',\n }*/]\n : canDelete\n ? [{\n text: \"Delete this proposal draft\",\n onClick: onDelete,\n disabled: !onDelete,\n icon: 'delete',\n intent: 'danger',\n }]\n : [];\n\n actions.push({\n text: \"View proposal in a new tab\",\n icon: 'open-application',\n disabled: !onOpen,\n onClick: onOpen,\n });\n\n return actions;\n }, [onDelete, onOpen, stakeholder, proposal, canDelete]);\n\n return (\n <HomeBlock\n View={CurrentProposal}\n description=\"Active proposal\"\n props={{ proposal, stakeholder, register }}\n className={className}\n actions={actions}\n />\n );\n};\n\nexport default CurrentProposalBlock;\n\n\nconst CurrentProposal: React.VoidFunctionComponent<{\n proposal: CR\n register: Register\n stakeholder?: RegisterStakeholder\n}> = function ({ stakeholder, register, proposal }) {\n const transitions = stakeholder\n ? getTransitions(proposal, stakeholder)\n : [];\n\n return (\n <>\n <DL css={css`padding: 10px 12px 10px 12px; flex-grow: 1; flex-basis: max-content;`}>\n <div>\n <dt>Viewing&nbsp;proposal:</dt>\n <dd css={css`max-height: 40px; overflow-y: auto;`}>\n “{proposal.justification.trim() || '(justification N/A)'}”\n </dd>\n </div>\n <Summary\n cr={proposal}\n currentStakeholder={stakeholder}\n registerMetadata={register}\n />\n </DL>\n <div css={css`overflow-y: auto; flex-basis: min-content;`}>\n <TransitionsAndStatus\n pastTransitions={getTransitionHistory(proposal)}\n isFinal={isFinalState(proposal.state)}\n />\n {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 </>\n );\n};\n"]}
@@ -0,0 +1,29 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import React from 'react';
4
+ import { jsx } from '@emotion/react';
5
+ import { type MenuItemProps, type MenuDividerProps } from '@blueprintjs/core';
6
+ interface HomeBlockProps<P extends Record<string, any>> {
7
+ description: string;
8
+ View: React.VoidFunctionComponent<P>;
9
+ /** Props to pass the `View`. */
10
+ props: P | null | undefined;
11
+ /** Shown if `props` is `null`. */
12
+ error?: string | JSX.Element;
13
+ /** Shown beneath `View`. */
14
+ actions?: (MenuItemProps | MenuDividerProps)[];
15
+ /** Applies to wrapper card div. */
16
+ className?: string;
17
+ }
18
+ export default function HomeBlock<P extends Record<string, any>>({ View, description, props, error, actions, className }: HomeBlockProps<P>): jsx.JSX.Element;
19
+ export declare function HomeBlockActions({ actions }: {
20
+ actions?: (MenuItemProps | MenuDividerProps)[];
21
+ }): jsx.JSX.Element;
22
+ export declare const HomeBlockCard: import("@emotion/styled").StyledComponent<{
23
+ description: string;
24
+ } & import("@blueprintjs/core").ICardProps & {
25
+ children?: React.ReactNode;
26
+ } & {
27
+ theme?: import("@emotion/react").Theme | undefined;
28
+ }, {}, {}>;
29
+ export {};
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = HomeBlock;
7
+ exports.HomeBlockActions = HomeBlockActions;
8
+ exports.HomeBlockCard = void 0;
9
+
10
+ var _styled = _interopRequireDefault(require("@emotion/styled"));
11
+
12
+ var _react = require("@emotion/react");
13
+
14
+ var _core = require("@blueprintjs/core");
15
+
16
+ var _util = require("../../util");
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ //import { Helmet } from 'react-helmet';
21
+ function HomeBlock({
22
+ View,
23
+ description,
24
+ props,
25
+ error,
26
+ actions,
27
+ className
28
+ }) {
29
+ var _a;
30
+
31
+ return (0, _react.jsx)(HomeBlockCard, {
32
+ description: description,
33
+ className: className
34
+ }, props ? (0, _react.jsx)(View, { ...props
35
+ }) : props === undefined ? (0, _react.jsx)(_core.NonIdealState, {
36
+ icon: (0, _react.jsx)(_core.Spinner, null)
37
+ }) : (0, _react.jsx)(_core.NonIdealState, {
38
+ icon: "heart-broken",
39
+ title: "Failed to load",
40
+ description: error
41
+ }), ((_a = actions === null || actions === void 0 ? void 0 : actions.length) !== null && _a !== void 0 ? _a : 0) > 0 ? (0, _react.jsx)(HomeBlockActions, {
42
+ actions: actions
43
+ }) : null);
44
+ }
45
+
46
+ function HomeBlockActions({
47
+ actions
48
+ }) {
49
+ return (0, _react.jsx)(HomeBlockActionMenu, null, actions.map((mip, idx) => isMenuItemProps(mip) ? (0, _react.jsx)(_core.MenuItem, {
50
+ key: idx,
51
+ ...mip
52
+ }) : (0, _react.jsx)(_core.MenuDivider, {
53
+ key: idx,
54
+ ...mip
55
+ })));
56
+ }
57
+
58
+ function isMenuItemProps(val) {
59
+ const p = val;
60
+ return p.onClick || p.disabled || p.icon || p.selected || p.active ? true : false;
61
+ }
62
+
63
+ const HomeBlockActionMenu = (0, _styled.default)(_core.Menu)`
64
+ background: none !important;
65
+ flex-shrink: 0;
66
+ `;
67
+ const HomeBlockCard = (0, _styled.default)(_util.CardInGrid)`
68
+ padding: 5px;
69
+ display: flex; flex-flow: column nowrap;
70
+ overflow: hidden;
71
+ transition:
72
+ width .5s linear,
73
+ height .5s linear;
74
+ `;
75
+ exports.HomeBlockCard = HomeBlockCard;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Block.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/Block.tsx"],"names":[],"mappings":"AAGA,wCAAwC;AACxC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EACL,IAAI,EACJ,QAAQ,EAAE,WAAW,EAErB,aAAa,EACb,OAAO,GACR,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAmBxC,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAqB;;IAE1E,OAAO,CACL,IAAC,aAAa,IACV,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS;QACrB,KAAK;YACJ,CAAC,CAAC,IAAC,IAAI,OAAK,KAAK,GAAI;YACrB,CAAC,CAAC,KAAK,KAAK,SAAS;gBACnB,CAAC,CAAC,IAAC,aAAa,IAAC,IAAI,EAAE,IAAC,OAAO,OAAG,GAAI;gBACtC,CAAC,CAAC,IAAC,aAAa,IAAC,IAAI,EAAC,cAAc,EAAC,KAAK,EAAC,gBAAgB,EAAC,WAAW,EAAE,KAAK,GAAI;QACrF,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,CAAC,CAAC,GAAG,CAAC;YACzB,CAAC,CAAC,IAAC,gBAAgB,IAAC,OAAO,EAAE,OAAO,GAAI;YACxC,CAAC,CAAC,IAAI,CACM,CACjB,CAAC;AACJ,CAAC;AAGD,MAAM,UAAU,gBAAgB,CAAC,EAAE,OAAO,EAAsD;IAC9F,OAAO,IAAC,mBAAmB,QACxB,OAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACzB,eAAe,CAAC,GAAG,CAAC;QAClB,CAAC,CAAC,IAAC,QAAQ,IAAC,GAAG,EAAE,GAAG,KAAO,GAAqB,GAAK;QACrD,CAAC,CAAC,IAAC,WAAW,IAAC,GAAG,EAAE,GAAG,KAAM,GAAG,GAAK,CACxC,CACmB,CAAA;AACxB,CAAC;AAGD,SAAS,eAAe,CAAC,GAAqC;IAC5D,MAAM,CAAC,GAAG,GAAU,CAAC;IACrB,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACpF,CAAC;AAGD,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;;;CAGvC,CAAC;AAGF,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;;;;;;;CAO9C,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\nimport React from 'react';\n//import { Helmet } from 'react-helmet';\nimport styled from '@emotion/styled';\nimport { jsx } from '@emotion/react';\nimport {\n Menu,\n MenuItem, MenuDivider,\n type MenuItemProps, type MenuDividerProps,\n NonIdealState,\n Spinner,\n} from '@blueprintjs/core';\nimport { CardInGrid } from '../../util';\n\n\ninterface HomeBlockProps<P extends Record<string, any>> {\n description: string,\n View: React.VoidFunctionComponent<P>,\n\n /** Props to pass the `View`. */\n props: P | null | undefined,\n\n /** Shown if `props` is `null`. */\n error?: string | JSX.Element,\n\n /** Shown beneath `View`. */\n actions?: (MenuItemProps | MenuDividerProps)[],\n\n /** Applies to wrapper card div. */\n className?: string,\n}\nexport default function HomeBlock<P extends Record<string, any>>(\n { View, description, props, error, actions, className }: HomeBlockProps<P>\n) {\n return (\n <HomeBlockCard\n description={description}\n className={className}>\n {props\n ? <View {...props} />\n : props === undefined\n ? <NonIdealState icon={<Spinner />} />\n : <NonIdealState icon=\"heart-broken\" title=\"Failed to load\" description={error} />}\n {(actions?.length ?? 0) > 0\n ? <HomeBlockActions actions={actions} />\n : null}\n </HomeBlockCard>\n );\n}\n\n\nexport function HomeBlockActions({ actions }: { actions?: (MenuItemProps | MenuDividerProps)[] }) {\n return <HomeBlockActionMenu>\n {actions!.map((mip, idx) =>\n isMenuItemProps(mip)\n ? <MenuItem key={idx} {...(mip as MenuItemProps) } />\n : <MenuDivider key={idx} {...mip } />\n )}\n </HomeBlockActionMenu>\n}\n\n\nfunction isMenuItemProps(val: MenuItemProps | MenuDividerProps): val is MenuItemProps {\n const p = val as any;\n return p.onClick || p.disabled || p.icon || p.selected || p.active ? true : false;\n}\n\n\nconst HomeBlockActionMenu = styled(Menu)`\n background: none !important;\n flex-shrink: 0;\n`;\n\n\nexport const HomeBlockCard = styled(CardInGrid)`\n padding: 5px;\n display: flex; flex-flow: column nowrap;\n overflow: hidden;\n transition:\n width .5s linear,\n height .5s linear;\n`;\n"]}
@@ -22,13 +22,17 @@ const MetaSummary = function ({
22
22
  register,
23
23
  style
24
24
  }) {
25
- var _a, _b;
25
+ var _a;
26
26
 
27
27
  return (0, _react.jsx)(_DL.default, {
28
28
  style: style
29
- }, (0, _react.jsx)("div", null, (0, _react.jsx)("dt", null, "Viewing\u00A0version:"), (0, _react.jsx)("dd", null, (_b = (_a = register.version) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : 'N/A')), (0, _react.jsx)("div", null, (0, _react.jsx)("dt", null, "Register\u00A0name:"), (0, _react.jsx)("dd", null, register.name)), (0, _react.jsx)("div", null, (0, _react.jsx)("dt", null, "Content\u00A0summary:"), (0, _react.jsx)("dd", null, register.contentSummary || 'N/A')), register.operatingLanguage ? (0, _react.jsx)("div", null, (0, _react.jsx)("dt", null, "Operating\u00A0language:"), (0, _react.jsx)("dd", null, (0, _react.jsx)(_InlineDiff.Val, {
29
+ }, (0, _react.jsx)("div", null, (0, _react.jsx)("dt", null, "Viewing\u00A0version:"), (0, _react.jsx)("dd", null, ((_a = register.version) === null || _a === void 0 ? void 0 : _a.id) || 'N/A')), (0, _react.jsx)("div", null, (0, _react.jsx)("dt", null, "Register\u00A0name:"), (0, _react.jsx)("dd", null, register.name)), register.operatingLanguage ? (0, _react.jsx)("div", null, (0, _react.jsx)("dt", null, "Operating\u00A0language:"), (0, _react.jsx)("dd", null, (0, _react.jsx)(_InlineDiff.Val, {
30
30
  val: (0, _util.normalizeObjectRecursively)(register.operatingLanguage)
31
- }))) : null);
31
+ }))) : null, (0, _react.jsx)("div", null, (0, _react.jsx)("dt", null, "Content\u00A0summary:"), (0, _react.jsx)("dd", {
32
+ dangerouslySetInnerHTML: {
33
+ __html: register.contentSummary || 'N/A'
34
+ }
35
+ })));
32
36
  };
33
37
 
34
38
  var _default = MetaSummary;
@@ -1 +1 @@
1
- {"version":3,"file":"MetaSummary.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/MetaSummary.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAG9B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,MAAM,6CAA6C,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,EAAE,GAAG,EAAE,MAAM,mCAAmC,CAAC;AAIxD,MAAM,WAAW,GAGZ,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;;IAChC,OAAO,CACL,IAAC,EAAE,IAAC,KAAK,EAAE,KAAK;QACd;YACE,wCAA8B;YAC9B,gBAAK,MAAA,MAAA,QAAQ,CAAC,OAAO,0CAAE,EAAE,mCAAI,KAAK,CAAM,CACpC;QACN;YACE,sCAA4B;YAC5B,gBAAK,QAAQ,CAAC,IAAI,CAAM,CACpB;QACN;YACE,wCAA8B;YAC9B,gBAAK,QAAQ,CAAC,cAAc,IAAI,KAAK,CAAM,CACvC;QACL,QAAQ,CAAC,iBAAiB;YACzB,CAAC,CAAC;gBACE,2CAAiC;gBACjC;oBACE,IAAC,GAAG,IAAC,GAAG,EAAE,0BAA0B,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAI,CACjE,CACD;YACR,CAAC,CAAC,IAAI,CACL,CACN,CAAC;AACJ,CAAC,CAAC;AAGF,eAAe,WAAW,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React from 'react';\nimport { jsx } from '@emotion/react';\nimport DL from '@riboseinc/paneron-extension-kit/widgets/DL';\nimport { normalizeObjectRecursively } from '@riboseinc/paneron-extension-kit/util';\nimport { Val } from '../../../views/diffing/InlineDiff';\nimport type { Register } from '../../../types';\n\n\nconst MetaSummary: React.VoidFunctionComponent<{\n register: Register\n style?: React.CSSProperties\n}> = function ({ register, style }) {\n return (\n <DL style={style}>\n <div>\n <dt>Viewing&nbsp;version:</dt>\n <dd>{register.version?.id ?? 'N/A'}</dd>\n </div>\n <div>\n <dt>Register&nbsp;name:</dt>\n <dd>{register.name}</dd>\n </div>\n <div>\n <dt>Content&nbsp;summary:</dt>\n <dd>{register.contentSummary || 'N/A'}</dd>\n </div>\n {register.operatingLanguage\n ? <div>\n <dt>Operating&nbsp;language:</dt>\n <dd>\n <Val val={normalizeObjectRecursively(register.operatingLanguage)} />\n </dd>\n </div>\n : null}\n </DL>\n );\n};\n\n\nexport default MetaSummary;\n"]}
1
+ {"version":3,"file":"MetaSummary.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/MetaSummary.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAG9B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,MAAM,6CAA6C,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,EAAE,GAAG,EAAE,MAAM,mCAAmC,CAAC;AAIxD,MAAM,WAAW,GAGZ,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;;IAChC,OAAO,CACL,IAAC,EAAE,IAAC,KAAK,EAAE,KAAK;QACd;YACE,wCAA8B;YAC9B,gBAAK,CAAA,MAAA,QAAQ,CAAC,OAAO,0CAAE,EAAE,KAAI,KAAK,CAAM,CACpC;QACN;YACE,sCAA4B;YAC5B,gBAAK,QAAQ,CAAC,IAAI,CAAM,CACpB;QACL,QAAQ,CAAC,iBAAiB;YACzB,CAAC,CAAC;gBACE,2CAAiC;gBACjC;oBACE,IAAC,GAAG,IAAC,GAAG,EAAE,0BAA0B,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAI,CACjE,CACD;YACR,CAAC,CAAC,IAAI;QACR;YACE,wCAA8B;YAC9B,YAAI,uBAAuB,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,cAAc,IAAI,KAAK,EAAE,GAAO,CAC5E,CACH,CACN,CAAC;AACJ,CAAC,CAAC;AAGF,eAAe,WAAW,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React from 'react';\nimport { jsx } from '@emotion/react';\nimport DL from '@riboseinc/paneron-extension-kit/widgets/DL';\nimport { normalizeObjectRecursively } from '@riboseinc/paneron-extension-kit/util';\nimport { Val } from '../../../views/diffing/InlineDiff';\nimport type { Register } from '../../../types';\n\n\nconst MetaSummary: React.VoidFunctionComponent<{\n register: Register\n style?: React.CSSProperties\n}> = function ({ register, style }) {\n return (\n <DL style={style}>\n <div>\n <dt>Viewing&nbsp;version:</dt>\n <dd>{register.version?.id || 'N/A'}</dd>\n </div>\n <div>\n <dt>Register&nbsp;name:</dt>\n <dd>{register.name}</dd>\n </div>\n {register.operatingLanguage\n ? <div>\n <dt>Operating&nbsp;language:</dt>\n <dd>\n <Val val={normalizeObjectRecursively(register.operatingLanguage)} />\n </dd>\n </div>\n : null}\n <div>\n <dt>Content&nbsp;summary:</dt>\n <dd dangerouslySetInnerHTML={{ __html: register.contentSummary || 'N/A' }}></dd>\n </div>\n </DL>\n );\n};\n\n\nexport default MetaSummary;\n"]}
@@ -1,18 +1,8 @@
1
1
  /** @jsx jsx */
2
2
  /** @jsxFrag React.Fragment */
3
3
  import React from 'react';
4
- import type { Register, RegisterStakeholder } from '../../../types';
4
+ import type { Register } from '../../../types';
5
5
  import { type SomeCR as CR } from '../../../types/cr';
6
- export declare const CurrentProposal: React.VoidFunctionComponent<{
7
- proposal: CR;
8
- register: Register;
9
- stakeholder?: RegisterStakeholder;
10
- }>;
11
- export declare const NewProposal: React.VoidFunctionComponent<{
12
- register: Register;
13
- onCreateBlank?: (idea: string) => Promise<void>;
14
- className?: string;
15
- }>;
16
6
  export declare const Proposals: React.VoidFunctionComponent<{
17
7
  register: Register;
18
8
  actionableProposals?: [groupLabel: JSX.Element | string, proposals: CR[] | undefined][];
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.Proposals = exports.NewProposal = exports.CurrentProposal = void 0;
6
+ exports.Proposals = void 0;
7
7
 
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
 
@@ -11,20 +11,10 @@ var _react2 = require("@emotion/react");
11
11
 
12
12
  var _core = require("@blueprintjs/core");
13
13
 
14
- var _DL = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/DL"));
15
-
16
14
  var _ChangeRequestContext = require("../../change-request/ChangeRequestContext");
17
15
 
18
16
  var _util = require("../../util");
19
17
 
20
- var _TransitionOptions = _interopRequireWildcard(require("../../change-request/TransitionOptions"));
21
-
22
- var _Summary = _interopRequireDefault(require("../../change-request/Summary"));
23
-
24
- var _TransitionHistory = _interopRequireWildcard(require("../../change-request/TransitionHistory"));
25
-
26
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
-
28
18
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
19
 
30
20
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -32,35 +22,6 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
32
22
  /** @jsx jsx */
33
23
 
34
24
  /** @jsxFrag React.Fragment */
35
- const CurrentProposal = function ({
36
- stakeholder,
37
- register,
38
- proposal
39
- }) {
40
- const transitions = stakeholder ? (0, _TransitionOptions.getTransitions)(proposal, stakeholder) : [];
41
- return (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_DL.default, {
42
- css: (0, _react2.css)`padding: 10px 12px 10px 12px; flex-grow: 1; flex-basis: max-content;`
43
- }, (0, _react2.jsx)("div", null, (0, _react2.jsx)("dt", null, "Viewing\u00A0proposal:"), (0, _react2.jsx)("dd", {
44
- css: (0, _react2.css)`max-height: 40px; overflow-y: auto;`
45
- }, "\u201C", proposal.justification.trim() || '(justification N/A)', "\u201D")), (0, _react2.jsx)(_Summary.default, {
46
- cr: proposal,
47
- currentStakeholder: stakeholder,
48
- registerMetadata: register
49
- })), (0, _react2.jsx)("div", {
50
- css: (0, _react2.css)`overflow-y: auto; flex-basis: min-content;`
51
- }, (0, _react2.jsx)(_TransitionHistory.default, {
52
- pastTransitions: (0, _TransitionHistory.getTransitionHistory)(proposal),
53
- isFinal: (0, _TransitionOptions.isFinalState)(proposal.state)
54
- }), transitions.length > 0 ? (0, _react2.jsx)(_TransitionOptions.default, {
55
- stakeholder: stakeholder,
56
- transitions: transitions,
57
- cr: proposal,
58
- css: (0, _react2.css)`padding: 12px;`
59
- }) : null));
60
- };
61
-
62
- exports.CurrentProposal = CurrentProposal;
63
-
64
25
  const NewProposal = function ({
65
26
  register,
66
27
  onCreateBlank,
@@ -103,8 +64,6 @@ const NewProposal = function ({
103
64
  */
104
65
 
105
66
 
106
- exports.NewProposal = NewProposal;
107
-
108
67
  const ActionableProposalItems = function ActionableProposalItems({
109
68
  actionableProposals,
110
69
  onSelect
@@ -114,6 +73,7 @@ const ActionableProposalItems = function ActionableProposalItems({
114
73
  }, (0, _react2.jsx)(_core.MenuDivider, {
115
74
  title: groupLabel
116
75
  }), proposals !== undefined && proposals.length > 0 ? proposals.map(cr => (0, _react2.jsx)(ActionableProposalItem, {
76
+ key: cr.id,
117
77
  cr: cr,
118
78
  onClick: onSelect
119
79
  })) : proposals === undefined ? (0, _react2.jsx)(_core.MenuItem, {
@@ -131,7 +91,13 @@ const ActionableProposalItem = function ({
131
91
  cr,
132
92
  onClick
133
93
  }) {
134
- var _a;
94
+ var _a; // TODO: Try to avoid useContext here.
95
+ // Originally activeCR was passed via prop, need to try again.
96
+ // Switch to context was done to avoid rerendering the entire list
97
+ // & losing scroll position.
98
+ // We want(?) active CR to determine if this item is active
99
+ // and keep it in viewport after user switches back.
100
+
135
101
 
136
102
  const {
137
103
  changeRequest: activeCR
@@ -176,7 +142,7 @@ const Proposals = function ({
176
142
  actionableProposals: actionableProposals !== null && actionableProposals !== void 0 ? actionableProposals : [],
177
143
  onSelect: onSelectProposal
178
144
  }) : null;
179
- }, [onSelectProposal, hasActionable, actionableProposals === null || actionableProposals === void 0 ? void 0 : actionableProposals.length]); // return <Menu css={css`overflow-y: auto; background: none !important`} className={className}>
145
+ }, [onSelectProposal, hasActionable, actionableProposals]); // return <Menu css={css`overflow-y: auto; background: none !important`} className={className}>
180
146
  // {proposalMenuItems}
181
147
  // </Menu>
182
148
 
@@ -223,6 +189,108 @@ const Proposals = function ({
223
189
  })
224
190
  }]
225
191
  });
226
- };
192
+ }; //1const ProposalsBlock: React.VoidFunctionComponent<{
193
+ //1 proposal: CR
194
+ //1 register: Register
195
+ //1 stakeholder?: RegisterStakeholder
196
+ //1 canDelete?: boolean
197
+ //1 onDelete?: () => (void | Promise<void>)
198
+ //1 onOpen?: () => void
199
+ //1 className?: string
200
+ //1}> = function ({ proposal, stakeholder, register, onDelete, onOpen, canDelete, className }) {
201
+ //1 const actions: MenuItemProps[] = stakeholder && canBeTransitionedBy(stakeholder, proposal)
202
+ //1 ? [/*{
203
+ //1 // Action is taken from within the widget.
204
+ //1 text: "Take action",
205
+ //1 onClick: () => void 0,
206
+ //1 icon: 'take-action',
207
+ //1 intent: 'primary',
208
+ //1 }*/]
209
+ //1 : canDelete
210
+ //1 ? [{
211
+ //1 text: "Delete this proposal draft",
212
+ //1 onClick: onDelete,
213
+ //1 disabled: !onDelete,
214
+ //1 icon: 'delete',
215
+ //1 intent: 'danger',
216
+ //1 }]
217
+ //1 : [];
218
+ //1
219
+ //1 actions.push({
220
+ //1 text: "Open in new window",
221
+ //1 disabled: !onOpen,
222
+ //1 onClick: onOpen,
223
+ //1 });
224
+ //1 const proposalBlockActions = useMemo(() => {
225
+ //1 const actions = [];
226
+ //1 if (activeCR) {
227
+ //1 actions.push({
228
+ //1 text: "Export proposal",
229
+ //1 onClick: () => void 0,
230
+ //1 icon: 'export',
231
+ //1 disabled: true,
232
+ //1 } as const);
233
+ //1 actions.push({
234
+ //1 text: "Exit proposal",
235
+ //1 icon: 'log-out',
236
+ //1 intent: 'danger',
237
+ //1 disabled: isBusy,
238
+ //1 onClick: setActiveChangeRequestID
239
+ //1 ? () => setActiveChangeRequestID?.(null)
240
+ //1 : undefined,
241
+ //1 } as const);
242
+ //1 } else {
243
+ //1 if (stakeholder && canCreateCR(stakeholder)) {
244
+ //1 actions.push({
245
+ //1 text: "Create blank proposal",
246
+ //1 onClick: !createMode ? (() => setCreateMode(true)) : undefined,
247
+ //1 disabled: !createCR,
248
+ //1 active: createMode,
249
+ //1 selected: createMode,
250
+ //1 icon: 'add',
251
+ //1 intent: actionableProposals.length < 1
252
+ //1 ? 'primary'
253
+ //1 : undefined,
254
+ //1 } as const);
255
+ //1 }
256
+ //1 if (stakeholder && canImportCR(stakeholder)) {
257
+ //1 actions.push({
258
+ //1 text: "Import proposal",
259
+ //1 onClick: importCR,
260
+ //1 disabled: !importCR || createMode,
261
+ //1 icon: 'import',
262
+ //1 intent: actionableProposals.length < 1
263
+ //1 ? 'primary'
264
+ //1 : undefined,
265
+ //1 } as const);
266
+ //1 }
267
+ //1 }
268
+ //1 return actions;
269
+ //1 }, [!activeCR, createMode, importCR, createCR, isBusy, actionableProposals.length < 1]);
270
+ //1
271
+ //1 return (
272
+ //1 <HomeBlock
273
+ //1 View={Proposals}
274
+ //1 key="proposal dashboard"
275
+ //1 description="Actionable proposals"
276
+ //1 css={css`
277
+ //1 height: 300px;
278
+ //1 flex-basis: calc(50% - 10px);
279
+ //1 flex-grow: 1;
280
+ //1 `}
281
+ //1 props={{
282
+ //1 register,
283
+ //1 actionableProposals,
284
+ //1 createMode,
285
+ //1 onCreate: handleCreate,
286
+ //1 onRefreshProposals: handleRefreshProposals,
287
+ //1 onSelectProposal: handleSelectProposal,
288
+ //1 }}
289
+ //1 actions={proposalBlockActions}
290
+ //1 />
291
+ //1 );
292
+ //1};
293
+ //1export default ProposalsBlock;
294
+
227
295
 
228
296
  exports.Proposals = Proposals;
@@ -1 +1 @@
1
- {"version":3,"file":"Proposal.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/Proposal.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, {\n useState,\n useContext,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n Button,\n FormGroup,\n ControlGroup,\n TextArea,\n PanelStack2 as PanelStack, type Panel,\n Menu, MenuDivider, MenuItem,\n Spinner,\n NonIdealState,\n} from '@blueprintjs/core';\n\nimport DL from '@riboseinc/paneron-extension-kit/widgets/DL';\nimport { ChangeRequestContext } from '../../change-request/ChangeRequestContext';\nimport { maybeEllipsizeString } from '../../util';\nimport type { Register, RegisterStakeholder } from '../../../types';\nimport { type SomeCR as CR } from '../../../types/cr';\nimport TransitionOptions, { isFinalState, getTransitions } from '../../change-request/TransitionOptions';\nimport Summary from '../../change-request/Summary';\nimport TransitionsAndStatus, { getTransitionHistory } from '../../change-request/TransitionHistory';\n\n\nexport const CurrentProposal: React.VoidFunctionComponent<{\n proposal: CR\n register: Register\n stakeholder?: RegisterStakeholder\n}> = function ({ stakeholder, register, proposal }) {\n const transitions = stakeholder\n ? getTransitions(proposal, stakeholder)\n : [];\n\n return (\n <>\n <DL css={css`padding: 10px 12px 10px 12px; flex-grow: 1; flex-basis: max-content;`}>\n <div>\n <dt>Viewing&nbsp;proposal:</dt>\n <dd css={css`max-height: 40px; overflow-y: auto;`}>\n “{proposal.justification.trim() || '(justification N/A)'}”\n </dd>\n </div>\n <Summary\n cr={proposal}\n currentStakeholder={stakeholder}\n registerMetadata={register}\n />\n </DL>\n <div css={css`overflow-y: auto; flex-basis: min-content;`}>\n <TransitionsAndStatus\n pastTransitions={getTransitionHistory(proposal)}\n isFinal={isFinalState(proposal.state)}\n />\n {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 </>\n );\n};\n\n\nexport const NewProposal: React.VoidFunctionComponent<{\n register: Register\n onCreateBlank?: (idea: string) => Promise<void>\n className?: string\n}> = function ({ register, onCreateBlank, className }) {\n const [ newProposalIdea, setNewProposalIdea ] = useState('');\n\n const handleNewProposal = useCallback(async function handleNewProposal () {\n if (newProposalIdea.trim()) {\n await onCreateBlank?.(newProposalIdea);\n setNewProposalIdea('');\n } else {\n throw new Error(\"Cannot create proposal: need some initial motivation for the change\");\n }\n }, [newProposalIdea, onCreateBlank]);\n\n return (\n <FormGroup\n className={className}\n css={css`overflow-y: auto;`}\n label={<>Propose a change to version {register.version?.id ?? '(N/A)'}:</>}>\n <ControlGroup vertical>\n <TextArea\n value={newProposalIdea ?? ''}\n placeholder=\"Your idea…\"\n title=\"Justification draft (you can change this later)\"\n onChange={evt => setNewProposalIdea(evt.currentTarget.value)}\n />\n <Button\n fill\n intent={newProposalIdea ? 'primary': undefined}\n disabled={!newProposalIdea.trim() || !onCreateBlank}\n title=\"A blank proposal will be created and opened in a new tab.\"\n onClick={handleNewProposal}\n icon=\"tick\">\n Create\n </Button>\n </ControlGroup>\n </FormGroup>\n );\n};\n\n\n/**\n * A list of menu items for given actionable proposals,\n * grouped by label.\n */\nconst ActionableProposalItems: React.VoidFunctionComponent<{\n actionableProposals: [groupLabel: JSX.Element | string, proposals: CR[] | undefined][]\n onSelect?: (proposalID: string) => void\n}> = function ActionableProposalItems ({ actionableProposals, onSelect }) {\n return <>{\n actionableProposals?.\n filter(([, proposals]) => proposals && proposals.length > 0).\n map(([groupLabel, proposals], idx) =>\n <React.Fragment key={idx}>\n <MenuDivider title={groupLabel} />\n {proposals !== undefined && proposals.length > 0\n ? proposals.map(cr =>\n <ActionableProposalItem\n cr={cr}\n onClick={onSelect}\n />)\n : proposals === undefined\n ? <MenuItem disabled text=\"Loading…\" icon={<Spinner />} />\n : <MenuItem disabled text=\"No pending proposals\" icon=\"clean\" />}\n </React.Fragment>)\n }</>;\n};\n\n\nconst ActionableProposalItem: React.VoidFunctionComponent<{\n cr: CR\n onClick?: (crID: string) => void\n}> = function ({ cr, onClick }) {\n const { changeRequest: activeCR } = useContext(ChangeRequestContext);\n const selectedMenuItem = useRef<HTMLLIElement | null>(null);\n const isActive = activeCR && cr.id === activeCR?.id\n ? true\n : false;\n useEffect(() => {\n selectedMenuItem.current?.scrollIntoView?.({ block: 'nearest' });\n }, [isActive]);\n const handleClick = useCallback(() => {\n return onClick?.(cr.id);\n }, [onClick, cr.id]);\n return (\n <MenuItem\n key={cr.id}\n elementRef={isActive ? selectedMenuItem : undefined}\n selected={isActive}\n active={isActive}\n text={maybeEllipsizeString(cr.justification?.trim() || cr.id, 120)}\n htmlTitle={cr.justification}\n disabled={!onClick}\n onClick={onClick ? handleClick : undefined}\n />\n );\n};\n\n\nexport const Proposals: React.VoidFunctionComponent<{\n register: Register\n actionableProposals?: [groupLabel: JSX.Element | string, proposals: CR[] | undefined][]\n onCreate?: (idea: string | false) => Promise<void>\n createMode?: boolean\n onSelectProposal?: (id: string) => void\n onRefreshProposals?: () => void\n className?: string\n}> = function ({\n register,\n actionableProposals,\n onCreate,\n createMode,\n onSelectProposal,\n onRefreshProposals,\n className,\n}) {\n //const [creating, setCreating] = useState(false);\n const hasActionable = (actionableProposals && actionableProposals.find(p => p[1] && p[1].length > 0));\n const proposalMenuItems = useMemo(() => {\n return hasActionable\n ? <ActionableProposalItems\n actionableProposals={actionableProposals ?? []}\n onSelect={onSelectProposal}\n />\n : null;\n }, [onSelectProposal, hasActionable, actionableProposals?.length]);\n\n // return <Menu css={css`overflow-y: auto; background: none !important`} className={className}>\n // {proposalMenuItems}\n // </Menu>\n\n const stack: Panel<any>[] = useMemo(() => {\n const stack = [];\n const proposalMenu = proposalMenuItems\n ? <Menu css={css`overflow-y: auto; background: none !important;`}>\n {proposalMenuItems}\n </Menu>\n : null;\n if (proposalMenu) {\n stack.push({\n title: createMode\n ? \"Proposals\"\n : <>\n Proposals\n {hasActionable\n ? <>\n &nbsp;\n <Button\n minimal\n small\n onClick={onRefreshProposals}\n disabled={!onRefreshProposals}\n icon=\"refresh\"\n />\n </>\n : null}\n </>,\n renderPanel: () => proposalMenu,\n });\n }\n if (createMode) {\n stack.push({\n title: \"Start proposal\",\n renderPanel: () =>\n <NewProposal\n onCreateBlank={onCreate}\n register={register}\n css={css`padding: 5px;`}\n />,\n });\n }\n return stack;\n }, [\n onCreate, createMode,\n onRefreshProposals,\n register, proposalMenuItems,\n ]);\n\n return <PanelStack\n css={css`flex: 1; .bp4-panel-stack-view { background: none; }`}\n className={className}\n onClose={() => onCreate?.(false)}\n stack={stack.length > 0\n ? stack\n : [{ title: '', renderPanel: () => <NonIdealState title=\"Nothing to show\" /> }]}\n />;\n};\n"]}
1
+ {"version":3,"file":"Proposal.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/Proposal.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, {\n useState,\n useContext,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n Button,\n FormGroup,\n ControlGroup,\n TextArea,\n PanelStack2 as PanelStack, type Panel,\n Menu, MenuDivider, MenuItem,\n Spinner,\n NonIdealState,\n} from '@blueprintjs/core';\n\nimport { ChangeRequestContext } from '../../change-request/ChangeRequestContext';\nimport { maybeEllipsizeString } from '../../util';\nimport type { Register } from '../../../types';\nimport { type SomeCR as CR } from '../../../types/cr';\n\n\nconst NewProposal: React.VoidFunctionComponent<{\n register: Register\n onCreateBlank?: (idea: string) => Promise<void>\n className?: string\n}> = function ({ register, onCreateBlank, className }) {\n const [ newProposalIdea, setNewProposalIdea ] = useState('');\n\n const handleNewProposal = useCallback(async function handleNewProposal () {\n if (newProposalIdea.trim()) {\n await onCreateBlank?.(newProposalIdea);\n setNewProposalIdea('');\n } else {\n throw new Error(\"Cannot create proposal: need some initial motivation for the change\");\n }\n }, [newProposalIdea, onCreateBlank]);\n\n return (\n <FormGroup\n className={className}\n css={css`overflow-y: auto;`}\n label={<>Propose a change to version {register.version?.id ?? '(N/A)'}:</>}>\n <ControlGroup vertical>\n <TextArea\n value={newProposalIdea ?? ''}\n placeholder=\"Your idea…\"\n title=\"Justification draft (you can change this later)\"\n onChange={evt => setNewProposalIdea(evt.currentTarget.value)}\n />\n <Button\n fill\n intent={newProposalIdea ? 'primary': undefined}\n disabled={!newProposalIdea.trim() || !onCreateBlank}\n title=\"A blank proposal will be created and opened in a new tab.\"\n onClick={handleNewProposal}\n icon=\"tick\">\n Create\n </Button>\n </ControlGroup>\n </FormGroup>\n );\n};\n\n\n/**\n * A list of menu items for given actionable proposals,\n * grouped by label.\n */\nconst ActionableProposalItems: React.VoidFunctionComponent<{\n actionableProposals: [groupLabel: JSX.Element | string, proposals: CR[] | undefined][]\n onSelect?: (proposalID: string) => void\n}> = function ActionableProposalItems ({ actionableProposals, onSelect }) {\n return <>{\n actionableProposals?.\n filter(([, proposals]) => proposals && proposals.length > 0).\n map(([groupLabel, proposals], idx) =>\n <React.Fragment key={idx}>\n <MenuDivider title={groupLabel} />\n {proposals !== undefined && proposals.length > 0\n ? proposals.map(cr =>\n <ActionableProposalItem\n key={cr.id}\n cr={cr}\n onClick={onSelect}\n />)\n : proposals === undefined\n ? <MenuItem disabled text=\"Loading…\" icon={<Spinner />} />\n : <MenuItem disabled text=\"No pending proposals\" icon=\"clean\" />}\n </React.Fragment>)\n }</>;\n};\n\n\nconst ActionableProposalItem: React.VoidFunctionComponent<{\n cr: CR\n onClick?: (crID: string) => void\n}> = function ({ cr, onClick }) {\n // TODO: Try to avoid useContext here.\n // Originally activeCR was passed via prop, need to try again.\n // Switch to context was done to avoid rerendering the entire list\n // & losing scroll position.\n // We want(?) active CR to determine if this item is active\n // and keep it in viewport after user switches back.\n const { changeRequest: activeCR } = useContext(ChangeRequestContext);\n const selectedMenuItem = useRef<HTMLLIElement | null>(null);\n const isActive = activeCR && cr.id === activeCR?.id\n ? true\n : false;\n useEffect(() => {\n selectedMenuItem.current?.scrollIntoView?.({ block: 'nearest' });\n }, [isActive]);\n const handleClick = useCallback(() => {\n return onClick?.(cr.id);\n }, [onClick, cr.id]);\n return (\n <MenuItem\n key={cr.id}\n elementRef={isActive ? selectedMenuItem : undefined}\n selected={isActive}\n active={isActive}\n text={maybeEllipsizeString(cr.justification?.trim() || cr.id, 120)}\n htmlTitle={cr.justification}\n disabled={!onClick}\n onClick={onClick ? handleClick : undefined}\n />\n );\n};\n\n\nexport const Proposals: React.VoidFunctionComponent<{\n register: Register\n actionableProposals?: [groupLabel: JSX.Element | string, proposals: CR[] | undefined][]\n onCreate?: (idea: string | false) => Promise<void>\n createMode?: boolean\n onSelectProposal?: (id: string) => void\n onRefreshProposals?: () => void\n className?: string\n}> = function ({\n register,\n actionableProposals,\n onCreate,\n createMode,\n onSelectProposal,\n onRefreshProposals,\n className,\n}) {\n //const [creating, setCreating] = useState(false);\n const hasActionable = (actionableProposals && actionableProposals.find(p => p[1] && p[1].length > 0));\n const proposalMenuItems = useMemo(() => {\n return hasActionable\n ? <ActionableProposalItems\n actionableProposals={actionableProposals ?? []}\n onSelect={onSelectProposal}\n />\n : null;\n }, [onSelectProposal, hasActionable, actionableProposals]);\n\n // return <Menu css={css`overflow-y: auto; background: none !important`} className={className}>\n // {proposalMenuItems}\n // </Menu>\n\n const stack: Panel<any>[] = useMemo(() => {\n const stack = [];\n const proposalMenu = proposalMenuItems\n ? <Menu css={css`overflow-y: auto; background: none !important;`}>\n {proposalMenuItems}\n </Menu>\n : null;\n if (proposalMenu) {\n stack.push({\n title: createMode\n ? \"Proposals\"\n : <>\n Proposals\n {hasActionable\n ? <>\n &nbsp;\n <Button\n minimal\n small\n onClick={onRefreshProposals}\n disabled={!onRefreshProposals}\n icon=\"refresh\"\n />\n </>\n : null}\n </>,\n renderPanel: () => proposalMenu,\n });\n }\n if (createMode) {\n stack.push({\n title: \"Start proposal\",\n renderPanel: () =>\n <NewProposal\n onCreateBlank={onCreate}\n register={register}\n css={css`padding: 5px;`}\n />,\n });\n }\n return stack;\n }, [\n onCreate, createMode,\n onRefreshProposals,\n register, proposalMenuItems,\n ]);\n\n return <PanelStack\n css={css`flex: 1; .bp4-panel-stack-view { background: none; }`}\n className={className}\n onClose={() => onCreate?.(false)}\n stack={stack.length > 0\n ? stack\n : [{ title: '', renderPanel: () => <NonIdealState title=\"Nothing to show\" /> }]}\n />;\n};\n\n\n//1const ProposalsBlock: React.VoidFunctionComponent<{\n//1 proposal: CR\n//1 register: Register\n//1 stakeholder?: RegisterStakeholder\n//1 canDelete?: boolean\n//1 onDelete?: () => (void | Promise<void>)\n//1 onOpen?: () => void\n//1 className?: string\n//1}> = function ({ proposal, stakeholder, register, onDelete, onOpen, canDelete, className }) {\n//1 const actions: MenuItemProps[] = stakeholder && canBeTransitionedBy(stakeholder, proposal)\n//1 ? [/*{\n//1 // Action is taken from within the widget.\n//1 text: \"Take action\",\n//1 onClick: () => void 0,\n//1 icon: 'take-action',\n//1 intent: 'primary',\n//1 }*/]\n//1 : canDelete\n//1 ? [{\n//1 text: \"Delete this proposal draft\",\n//1 onClick: onDelete,\n//1 disabled: !onDelete,\n//1 icon: 'delete',\n//1 intent: 'danger',\n//1 }]\n//1 : [];\n//1\n//1 actions.push({\n//1 text: \"Open in new window\",\n//1 disabled: !onOpen,\n//1 onClick: onOpen,\n//1 });\n//1 const proposalBlockActions = useMemo(() => {\n//1 const actions = [];\n//1 if (activeCR) {\n//1 actions.push({\n//1 text: \"Export proposal\",\n//1 onClick: () => void 0,\n//1 icon: 'export',\n//1 disabled: true,\n//1 } as const);\n//1 actions.push({\n//1 text: \"Exit proposal\",\n//1 icon: 'log-out',\n//1 intent: 'danger',\n//1 disabled: isBusy,\n//1 onClick: setActiveChangeRequestID\n//1 ? () => setActiveChangeRequestID?.(null)\n//1 : undefined,\n//1 } as const);\n//1 } else {\n//1 if (stakeholder && canCreateCR(stakeholder)) {\n//1 actions.push({\n//1 text: \"Create blank proposal\",\n//1 onClick: !createMode ? (() => setCreateMode(true)) : undefined,\n//1 disabled: !createCR,\n//1 active: createMode,\n//1 selected: createMode,\n//1 icon: 'add',\n//1 intent: actionableProposals.length < 1\n//1 ? 'primary'\n//1 : undefined,\n//1 } as const);\n//1 }\n//1 if (stakeholder && canImportCR(stakeholder)) {\n//1 actions.push({\n//1 text: \"Import proposal\",\n//1 onClick: importCR,\n//1 disabled: !importCR || createMode,\n//1 icon: 'import',\n//1 intent: actionableProposals.length < 1\n//1 ? 'primary'\n//1 : undefined,\n//1 } as const);\n//1 }\n//1 }\n//1 return actions;\n//1 }, [!activeCR, createMode, importCR, createCR, isBusy, actionableProposals.length < 1]);\n//1\n//1 return (\n//1 <HomeBlock\n//1 View={Proposals}\n//1 key=\"proposal dashboard\"\n//1 description=\"Actionable proposals\"\n//1 css={css`\n//1 height: 300px;\n//1 flex-basis: calc(50% - 10px);\n//1 flex-grow: 1;\n//1 `}\n//1 props={{\n//1 register,\n//1 actionableProposals,\n//1 createMode,\n//1 onCreate: handleCreate,\n//1 onRefreshProposals: handleRefreshProposals,\n//1 onSelectProposal: handleSelectProposal,\n//1 }}\n//1 actions={proposalBlockActions}\n//1 />\n//1 );\n//1};\n//1export default ProposalsBlock;\n"]}