@riboseinc/paneron-registry-kit 2.2.12 → 2.2.14

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 (47) hide show
  1. package/package.json +2 -2
  2. package/types/util.d.ts +3 -0
  3. package/types/util.js.map +1 -1
  4. package/views/SearchQuery.js +9 -1
  5. package/views/SearchQuery.js.map +1 -1
  6. package/views/change-request/ChangeRequestContext.d.ts +7 -0
  7. package/views/change-request/ChangeRequestContext.js +82 -2
  8. package/views/change-request/ChangeRequestContext.js.map +1 -1
  9. package/views/change-request/Proposals.d.ts +16 -3
  10. package/views/change-request/Proposals.js +175 -79
  11. package/views/change-request/Proposals.js.map +1 -1
  12. package/views/change-request/util.d.ts +4 -0
  13. package/views/change-request/util.js +14 -0
  14. package/views/change-request/util.js.map +1 -0
  15. package/views/detail/ChangeRequest/index.js +16 -16
  16. package/views/detail/ChangeRequest/index.js.map +1 -1
  17. package/views/detail/RegisterHome/ActiveProposalDetails.js +2 -1
  18. package/views/detail/RegisterHome/ActiveProposalDetails.js.map +1 -1
  19. package/views/detail/RegisterHome/Block.d.ts +12 -2
  20. package/views/detail/RegisterHome/Block.js +40 -14
  21. package/views/detail/RegisterHome/Block.js.map +1 -1
  22. package/views/detail/RegisterHome/MetaSummary.js +4 -4
  23. package/views/detail/RegisterHome/MetaSummary.js.map +1 -1
  24. package/views/detail/RegisterHome/index.js +91 -8
  25. package/views/detail/RegisterHome/index.js.map +1 -1
  26. package/views/detail/RegisterItem/index.js +5 -3
  27. package/views/detail/RegisterItem/index.js.map +1 -1
  28. package/views/index.js +1 -1
  29. package/views/index.js.map +1 -1
  30. package/views/util.d.ts +19 -13
  31. package/views/util.js +11 -39
  32. package/views/util.js.map +1 -1
  33. package/site-builder/index.d.ts +0 -3
  34. package/site-builder/index.js +0 -75
  35. package/site-builder/index.js.map +0 -1
  36. package/site-builder/jsx-runtime.d.ts +0 -18
  37. package/site-builder/jsx-runtime.js +0 -107
  38. package/site-builder/jsx-runtime.js.map +0 -1
  39. package/site-builder/page.d.ts +0 -6
  40. package/site-builder/page.js +0 -24
  41. package/site-builder/page.js.map +0 -1
  42. package/views/change-request/ChangeProposalContext.d.ts +0 -3
  43. package/views/change-request/ChangeProposalContext.js +0 -4
  44. package/views/change-request/ChangeProposalContext.js.map +0 -1
  45. package/views/change-request/State.d.ts +0 -0
  46. package/views/change-request/State.js +0 -1
  47. package/views/change-request/State.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riboseinc/paneron-registry-kit",
3
- "version": "2.2.12",
3
+ "version": "2.2.14",
4
4
  "main": "index.js",
5
5
  "author": "Ribose Inc. <open.source@ribose.com>",
6
6
  "scripts": {
@@ -28,7 +28,7 @@
28
28
  "@blueprintjs/select": "~4.9.10",
29
29
  "@emotion/react": "^11.10.6",
30
30
  "@emotion/styled": "^11.10.6",
31
- "@riboseinc/paneron-extension-kit": "2.2.10",
31
+ "@riboseinc/paneron-extension-kit": "2.2.11",
32
32
  "@types/react": "17.0.53",
33
33
  "@types/react-dom": "^17.0.2",
34
34
  "@types/react-helmet": "^6.1.2",
package/types/util.d.ts CHANGED
@@ -6,6 +6,9 @@ export interface Locale {
6
6
  }
7
7
  export interface Citation {
8
8
  title: string;
9
+ author?: string | null;
10
+ publicationDate?: string | null;
11
+ revisionDate?: string | null;
9
12
  seriesIssueID: string | null;
10
13
  seriesName: string | null;
11
14
  seriesPage: string | null;
package/types/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/types/util.ts"],"names":[],"mappings":"AAAA,YAAY","sourcesContent":["// Utilities\n\nexport interface Locale {\n name: string\n country: string\n languageCode: string // ISO 639-2\n characterEncoding: 'utf-8' // TODO: Support more encodings\n // TODO: citation?: CI_Citation\n}\n\n\nexport interface Citation {\n title: string\n\n seriesIssueID: string | null\n seriesName: string | null\n seriesPage: string | null\n\n edition: string | null\n editionDate: Date | null\n\n otherDetails: string\n\n isbn: string | null\n issn: string | null\n\n alternateTitles?: string[]\n\n uri?: string\n\n //publicationDate: Date\n}\n\n\nexport interface LocalizedAlternative<T> {\n alternative: T\n locale: Locale\n}\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/types/util.ts"],"names":[],"mappings":"AAAA,YAAY","sourcesContent":["// Utilities\n\nexport interface Locale {\n name: string\n country: string\n languageCode: string // ISO 639-2\n characterEncoding: 'utf-8' // TODO: Support more encodings\n // TODO: citation?: CI_Citation\n}\n\n\nexport interface Citation {\n title: string\n\n author?: string | null\n publicationDate?: string | null\n revisionDate?: string | null\n\n seriesIssueID: string | null\n seriesName: string | null\n seriesPage: string | null\n\n edition: string | null\n editionDate: Date | null\n\n otherDetails: string\n\n isbn: string | null\n issn: string | null\n\n alternateTitles?: string[]\n\n uri?: string\n\n //publicationDate: Date\n}\n\n\nexport interface LocalizedAlternative<T> {\n alternative: T\n locale: Locale\n}\n"]}
@@ -80,6 +80,13 @@ const SearchQuery = (0, _react.memo)(function ({
80
80
  };
81
81
  }
82
82
  }, [quickSearchString, getQuickSearchPredicate, itemClasses, subregisters]);
83
+ const quickSearchIsEnabled = onQuickSearchStringChange && !hasAdvancedQuery;
84
+ const quickSearchInputRef = (0, _react.useRef)(null);
85
+ (0, _react.useEffect)(() => {
86
+ if (quickSearchIsEnabled && quickSearchInputRef.current) {
87
+ quickSearchInputRef.current.focus();
88
+ }
89
+ }, []);
83
90
  return (0, _react2.jsx)(_core.ControlGroup, {
84
91
  fill: true,
85
92
  vertical: true,
@@ -87,7 +94,8 @@ const SearchQuery = (0, _react.memo)(function ({
87
94
  }, (0, _react2.jsx)(_core.InputGroup, {
88
95
  fill: true,
89
96
  small: true,
90
- disabled: !onQuickSearchStringChange || hasAdvancedQuery,
97
+ inputRef: quickSearchInputRef,
98
+ disabled: !quickSearchIsEnabled,
91
99
  value: hasAdvancedQuery ? '' : quickSearchString,
92
100
  leftIcon: "search",
93
101
  placeholder: "Quick search",
@@ -1 +1 @@
1
- {"version":3,"file":"SearchQuery.js","sourceRoot":"","sources":["../../src/views/SearchQuery.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useState, useContext, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Button, ControlGroup, Colors, InputGroup, Tag, ButtonGroup } from '@blueprintjs/core';\nimport CriteriaTree from './FilterCriteria';\nimport { CUSTOM_CONDITION, RAW_SUBSTRING } from './FilterCriteria/CRITERIA_CONFIGURATION';\nimport { CriteriaGroup, Criterion } from './FilterCriteria/models';\nimport criteriaGroupToQueryExpression from './FilterCriteria/criteriaGroupToQueryExpression';\n//import criteriaGroupToSummary from './FilterCriteria/criteriaGroupToSummary';\nimport { BrowserCtx } from './BrowserCtx';\n\n\nconst SearchQuery: React.FC<{\n rootCriteria: CriteriaGroup;\n onCriteriaChange?: (rootCriteria: CriteriaGroup) => void;\n\n quickSearchString: string;\n onQuickSearchStringChange?: (searchString: string) => void;\n\n availableClassIDs?: string[];\n className?: string;\n}> = memo(function ({\n rootCriteria,\n onCriteriaChange,\n quickSearchString,\n onQuickSearchStringChange,\n availableClassIDs,\n className,\n}) {\n const { itemClasses, subregisters, getQuickSearchPredicate } = useContext(BrowserCtx);\n\n const [ editingAdvanced, toggleEditingAdvanced ] = useState<boolean>(false);\n\n const classIDs = availableClassIDs ?? Object.keys(itemClasses);\n\n const hasAdvancedQuery = rootCriteria.criteria.length > 0;\n\n const makeDefaultCriteria = useCallback(function makeDefaultCriteria(): Criterion {\n if (quickSearchString) {\n if (getQuickSearchPredicate) {\n return {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: getQuickSearchPredicate(quickSearchString) },\n { itemClasses, subregisters },\n ),\n }\n } else {\n return {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters },\n ),\n }\n }\n } else {\n return {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: 'false' },\n { itemClasses, subregisters },\n ),\n }\n }\n }, [quickSearchString, getQuickSearchPredicate, itemClasses, subregisters]);\n\n return (\n <ControlGroup fill vertical className={className}>\n <InputGroup\n fill\n small\n disabled={!onQuickSearchStringChange || hasAdvancedQuery}\n value={hasAdvancedQuery ? '' : quickSearchString}\n leftIcon=\"search\"\n placeholder=\"Quick search\"\n title={!hasAdvancedQuery\n ? \"Search for a substring occurring anywhere within serialized item data.\"\n : \"Advanced query overrides quick search.\"}\n css={css`width: 200px; ${quickSearchString !== '' && !hasAdvancedQuery ? 'input { font-weight: bold; }' : ''}`}\n rightElement={<Button\n disabled={!onQuickSearchStringChange || quickSearchString === '' || hasAdvancedQuery}\n onClick={() => onQuickSearchStringChange?.('')}\n small\n minimal\n icon=\"cross\"\n title=\"Clear quick search\" />}\n onChange={evt => onQuickSearchStringChange?.(evt.currentTarget.value)} />\n <ButtonGroup fill>\n <Button\n fill\n small\n title=\"Edit advanced search query\"\n icon='filter'\n onClick={!hasAdvancedQuery\n ? (() => {\n onCriteriaChange!({ criteria: [makeDefaultCriteria()], require: 'all' });\n toggleEditingAdvanced(true);\n })\n : () => toggleEditingAdvanced(v => !v)}\n active={editingAdvanced && hasAdvancedQuery}\n disabled={!hasAdvancedQuery && !onCriteriaChange}\n rightIcon={rootCriteria.criteria.length > 0\n ? <Tag intent=\"success\" round>on</Tag>\n : <Tag round>off</Tag>}>\n Advanced\n </Button>\n </ButtonGroup>\n {hasAdvancedQuery && editingAdvanced\n ? <>\n <CriteriaTree\n key=\"tree\"\n criteria={rootCriteria}\n onChange={onCriteriaChange}\n itemClasses={itemClasses}\n availableClassIDs={classIDs}\n subregisters={subregisters}\n css={css`max-height: 50vh; overflow-y: auto;`} />\n <div\n key=\"query\"\n css={css`\n margin-top: 5px;\n padding: 0 10px 10px 10px;\n color: ${Colors.GRAY3};\n font-size: 90%;\n overflow-wrap: break-word;\n `}>\n Query used: <code>{criteriaGroupToQueryExpression(rootCriteria)}</code>\n </div>\n </>\n : null}\n </ControlGroup>\n );\n});\n\nexport default SearchQuery;\n"]}
1
+ {"version":3,"file":"SearchQuery.js","sourceRoot":"","sources":["../../src/views/SearchQuery.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useEffect, useRef, useState, useContext, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Button, ControlGroup, Colors, InputGroup, Tag, ButtonGroup } from '@blueprintjs/core';\nimport CriteriaTree from './FilterCriteria';\nimport { CUSTOM_CONDITION, RAW_SUBSTRING } from './FilterCriteria/CRITERIA_CONFIGURATION';\nimport { CriteriaGroup, Criterion } from './FilterCriteria/models';\nimport criteriaGroupToQueryExpression from './FilterCriteria/criteriaGroupToQueryExpression';\n//import criteriaGroupToSummary from './FilterCriteria/criteriaGroupToSummary';\nimport { BrowserCtx } from './BrowserCtx';\n\n\nconst SearchQuery: React.FC<{\n rootCriteria: CriteriaGroup;\n onCriteriaChange?: (rootCriteria: CriteriaGroup) => void;\n\n quickSearchString: string;\n onQuickSearchStringChange?: (searchString: string) => void;\n\n availableClassIDs?: string[];\n className?: string;\n}> = memo(function ({\n rootCriteria,\n onCriteriaChange,\n quickSearchString,\n onQuickSearchStringChange,\n availableClassIDs,\n className,\n}) {\n const { itemClasses, subregisters, getQuickSearchPredicate } = useContext(BrowserCtx);\n\n const [ editingAdvanced, toggleEditingAdvanced ] = useState<boolean>(false);\n\n const classIDs = availableClassIDs ?? Object.keys(itemClasses);\n\n const hasAdvancedQuery = rootCriteria.criteria.length > 0;\n\n const makeDefaultCriteria = useCallback(function makeDefaultCriteria(): Criterion {\n if (quickSearchString) {\n if (getQuickSearchPredicate) {\n return {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: getQuickSearchPredicate(quickSearchString) },\n { itemClasses, subregisters },\n ),\n }\n } else {\n return {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters },\n ),\n }\n }\n } else {\n return {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: 'false' },\n { itemClasses, subregisters },\n ),\n }\n }\n }, [quickSearchString, getQuickSearchPredicate, itemClasses, subregisters]);\n\n const quickSearchIsEnabled = onQuickSearchStringChange && !hasAdvancedQuery;\n const quickSearchInputRef = useRef<HTMLInputElement | null>(null);\n useEffect(() => {\n if (quickSearchIsEnabled && quickSearchInputRef.current) {\n quickSearchInputRef.current.focus();\n }\n }, []);\n\n return (\n <ControlGroup fill vertical className={className}>\n <InputGroup\n fill\n small\n inputRef={quickSearchInputRef}\n disabled={!quickSearchIsEnabled}\n value={hasAdvancedQuery ? '' : quickSearchString}\n leftIcon=\"search\"\n placeholder=\"Quick search\"\n title={!hasAdvancedQuery\n ? \"Search for a substring occurring anywhere within serialized item data.\"\n : \"Advanced query overrides quick search.\"}\n css={css`width: 200px; ${quickSearchString !== '' && !hasAdvancedQuery ? 'input { font-weight: bold; }' : ''}`}\n rightElement={<Button\n disabled={!onQuickSearchStringChange || quickSearchString === '' || hasAdvancedQuery}\n onClick={() => onQuickSearchStringChange?.('')}\n small\n minimal\n icon=\"cross\"\n title=\"Clear quick search\" />}\n onChange={evt => onQuickSearchStringChange?.(evt.currentTarget.value)} />\n <ButtonGroup fill>\n <Button\n fill\n small\n title=\"Edit advanced search query\"\n icon='filter'\n onClick={!hasAdvancedQuery\n ? (() => {\n onCriteriaChange!({ criteria: [makeDefaultCriteria()], require: 'all' });\n toggleEditingAdvanced(true);\n })\n : () => toggleEditingAdvanced(v => !v)}\n active={editingAdvanced && hasAdvancedQuery}\n disabled={!hasAdvancedQuery && !onCriteriaChange}\n rightIcon={rootCriteria.criteria.length > 0\n ? <Tag intent=\"success\" round>on</Tag>\n : <Tag round>off</Tag>}>\n Advanced\n </Button>\n </ButtonGroup>\n {hasAdvancedQuery && editingAdvanced\n ? <>\n <CriteriaTree\n key=\"tree\"\n criteria={rootCriteria}\n onChange={onCriteriaChange}\n itemClasses={itemClasses}\n availableClassIDs={classIDs}\n subregisters={subregisters}\n css={css`max-height: 50vh; overflow-y: auto;`} />\n <div\n key=\"query\"\n css={css`\n margin-top: 5px;\n padding: 0 10px 10px 10px;\n color: ${Colors.GRAY3};\n font-size: 90%;\n overflow-wrap: break-word;\n `}>\n Query used: <code>{criteriaGroupToQueryExpression(rootCriteria)}</code>\n </div>\n </>\n : null}\n </ControlGroup>\n );\n});\n\nexport default SearchQuery;\n"]}
@@ -2,6 +2,7 @@
2
2
  /** @jsxFrag React.Fragment */
3
3
  import React from 'react';
4
4
  import { type SomeCR as CR } from '../../types/cr';
5
+ import type { RegisterItem, Payload, ChangeProposal, InternalItemReference } from '../../types';
5
6
  export interface ChangeRequestContextSpec {
6
7
  /**
7
8
  * Change request object, undefined if not available/loading,
@@ -23,6 +24,12 @@ export interface ChangeRequestContextSpec {
23
24
  * Always false if `changeRequest` is not defined or `null`.
24
25
  */
25
26
  canDelete: boolean;
27
+ /**
28
+ * Propose new blank item of given item class.
29
+ * Will always be undefined if `canEdit` is not `true`.
30
+ */
31
+ proposeBlankItem?: (clsID: string) => Promise<InternalItemReference>;
32
+ updateItemProposal?: (summary: string, proposal: ChangeProposal | null, itemPath: string, item?: RegisterItem<any>, itemData?: Payload) => Promise<void>;
26
33
  /**
27
34
  * Function that performs CR deletion.
28
35
  * May not be present if operation is not possible right now,
@@ -13,12 +13,16 @@ var _context = require("@riboseinc/paneron-extension-kit/context");
13
13
 
14
14
  var _cr = require("../../types/cr");
15
15
 
16
+ var _types = require("../../types");
17
+
16
18
  var _BrowserCtx = require("../BrowserCtx");
17
19
 
18
20
  var _itemPathUtils = require("../itemPathUtils");
19
21
 
20
22
  var _TransitionOptions = require("./TransitionOptions");
21
23
 
24
+ var _objectChangeset = require("./objectChangeset");
25
+
22
26
  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
27
 
24
28
  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; }
@@ -43,11 +47,15 @@ const ChangeRequestContextProvider = function ({
43
47
 
44
48
  const {
45
49
  useObjectData,
50
+ makeRandomID,
51
+ updateObjects,
46
52
  updateTree,
47
53
  performOperation,
48
54
  isBusy
49
55
  } = (0, _react2.useContext)(_context.DatasetContext);
50
56
  const {
57
+ itemClasses,
58
+ subregisters,
51
59
  stakeholder
52
60
  } = (0, _react2.useContext)(_BrowserCtx.BrowserCtx);
53
61
  const crPath = changeRequestID ? `/proposals/${changeRequestID}/main.yaml` : null;
@@ -68,13 +76,85 @@ const ChangeRequestContextProvider = function ({
68
76
  commitMessage: 'remove unproposed CR draft'
69
77
  });
70
78
  }) : undefined, [isBusy, performOperation, updateTree, hasItems, canDelete]);
79
+ const proposeBlankItem = (0, _react2.useMemo)(() => {
80
+ if (!updateObjects || !makeRandomID || !canEdit || !changeRequest) {
81
+ return undefined;
82
+ } else {
83
+ return performOperation('creating blank item', async function _createItem(classID, subregisterID) {
84
+ var _a;
85
+
86
+ if (subregisters && !subregisterID) {
87
+ throw new Error("Unable to create item: register uses subregisters, but subregister ID was not provided");
88
+ }
89
+
90
+ const clsConfig = itemClasses[classID];
91
+
92
+ if (!clsConfig) {
93
+ throw new Error("Unable to generate new item data: item class configuration is missing");
94
+ }
95
+
96
+ const initialItemData = (_a = clsConfig === null || clsConfig === void 0 ? void 0 : clsConfig.defaults) !== null && _a !== void 0 ? _a : {};
97
+ const itemID = await makeRandomID();
98
+ const ref = {
99
+ classID,
100
+ itemID,
101
+ subregisterID
102
+ };
103
+ const registerItem = {
104
+ id: itemID,
105
+ dateAccepted: new Date(),
106
+ status: 'valid',
107
+ data: initialItemData
108
+ };
109
+ const itemPath = (0, _itemPathUtils.itemRefToItemPath)(ref);
110
+ await updateObjects({
111
+ commitMessage: `propose to add new ${ref.classID}`,
112
+ objectChangeset: (0, _objectChangeset.updateCRObjectChangeset)(changeRequest, {
113
+ [itemPath]: {
114
+ type: 'addition'
115
+ }
116
+ }, {
117
+ [itemPath]: registerItem
118
+ }),
119
+ _dangerouslySkipValidation: true
120
+ });
121
+ return ref;
122
+ });
123
+ }
124
+ }, [changeRequest, canEdit, subregisters === undefined, updateObjects, makeRandomID]);
125
+ const updateItemProposal = (0, _react2.useMemo)(() => changeRequest && canEdit && updateObjects ? async function _handleSetProposal(summary, proposal, itemPath, item, editedItemData) {
126
+ if (proposal && !item) {
127
+ throw new Error("Missing item");
128
+ }
129
+
130
+ if (proposal && (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'amendment' && (!editedItemData || !(0, _types.isRegisterItem)(editedItemData))) {
131
+ throw new Error("Missing item data");
132
+ }
133
+
134
+ await updateObjects({
135
+ commitMessage: `${summary} for ${itemPath}`,
136
+ objectChangeset: (0, _objectChangeset.updateCRObjectChangeset)( // TODO: We are sure it’s editable already, but casting should be avoided
137
+ changeRequest, {
138
+ [itemPath]: proposal
139
+ }, proposal && (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'amendment' && editedItemData && item ? {
140
+ [itemPath]: { ...item,
141
+ data: editedItemData
142
+ }
143
+ } : {}),
144
+ // We need this because updateCRObjectChangeset
145
+ // omits oldValue for item data payloads.
146
+ _dangerouslySkipValidation: true
147
+ });
148
+ } : undefined, [canEdit, changeRequest, updateObjects]);
71
149
  const ctx = (0, _react2.useMemo)(() => ({
72
150
  changeRequest,
73
151
  canEdit,
74
152
  canTransition,
75
153
  canDelete,
76
- deleteCR
77
- }), [changeRequest, canEdit, deleteCR, canDelete]);
154
+ deleteCR,
155
+ proposeBlankItem,
156
+ updateItemProposal
157
+ }), [changeRequest, canEdit, deleteCR, canDelete, proposeBlankItem, updateItemProposal]);
78
158
  return (0, _react.jsx)(ChangeRequestContext.Provider, {
79
159
  value: ctx
80
160
  }, children);
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeRequestContext.js","sourceRoot":"","sources":["../../../src/views/change-request/ChangeRequestContext.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx } from '@emotion/react';\nimport React, { useMemo, useContext } from 'react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { type SomeCR as CR, canBeDeletedBy, canBeEditedBy } from '../../types/cr';\nimport { BrowserCtx } from '../BrowserCtx';\nimport { crIDToCRPath } from '../itemPathUtils';\nimport { canBeTransitionedBy } from './TransitionOptions';\n\n\nexport interface ChangeRequestContextSpec {\n /**\n * Change request object, undefined if not available/loading,\n * null is out of ordinary (i.e. changeRequestID is not given).\n */\n changeRequest?: CR | null\n\n /**\n * Contents of current CR can be edited by current stakeholder.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canEdit: boolean\n\n /**\n * Current CR can be transitioned by current stsakeholder.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canTransition: boolean\n\n /**\n * Current CR can be deleted by current stakeholder.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canDelete: boolean\n\n /**\n * Function that performs CR deletion.\n * May not be present if operation is not possible right now,\n * but otherwise is present if `canDelete` is true.\n */\n deleteCR?: () => Promise<void>\n\n}\n\nexport const ChangeRequestContext = React.createContext<ChangeRequestContextSpec>({\n changeRequest: null,\n canEdit: false,\n canTransition: false,\n canDelete: false,\n});\n\nexport const ChangeRequestContextProvider: React.FC<{\n changeRequestID: string | null\n}> = function ({ changeRequestID, children }) {\n const { useObjectData, updateTree, performOperation, isBusy } = useContext(DatasetContext);\n const { stakeholder } = useContext(BrowserCtx);\n\n const crPath = changeRequestID\n ? `/proposals/${changeRequestID}/main.yaml`\n : null;\n\n const changeRequest = useObjectData({\n objectPaths: crPath ? [crPath] : [],\n nounLabel: 'proposal(s)',\n }).value?.data[crPath ?? ''] as CR ?? (crPath ? undefined : null);\n\n const canEdit = changeRequest\n && stakeholder\n && canBeEditedBy(stakeholder, changeRequest)\n ? true\n : false;\n\n const canTransition = changeRequest\n && stakeholder\n && canBeTransitionedBy(stakeholder, changeRequest)\n ? true\n : false;\n\n const canDelete = changeRequest\n && stakeholder\n && canBeDeletedBy(stakeholder, changeRequest)\n ? true\n : false;\n\n const crItemEntries = Object.entries(changeRequest?.items ?? []).map(i => JSON.stringify(i));\n const hasItems = crItemEntries.length > 0;\n\n const deleteCR = useMemo((() =>\n !isBusy && canDelete && updateTree\n ? performOperation('deleting proposal', async function handleDelete() {\n const subtreeRoot = crIDToCRPath(changeRequest.id).replace('/main.yaml', '');\n await updateTree({\n subtreeRoot,\n newSubtreeRoot: null,\n commitMessage: 'remove unproposed CR draft',\n });\n })\n : undefined\n ), [\n isBusy, performOperation,\n updateTree,\n hasItems, canDelete,\n ]);\n\n const ctx: ChangeRequestContextSpec = useMemo((() => ({\n changeRequest,\n canEdit,\n canTransition,\n canDelete,\n deleteCR,\n })), [changeRequest, canEdit, deleteCR, canDelete]);\n\n return (\n <ChangeRequestContext.Provider value={ctx}>\n {children}\n </ChangeRequestContext.Provider>\n );\n};\n"]}
1
+ {"version":3,"file":"ChangeRequestContext.js","sourceRoot":"","sources":["../../../src/views/change-request/ChangeRequestContext.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx } from '@emotion/react';\nimport React, { useMemo, useContext } from 'react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { type SomeCR as CR, canBeDeletedBy, canBeEditedBy } from '../../types/cr';\nimport type { RegisterItem, Payload, ChangeProposal, InternalItemReference } from '../../types';\nimport { isRegisterItem } from '../../types';\nimport { BrowserCtx } from '../BrowserCtx';\nimport { itemRefToItemPath, crIDToCRPath } from '../itemPathUtils';\nimport { canBeTransitionedBy } from './TransitionOptions';\nimport { updateCRObjectChangeset } from './objectChangeset';\n\n\nexport interface ChangeRequestContextSpec {\n /**\n * Change request object, undefined if not available/loading,\n * null is out of ordinary (i.e. changeRequestID is not given).\n */\n changeRequest?: CR | null\n\n /**\n * Contents of current CR can be edited by current stakeholder.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canEdit: boolean\n\n /**\n * Current CR can be transitioned by current stsakeholder.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canTransition: boolean\n\n /**\n * Current CR can be deleted by current stakeholder.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canDelete: boolean\n\n /**\n * Propose new blank item of given item class.\n * Will always be undefined if `canEdit` is not `true`.\n */\n proposeBlankItem?: (clsID: string) => Promise<InternalItemReference>\n\n updateItemProposal?: (\n summary: string,\n proposal: ChangeProposal | null,\n itemPath: string,\n item?: RegisterItem<any>,\n itemData?: Payload,\n ) => Promise<void>\n\n /**\n * Function that performs CR deletion.\n * May not be present if operation is not possible right now,\n * but otherwise is present if `canDelete` is true.\n */\n deleteCR?: () => Promise<void>\n\n}\n\nexport const ChangeRequestContext = React.createContext<ChangeRequestContextSpec>({\n changeRequest: null,\n canEdit: false,\n canTransition: false,\n canDelete: false,\n});\n\nexport const ChangeRequestContextProvider: React.FC<{\n changeRequestID: string | null\n}> = function ({ changeRequestID, children }) {\n const { useObjectData, makeRandomID, updateObjects, updateTree, performOperation, isBusy } = useContext(DatasetContext);\n const { itemClasses, subregisters, stakeholder } = useContext(BrowserCtx);\n\n const crPath = changeRequestID\n ? `/proposals/${changeRequestID}/main.yaml`\n : null;\n\n const changeRequest = useObjectData({\n objectPaths: crPath ? [crPath] : [],\n nounLabel: 'proposal(s)',\n }).value?.data[crPath ?? ''] as CR ?? (crPath ? undefined : null);\n\n const canEdit = changeRequest\n && stakeholder\n && canBeEditedBy(stakeholder, changeRequest)\n ? true\n : false;\n\n const canTransition = changeRequest\n && stakeholder\n && canBeTransitionedBy(stakeholder, changeRequest)\n ? true\n : false;\n\n const canDelete = changeRequest\n && stakeholder\n && canBeDeletedBy(stakeholder, changeRequest)\n ? true\n : false;\n\n const crItemEntries = Object.entries(changeRequest?.items ?? []).map(i => JSON.stringify(i));\n const hasItems = crItemEntries.length > 0;\n\n const deleteCR = useMemo((() =>\n !isBusy && canDelete && updateTree\n ? performOperation('deleting proposal', async function handleDelete() {\n const subtreeRoot = crIDToCRPath(changeRequest.id).replace('/main.yaml', '');\n await updateTree({\n subtreeRoot,\n newSubtreeRoot: null,\n commitMessage: 'remove unproposed CR draft',\n });\n })\n : undefined\n ), [\n isBusy, performOperation,\n updateTree,\n hasItems, canDelete,\n ]);\n\n const proposeBlankItem = useMemo((() => {\n if (!updateObjects || !makeRandomID || !canEdit || !changeRequest) {\n return undefined;\n } else {\n return performOperation('creating blank item', async function _createItem(classID: string, subregisterID?: string) {\n if (subregisters && !subregisterID) {\n throw new Error(\"Unable to create item: register uses subregisters, but subregister ID was not provided\");\n }\n const clsConfig = itemClasses[classID];\n if (!clsConfig) {\n throw new Error(\"Unable to generate new item data: item class configuration is missing\");\n }\n const initialItemData = clsConfig?.defaults ?? {};\n const itemID = await makeRandomID();\n const ref: InternalItemReference = { classID, itemID, subregisterID };\n const registerItem: RegisterItem<any> = {\n id: itemID,\n dateAccepted: new Date(),\n status: 'valid',\n data: initialItemData,\n };\n const itemPath = itemRefToItemPath(ref);\n await updateObjects({\n commitMessage: `propose to add new ${ref.classID}`,\n objectChangeset: updateCRObjectChangeset(\n changeRequest as any,\n { [itemPath]: { type: 'addition' } },\n { [itemPath]: registerItem },\n ),\n _dangerouslySkipValidation: true,\n });\n return ref;\n })\n }\n }), [changeRequest, canEdit, subregisters === undefined, updateObjects, makeRandomID]);\n\n const updateItemProposal = useMemo((() =>\n changeRequest && canEdit && updateObjects\n ? async function _handleSetProposal(\n summary: string,\n proposal: ChangeProposal | null,\n itemPath: string,\n item?: RegisterItem<any>,\n editedItemData?: Payload,\n ): Promise<void> {\n if (proposal && !item) {\n throw new Error(\"Missing item\");\n }\n if (proposal && proposal?.type !== 'amendment' && (!editedItemData || !isRegisterItem(editedItemData))) {\n throw new Error(\"Missing item data\");\n }\n await updateObjects({\n commitMessage: `${summary} for ${itemPath}`,\n objectChangeset: updateCRObjectChangeset(\n // TODO: We are sure it’s editable already, but casting should be avoided\n changeRequest as any,\n { [itemPath]: proposal },\n ((proposal && proposal?.type !== 'amendment') && editedItemData && item)\n ? { [itemPath]: { ...item, data: editedItemData } }\n : {},\n ),\n // We need this because updateCRObjectChangeset\n // omits oldValue for item data payloads.\n _dangerouslySkipValidation: true,\n });\n }\n : undefined\n ), [canEdit, changeRequest, updateObjects]);\n\n const ctx: ChangeRequestContextSpec = useMemo((() => ({\n changeRequest,\n canEdit,\n canTransition,\n canDelete,\n deleteCR,\n proposeBlankItem,\n updateItemProposal,\n })), [changeRequest, canEdit, deleteCR, canDelete, proposeBlankItem, updateItemProposal]);\n\n return (\n <ChangeRequestContext.Provider value={ctx}>\n {children}\n </ChangeRequestContext.Provider>\n );\n};\n"]}
@@ -1,12 +1,25 @@
1
1
  /** @jsx jsx */
2
2
  /** @jsxFrag React.Fragment */
3
3
  import React from 'react';
4
+ import { jsx } from '@emotion/react';
4
5
  import type { ChangeProposal, Clarification, InternalItemReference, Payload, RegisterItem } from '../../types';
5
6
  import type { Drafted } from '../../types/cr';
6
- declare const Proposals: React.FC<{
7
- proposals: Drafted['items'];
7
+ interface ProposalBrowserProps<CR extends Drafted> {
8
+ proposals: CR['items'];
9
+ /**
10
+ * If provided, button to delete each proposed change
11
+ * is shown in change card list mode.
12
+ */
13
+ onDeleteProposalForItemAtPath?: (itemPath: string) => void;
8
14
  className?: string;
9
- }>;
15
+ }
16
+ /**
17
+ * Shows a list of individual proposed changes as cards by default,
18
+ * allowing to expand a proposal and view item details.
19
+ *
20
+ * If no proposals exist, returns null.
21
+ */
22
+ export declare function Proposals<CR extends Drafted>({ proposals, onDeleteProposalForItemAtPath, className }: ProposalBrowserProps<CR>): jsx.JSX.Element | null;
10
23
  interface ProposalProps<P extends ChangeProposal> {
11
24
  proposal: P;
12
25
  /** Highlight changes. */
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.Proposals = Proposals;
6
7
  exports.default = exports.ProposalSummary = exports.ProposalDetail = void 0;
7
8
 
8
9
  var _react = _interopRequireWildcard(require("react"));
@@ -29,6 +30,10 @@ var _useItemClassConfig = _interopRequireDefault(require("../hooks/useItemClassC
29
30
 
30
31
  var _InlineDiff = require("../diffing/InlineDiff");
31
32
 
33
+ var _util = require("./util");
34
+
35
+ var _Block = require("../detail/RegisterHome/Block");
36
+
32
37
  var _RegisterItem = require("../detail/RegisterItem");
33
38
 
34
39
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -43,9 +48,17 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
43
48
  function stringifiedJSONEqual(i1, i2) {
44
49
  return JSON.stringify(i1) === JSON.stringify(i2);
45
50
  }
51
+ /**
52
+ * Shows a list of individual proposed changes as cards by default,
53
+ * allowing to expand a proposal and view item details.
54
+ *
55
+ * If no proposals exist, returns null.
56
+ */
46
57
 
47
- const Proposals = function ({
58
+
59
+ function Proposals({
48
60
  proposals,
61
+ onDeleteProposalForItemAtPath,
49
62
  className
50
63
  }) {
51
64
  var _a, _b;
@@ -138,17 +151,24 @@ const Proposals = function ({
138
151
  }), [proposals, getCurrentItem, getProposedItem]);
139
152
  const haveSelectedItem = selectedProposal && selectedItemRef && proposals[selectedProposal] && (selectedItemProposed || selectedItemCurrent);
140
153
  const proposalCount = Object.keys(proposals).length;
154
+ const selectedProposalDetailRef = (0, _react.useRef)(null);
141
155
  (0, _react.useEffect)(() => {
142
- if (!selectedProposal) {
143
- const firstProposal = Object.keys(proposals)[0];
144
-
145
- if (firstProposal) {
146
- if (getCurrentItem(firstProposal) || getProposedItem(firstProposal)) {
147
- selectProposal(firstProposal);
148
- }
156
+ // if (!selectedProposal) {
157
+ // const firstProposal = Object.keys(proposals)[0];
158
+ // if (firstProposal) {
159
+ // if (getCurrentItem(firstProposal) || getProposedItem(firstProposal)) {
160
+ // selectProposal(firstProposal);
161
+ // }
162
+ // }
163
+ // }
164
+ if (selectedProposal) {
165
+ if (selectedProposalDetailRef.current) {
166
+ selectedProposalDetailRef.current.scrollIntoView({
167
+ block: 'center'
168
+ });
149
169
  }
150
170
  }
151
- }, [proposalCount, selectedProposal, getCurrentItem, getProposedItem]);
171
+ }, [selectedProposal === null]);
152
172
  const canShowDiff = haveSelectedItem && ((_a = proposals[selectedProposal]) === null || _a === void 0 ? void 0 : _a.type) === 'clarification' ? true : false;
153
173
  const showDiff = canShowDiff && preferDiff;
154
174
 
@@ -160,67 +180,144 @@ const Proposals = function ({
160
180
  proposal: proposals[selectedProposal]
161
181
  }) : (0, _react2.jsx)(_react.default.Fragment, null, "Select item\u2026");
162
182
  const icon = haveSelectedItem ? getProposalIcon(proposals[selectedProposal]) : undefined;
163
- return (0, _react2.jsx)("div", {
164
- css: (0, _react2.css)`display: flex; flex-flow: column nowrap;`,
165
- className: className
166
- }, proposalCount > 0 ? (0, _react2.jsx)(_core.ButtonGroup, {
167
- css: (0, _react2.css)`margin: 5px 0 0 5px;`
168
- }, haveSelectedItem ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.Button, {
169
- disabled: !jumpTo || ((_b = proposals[selectedProposal]) === null || _b === void 0 ? void 0 : _b.type) === 'addition',
170
- icon: 'locate',
171
- onClick: () => jumpTo === null || jumpTo === void 0 ? void 0 : jumpTo(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${selectedProposal}`),
172
- title: "Open selected item in a new tab (not applicable to proposed additions)"
173
- }), (0, _react2.jsx)(_core.Button, {
174
- active: preferDiff,
175
- onClick: () => setPreferDiff(v => !v),
176
- // Diffing only makes sense for clarifications.
177
- // Additions are entire new items, and for amendments
178
- // item data is unchanged.
179
- disabled: !canShowDiff,
180
- icon: "changes",
181
- title: "Annotate proposed clarifications for this item"
182
- })) : null, (0, _react2.jsx)(_react2.ClassNames, null, ({
183
- css: css2
184
- }) => (0, _react2.jsx)(_select.Select2, {
185
- filterable: false,
186
- itemsEqual: stringifiedJSONEqual,
187
- menuProps: {
188
- className: css2(`height: 50vh; overflow-y: auto;`)
189
- },
190
- activeItem: activeItem,
191
- items: allItems,
192
- popoverProps: {
193
- minimal: true
194
- },
195
- fill: true,
196
- itemRenderer: ChangeProposalItemView,
197
- onItemSelect: handleItemSelect
198
- }, (0, _react2.jsx)(_core.Button, {
199
- rightIcon: "chevron-down",
200
- icon: icon,
201
- css: (0, _react2.css)`white-space: nowrap;`
202
- }, selectedItemSummary)))) : null, haveSelectedItem ? (0, _react2.jsx)("div", {
203
- css: (0, _react2.css)`position: relative; flex: 1;`
204
- }, (0, _react2.jsx)(_BrowserCtx.BrowserCtx.Provider, {
205
- value: proposalBrowserCtx
206
- }, (0, _react2.jsx)(_ErrorBoundary.default, {
207
- viewName: "Proposal detail"
208
- }, (0, _react2.jsx)(ProposalDetail, {
209
- itemRef: selectedItemRef,
210
- showDiff: showDiff,
211
- //showOnlyChanged={showOnlyChanged}
212
- item: selectedItemProposed !== null && selectedItemProposed !== void 0 ? selectedItemProposed : selectedItemCurrent,
213
- itemBefore: selectedItemCurrent !== null && selectedItemCurrent !== void 0 ? selectedItemCurrent : undefined,
214
- proposal: proposals[selectedProposal]
215
- })))) : null);
183
+
184
+ if (proposalCount > 0 && haveSelectedItem) {
185
+ return (0, _react2.jsx)(_core.Card, {
186
+ key: selectedProposal,
187
+ elevation: 0,
188
+ css: (0, _react2.css)`
189
+ flex: 100%;
190
+ background: ${_core.Colors.LIGHT_GRAY3};
191
+ padding: 0;
192
+ min-height: 70vh;
193
+
194
+ overflow: hidden;
195
+
196
+ border-radius: 5px;
197
+ display: flex;
198
+ flex-flow: column nowrap;
199
+ transition:
200
+ width .5s linear
201
+ height .5s linear;
202
+ `,
203
+ className: className
204
+ }, (0, _react2.jsx)(_core.ButtonGroup, null, (0, _react2.jsx)(_core.Button, {
205
+ disabled: !jumpTo || ((_b = proposals[selectedProposal]) === null || _b === void 0 ? void 0 : _b.type) === 'addition',
206
+ icon: 'open-application',
207
+ onClick: () => jumpTo === null || jumpTo === void 0 ? void 0 : jumpTo(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${selectedProposal}`),
208
+ title: "Open selected item in a new tab (not applicable to proposed additions)"
209
+ }), (0, _react2.jsx)(_core.Button, {
210
+ active: preferDiff,
211
+ onClick: () => setPreferDiff(v => !v),
212
+ // Diffing only makes sense for clarifications.
213
+ // Additions are entire new items, and for amendments
214
+ // item data is unchanged.
215
+ disabled: !canShowDiff,
216
+ text: "Compare",
217
+ title: "Annotate proposed clarifications for this item"
218
+ }), (0, _react2.jsx)(_react2.ClassNames, null, ({
219
+ css: css2
220
+ }) => (0, _react2.jsx)(_select.Select2, {
221
+ filterable: false,
222
+ itemsEqual: stringifiedJSONEqual,
223
+ menuProps: {
224
+ className: css2(`max-height: 50vh; overflow-y: auto;`)
225
+ },
226
+ activeItem: activeItem,
227
+ items: allItems,
228
+ popoverProps: {
229
+ minimal: true,
230
+ matchTargetWidth: true
231
+ },
232
+ fill: true,
233
+ itemRenderer: ChangeProposalItemView,
234
+ onItemSelect: handleItemSelect
235
+ }, (0, _react2.jsx)(_core.Button, {
236
+ fill: true,
237
+ rightIcon: "chevron-down",
238
+ icon: icon,
239
+ css: (0, _react2.css)`white-space: nowrap;`
240
+ }, selectedItemSummary))), (0, _react2.jsx)(_core.Button, {
241
+ onClick: () => selectProposal(null),
242
+ icon: "minimize",
243
+ title: "Minimize proposed change view",
244
+ text: "Minimize"
245
+ })), (0, _react2.jsx)("div", {
246
+ css: (0, _react2.css)`position: relative; flex: 1;`,
247
+ ref: selectedProposalDetailRef
248
+ }, (0, _react2.jsx)(_BrowserCtx.BrowserCtx.Provider, {
249
+ value: proposalBrowserCtx
250
+ }, (0, _react2.jsx)(_ErrorBoundary.default, {
251
+ viewName: "Proposal detail"
252
+ }, (0, _react2.jsx)(ProposalDetail, {
253
+ itemRef: selectedItemRef,
254
+ showDiff: showDiff,
255
+ //showOnlyChanged={showOnlyChanged}
256
+ item: selectedItemProposed !== null && selectedItemProposed !== void 0 ? selectedItemProposed : selectedItemCurrent,
257
+ itemBefore: selectedItemCurrent !== null && selectedItemCurrent !== void 0 ? selectedItemCurrent : undefined,
258
+ proposal: proposals[selectedProposal]
259
+ })))));
260
+ } else {
261
+ return (0, _react2.jsx)(_react.default.Fragment, null, allItems.map(cpi => {
262
+ const actions = [{
263
+ onClick: () => selectProposal(cpi.itemPath),
264
+ text: "Expand",
265
+ title: "Expand proposed change to see item details",
266
+ icon: 'maximize'
267
+ }];
268
+
269
+ if (onDeleteProposalForItemAtPath) {
270
+ actions.push({
271
+ text: "Delete this proposal",
272
+ intent: 'danger',
273
+ onClick: () => onDeleteProposalForItemAtPath(cpi.itemPath),
274
+ icon: 'trash'
275
+ });
276
+ }
277
+
278
+ return (0, _react2.jsx)(_Block.HomeBlockCard, {
279
+ css: (0, _react2.css)`
280
+ flex-basis: calc(33.33% - 10px*2/3);
281
+ `,
282
+ description: `${cpi.proposal.type} proposal`,
283
+ key: cpi.itemPath
284
+ }, (0, _react2.jsx)(ProposalType, {
285
+ item: cpi
286
+ }), (0, _react2.jsx)("div", {
287
+ css: (0, _react2.css)`padding: 5px; flex-grow: 1;`
288
+ }, cpi.item !== null ? (0, _react2.jsx)(_core.H5, {
289
+ css: (0, _react2.css)`margin: 0; overflow: hidden; text-overflow: ellipsis;`
290
+ }, (0, _react2.jsx)(ProposalSummary, {
291
+ itemRef: cpi.itemRef,
292
+ proposal: cpi.proposal,
293
+ itemBefore: cpi.itemBefore,
294
+ item: cpi.item
295
+ })) : (0, _react2.jsx)(_react.default.Fragment, null, "Problem reading proposed item data.")), actions.length > 0 ? (0, _react2.jsx)(_Block.HomeBlockActions, {
296
+ actions: actions
297
+ }) : null);
298
+ }));
299
+ }
216
300
  } else {
217
- return (0, _react2.jsx)(_core.NonIdealState, {
218
- icon: 'clean',
219
- className: className,
220
- title: "Nothing is proposed here yet."
221
- });
301
+ return null;
222
302
  }
223
- };
303
+ }
304
+
305
+ ;
306
+
307
+ function ProposalType({
308
+ item
309
+ }) {
310
+ const proposalConfig = item.proposal.type === 'amendment' ? PROPOSAL_VIEWS[item.proposal.amendmentType] : PROPOSAL_VIEWS[item.proposal.type]; //const ProposalTypeLabel: React.FC<ProposalProps<any>> = proposalConfig.summary;
311
+
312
+ const tagProps = (0, _util.proposalToTagProps)(item.proposal);
313
+ return (0, _react2.jsx)(_core.Tag, {
314
+ minimal: true,
315
+ ...tagProps,
316
+ rightIcon: (0, _react2.jsx)(_HelpTooltip.default, {
317
+ content: (0, _react2.jsx)(_react.default.Fragment, null, "Proposed to be ", proposalConfig.hint)
318
+ })
319
+ });
320
+ }
224
321
 
225
322
  const ChangeProposalItemView = (item, {
226
323
  handleClick,
@@ -229,15 +326,12 @@ const ChangeProposalItemView = (item, {
229
326
  }) => {
230
327
  if (item.item !== null) {
231
328
  const i = item;
232
- const proposalConfig = item.proposal.type === 'amendment' ? PROPOSAL_VIEWS[item.proposal.amendmentType] : PROPOSAL_VIEWS[item.proposal.type];
233
- const ProposalTypeLabel = proposalConfig.summary;
234
329
  return (0, _react2.jsx)(_core.MenuItem, {
235
330
  active: modifiers.active,
236
331
  disabled: modifiers.disabled,
237
- labelElement: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(ProposalTypeLabel, { ...i
238
- }), " ", (0, _react2.jsx)(_HelpTooltip.default, {
239
- content: (0, _react2.jsx)(_react.default.Fragment, null, "Proposed to be ", proposalConfig.hint)
240
- })),
332
+ labelElement: (0, _react2.jsx)(ProposalType, {
333
+ item: i
334
+ }),
241
335
  key: item.itemPath,
242
336
  onClick: handleClick,
243
337
  icon: getProposalIcon(item.proposal),
@@ -302,7 +396,7 @@ const ProposalSummary = function ({
302
396
  itemBefore,
303
397
  onChange
304
398
  }) {
305
- var _a, _b;
399
+ var _a;
306
400
 
307
401
  const {
308
402
  itemClasses
@@ -310,13 +404,15 @@ const ProposalSummary = function ({
310
404
  const {
311
405
  classID
312
406
  } = itemRef;
313
- const ListItemView = (_b = (_a = itemClasses[classID]) === null || _a === void 0 ? void 0 : _a.views) === null || _b === void 0 ? void 0 : _b.listItemView;
407
+ const cls = itemClasses[classID];
408
+ const ListItemView = (_a = cls === null || cls === void 0 ? void 0 : cls.views) === null || _a === void 0 ? void 0 : _a.listItemView;
314
409
 
315
410
  if (ListItemView) {
316
- return (0, _react2.jsx)(ListItemView, {
411
+ return (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(ListItemView, {
317
412
  itemRef: itemRef,
318
- itemData: item.data
319
- });
413
+ itemData: item.data,
414
+ css: (0, _react2.css)`text-overflow: ellipsis; overflow: hidden;`
415
+ }), "\u2003", (0, _react2.jsx)("small", null, cls.meta.title));
320
416
  } else {
321
417
  return (0, _react2.jsx)(_ErrorState.default, {
322
418
  viewName: "list item view",