@riboseinc/paneron-registry-kit 2.2.33 → 2.2.35

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 (74) hide show
  1. package/item-classes/Tree.js +2 -2
  2. package/item-classes/Tree.js.map +1 -1
  3. package/package.json +4 -3
  4. package/proposals/ChangeRequestContext.js +1 -1
  5. package/proposals/ChangeRequestContext.js.map +1 -1
  6. package/proposals/HistoryDrawer.js +1 -0
  7. package/proposals/HistoryDrawer.js.map +1 -1
  8. package/proposals/ListItem.d.ts +8 -0
  9. package/proposals/ListItem.js +40 -0
  10. package/proposals/ListItem.js.map +1 -0
  11. package/proposals/MetaProperties.js +41 -11
  12. package/proposals/MetaProperties.js.map +1 -1
  13. package/proposals/NewProposalMenu.d.ts +10 -0
  14. package/proposals/NewProposalMenu.js +113 -0
  15. package/proposals/NewProposalMenu.js.map +1 -0
  16. package/proposals/ProposalBrowser.js +2 -58
  17. package/proposals/ProposalBrowser.js.map +1 -1
  18. package/proposals/ProposalDetail.js +1 -0
  19. package/proposals/ProposalDetail.js.map +1 -1
  20. package/proposals/ProposalItem.js.map +1 -1
  21. package/proposals/ProposalTab.d.ts +12 -0
  22. package/proposals/ProposalTab.js +102 -0
  23. package/proposals/ProposalTab.js.map +1 -0
  24. package/proposals/ProposalWorkspace.d.ts +13 -0
  25. package/proposals/ProposalWorkspace.js +132 -0
  26. package/proposals/ProposalWorkspace.js.map +1 -0
  27. package/proposals/Search.js +20 -8
  28. package/proposals/Search.js.map +1 -1
  29. package/proposals/actionableGroups/Tree.js +13 -14
  30. package/proposals/actionableGroups/Tree.js.map +1 -1
  31. package/proposals/actionableGroups/treeNodes.d.ts +1 -0
  32. package/proposals/actionableGroups/treeNodes.js +41 -9
  33. package/proposals/actionableGroups/treeNodes.js.map +1 -1
  34. package/proposals/objectChangeset.d.ts +1 -2
  35. package/proposals/objectChangeset.js +1 -1
  36. package/proposals/objectChangeset.js.map +1 -1
  37. package/proposals/types.d.ts +2 -1
  38. package/proposals/types.js +4 -1
  39. package/proposals/types.js.map +1 -1
  40. package/types/util.d.ts +1 -1
  41. package/types/util.js.map +1 -1
  42. package/views/detail/ChangeRequest/index.js +11 -159
  43. package/views/detail/ChangeRequest/index.js.map +1 -1
  44. package/views/detail/ProposalWork.js +150 -110
  45. package/views/detail/ProposalWork.js.map +1 -1
  46. package/views/detail/RegisterHome/index.js +3 -3
  47. package/views/detail/RegisterHome/index.js.map +1 -1
  48. package/views/detail/RegisterHome2/index.d.ts +5 -0
  49. package/views/detail/RegisterHome2/index.js +58 -0
  50. package/views/detail/RegisterHome2/index.js.map +1 -0
  51. package/views/detail/RegisterItem/index.d.ts +1 -0
  52. package/views/detail/RegisterItem/index.js +55 -14
  53. package/views/detail/RegisterItem/index.js.map +1 -1
  54. package/views/detail/RegisterMeta/RegisterMetaForm.js +1 -46
  55. package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
  56. package/views/hooks/useLatestAcceptedProposal.d.ts +2 -0
  57. package/views/hooks/useLatestAcceptedProposal.js +48 -0
  58. package/views/hooks/useLatestAcceptedProposal.js.map +1 -0
  59. package/views/hooks/useRegisterVersion.d.ts +4 -0
  60. package/views/hooks/useRegisterVersion.js +4 -0
  61. package/views/hooks/useRegisterVersion.js.map +1 -1
  62. package/views/index.js +26 -10
  63. package/views/index.js.map +1 -1
  64. package/views/itemQueryUtils.js +12 -7
  65. package/views/itemQueryUtils.js.map +1 -1
  66. package/views/sidebar/Registration/index.js +6 -32
  67. package/views/sidebar/Registration/index.js.map +1 -1
  68. package/views/sidebar/Search/index.js +4 -7
  69. package/views/sidebar/Search/index.js.map +1 -1
  70. package/views/sidebar/index.js +40 -10
  71. package/views/sidebar/index.js.map +1 -1
  72. package/views/util.d.ts +6 -1
  73. package/views/util.js +29 -7
  74. package/views/util.js.map +1 -1
@@ -5,36 +5,28 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.ChangeRequestListBlock = exports.ChangeRequestHistoryBlock = exports.PendingChangeRequestsBlock = void 0;
7
7
 
8
- var _react = _interopRequireWildcard(require("react"));
8
+ var _react = require("react");
9
9
 
10
10
  var _react2 = require("@emotion/react");
11
11
 
12
- var _core = require("@blueprintjs/core");
13
-
14
12
  var _context = require("@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context");
15
13
 
16
14
  var _context2 = require("@riboseinc/paneron-extension-kit/context");
17
15
 
18
16
  var _SearchResultList = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/SearchResultList"));
19
17
 
20
- var _types = require("../../../proposals/types");
21
-
22
18
  var _queries = require("../../../proposals/queries");
23
19
 
24
20
  var _BrowserCtx = require("../../BrowserCtx");
25
21
 
26
22
  var _itemPathUtils = require("../../itemPathUtils");
27
23
 
28
- var _util = require("../../../views/util");
24
+ var _ListItem = require("../../../proposals/ListItem");
29
25
 
30
26
  var _protocolRegistry = require("../../protocolRegistry");
31
27
 
32
28
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
29
 
34
- 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); }
35
-
36
- 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; }
37
-
38
30
  /** @jsx jsx */
39
31
 
40
32
  /** @jsxFrag React.Fragment */
@@ -118,6 +110,7 @@ const ChangeRequestListBlock = function ({
118
110
  return (0, _react2.jsx)(ChangeRequestSearchResultList, {
119
111
  queryExpression: query,
120
112
  selectedItemPath: state.selectedItemPath,
113
+ keyExpression: "(new Date()).getTime() * 100 - (typeof obj.timeDisposed === 'object' ? (obj.timeDisposed ?? new Date()) : new Date(obj.timeDisposed)).getTime() + Math.floor(Math.random() * 1000)",
121
114
  onSelectItem: (0, _react.useCallback)(itemPath => dispatch({
122
115
  type: 'select-item',
123
116
  payload: {
@@ -133,28 +126,9 @@ exports.ChangeRequestListBlock = ChangeRequestListBlock;
133
126
  const CRHistoryItem = function ({
134
127
  objectData
135
128
  }) {
136
- const {
137
- activeChangeRequestID,
138
- setActiveChangeRequestID
139
- } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
140
- const isActive = activeChangeRequestID === objectData.id;
141
- const canToggle = activeChangeRequestID == null || isActive;
142
- const justification = (0, _types.hasSubmitterInput)(objectData) ? objectData.justification : 'N/A';
143
- return (0, _react2.jsx)("span", {
144
- title: `${justification} (proposal ID: ${objectData.id})`
145
- }, (0, _react2.jsx)(_core.Icon, {
146
- icon: isActive ? 'record' : 'dot',
147
- css: (0, _react2.css)`vertical-align: top; ${canToggle ? 'cursor: pointer; transition: all .2s;' : 'opacity: .5;'}`,
148
- title: canToggle ? isActive ? "Click to deactivate this proposal" : "Click to activate this proposal" : undefined,
149
- onClick: canToggle ? () => setActiveChangeRequestID === null || setActiveChangeRequestID === void 0 ? void 0 : setActiveChangeRequestID(activeChangeRequestID === objectData.id ? null : objectData.id) : undefined,
150
- intent: isActive ? 'danger' : canToggle ? 'primary' : undefined
151
- }), "\u00A0", (0, _types.isDisposed)(objectData) ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_util.Datestamp, {
152
- date: objectData.timeDisposed,
153
- title: "Disposed"
154
- }), ": ") : (0, _types.hadBeenProposed)(objectData) ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_util.Datestamp, {
155
- date: objectData.timeProposed,
156
- title: "Proposed"
157
- }), ": ") : null, justification);
129
+ return (0, _react2.jsx)(_ListItem.ProposalAsListItem, {
130
+ proposal: objectData
131
+ });
158
132
  };
159
133
 
160
134
  const ChangeRequestSearchResultList = (0, _SearchResultList.default)(CRHistoryItem, objPath => ({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Registration/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useEffect, useMemo, useCallback, useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Icon } from '@blueprintjs/core';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\n//import { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport makeSearchResultList from '@riboseinc/paneron-extension-kit/widgets/SearchResultList';\nimport { type Base as BaseCR, hasSubmitterInput, isDisposed, hadBeenProposed } from '../../../proposals/types';\nimport { CR_BASE_QUERY, DISPOSED_CR_QUERY } from '../../../proposals/queries';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { Datestamp } from '../../../views/util';\nimport { Protocols } from '../../protocolRegistry';\n\n\nexport const PendingChangeRequestsBlock: React.FC<Record<never, never>> = function () {\n const { stakeholder } = useContext(BrowserCtx);\n const stakeholderUsername = stakeholder?.gitServerUsername;\n const stakeholderCondition = stakeholderUsername\n ? `obj.submittingStakeholderGitServerUsername === \"${stakeholderUsername}\"`\n : 'false';\n // Don’t show drafts in the list of pending proposals, unless it’s user’s own drafts.\n const query = `!obj.timeDisposed && (obj.state !== \"draft\" || ${stakeholderCondition})`;\n\n return <ChangeRequestListBlock impliedQuery={query} />;\n};\n\n\nexport const ChangeRequestHistoryBlock: React.FC<Record<never, never>> = function () {\n return <ChangeRequestListBlock impliedQuery={DISPOSED_CR_QUERY} />;\n};\n\ninterface ChangeRequestBlockState {\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\nconst initialState: ChangeRequestBlockState = {\n quickSubstringQuery: '',\n selectedItemPath: null,\n} as const;\ntype ChangeRequestBlockAction =\n | { type: 'update-quick-substring-query'; payload: { substring: string; }; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nexport const ChangeRequestListBlock: React.FC<{ impliedQuery: string, itemPath?: string }> = function ({ impliedQuery, itemPath: _itemPath }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n const { spawnTab, focusedTabURI } = useContext(TabbedWorkspaceContext);\n const { selectedRegisterItem } = useContext(BrowserCtx);\n\n const itemPath = _itemPath ?? (\n selectedRegisterItem\n ? itemRefToItemPath(selectedRegisterItem.ref)\n : selectedRegisterItem);\n // ^ Adopt undefined value if no data is available, null if item is not selected\n\n const [ state, dispatch, ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<ChangeRequestBlockState, ChangeRequestBlockAction>)(\n `change-request-list-block-${itemPath === null ? 'global' : itemPath}-${impliedQuery}`,\n undefined,\n undefined,\n (prevState, action) => {\n switch (action.type) {\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 initialState,\n null);\n\n const query = useMemo((() => itemPath\n ? `return ${CR_BASE_QUERY} && ${impliedQuery} && obj.items[\"${itemPath}\"] !== undefined`\n : itemPath === null\n ? `return ${CR_BASE_QUERY} && ${impliedQuery}`\n // If item data is loading or unavailable, don’t show any CRs\n // to avoid flashing all CRs during item switching.\n : `return false`\n ), [impliedQuery, itemPath]);\n\n useEffect(() => {\n const selectedCRPath: string | null =\n focusedTabURI && focusedTabURI.startsWith(`${Protocols.CHANGE_REQUEST}:`)\n ? focusedTabURI.split(':')[1]\n : null;\n if (itemPath !== undefined && selectedCRPath) {\n setTimeout(() => {\n dispatch({ type: 'select-item', payload: { itemPath: selectedCRPath } });\n }, 500);\n }\n }, [dispatch, itemPath, focusedTabURI]);\n\n return (\n <ChangeRequestSearchResultList\n queryExpression={query}\n selectedItemPath={state.selectedItemPath}\n onSelectItem={useCallback((itemPath =>\n dispatch({\n type: 'select-item',\n payload: { itemPath },\n })\n ), [dispatch])}\n onOpenItem={useCallback((itemPath =>\n spawnTab(`${Protocols.CHANGE_REQUEST}:${itemPath}`)\n ), [spawnTab])}\n />\n )\n};\n\n\nconst CRHistoryItem: React.FC<{\n objectData: BaseCR,\n objectPath: string,\n}> = function ({ objectData }) {\n const { activeChangeRequestID, setActiveChangeRequestID } = useContext(BrowserCtx);\n const isActive = activeChangeRequestID === objectData.id;\n const canToggle = activeChangeRequestID == null || isActive;\n\n const justification = hasSubmitterInput(objectData) ? objectData.justification : 'N/A';\n\n return <span title={`${justification} (proposal ID: ${objectData.id})`}>\n <Icon\n icon={isActive ? 'record' : 'dot'}\n css={css`vertical-align: top; ${canToggle ? 'cursor: pointer; transition: all .2s;' : 'opacity: .5;'}`}\n title={canToggle\n ? isActive\n ? \"Click to deactivate this proposal\"\n : \"Click to activate this proposal\"\n : undefined}\n onClick={canToggle\n ? () => setActiveChangeRequestID?.(activeChangeRequestID === objectData.id ? null : objectData.id)\n : undefined}\n intent={isActive\n ? 'danger'\n : canToggle\n ? 'primary'\n : undefined}\n />\n &nbsp;\n {isDisposed(objectData)\n ? <><Datestamp date={objectData.timeDisposed} title=\"Disposed\" />: </>\n : hadBeenProposed(objectData)\n ? <><Datestamp date={objectData.timeProposed} title=\"Proposed\" />: </>\n : null}\n {justification}\n </span>;\n};\n\n\nconst ChangeRequestSearchResultList = makeSearchResultList<BaseCR>(CRHistoryItem, (objPath) => ({\n name: 'Prp.',\n iconProps: {\n icon: 'lightbulb',\n title: objPath,\n htmlTitle: `icon for proposal at ${objPath}`,\n },\n}));\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Registration/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useEffect, useMemo, useCallback, useContext } from 'react';\nimport { jsx } from '@emotion/react';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\n//import { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport makeSearchResultList from '@riboseinc/paneron-extension-kit/widgets/SearchResultList';\nimport { type Base as BaseCR, type SomeCR } from '../../../proposals/types';\nimport { CR_BASE_QUERY, DISPOSED_CR_QUERY } from '../../../proposals/queries';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { ProposalAsListItem } from '../../../proposals/ListItem';\nimport { Protocols } from '../../protocolRegistry';\n\n\nexport const PendingChangeRequestsBlock: React.FC<Record<never, never>> = function () {\n const { stakeholder } = useContext(BrowserCtx);\n const stakeholderUsername = stakeholder?.gitServerUsername;\n const stakeholderCondition = stakeholderUsername\n ? `obj.submittingStakeholderGitServerUsername === \"${stakeholderUsername}\"`\n : 'false';\n // Don’t show drafts in the list of pending proposals, unless it’s user’s own drafts.\n const query = `!obj.timeDisposed && (obj.state !== \"draft\" || ${stakeholderCondition})`;\n\n return <ChangeRequestListBlock impliedQuery={query} />;\n};\n\n\nexport const ChangeRequestHistoryBlock: React.FC<Record<never, never>> = function () {\n return <ChangeRequestListBlock impliedQuery={DISPOSED_CR_QUERY} />;\n};\n\ninterface ChangeRequestBlockState {\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\nconst initialState: ChangeRequestBlockState = {\n quickSubstringQuery: '',\n selectedItemPath: null,\n} as const;\ntype ChangeRequestBlockAction =\n | { type: 'update-quick-substring-query'; payload: { substring: string; }; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nexport const ChangeRequestListBlock: React.FC<{ impliedQuery: string, itemPath?: string }> = function ({ impliedQuery, itemPath: _itemPath }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n const { spawnTab, focusedTabURI } = useContext(TabbedWorkspaceContext);\n const { selectedRegisterItem } = useContext(BrowserCtx);\n\n const itemPath = _itemPath ?? (\n selectedRegisterItem\n ? itemRefToItemPath(selectedRegisterItem.ref)\n : selectedRegisterItem);\n // ^ Adopt undefined value if no data is available, null if item is not selected\n\n const [ state, dispatch, ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<ChangeRequestBlockState, ChangeRequestBlockAction>)(\n `change-request-list-block-${itemPath === null ? 'global' : itemPath}-${impliedQuery}`,\n undefined,\n undefined,\n (prevState, action) => {\n switch (action.type) {\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 initialState,\n null);\n\n const query = useMemo((() => itemPath\n ? `return ${CR_BASE_QUERY} && ${impliedQuery} && obj.items[\"${itemPath}\"] !== undefined`\n : itemPath === null\n ? `return ${CR_BASE_QUERY} && ${impliedQuery}`\n // If item data is loading or unavailable, don’t show any CRs\n // to avoid flashing all CRs during item switching.\n : `return false`\n ), [impliedQuery, itemPath]);\n\n useEffect(() => {\n const selectedCRPath: string | null =\n focusedTabURI && focusedTabURI.startsWith(`${Protocols.CHANGE_REQUEST}:`)\n ? focusedTabURI.split(':')[1]\n : null;\n if (itemPath !== undefined && selectedCRPath) {\n setTimeout(() => {\n dispatch({ type: 'select-item', payload: { itemPath: selectedCRPath } });\n }, 500);\n }\n }, [dispatch, itemPath, focusedTabURI]);\n\n return (\n <ChangeRequestSearchResultList\n queryExpression={query}\n selectedItemPath={state.selectedItemPath}\n keyExpression=\"(new Date()).getTime() * 100 - (typeof obj.timeDisposed === 'object' ? (obj.timeDisposed ?? new Date()) : new Date(obj.timeDisposed)).getTime() + Math.floor(Math.random() * 1000)\"\n onSelectItem={useCallback((itemPath =>\n dispatch({\n type: 'select-item',\n payload: { itemPath },\n })\n ), [dispatch])}\n onOpenItem={useCallback((itemPath =>\n spawnTab(`${Protocols.CHANGE_REQUEST}:${itemPath}`)\n ), [spawnTab])}\n />\n )\n};\n\n\nconst CRHistoryItem: React.FC<{\n objectData: BaseCR,\n objectPath: string,\n}> = function ({ objectData }) {\n return <ProposalAsListItem proposal={objectData as SomeCR} />;\n};\n\n\nconst ChangeRequestSearchResultList = makeSearchResultList<BaseCR>(CRHistoryItem, (objPath) => ({\n name: 'Prp.',\n iconProps: {\n icon: 'lightbulb',\n title: objPath,\n htmlTitle: `icon for proposal at ${objPath}`,\n },\n}));\n"]}
@@ -11,8 +11,6 @@ var _react2 = require("@emotion/react");
11
11
 
12
12
  var _context = require("@riboseinc/paneron-extension-kit/context");
13
13
 
14
- var _context2 = require("@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context");
15
-
16
14
  var _SearchResultList = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/SearchResultList"));
17
15
 
18
16
  var _useDebounce = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/useDebounce"));
@@ -89,9 +87,6 @@ const Search = (0, _react.memo)(function ({
89
87
  const {
90
88
  usePersistentDatasetStateReducer
91
89
  } = (0, _react.useContext)(_context.DatasetContext);
92
- const {
93
- spawnTab
94
- } = (0, _react.useContext)(_context2.TabbedWorkspaceContext);
95
90
  const ListComponent = (0, _react.useMemo)(() => List !== null && List !== void 0 ? List : RegisterItemSearchResultList, [List]);
96
91
  const {
97
92
  // TODO: defaultSearchCriteria,
@@ -99,7 +94,8 @@ const Search = (0, _react.memo)(function ({
99
94
  getQuickSearchPredicate,
100
95
  itemClasses,
101
96
  subregisters,
102
- selectedRegisterItem
97
+ selectedRegisterItem,
98
+ jumpTo
103
99
  } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
104
100
  const {
105
101
  changeRequest
@@ -157,7 +153,8 @@ const Search = (0, _react.memo)(function ({
157
153
  itemPath
158
154
  }
159
155
  }), [dispatch]);
160
- const handleOpenItem = (0, _react.useCallback)(onOpenItem !== null && onOpenItem !== void 0 ? onOpenItem : itemPath => spawnTab(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${itemPath}`), [onOpenItem, spawnTab]);
156
+ const defaultHandleOpenItem = (0, _react.useCallback)(itemPath => jumpTo === null || jumpTo === void 0 ? void 0 : jumpTo(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${itemPath}`), [jumpTo]);
157
+ const handleOpenItem = onOpenItem !== null && onOpenItem !== void 0 ? onOpenItem : defaultHandleOpenItem;
161
158
  return (0, _react2.jsx)("div", {
162
159
  css: (0, _react2.css)`display: flex; flex-flow: column nowrap;`,
163
160
  className: className,
@@ -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 { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\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 const { spawnTab } = useContext(TabbedWorkspaceContext);\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 } = 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 handleOpenItem = useCallback(\n onOpenItem ?? (itemPath => spawnTab(`${Protocols.ITEM_DETAILS}:${itemPath}`)),\n [onOpenItem, spawnTab]);\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 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"]}
@@ -5,26 +5,35 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.sidebarConfigForStakeholder = exports.sidebarConfig = exports.sidebarIDs = void 0;
7
7
 
8
+ var _react = require("react");
9
+
8
10
  var _immutabilityHelper = _interopRequireDefault(require("immutability-helper"));
9
11
 
10
- var _react = require("@emotion/react");
12
+ var _react2 = require("@emotion/react");
11
13
 
12
14
  var _core = require("@blueprintjs/core");
13
15
 
14
16
  var _HelpTooltip = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/HelpTooltip"));
15
17
 
18
+ var _paneronExtensionKit = require("@riboseinc/paneron-extension-kit");
19
+
16
20
  var _Tree = _interopRequireDefault(require("../../item-classes/Tree"));
17
21
 
22
+ var _BrowserCtx = require("../BrowserCtx");
23
+
18
24
  var _Registration = require("./Registration");
19
25
 
26
+ var _stakeholder = require("../../types/stakeholder");
27
+
20
28
  var _Tree2 = _interopRequireDefault(require("../../proposals/actionableGroups/Tree"));
21
29
 
30
+ var _protocolRegistry = require("../protocolRegistry");
31
+
22
32
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
33
 
24
34
  /** @jsx jsx */
25
35
 
26
36
  /** @jsxFrag React.Fragment */
27
- //import React from 'react';
28
37
  //import Browse from './Browse';
29
38
  //import Search from './Search';
30
39
  //import { ExportOptions, ImportOptions } from './ExportImport';
@@ -34,18 +43,18 @@ const sidebarIDs = ['Browse' //'Registration',
34
43
  exports.sidebarIDs = sidebarIDs;
35
44
  const sidebarConfig = {
36
45
  Browse: {
37
- icon: () => (0, _react.jsx)(_core.Icon, {
46
+ icon: () => (0, _react2.jsx)(_core.Icon, {
38
47
  icon: "list"
39
48
  }),
40
49
  title: "Browse",
41
50
  blocks: [{
42
51
  key: 'browse',
43
- title: (0, _react.jsx)("div", {
44
- css: (0, _react.css)`display: flex; justify-content: space-between`
45
- }, "Item classes", (0, _react.jsx)(_HelpTooltip.default, {
52
+ title: (0, _react2.jsx)("div", {
53
+ css: (0, _react2.css)`display: flex; justify-content: space-between`
54
+ }, "Item classes", (0, _react2.jsx)(_HelpTooltip.default, {
46
55
  content: "Browse register items by pre-made categories"
47
56
  })),
48
- content: (0, _react.jsx)(_Tree.default, null),
57
+ content: (0, _react2.jsx)(_Tree.default, null),
49
58
  nonCollapsible: false,
50
59
  // These have to have height specified due to absolute positioning.
51
60
  height: 400 //}, {
@@ -58,7 +67,7 @@ const sidebarConfig = {
58
67
  }, {
59
68
  key: 'proposal-history',
60
69
  title: "Proposal history",
61
- content: (0, _react.jsx)(_Registration.ChangeRequestHistoryBlock, null),
70
+ content: (0, _react2.jsx)(_Registration.ChangeRequestHistoryBlock, null),
62
71
  nonCollapsible: false,
63
72
  height: 200
64
73
  }]
@@ -102,13 +111,34 @@ const sidebarConfig = {
102
111
 
103
112
  };
104
113
  exports.sidebarConfig = sidebarConfig;
114
+
115
+ const ProposalsBlockTitle = function () {
116
+ const {
117
+ spawnTab
118
+ } = (0, _react.useContext)(_paneronExtensionKit.TabbedWorkspaceContext);
119
+ const {
120
+ stakeholder
121
+ } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
122
+ return (0, _react2.jsx)("div", {
123
+ css: (0, _react2.css)`display: flex; justify-content: space-between; align-items: center;`
124
+ }, "Pending proposals", stakeholder && ((0, _stakeholder.canImportCR)(stakeholder) || (0, _stakeholder.canCreateCR)(stakeholder)) ? (0, _react2.jsx)(_core.Button, {
125
+ minimal: true,
126
+ small: true,
127
+ intent: "primary",
128
+ onClick: evt => {
129
+ evt.stopPropagation();
130
+ spawnTab(_protocolRegistry.Protocols.PROPOSAL_WORK);
131
+ }
132
+ }, "Propose\u2026") : null);
133
+ };
134
+
105
135
  const sidebarConfigForStakeholder = (0, _immutabilityHelper.default)(sidebarConfig, {
106
136
  Browse: {
107
137
  blocks: {
108
138
  $splice: [[0, 0, {
109
139
  key: 'proposals',
110
- title: "Pending proposals",
111
- content: (0, _react.jsx)(_Tree2.default, null),
140
+ title: (0, _react2.jsx)(ProposalsBlockTitle, null),
141
+ content: (0, _react2.jsx)(_Tree2.default, null),
112
142
  nonCollapsible: false,
113
143
  height: 200
114
144
  }]]
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/sidebar/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,4BAA4B;AAC5B,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,OAAO,WAAW,MAAM,sDAAsD,CAAC;AAE/E,gCAAgC;AAChC,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,gCAAgC;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,gBAAgB,MAAM,uCAAuC,CAAC;AACrE,gEAAgE;AAGhE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ;IACR,iBAAiB;IACjB,WAAW;CACH,CAAC;AAIX,MAAM,CAAC,MAAM,aAAa,GAA0C;IAClE,MAAM,EAAE;QACN,IAAI,EAAE,GAAG,EAAE,CAAC,IAAC,IAAI,IAAC,IAAI,EAAC,MAAM,GAAG;QAChC,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,CAAC;gBACP,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,aAAK,GAAG,EAAE,GAAG,CAAA,+CAA+C;;oBAEjE,IAAC,WAAW,IAAC,OAAO,EAAC,8CAA8C,GAAG,CAClE;gBACN,OAAO,EAAE,IAAC,aAAa,OAAG;gBAC1B,cAAc,EAAE,KAAK;gBACrB,mEAAmE;gBACnE,MAAM,EAAE,GAAG;gBACb,MAAM;gBACN,kBAAkB;gBAClB,wBAAwB;gBACxB,iEAAiE;gBACjE,0BAA0B;gBAC1B,gBAAgB;aACf,EAAE;gBACD,GAAG,EAAE,kBAAkB;gBACvB,KAAK,EAAE,kBAAkB;gBACzB,OAAO,EAAE,IAAC,yBAAyB,OAAG;gBACtC,cAAc,EAAE,KAAK;gBACrB,MAAM,EAAE,GAAG;aACZ,CAAC;KACH;IACD,kBAAkB;IAClB,2CAA2C;IAC3C,wBAAwB;IACxB,eAAe;IACf,0BAA0B;IAC1B,4EAA4E;IAC5E,0BAA0B;IAC1B,4IAA4I;IAC5I,cAAc;IACd,+CAA+C;IAC/C,mBAAmB;IACnB,SAAS;IACT,yBAAyB;IACzB,4EAA4E;IAC5E,gBAAgB;IAChB,oIAAoI;IACpI,cAAc;IACd,8CAA8C;IAC9C,mBAAmB;IACnB,QAAQ;IACR,KAAK;IACL,YAAY;IACZ,yCAAyC;IACzC,wCAAwC;IACxC,eAAe;IACf,qBAAqB;IACrB,+BAA+B;IAC/B,kCAAkC;IAClC,4BAA4B;IAC5B,SAAS;IACT,qBAAqB;IACrB,+BAA+B;IAC/B,kCAAkC;IAClC,6BAA6B;IAC7B,gCAAgC;IAChC,QAAQ;IACR,KAAK;CACN,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAA0C,MAAM,CACtF,aAAa,EAAE;IACb,MAAM,EAAE;QACN,MAAM,EAAE;YACN,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;wBACf,GAAG,EAAE,WAAW;wBAChB,KAAK,EAAE,mBAAmB;wBAC1B,OAAO,EAAE,IAAC,gBAAgB,OAAG;wBAC7B,cAAc,EAAE,KAAK;wBACrB,MAAM,EAAE,GAAG;qBACZ,CAAC,CAAC;SACJ;KACF;CACF,CAAC,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\n//import React from 'react';\nimport update from 'immutability-helper';\nimport { jsx, css } from '@emotion/react';\nimport { Icon } from '@blueprintjs/core';\n\nimport type { SuperSidebarConfig } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/types';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\n\n//import Browse from './Browse';\nimport ItemClassTree from '../../item-classes/Tree';\n//import Search from './Search';\nimport { ChangeRequestHistoryBlock } from './Registration';\nimport ActionableCRTree from '../../proposals/actionableGroups/Tree';\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\nexport const sidebarConfigForStakeholder: SuperSidebarConfig<typeof sidebarIDs> = update(\n sidebarConfig, {\n Browse: {\n blocks: {\n $splice: [[0, 0, {\n key: 'proposals',\n title: \"Pending proposals\",\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 } = 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"]}
package/views/util.d.ts CHANGED
@@ -24,11 +24,16 @@ 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
+ useUTC?: boolean;
28
+ showTime?: boolean;
27
29
  title?: string;
28
30
  className?: string;
29
31
  }>;
30
32
  /** Foramts given date as plain text. */
31
- export declare function formatDate(date: Date): string;
33
+ export declare function formatDate(date: Date, opts?: {
34
+ useUTC?: boolean;
35
+ showTime?: boolean;
36
+ }): string;
32
37
  export declare const _getRelatedClass: (classes: Record<string, ItemClassConfiguration<any>>) => (clsID: string) => RelatedItemClassConfiguration;
33
38
  export declare type ClassificationEntry = TagProps & {
34
39
  tooltip?: HelpTooltipProps;
package/views/util.js CHANGED
@@ -15,6 +15,8 @@ exports.ItemClassMenu = exports.MoreMenu = exports.FormGroupAsCardInGrid = expor
15
15
 
16
16
  var _format = _interopRequireDefault(require("date-fns/format"));
17
17
 
18
+ var _dateFnsTz = require("date-fns-tz");
19
+
18
20
  var _react = _interopRequireWildcard(require("react"));
19
21
 
20
22
  var _reactHelmet = require("react-helmet");
@@ -29,6 +31,8 @@ var _context = require("@riboseinc/paneron-extension-kit/context");
29
31
 
30
32
  var _HelpTooltip = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/HelpTooltip"));
31
33
 
34
+ var _BrowserCtx = require("./BrowserCtx");
35
+
32
36
  var _GenericRelatedItemView = require("./GenericRelatedItemView");
33
37
 
34
38
  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); }
@@ -51,12 +55,17 @@ function maybeEllipsizeString(str, maxLength = 20) {
51
55
  }
52
56
 
53
57
  const RegisterHelmet = (0, _react.memo)(function (props) {
58
+ var _a, _b;
59
+
54
60
  const {
55
61
  title: datasetTitle
56
62
  } = (0, _react.useContext)(_context.DatasetContext);
63
+ const {
64
+ registerMetadata
65
+ } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
57
66
  return (0, _react2.jsx)(_reactHelmet.Helmet, {
58
- titleTemplate: `%s in ${datasetTitle} register`,
59
- defaultTitle: `${datasetTitle} register`
67
+ titleTemplate: `%s in ${(_a = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.name) !== null && _a !== void 0 ? _a : datasetTitle}`,
68
+ defaultTitle: `${(_b = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.name) !== null && _b !== void 0 ? _b : datasetTitle}`
60
69
  }, props.children);
61
70
  });
62
71
  /**
@@ -108,25 +117,38 @@ exports.PropertyDetailView = PropertyDetailView;
108
117
 
109
118
  const Datestamp = function ({
110
119
  date,
120
+ useUTC,
121
+ showTime,
111
122
  title,
112
123
  className
113
124
  }) {
114
125
  var _a;
115
126
 
116
- const asString = formatDate(date);
127
+ const asString = formatDate(date, {
128
+ useUTC,
129
+ showTime
130
+ });
117
131
  return (0, _react2.jsx)("span", {
118
132
  className: className,
119
133
  title: `${title ? `${title}: ` : ''}${(_a = date === null || date === void 0 ? void 0 : date.toString()) !== null && _a !== void 0 ? _a : 'N/A'}`
120
134
  }, asString);
121
135
  };
136
+
137
+ exports.Datestamp = Datestamp;
138
+
139
+ function formatInTimeZone(date, fmt, tz) {
140
+ return (0, _dateFnsTz.format)((0, _dateFnsTz.utcToZonedTime)(date, tz), fmt, {
141
+ timeZone: tz
142
+ });
143
+ }
122
144
  /** Foramts given date as plain text. */
123
145
 
124
146
 
125
- exports.Datestamp = Datestamp;
147
+ 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';
126
149
 
127
- function formatDate(date) {
128
150
  try {
129
- return (0, _format.default)(date, 'yyyy-MM-dd');
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);
130
152
  } catch (e) {
131
153
  console.error("Failed to format date", date, typeof date);
132
154
  return `Invalid date (${e})`;
@@ -180,7 +202,7 @@ const TabContentsWithHeader = function ({
180
202
  className: className
181
203
  }, smallTitle ? (0, _react2.jsx)(_core.H4, {
182
204
  css: (0, _react2.css)`margin: 0 ${paddingPx}px;`
183
- }, title) : (0, _react2.jsx)(_core.H2, {
205
+ }, title) : (0, _react2.jsx)(_core.H3, {
184
206
  css: (0, _react2.css)`margin: 0 ${paddingPx}px;`
185
207
  }, title), hasClassification ? (0, _react2.jsx)("div", {
186
208
  css: (0, _react2.css)`
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 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 H2, 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 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\n return (\n <Helmet\n titleTemplate={`%s in ${datasetTitle} register`}\n defaultTitle={`${datasetTitle} register`}>\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 title?: string\n className?: string\n}> = function ({ date, title, className }) {\n const asString = formatDate(date);\n return <span\n className={className}\n title={`${title ? `${title}: ` : ''}${date?.toString() ?? 'N/A'}`}>\n {asString}\n </span>;\n};\n\n\n/** Foramts given date as plain text. */\nexport function formatDate(date: Date): string {\n try {\n return format(date, 'yyyy-MM-dd');\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 : <H2 css={css`margin: 0 ${paddingPx}px;`}>{title}</H2>}\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":"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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"]}