@riboseinc/paneron-registry-kit 2.2.36 → 2.2.38

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 (36) hide show
  1. package/package.json +2 -2
  2. package/proposals/ListItem.d.ts +1 -0
  3. package/proposals/ListItem.js +4 -1
  4. package/proposals/ListItem.js.map +1 -1
  5. package/proposals/MetaProperties.d.ts +4 -3
  6. package/proposals/MetaProperties.js +26 -19
  7. package/proposals/MetaProperties.js.map +1 -1
  8. package/proposals/ProposalTab.d.ts +2 -0
  9. package/proposals/ProposalTab.js +12 -1
  10. package/proposals/ProposalTab.js.map +1 -1
  11. package/proposals/ProposalWorkspace.d.ts +3 -1
  12. package/proposals/ProposalWorkspace.js +9 -7
  13. package/proposals/ProposalWorkspace.js.map +1 -1
  14. package/proposals/TransitionHistory.js +10 -4
  15. package/proposals/TransitionHistory.js.map +1 -1
  16. package/proposals/actionableGroups/Tree.js +15 -0
  17. package/proposals/actionableGroups/Tree.js.map +1 -1
  18. package/proposals/actionableGroups/treeNodes.js +9 -5
  19. package/proposals/actionableGroups/treeNodes.js.map +1 -1
  20. package/views/detail/AllItems.d.ts +8 -0
  21. package/views/detail/AllItems.js +45 -0
  22. package/views/detail/AllItems.js.map +1 -0
  23. package/views/detail/ProposalWork.js +3 -1
  24. package/views/detail/ProposalWork.js.map +1 -1
  25. package/views/detail/RegisterHome/ActiveProposalDetails.js +6 -1
  26. package/views/detail/RegisterHome/ActiveProposalDetails.js.map +1 -1
  27. package/views/detail/RegisterHome2/index.js +12 -3
  28. package/views/detail/RegisterHome2/index.js.map +1 -1
  29. package/views/sidebar/Search/index.d.ts +2 -0
  30. package/views/sidebar/Search/index.js +15 -3
  31. package/views/sidebar/Search/index.js.map +1 -1
  32. package/views/sidebar/index.js +9 -3
  33. package/views/sidebar/index.js.map +1 -1
  34. package/views/util.d.ts +8 -0
  35. package/views/util.js +10 -3
  36. package/views/util.js.map +1 -1
@@ -38,11 +38,13 @@ function getActionableProposalGroupsAsTreeNodes(groups, opts) {
38
38
  id: groupLabel,
39
39
  label: groupLabel,
40
40
  hasCaret: true,
41
+ className: hasActiveProposal ? 'tree-node-proposal-group-with-active-proposal' : undefined,
41
42
  secondaryLabel: hasActiveProposal && !isExpanded ? (0, _react2.jsx)(ActiveMarker, {
42
- isActive: true
43
+ isActive: true,
44
+ title: "A proposal in this group is currently active, expand group to see it"
43
45
  }) : (0, _react2.jsx)(_core.Tag, {
44
46
  minimal: !hasProposals,
45
- intent: hasProposals ? 'primary' : undefined
47
+ intent: hasProposals ? 'warning' : undefined
46
48
  }, hasProposals ? proposals.length : 0),
47
49
  icon: isExpanded ? 'folder-open' : 'folder-close',
48
50
  isExpanded,
@@ -61,6 +63,7 @@ function getActionableProposalGroupsAsTreeNodes(groups, opts) {
61
63
 
62
64
  const ActiveMarker = function ({
63
65
  onToggle,
66
+ title,
64
67
  isActive
65
68
  }) {
66
69
  const handleClick = (0, _react.useCallback)(evt => {
@@ -70,9 +73,9 @@ const ActiveMarker = function ({
70
73
  return (0, _react2.jsx)(_core.Button, {
71
74
  icon: "eye-open",
72
75
  small: true,
73
- outlined: true,
76
+ title: title !== null && title !== void 0 ? title : onToggle ? isActive ? "Click to deactivate (exit) this proposal" : "Click to activate this proposal" : undefined,
74
77
  active: isActive,
75
- intent: isActive ? 'danger' : undefined,
78
+ intent: isActive ? 'danger' : 'primary',
76
79
  disabled: !onToggle,
77
80
  onClick: handleClick
78
81
  });
@@ -84,10 +87,11 @@ function getActionableProposalTreeNode(proposal, opts) {
84
87
  return {
85
88
  id: proposal.id,
86
89
  label: (0, _react2.jsx)("span", {
87
- title: `Double-click the proposal to activate: “${proposal.justification}”`
90
+ title: `“${proposal.justification}” — double-click to open & activate this proposal`
88
91
  }, proposal.justification),
89
92
  isSelected: (_a = opts === null || opts === void 0 ? void 0 : opts.isSelected) !== null && _a !== void 0 ? _a : false,
90
93
  icon: 'lightbulb',
94
+ className: (opts === null || opts === void 0 ? void 0 : opts.isActive) ? 'tree-node-active-proposal' : undefined,
91
95
  secondaryLabel: (opts === null || opts === void 0 ? void 0 : opts.isActive) ? (0, _react2.jsx)(ActiveMarker, {
92
96
  isActive: true,
93
97
  onToggle: opts.onActivateCR ? () => {
@@ -1 +1 @@
1
- {"version":3,"file":"treeNodes.js","sourceRoot":"","sources":["../../../src/proposals/actionableGroups/treeNodes.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\n/**\n * Tools for rendering proposal groups as tree nodes.\n * Each proposal group is top-level node, with proposals as nested nodes.\n */\n\nimport React, { useCallback } from 'react';\nimport { jsx } from '@emotion/react';\n\nimport { Button, Tag } from '@blueprintjs/core';\nimport type { IconName, TreeNodeInfo } from '@blueprintjs/core';\nimport type { RegisterStakeholder } from '../../types';\nimport type { SomeCR as CR } from '../types';\nimport type { ActionableProposalGroup } from './types';\nimport { CR_BASE_QUERY } from '../queries';\n\n\nexport type ActionableProposalTreeNode = TreeNodeInfo<{ type: 'group' | 'item' }>;\n\n\ninterface ActionableProposalGroupResult {\n groupLabel: string\n proposals: CR[] | undefined\n}\nexport function getActionableProposalGroupsAsTreeNodes(\n groups: readonly ActionableProposalGroupResult[],\n opts?: {\n expandedGroupLabels?: Set<string>\n selectedGroup?: string\n selectedCRID?: string\n activeCRID?: string\n onActivateCR?: (crID: string | null) => void | Promise<void>\n },\n): ActionableProposalTreeNode[] {\n return groups.\n //filter(({ proposals }) => proposals && proposals.length > 0).\n map(({ groupLabel, proposals }) => {\n const hasProposals = proposals && proposals.length > 0;\n const hasActiveProposal = hasProposals\n && opts?.activeCRID && proposals.find(p => p.id === opts.activeCRID);\n const hasSelectedProposal = hasProposals\n && opts?.selectedCRID && proposals.find(p => p.id === opts.selectedCRID);\n const isExpanded =\n groups.length === 1\n || opts?.expandedGroupLabels?.has(groupLabel)\n || hasSelectedProposal\n ? true\n : false;\n\n return {\n id: groupLabel,\n label: groupLabel,\n hasCaret: true,\n secondaryLabel:\n hasActiveProposal && !isExpanded\n ? <ActiveMarker isActive />\n : <Tag\n minimal={!hasProposals}\n intent={hasProposals ? 'primary' : undefined}>\n {hasProposals ? proposals.length : 0}\n </Tag>,\n icon: isExpanded\n ? 'folder-open'\n : 'folder-close' as IconName,\n isExpanded,\n isSelected: groupLabel === opts?.selectedGroup,\n nodeData: { type: 'group' },\n childNodes: hasProposals && isExpanded\n ? proposals.map(p => getActionableProposalTreeNode(p, {\n isSelected: p.id === opts?.selectedCRID,\n isActive: p.id === opts?.activeCRID,\n onActivateCR: opts?.onActivateCR,\n }))\n : [],\n };\n });\n}\n\nconst ActiveMarker: React.FC<{\n isActive?: boolean\n onToggle?: () => void\n}> = function ({ onToggle, isActive }) {\n const handleClick = useCallback(\n ((evt: React.MouseEvent<any>) => {\n evt.stopPropagation();\n onToggle?.();\n }),\n [onToggle]);\n return <Button\n icon=\"eye-open\"\n small outlined\n active={isActive}\n intent={isActive ? 'danger' : undefined}\n disabled={!onToggle}\n onClick={handleClick}\n />\n};\n\n\nfunction getActionableProposalTreeNode(\n proposal: CR,\n opts?: {\n isSelected?: boolean\n isActive?: boolean\n onActivateCR?: (crID: string | null) => void\n },\n): ActionableProposalTreeNode {\n return {\n id: proposal.id,\n label: <span title={`Double-click the proposal to activate: “${proposal.justification}”`}>\n {proposal.justification}\n </span>,\n isSelected: opts?.isSelected ?? false,\n icon: 'lightbulb',\n secondaryLabel: opts?.isActive\n ? <ActiveMarker isActive onToggle={opts.onActivateCR ? () => opts?.onActivateCR?.(null) : undefined} />\n : <ActiveMarker onToggle={opts?.onActivateCR ? () => opts?.onActivateCR?.(proposal.id) : undefined} />,\n nodeData: { type: 'item' },\n };\n}\n\n\nexport function getMapReduceChainsForActionableProposalGroups(\n proposalGroups: readonly ActionableProposalGroup[],\n stakeholder: RegisterStakeholder,\n) {\n return proposalGroups.map(([label, , queryGetter]) => {\n const query = queryGetter(stakeholder);\n const predicateFunc = `\n const objPath = key, obj = value;\n return ((${CR_BASE_QUERY}) && (${query}));\n `;\n const mapFunc = `emit(value);`;\n return { [label]: { mapFunc, predicateFunc } };\n }).reduce((prev, curr) => ({ ...prev, ...curr }), {});\n}\n"]}
1
+ {"version":3,"file":"treeNodes.js","sourceRoot":"","sources":["../../../src/proposals/actionableGroups/treeNodes.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\n/**\n * Tools for rendering proposal groups as tree nodes.\n * Each proposal group is top-level node, with proposals as nested nodes.\n */\n\nimport React, { useCallback } from 'react';\nimport { jsx } from '@emotion/react';\n\nimport { Button, Tag } from '@blueprintjs/core';\nimport type { IconName, TreeNodeInfo } from '@blueprintjs/core';\nimport type { RegisterStakeholder } from '../../types';\nimport type { SomeCR as CR } from '../types';\nimport type { ActionableProposalGroup } from './types';\nimport { CR_BASE_QUERY } from '../queries';\n\n\nexport type ActionableProposalTreeNode = TreeNodeInfo<{ type: 'group' | 'item' }>;\n\n\ninterface ActionableProposalGroupResult {\n groupLabel: string\n proposals: CR[] | undefined\n}\nexport function getActionableProposalGroupsAsTreeNodes(\n groups: readonly ActionableProposalGroupResult[],\n opts?: {\n expandedGroupLabels?: Set<string>\n selectedGroup?: string\n selectedCRID?: string\n activeCRID?: string\n onActivateCR?: (crID: string | null) => void | Promise<void>\n },\n): ActionableProposalTreeNode[] {\n return groups.\n //filter(({ proposals }) => proposals && proposals.length > 0).\n map(({ groupLabel, proposals }) => {\n const hasProposals = proposals && proposals.length > 0;\n const hasActiveProposal = hasProposals\n && opts?.activeCRID && proposals.find(p => p.id === opts.activeCRID);\n const hasSelectedProposal = hasProposals\n && opts?.selectedCRID && proposals.find(p => p.id === opts.selectedCRID);\n const isExpanded =\n groups.length === 1\n || opts?.expandedGroupLabels?.has(groupLabel)\n || hasSelectedProposal\n ? true\n : false;\n\n return {\n id: groupLabel,\n label: groupLabel,\n hasCaret: true,\n className: hasActiveProposal\n ? 'tree-node-proposal-group-with-active-proposal'\n : undefined,\n secondaryLabel:\n hasActiveProposal && !isExpanded\n ? <ActiveMarker\n isActive\n title=\"A proposal in this group is currently active, expand group to see it\"\n />\n : <Tag\n minimal={!hasProposals}\n intent={hasProposals ? 'warning' : undefined}>\n {hasProposals ? proposals.length : 0}\n </Tag>,\n icon: isExpanded\n ? 'folder-open'\n : 'folder-close' as IconName,\n isExpanded,\n isSelected: groupLabel === opts?.selectedGroup,\n nodeData: { type: 'group' },\n childNodes: hasProposals && isExpanded\n ? proposals.map(p => getActionableProposalTreeNode(p, {\n isSelected: p.id === opts?.selectedCRID,\n isActive: p.id === opts?.activeCRID,\n onActivateCR: opts?.onActivateCR,\n }))\n : [],\n };\n });\n}\n\nconst ActiveMarker: React.FC<{\n isActive?: boolean\n onToggle?: () => void\n title?: string\n}> = function ({ onToggle, title, isActive }) {\n const handleClick = useCallback(\n ((evt: React.MouseEvent<any>) => {\n evt.stopPropagation();\n onToggle?.();\n }),\n [onToggle]);\n return <Button\n icon=\"eye-open\"\n small\n title={title ?? (onToggle\n ? isActive\n ? \"Click to deactivate (exit) this proposal\"\n : \"Click to activate this proposal\"\n : undefined)}\n active={isActive}\n intent={isActive ? 'danger' : 'primary'}\n disabled={!onToggle}\n onClick={handleClick}\n />\n};\n\n\nfunction getActionableProposalTreeNode(\n proposal: CR,\n opts?: {\n isSelected?: boolean\n isActive?: boolean\n onActivateCR?: (crID: string | null) => void\n },\n): ActionableProposalTreeNode {\n return {\n id: proposal.id,\n label: <span title={`“${proposal.justification}” — double-click to open & activate this proposal`}>\n {proposal.justification}\n </span>,\n isSelected: opts?.isSelected ?? false,\n icon: 'lightbulb',\n className: opts?.isActive\n ? 'tree-node-active-proposal'\n : undefined,\n secondaryLabel: opts?.isActive\n ? <ActiveMarker isActive onToggle={opts.onActivateCR ? () => opts?.onActivateCR?.(null) : undefined} />\n : <ActiveMarker onToggle={opts?.onActivateCR ? () => opts?.onActivateCR?.(proposal.id) : undefined} />,\n nodeData: { type: 'item' },\n };\n}\n\n\nexport function getMapReduceChainsForActionableProposalGroups(\n proposalGroups: readonly ActionableProposalGroup[],\n stakeholder: RegisterStakeholder,\n) {\n return proposalGroups.map(([label, , queryGetter]) => {\n const query = queryGetter(stakeholder);\n const predicateFunc = `\n const objPath = key, obj = value;\n return ((${CR_BASE_QUERY}) && (${query}));\n `;\n const mapFunc = `emit(value);`;\n return { [label]: { mapFunc, predicateFunc } };\n }).reduce((prev, curr) => ({ ...prev, ...curr }), {});\n}\n"]}
@@ -0,0 +1,8 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import React from 'react';
4
+ declare const _default: {
5
+ readonly main: React.VoidFunctionComponent<Record<never, never>>;
6
+ readonly title: "All items";
7
+ };
8
+ export default _default;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _react2 = require("@emotion/react");
11
+
12
+ var _core = require("@blueprintjs/core");
13
+
14
+ var _Search = _interopRequireDefault(require("../sidebar/Search"));
15
+
16
+ var _util = require("../util");
17
+
18
+ var _models = require("../FilterCriteria/models");
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
22
+ 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); }
23
+
24
+ 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; }
25
+
26
+ /** @jsx jsx */
27
+
28
+ /** @jsxFrag React.Fragment */
29
+ const ItemSearch = (0, _react.memo)(function () {
30
+ return (0, _react2.jsx)(_util.TabContentsWithHeader, {
31
+ title: (0, _react2.jsx)(_react.default.Fragment, null, "Search all items")
32
+ }, (0, _react2.jsx)(_core.Card, {
33
+ css: (0, _react2.css)`flex: 1; box-shadow: none !important; position: absolute; border-radius: 0; display: flex; flex-flow: column nowrap; padding: 10px;`
34
+ }, (0, _react2.jsx)(_util.RegisterHelmet, null, (0, _react2.jsx)("title", null, "Search all items")), (0, _react2.jsx)(_Search.default, {
35
+ css: (0, _react2.css)`flex: 1;`,
36
+ //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}
37
+ implicitCriteria: _models.MATCHES_ANY_CRITERIA,
38
+ stateName: `all-items-search`
39
+ })));
40
+ });
41
+ var _default = {
42
+ main: ItemSearch,
43
+ title: "All items"
44
+ };
45
+ exports.default = _default;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AllItems.js","sourceRoot":"","sources":["../../../src/views/detail/AllItems.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,IAAI,GACL,MAAM,mBAAmB,CAAC;AAC3B,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,cAAc,IAAI,MAAM,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGhE,MAAM,UAAU,GAChB,IAAI,CAAC;IACH,OAAO,CACL,IAAC,qBAAqB,IAClB,KAAK,EAAE,6CAAqB;QAC9B,IAAC,IAAI,IAAC,GAAG,EAAE,GAAG,CAAA,qIAAqI;YACjJ,IAAC,MAAM;gBAAC,sCAA+B,CAAS;YAChD,IAAC,MAAM,IACL,GAAG,EAAE,GAAG,CAAA,UAAU;gBAClB,iFAAiF;gBACjF,gBAAgB,EAAE,oBAAoB,EACtC,SAAS,EAAE,kBAAkB,GAE7B,CACG,CACe,CACzB,CAAC;AACJ,CAAC,CAAC,CAAC;AAGH,eAAe;IACb,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,WAAW;CACV,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n Card,\n} from '@blueprintjs/core';\nimport Search from '../sidebar/Search';\nimport { RegisterHelmet as Helmet } from '../util';\nimport { TabContentsWithHeader } from '../util';\nimport { MATCHES_ANY_CRITERIA } from '../FilterCriteria/models';\n\n\nconst ItemSearch: React.VoidFunctionComponent<Record<never, never>> =\nmemo(function () {\n return (\n <TabContentsWithHeader\n title={<>Search all items</>}>\n <Card css={css`flex: 1; box-shadow: none !important; position: absolute; border-radius: 0; display: flex; flex-flow: column nowrap; padding: 10px;`}>\n <Helmet><title>Search all items</title></Helmet>\n <Search\n css={css`flex: 1;`}\n //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}\n implicitCriteria={MATCHES_ANY_CRITERIA}\n stateName={`all-items-search`}\n //onOpenItem={onChooseItem ? handleOpenItem : undefined}\n />\n </Card>\n </TabContentsWithHeader>\n );\n});\n\n\nexport default {\n main: ItemSearch,\n title: \"All items\",\n} as const;\n"]}
@@ -61,6 +61,7 @@ const ProposalWork = (0, _react.memo)(function () {
61
61
  getObjectData,
62
62
  isBusy
63
63
  } = (0, _react.useContext)(_context.DatasetContext);
64
+ const handleDeactivate = (0, _react.useCallback)(() => setActiveChangeRequestID === null || setActiveChangeRequestID === void 0 ? void 0 : setActiveChangeRequestID(null), [setActiveChangeRequestID]);
64
65
  const handleDelete = (0, _react.useCallback)(async () => {
65
66
  if (deleteCR && activeCR && setActiveChangeRequestID) {
66
67
  await deleteCR();
@@ -194,7 +195,8 @@ const ProposalWork = (0, _react.memo)(function () {
194
195
  proposal: activeCR,
195
196
  register: register,
196
197
  stakeholder: stakeholder,
197
- onDelete: deleteCR ? handleDelete : undefined
198
+ onDelete: deleteCR ? handleDelete : undefined,
199
+ onDeactivate: setActiveChangeRequestID ? handleDeactivate : undefined
198
200
  });
199
201
  }
200
202
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ProposalWork.js","sourceRoot":"","sources":["../../../src/views/detail/ProposalWork.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo, useContext, useCallback, memo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { NonIdealState } from '@blueprintjs/core';\n\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\n\nimport { BrowserCtx } from '../BrowserCtx';\nimport { canImportCR, canCreateCR } from '../../types/stakeholder';\nimport { ChangeRequestContext } from '../../proposals/ChangeRequestContext';\nimport ProposalTab from '../../proposals/ProposalTab';\nimport NewProposalMenu from '../../proposals/NewProposalMenu';\nimport { isImportableCR } from '../../proposals/types';\nimport { itemPathToItemRef } from '../itemPathUtils';\nimport { formatDate } from '../util';\nimport useLatestAcceptedProposal from '../../views/hooks/useLatestAcceptedProposal';\nimport {\n newCRObjectChangeset,\n importedProposalToCRObjectChangeset,\n} from '../../proposals';\n\n\nconst ProposalWork: React.VoidFunctionComponent<Record<never, never>> =\nmemo(function () {\n const { changeRequest: activeCR, deleteCR } = useContext(ChangeRequestContext);\n const {\n registerMetadata: register,\n stakeholder,\n setActiveChangeRequestID,\n itemClasses,\n } = useContext(BrowserCtx);\n const {\n getMapReducedData,\n requestFileFromFilesystem,\n updateObjects,\n performOperation,\n getObjectData,\n isBusy,\n } = useContext(DatasetContext);\n\n const handleDelete = useCallback(async () => {\n if (deleteCR && activeCR && setActiveChangeRequestID) {\n await deleteCR();\n setActiveChangeRequestID(null);\n }\n }, [deleteCR, setActiveChangeRequestID]);\n\n let latestAcceptedProposal: ReturnType<typeof useLatestAcceptedProposal> | undefined;\n try {\n latestAcceptedProposal = useLatestAcceptedProposal();\n } catch (e) {\n console.error(\"Failed to obtain latest accepted proposal\");\n latestAcceptedProposal = undefined;\n }\n const getNewEmptyCRChangeset:\n undefined | ((idea: string) => Promise<[ObjectChangeset, string]>) =\n useMemo(() => {\n if (stakeholder && canCreateCR(stakeholder) && latestAcceptedProposal !== undefined) {\n return async function getNewEmptyCRChangeset (newIdea: string) {\n const crID = crypto.randomUUID();\n return [newCRObjectChangeset(\n crID,\n newIdea,\n latestAcceptedProposal?.id ?? 'initial',\n stakeholder!.gitServerUsername!,\n ), crID];\n };\n } else {\n return undefined;\n }\n }, [stakeholder, latestAcceptedProposal?.id]);\n\n const getImportedCRChangeset:\n undefined | (() => Promise<[ObjectChangeset, string]>) =\n useMemo(() => {\n if (requestFileFromFilesystem && stakeholder && canImportCR(stakeholder)) {\n return async function getImportedCRChangeset() {\n const data = await requestFileFromFilesystem({\n prompt: \"Select one register proposal JSON file\",\n filters: [\n { name: \"JSON files\", extensions: ['.json'] },\n ],\n });\n const fileData = Object.values(data)[0]!;\n if (!fileData) {\n throw new Error(\"No file was selected\");\n }\n if (isImportableCR(fileData)) {\n try {\n const [changeset, crID] = await importedProposalToCRObjectChangeset(\n fileData,\n itemClasses,\n stakeholder!.gitServerUsername!,\n getObjectData,\n async function resolvePredicates(predicates) {\n const mapReduceChains = [...predicates.values()].map(predicate => ({\n [predicate]: {\n mapFunc: `\n const data = value.data;\n if (!key.startsWith('/proposals/') && data && (${predicate})) {\n emit({ objectPath: key, objectData: value });\n }\n `,\n },\n })).reduce((prev, curr) => ({ ...prev, ...curr }), {});\n\n const result:\n Record<string, { objectPath: string, objectData: any }[] | {}> =\n await getMapReducedData({\n chains: mapReduceChains,\n });\n\n return Object.entries(result).map(([chainLabel, chainResult]) => {\n const objects =\n // Map returns an empty object if there’re no items,\n // but we promise to return a list.\n (Array.isArray(chainResult) ? chainResult : []);\n if (objects.length < 1) {\n throw new Error(`Unable to resolve predicate to item UUID: no item found matching predicate ${chainLabel}`);\n } else if (objects.length > 1) {\n const objectOverview = objects.map((o: any) => JSON.stringify(o)).join(', ')\n throw new Error(`Unable to resolve predicate to item UUID: more than one item matches predicate ${chainLabel}: ${objectOverview}`);\n } else {\n return {\n // There’s just one item anyway, hence `objects[0]`.\n [chainLabel]: itemPathToItemRef(false, objects[0].objectPath),\n };\n }\n }).reduce((prev, curr) => ({ ...prev, ...curr }), {});\n },\n );\n return [changeset, crID];\n } catch (e) {\n console.error(\"Error reading proposal data\", e);\n throw new Error(\"Error reading proposal data\");\n }\n } else {\n throw new Error(\"Invalid proposal format\");\n }\n }\n } else {\n return undefined;\n }\n }, [getMapReducedData, requestFileFromFilesystem, getObjectData, stakeholder]);\n\n const [importCR, createCR] = useMemo(() => {\n if (updateObjects && setActiveChangeRequestID && !isBusy) {\n return [\n getImportedCRChangeset\n ? performOperation('importing proposal', async function () {\n const [objectChangeset, crID] = await getImportedCRChangeset(); \n await updateObjects({\n commitMessage: 'import proposal',\n objectChangeset,\n });\n setActiveChangeRequestID(crID);\n })\n : undefined,\n getNewEmptyCRChangeset\n ? performOperation('creating blank proposal', async function (newIdea: string) {\n const [objectChangeset, crID] = await getNewEmptyCRChangeset(newIdea);\n await updateObjects({\n commitMessage: `start new empty proposal ${newIdea}`,\n objectChangeset,\n });\n setActiveChangeRequestID(crID);\n })\n : undefined,\n ];\n } else {\n return [undefined, undefined];\n }\n }, [isBusy, performOperation, updateObjects, getImportedCRChangeset, getNewEmptyCRChangeset]);\n\n if (!activeCR || !register || !stakeholder) {\n return <NonIdealState\n icon=\"clean\"\n title=\"Not working on any proposal\"\n description={<>\n <p>\n Choose an actionable proposal from the sidebar to the left\n and activate it by double-clicking\n </p>\n {register && stakeholder && canCreateCR(stakeholder) && latestAcceptedProposal !== undefined\n ? <>\n <p>—or—</p>\n <NewProposalMenu\n css={css`height: 200px;`}\n previousVersion={\n latestAcceptedProposal?.timeDisposed\n ? formatDate(\n latestAcceptedProposal.timeDisposed,\n { showTime: true, useUTC: true })\n : null}\n onImport={importCR}\n onCreateBlank={createCR}\n />\n </>\n : null}\n </>}\n />;\n } else {\n return <ProposalTab\n proposal={activeCR}\n register={register}\n stakeholder={stakeholder}\n onDelete={deleteCR ? handleDelete : undefined}\n />;\n }\n});\n\n\nconst ProposalWorkTitle: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { changeRequest: activeCR } = useContext(ChangeRequestContext);\n return <>{activeCR\n ? <strong>Active proposal</strong>\n : <>Proposal dashboard</>}</>;\n};\n\n\nexport default {\n main: ProposalWork,\n title: ProposalWorkTitle,\n} as const;\n"]}
1
+ {"version":3,"file":"ProposalWork.js","sourceRoot":"","sources":["../../../src/views/detail/ProposalWork.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo, useContext, useCallback, memo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { NonIdealState } from '@blueprintjs/core';\n\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\n\nimport { BrowserCtx } from '../BrowserCtx';\nimport { canImportCR, canCreateCR } from '../../types/stakeholder';\nimport { ChangeRequestContext } from '../../proposals/ChangeRequestContext';\nimport ProposalTab from '../../proposals/ProposalTab';\nimport NewProposalMenu from '../../proposals/NewProposalMenu';\nimport { isImportableCR } from '../../proposals/types';\nimport { itemPathToItemRef } from '../itemPathUtils';\nimport { formatDate } from '../util';\nimport useLatestAcceptedProposal from '../../views/hooks/useLatestAcceptedProposal';\nimport {\n newCRObjectChangeset,\n importedProposalToCRObjectChangeset,\n} from '../../proposals';\n\n\nconst ProposalWork: React.VoidFunctionComponent<Record<never, never>> =\nmemo(function () {\n const { changeRequest: activeCR, deleteCR } = useContext(ChangeRequestContext);\n const {\n registerMetadata: register,\n stakeholder,\n setActiveChangeRequestID,\n itemClasses,\n } = useContext(BrowserCtx);\n const {\n getMapReducedData,\n requestFileFromFilesystem,\n updateObjects,\n performOperation,\n getObjectData,\n isBusy,\n } = useContext(DatasetContext);\n\n const handleDeactivate = useCallback(\n (() => setActiveChangeRequestID?.(null)),\n [setActiveChangeRequestID]);\n\n const handleDelete = useCallback(async () => {\n if (deleteCR && activeCR && setActiveChangeRequestID) {\n await deleteCR();\n setActiveChangeRequestID(null);\n }\n }, [deleteCR, setActiveChangeRequestID]);\n\n let latestAcceptedProposal: ReturnType<typeof useLatestAcceptedProposal> | undefined;\n try {\n latestAcceptedProposal = useLatestAcceptedProposal();\n } catch (e) {\n console.error(\"Failed to obtain latest accepted proposal\");\n latestAcceptedProposal = undefined;\n }\n const getNewEmptyCRChangeset:\n undefined | ((idea: string) => Promise<[ObjectChangeset, string]>) =\n useMemo(() => {\n if (stakeholder && canCreateCR(stakeholder) && latestAcceptedProposal !== undefined) {\n return async function getNewEmptyCRChangeset (newIdea: string) {\n const crID = crypto.randomUUID();\n return [newCRObjectChangeset(\n crID,\n newIdea,\n latestAcceptedProposal?.id ?? 'initial',\n stakeholder!.gitServerUsername!,\n ), crID];\n };\n } else {\n return undefined;\n }\n }, [stakeholder, latestAcceptedProposal?.id]);\n\n const getImportedCRChangeset:\n undefined | (() => Promise<[ObjectChangeset, string]>) =\n useMemo(() => {\n if (requestFileFromFilesystem && stakeholder && canImportCR(stakeholder)) {\n return async function getImportedCRChangeset() {\n const data = await requestFileFromFilesystem({\n prompt: \"Select one register proposal JSON file\",\n filters: [\n { name: \"JSON files\", extensions: ['.json'] },\n ],\n });\n const fileData = Object.values(data)[0]!;\n if (!fileData) {\n throw new Error(\"No file was selected\");\n }\n if (isImportableCR(fileData)) {\n try {\n const [changeset, crID] = await importedProposalToCRObjectChangeset(\n fileData,\n itemClasses,\n stakeholder!.gitServerUsername!,\n getObjectData,\n async function resolvePredicates(predicates) {\n const mapReduceChains = [...predicates.values()].map(predicate => ({\n [predicate]: {\n mapFunc: `\n const data = value.data;\n if (!key.startsWith('/proposals/') && data && (${predicate})) {\n emit({ objectPath: key, objectData: value });\n }\n `,\n },\n })).reduce((prev, curr) => ({ ...prev, ...curr }), {});\n\n const result:\n Record<string, { objectPath: string, objectData: any }[] | {}> =\n await getMapReducedData({\n chains: mapReduceChains,\n });\n\n return Object.entries(result).map(([chainLabel, chainResult]) => {\n const objects =\n // Map returns an empty object if there’re no items,\n // but we promise to return a list.\n (Array.isArray(chainResult) ? chainResult : []);\n if (objects.length < 1) {\n throw new Error(`Unable to resolve predicate to item UUID: no item found matching predicate ${chainLabel}`);\n } else if (objects.length > 1) {\n const objectOverview = objects.map((o: any) => JSON.stringify(o)).join(', ')\n throw new Error(`Unable to resolve predicate to item UUID: more than one item matches predicate ${chainLabel}: ${objectOverview}`);\n } else {\n return {\n // There’s just one item anyway, hence `objects[0]`.\n [chainLabel]: itemPathToItemRef(false, objects[0].objectPath),\n };\n }\n }).reduce((prev, curr) => ({ ...prev, ...curr }), {});\n },\n );\n return [changeset, crID];\n } catch (e) {\n console.error(\"Error reading proposal data\", e);\n throw new Error(\"Error reading proposal data\");\n }\n } else {\n throw new Error(\"Invalid proposal format\");\n }\n }\n } else {\n return undefined;\n }\n }, [getMapReducedData, requestFileFromFilesystem, getObjectData, stakeholder]);\n\n const [importCR, createCR] = useMemo(() => {\n if (updateObjects && setActiveChangeRequestID && !isBusy) {\n return [\n getImportedCRChangeset\n ? performOperation('importing proposal', async function () {\n const [objectChangeset, crID] = await getImportedCRChangeset(); \n await updateObjects({\n commitMessage: 'import proposal',\n objectChangeset,\n });\n setActiveChangeRequestID(crID);\n })\n : undefined,\n getNewEmptyCRChangeset\n ? performOperation('creating blank proposal', async function (newIdea: string) {\n const [objectChangeset, crID] = await getNewEmptyCRChangeset(newIdea);\n await updateObjects({\n commitMessage: `start new empty proposal ${newIdea}`,\n objectChangeset,\n });\n setActiveChangeRequestID(crID);\n })\n : undefined,\n ];\n } else {\n return [undefined, undefined];\n }\n }, [isBusy, performOperation, updateObjects, getImportedCRChangeset, getNewEmptyCRChangeset]);\n\n if (!activeCR || !register || !stakeholder) {\n return <NonIdealState\n icon=\"clean\"\n title=\"Not working on any proposal\"\n description={<>\n <p>\n Choose an actionable proposal from the sidebar to the left\n and activate it by double-clicking\n </p>\n {register && stakeholder && canCreateCR(stakeholder) && latestAcceptedProposal !== undefined\n ? <>\n <p>—or—</p>\n <NewProposalMenu\n css={css`height: 200px;`}\n previousVersion={\n latestAcceptedProposal?.timeDisposed\n ? formatDate(\n latestAcceptedProposal.timeDisposed,\n { showTime: true, useUTC: true })\n : null}\n onImport={importCR}\n onCreateBlank={createCR}\n />\n </>\n : null}\n </>}\n />;\n } else {\n return <ProposalTab\n proposal={activeCR}\n register={register}\n stakeholder={stakeholder}\n onDelete={(deleteCR) ? handleDelete : undefined}\n onDeactivate={setActiveChangeRequestID ? handleDeactivate : undefined}\n />;\n }\n});\n\n\nconst ProposalWorkTitle: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { changeRequest: activeCR } = useContext(ChangeRequestContext);\n return <>{activeCR\n ? <strong>Active proposal</strong>\n : <>Proposal dashboard</>}</>;\n};\n\n\nexport default {\n main: ProposalWork,\n title: ProposalWorkTitle,\n} as const;\n"]}
@@ -13,6 +13,8 @@ var _DL = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widge
13
13
 
14
14
  var _MetaProperties = _interopRequireDefault(require("../../../proposals/MetaProperties"));
15
15
 
16
+ var _types = require("../../../proposals/types");
17
+
16
18
  var _TransitionOptions = _interopRequireWildcard(require("../../../proposals/TransitionOptions"));
17
19
 
18
20
  var _TransitionHistory = _interopRequireWildcard(require("../../../proposals/TransitionHistory"));
@@ -87,7 +89,10 @@ const CurrentProposal = function ({
87
89
  register,
88
90
  proposal
89
91
  }) {
92
+ var _a;
93
+
90
94
  const transitions = stakeholder ? (0, _TransitionOptions.getTransitions)(proposal, stakeholder) : [];
95
+ const crStakeholder = ((_a = register === null || register === void 0 ? void 0 : register.stakeholders) !== null && _a !== void 0 ? _a : []).find(s => (0, _types.isCreatedBy)(s, proposal));
91
96
  return (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_DL.default, {
92
97
  css: (0, _react2.css)`padding: 10px 12px 10px 12px; flex-grow: 1; flex-basis: max-content;`
93
98
  }, (0, _react2.jsx)("div", null, (0, _react2.jsx)("dt", null, "Viewing\u00A0proposal:"), (0, _react2.jsx)("dd", {
@@ -95,7 +100,7 @@ const CurrentProposal = function ({
95
100
  }, "\u201C", proposal.justification.trim() || '(justification N/A)', "\u201D")), (0, _react2.jsx)(_MetaProperties.default, {
96
101
  cr: proposal,
97
102
  currentStakeholder: stakeholder,
98
- registerMetadata: register
103
+ submittingStakeholder: crStakeholder
99
104
  })), (0, _react2.jsx)("div", {
100
105
  css: (0, _react2.css)`overflow-y: auto; flex-basis: min-content;`
101
106
  }, (0, _react2.jsx)(_TransitionHistory.default, {
@@ -1 +1 @@
1
- {"version":3,"file":"ActiveProposalDetails.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/ActiveProposalDetails.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { type MenuItemProps } from '@blueprintjs/core';\n\nimport DL from '@riboseinc/paneron-extension-kit/widgets/DL';\n\nimport MetaProperties from '../../../proposals/MetaProperties';\nimport type { Register, RegisterStakeholder } from '../../../types';\nimport { type SomeCR as CR } from '../../../proposals/types';\nimport TransitionOptions, { isFinalState, getTransitions, canBeTransitionedBy } from '../../../proposals/TransitionOptions';\nimport TransitionsAndStatus, { getTransitionHistory } from '../../../proposals/TransitionHistory';\nimport HomeBlock from './Block';\n\n\nconst CurrentProposalBlock: React.VoidFunctionComponent<{\n proposal: CR\n register: Register\n stakeholder?: RegisterStakeholder\n canDelete?: boolean\n onDelete?: () => (void | Promise<void>)\n onOpen?: () => void\n className?: string\n}> = function ({ proposal, stakeholder, register, onDelete, onOpen, canDelete, className }) {\n const actions = useMemo(() => {\n const actions: MenuItemProps[] = stakeholder && canBeTransitionedBy(stakeholder, proposal)\n ? [/*{\n // Action is taken from within the widget.\n text: \"Take action\",\n onClick: () => void 0,\n icon: 'take-action',\n intent: 'primary',\n }*/]\n : [];\n\n if (canDelete) {\n actions.push({\n text: \"Delete this proposal draft\",\n onClick: onDelete,\n disabled: !onDelete,\n icon: 'delete',\n intent: 'danger',\n });\n }\n\n actions.push({\n text: \"View proposal in a new tab\",\n icon: 'open-application',\n disabled: !onOpen,\n onClick: onOpen,\n });\n\n return actions;\n }, [onDelete, onOpen, stakeholder, proposal, canDelete]);\n\n return (\n <HomeBlock\n View={CurrentProposal}\n description=\"Active proposal\"\n props={{ proposal, stakeholder, register }}\n className={className}\n actions={actions}\n />\n );\n};\n\nexport default CurrentProposalBlock;\n\n\nconst CurrentProposal: React.VoidFunctionComponent<{\n proposal: CR\n register: Register\n stakeholder?: RegisterStakeholder\n}> = function ({ stakeholder, register, proposal }) {\n const transitions = stakeholder\n ? getTransitions(proposal, stakeholder)\n : [];\n\n return (\n <>\n <DL css={css`padding: 10px 12px 10px 12px; flex-grow: 1; flex-basis: max-content;`}>\n <div>\n <dt>Viewing&nbsp;proposal:</dt>\n <dd css={css`max-height: 40px; overflow-y: auto;`}>\n “{proposal.justification.trim() || '(justification N/A)'}”\n </dd>\n </div>\n <MetaProperties\n cr={proposal}\n currentStakeholder={stakeholder}\n registerMetadata={register}\n />\n </DL>\n <div css={css`overflow-y: auto; flex-basis: min-content;`}>\n <TransitionsAndStatus\n pastTransitions={getTransitionHistory(proposal)}\n isFinal={isFinalState(proposal.state)}\n />\n {transitions.length > 0\n ? <TransitionOptions\n stakeholder={stakeholder}\n transitions={transitions}\n cr={proposal}\n css={css`padding: 12px;`}\n />\n : null}\n </div>\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"ActiveProposalDetails.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/ActiveProposalDetails.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { type MenuItemProps } from '@blueprintjs/core';\n\nimport DL from '@riboseinc/paneron-extension-kit/widgets/DL';\n\nimport MetaProperties from '../../../proposals/MetaProperties';\nimport type { Register, RegisterStakeholder } from '../../../types';\nimport { type SomeCR as CR, isCreatedBy } from '../../../proposals/types';\nimport TransitionOptions, { isFinalState, getTransitions, canBeTransitionedBy } from '../../../proposals/TransitionOptions';\nimport TransitionsAndStatus, { getTransitionHistory } from '../../../proposals/TransitionHistory';\nimport HomeBlock from './Block';\n\n\nconst CurrentProposalBlock: React.VoidFunctionComponent<{\n proposal: CR\n register: Register\n stakeholder?: RegisterStakeholder\n canDelete?: boolean\n onDelete?: () => (void | Promise<void>)\n onOpen?: () => void\n className?: string\n}> = function ({ proposal, stakeholder, register, onDelete, onOpen, canDelete, className }) {\n const actions = useMemo(() => {\n const actions: MenuItemProps[] = stakeholder && canBeTransitionedBy(stakeholder, proposal)\n ? [/*{\n // Action is taken from within the widget.\n text: \"Take action\",\n onClick: () => void 0,\n icon: 'take-action',\n intent: 'primary',\n }*/]\n : [];\n\n if (canDelete) {\n actions.push({\n text: \"Delete this proposal draft\",\n onClick: onDelete,\n disabled: !onDelete,\n icon: 'delete',\n intent: 'danger',\n });\n }\n\n actions.push({\n text: \"View proposal in a new tab\",\n icon: 'open-application',\n disabled: !onOpen,\n onClick: onOpen,\n });\n\n return actions;\n }, [onDelete, onOpen, stakeholder, proposal, canDelete]);\n\n return (\n <HomeBlock\n View={CurrentProposal}\n description=\"Active proposal\"\n props={{ proposal, stakeholder, register }}\n className={className}\n actions={actions}\n />\n );\n};\n\nexport default CurrentProposalBlock;\n\n\nconst CurrentProposal: React.VoidFunctionComponent<{\n proposal: CR\n register: Register\n stakeholder?: RegisterStakeholder\n}> = function ({ stakeholder, register, proposal }) {\n const transitions = stakeholder\n ? getTransitions(proposal, stakeholder)\n : [];\n const crStakeholder = (register?.stakeholders ?? []).\n find(s => isCreatedBy(s, proposal));\n\n return (\n <>\n <DL css={css`padding: 10px 12px 10px 12px; flex-grow: 1; flex-basis: max-content;`}>\n <div>\n <dt>Viewing&nbsp;proposal:</dt>\n <dd css={css`max-height: 40px; overflow-y: auto;`}>\n “{proposal.justification.trim() || '(justification N/A)'}”\n </dd>\n </div>\n <MetaProperties\n cr={proposal}\n currentStakeholder={stakeholder}\n submittingStakeholder={crStakeholder}\n />\n </DL>\n <div css={css`overflow-y: auto; flex-basis: min-content;`}>\n <TransitionsAndStatus\n pastTransitions={getTransitionHistory(proposal)}\n isFinal={isFinalState(proposal.state)}\n />\n {transitions.length > 0\n ? <TransitionOptions\n stakeholder={stakeholder}\n transitions={transitions}\n cr={proposal}\n css={css`padding: 12px;`}\n />\n : null}\n </div>\n </>\n );\n};\n"]}
@@ -31,7 +31,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
31
31
 
32
32
  /** @jsxFrag React.Fragment */
33
33
  const RegisterHome2 = function () {
34
- var _a;
34
+ var _a, _b;
35
35
 
36
36
  const {
37
37
  registerMetadata
@@ -47,10 +47,19 @@ const RegisterHome2 = function () {
47
47
  css: (0, _react2.css)`vertical-align: baseline`,
48
48
  onClick: () => spawnTab(_protocolRegistry.Protocols.REGISTER_META)
49
49
  }, "Learn more about the register"), "\u2002 or search all items:"), (0, _react2.jsx)(_Search.default, {
50
- css: (0, _react2.css)`flex: 1;`,
50
+ css: (0, _react2.css)`flex: 1; overflow: hidden;`,
51
51
  //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}
52
52
  availableClassIDs: [],
53
- stateName: "item-search-global"
53
+ stateName: "item-search-global",
54
+ initialView: (0, _react2.jsx)("div", {
55
+ dangerouslySetInnerHTML: {
56
+ __html: (_b = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.contentSummary) !== null && _b !== void 0 ? _b : "There is no content summary of this registry yet."
57
+ }
58
+ }),
59
+ zeroResultsView: (0, _react2.jsx)(_core.NonIdealState, {
60
+ icon: "clean",
61
+ title: "No results matching query"
62
+ })
54
63
  })));
55
64
  };
56
65
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome2/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAE1G,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,aAAa,GAAsD;;IACvE,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACxD,OAAO,CACL,IAAC,qBAAqB,IAAC,KAAK,EAAE;2BAAc,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,mCAAI,eAAe,CAAI;QACvF,IAAC,IAAI,IAAC,GAAG,EAAE,GAAG,CAAA,qIAAqI;YACjJ;gBACE,IAAC,MAAM,IACH,GAAG,EAAE,GAAG,CAAA,0BAA0B,EAClC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,oCAE3C;8CAGP;YACJ,IAAC,MAAM,IACL,GAAG,EAAE,GAAG,CAAA,UAAU;gBAClB,iFAAiF;gBACjF,iBAAiB,EAAE,EAAE,EACrB,SAAS,EAAC,oBAAoB,GAE9B,CACG,CACe,CACzB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Button, Card } from '@blueprintjs/core';\n\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\n\nimport { TabContentsWithHeader } from '../../util';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport Search from '../../sidebar/Search';\nimport { Protocols } from '../../protocolRegistry';\n\n\nconst RegisterHome2: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { registerMetadata } = useContext(BrowserCtx);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n return (\n <TabContentsWithHeader title={<>Welcome to {registerMetadata?.name ?? 'this register'}</>}>\n <Card css={css`flex: 1; box-shadow: none !important; position: absolute; border-radius: 0; display: flex; flex-flow: column nowrap; padding: 10px;`}>\n <p>\n <Button\n css={css`vertical-align: baseline`}\n onClick={() => spawnTab(Protocols.REGISTER_META)}>\n Learn more about the register\n </Button>\n &ensp;\n or search all items:\n </p>\n <Search\n css={css`flex: 1;`}\n //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}\n availableClassIDs={[]}\n stateName=\"item-search-global\"\n //onOpenItem={onChooseItem ? handleOpenItem : undefined}\n />\n </Card>\n </TabContentsWithHeader>\n );\n};\n\nexport default RegisterHome2;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome2/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAE1G,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,aAAa,GAAsD;;IACvE,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACxD,OAAO,CACL,IAAC,qBAAqB,IAAC,KAAK,EAAE;2BAAc,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,mCAAI,eAAe,CAAI;QACvF,IAAC,IAAI,IAAC,GAAG,EAAE,GAAG,CAAA,qIAAqI;YACjJ;gBACE,IAAC,MAAM,IACH,GAAG,EAAE,GAAG,CAAA,0BAA0B,EAClC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,oCAE3C;8CAGP;YACJ,IAAC,MAAM,IACL,GAAG,EAAE,GAAG,CAAA,4BAA4B;gBACpC,iFAAiF;gBACjF,iBAAiB,EAAE,EAAE,EACrB,SAAS,EAAC,oBAAoB,EAC9B,WAAW,EAAE,aAAK,uBAAuB,EAAE,EAAE,MAAM,EACjD,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,cAAc,mCAC7B,mDAAmD;qBACvD,GAAI,EACL,eAAe,EACb,IAAC,aAAa,IACZ,IAAI,EAAC,OAAO,EACZ,KAAK,EAAC,2BAA2B,GACjC,GAEJ,CACG,CACe,CACzB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { NonIdealState, Button, Card } from '@blueprintjs/core';\n\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\n\nimport { TabContentsWithHeader } from '../../util';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport Search from '../../sidebar/Search';\nimport { Protocols } from '../../protocolRegistry';\n\n\nconst RegisterHome2: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { registerMetadata } = useContext(BrowserCtx);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n return (\n <TabContentsWithHeader title={<>Welcome to {registerMetadata?.name ?? 'this register'}</>}>\n <Card css={css`flex: 1; box-shadow: none !important; position: absolute; border-radius: 0; display: flex; flex-flow: column nowrap; padding: 10px;`}>\n <p>\n <Button\n css={css`vertical-align: baseline`}\n onClick={() => spawnTab(Protocols.REGISTER_META)}>\n Learn more about the register\n </Button>\n &ensp;\n or search all items:\n </p>\n <Search\n css={css`flex: 1; overflow: hidden;`}\n //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}\n availableClassIDs={[]}\n stateName=\"item-search-global\"\n initialView={<div dangerouslySetInnerHTML={{ __html:\n registerMetadata?.contentSummary\n ?? \"There is no content summary of this registry yet.\"\n }} />}\n zeroResultsView={\n <NonIdealState\n icon=\"clean\"\n title=\"No results matching query\"\n />}\n //onOpenItem={onChooseItem ? handleOpenItem : undefined}\n />\n </Card>\n </TabContentsWithHeader>\n );\n};\n\nexport default RegisterHome2;\n"]}
@@ -12,6 +12,8 @@ declare const Search: React.FC<{
12
12
  implicitCriteria?: CriteriaGroup;
13
13
  availableClassIDs?: string[];
14
14
  onOpenItem?: (itemPath: string) => void;
15
+ zeroResultsView?: JSX.Element;
16
+ initialView?: JSX.Element;
15
17
  stateName?: string;
16
18
  List?: ReturnType<typeof makeSearchResultList>;
17
19
  extraData?: Record<string, any>;
@@ -11,6 +11,8 @@ var _react2 = require("@emotion/react");
11
11
 
12
12
  var _context = require("@riboseinc/paneron-extension-kit/context");
13
13
 
14
+ var _util = require("@riboseinc/paneron-extension-kit/util");
15
+
14
16
  var _SearchResultList = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/SearchResultList"));
15
17
 
16
18
  var _useDebounce = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/useDebounce"));
@@ -52,6 +54,10 @@ const initialState = {
52
54
  selectedItemPath: null
53
55
  };
54
56
 
57
+ function isInitialState(state) {
58
+ return (0, _util.toJSONNormalized)(state) === (0, _util.toJSONNormalized)(initialState);
59
+ }
60
+
55
61
  function reducer(prevState, action) {
56
62
  switch (action.type) {
57
63
  case 'update-query':
@@ -76,6 +82,8 @@ function reducer(prevState, action) {
76
82
 
77
83
  const Search = (0, _react.memo)(function ({
78
84
  implicitCriteria,
85
+ initialView,
86
+ zeroResultsView,
79
87
  availableClassIDs,
80
88
  stateName,
81
89
  onOpenItem,
@@ -155,6 +163,9 @@ const Search = (0, _react.memo)(function ({
155
163
  }), [dispatch]);
156
164
  const defaultHandleOpenItem = (0, _react.useCallback)(itemPath => jumpTo === null || jumpTo === void 0 ? void 0 : jumpTo(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${itemPath}`), [jumpTo]);
157
165
  const handleOpenItem = onOpenItem !== null && onOpenItem !== void 0 ? onOpenItem : defaultHandleOpenItem;
166
+ const showInitialScreen = initialView && isInitialState({ ...state,
167
+ selectedItemPath: null
168
+ });
158
169
  return (0, _react2.jsx)("div", {
159
170
  css: (0, _react2.css)`display: flex; flex-flow: column nowrap;`,
160
171
  className: className,
@@ -179,14 +190,15 @@ const Search = (0, _react.memo)(function ({
179
190
  }), [dispatch]),
180
191
  css: (0, _react2.css)`padding: 2px;`
181
192
  }), (0, _react2.jsx)("div", {
182
- css: (0, _react2.css)`flex: 1;`
183
- }, (0, _react2.jsx)(ListComponent, {
193
+ css: (0, _react2.css)`flex: 1; overflow-y: auto;`
194
+ }, showInitialScreen ? initialView : (0, _react2.jsx)(ListComponent, {
184
195
  queryExpression: datasetObjectSearchQueryExpression,
185
196
  keyExpression: keyExpression,
186
197
  selectedItemPath: state.selectedItemPath,
187
198
  onSelectItem: handleSelectItem,
188
199
  onOpenItem: handleOpenItem,
189
- extraItemViewData: extraData
200
+ extraItemViewData: extraData,
201
+ zeroResultsView: effectiveQueryExpression === queryExpressionDebounced ? zeroResultsView : undefined
190
202
  })));
191
203
  });
192
204
  const RegisterItemSearchResultList = (0, _SearchResultList.default)(_ListItem.default, objPath => ({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Search/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useContext, useCallback, useMemo, useEffect } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\nimport makeSearchResultList from '@riboseinc/paneron-extension-kit/widgets/SearchResultList';\nimport useDebounce from '@riboseinc/paneron-extension-kit/useDebounce';\nimport { type CriteriaGroup, isCriteriaGroup, BLANK_CRITERIA } from '../../FilterCriteria/models';\nimport criteriaGroupToQueryExpression from '../../FilterCriteria/criteriaGroupToQueryExpression';\nimport { RAW_SUBSTRING, CUSTOM_CONDITION } from '../../FilterCriteria/CRITERIA_CONFIGURATION';\nimport { ChangeRequestContext } from '../../../proposals/ChangeRequestContext';\nimport type { RegisterItem } from '../../../types';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { getRegisterItemQuery } from '../../itemQueryUtils';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport SearchQuery from '../../SearchQuery';\nimport ListItem from '../ListItem';\nimport { Protocols } from '../../protocolRegistry';\n\n\n// TODO: Move Search widget core out of sidebar, as it’s used elsewhere too.\n\n\ninterface Query {\n criteria: CriteriaGroup;\n}\ninterface State {\n query: Query;\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\nfunction isState(val: any): val is State {\n return val\n && val.query\n && val.query.criteria\n && isCriteriaGroup(val.query.criteria)\n && typeof val.quickSubstringQuery === 'string'\n && (val.selectedItemPath === null || typeof val.selectedItemPath === 'string')\n}\ntype Action =\n | { type: 'update-query'; payload: { query: Query; }; }\n | { type: 'update-quick-substring-query'; payload: { substring: string; }; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nconst initialState: State = {\n query: { criteria: BLANK_CRITERIA },\n quickSubstringQuery: '',\n selectedItemPath: null,\n} as const;\n\nfunction reducer(prevState: State, action: Action) {\n switch (action.type) {\n case 'update-query':\n return {\n ...prevState,\n query: action.payload.query,\n };\n case 'update-quick-substring-query':\n return {\n ...prevState,\n quickSubstringQuery: action.payload.substring,\n };\n case 'select-item':\n return {\n ...prevState,\n selectedItemPath: action.payload.itemPath,\n };\n default:\n throw new Error(\"Unexpected search state\");\n }\n}\n\nconst Search: React.FC<{\n /**\n * Criteria that will always apply.\n * Used e.g. in superseding item selection\n * (to limit to the same item class).\n */\n implicitCriteria?: CriteriaGroup,\n\n availableClassIDs?: string[]\n onOpenItem?: (itemPath: string) => void\n\n stateName?: string\n\n List?: ReturnType<typeof makeSearchResultList>,\n extraData?: Record<string, any>,\n\n className?: string\n style?: React.CSSProperties\n}> =\nmemo(function ({ implicitCriteria, availableClassIDs, stateName, onOpenItem, List, extraData, className, style }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n\n const ListComponent = useMemo((() => List ?? RegisterItemSearchResultList), [List]);\n\n const {\n // TODO: defaultSearchCriteria,\n keyExpression,\n getQuickSearchPredicate,\n itemClasses,\n subregisters,\n selectedRegisterItem,\n jumpTo,\n } = useContext(BrowserCtx);\n const { changeRequest } = useContext(ChangeRequestContext);\n\n const [ state, dispatch, stateRecalled ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)(\n stateName ?? 'search-sidebar',\n undefined,\n isState,\n reducer,\n initialState,\n null);\n\n const selectedItemPath = selectedRegisterItem?.ref\n ? itemRefToItemPath(selectedRegisterItem.ref, changeRequest?.id)\n : null;\n\n useEffect(() => {\n if (selectedItemPath) {\n dispatch({ type: 'select-item', payload: { itemPath: selectedItemPath } });\n }\n }, [selectedItemPath, dispatch]);\n\n // Why are we memoing this? It’s just a string and seems not too slow to compute.\n const effectiveQueryExpression: string = useMemo(() => {\n const quickSearchString = (state.quickSubstringQuery ?? '').trim();\n const withSearchString: CriteriaGroup =\n state.query.criteria.criteria.length < 1 && quickSearchString !== ''\n ? {\n require: 'all',\n criteria: [\n getQuickSearchPredicate\n ? {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: getQuickSearchPredicate(quickSearchString) },\n { itemClasses, subregisters },\n ),\n }\n : {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters }),\n },\n ],\n }\n : state.query.criteria;\n const withImplicit: CriteriaGroup = implicitCriteria\n ? {\n require: 'all',\n criteria: [ implicitCriteria, withSearchString ],\n }\n : withSearchString;\n return withImplicit.criteria.length > 0\n ? criteriaGroupToQueryExpression(withImplicit)\n // If no criteria provided, don’t show anything by default.\n : 'false';\n }, [state.query.criteria, state.quickSubstringQuery, itemClasses, subregisters, getQuickSearchPredicate]);\n\n const stateRecalledDebounced = useDebounce(stateRecalled, 100);\n const queryExpressionDebounced = useDebounce(\n effectiveQueryExpression,\n stateRecalledDebounced ? 500 : 0,\n );\n\n const datasetObjectSearchQueryExpression = useMemo((() =>\n queryExpressionDebounced != 'false'\n ? getRegisterItemQuery(queryExpressionDebounced, changeRequest ?? undefined)\n : 'return false'\n ), [queryExpressionDebounced, changeRequest]);\n\n const handleSelectItem = useCallback(\n (itemPath => dispatch({ type: 'select-item', payload: { itemPath }})),\n [dispatch]);\n\n const defaultHandleOpenItem = useCallback(\n (itemPath => jumpTo?.(`${Protocols.ITEM_DETAILS}:${itemPath}`)),\n [jumpTo]);\n const handleOpenItem = onOpenItem ?? defaultHandleOpenItem;\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className} style={style}>\n <SearchQuery\n rootCriteria={state.query.criteria}\n quickSearchString={state.quickSubstringQuery}\n availableClassIDs={availableClassIDs}\n onCriteriaChange={useCallback((\n criteria => dispatch({ type: 'update-query', payload: { query: { criteria } } })\n ), [dispatch])}\n onQuickSearchStringChange={useCallback((\n substring => dispatch({ type: 'update-quick-substring-query', payload: { substring } })\n ), [dispatch])}\n css={css`padding: 2px;`}\n />\n <div css={css`flex: 1;`}>\n <ListComponent\n queryExpression={datasetObjectSearchQueryExpression}\n keyExpression={keyExpression}\n selectedItemPath={state.selectedItemPath}\n onSelectItem={handleSelectItem}\n onOpenItem={handleOpenItem}\n extraItemViewData={extraData as any}\n />\n </div>\n </div>\n );\n});\n\n\nconst RegisterItemSearchResultList = makeSearchResultList<RegisterItem<any>>(ListItem, (objPath) => ({\n name: 'reg. item',\n iconProps: {\n icon: 'document',\n title: objPath,\n htmlTitle: `Icon for item at ${objPath}`,\n },\n}));\n\n\nexport default Search;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Search/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useContext, useCallback, useMemo, useEffect } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { toJSONNormalized } from '@riboseinc/paneron-extension-kit/util';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\nimport makeSearchResultList from '@riboseinc/paneron-extension-kit/widgets/SearchResultList';\nimport useDebounce from '@riboseinc/paneron-extension-kit/useDebounce';\nimport { type CriteriaGroup, isCriteriaGroup, BLANK_CRITERIA } from '../../FilterCriteria/models';\nimport criteriaGroupToQueryExpression from '../../FilterCriteria/criteriaGroupToQueryExpression';\nimport { RAW_SUBSTRING, CUSTOM_CONDITION } from '../../FilterCriteria/CRITERIA_CONFIGURATION';\nimport { ChangeRequestContext } from '../../../proposals/ChangeRequestContext';\nimport type { RegisterItem } from '../../../types';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { getRegisterItemQuery } from '../../itemQueryUtils';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport SearchQuery from '../../SearchQuery';\nimport ListItem from '../ListItem';\nimport { Protocols } from '../../protocolRegistry';\n\n\n// TODO: Move Search widget core out of sidebar, as it’s used elsewhere too.\n\n\ninterface Query {\n criteria: CriteriaGroup;\n}\ninterface State {\n query: Query;\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\nfunction isState(val: any): val is State {\n return val\n && val.query\n && val.query.criteria\n && isCriteriaGroup(val.query.criteria)\n && typeof val.quickSubstringQuery === 'string'\n && (val.selectedItemPath === null || typeof val.selectedItemPath === 'string')\n}\ntype Action =\n | { type: 'update-query'; payload: { query: Query; }; }\n | { type: 'update-quick-substring-query'; payload: { substring: string; }; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nconst initialState: State = {\n query: { criteria: BLANK_CRITERIA },\n quickSubstringQuery: '',\n selectedItemPath: null,\n} as const;\n\nfunction isInitialState(state: State): boolean {\n return toJSONNormalized(state) === toJSONNormalized(initialState);\n}\n\nfunction reducer(prevState: State, action: Action) {\n switch (action.type) {\n case 'update-query':\n return {\n ...prevState,\n query: action.payload.query,\n };\n case 'update-quick-substring-query':\n return {\n ...prevState,\n quickSubstringQuery: action.payload.substring,\n };\n case 'select-item':\n return {\n ...prevState,\n selectedItemPath: action.payload.itemPath,\n };\n default:\n throw new Error(\"Unexpected search state\");\n }\n}\n\nconst Search: React.FC<{\n /**\n * Criteria that will always apply.\n * Used e.g. in superseding item selection\n * (to limit to the same item class).\n */\n implicitCriteria?: CriteriaGroup,\n\n availableClassIDs?: string[]\n onOpenItem?: (itemPath: string) => void\n\n zeroResultsView?: JSX.Element\n initialView?: JSX.Element\n\n stateName?: string\n\n List?: ReturnType<typeof makeSearchResultList>\n extraData?: Record<string, any>\n\n className?: string\n style?: React.CSSProperties\n}> =\nmemo(function ({ implicitCriteria, initialView, zeroResultsView, availableClassIDs, stateName, onOpenItem, List, extraData, className, style }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n\n const ListComponent = useMemo((() => List ?? RegisterItemSearchResultList), [List]);\n\n const {\n // TODO: defaultSearchCriteria,\n keyExpression,\n getQuickSearchPredicate,\n itemClasses,\n subregisters,\n selectedRegisterItem,\n jumpTo,\n } = useContext(BrowserCtx);\n\n const { changeRequest } = useContext(ChangeRequestContext);\n\n const [ state, dispatch, stateRecalled ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)( stateName ?? 'search-sidebar',\n undefined,\n isState,\n reducer,\n initialState,\n null);\n\n const selectedItemPath = selectedRegisterItem?.ref\n ? itemRefToItemPath(selectedRegisterItem.ref, changeRequest?.id)\n : null;\n\n useEffect(() => {\n if (selectedItemPath) {\n dispatch({ type: 'select-item', payload: { itemPath: selectedItemPath } });\n }\n }, [selectedItemPath, dispatch]);\n\n // Why are we memoing this? It’s just a string and seems not too slow to compute.\n const effectiveQueryExpression: string = useMemo(() => {\n const quickSearchString = (state.quickSubstringQuery ?? '').trim();\n const withSearchString: CriteriaGroup =\n state.query.criteria.criteria.length < 1 && quickSearchString !== ''\n ? {\n require: 'all',\n criteria: [\n getQuickSearchPredicate\n ? {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: getQuickSearchPredicate(quickSearchString) },\n { itemClasses, subregisters },\n ),\n }\n : {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters }),\n },\n ],\n }\n : state.query.criteria;\n const withImplicit: CriteriaGroup = implicitCriteria\n ? {\n require: 'all',\n criteria: [ implicitCriteria, withSearchString ],\n }\n : withSearchString;\n return withImplicit.criteria.length > 0\n ? criteriaGroupToQueryExpression(withImplicit)\n // If no criteria provided, don’t show anything by default.\n : 'false';\n }, [state.query.criteria, state.quickSubstringQuery, itemClasses, subregisters, getQuickSearchPredicate]);\n\n const stateRecalledDebounced = useDebounce(stateRecalled, 100);\n const queryExpressionDebounced = useDebounce(\n effectiveQueryExpression,\n stateRecalledDebounced ? 500 : 0,\n );\n\n const datasetObjectSearchQueryExpression = useMemo((() =>\n queryExpressionDebounced != 'false'\n ? getRegisterItemQuery(queryExpressionDebounced, changeRequest ?? undefined)\n : 'return false'\n ), [queryExpressionDebounced, changeRequest]);\n\n const handleSelectItem = useCallback(\n (itemPath => dispatch({ type: 'select-item', payload: { itemPath }})),\n [dispatch]);\n\n const defaultHandleOpenItem = useCallback(\n (itemPath => jumpTo?.(`${Protocols.ITEM_DETAILS}:${itemPath}`)),\n [jumpTo]);\n const handleOpenItem = onOpenItem ?? defaultHandleOpenItem;\n\n const showInitialScreen = initialView && isInitialState({ ...state, selectedItemPath: null });\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className} style={style}>\n <SearchQuery\n rootCriteria={state.query.criteria}\n quickSearchString={state.quickSubstringQuery}\n availableClassIDs={availableClassIDs}\n onCriteriaChange={useCallback((\n criteria => dispatch({ type: 'update-query', payload: { query: { criteria } } })\n ), [dispatch])}\n onQuickSearchStringChange={useCallback((\n substring => dispatch({ type: 'update-quick-substring-query', payload: { substring } })\n ), [dispatch])}\n css={css`padding: 2px;`}\n />\n <div css={css`flex: 1; overflow-y: auto;`}>\n {showInitialScreen\n ? initialView\n : <ListComponent\n queryExpression={datasetObjectSearchQueryExpression}\n keyExpression={keyExpression}\n selectedItemPath={state.selectedItemPath}\n onSelectItem={handleSelectItem}\n onOpenItem={handleOpenItem}\n extraItemViewData={extraData as any}\n zeroResultsView={effectiveQueryExpression === queryExpressionDebounced\n ? zeroResultsView\n : undefined}\n />}\n </div>\n </div>\n );\n});\n\n\nconst RegisterItemSearchResultList = makeSearchResultList<RegisterItem<any>>(ListItem, (objPath) => ({\n name: 'reg. item',\n iconProps: {\n icon: 'document',\n title: objPath,\n htmlTitle: `Icon for item at ${objPath}`,\n },\n}));\n\n\nexport default Search;\n"]}
@@ -114,17 +114,23 @@ exports.sidebarConfig = sidebarConfig;
114
114
 
115
115
  const ProposalsBlockTitle = function () {
116
116
  const {
117
- spawnTab
117
+ spawnTab,
118
+ focusedTabURI
118
119
  } = (0, _react.useContext)(_paneronExtensionKit.TabbedWorkspaceContext);
119
120
  const {
120
- stakeholder
121
+ stakeholder,
122
+ activeChangeRequestID
121
123
  } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
124
+ const dashboardIsOpen = focusedTabURI === null || focusedTabURI === void 0 ? void 0 : focusedTabURI.startsWith(_protocolRegistry.Protocols.PROPOSAL_WORK);
125
+ const canOpenDashboard = !activeChangeRequestID;
122
126
  return (0, _react2.jsx)("div", {
123
127
  css: (0, _react2.css)`display: flex; justify-content: space-between; align-items: center;`
124
128
  }, "Pending proposals", stakeholder && ((0, _stakeholder.canImportCR)(stakeholder) || (0, _stakeholder.canCreateCR)(stakeholder)) ? (0, _react2.jsx)(_core.Button, {
125
129
  minimal: true,
126
130
  small: true,
127
- intent: "primary",
131
+ disabled: !canOpenDashboard,
132
+ intent: canOpenDashboard ? 'primary' : undefined,
133
+ active: dashboardIsOpen,
128
134
  onClick: evt => {
129
135
  evt.stopPropagation();
130
136
  spawnTab(_protocolRegistry.Protocols.PROPOSAL_WORK);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/sidebar/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport update from 'immutability-helper';\nimport { jsx, css } from '@emotion/react';\nimport { Icon, Button } from '@blueprintjs/core';\n\nimport type { SuperSidebarConfig } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/types';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit';\n\n//import Browse from './Browse';\nimport ItemClassTree from '../../item-classes/Tree';\nimport { BrowserCtx } from '../BrowserCtx';\n//import Search from './Search';\nimport { ChangeRequestHistoryBlock } from './Registration';\nimport { canImportCR, canCreateCR } from '../../types/stakeholder';\nimport ActionableCRTree from '../../proposals/actionableGroups/Tree';\nimport { Protocols } from '../protocolRegistry';\n//import { ExportOptions, ImportOptions } from './ExportImport';\n\n\nexport const sidebarIDs = [\n 'Browse',\n //'Registration',\n //'Export',\n] as const;\n\nexport type SidebarID = typeof sidebarIDs[number];\n\nexport const sidebarConfig: SuperSidebarConfig<typeof sidebarIDs> = {\n Browse: {\n icon: () => <Icon icon=\"list\" />,\n title: \"Browse\",\n blocks: [{\n key: 'browse',\n title: <div css={css`display: flex; justify-content: space-between`}>\n Item classes\n <HelpTooltip content=\"Browse register items by pre-made categories\" />\n </div>,\n content: <ItemClassTree />,\n nonCollapsible: false,\n // These have to have height specified due to absolute positioning.\n height: 400,\n //}, {\n // key: 'search',\n // title: \"New search\",\n // content: <Search css={css`position: absolute; inset: 0;`} />,\n // nonCollapsible: false,\n // height: 400,\n }, {\n key: 'proposal-history',\n title: \"Proposal history\",\n content: <ChangeRequestHistoryBlock />,\n nonCollapsible: false,\n height: 200,\n }],\n },\n // Registration: {\n // icon: () => <Icon icon=\"lightbulb\" />,\n // title: \"Proposals\",\n // blocks: [{\n // key: 'pending-crs',\n // title: <div css={css`display: flex; justify-content: space-between`}>\n // Pending proposals\n // <HelpTooltip content=\"Proposals pending decision. If a register item is selected, only proposals affecting that item are shown.\" />\n // </div>,\n // content: <PendingChangeRequestsBlock />,\n // height: 300,\n // }, {\n // key: 'cr-history',\n // title: <div css={css`display: flex; justify-content: space-between`}>\n // History\n // <HelpTooltip content=\"Resolved proposals. If a register item is selected, only proposals affecting that item are shown.\" />\n // </div>,\n // content: <ChangeRequestHistoryBlock />,\n // height: 300,\n // }],\n // },\n // Export: {\n // icon: () => <Icon icon=\"changes\" />,\n // title: \"Import and export options\",\n // blocks: [{\n // key: 'export',\n // title: \"Export options\",\n // content: <ExportOptions />,\n // nonCollapsible: true,\n // }, {\n // key: 'import',\n // title: \"Import options\",\n // content: <ImportOptions />,\n // nonCollapsible: false,\n // collapsedByDefault: true,\n // }],\n // },\n};\n\nconst ProposalsBlockTitle: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const { stakeholder } = useContext(BrowserCtx);\n return <div css={css`display: flex; justify-content: space-between; align-items: center;`}>\n Pending proposals\n {stakeholder && (canImportCR(stakeholder) || canCreateCR(stakeholder))\n ? <Button minimal small intent=\"primary\" onClick={(evt) => {\n evt.stopPropagation();\n spawnTab(Protocols.PROPOSAL_WORK);\n }}>\n Propose…\n </Button>\n : null}\n </div>\n};\n\nexport const sidebarConfigForStakeholder: SuperSidebarConfig<typeof sidebarIDs> = update(\n sidebarConfig, {\n Browse: {\n blocks: {\n $splice: [[0, 0, {\n key: 'proposals',\n title: <ProposalsBlockTitle />,\n content: <ActionableCRTree />,\n nonCollapsible: false,\n height: 200,\n }]]\n }\n }\n });\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/sidebar/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport update from 'immutability-helper';\nimport { jsx, css } from '@emotion/react';\nimport { Icon, Button } from '@blueprintjs/core';\n\nimport type { SuperSidebarConfig } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/types';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit';\n\n//import Browse from './Browse';\nimport ItemClassTree from '../../item-classes/Tree';\nimport { BrowserCtx } from '../BrowserCtx';\n//import Search from './Search';\nimport { ChangeRequestHistoryBlock } from './Registration';\nimport { canImportCR, canCreateCR } from '../../types/stakeholder';\nimport ActionableCRTree from '../../proposals/actionableGroups/Tree';\nimport { Protocols } from '../protocolRegistry';\n//import { ExportOptions, ImportOptions } from './ExportImport';\n\n\nexport const sidebarIDs = [\n 'Browse',\n //'Registration',\n //'Export',\n] as const;\n\nexport type SidebarID = typeof sidebarIDs[number];\n\nexport const sidebarConfig: SuperSidebarConfig<typeof sidebarIDs> = {\n Browse: {\n icon: () => <Icon icon=\"list\" />,\n title: \"Browse\",\n blocks: [{\n key: 'browse',\n title: <div css={css`display: flex; justify-content: space-between`}>\n Item classes\n <HelpTooltip content=\"Browse register items by pre-made categories\" />\n </div>,\n content: <ItemClassTree />,\n nonCollapsible: false,\n // These have to have height specified due to absolute positioning.\n height: 400,\n //}, {\n // key: 'search',\n // title: \"New search\",\n // content: <Search css={css`position: absolute; inset: 0;`} />,\n // nonCollapsible: false,\n // height: 400,\n }, {\n key: 'proposal-history',\n title: \"Proposal history\",\n content: <ChangeRequestHistoryBlock />,\n nonCollapsible: false,\n height: 200,\n }],\n },\n // Registration: {\n // icon: () => <Icon icon=\"lightbulb\" />,\n // title: \"Proposals\",\n // blocks: [{\n // key: 'pending-crs',\n // title: <div css={css`display: flex; justify-content: space-between`}>\n // Pending proposals\n // <HelpTooltip content=\"Proposals pending decision. If a register item is selected, only proposals affecting that item are shown.\" />\n // </div>,\n // content: <PendingChangeRequestsBlock />,\n // height: 300,\n // }, {\n // key: 'cr-history',\n // title: <div css={css`display: flex; justify-content: space-between`}>\n // History\n // <HelpTooltip content=\"Resolved proposals. If a register item is selected, only proposals affecting that item are shown.\" />\n // </div>,\n // content: <ChangeRequestHistoryBlock />,\n // height: 300,\n // }],\n // },\n // Export: {\n // icon: () => <Icon icon=\"changes\" />,\n // title: \"Import and export options\",\n // blocks: [{\n // key: 'export',\n // title: \"Export options\",\n // content: <ExportOptions />,\n // nonCollapsible: true,\n // }, {\n // key: 'import',\n // title: \"Import options\",\n // content: <ImportOptions />,\n // nonCollapsible: false,\n // collapsedByDefault: true,\n // }],\n // },\n};\n\nconst ProposalsBlockTitle: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { spawnTab, focusedTabURI } = useContext(TabbedWorkspaceContext);\n const { stakeholder, activeChangeRequestID } = useContext(BrowserCtx);\n const dashboardIsOpen = focusedTabURI?.startsWith(Protocols.PROPOSAL_WORK)\n const canOpenDashboard = !activeChangeRequestID;\n return <div css={css`display: flex; justify-content: space-between; align-items: center;`}>\n Pending proposals\n {stakeholder && (canImportCR(stakeholder) || canCreateCR(stakeholder))\n ? <Button\n minimal\n small\n disabled={!canOpenDashboard}\n intent={canOpenDashboard ? 'primary' : undefined}\n active={dashboardIsOpen}\n onClick={(evt) => {\n evt.stopPropagation();\n spawnTab(Protocols.PROPOSAL_WORK);\n }}>\n Propose…\n </Button>\n : null}\n </div>\n};\n\nexport const sidebarConfigForStakeholder: SuperSidebarConfig<typeof sidebarIDs> = update(\n sidebarConfig, {\n Browse: {\n blocks: {\n $splice: [[0, 0, {\n key: 'proposals',\n title: <ProposalsBlockTitle />,\n content: <ActionableCRTree />,\n nonCollapsible: false,\n height: 200,\n }]]\n }\n }\n });\n"]}
package/views/util.d.ts CHANGED
@@ -24,15 +24,23 @@ export declare const PropertyDetailView: React.FC<FormGroupProps & {
24
24
  /** Formats given date as a span with tooltip set to full ISO date & time. */
25
25
  export declare const Datestamp: React.FC<{
26
26
  date: Date;
27
+ /** See formatDate(). */
27
28
  useUTC?: boolean;
29
+ /** See formatDate(). */
28
30
  showTime?: boolean;
31
+ /** See formatDate(). */
32
+ showTimeIfNonZero?: boolean;
29
33
  title?: string;
30
34
  className?: string;
31
35
  }>;
32
36
  /** Foramts given date as plain text. */
33
37
  export declare function formatDate(date: Date, opts?: {
38
+ /** Show time in UTC. Will add the “UTC”, unless time is shown. */
34
39
  useUTC?: boolean;
40
+ /** Show date along with full time, to seconds. */
35
41
  showTime?: boolean;
42
+ /** Show time, unless it’s 00:00:00 on the day. */
43
+ showTimeIfNonZero?: boolean;
36
44
  }): string;
37
45
  export declare const _getRelatedClass: (classes: Record<string, ItemClassConfiguration<any>>) => (clsID: string) => RelatedItemClassConfiguration;
38
46
  export declare type ClassificationEntry = TagProps & {