@riboseinc/paneron-registry-kit 2.2.9 → 2.2.11

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 (63) hide show
  1. package/index.js +18 -0
  2. package/index.js.map +1 -1
  3. package/package.json +2 -2
  4. package/types/cr.d.ts +18 -0
  5. package/types/cr.js +37 -1
  6. package/types/cr.js.map +1 -1
  7. package/types/item.d.ts +1 -1
  8. package/types/item.js.map +1 -1
  9. package/types/register.js +1 -2
  10. package/types/register.js.map +1 -1
  11. package/types/stakeholder.d.ts +3 -1
  12. package/types/stakeholder.js +20 -0
  13. package/types/stakeholder.js.map +1 -1
  14. package/views/AnnotatedChange.js +7 -5
  15. package/views/AnnotatedChange.js.map +1 -1
  16. package/views/GenericRelatedItemView.js +4 -47
  17. package/views/GenericRelatedItemView.js.map +1 -1
  18. package/views/ItemDrawer.d.ts +11 -0
  19. package/views/ItemDrawer.js +69 -0
  20. package/views/ItemDrawer.js.map +1 -0
  21. package/views/change-request/ChangeRequestContext.d.ts +17 -1
  22. package/views/change-request/ChangeRequestContext.js +29 -5
  23. package/views/change-request/ChangeRequestContext.js.map +1 -1
  24. package/views/change-request/Proposals.d.ts +2 -0
  25. package/views/change-request/Proposals.js +116 -80
  26. package/views/change-request/Proposals.js.map +1 -1
  27. package/views/change-request/Summary.d.ts +12 -0
  28. package/views/change-request/Summary.js +59 -0
  29. package/views/change-request/Summary.js.map +1 -0
  30. package/views/change-request/TransitionHistory.d.ts +30 -0
  31. package/views/change-request/TransitionHistory.js +307 -0
  32. package/views/change-request/TransitionHistory.js.map +1 -0
  33. package/views/change-request/TransitionOptions.d.ts +38 -0
  34. package/views/{detail/ChangeRequest/transitions.js → change-request/TransitionOptions.js} +61 -51
  35. package/views/change-request/TransitionOptions.js.map +1 -0
  36. package/views/change-request/objectChangeset.d.ts +1 -1
  37. package/views/change-request/objectChangeset.js +1 -1
  38. package/views/change-request/objectChangeset.js.map +1 -1
  39. package/views/detail/ChangeRequest/index.js +129 -142
  40. package/views/detail/ChangeRequest/index.js.map +1 -1
  41. package/views/detail/RegisterHome/MetaSummary.d.ts +9 -0
  42. package/views/detail/RegisterHome/MetaSummary.js +35 -0
  43. package/views/detail/RegisterHome/MetaSummary.js.map +1 -0
  44. package/views/detail/RegisterHome/Proposal.d.ts +24 -0
  45. package/views/detail/RegisterHome/Proposal.js +228 -0
  46. package/views/detail/RegisterHome/Proposal.js.map +1 -0
  47. package/views/detail/RegisterHome/index.js +427 -137
  48. package/views/detail/RegisterHome/index.js.map +1 -1
  49. package/views/detail/RegisterItem/index.d.ts +2 -3
  50. package/views/detail/RegisterItem/index.js +239 -140
  51. package/views/detail/RegisterItem/index.js.map +1 -1
  52. package/views/detail/RegisterMeta/RegisterMetaForm.js +37 -45
  53. package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
  54. package/views/detail/RegisterMeta/index.js +14 -11
  55. package/views/detail/RegisterMeta/index.js.map +1 -1
  56. package/views/diffing/InlineDiff.d.ts +27 -1
  57. package/views/diffing/InlineDiff.js +113 -2
  58. package/views/diffing/InlineDiff.js.map +1 -1
  59. package/views/util.d.ts +36 -2
  60. package/views/util.js +203 -2
  61. package/views/util.js.map +1 -1
  62. package/views/detail/ChangeRequest/transitions.d.ts +0 -28
  63. package/views/detail/ChangeRequest/transitions.js.map +0 -1
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Proposals = exports.NewProposal = exports.CurrentProposal = 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 _DL = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/DL"));
15
+
16
+ var _ChangeRequestContext = require("../../change-request/ChangeRequestContext");
17
+
18
+ var _util = require("../../util");
19
+
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
+ 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
+
30
+ 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; }
31
+
32
+ /** @jsx jsx */
33
+
34
+ /** @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
+ const NewProposal = function ({
65
+ register,
66
+ onCreateBlank,
67
+ className
68
+ }) {
69
+ var _a, _b;
70
+
71
+ const [newProposalIdea, setNewProposalIdea] = (0, _react.useState)('');
72
+ const handleNewProposal = (0, _react.useCallback)(async function handleNewProposal() {
73
+ if (newProposalIdea.trim()) {
74
+ await (onCreateBlank === null || onCreateBlank === void 0 ? void 0 : onCreateBlank(newProposalIdea));
75
+ setNewProposalIdea('');
76
+ } else {
77
+ throw new Error("Cannot create proposal: need some initial motivation for the change");
78
+ }
79
+ }, [newProposalIdea, onCreateBlank]);
80
+ return (0, _react2.jsx)(_core.FormGroup, {
81
+ className: className,
82
+ css: (0, _react2.css)`overflow-y: auto;`,
83
+ 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)', ":")
84
+ }, (0, _react2.jsx)(_core.ControlGroup, {
85
+ vertical: true
86
+ }, (0, _react2.jsx)(_core.TextArea, {
87
+ value: newProposalIdea !== null && newProposalIdea !== void 0 ? newProposalIdea : '',
88
+ placeholder: "Your idea\u2026",
89
+ title: "Justification draft (you can change this later)",
90
+ onChange: evt => setNewProposalIdea(evt.currentTarget.value)
91
+ }), (0, _react2.jsx)(_core.Button, {
92
+ fill: true,
93
+ intent: newProposalIdea ? 'primary' : undefined,
94
+ disabled: !newProposalIdea.trim() || !onCreateBlank,
95
+ title: "A blank proposal will be created and opened in a new tab.",
96
+ onClick: handleNewProposal,
97
+ icon: "tick"
98
+ }, "Create")));
99
+ };
100
+ /**
101
+ * A list of menu items for given actionable proposals,
102
+ * grouped by label.
103
+ */
104
+
105
+
106
+ exports.NewProposal = NewProposal;
107
+
108
+ const ActionableProposalItems = function ActionableProposalItems({
109
+ actionableProposals,
110
+ onSelect
111
+ }) {
112
+ 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, {
113
+ key: idx
114
+ }, (0, _react2.jsx)(_core.MenuDivider, {
115
+ title: groupLabel
116
+ }), proposals !== undefined && proposals.length > 0 ? proposals.map(cr => (0, _react2.jsx)(ActionableProposalItem, {
117
+ cr: cr,
118
+ onClick: onSelect
119
+ })) : proposals === undefined ? (0, _react2.jsx)(_core.MenuItem, {
120
+ disabled: true,
121
+ text: "Loading\u2026",
122
+ icon: (0, _react2.jsx)(_core.Spinner, null)
123
+ }) : (0, _react2.jsx)(_core.MenuItem, {
124
+ disabled: true,
125
+ text: "No pending proposals",
126
+ icon: "clean"
127
+ }))));
128
+ };
129
+
130
+ const ActionableProposalItem = function ({
131
+ cr,
132
+ onClick
133
+ }) {
134
+ var _a;
135
+
136
+ const {
137
+ changeRequest: activeCR
138
+ } = (0, _react.useContext)(_ChangeRequestContext.ChangeRequestContext);
139
+ const selectedMenuItem = (0, _react.useRef)(null);
140
+ const isActive = activeCR && cr.id === (activeCR === null || activeCR === void 0 ? void 0 : activeCR.id) ? true : false;
141
+ (0, _react.useEffect)(() => {
142
+ var _a, _b;
143
+
144
+ (_b = (_a = selectedMenuItem.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView) === null || _b === void 0 ? void 0 : _b.call(_a, {
145
+ block: 'nearest'
146
+ });
147
+ }, [isActive]);
148
+ const handleClick = (0, _react.useCallback)(() => {
149
+ return onClick === null || onClick === void 0 ? void 0 : onClick(cr.id);
150
+ }, [onClick, cr.id]);
151
+ return (0, _react2.jsx)(_core.MenuItem, {
152
+ key: cr.id,
153
+ elementRef: isActive ? selectedMenuItem : undefined,
154
+ selected: isActive,
155
+ active: isActive,
156
+ text: (0, _util.maybeEllipsizeString)(((_a = cr.justification) === null || _a === void 0 ? void 0 : _a.trim()) || cr.id, 120),
157
+ htmlTitle: cr.justification,
158
+ disabled: !onClick,
159
+ onClick: onClick ? handleClick : undefined
160
+ });
161
+ };
162
+
163
+ const Proposals = function ({
164
+ register,
165
+ actionableProposals,
166
+ onCreate,
167
+ createMode,
168
+ onSelectProposal,
169
+ onRefreshProposals,
170
+ className
171
+ }) {
172
+ //const [creating, setCreating] = useState(false);
173
+ const hasActionable = actionableProposals && actionableProposals.find(p => p[1] && p[1].length > 0);
174
+ const proposalMenuItems = (0, _react.useMemo)(() => {
175
+ return hasActionable ? (0, _react2.jsx)(ActionableProposalItems, {
176
+ actionableProposals: actionableProposals !== null && actionableProposals !== void 0 ? actionableProposals : [],
177
+ onSelect: onSelectProposal
178
+ }) : 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}>
180
+ // {proposalMenuItems}
181
+ // </Menu>
182
+
183
+ const stack = (0, _react.useMemo)(() => {
184
+ const stack = [];
185
+ const proposalMenu = proposalMenuItems ? (0, _react2.jsx)(_core.Menu, {
186
+ css: (0, _react2.css)`overflow-y: auto; background: none !important;`
187
+ }, proposalMenuItems) : null;
188
+
189
+ if (proposalMenu) {
190
+ stack.push({
191
+ 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, {
192
+ minimal: true,
193
+ small: true,
194
+ onClick: onRefreshProposals,
195
+ disabled: !onRefreshProposals,
196
+ icon: "refresh"
197
+ })) : null),
198
+ renderPanel: () => proposalMenu
199
+ });
200
+ }
201
+
202
+ if (createMode) {
203
+ stack.push({
204
+ title: "Start proposal",
205
+ renderPanel: () => (0, _react2.jsx)(NewProposal, {
206
+ onCreateBlank: onCreate,
207
+ register: register,
208
+ css: (0, _react2.css)`padding: 5px;`
209
+ })
210
+ });
211
+ }
212
+
213
+ return stack;
214
+ }, [onCreate, createMode, onRefreshProposals, register, proposalMenuItems]);
215
+ return (0, _react2.jsx)(_core.PanelStack2, {
216
+ css: (0, _react2.css)`flex: 1; .bp4-panel-stack-view { background: none; }`,
217
+ className: className,
218
+ onClose: () => onCreate === null || onCreate === void 0 ? void 0 : onCreate(false),
219
+ stack: stack.length > 0 ? stack : [{
220
+ title: '',
221
+ renderPanel: () => (0, _react2.jsx)(_core.NonIdealState, {
222
+ title: "Nothing to show"
223
+ })
224
+ }]
225
+ });
226
+ };
227
+
228
+ 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 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"]}