@riboseinc/paneron-registry-kit 2.2.35 → 2.2.37

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 (42) hide show
  1. package/package.json +2 -2
  2. package/proposals/ListItem.d.ts +1 -0
  3. package/proposals/ListItem.js +4 -1
  4. package/proposals/ListItem.js.map +1 -1
  5. package/proposals/MetaProperties.d.ts +4 -3
  6. package/proposals/MetaProperties.js +26 -19
  7. package/proposals/MetaProperties.js.map +1 -1
  8. package/proposals/ProposalBrowser.d.ts +8 -1
  9. package/proposals/ProposalBrowser.js +2 -1
  10. package/proposals/ProposalBrowser.js.map +1 -1
  11. package/proposals/ProposalTab.d.ts +2 -0
  12. package/proposals/ProposalTab.js +13 -1
  13. package/proposals/ProposalTab.js.map +1 -1
  14. package/proposals/ProposalWorkspace.d.ts +3 -1
  15. package/proposals/ProposalWorkspace.js +9 -7
  16. package/proposals/ProposalWorkspace.js.map +1 -1
  17. package/proposals/TransitionHistory.js +10 -4
  18. package/proposals/TransitionHistory.js.map +1 -1
  19. package/proposals/actionableGroups/Tree.js +15 -0
  20. package/proposals/actionableGroups/Tree.js.map +1 -1
  21. package/proposals/actionableGroups/treeNodes.js +9 -5
  22. package/proposals/actionableGroups/treeNodes.js.map +1 -1
  23. package/proposals/types.d.ts +1 -0
  24. package/proposals/types.js +5 -0
  25. package/proposals/types.js.map +1 -1
  26. package/views/detail/AllItems.d.ts +8 -0
  27. package/views/detail/AllItems.js +45 -0
  28. package/views/detail/AllItems.js.map +1 -0
  29. package/views/detail/ProposalWork.js +3 -1
  30. package/views/detail/ProposalWork.js.map +1 -1
  31. package/views/detail/RegisterHome/ActiveProposalDetails.js +6 -1
  32. package/views/detail/RegisterHome/ActiveProposalDetails.js.map +1 -1
  33. package/views/detail/RegisterHome2/index.js +11 -2
  34. package/views/detail/RegisterHome2/index.js.map +1 -1
  35. package/views/sidebar/Search/index.d.ts +2 -0
  36. package/views/sidebar/Search/index.js +14 -2
  37. package/views/sidebar/Search/index.js.map +1 -1
  38. package/views/sidebar/index.js +9 -3
  39. package/views/sidebar/index.js.map +1 -1
  40. package/views/util.d.ts +8 -0
  41. package/views/util.js +10 -3
  42. package/views/util.js.map +1 -1
@@ -13,6 +13,8 @@ var _DL = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widge
13
13
 
14
14
  var _MetaProperties = _interopRequireDefault(require("../../../proposals/MetaProperties"));
15
15
 
16
+ var _types = require("../../../proposals/types");
17
+
16
18
  var _TransitionOptions = _interopRequireWildcard(require("../../../proposals/TransitionOptions"));
17
19
 
18
20
  var _TransitionHistory = _interopRequireWildcard(require("../../../proposals/TransitionHistory"));
@@ -87,7 +89,10 @@ const CurrentProposal = function ({
87
89
  register,
88
90
  proposal
89
91
  }) {
92
+ var _a;
93
+
90
94
  const transitions = stakeholder ? (0, _TransitionOptions.getTransitions)(proposal, stakeholder) : [];
95
+ const crStakeholder = ((_a = register === null || register === void 0 ? void 0 : register.stakeholders) !== null && _a !== void 0 ? _a : []).find(s => (0, _types.isCreatedBy)(s, proposal));
91
96
  return (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_DL.default, {
92
97
  css: (0, _react2.css)`padding: 10px 12px 10px 12px; flex-grow: 1; flex-basis: max-content;`
93
98
  }, (0, _react2.jsx)("div", null, (0, _react2.jsx)("dt", null, "Viewing\u00A0proposal:"), (0, _react2.jsx)("dd", {
@@ -95,7 +100,7 @@ const CurrentProposal = function ({
95
100
  }, "\u201C", proposal.justification.trim() || '(justification N/A)', "\u201D")), (0, _react2.jsx)(_MetaProperties.default, {
96
101
  cr: proposal,
97
102
  currentStakeholder: stakeholder,
98
- registerMetadata: register
103
+ submittingStakeholder: crStakeholder
99
104
  })), (0, _react2.jsx)("div", {
100
105
  css: (0, _react2.css)`overflow-y: auto; flex-basis: min-content;`
101
106
  }, (0, _react2.jsx)(_TransitionHistory.default, {
@@ -1 +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 MetaProperties from '../../../proposals/MetaProperties';\nimport type { Register, RegisterStakeholder } from '../../../types';\nimport { type SomeCR as CR } from '../../../proposals/types';\nimport TransitionOptions, { isFinalState, getTransitions, canBeTransitionedBy } from '../../../proposals/TransitionOptions';\nimport TransitionsAndStatus, { getTransitionHistory } from '../../../proposals/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 : [];\n\n if (canDelete) {\n actions.push({\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 <MetaProperties\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"]}
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 MetaProperties from '../../../proposals/MetaProperties';\nimport type { Register, RegisterStakeholder } from '../../../types';\nimport { type SomeCR as CR, isCreatedBy } from '../../../proposals/types';\nimport TransitionOptions, { isFinalState, getTransitions, canBeTransitionedBy } from '../../../proposals/TransitionOptions';\nimport TransitionsAndStatus, { getTransitionHistory } from '../../../proposals/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 : [];\n\n if (canDelete) {\n actions.push({\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 const crStakeholder = (register?.stakeholders ?? []).\n find(s => isCreatedBy(s, proposal));\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 <MetaProperties\n cr={proposal}\n currentStakeholder={stakeholder}\n submittingStakeholder={crStakeholder}\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"]}
@@ -31,7 +31,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
31
31
 
32
32
  /** @jsxFrag React.Fragment */
33
33
  const RegisterHome2 = function () {
34
- var _a;
34
+ var _a, _b;
35
35
 
36
36
  const {
37
37
  registerMetadata
@@ -50,7 +50,16 @@ const RegisterHome2 = function () {
50
50
  css: (0, _react2.css)`flex: 1;`,
51
51
  //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}
52
52
  availableClassIDs: [],
53
- stateName: "item-search-global"
53
+ stateName: "item-search-global",
54
+ initialView: (0, _react2.jsx)("div", {
55
+ dangerouslySetInnerHTML: {
56
+ __html: (_b = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.contentSummary) !== null && _b !== void 0 ? _b : "There is no content summary of this registry yet."
57
+ }
58
+ }),
59
+ zeroResultsView: (0, _react2.jsx)(_core.NonIdealState, {
60
+ icon: "clean",
61
+ title: "No results matching query"
62
+ })
54
63
  })));
55
64
  };
56
65
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome2/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAE1G,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,aAAa,GAAsD;;IACvE,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACxD,OAAO,CACL,IAAC,qBAAqB,IAAC,KAAK,EAAE;2BAAc,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,mCAAI,eAAe,CAAI;QACvF,IAAC,IAAI,IAAC,GAAG,EAAE,GAAG,CAAA,qIAAqI;YACjJ;gBACE,IAAC,MAAM,IACH,GAAG,EAAE,GAAG,CAAA,0BAA0B,EAClC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,oCAE3C;8CAGP;YACJ,IAAC,MAAM,IACL,GAAG,EAAE,GAAG,CAAA,UAAU;gBAClB,iFAAiF;gBACjF,iBAAiB,EAAE,EAAE,EACrB,SAAS,EAAC,oBAAoB,GAE9B,CACG,CACe,CACzB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Button, Card } from '@blueprintjs/core';\n\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\n\nimport { TabContentsWithHeader } from '../../util';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport Search from '../../sidebar/Search';\nimport { Protocols } from '../../protocolRegistry';\n\n\nconst RegisterHome2: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { registerMetadata } = useContext(BrowserCtx);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n return (\n <TabContentsWithHeader title={<>Welcome to {registerMetadata?.name ?? 'this register'}</>}>\n <Card css={css`flex: 1; box-shadow: none !important; position: absolute; border-radius: 0; display: flex; flex-flow: column nowrap; padding: 10px;`}>\n <p>\n <Button\n css={css`vertical-align: baseline`}\n onClick={() => spawnTab(Protocols.REGISTER_META)}>\n Learn more about the register\n </Button>\n &ensp;\n or search all items:\n </p>\n <Search\n css={css`flex: 1;`}\n //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}\n availableClassIDs={[]}\n stateName=\"item-search-global\"\n //onOpenItem={onChooseItem ? handleOpenItem : undefined}\n />\n </Card>\n </TabContentsWithHeader>\n );\n};\n\nexport default RegisterHome2;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome2/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAE1G,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,aAAa,GAAsD;;IACvE,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACxD,OAAO,CACL,IAAC,qBAAqB,IAAC,KAAK,EAAE;2BAAc,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,mCAAI,eAAe,CAAI;QACvF,IAAC,IAAI,IAAC,GAAG,EAAE,GAAG,CAAA,qIAAqI;YACjJ;gBACE,IAAC,MAAM,IACH,GAAG,EAAE,GAAG,CAAA,0BAA0B,EAClC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,oCAE3C;8CAGP;YACJ,IAAC,MAAM,IACL,GAAG,EAAE,GAAG,CAAA,UAAU;gBAClB,iFAAiF;gBACjF,iBAAiB,EAAE,EAAE,EACrB,SAAS,EAAC,oBAAoB,EAC9B,WAAW,EAAE,aAAK,uBAAuB,EAAE,EAAE,MAAM,EACjD,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,cAAc,mCAC7B,mDAAmD;qBACvD,GAAI,EACL,eAAe,EAAE,IAAC,aAAa,IAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,2BAA2B,GAAG,GAEjF,CACG,CACe,CACzB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { NonIdealState, Button, Card } from '@blueprintjs/core';\n\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\n\nimport { TabContentsWithHeader } from '../../util';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport Search from '../../sidebar/Search';\nimport { Protocols } from '../../protocolRegistry';\n\n\nconst RegisterHome2: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { registerMetadata } = useContext(BrowserCtx);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n return (\n <TabContentsWithHeader title={<>Welcome to {registerMetadata?.name ?? 'this register'}</>}>\n <Card css={css`flex: 1; box-shadow: none !important; position: absolute; border-radius: 0; display: flex; flex-flow: column nowrap; padding: 10px;`}>\n <p>\n <Button\n css={css`vertical-align: baseline`}\n onClick={() => spawnTab(Protocols.REGISTER_META)}>\n Learn more about the register\n </Button>\n &ensp;\n or search all items:\n </p>\n <Search\n css={css`flex: 1;`}\n //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}\n availableClassIDs={[]}\n stateName=\"item-search-global\"\n initialView={<div dangerouslySetInnerHTML={{ __html:\n registerMetadata?.contentSummary\n ?? \"There is no content summary of this registry yet.\"\n }} />}\n zeroResultsView={<NonIdealState icon=\"clean\" title=\"No results matching query\" />}\n //onOpenItem={onChooseItem ? handleOpenItem : undefined}\n />\n </Card>\n </TabContentsWithHeader>\n );\n};\n\nexport default RegisterHome2;\n"]}
@@ -12,6 +12,8 @@ declare const Search: React.FC<{
12
12
  implicitCriteria?: CriteriaGroup;
13
13
  availableClassIDs?: string[];
14
14
  onOpenItem?: (itemPath: string) => void;
15
+ zeroResultsView?: JSX.Element;
16
+ initialView?: JSX.Element;
15
17
  stateName?: string;
16
18
  List?: ReturnType<typeof makeSearchResultList>;
17
19
  extraData?: Record<string, any>;
@@ -11,6 +11,8 @@ var _react2 = require("@emotion/react");
11
11
 
12
12
  var _context = require("@riboseinc/paneron-extension-kit/context");
13
13
 
14
+ var _util = require("@riboseinc/paneron-extension-kit/util");
15
+
14
16
  var _SearchResultList = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/SearchResultList"));
15
17
 
16
18
  var _useDebounce = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/useDebounce"));
@@ -52,6 +54,10 @@ const initialState = {
52
54
  selectedItemPath: null
53
55
  };
54
56
 
57
+ function isInitialState(state) {
58
+ return (0, _util.toJSONNormalized)(state) === (0, _util.toJSONNormalized)(initialState);
59
+ }
60
+
55
61
  function reducer(prevState, action) {
56
62
  switch (action.type) {
57
63
  case 'update-query':
@@ -76,6 +82,8 @@ function reducer(prevState, action) {
76
82
 
77
83
  const Search = (0, _react.memo)(function ({
78
84
  implicitCriteria,
85
+ initialView,
86
+ zeroResultsView,
79
87
  availableClassIDs,
80
88
  stateName,
81
89
  onOpenItem,
@@ -155,6 +163,9 @@ const Search = (0, _react.memo)(function ({
155
163
  }), [dispatch]);
156
164
  const defaultHandleOpenItem = (0, _react.useCallback)(itemPath => jumpTo === null || jumpTo === void 0 ? void 0 : jumpTo(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${itemPath}`), [jumpTo]);
157
165
  const handleOpenItem = onOpenItem !== null && onOpenItem !== void 0 ? onOpenItem : defaultHandleOpenItem;
166
+ const showInitialScreen = initialView && isInitialState({ ...state,
167
+ selectedItemPath: null
168
+ });
158
169
  return (0, _react2.jsx)("div", {
159
170
  css: (0, _react2.css)`display: flex; flex-flow: column nowrap;`,
160
171
  className: className,
@@ -180,13 +191,14 @@ const Search = (0, _react.memo)(function ({
180
191
  css: (0, _react2.css)`padding: 2px;`
181
192
  }), (0, _react2.jsx)("div", {
182
193
  css: (0, _react2.css)`flex: 1;`
183
- }, (0, _react2.jsx)(ListComponent, {
194
+ }, showInitialScreen ? initialView : (0, _react2.jsx)(ListComponent, {
184
195
  queryExpression: datasetObjectSearchQueryExpression,
185
196
  keyExpression: keyExpression,
186
197
  selectedItemPath: state.selectedItemPath,
187
198
  onSelectItem: handleSelectItem,
188
199
  onOpenItem: handleOpenItem,
189
- extraItemViewData: extraData
200
+ extraItemViewData: extraData,
201
+ zeroResultsView: zeroResultsView
190
202
  })));
191
203
  });
192
204
  const RegisterItemSearchResultList = (0, _SearchResultList.default)(_ListItem.default, objPath => ({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Search/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useContext, useCallback, useMemo, useEffect } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\nimport makeSearchResultList from '@riboseinc/paneron-extension-kit/widgets/SearchResultList';\nimport useDebounce from '@riboseinc/paneron-extension-kit/useDebounce';\nimport { type CriteriaGroup, isCriteriaGroup, BLANK_CRITERIA } from '../../FilterCriteria/models';\nimport criteriaGroupToQueryExpression from '../../FilterCriteria/criteriaGroupToQueryExpression';\nimport { RAW_SUBSTRING, CUSTOM_CONDITION } from '../../FilterCriteria/CRITERIA_CONFIGURATION';\nimport { ChangeRequestContext } from '../../../proposals/ChangeRequestContext';\nimport type { RegisterItem } from '../../../types';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { getRegisterItemQuery } from '../../itemQueryUtils';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport SearchQuery from '../../SearchQuery';\nimport ListItem from '../ListItem';\nimport { Protocols } from '../../protocolRegistry';\n\n\n// TODO: Move Search widget core out of sidebar, as it’s used elsewhere too.\n\n\ninterface Query {\n criteria: CriteriaGroup;\n}\ninterface State {\n query: Query;\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\nfunction isState(val: any): val is State {\n return val\n && val.query\n && val.query.criteria\n && isCriteriaGroup(val.query.criteria)\n && typeof val.quickSubstringQuery === 'string'\n && (val.selectedItemPath === null || typeof val.selectedItemPath === 'string')\n}\ntype Action =\n | { type: 'update-query'; payload: { query: Query; }; }\n | { type: 'update-quick-substring-query'; payload: { substring: string; }; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nconst initialState: State = {\n query: { criteria: BLANK_CRITERIA },\n quickSubstringQuery: '',\n selectedItemPath: null,\n} as const;\n\nfunction reducer(prevState: State, action: Action) {\n switch (action.type) {\n case 'update-query':\n return {\n ...prevState,\n query: action.payload.query,\n };\n case 'update-quick-substring-query':\n return {\n ...prevState,\n quickSubstringQuery: action.payload.substring,\n };\n case 'select-item':\n return {\n ...prevState,\n selectedItemPath: action.payload.itemPath,\n };\n default:\n throw new Error(\"Unexpected search state\");\n }\n}\n\nconst Search: React.FC<{\n /**\n * Criteria that will always apply.\n * Used e.g. in superseding item selection\n * (to limit to the same item class).\n */\n implicitCriteria?: CriteriaGroup,\n\n availableClassIDs?: string[]\n onOpenItem?: (itemPath: string) => void\n\n stateName?: string\n\n List?: ReturnType<typeof makeSearchResultList>,\n extraData?: Record<string, any>,\n\n className?: string\n style?: React.CSSProperties\n}> =\nmemo(function ({ implicitCriteria, availableClassIDs, stateName, onOpenItem, List, extraData, className, style }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n\n const ListComponent = useMemo((() => List ?? RegisterItemSearchResultList), [List]);\n\n const {\n // TODO: defaultSearchCriteria,\n keyExpression,\n getQuickSearchPredicate,\n itemClasses,\n subregisters,\n selectedRegisterItem,\n jumpTo,\n } = useContext(BrowserCtx);\n const { changeRequest } = useContext(ChangeRequestContext);\n\n const [ state, dispatch, stateRecalled ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)(\n stateName ?? 'search-sidebar',\n undefined,\n isState,\n reducer,\n initialState,\n null);\n\n const selectedItemPath = selectedRegisterItem?.ref\n ? itemRefToItemPath(selectedRegisterItem.ref, changeRequest?.id)\n : null;\n\n useEffect(() => {\n if (selectedItemPath) {\n dispatch({ type: 'select-item', payload: { itemPath: selectedItemPath } });\n }\n }, [selectedItemPath, dispatch]);\n\n // Why are we memoing this? It’s just a string and seems not too slow to compute.\n const effectiveQueryExpression: string = useMemo(() => {\n const quickSearchString = (state.quickSubstringQuery ?? '').trim();\n const withSearchString: CriteriaGroup =\n state.query.criteria.criteria.length < 1 && quickSearchString !== ''\n ? {\n require: 'all',\n criteria: [\n getQuickSearchPredicate\n ? {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: getQuickSearchPredicate(quickSearchString) },\n { itemClasses, subregisters },\n ),\n }\n : {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters }),\n },\n ],\n }\n : state.query.criteria;\n const withImplicit: CriteriaGroup = implicitCriteria\n ? {\n require: 'all',\n criteria: [ implicitCriteria, withSearchString ],\n }\n : withSearchString;\n return withImplicit.criteria.length > 0\n ? criteriaGroupToQueryExpression(withImplicit)\n // If no criteria provided, don’t show anything by default.\n : 'false';\n }, [state.query.criteria, state.quickSubstringQuery, itemClasses, subregisters, getQuickSearchPredicate]);\n\n const stateRecalledDebounced = useDebounce(stateRecalled, 100);\n const queryExpressionDebounced = useDebounce(\n effectiveQueryExpression,\n stateRecalledDebounced ? 500 : 0,\n );\n\n const datasetObjectSearchQueryExpression = useMemo((() =>\n queryExpressionDebounced != 'false'\n ? getRegisterItemQuery(queryExpressionDebounced, changeRequest ?? undefined)\n : 'return false'\n ), [queryExpressionDebounced, changeRequest]);\n\n const handleSelectItem = useCallback(\n (itemPath => dispatch({ type: 'select-item', payload: { itemPath }})),\n [dispatch]);\n\n const defaultHandleOpenItem = useCallback(\n (itemPath => jumpTo?.(`${Protocols.ITEM_DETAILS}:${itemPath}`)),\n [jumpTo]);\n const handleOpenItem = onOpenItem ?? defaultHandleOpenItem;\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className} style={style}>\n <SearchQuery\n rootCriteria={state.query.criteria}\n quickSearchString={state.quickSubstringQuery}\n availableClassIDs={availableClassIDs}\n onCriteriaChange={useCallback((\n criteria => dispatch({ type: 'update-query', payload: { query: { criteria } } })\n ), [dispatch])}\n onQuickSearchStringChange={useCallback((\n substring => dispatch({ type: 'update-quick-substring-query', payload: { substring } })\n ), [dispatch])}\n css={css`padding: 2px;`}\n />\n <div css={css`flex: 1;`}>\n <ListComponent\n queryExpression={datasetObjectSearchQueryExpression}\n keyExpression={keyExpression}\n selectedItemPath={state.selectedItemPath}\n onSelectItem={handleSelectItem}\n onOpenItem={handleOpenItem}\n extraItemViewData={extraData as any}\n />\n </div>\n </div>\n );\n});\n\n\nconst RegisterItemSearchResultList = makeSearchResultList<RegisterItem<any>>(ListItem, (objPath) => ({\n name: 'reg. item',\n iconProps: {\n icon: 'document',\n title: objPath,\n htmlTitle: `Icon for item at ${objPath}`,\n },\n}));\n\n\nexport default Search;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Search/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useContext, useCallback, useMemo, useEffect } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { toJSONNormalized } from '@riboseinc/paneron-extension-kit/util';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\nimport makeSearchResultList from '@riboseinc/paneron-extension-kit/widgets/SearchResultList';\nimport useDebounce from '@riboseinc/paneron-extension-kit/useDebounce';\nimport { type CriteriaGroup, isCriteriaGroup, BLANK_CRITERIA } from '../../FilterCriteria/models';\nimport criteriaGroupToQueryExpression from '../../FilterCriteria/criteriaGroupToQueryExpression';\nimport { RAW_SUBSTRING, CUSTOM_CONDITION } from '../../FilterCriteria/CRITERIA_CONFIGURATION';\nimport { ChangeRequestContext } from '../../../proposals/ChangeRequestContext';\nimport type { RegisterItem } from '../../../types';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { getRegisterItemQuery } from '../../itemQueryUtils';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport SearchQuery from '../../SearchQuery';\nimport ListItem from '../ListItem';\nimport { Protocols } from '../../protocolRegistry';\n\n\n// TODO: Move Search widget core out of sidebar, as it’s used elsewhere too.\n\n\ninterface Query {\n criteria: CriteriaGroup;\n}\ninterface State {\n query: Query;\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\nfunction isState(val: any): val is State {\n return val\n && val.query\n && val.query.criteria\n && isCriteriaGroup(val.query.criteria)\n && typeof val.quickSubstringQuery === 'string'\n && (val.selectedItemPath === null || typeof val.selectedItemPath === 'string')\n}\ntype Action =\n | { type: 'update-query'; payload: { query: Query; }; }\n | { type: 'update-quick-substring-query'; payload: { substring: string; }; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nconst initialState: State = {\n query: { criteria: BLANK_CRITERIA },\n quickSubstringQuery: '',\n selectedItemPath: null,\n} as const;\n\nfunction isInitialState(state: State): boolean {\n return toJSONNormalized(state) === toJSONNormalized(initialState);\n}\n\nfunction reducer(prevState: State, action: Action) {\n switch (action.type) {\n case 'update-query':\n return {\n ...prevState,\n query: action.payload.query,\n };\n case 'update-quick-substring-query':\n return {\n ...prevState,\n quickSubstringQuery: action.payload.substring,\n };\n case 'select-item':\n return {\n ...prevState,\n selectedItemPath: action.payload.itemPath,\n };\n default:\n throw new Error(\"Unexpected search state\");\n }\n}\n\nconst Search: React.FC<{\n /**\n * Criteria that will always apply.\n * Used e.g. in superseding item selection\n * (to limit to the same item class).\n */\n implicitCriteria?: CriteriaGroup,\n\n availableClassIDs?: string[]\n onOpenItem?: (itemPath: string) => void\n\n zeroResultsView?: JSX.Element\n initialView?: JSX.Element\n\n stateName?: string\n\n List?: ReturnType<typeof makeSearchResultList>\n extraData?: Record<string, any>\n\n className?: string\n style?: React.CSSProperties\n}> =\nmemo(function ({ implicitCriteria, initialView, zeroResultsView, availableClassIDs, stateName, onOpenItem, List, extraData, className, style }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n\n const ListComponent = useMemo((() => List ?? RegisterItemSearchResultList), [List]);\n\n const {\n // TODO: defaultSearchCriteria,\n keyExpression,\n getQuickSearchPredicate,\n itemClasses,\n subregisters,\n selectedRegisterItem,\n jumpTo,\n } = useContext(BrowserCtx);\n const { changeRequest } = useContext(ChangeRequestContext);\n\n const [ state, dispatch, stateRecalled ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)( stateName ?? 'search-sidebar',\n undefined,\n isState,\n reducer,\n initialState,\n null);\n\n const selectedItemPath = selectedRegisterItem?.ref\n ? itemRefToItemPath(selectedRegisterItem.ref, changeRequest?.id)\n : null;\n\n useEffect(() => {\n if (selectedItemPath) {\n dispatch({ type: 'select-item', payload: { itemPath: selectedItemPath } });\n }\n }, [selectedItemPath, dispatch]);\n\n // Why are we memoing this? It’s just a string and seems not too slow to compute.\n const effectiveQueryExpression: string = useMemo(() => {\n const quickSearchString = (state.quickSubstringQuery ?? '').trim();\n const withSearchString: CriteriaGroup =\n state.query.criteria.criteria.length < 1 && quickSearchString !== ''\n ? {\n require: 'all',\n criteria: [\n getQuickSearchPredicate\n ? {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: getQuickSearchPredicate(quickSearchString) },\n { itemClasses, subregisters },\n ),\n }\n : {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters }),\n },\n ],\n }\n : state.query.criteria;\n const withImplicit: CriteriaGroup = implicitCriteria\n ? {\n require: 'all',\n criteria: [ implicitCriteria, withSearchString ],\n }\n : withSearchString;\n return withImplicit.criteria.length > 0\n ? criteriaGroupToQueryExpression(withImplicit)\n // If no criteria provided, don’t show anything by default.\n : 'false';\n }, [state.query.criteria, state.quickSubstringQuery, itemClasses, subregisters, getQuickSearchPredicate]);\n\n const stateRecalledDebounced = useDebounce(stateRecalled, 100);\n const queryExpressionDebounced = useDebounce(\n effectiveQueryExpression,\n stateRecalledDebounced ? 500 : 0,\n );\n\n const datasetObjectSearchQueryExpression = useMemo((() =>\n queryExpressionDebounced != 'false'\n ? getRegisterItemQuery(queryExpressionDebounced, changeRequest ?? undefined)\n : 'return false'\n ), [queryExpressionDebounced, changeRequest]);\n\n const handleSelectItem = useCallback(\n (itemPath => dispatch({ type: 'select-item', payload: { itemPath }})),\n [dispatch]);\n\n const defaultHandleOpenItem = useCallback(\n (itemPath => jumpTo?.(`${Protocols.ITEM_DETAILS}:${itemPath}`)),\n [jumpTo]);\n const handleOpenItem = onOpenItem ?? defaultHandleOpenItem;\n\n const showInitialScreen = initialView && isInitialState({ ...state, selectedItemPath: null });\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className} style={style}>\n <SearchQuery\n rootCriteria={state.query.criteria}\n quickSearchString={state.quickSubstringQuery}\n availableClassIDs={availableClassIDs}\n onCriteriaChange={useCallback((\n criteria => dispatch({ type: 'update-query', payload: { query: { criteria } } })\n ), [dispatch])}\n onQuickSearchStringChange={useCallback((\n substring => dispatch({ type: 'update-quick-substring-query', payload: { substring } })\n ), [dispatch])}\n css={css`padding: 2px;`}\n />\n <div css={css`flex: 1;`}>\n {showInitialScreen\n ? initialView\n : <ListComponent\n queryExpression={datasetObjectSearchQueryExpression}\n keyExpression={keyExpression}\n selectedItemPath={state.selectedItemPath}\n onSelectItem={handleSelectItem}\n onOpenItem={handleOpenItem}\n extraItemViewData={extraData as any}\n zeroResultsView={zeroResultsView}\n />}\n </div>\n </div>\n );\n});\n\n\nconst RegisterItemSearchResultList = makeSearchResultList<RegisterItem<any>>(ListItem, (objPath) => ({\n name: 'reg. item',\n iconProps: {\n icon: 'document',\n title: objPath,\n htmlTitle: `Icon for item at ${objPath}`,\n },\n}));\n\n\nexport default Search;\n"]}
@@ -114,17 +114,23 @@ exports.sidebarConfig = sidebarConfig;
114
114
 
115
115
  const ProposalsBlockTitle = function () {
116
116
  const {
117
- spawnTab
117
+ spawnTab,
118
+ focusedTabURI
118
119
  } = (0, _react.useContext)(_paneronExtensionKit.TabbedWorkspaceContext);
119
120
  const {
120
- stakeholder
121
+ stakeholder,
122
+ activeChangeRequestID
121
123
  } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
124
+ const dashboardIsOpen = focusedTabURI === null || focusedTabURI === void 0 ? void 0 : focusedTabURI.startsWith(_protocolRegistry.Protocols.PROPOSAL_WORK);
125
+ const canOpenDashboard = !activeChangeRequestID;
122
126
  return (0, _react2.jsx)("div", {
123
127
  css: (0, _react2.css)`display: flex; justify-content: space-between; align-items: center;`
124
128
  }, "Pending proposals", stakeholder && ((0, _stakeholder.canImportCR)(stakeholder) || (0, _stakeholder.canCreateCR)(stakeholder)) ? (0, _react2.jsx)(_core.Button, {
125
129
  minimal: true,
126
130
  small: true,
127
- intent: "primary",
131
+ disabled: !canOpenDashboard,
132
+ intent: canOpenDashboard ? 'primary' : undefined,
133
+ active: dashboardIsOpen,
128
134
  onClick: evt => {
129
135
  evt.stopPropagation();
130
136
  spawnTab(_protocolRegistry.Protocols.PROPOSAL_WORK);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/sidebar/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport update from 'immutability-helper';\nimport { jsx, css } from '@emotion/react';\nimport { Icon, Button } from '@blueprintjs/core';\n\nimport type { SuperSidebarConfig } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/types';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit';\n\n//import Browse from './Browse';\nimport ItemClassTree from '../../item-classes/Tree';\nimport { BrowserCtx } from '../BrowserCtx';\n//import Search from './Search';\nimport { ChangeRequestHistoryBlock } from './Registration';\nimport { canImportCR, canCreateCR } from '../../types/stakeholder';\nimport ActionableCRTree from '../../proposals/actionableGroups/Tree';\nimport { Protocols } from '../protocolRegistry';\n//import { ExportOptions, ImportOptions } from './ExportImport';\n\n\nexport const sidebarIDs = [\n 'Browse',\n //'Registration',\n //'Export',\n] as const;\n\nexport type SidebarID = typeof sidebarIDs[number];\n\nexport const sidebarConfig: SuperSidebarConfig<typeof sidebarIDs> = {\n Browse: {\n icon: () => <Icon icon=\"list\" />,\n title: \"Browse\",\n blocks: [{\n key: 'browse',\n title: <div css={css`display: flex; justify-content: space-between`}>\n Item classes\n <HelpTooltip content=\"Browse register items by pre-made categories\" />\n </div>,\n content: <ItemClassTree />,\n nonCollapsible: false,\n // These have to have height specified due to absolute positioning.\n height: 400,\n //}, {\n // key: 'search',\n // title: \"New search\",\n // content: <Search css={css`position: absolute; inset: 0;`} />,\n // nonCollapsible: false,\n // height: 400,\n }, {\n key: 'proposal-history',\n title: \"Proposal history\",\n content: <ChangeRequestHistoryBlock />,\n nonCollapsible: false,\n height: 200,\n }],\n },\n // Registration: {\n // icon: () => <Icon icon=\"lightbulb\" />,\n // title: \"Proposals\",\n // blocks: [{\n // key: 'pending-crs',\n // title: <div css={css`display: flex; justify-content: space-between`}>\n // Pending proposals\n // <HelpTooltip content=\"Proposals pending decision. If a register item is selected, only proposals affecting that item are shown.\" />\n // </div>,\n // content: <PendingChangeRequestsBlock />,\n // height: 300,\n // }, {\n // key: 'cr-history',\n // title: <div css={css`display: flex; justify-content: space-between`}>\n // History\n // <HelpTooltip content=\"Resolved proposals. If a register item is selected, only proposals affecting that item are shown.\" />\n // </div>,\n // content: <ChangeRequestHistoryBlock />,\n // height: 300,\n // }],\n // },\n // Export: {\n // icon: () => <Icon icon=\"changes\" />,\n // title: \"Import and export options\",\n // blocks: [{\n // key: 'export',\n // title: \"Export options\",\n // content: <ExportOptions />,\n // nonCollapsible: true,\n // }, {\n // key: 'import',\n // title: \"Import options\",\n // content: <ImportOptions />,\n // nonCollapsible: false,\n // collapsedByDefault: true,\n // }],\n // },\n};\n\nconst ProposalsBlockTitle: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const { stakeholder } = useContext(BrowserCtx);\n return <div css={css`display: flex; justify-content: space-between; align-items: center;`}>\n Pending proposals\n {stakeholder && (canImportCR(stakeholder) || canCreateCR(stakeholder))\n ? <Button minimal small intent=\"primary\" onClick={(evt) => {\n evt.stopPropagation();\n spawnTab(Protocols.PROPOSAL_WORK);\n }}>\n Propose…\n </Button>\n : null}\n </div>\n};\n\nexport const sidebarConfigForStakeholder: SuperSidebarConfig<typeof sidebarIDs> = update(\n sidebarConfig, {\n Browse: {\n blocks: {\n $splice: [[0, 0, {\n key: 'proposals',\n title: <ProposalsBlockTitle />,\n content: <ActionableCRTree />,\n nonCollapsible: false,\n height: 200,\n }]]\n }\n }\n });\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/sidebar/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport update from 'immutability-helper';\nimport { jsx, css } from '@emotion/react';\nimport { Icon, Button } from '@blueprintjs/core';\n\nimport type { SuperSidebarConfig } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/types';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit';\n\n//import Browse from './Browse';\nimport ItemClassTree from '../../item-classes/Tree';\nimport { BrowserCtx } from '../BrowserCtx';\n//import Search from './Search';\nimport { ChangeRequestHistoryBlock } from './Registration';\nimport { canImportCR, canCreateCR } from '../../types/stakeholder';\nimport ActionableCRTree from '../../proposals/actionableGroups/Tree';\nimport { Protocols } from '../protocolRegistry';\n//import { ExportOptions, ImportOptions } from './ExportImport';\n\n\nexport const sidebarIDs = [\n 'Browse',\n //'Registration',\n //'Export',\n] as const;\n\nexport type SidebarID = typeof sidebarIDs[number];\n\nexport const sidebarConfig: SuperSidebarConfig<typeof sidebarIDs> = {\n Browse: {\n icon: () => <Icon icon=\"list\" />,\n title: \"Browse\",\n blocks: [{\n key: 'browse',\n title: <div css={css`display: flex; justify-content: space-between`}>\n Item classes\n <HelpTooltip content=\"Browse register items by pre-made categories\" />\n </div>,\n content: <ItemClassTree />,\n nonCollapsible: false,\n // These have to have height specified due to absolute positioning.\n height: 400,\n //}, {\n // key: 'search',\n // title: \"New search\",\n // content: <Search css={css`position: absolute; inset: 0;`} />,\n // nonCollapsible: false,\n // height: 400,\n }, {\n key: 'proposal-history',\n title: \"Proposal history\",\n content: <ChangeRequestHistoryBlock />,\n nonCollapsible: false,\n height: 200,\n }],\n },\n // Registration: {\n // icon: () => <Icon icon=\"lightbulb\" />,\n // title: \"Proposals\",\n // blocks: [{\n // key: 'pending-crs',\n // title: <div css={css`display: flex; justify-content: space-between`}>\n // Pending proposals\n // <HelpTooltip content=\"Proposals pending decision. If a register item is selected, only proposals affecting that item are shown.\" />\n // </div>,\n // content: <PendingChangeRequestsBlock />,\n // height: 300,\n // }, {\n // key: 'cr-history',\n // title: <div css={css`display: flex; justify-content: space-between`}>\n // History\n // <HelpTooltip content=\"Resolved proposals. If a register item is selected, only proposals affecting that item are shown.\" />\n // </div>,\n // content: <ChangeRequestHistoryBlock />,\n // height: 300,\n // }],\n // },\n // Export: {\n // icon: () => <Icon icon=\"changes\" />,\n // title: \"Import and export options\",\n // blocks: [{\n // key: 'export',\n // title: \"Export options\",\n // content: <ExportOptions />,\n // nonCollapsible: true,\n // }, {\n // key: 'import',\n // title: \"Import options\",\n // content: <ImportOptions />,\n // nonCollapsible: false,\n // collapsedByDefault: true,\n // }],\n // },\n};\n\nconst ProposalsBlockTitle: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { spawnTab, focusedTabURI } = useContext(TabbedWorkspaceContext);\n const { stakeholder, activeChangeRequestID } = useContext(BrowserCtx);\n const dashboardIsOpen = focusedTabURI?.startsWith(Protocols.PROPOSAL_WORK)\n const canOpenDashboard = !activeChangeRequestID;\n return <div css={css`display: flex; justify-content: space-between; align-items: center;`}>\n Pending proposals\n {stakeholder && (canImportCR(stakeholder) || canCreateCR(stakeholder))\n ? <Button\n minimal\n small\n disabled={!canOpenDashboard}\n intent={canOpenDashboard ? 'primary' : undefined}\n active={dashboardIsOpen}\n onClick={(evt) => {\n evt.stopPropagation();\n spawnTab(Protocols.PROPOSAL_WORK);\n }}>\n Propose…\n </Button>\n : null}\n </div>\n};\n\nexport const sidebarConfigForStakeholder: SuperSidebarConfig<typeof sidebarIDs> = update(\n sidebarConfig, {\n Browse: {\n blocks: {\n $splice: [[0, 0, {\n key: 'proposals',\n title: <ProposalsBlockTitle />,\n content: <ActionableCRTree />,\n nonCollapsible: false,\n height: 200,\n }]]\n }\n }\n });\n"]}
package/views/util.d.ts CHANGED
@@ -24,15 +24,23 @@ export declare const PropertyDetailView: React.FC<FormGroupProps & {
24
24
  /** Formats given date as a span with tooltip set to full ISO date & time. */
25
25
  export declare const Datestamp: React.FC<{
26
26
  date: Date;
27
+ /** See formatDate(). */
27
28
  useUTC?: boolean;
29
+ /** See formatDate(). */
28
30
  showTime?: boolean;
31
+ /** See formatDate(). */
32
+ showTimeIfNonZero?: boolean;
29
33
  title?: string;
30
34
  className?: string;
31
35
  }>;
32
36
  /** Foramts given date as plain text. */
33
37
  export declare function formatDate(date: Date, opts?: {
38
+ /** Show time in UTC. Will add the “UTC”, unless time is shown. */
34
39
  useUTC?: boolean;
40
+ /** Show date along with full time, to seconds. */
35
41
  showTime?: boolean;
42
+ /** Show time, unless it’s 00:00:00 on the day. */
43
+ showTimeIfNonZero?: boolean;
36
44
  }): string;
37
45
  export declare const _getRelatedClass: (classes: Record<string, ItemClassConfiguration<any>>) => (clsID: string) => RelatedItemClassConfiguration;
38
46
  export declare type ClassificationEntry = TagProps & {
package/views/util.js CHANGED
@@ -119,6 +119,7 @@ const Datestamp = function ({
119
119
  date,
120
120
  useUTC,
121
121
  showTime,
122
+ showTimeIfNonZero,
122
123
  title,
123
124
  className
124
125
  }) {
@@ -126,7 +127,8 @@ const Datestamp = function ({
126
127
 
127
128
  const asString = formatDate(date, {
128
129
  useUTC,
129
- showTime
130
+ showTime,
131
+ showTimeIfNonZero
130
132
  });
131
133
  return (0, _react2.jsx)("span", {
132
134
  className: className,
@@ -141,14 +143,19 @@ function formatInTimeZone(date, fmt, tz) {
141
143
  timeZone: tz
142
144
  });
143
145
  }
146
+
147
+ function timeIsNonZero(date) {
148
+ return date.getMilliseconds() === 0 && date.getSeconds() === 0 && date.getMinutes() === 0 && date.getHours() === 0;
149
+ }
144
150
  /** Foramts given date as plain text. */
145
151
 
146
152
 
147
153
  function formatDate(date, opts) {
148
- const fmt = (opts === null || opts === void 0 ? void 0 : opts.showTime) ? 'yyyy-MM-dd HH:mm:ss' : 'yyyy-MM-dd';
154
+ const showTime = (opts === null || opts === void 0 ? void 0 : opts.showTime) || (opts === null || opts === void 0 ? void 0 : opts.showTimeIfNonZero) && timeIsNonZero(date);
155
+ const fmt = showTime ? 'yyyy-MM-dd HH:mm:ss' : 'yyyy-MM-dd';
149
156
 
150
157
  try {
151
- return (opts === null || opts === void 0 ? void 0 : opts.useUTC) ? `${formatInTimeZone(date, fmt, 'UTC')}${(opts === null || opts === void 0 ? void 0 : opts.showTime) ? ' UTC' : ''}` : (0, _format.default)(date, fmt);
158
+ return (opts === null || opts === void 0 ? void 0 : opts.useUTC) ? `${formatInTimeZone(date, fmt, 'UTC')}${showTime ? ' UTC' : ''}` : (0, _format.default)(date, fmt);
152
159
  } catch (e) {
153
160
  console.error("Failed to format date", date, typeof date);
154
161
  return `Invalid date (${e})`;
package/views/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/views/util.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\n//import log from 'electron-log';\nimport format from 'date-fns/format';\nimport { format as formatTZ, utcToZonedTime } from 'date-fns-tz';\n\nimport React, { memo, useContext } from 'react';\nimport { Helmet, type HelmetProps } from 'react-helmet';\nimport { css, jsx } from '@emotion/react';\nimport {\n Card, type CardProps,\n Classes,\n FormGroup, type FormGroupProps,\n H3, H4,\n Button as BaseButton, type ButtonProps,\n Menu, MenuDivider, MenuItem,\n ButtonGroup,\n Tag, type TagProps,\n Colors,\n} from '@blueprintjs/core';\nimport { Popover2 as Popover } from '@blueprintjs/popover2';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport HelpTooltip, { type HelpTooltipProps } from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport { BrowserCtx } from './BrowserCtx';\nimport type { ItemClassConfiguration, RelatedItemClassConfiguration } from '../types';\nexport { GenericRelatedItemView } from './GenericRelatedItemView';\n\n\n/**\n * Get give string truncated & with ellipsis appended\n * if its length exceeds given number of characters.\n */\nexport function maybeEllipsizeString(\n str: string,\n maxLength: number = 20,\n): string {\n return str.length > maxLength\n ? `${str.slice(0, maxLength)}…`\n : str;\n}\n\n\nexport const RegisterHelmet: React.FC<HelmetProps> = memo(function (props) {\n const { title: datasetTitle } = useContext(DatasetContext);\n const { registerMetadata } = useContext(BrowserCtx);\n\n return (\n <Helmet\n titleTemplate={`%s in ${registerMetadata?.name ?? datasetTitle}`}\n defaultTitle={`${registerMetadata?.name ?? datasetTitle}`}>\n {props.children}\n </Helmet>\n );\n});\n\n\n/**\n * A wrapper to show property data with its label(s).\n */\nexport const PropertyDetailView: React.FC<FormGroupProps & {\n /** @deprecated use `label` instead */\n title?: FormGroupProps[\"label\"]\n /** @deprecated use `labelInfo` instead */\n secondaryTitle?: FormGroupProps[\"labelInfo\"]\n}> = function ({\n label, labelInfo,\n title, secondaryTitle,\n ...props }) {\n return (\n <FormGroup\n label={label || title ? `${label ?? title}:` : undefined}\n labelInfo={labelInfo ?? secondaryTitle}\n css={css`\n &, &.bp4-inline {\n label.bp4-label {\n /*\n * Since it’s in flex container, label expands to fill its width,\n * and due to the mechanics of how labels work (?)\n * any button (e.g., for deletion) within labelInfo\n * would responds to events of the entire label\n * (meaning you can hover space to the right of the label and labelInfo\n * and the button would still be clickable).\n * This makes the label not fill flex container width.\n */\n align-self: flex-start;\n\n font-weight: bold;\n line-height: unset;\n text-transform: capitalize;\n .bp4-text-muted {\n text-transform: none;\n }\n }\n }\n `}\n {...props}\n />\n );\n};\n\n\n/** Formats given date as a span with tooltip set to full ISO date & time. */\nexport const Datestamp: React.FC<{\n date: Date\n useUTC?: boolean\n showTime?: boolean\n title?: string\n className?: string\n}> = function ({ date, useUTC, showTime, title, className }) {\n const asString = formatDate(date, { useUTC, showTime });\n return <span\n className={className}\n title={`${title ? `${title}: ` : ''}${date?.toString() ?? 'N/A'}`}>\n {asString}\n </span>;\n};\n\n\nfunction formatInTimeZone(date: Date, fmt: string, tz: string) {\n return formatTZ(\n utcToZonedTime(date, tz), \n fmt, \n { timeZone: tz });\n}\n\n\n/** Foramts given date as plain text. */\nexport function formatDate(\n date: Date,\n opts?: { useUTC?: boolean, showTime?: boolean },\n): string {\n const fmt = opts?.showTime\n ? 'yyyy-MM-dd HH:mm:ss'\n : 'yyyy-MM-dd';\n try {\n return opts?.useUTC\n ? `${formatInTimeZone(date, fmt, 'UTC')}${opts?.showTime ? ' UTC' : ''}`\n : format(date, fmt);\n } catch (e) {\n console.error(\"Failed to format date\", date, typeof date);\n return `Invalid date (${e})`;\n }\n}\n\n\nexport const _getRelatedClass = (classes: Record<string, ItemClassConfiguration<any>>) => {\n return (clsID: string): RelatedItemClassConfiguration => {\n const cfg = classes[clsID];\n return {\n title: cfg.meta.title,\n // TODO: The itemView/listItemView inconsistency is annoying\n itemView: cfg.views.listItemView,\n };\n };\n};\n\n\n// /**\n// * Suitable for use as tab contents for TabbedWorkspace.\n// * Provides top bar with actions and main content.\n// */\n// export const TabContentsWithActions: React.FC<{\n// actions: JSX.Element;\n// main: JSX.Element;\n// gapPx?: number;\n// className?: string;\n// }> = function ({ actions, gapPx: _gapPx, main, className }) {\n// const gapPx = _gapPx ?? 10;\n// return (\n// <div css={css`\n// position: absolute; inset: 0;\n// display: flex; flex-flow: column nowrap;\n// `} className={className}>\n// <div css={css`flex: 0; padding: ${gapPx}px; display: flex; flex-flow: row wrap; gap: ${gapPx}px;`}>\n// {actions}\n// </div>\n// <div css={css`\n// position: relative;\n// flex: 1;\n// padding: ${gapPx}px;\n// overflow-y: auto;\n// background: ${Colors.GRAY5};\n// .bp4-dark & { background: ${Colors.DARK_GRAY2}; }\n// `}>\n// {main}\n// </div>\n// </div>\n// );\n// };\n\n\nexport type ClassificationEntry = TagProps & { tooltip?: HelpTooltipProps };\nexport interface TabContentsWithHeaderProps {\n title: JSX.Element | string\n smallTitle?: boolean\n classification?: ClassificationEntry[]\n actions?: (ActionProps | ActionProps[])[]\n tooltip?: HelpTooltipProps\n className?: string\n\n /**\n * CSS to apply to child contents wrapper div.\n *\n * If 'card-grid', children would be expected to be cards\n * (e.g., `FormGroupAsCardInGrid` or `CardInGrid`)\n *\n * 'card-grid' implies 'scrollable'.\n */\n layout?: undefined | 'card-grid' | 'scrollable'\n layoutOptions?: Record<string, unknown>\n}\ninterface Grid extends TabContentsWithHeaderProps {\n layout: 'card-grid'\n layoutOptions?: {\n gapPx?: number\n stretch?: boolean\n }\n}\ninterface Scrollable extends TabContentsWithHeaderProps {\n layout: 'scrollable'\n layoutOptions?: never\n}\ninterface NoLayout extends TabContentsWithHeaderProps {\n layout?: undefined\n layoutOptions?: never\n}\nconst paddingPx = 11;\nfunction findEnabledActions\n<T extends ButtonProps | ButtonProps[] = ButtonProps | ButtonProps[]>\n(props: T[]): ButtonProps[] {\n return props.map(props =>\n (props as ButtonProps[]).length !== undefined\n ? (props as ButtonProps[]).filter(p => !p.disabled)\n : !(props as ButtonProps).disabled\n ? props\n : []\n ).flat();\n}\nexport const TabContentsWithHeader: React.FC<Grid | Scrollable | NoLayout> =\nfunction ({ title, smallTitle, classification, actions, layout, layoutOptions, className, children }) {\n const hasClassification = (classification ?? []).length > 0;\n\n const enabledActions = actions ? findEnabledActions(actions) : [];\n const hasActions = enabledActions.length > 0;\n\n // if (enabledActions.length === 1 && !enabledActions[0].intent) {\n // enabledActions[0].intent = 'primary';\n // }\n\n return (\n <div css={css`\n position: absolute; inset: 0;\n padding-top: ${paddingPx}px;\n ${hasActions ? `padding-bottom: ${paddingPx}px;` : ''}\n display: flex; flex-flow: column nowrap;\n gap: ${paddingPx}px;\n `} className={className}>\n {smallTitle\n ? <H4 css={css`margin: 0 ${paddingPx}px;`}>{title}</H4>\n : <H3 css={css`margin: 0 ${paddingPx}px;`}>{title}</H3>}\n {hasClassification\n ? <div css={css`\n flex: 0;\n margin: 0 ${paddingPx}px;\n display: flex;\n flex-flow: row wrap;\n gap: ${paddingPx}px;\n `}>\n {classification!.map((p, idx) =>\n <Tag\n key={idx}\n minimal\n {...p}\n large={!smallTitle}\n rightIcon={p.tooltip\n ? <HelpTooltip {...p.tooltip} />\n : undefined}\n />\n )}\n </div>\n : null}\n <div css={css`\n position: relative;\n flex: 1;\n overflow-y: auto;\n\n ${layout === undefined\n ? `\n > :only-child { position: absolute; inset: 0 }\n box-shadow: black 0 0 20px -10px;\n `\n : `\n padding: 0 10px;\n &::after, &::before {\n pointer-events: none;\n content: \" \";\n display: block;\n position: sticky;\n width: 100%;\n height: 1px;\n background: ${Colors.GRAY5};\n .bp4-dark & { background: ${Colors.DARK_GRAY2}; }\n z-index: 10;\n }\n &::before {\n top: 0;\n box-shadow: ${Colors.GRAY5} 0 -20px 20px 20px;\n .bp4-dark & {\n box-shadow: ${Colors.DARK_GRAY2} 0 -20px 20px 20px;\n }\n }\n &::after {\n bottom: 0;\n box-shadow: ${Colors.GRAY5} 0 20px 20px 20px;\n .bp4-dark & {\n box-shadow: ${Colors.DARK_GRAY2} 0 20px 20px 20px;\n }\n }\n `}\n\n ${layout === 'scrollable' || layout === 'card-grid'\n ? `\n background: ${Colors.GRAY5};\n .bp4-dark & { background: ${Colors.DARK_GRAY2}; }\n `\n : ''}\n\n ${layout === 'card-grid'\n ? `\n display: flex;\n flex-flow: row wrap;\n align-content: flex-start;\n ${layoutOptions?.stretch\n ? 'align-items: stretch;'\n : 'align-items: flex-start;'}\n gap: ${layoutOptions?.gapPx ?? 10}px;\n `\n : ''}\n `}>\n {children}\n </div>\n\n {hasActions\n ? <div css={css`\n margin: 0 ${paddingPx}px;\n flex: 0; display: flex; flex-flow: row wrap; gap: ${paddingPx}px;\n `}>\n {actions!.map((props, idx) => {\n if (props.hasOwnProperty('length') && (props as ButtonProps[]).length !== undefined) {\n return (\n <ButtonGroup key={idx}>\n {(props as ButtonProps[]).map((p, idx) =>\n <Action {...p} key={idx} />\n )}\n </ButtonGroup>\n );\n } else {\n return <Action key={idx} {...(props as ButtonProps)} />;\n }\n })}\n </div>\n : null}\n </div>\n );\n};\n\n\nexport type ActionProps = ButtonProps & ({ popup?: JSX.Element, tooltip?: string });\n/** Mostly a button, but with an optional popup. */\nconst Action: React.FC<ActionProps & { key?: number | string }> = function ({ popup, tooltip, ...props }) {\n const btn = <BaseButton\n {...props}\n intent={props.disabled ? undefined : props.intent}\n onClick={props.disabled ? undefined : props.onClick}\n disabled={props.active ? false : props.disabled}\n title={tooltip}\n rightIcon={popup ? 'more' : undefined}\n />;\n\n if (popup && !props.disabled) {\n return (\n <Popover key={props.key} content={popup} placement=\"top\" minimal interactionKind=\"click\">\n {btn}\n </Popover>\n );\n } else {\n return btn;\n }\n};\n\n\nexport const CardInGrid: React.FC<{ description: string } & CardProps> =\nfunction ({ description, className, ...props }) {\n return (\n <Card\n css={css`border-radius: 5px;`}\n title={description}\n className={!props.interactive\n ? `${Classes.ELEVATION_3} ${className ?? ''}`\n : className}\n {...props}\n />\n );\n};\n\n\n/** Useful in case of tab “card-grid” layout. */\nexport const FormGroupAsCardInGrid: React.FC<FormGroupProps & { paddingPx?: number }> =\nfunction ({ paddingPx, ...props }) {\n const paddingPx_ = paddingPx ?? 11;\n return (\n <FormGroup\n {...props}\n css={css`\n margin: 0;\n\n border-radius: 5px;\n padding: ${paddingPx_}px;\n\n > label.bp4-label {\n font-weight: bold;\n margin-bottom: ${paddingPx_}px;\n }\n > .bp4-form-content {\n display: flex;\n flex-flow: column nowrap;\n gap: ${paddingPx_}px;\n\n > .bp4-form-group {\n margin: 0;\n }\n }\n\n /* Note: these colors are picked to work with some form widgets, date input widget specifically. */\n background: ${Colors.WHITE};\n .bp4-dark & { background: ${Colors.DARK_GRAY3}; }\n `}\n className={`${Classes.ELEVATION_3} ${props.className}`}\n />\n );\n};\n\n\nexport const MoreMenu: React.FC<Record<never, never>> = memo(function ({ children }) {\n return (\n <Popover minimal content={<>{children}</>}>\n <BaseButton icon=\"more\" small minimal />\n </Popover>\n );\n});\n\n\nexport const ItemClassMenu: React.FC<{\n cfg: ItemClassConfiguration<any>;\n onCreate?: () => void;\n}> = memo(function ({ cfg, onCreate }) {\n return (\n <Menu>\n <MenuDivider title=\"About this class\" />\n <MenuItem multiline disabled css={css`max-width: 400px`} text={cfg.meta.description} />\n {onCreate\n ? <>\n <MenuDivider title=\"Quick actions\" />\n <MenuItem\n text=\"Propose new\"\n intent=\"primary\"\n onClick={onCreate} icon=\"plus\"\n />\n </>\n : null}\n </Menu>\n );\n});\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/views/util.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,iCAAiC;AACjC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,MAAM,EAAoB,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,IAAI,EACJ,OAAO,EACP,SAAS,EACT,EAAE,EAAE,EAAE,EACN,MAAM,IAAI,UAAU,EACpB,IAAI,EAAE,WAAW,EAAE,QAAQ,EAC3B,WAAW,EACX,GAAG,EACH,MAAM,GACP,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,WAAsC,MAAM,sDAAsD,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,YAAoB,EAAE;IAEtB,OAAO,GAAG,CAAC,MAAM,GAAG,SAAS;QAC3B,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG;QAC/B,CAAC,CAAC,GAAG,CAAC;AACV,CAAC;AAGD,MAAM,CAAC,MAAM,cAAc,GAA0B,IAAI,CAAC,UAAU,KAAK;;IACvE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3D,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAEpD,OAAO,CACL,IAAC,MAAM,IACH,aAAa,EAAE,SAAS,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,mCAAI,YAAY,EAAE,EAChE,YAAY,EAAE,GAAG,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,mCAAI,YAAY,EAAE,IAC1D,KAAK,CAAC,QAAQ,CACR,CACV,CAAC;AACJ,CAAC,CAAC,CAAC;AAGH;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAK1B,UAAU,EACX,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,cAAc,EACrB,GAAG,KAAK,EAAE;IACZ,OAAO,CACL,IAAC,SAAS,IACR,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,EACxD,SAAS,EAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,cAAc,EACtC,GAAG,EAAE,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;OAsBP,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC;AAGF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,SAAS,GAUjB,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE;;IAC5E,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC3E,OAAO,cACH,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,EAAE,mCAAI,KAAK,EAAE,IAClE,QAAQ,CACJ,CAAC;AACV,CAAC,CAAC;AAGF,SAAS,gBAAgB,CAAC,IAAU,EAAE,GAAW,EAAE,EAAU;IAC3D,OAAO,QAAQ,CACb,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,EACxB,GAAG,EACH,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CAAC,IAAU;IAC/B,OAAO,CACL,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC;QAC5B,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC;QACvB,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC;QACvB,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAC3B,CAAC;AAGD,wCAAwC;AACxC,MAAM,UAAU,UAAU,CACxB,IAAU,EACV,IAOC;IAED,MAAM,QAAQ,GAAG,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,KAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,iBAAiB,KAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACpF,MAAM,GAAG,GAAG,QAAQ;QAClB,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,YAAY,CAAC;IACjB,IAAI;QACF,OAAO,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM;YACjB,CAAC,CAAC,GAAG,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAClE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KACvB;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC;QAC1D,OAAO,iBAAiB,CAAC,GAAG,CAAC;KAC9B;AACH,CAAC;AAGD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAoD,EAAE,EAAE;IACvF,OAAO,CAAC,KAAa,EAAiC,EAAE;QACtD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK;YACrB,4DAA4D;YAC5D,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,YAAY;SACjC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAwEF,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,SAAS,kBAAkB,CAE1B,KAAU;IACT,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACtB,KAAuB,CAAC,MAAM,KAAK,SAAS;QAC3C,CAAC,CAAE,KAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnD,CAAC,CAAC,CAAE,KAAqB,CAAC,QAAQ;YAChC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,EAAE,CACT,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AACD,MAAM,CAAC,MAAM,qBAAqB,GAClC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE;;IAClG,MAAM,iBAAiB,GAAG,CAAC,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAE5D,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IAE7C,kEAAkE;IAClE,0CAA0C;IAC1C,IAAI;IAEJ,OAAO,CACL,aAAK,GAAG,EAAE,GAAG,CAAA;;qBAEI,SAAS;QACtB,UAAU,CAAC,CAAC,CAAC,mBAAmB,SAAS,KAAK,CAAC,CAAC,CAAC,EAAE;;aAE9C,SAAS;KACjB,EAAE,SAAS,EAAE,SAAS;QACpB,UAAU;YACT,CAAC,CAAC,IAAC,EAAE,IAAC,GAAG,EAAE,GAAG,CAAA,aAAa,SAAS,KAAK,IAAG,KAAK,CAAM;YACvD,CAAC,CAAC,IAAC,EAAE,IAAC,GAAG,EAAE,GAAG,CAAA,aAAa,SAAS,KAAK,IAAG,KAAK,CAAM;QACxD,iBAAiB;YAChB,CAAC,CAAC,aAAK,GAAG,EAAE,GAAG,CAAA;;wBAEC,SAAS;;;mBAGd,SAAS;WACjB,IACE,cAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAC9B,IAAC,GAAG,IACF,GAAG,EAAE,GAAG,EACR,OAAO,WACH,CAAC,EACL,KAAK,EAAE,CAAC,UAAU,EAClB,SAAS,EAAE,CAAC,CAAC,OAAO;oBAClB,CAAC,CAAC,IAAC,WAAW,OAAK,CAAC,CAAC,OAAO,GAAI;oBAChC,CAAC,CAAC,SAAS,GACb,CACH,CACG;YACR,CAAC,CAAC,IAAI;QACR,aAAK,GAAG,EAAE,GAAG,CAAA;;;;;UAKT,MAAM,KAAK,SAAS;gBACpB,CAAC,CAAC;;;aAGC;gBACH,CAAC,CAAC;;;;;;;;;8BASkB,MAAM,CAAC,KAAK;4CACE,MAAM,CAAC,UAAU;;;;;8BAK/B,MAAM,CAAC,KAAK;;gCAEV,MAAM,CAAC,UAAU;;;;;8BAKnB,MAAM,CAAC,KAAK;;gCAEV,MAAM,CAAC,UAAU;;;aAGpC;;UAEH,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,WAAW;gBACjD,CAAC,CAAC;4BACgB,MAAM,CAAC,KAAK;0CACE,MAAM,CAAC,UAAU;aAC9C;gBACH,CAAC,CAAC,EAAE;;UAEJ,MAAM,KAAK,WAAW;gBACtB,CAAC,CAAC;;;;gBAII,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO;oBACtB,CAAC,CAAC,uBAAuB;oBACzB,CAAC,CAAC,0BAA0B;qBACvB,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,mCAAI,EAAE;aAClC;gBACH,CAAC,CAAC,EAAE;OACP,IACE,QAAQ,CACL;QAEL,UAAU;YACT,CAAC,CAAC,aAAK,GAAG,EAAE,GAAG,CAAA;wBACC,SAAS;gEAC+B,SAAS;WAC9D,IACE,OAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC3B,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAK,KAAuB,CAAC,MAAM,KAAK,SAAS,EAAE;oBACnF,OAAO,CACL,IAAC,WAAW,IAAC,GAAG,EAAE,GAAG,IACjB,KAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CACvC,IAAC,MAAM,OAAK,CAAC,EAAE,GAAG,EAAE,GAAG,GAAI,CAC5B,CACW,CACf,CAAC;iBACH;qBAAM;oBACL,OAAO,IAAC,MAAM,IAAC,GAAG,EAAE,GAAG,KAAO,KAAqB,GAAI,CAAC;iBACzD;YACH,CAAC,CAAC,CACE;YACR,CAAC,CAAC,IAAI,CACJ,CACP,CAAC;AACJ,CAAC,CAAC;AAIF,mDAAmD;AACnD,MAAM,MAAM,GAAsD,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE;IACtG,MAAM,GAAG,GAAG,IAAC,UAAU,OACjB,KAAK,EACT,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EACjD,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EACnD,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAC/C,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GACrC,CAAC;IAEH,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;QAC5B,OAAO,CACL,IAAC,OAAO,IAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAC,KAAK,EAAC,OAAO,QAAC,eAAe,EAAC,OAAO,IACrF,GAAG,CACI,CACX,CAAC;KACH;SAAM;QACL,OAAO,GAAG,CAAC;KACZ;AACH,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,UAAU,GACvB,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE;IAC5C,OAAO,CACL,IAAC,IAAI,IACH,GAAG,EAAE,GAAG,CAAA,qBAAqB,EAC7B,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,CAAC,KAAK,CAAC,WAAW;YAC3B,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,IAAI,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,EAAE;YAC7C,CAAC,CAAC,SAAS,KACT,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC;AAGF,gDAAgD;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAClC,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE;IAC/B,MAAM,UAAU,GAAG,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,CAAC;IACnC,OAAO,CACL,IAAC,SAAS,OACJ,KAAK,EACT,GAAG,EAAE,GAAG,CAAA;;;;mBAIK,UAAU;;;;2BAIF,UAAU;;;;;iBAKpB,UAAU;;;;;;;;sBAQL,MAAM,CAAC,KAAK;oCACE,MAAM,CAAC,UAAU;OAC9C,EACD,SAAS,EAAE,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,EAAE,GACtD,CACH,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,QAAQ,GAAmC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE;IACjF,OAAO,CACL,IAAC,OAAO,IAAC,OAAO,QAAC,OAAO,EAAE,0BAAG,QAAQ,CAAI;QACvC,IAAC,UAAU,IAAC,IAAI,EAAC,MAAM,EAAC,KAAK,QAAC,OAAO,SAAG,CAChC,CACX,CAAC;AACJ,CAAC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,aAAa,GAGrB,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE;IACnC,OAAO,CACL,IAAC,IAAI;QACH,IAAC,WAAW,IAAC,KAAK,EAAC,kBAAkB,GAAG;QACxC,IAAC,QAAQ,IAAC,SAAS,QAAC,QAAQ,QAAC,GAAG,EAAE,GAAG,CAAA,kBAAkB,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,GAAI;QACtF,QAAQ;YACP,CAAC,CAAC;gBACE,IAAC,WAAW,IAAC,KAAK,EAAC,eAAe,GAAG;gBACrC,IAAC,QAAQ,IACP,IAAI,EAAC,aAAa,EAClB,MAAM,EAAC,SAAS,EAChB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAC,MAAM,GAC9B,CACD;YACL,CAAC,CAAC,IAAI,CACH,CACR,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\n//import log from 'electron-log';\nimport format from 'date-fns/format';\nimport { format as formatTZ, utcToZonedTime } from 'date-fns-tz';\n\nimport React, { memo, useContext } from 'react';\nimport { Helmet, type HelmetProps } from 'react-helmet';\nimport { css, jsx } from '@emotion/react';\nimport {\n Card, type CardProps,\n Classes,\n FormGroup, type FormGroupProps,\n H3, H4,\n Button as BaseButton, type ButtonProps,\n Menu, MenuDivider, MenuItem,\n ButtonGroup,\n Tag, type TagProps,\n Colors,\n} from '@blueprintjs/core';\nimport { Popover2 as Popover } from '@blueprintjs/popover2';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport HelpTooltip, { type HelpTooltipProps } from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport { BrowserCtx } from './BrowserCtx';\nimport type { ItemClassConfiguration, RelatedItemClassConfiguration } from '../types';\nexport { GenericRelatedItemView } from './GenericRelatedItemView';\n\n\n/**\n * Get give string truncated & with ellipsis appended\n * if its length exceeds given number of characters.\n */\nexport function maybeEllipsizeString(\n str: string,\n maxLength: number = 20,\n): string {\n return str.length > maxLength\n ? `${str.slice(0, maxLength)}…`\n : str;\n}\n\n\nexport const RegisterHelmet: React.FC<HelmetProps> = memo(function (props) {\n const { title: datasetTitle } = useContext(DatasetContext);\n const { registerMetadata } = useContext(BrowserCtx);\n\n return (\n <Helmet\n titleTemplate={`%s in ${registerMetadata?.name ?? datasetTitle}`}\n defaultTitle={`${registerMetadata?.name ?? datasetTitle}`}>\n {props.children}\n </Helmet>\n );\n});\n\n\n/**\n * A wrapper to show property data with its label(s).\n */\nexport const PropertyDetailView: React.FC<FormGroupProps & {\n /** @deprecated use `label` instead */\n title?: FormGroupProps[\"label\"]\n /** @deprecated use `labelInfo` instead */\n secondaryTitle?: FormGroupProps[\"labelInfo\"]\n}> = function ({\n label, labelInfo,\n title, secondaryTitle,\n ...props }) {\n return (\n <FormGroup\n label={label || title ? `${label ?? title}:` : undefined}\n labelInfo={labelInfo ?? secondaryTitle}\n css={css`\n &, &.bp4-inline {\n label.bp4-label {\n /*\n * Since it’s in flex container, label expands to fill its width,\n * and due to the mechanics of how labels work (?)\n * any button (e.g., for deletion) within labelInfo\n * would responds to events of the entire label\n * (meaning you can hover space to the right of the label and labelInfo\n * and the button would still be clickable).\n * This makes the label not fill flex container width.\n */\n align-self: flex-start;\n\n font-weight: bold;\n line-height: unset;\n text-transform: capitalize;\n .bp4-text-muted {\n text-transform: none;\n }\n }\n }\n `}\n {...props}\n />\n );\n};\n\n\n/** Formats given date as a span with tooltip set to full ISO date & time. */\nexport const Datestamp: React.FC<{\n date: Date\n /** See formatDate(). */\n useUTC?: boolean\n /** See formatDate(). */\n showTime?: boolean\n /** See formatDate(). */\n showTimeIfNonZero?: boolean\n title?: string\n className?: string\n}> = function ({ date, useUTC, showTime, showTimeIfNonZero, title, className }) {\n const asString = formatDate(date, { useUTC, showTime, showTimeIfNonZero });\n return <span\n className={className}\n title={`${title ? `${title}: ` : ''}${date?.toString() ?? 'N/A'}`}>\n {asString}\n </span>;\n};\n\n\nfunction formatInTimeZone(date: Date, fmt: string, tz: string) {\n return formatTZ(\n utcToZonedTime(date, tz), \n fmt, \n { timeZone: tz });\n}\n\nfunction timeIsNonZero(date: Date): boolean {\n return (\n date.getMilliseconds() === 0 &&\n date.getSeconds() === 0 &&\n date.getMinutes() === 0 &&\n date.getHours() === 0);\n}\n\n\n/** Foramts given date as plain text. */\nexport function formatDate(\n date: Date,\n opts?: {\n /** Show time in UTC. Will add the “UTC”, unless time is shown. */\n useUTC?: boolean\n /** Show date along with full time, to seconds. */\n showTime?: boolean\n /** Show time, unless it’s 00:00:00 on the day. */\n showTimeIfNonZero?: boolean\n },\n): string {\n const showTime = opts?.showTime || (opts?.showTimeIfNonZero && timeIsNonZero(date));\n const fmt = showTime\n ? 'yyyy-MM-dd HH:mm:ss'\n : 'yyyy-MM-dd';\n try {\n return opts?.useUTC\n ? `${formatInTimeZone(date, fmt, 'UTC')}${showTime ? ' UTC' : ''}`\n : format(date, fmt);\n } catch (e) {\n console.error(\"Failed to format date\", date, typeof date);\n return `Invalid date (${e})`;\n }\n}\n\n\nexport const _getRelatedClass = (classes: Record<string, ItemClassConfiguration<any>>) => {\n return (clsID: string): RelatedItemClassConfiguration => {\n const cfg = classes[clsID];\n return {\n title: cfg.meta.title,\n // TODO: The itemView/listItemView inconsistency is annoying\n itemView: cfg.views.listItemView,\n };\n };\n};\n\n\n// /**\n// * Suitable for use as tab contents for TabbedWorkspace.\n// * Provides top bar with actions and main content.\n// */\n// export const TabContentsWithActions: React.FC<{\n// actions: JSX.Element;\n// main: JSX.Element;\n// gapPx?: number;\n// className?: string;\n// }> = function ({ actions, gapPx: _gapPx, main, className }) {\n// const gapPx = _gapPx ?? 10;\n// return (\n// <div css={css`\n// position: absolute; inset: 0;\n// display: flex; flex-flow: column nowrap;\n// `} className={className}>\n// <div css={css`flex: 0; padding: ${gapPx}px; display: flex; flex-flow: row wrap; gap: ${gapPx}px;`}>\n// {actions}\n// </div>\n// <div css={css`\n// position: relative;\n// flex: 1;\n// padding: ${gapPx}px;\n// overflow-y: auto;\n// background: ${Colors.GRAY5};\n// .bp4-dark & { background: ${Colors.DARK_GRAY2}; }\n// `}>\n// {main}\n// </div>\n// </div>\n// );\n// };\n\n\nexport type ClassificationEntry = TagProps & { tooltip?: HelpTooltipProps };\nexport interface TabContentsWithHeaderProps {\n title: JSX.Element | string\n smallTitle?: boolean\n classification?: ClassificationEntry[]\n actions?: (ActionProps | ActionProps[])[]\n tooltip?: HelpTooltipProps\n className?: string\n\n /**\n * CSS to apply to child contents wrapper div.\n *\n * If 'card-grid', children would be expected to be cards\n * (e.g., `FormGroupAsCardInGrid` or `CardInGrid`)\n *\n * 'card-grid' implies 'scrollable'.\n */\n layout?: undefined | 'card-grid' | 'scrollable'\n layoutOptions?: Record<string, unknown>\n}\ninterface Grid extends TabContentsWithHeaderProps {\n layout: 'card-grid'\n layoutOptions?: {\n gapPx?: number\n stretch?: boolean\n }\n}\ninterface Scrollable extends TabContentsWithHeaderProps {\n layout: 'scrollable'\n layoutOptions?: never\n}\ninterface NoLayout extends TabContentsWithHeaderProps {\n layout?: undefined\n layoutOptions?: never\n}\nconst paddingPx = 11;\nfunction findEnabledActions\n<T extends ButtonProps | ButtonProps[] = ButtonProps | ButtonProps[]>\n(props: T[]): ButtonProps[] {\n return props.map(props =>\n (props as ButtonProps[]).length !== undefined\n ? (props as ButtonProps[]).filter(p => !p.disabled)\n : !(props as ButtonProps).disabled\n ? props\n : []\n ).flat();\n}\nexport const TabContentsWithHeader: React.FC<Grid | Scrollable | NoLayout> =\nfunction ({ title, smallTitle, classification, actions, layout, layoutOptions, className, children }) {\n const hasClassification = (classification ?? []).length > 0;\n\n const enabledActions = actions ? findEnabledActions(actions) : [];\n const hasActions = enabledActions.length > 0;\n\n // if (enabledActions.length === 1 && !enabledActions[0].intent) {\n // enabledActions[0].intent = 'primary';\n // }\n\n return (\n <div css={css`\n position: absolute; inset: 0;\n padding-top: ${paddingPx}px;\n ${hasActions ? `padding-bottom: ${paddingPx}px;` : ''}\n display: flex; flex-flow: column nowrap;\n gap: ${paddingPx}px;\n `} className={className}>\n {smallTitle\n ? <H4 css={css`margin: 0 ${paddingPx}px;`}>{title}</H4>\n : <H3 css={css`margin: 0 ${paddingPx}px;`}>{title}</H3>}\n {hasClassification\n ? <div css={css`\n flex: 0;\n margin: 0 ${paddingPx}px;\n display: flex;\n flex-flow: row wrap;\n gap: ${paddingPx}px;\n `}>\n {classification!.map((p, idx) =>\n <Tag\n key={idx}\n minimal\n {...p}\n large={!smallTitle}\n rightIcon={p.tooltip\n ? <HelpTooltip {...p.tooltip} />\n : undefined}\n />\n )}\n </div>\n : null}\n <div css={css`\n position: relative;\n flex: 1;\n overflow-y: auto;\n\n ${layout === undefined\n ? `\n > :only-child { position: absolute; inset: 0 }\n box-shadow: black 0 0 20px -10px;\n `\n : `\n padding: 0 10px;\n &::after, &::before {\n pointer-events: none;\n content: \" \";\n display: block;\n position: sticky;\n width: 100%;\n height: 1px;\n background: ${Colors.GRAY5};\n .bp4-dark & { background: ${Colors.DARK_GRAY2}; }\n z-index: 10;\n }\n &::before {\n top: 0;\n box-shadow: ${Colors.GRAY5} 0 -20px 20px 20px;\n .bp4-dark & {\n box-shadow: ${Colors.DARK_GRAY2} 0 -20px 20px 20px;\n }\n }\n &::after {\n bottom: 0;\n box-shadow: ${Colors.GRAY5} 0 20px 20px 20px;\n .bp4-dark & {\n box-shadow: ${Colors.DARK_GRAY2} 0 20px 20px 20px;\n }\n }\n `}\n\n ${layout === 'scrollable' || layout === 'card-grid'\n ? `\n background: ${Colors.GRAY5};\n .bp4-dark & { background: ${Colors.DARK_GRAY2}; }\n `\n : ''}\n\n ${layout === 'card-grid'\n ? `\n display: flex;\n flex-flow: row wrap;\n align-content: flex-start;\n ${layoutOptions?.stretch\n ? 'align-items: stretch;'\n : 'align-items: flex-start;'}\n gap: ${layoutOptions?.gapPx ?? 10}px;\n `\n : ''}\n `}>\n {children}\n </div>\n\n {hasActions\n ? <div css={css`\n margin: 0 ${paddingPx}px;\n flex: 0; display: flex; flex-flow: row wrap; gap: ${paddingPx}px;\n `}>\n {actions!.map((props, idx) => {\n if (props.hasOwnProperty('length') && (props as ButtonProps[]).length !== undefined) {\n return (\n <ButtonGroup key={idx}>\n {(props as ButtonProps[]).map((p, idx) =>\n <Action {...p} key={idx} />\n )}\n </ButtonGroup>\n );\n } else {\n return <Action key={idx} {...(props as ButtonProps)} />;\n }\n })}\n </div>\n : null}\n </div>\n );\n};\n\n\nexport type ActionProps = ButtonProps & ({ popup?: JSX.Element, tooltip?: string });\n/** Mostly a button, but with an optional popup. */\nconst Action: React.FC<ActionProps & { key?: number | string }> = function ({ popup, tooltip, ...props }) {\n const btn = <BaseButton\n {...props}\n intent={props.disabled ? undefined : props.intent}\n onClick={props.disabled ? undefined : props.onClick}\n disabled={props.active ? false : props.disabled}\n title={tooltip}\n rightIcon={popup ? 'more' : undefined}\n />;\n\n if (popup && !props.disabled) {\n return (\n <Popover key={props.key} content={popup} placement=\"top\" minimal interactionKind=\"click\">\n {btn}\n </Popover>\n );\n } else {\n return btn;\n }\n};\n\n\nexport const CardInGrid: React.FC<{ description: string } & CardProps> =\nfunction ({ description, className, ...props }) {\n return (\n <Card\n css={css`border-radius: 5px;`}\n title={description}\n className={!props.interactive\n ? `${Classes.ELEVATION_3} ${className ?? ''}`\n : className}\n {...props}\n />\n );\n};\n\n\n/** Useful in case of tab “card-grid” layout. */\nexport const FormGroupAsCardInGrid: React.FC<FormGroupProps & { paddingPx?: number }> =\nfunction ({ paddingPx, ...props }) {\n const paddingPx_ = paddingPx ?? 11;\n return (\n <FormGroup\n {...props}\n css={css`\n margin: 0;\n\n border-radius: 5px;\n padding: ${paddingPx_}px;\n\n > label.bp4-label {\n font-weight: bold;\n margin-bottom: ${paddingPx_}px;\n }\n > .bp4-form-content {\n display: flex;\n flex-flow: column nowrap;\n gap: ${paddingPx_}px;\n\n > .bp4-form-group {\n margin: 0;\n }\n }\n\n /* Note: these colors are picked to work with some form widgets, date input widget specifically. */\n background: ${Colors.WHITE};\n .bp4-dark & { background: ${Colors.DARK_GRAY3}; }\n `}\n className={`${Classes.ELEVATION_3} ${props.className}`}\n />\n );\n};\n\n\nexport const MoreMenu: React.FC<Record<never, never>> = memo(function ({ children }) {\n return (\n <Popover minimal content={<>{children}</>}>\n <BaseButton icon=\"more\" small minimal />\n </Popover>\n );\n});\n\n\nexport const ItemClassMenu: React.FC<{\n cfg: ItemClassConfiguration<any>;\n onCreate?: () => void;\n}> = memo(function ({ cfg, onCreate }) {\n return (\n <Menu>\n <MenuDivider title=\"About this class\" />\n <MenuItem multiline disabled css={css`max-width: 400px`} text={cfg.meta.description} />\n {onCreate\n ? <>\n <MenuDivider title=\"Quick actions\" />\n <MenuItem\n text=\"Propose new\"\n intent=\"primary\"\n onClick={onCreate} icon=\"plus\"\n />\n </>\n : null}\n </Menu>\n );\n});\n"]}