@riboseinc/paneron-registry-kit 2.2.30 → 2.2.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/item-classes/Tree.d.ts +5 -0
- package/item-classes/Tree.js +115 -0
- package/item-classes/Tree.js.map +1 -0
- package/item-classes/treeNodes.d.ts +12 -0
- package/item-classes/treeNodes.js +68 -0
- package/item-classes/treeNodes.js.map +1 -0
- package/package.json +2 -2
- package/proposals/actionableGroups/Tree.d.ts +7 -0
- package/proposals/actionableGroups/Tree.js +179 -0
- package/proposals/actionableGroups/Tree.js.map +1 -0
- package/proposals/actionableGroups/queries.d.ts +5 -0
- package/proposals/actionableGroups/queries.js +81 -0
- package/proposals/actionableGroups/queries.js.map +1 -0
- package/proposals/actionableGroups/treeNodes.d.ts +26 -0
- package/proposals/actionableGroups/treeNodes.js +96 -0
- package/proposals/actionableGroups/treeNodes.js.map +1 -0
- package/proposals/actionableGroups/types.d.ts +6 -0
- package/proposals/actionableGroups/types.js +5 -0
- package/proposals/actionableGroups/types.js.map +1 -0
- package/types/cr.d.ts +1 -0
- package/types/cr.js.map +1 -1
- package/types/register.d.ts +4 -1
- package/types/register.js.map +1 -1
- package/types/stakeholder.d.ts +22 -41
- package/types/stakeholder.js +34 -16
- package/types/stakeholder.js.map +1 -1
- package/types/views.d.ts +2 -0
- package/types/views.js.map +1 -1
- package/views/BrowserCtx.d.ts +1 -1
- package/views/BrowserCtx.js.map +1 -1
- package/views/GenericRelatedItemView.js +21 -8
- package/views/GenericRelatedItemView.js.map +1 -1
- package/views/ItemDetailsDrawer.d.ts +1 -0
- package/views/ItemDetailsDrawer.js +4 -2
- package/views/ItemDetailsDrawer.js.map +1 -1
- package/views/ItemSearchDrawer.js +1 -1
- package/views/ItemSearchDrawer.js.map +1 -1
- package/views/RegisterStakeholder.js +2 -2
- package/views/RegisterStakeholder.js.map +1 -1
- package/views/StatefulTree.d.ts +28 -0
- package/views/StatefulTree.js +131 -0
- package/views/StatefulTree.js.map +1 -0
- package/views/change-request/TransitionHistory.js +6 -3
- package/views/change-request/TransitionHistory.js.map +1 -1
- package/views/change-request/TransitionOptions.js +37 -13
- package/views/change-request/TransitionOptions.js.map +1 -1
- package/views/detail/RegisterHome/index.js +20 -79
- package/views/detail/RegisterHome/index.js.map +1 -1
- package/views/detail/RegisterItem/index.d.ts +2 -2
- package/views/detail/RegisterItem/index.js +7 -2
- package/views/detail/RegisterItem/index.js.map +1 -1
- package/views/detail/RegisterItemClass.d.ts +12 -0
- package/views/detail/RegisterItemClass.js +98 -0
- package/views/detail/RegisterItemClass.js.map +1 -0
- package/views/detail/RegisterMeta/RegisterMetaForm.js +272 -114
- package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
- package/views/detail/RegisterMeta/index.js +1 -1
- package/views/detail/RegisterMeta/index.js.map +1 -1
- package/views/index.js +63 -6
- package/views/index.js.map +1 -1
- package/views/protocolRegistry.d.ts +1 -0
- package/views/protocolRegistry.js +4 -0
- package/views/protocolRegistry.js.map +1 -1
- package/views/sidebar/Browse/index.js +8 -44
- package/views/sidebar/Browse/index.js.map +1 -1
- package/views/sidebar/Registration/index.js.map +1 -1
- package/views/sidebar/index.d.ts +2 -1
- package/views/sidebar/index.js +77 -62
- package/views/sidebar/index.js.map +1 -1
- package/views/util.d.ts +5 -0
- package/views/util.js +42 -4
- package/views/util.js.map +1 -1
|
@@ -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 '../../../types/cr';\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\n\nconst CR_BASE_QUERY = 'objPath.indexOf(\"/proposals/\") === 0 && objPath.endsWith(\"main.yaml\")';\nexport const DISPOSED_CR_QUERY = 'obj.timeDisposed !== undefined && obj.timeDisposed !== null';\n\n\ninterface ChangeRequestBlockState {\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\nconst initialState: ChangeRequestBlockState = {\n quickSubstringQuery: '',\n selectedItemPath: null,\n};\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 \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, 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 '../../../types/cr';\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\n\nconst CR_BASE_QUERY = 'objPath.indexOf(\"/proposals/\") === 0 && objPath.endsWith(\"main.yaml\")';\nexport const DISPOSED_CR_QUERY = 'obj.timeDisposed !== undefined && obj.timeDisposed !== null';\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 \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"]}
|
package/views/sidebar/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** @jsx jsx */
|
|
2
2
|
/** @jsxFrag React.Fragment */
|
|
3
3
|
import type { SuperSidebarConfig } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/types';
|
|
4
|
-
export declare const sidebarIDs: readonly ["Browse"
|
|
4
|
+
export declare const sidebarIDs: readonly ["Browse"];
|
|
5
5
|
export declare type SidebarID = typeof sidebarIDs[number];
|
|
6
6
|
export declare const sidebarConfig: SuperSidebarConfig<typeof sidebarIDs>;
|
|
7
|
+
export declare const sidebarConfigForStakeholder: SuperSidebarConfig<typeof sidebarIDs>;
|
package/views/sidebar/index.js
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.sidebarConfig = exports.sidebarIDs = void 0;
|
|
6
|
+
exports.sidebarConfigForStakeholder = exports.sidebarConfig = exports.sidebarIDs = void 0;
|
|
7
|
+
|
|
8
|
+
var _immutabilityHelper = _interopRequireDefault(require("immutability-helper"));
|
|
7
9
|
|
|
8
10
|
var _react = require("@emotion/react");
|
|
9
11
|
|
|
@@ -11,13 +13,11 @@ var _core = require("@blueprintjs/core");
|
|
|
11
13
|
|
|
12
14
|
var _HelpTooltip = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/HelpTooltip"));
|
|
13
15
|
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
var _Search = _interopRequireDefault(require("./Search"));
|
|
16
|
+
var _Tree = _interopRequireDefault(require("../../item-classes/Tree"));
|
|
17
17
|
|
|
18
18
|
var _Registration = require("./Registration");
|
|
19
19
|
|
|
20
|
-
var
|
|
20
|
+
var _Tree2 = _interopRequireDefault(require("../../proposals/actionableGroups/Tree"));
|
|
21
21
|
|
|
22
22
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
23
|
|
|
@@ -25,79 +25,94 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
25
25
|
|
|
26
26
|
/** @jsxFrag React.Fragment */
|
|
27
27
|
//import React from 'react';
|
|
28
|
-
|
|
28
|
+
//import Browse from './Browse';
|
|
29
|
+
//import Search from './Search';
|
|
30
|
+
//import { ExportOptions, ImportOptions } from './ExportImport';
|
|
31
|
+
const sidebarIDs = ['Browse' //'Registration',
|
|
32
|
+
//'Export',
|
|
33
|
+
];
|
|
29
34
|
exports.sidebarIDs = sidebarIDs;
|
|
30
35
|
const sidebarConfig = {
|
|
31
36
|
Browse: {
|
|
32
37
|
icon: () => (0, _react.jsx)(_core.Icon, {
|
|
33
38
|
icon: "list"
|
|
34
39
|
}),
|
|
35
|
-
title: "
|
|
40
|
+
title: "Browse",
|
|
36
41
|
blocks: [{
|
|
37
42
|
key: 'browse',
|
|
38
43
|
title: (0, _react.jsx)("div", {
|
|
39
44
|
css: (0, _react.css)`display: flex; justify-content: space-between`
|
|
40
|
-
}, "
|
|
45
|
+
}, "Item classes", (0, _react.jsx)(_HelpTooltip.default, {
|
|
41
46
|
content: "Browse register items by pre-made categories"
|
|
42
47
|
})),
|
|
43
|
-
content: (0, _react.jsx)(
|
|
44
|
-
css: (0, _react.css)`position: absolute; inset: 0;`
|
|
45
|
-
}),
|
|
48
|
+
content: (0, _react.jsx)(_Tree.default, null),
|
|
46
49
|
nonCollapsible: false,
|
|
47
50
|
// These have to have height specified due to absolute positioning.
|
|
48
|
-
height: 400
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
nonCollapsible: false,
|
|
56
|
-
height: 400
|
|
57
|
-
}]
|
|
58
|
-
},
|
|
59
|
-
Registration: {
|
|
60
|
-
icon: () => (0, _react.jsx)(_core.Icon, {
|
|
61
|
-
icon: "lightbulb"
|
|
62
|
-
}),
|
|
63
|
-
title: "Proposals",
|
|
64
|
-
blocks: [{
|
|
65
|
-
key: 'pending-crs',
|
|
66
|
-
title: (0, _react.jsx)("div", {
|
|
67
|
-
css: (0, _react.css)`display: flex; justify-content: space-between`
|
|
68
|
-
}, "Pending proposals", (0, _react.jsx)(_HelpTooltip.default, {
|
|
69
|
-
content: "Proposals pending decision. If a register item is selected, only proposals affecting that item are shown."
|
|
70
|
-
})),
|
|
71
|
-
content: (0, _react.jsx)(_Registration.PendingChangeRequestsBlock, null),
|
|
72
|
-
height: 300
|
|
51
|
+
height: 400 //}, {
|
|
52
|
+
// key: 'search',
|
|
53
|
+
// title: "New search",
|
|
54
|
+
// content: <Search css={css`position: absolute; inset: 0;`} />,
|
|
55
|
+
// nonCollapsible: false,
|
|
56
|
+
// height: 400,
|
|
57
|
+
|
|
73
58
|
}, {
|
|
74
|
-
key: '
|
|
75
|
-
title:
|
|
76
|
-
css: (0, _react.css)`display: flex; justify-content: space-between`
|
|
77
|
-
}, "History", (0, _react.jsx)(_HelpTooltip.default, {
|
|
78
|
-
content: "Resolved proposals. If a register item is selected, only proposals affecting that item are shown."
|
|
79
|
-
})),
|
|
59
|
+
key: 'proposal-history',
|
|
60
|
+
title: "Proposal history",
|
|
80
61
|
content: (0, _react.jsx)(_Registration.ChangeRequestHistoryBlock, null),
|
|
81
|
-
height: 300
|
|
82
|
-
}]
|
|
83
|
-
},
|
|
84
|
-
Export: {
|
|
85
|
-
icon: () => (0, _react.jsx)(_core.Icon, {
|
|
86
|
-
icon: "changes"
|
|
87
|
-
}),
|
|
88
|
-
title: "Import and export options",
|
|
89
|
-
blocks: [{
|
|
90
|
-
key: 'export',
|
|
91
|
-
title: "Export options",
|
|
92
|
-
content: (0, _react.jsx)(_ExportImport.ExportOptions, null),
|
|
93
|
-
nonCollapsible: true
|
|
94
|
-
}, {
|
|
95
|
-
key: 'import',
|
|
96
|
-
title: "Import options",
|
|
97
|
-
content: (0, _react.jsx)(_ExportImport.ImportOptions, null),
|
|
98
62
|
nonCollapsible: false,
|
|
99
|
-
|
|
63
|
+
height: 200
|
|
100
64
|
}]
|
|
101
|
-
}
|
|
65
|
+
} // Registration: {
|
|
66
|
+
// icon: () => <Icon icon="lightbulb" />,
|
|
67
|
+
// title: "Proposals",
|
|
68
|
+
// blocks: [{
|
|
69
|
+
// key: 'pending-crs',
|
|
70
|
+
// title: <div css={css`display: flex; justify-content: space-between`}>
|
|
71
|
+
// Pending proposals
|
|
72
|
+
// <HelpTooltip content="Proposals pending decision. If a register item is selected, only proposals affecting that item are shown." />
|
|
73
|
+
// </div>,
|
|
74
|
+
// content: <PendingChangeRequestsBlock />,
|
|
75
|
+
// height: 300,
|
|
76
|
+
// }, {
|
|
77
|
+
// key: 'cr-history',
|
|
78
|
+
// title: <div css={css`display: flex; justify-content: space-between`}>
|
|
79
|
+
// History
|
|
80
|
+
// <HelpTooltip content="Resolved proposals. If a register item is selected, only proposals affecting that item are shown." />
|
|
81
|
+
// </div>,
|
|
82
|
+
// content: <ChangeRequestHistoryBlock />,
|
|
83
|
+
// height: 300,
|
|
84
|
+
// }],
|
|
85
|
+
// },
|
|
86
|
+
// Export: {
|
|
87
|
+
// icon: () => <Icon icon="changes" />,
|
|
88
|
+
// title: "Import and export options",
|
|
89
|
+
// blocks: [{
|
|
90
|
+
// key: 'export',
|
|
91
|
+
// title: "Export options",
|
|
92
|
+
// content: <ExportOptions />,
|
|
93
|
+
// nonCollapsible: true,
|
|
94
|
+
// }, {
|
|
95
|
+
// key: 'import',
|
|
96
|
+
// title: "Import options",
|
|
97
|
+
// content: <ImportOptions />,
|
|
98
|
+
// nonCollapsible: false,
|
|
99
|
+
// collapsedByDefault: true,
|
|
100
|
+
// }],
|
|
101
|
+
// },
|
|
102
|
+
|
|
102
103
|
};
|
|
103
|
-
exports.sidebarConfig = sidebarConfig;
|
|
104
|
+
exports.sidebarConfig = sidebarConfig;
|
|
105
|
+
const sidebarConfigForStakeholder = (0, _immutabilityHelper.default)(sidebarConfig, {
|
|
106
|
+
Browse: {
|
|
107
|
+
blocks: {
|
|
108
|
+
$splice: [[0, 0, {
|
|
109
|
+
key: 'proposals',
|
|
110
|
+
title: "Pending proposals",
|
|
111
|
+
content: (0, _react.jsx)(_Tree2.default, null),
|
|
112
|
+
nonCollapsible: false,
|
|
113
|
+
height: 200
|
|
114
|
+
}]]
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
exports.sidebarConfigForStakeholder = sidebarConfigForStakeholder;
|
|
@@ -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,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,OAAO,WAAW,MAAM,sDAAsD,CAAC;AAE/E,
|
|
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"]}
|
package/views/util.d.ts
CHANGED
|
@@ -78,3 +78,8 @@ export declare const CardInGrid: React.FC<{
|
|
|
78
78
|
export declare const FormGroupAsCardInGrid: React.FC<FormGroupProps & {
|
|
79
79
|
paddingPx?: number;
|
|
80
80
|
}>;
|
|
81
|
+
export declare const MoreMenu: React.FC<Record<never, never>>;
|
|
82
|
+
export declare const ItemClassMenu: React.FC<{
|
|
83
|
+
cfg: ItemClassConfiguration<any>;
|
|
84
|
+
onCreate?: () => void;
|
|
85
|
+
}>;
|
package/views/util.js
CHANGED
|
@@ -11,11 +11,11 @@ Object.defineProperty(exports, "GenericRelatedItemView", {
|
|
|
11
11
|
return _GenericRelatedItemView.GenericRelatedItemView;
|
|
12
12
|
}
|
|
13
13
|
});
|
|
14
|
-
exports.FormGroupAsCardInGrid = exports.CardInGrid = exports.TabContentsWithHeader = exports._getRelatedClass = exports.Datestamp = exports.PropertyDetailView = exports.RegisterHelmet = void 0;
|
|
14
|
+
exports.ItemClassMenu = exports.MoreMenu = exports.FormGroupAsCardInGrid = exports.CardInGrid = exports.TabContentsWithHeader = exports._getRelatedClass = exports.Datestamp = exports.PropertyDetailView = exports.RegisterHelmet = void 0;
|
|
15
15
|
|
|
16
16
|
var _format = _interopRequireDefault(require("date-fns/format"));
|
|
17
17
|
|
|
18
|
-
var _react = require("react");
|
|
18
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
19
19
|
|
|
20
20
|
var _reactHelmet = require("react-helmet");
|
|
21
21
|
|
|
@@ -31,6 +31,10 @@ var _HelpTooltip = _interopRequireDefault(require("@riboseinc/paneron-extension-
|
|
|
31
31
|
|
|
32
32
|
var _GenericRelatedItemView = require("./GenericRelatedItemView");
|
|
33
33
|
|
|
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
|
+
|
|
34
38
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
35
39
|
|
|
36
40
|
/** @jsx jsx */
|
|
@@ -341,8 +345,42 @@ const FormGroupAsCardInGrid = function ({
|
|
|
341
345
|
background: ${_core.Colors.WHITE};
|
|
342
346
|
.bp4-dark & { background: ${_core.Colors.DARK_GRAY3}; }
|
|
343
347
|
`,
|
|
344
|
-
className: _core.Classes.ELEVATION_3
|
|
348
|
+
className: `${_core.Classes.ELEVATION_3} ${props.className}`
|
|
345
349
|
});
|
|
346
350
|
};
|
|
347
351
|
|
|
348
|
-
exports.FormGroupAsCardInGrid = FormGroupAsCardInGrid;
|
|
352
|
+
exports.FormGroupAsCardInGrid = FormGroupAsCardInGrid;
|
|
353
|
+
const MoreMenu = (0, _react.memo)(function ({
|
|
354
|
+
children
|
|
355
|
+
}) {
|
|
356
|
+
return (0, _react2.jsx)(_popover.Popover2, {
|
|
357
|
+
minimal: true,
|
|
358
|
+
content: (0, _react2.jsx)(_react.default.Fragment, null, children)
|
|
359
|
+
}, (0, _react2.jsx)(_core.Button, {
|
|
360
|
+
icon: "more",
|
|
361
|
+
small: true,
|
|
362
|
+
minimal: true
|
|
363
|
+
}));
|
|
364
|
+
});
|
|
365
|
+
exports.MoreMenu = MoreMenu;
|
|
366
|
+
const ItemClassMenu = (0, _react.memo)(function ({
|
|
367
|
+
cfg,
|
|
368
|
+
onCreate
|
|
369
|
+
}) {
|
|
370
|
+
return (0, _react2.jsx)(_core.Menu, null, (0, _react2.jsx)(_core.MenuDivider, {
|
|
371
|
+
title: "About this class"
|
|
372
|
+
}), (0, _react2.jsx)(_core.MenuItem, {
|
|
373
|
+
multiline: true,
|
|
374
|
+
disabled: true,
|
|
375
|
+
css: (0, _react2.css)`max-width: 400px`,
|
|
376
|
+
text: cfg.meta.description
|
|
377
|
+
}), onCreate ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.MenuDivider, {
|
|
378
|
+
title: "Quick actions"
|
|
379
|
+
}), (0, _react2.jsx)(_core.MenuItem, {
|
|
380
|
+
text: "Propose new",
|
|
381
|
+
intent: "primary",
|
|
382
|
+
onClick: onCreate,
|
|
383
|
+
icon: "plus"
|
|
384
|
+
})) : null);
|
|
385
|
+
});
|
|
386
|
+
exports.ItemClassMenu = ItemClassMenu;
|
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 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 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}\n />\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 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 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"]}
|