@riboseinc/paneron-registry-kit 2.2.10 → 2.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +2 -4
- package/index.js +18 -0
- package/index.js.map +1 -1
- package/package.json +2 -2
- package/site-builder/index.d.ts +3 -0
- package/site-builder/index.js +75 -0
- package/site-builder/index.js.map +1 -0
- package/site-builder/jsx-runtime.d.ts +18 -0
- package/site-builder/jsx-runtime.js +107 -0
- package/site-builder/jsx-runtime.js.map +1 -0
- package/site-builder/page.d.ts +6 -0
- package/site-builder/page.js +24 -0
- package/site-builder/page.js.map +1 -0
- package/types/cr.d.ts +22 -0
- package/types/cr.js +41 -1
- package/types/cr.js.map +1 -1
- package/types/item.d.ts +1 -1
- package/types/item.js.map +1 -1
- package/types/stakeholder.d.ts +3 -1
- package/types/stakeholder.js +20 -0
- package/types/stakeholder.js.map +1 -1
- package/types/util.d.ts +2 -0
- package/types/util.js.map +1 -1
- package/types/views.d.ts +22 -0
- package/types/views.js.map +1 -1
- package/views/AnnotatedChange.js +7 -5
- package/views/AnnotatedChange.js.map +1 -1
- package/views/BrowserCtx.d.ts +3 -11
- package/views/BrowserCtx.js +1 -0
- package/views/BrowserCtx.js.map +1 -1
- package/views/FilterCriteria/criteriaGroupToQueryExpression.d.ts +1 -1
- package/views/FilterCriteria/criteriaGroupToQueryExpression.js.map +1 -1
- package/views/FilterCriteria/models.d.ts +1 -1
- package/views/FilterCriteria/models.js.map +1 -1
- package/views/GenericRelatedItemView.js +11 -51
- package/views/GenericRelatedItemView.js.map +1 -1
- package/views/ItemDrawer.d.ts +11 -0
- package/views/ItemDrawer.js +69 -0
- package/views/ItemDrawer.js.map +1 -0
- package/views/SearchQuery.js +25 -14
- package/views/SearchQuery.js.map +1 -1
- package/views/change-request/ChangeProposalContext.d.ts +3 -0
- package/views/change-request/ChangeProposalContext.js +4 -0
- package/views/change-request/ChangeProposalContext.js.map +1 -0
- package/views/change-request/ChangeRequestContext.d.ts +18 -2
- package/views/change-request/ChangeRequestContext.js +29 -5
- package/views/change-request/ChangeRequestContext.js.map +1 -1
- package/views/change-request/Proposals.d.ts +2 -0
- package/views/change-request/Proposals.js +116 -80
- package/views/change-request/Proposals.js.map +1 -1
- package/views/change-request/State.d.ts +0 -0
- package/views/change-request/State.js +1 -0
- package/views/change-request/State.js.map +1 -0
- package/views/change-request/Summary.d.ts +12 -0
- package/views/change-request/Summary.js +59 -0
- package/views/change-request/Summary.js.map +1 -0
- package/views/change-request/TransitionHistory.d.ts +30 -0
- package/views/change-request/TransitionHistory.js +307 -0
- package/views/change-request/TransitionHistory.js.map +1 -0
- package/views/change-request/TransitionOptions.d.ts +38 -0
- package/views/{detail/ChangeRequest/transitions.js → change-request/TransitionOptions.js} +61 -51
- package/views/change-request/TransitionOptions.js.map +1 -0
- package/views/change-request/objectChangeset.d.ts +7 -4
- package/views/change-request/objectChangeset.js +60 -23
- package/views/change-request/objectChangeset.js.map +1 -1
- package/views/detail/ChangeRequest/index.js +129 -142
- package/views/detail/ChangeRequest/index.js.map +1 -1
- package/views/detail/RegisterHome/ActiveProposalDetails.d.ts +15 -0
- package/views/detail/RegisterHome/ActiveProposalDetails.js +104 -0
- package/views/detail/RegisterHome/ActiveProposalDetails.js.map +1 -0
- package/views/detail/RegisterHome/Block.d.ts +19 -0
- package/views/detail/RegisterHome/Block.js +49 -0
- package/views/detail/RegisterHome/Block.js.map +1 -0
- package/views/detail/RegisterHome/MetaSummary.d.ts +9 -0
- package/views/detail/RegisterHome/MetaSummary.js +39 -0
- package/views/detail/RegisterHome/MetaSummary.js.map +1 -0
- package/views/detail/RegisterHome/Proposal.d.ts +14 -0
- package/views/detail/RegisterHome/Proposal.js +296 -0
- package/views/detail/RegisterHome/Proposal.js.map +1 -0
- package/views/detail/RegisterHome/index.js +345 -141
- package/views/detail/RegisterHome/index.js.map +1 -1
- package/views/detail/RegisterItem/index.d.ts +2 -3
- package/views/detail/RegisterItem/index.js +238 -140
- package/views/detail/RegisterItem/index.js.map +1 -1
- package/views/detail/RegisterMeta/RegisterMetaForm.js +37 -45
- package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
- package/views/detail/RegisterMeta/index.js +14 -11
- package/views/detail/RegisterMeta/index.js.map +1 -1
- package/views/diffing/InlineDiff.d.ts +27 -1
- package/views/diffing/InlineDiff.js +113 -2
- package/views/diffing/InlineDiff.js.map +1 -1
- package/views/hooks/useCustomView.js +1 -1
- package/views/hooks/useCustomView.js.map +1 -1
- package/views/index.js +4 -2
- package/views/index.js.map +1 -1
- package/views/sidebar/Search/index.js +12 -2
- package/views/sidebar/Search/index.js.map +1 -1
- package/views/util.d.ts +43 -6
- package/views/util.js +240 -11
- package/views/util.js.map +1 -1
- package/views/detail/ChangeRequest/transitions.d.ts +0 -28
- package/views/detail/ChangeRequest/transitions.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Block.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/Block.tsx"],"names":[],"mappings":"AAGA,wCAAwC;AACxC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAsB,aAAa,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC/F,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,UAAU,IACP,GAAG,EAAE,GAAG,CAAA;;;;;;;SAOP,EACD,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,IAAI,IAAC,GAAG,EAAE,GAAG,CAAA,8CAA8C,IACzD,OAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAC,QAAQ,IAAC,GAAG,EAAE,GAAG,KAAM,GAAG,GAAI,CAAC,CACvD;YACT,CAAC,CAAC,IAAI,CACG,CACd,CAAC;AACJ,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\nimport React from 'react';\n//import { Helmet } from 'react-helmet';\nimport { jsx, css } from '@emotion/react';\nimport { Menu, MenuItem, type MenuItemProps, NonIdealState, Spinner } 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[],\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 <CardInGrid\n css={css`\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 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 ? <Menu css={css`background: none !important; flex-shrink: 0;`}>\n {actions!.map((mip, idx) => <MenuItem key={idx} {...mip }/>)}\n </Menu>\n : null}\n </CardInGrid>\n );\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
/** @jsxFrag React.Fragment */
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import type { Register } from '../../../types';
|
|
5
|
+
declare const MetaSummary: React.VoidFunctionComponent<{
|
|
6
|
+
register: Register;
|
|
7
|
+
style?: React.CSSProperties;
|
|
8
|
+
}>;
|
|
9
|
+
export default MetaSummary;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = require("@emotion/react");
|
|
9
|
+
|
|
10
|
+
var _DL = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/DL"));
|
|
11
|
+
|
|
12
|
+
var _util = require("@riboseinc/paneron-extension-kit/util");
|
|
13
|
+
|
|
14
|
+
var _InlineDiff = require("../../../views/diffing/InlineDiff");
|
|
15
|
+
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
+
|
|
18
|
+
/** @jsx jsx */
|
|
19
|
+
|
|
20
|
+
/** @jsxFrag React.Fragment */
|
|
21
|
+
const MetaSummary = function ({
|
|
22
|
+
register,
|
|
23
|
+
style
|
|
24
|
+
}) {
|
|
25
|
+
var _a;
|
|
26
|
+
|
|
27
|
+
return (0, _react.jsx)(_DL.default, {
|
|
28
|
+
style: style
|
|
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)), (0, _react.jsx)("div", null, (0, _react.jsx)("dt", null, "Content\u00A0summary:"), (0, _react.jsx)("dd", {
|
|
30
|
+
dangerouslySetInnerHTML: {
|
|
31
|
+
__html: register.contentSummary || 'N/A'
|
|
32
|
+
}
|
|
33
|
+
})), register.operatingLanguage ? (0, _react.jsx)("div", null, (0, _react.jsx)("dt", null, "Operating\u00A0language:"), (0, _react.jsx)("dd", null, (0, _react.jsx)(_InlineDiff.Val, {
|
|
34
|
+
val: (0, _util.normalizeObjectRecursively)(register.operatingLanguage)
|
|
35
|
+
}))) : null);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
var _default = MetaSummary;
|
|
39
|
+
exports.default = _default;
|
|
@@ -0,0 +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,CAAA,MAAA,QAAQ,CAAC,OAAO,0CAAE,EAAE,KAAI,KAAK,CAAM,CACpC;QACN;YACE,sCAA4B;YAC5B,gBAAK,QAAQ,CAAC,IAAI,CAAM,CACpB;QACN;YACE,wCAA8B;YAC9B,YAAI,uBAAuB,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,cAAc,IAAI,KAAK,EAAE,GAAO,CAC5E;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 version:</dt>\n <dd>{register.version?.id || 'N/A'}</dd>\n </div>\n <div>\n <dt>Register name:</dt>\n <dd>{register.name}</dd>\n </div>\n <div>\n <dt>Content summary:</dt>\n <dd dangerouslySetInnerHTML={{ __html: register.contentSummary || 'N/A' }}></dd>\n </div>\n {register.operatingLanguage\n ? <div>\n <dt>Operating 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"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
/** @jsxFrag React.Fragment */
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import type { Register } from '../../../types';
|
|
5
|
+
import { type SomeCR as CR } from '../../../types/cr';
|
|
6
|
+
export declare const Proposals: React.VoidFunctionComponent<{
|
|
7
|
+
register: Register;
|
|
8
|
+
actionableProposals?: [groupLabel: JSX.Element | string, proposals: CR[] | undefined][];
|
|
9
|
+
onCreate?: (idea: string | false) => Promise<void>;
|
|
10
|
+
createMode?: boolean;
|
|
11
|
+
onSelectProposal?: (id: string) => void;
|
|
12
|
+
onRefreshProposals?: () => void;
|
|
13
|
+
className?: string;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Proposals = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _react2 = require("@emotion/react");
|
|
11
|
+
|
|
12
|
+
var _core = require("@blueprintjs/core");
|
|
13
|
+
|
|
14
|
+
var _ChangeRequestContext = require("../../change-request/ChangeRequestContext");
|
|
15
|
+
|
|
16
|
+
var _util = require("../../util");
|
|
17
|
+
|
|
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); }
|
|
19
|
+
|
|
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; }
|
|
21
|
+
|
|
22
|
+
/** @jsx jsx */
|
|
23
|
+
|
|
24
|
+
/** @jsxFrag React.Fragment */
|
|
25
|
+
const NewProposal = function ({
|
|
26
|
+
register,
|
|
27
|
+
onCreateBlank,
|
|
28
|
+
className
|
|
29
|
+
}) {
|
|
30
|
+
var _a, _b;
|
|
31
|
+
|
|
32
|
+
const [newProposalIdea, setNewProposalIdea] = (0, _react.useState)('');
|
|
33
|
+
const handleNewProposal = (0, _react.useCallback)(async function handleNewProposal() {
|
|
34
|
+
if (newProposalIdea.trim()) {
|
|
35
|
+
await (onCreateBlank === null || onCreateBlank === void 0 ? void 0 : onCreateBlank(newProposalIdea));
|
|
36
|
+
setNewProposalIdea('');
|
|
37
|
+
} else {
|
|
38
|
+
throw new Error("Cannot create proposal: need some initial motivation for the change");
|
|
39
|
+
}
|
|
40
|
+
}, [newProposalIdea, onCreateBlank]);
|
|
41
|
+
return (0, _react2.jsx)(_core.FormGroup, {
|
|
42
|
+
className: className,
|
|
43
|
+
css: (0, _react2.css)`overflow-y: auto;`,
|
|
44
|
+
label: (0, _react2.jsx)(_react.default.Fragment, null, "Propose a change to version ", (_b = (_a = register.version) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '(N/A)', ":")
|
|
45
|
+
}, (0, _react2.jsx)(_core.ControlGroup, {
|
|
46
|
+
vertical: true
|
|
47
|
+
}, (0, _react2.jsx)(_core.TextArea, {
|
|
48
|
+
value: newProposalIdea !== null && newProposalIdea !== void 0 ? newProposalIdea : '',
|
|
49
|
+
placeholder: "Your idea\u2026",
|
|
50
|
+
title: "Justification draft (you can change this later)",
|
|
51
|
+
onChange: evt => setNewProposalIdea(evt.currentTarget.value)
|
|
52
|
+
}), (0, _react2.jsx)(_core.Button, {
|
|
53
|
+
fill: true,
|
|
54
|
+
intent: newProposalIdea ? 'primary' : undefined,
|
|
55
|
+
disabled: !newProposalIdea.trim() || !onCreateBlank,
|
|
56
|
+
title: "A blank proposal will be created and opened in a new tab.",
|
|
57
|
+
onClick: handleNewProposal,
|
|
58
|
+
icon: "tick"
|
|
59
|
+
}, "Create")));
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* A list of menu items for given actionable proposals,
|
|
63
|
+
* grouped by label.
|
|
64
|
+
*/
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
const ActionableProposalItems = function ActionableProposalItems({
|
|
68
|
+
actionableProposals,
|
|
69
|
+
onSelect
|
|
70
|
+
}) {
|
|
71
|
+
return (0, _react2.jsx)(_react.default.Fragment, null, actionableProposals === null || actionableProposals === void 0 ? void 0 : actionableProposals.filter(([, proposals]) => proposals && proposals.length > 0).map(([groupLabel, proposals], idx) => (0, _react2.jsx)(_react.default.Fragment, {
|
|
72
|
+
key: idx
|
|
73
|
+
}, (0, _react2.jsx)(_core.MenuDivider, {
|
|
74
|
+
title: groupLabel
|
|
75
|
+
}), proposals !== undefined && proposals.length > 0 ? proposals.map(cr => (0, _react2.jsx)(ActionableProposalItem, {
|
|
76
|
+
key: cr.id,
|
|
77
|
+
cr: cr,
|
|
78
|
+
onClick: onSelect
|
|
79
|
+
})) : proposals === undefined ? (0, _react2.jsx)(_core.MenuItem, {
|
|
80
|
+
disabled: true,
|
|
81
|
+
text: "Loading\u2026",
|
|
82
|
+
icon: (0, _react2.jsx)(_core.Spinner, null)
|
|
83
|
+
}) : (0, _react2.jsx)(_core.MenuItem, {
|
|
84
|
+
disabled: true,
|
|
85
|
+
text: "No pending proposals",
|
|
86
|
+
icon: "clean"
|
|
87
|
+
}))));
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const ActionableProposalItem = function ({
|
|
91
|
+
cr,
|
|
92
|
+
onClick
|
|
93
|
+
}) {
|
|
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
|
+
|
|
101
|
+
|
|
102
|
+
const {
|
|
103
|
+
changeRequest: activeCR
|
|
104
|
+
} = (0, _react.useContext)(_ChangeRequestContext.ChangeRequestContext);
|
|
105
|
+
const selectedMenuItem = (0, _react.useRef)(null);
|
|
106
|
+
const isActive = activeCR && cr.id === (activeCR === null || activeCR === void 0 ? void 0 : activeCR.id) ? true : false;
|
|
107
|
+
(0, _react.useEffect)(() => {
|
|
108
|
+
var _a, _b;
|
|
109
|
+
|
|
110
|
+
(_b = (_a = selectedMenuItem.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView) === null || _b === void 0 ? void 0 : _b.call(_a, {
|
|
111
|
+
block: 'nearest'
|
|
112
|
+
});
|
|
113
|
+
}, [isActive]);
|
|
114
|
+
const handleClick = (0, _react.useCallback)(() => {
|
|
115
|
+
return onClick === null || onClick === void 0 ? void 0 : onClick(cr.id);
|
|
116
|
+
}, [onClick, cr.id]);
|
|
117
|
+
return (0, _react2.jsx)(_core.MenuItem, {
|
|
118
|
+
key: cr.id,
|
|
119
|
+
elementRef: isActive ? selectedMenuItem : undefined,
|
|
120
|
+
selected: isActive,
|
|
121
|
+
active: isActive,
|
|
122
|
+
text: (0, _util.maybeEllipsizeString)(((_a = cr.justification) === null || _a === void 0 ? void 0 : _a.trim()) || cr.id, 120),
|
|
123
|
+
htmlTitle: cr.justification,
|
|
124
|
+
disabled: !onClick,
|
|
125
|
+
onClick: onClick ? handleClick : undefined
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const Proposals = function ({
|
|
130
|
+
register,
|
|
131
|
+
actionableProposals,
|
|
132
|
+
onCreate,
|
|
133
|
+
createMode,
|
|
134
|
+
onSelectProposal,
|
|
135
|
+
onRefreshProposals,
|
|
136
|
+
className
|
|
137
|
+
}) {
|
|
138
|
+
//const [creating, setCreating] = useState(false);
|
|
139
|
+
const hasActionable = actionableProposals && actionableProposals.find(p => p[1] && p[1].length > 0);
|
|
140
|
+
const proposalMenuItems = (0, _react.useMemo)(() => {
|
|
141
|
+
return hasActionable ? (0, _react2.jsx)(ActionableProposalItems, {
|
|
142
|
+
actionableProposals: actionableProposals !== null && actionableProposals !== void 0 ? actionableProposals : [],
|
|
143
|
+
onSelect: onSelectProposal
|
|
144
|
+
}) : null;
|
|
145
|
+
}, [onSelectProposal, hasActionable, actionableProposals]); // return <Menu css={css`overflow-y: auto; background: none !important`} className={className}>
|
|
146
|
+
// {proposalMenuItems}
|
|
147
|
+
// </Menu>
|
|
148
|
+
|
|
149
|
+
const stack = (0, _react.useMemo)(() => {
|
|
150
|
+
const stack = [];
|
|
151
|
+
const proposalMenu = proposalMenuItems ? (0, _react2.jsx)(_core.Menu, {
|
|
152
|
+
css: (0, _react2.css)`overflow-y: auto; background: none !important;`
|
|
153
|
+
}, proposalMenuItems) : null;
|
|
154
|
+
|
|
155
|
+
if (proposalMenu) {
|
|
156
|
+
stack.push({
|
|
157
|
+
title: createMode ? "Proposals" : (0, _react2.jsx)(_react.default.Fragment, null, "Proposals", hasActionable ? (0, _react2.jsx)(_react.default.Fragment, null, "\u00A0", (0, _react2.jsx)(_core.Button, {
|
|
158
|
+
minimal: true,
|
|
159
|
+
small: true,
|
|
160
|
+
onClick: onRefreshProposals,
|
|
161
|
+
disabled: !onRefreshProposals,
|
|
162
|
+
icon: "refresh"
|
|
163
|
+
})) : null),
|
|
164
|
+
renderPanel: () => proposalMenu
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (createMode) {
|
|
169
|
+
stack.push({
|
|
170
|
+
title: "Start proposal",
|
|
171
|
+
renderPanel: () => (0, _react2.jsx)(NewProposal, {
|
|
172
|
+
onCreateBlank: onCreate,
|
|
173
|
+
register: register,
|
|
174
|
+
css: (0, _react2.css)`padding: 5px;`
|
|
175
|
+
})
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return stack;
|
|
180
|
+
}, [onCreate, createMode, onRefreshProposals, register, proposalMenuItems]);
|
|
181
|
+
return (0, _react2.jsx)(_core.PanelStack2, {
|
|
182
|
+
css: (0, _react2.css)`flex: 1; .bp4-panel-stack-view { background: none; }`,
|
|
183
|
+
className: className,
|
|
184
|
+
onClose: () => onCreate === null || onCreate === void 0 ? void 0 : onCreate(false),
|
|
185
|
+
stack: stack.length > 0 ? stack : [{
|
|
186
|
+
title: '',
|
|
187
|
+
renderPanel: () => (0, _react2.jsx)(_core.NonIdealState, {
|
|
188
|
+
title: "Nothing to show"
|
|
189
|
+
})
|
|
190
|
+
}]
|
|
191
|
+
});
|
|
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
|
+
|
|
295
|
+
|
|
296
|
+
exports.Proposals = Proposals;
|
|
@@ -0,0 +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 { 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 \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"]}
|