@riboseinc/paneron-registry-kit 2.2.10 → 2.2.11

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 (61) hide show
  1. package/index.js +18 -0
  2. package/index.js.map +1 -1
  3. package/package.json +2 -2
  4. package/types/cr.d.ts +18 -0
  5. package/types/cr.js +37 -1
  6. package/types/cr.js.map +1 -1
  7. package/types/item.d.ts +1 -1
  8. package/types/item.js.map +1 -1
  9. package/types/stakeholder.d.ts +3 -1
  10. package/types/stakeholder.js +20 -0
  11. package/types/stakeholder.js.map +1 -1
  12. package/views/AnnotatedChange.js +7 -5
  13. package/views/AnnotatedChange.js.map +1 -1
  14. package/views/GenericRelatedItemView.js +4 -47
  15. package/views/GenericRelatedItemView.js.map +1 -1
  16. package/views/ItemDrawer.d.ts +11 -0
  17. package/views/ItemDrawer.js +69 -0
  18. package/views/ItemDrawer.js.map +1 -0
  19. package/views/change-request/ChangeRequestContext.d.ts +17 -1
  20. package/views/change-request/ChangeRequestContext.js +29 -5
  21. package/views/change-request/ChangeRequestContext.js.map +1 -1
  22. package/views/change-request/Proposals.d.ts +2 -0
  23. package/views/change-request/Proposals.js +116 -80
  24. package/views/change-request/Proposals.js.map +1 -1
  25. package/views/change-request/Summary.d.ts +12 -0
  26. package/views/change-request/Summary.js +59 -0
  27. package/views/change-request/Summary.js.map +1 -0
  28. package/views/change-request/TransitionHistory.d.ts +30 -0
  29. package/views/change-request/TransitionHistory.js +307 -0
  30. package/views/change-request/TransitionHistory.js.map +1 -0
  31. package/views/change-request/TransitionOptions.d.ts +38 -0
  32. package/views/{detail/ChangeRequest/transitions.js → change-request/TransitionOptions.js} +61 -51
  33. package/views/change-request/TransitionOptions.js.map +1 -0
  34. package/views/change-request/objectChangeset.d.ts +1 -1
  35. package/views/change-request/objectChangeset.js +1 -1
  36. package/views/change-request/objectChangeset.js.map +1 -1
  37. package/views/detail/ChangeRequest/index.js +129 -142
  38. package/views/detail/ChangeRequest/index.js.map +1 -1
  39. package/views/detail/RegisterHome/MetaSummary.d.ts +9 -0
  40. package/views/detail/RegisterHome/MetaSummary.js +35 -0
  41. package/views/detail/RegisterHome/MetaSummary.js.map +1 -0
  42. package/views/detail/RegisterHome/Proposal.d.ts +24 -0
  43. package/views/detail/RegisterHome/Proposal.js +228 -0
  44. package/views/detail/RegisterHome/Proposal.js.map +1 -0
  45. package/views/detail/RegisterHome/index.js +427 -137
  46. package/views/detail/RegisterHome/index.js.map +1 -1
  47. package/views/detail/RegisterItem/index.d.ts +2 -3
  48. package/views/detail/RegisterItem/index.js +239 -140
  49. package/views/detail/RegisterItem/index.js.map +1 -1
  50. package/views/detail/RegisterMeta/RegisterMetaForm.js +37 -45
  51. package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
  52. package/views/detail/RegisterMeta/index.js +14 -11
  53. package/views/detail/RegisterMeta/index.js.map +1 -1
  54. package/views/diffing/InlineDiff.d.ts +27 -1
  55. package/views/diffing/InlineDiff.js +113 -2
  56. package/views/diffing/InlineDiff.js.map +1 -1
  57. package/views/util.d.ts +36 -2
  58. package/views/util.js +203 -2
  59. package/views/util.js.map +1 -1
  60. package/views/detail/ChangeRequest/transitions.d.ts +0 -28
  61. package/views/detail/ChangeRequest/transitions.js.map +0 -1
@@ -0,0 +1,11 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import React from 'react';
4
+ import type { InternalItemReference } from '../types';
5
+ declare const ItemSearchDrawer: React.FC<{
6
+ isOpen: boolean;
7
+ onClose: () => void;
8
+ onChooseItem: (itemRef: InternalItemReference) => void;
9
+ availableClassIDs: string[];
10
+ }>;
11
+ export default ItemSearchDrawer;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("@emotion/react");
9
+
10
+ var _react2 = require("react");
11
+
12
+ var _core = require("@blueprintjs/core");
13
+
14
+ var _BrowserCtx = require("./BrowserCtx");
15
+
16
+ var _Search = _interopRequireDefault(require("./sidebar/Search"));
17
+
18
+ var _itemPathUtils = require("./itemPathUtils");
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
22
+ /** @jsx jsx */
23
+
24
+ /** @jsxFrag React.Fragment */
25
+ const ItemSearchDrawer = function ({
26
+ isOpen,
27
+ onClose,
28
+ onChooseItem,
29
+ availableClassIDs
30
+ }) {
31
+ const {
32
+ subregisters
33
+ } = (0, _react2.useContext)(_BrowserCtx.BrowserCtx);
34
+ const classCriteria = (0, _react2.useMemo)(() => availableClassIDs.map(clsID => ({
35
+ key: 'item-class',
36
+ query: `objPath.indexOf(\"/${clsID}/\") >= 0`
37
+ })), [availableClassIDs.toString()]);
38
+ const implicitCriteria = (0, _react2.useMemo)(() => classCriteria.length > 0 ? {
39
+ require: 'any',
40
+ criteria: classCriteria
41
+ } : undefined, [classCriteria]);
42
+ const handleOpenItem = (0, _react2.useCallback)(itemPath => {
43
+ onChooseItem((0, _itemPathUtils.itemPathToItemRef)(subregisters !== undefined, itemPath));
44
+ onClose();
45
+ }, [onChooseItem, onClose]);
46
+ return (0, _react.jsx)(_core.Drawer, {
47
+ isOpen: isOpen,
48
+ onClose: onClose,
49
+ enforceFocus: false,
50
+ style: {
51
+ padding: '0',
52
+ width: 'unset'
53
+ }
54
+ }, (0, _react.jsx)(_Search.default, {
55
+ style: {
56
+ height: '100vh',
57
+ width: '80vw',
58
+ minWidth: '500px',
59
+ maxWidth: '100vw'
60
+ },
61
+ availableClassIDs: availableClassIDs,
62
+ implicitCriteria: implicitCriteria,
63
+ stateName: "superseding-item-selector-search",
64
+ onOpenItem: handleOpenItem
65
+ }));
66
+ };
67
+
68
+ var _default = ItemSearchDrawer;
69
+ exports.default = _default;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ItemDrawer.js","sourceRoot":"","sources":["../../src/views/ItemDrawer.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAc,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,MAAM,gBAAgB,GAKjB,UAAU,EACb,MAAM,EAAE,OAAO,EAAE,YAAY,EAC7B,iBAAiB,GAClB;IACC,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAEhD,MAAM,aAAa,GAAgB,OAAO,CAAC,GAAG,EAAE,CAAC,CAC/C,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9B,GAAG,EAAE,YAAY;QACjB,KAAK,EAAE,sBAAsB,KAAK,WAAW;KAC9C,CAAC,CAAC,CACJ,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEnC,MAAM,gBAAgB,GAA8B,OAAO,CAAC,GAAG,EAAE,CAAC,CAChE,aAAa,CAAC,MAAM,GAAG,CAAC;QACtB,CAAC,CAAC;YACE,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,aAAa;SACxB;QACH,CAAC,CAAC,SAAS,CACd,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC9C,YAAY,CAAC,iBAAiB,CAAC,YAAY,KAAK,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtE,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5B,OAAO,CACL,IAAC,MAAM,IACH,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,KAAK,EACnB,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE;QACzC,IAAC,MAAM,IACL,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAC/E,iBAAiB,EAAE,iBAAiB,EACpC,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAC,kCAAkC,EAC5C,UAAU,EAAE,cAAc,GAC1B,CACK,CACV,CAAC;AACJ,CAAC,CAAC;AAGF,eAAe,gBAAgB,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx } from '@emotion/react';\nimport React, { useContext, useMemo, useCallback } from 'react';\nimport { Drawer } from '@blueprintjs/core';\nimport type { InternalItemReference } from '../types';\nimport type { Criterion, CriteriaGroup } from './FilterCriteria/models';\nimport { BrowserCtx } from './BrowserCtx';\nimport Search from './sidebar/Search';\nimport { itemPathToItemRef } from './itemPathUtils';\n\n\nconst ItemSearchDrawer: React.FC<{\n isOpen: boolean\n onClose: () => void\n onChooseItem: (itemRef: InternalItemReference) => void\n availableClassIDs: string[]\n}> = function ({\n isOpen, onClose, onChooseItem,\n availableClassIDs,\n}) {\n const { subregisters } = useContext(BrowserCtx);\n\n const classCriteria: Criterion[] = useMemo(() => (\n availableClassIDs.map(clsID => ({\n key: 'item-class',\n query: `objPath.indexOf(\\\"/${clsID}/\\\") >= 0`,\n }))\n ), [availableClassIDs.toString()]);\n\n const implicitCriteria: CriteriaGroup | undefined = useMemo(() => (\n classCriteria.length > 0\n ? {\n require: 'any',\n criteria: classCriteria,\n }\n : undefined\n ), [classCriteria]);\n\n const handleOpenItem = useCallback((itemPath) => {\n onChooseItem(itemPathToItemRef(subregisters !== undefined, itemPath));\n onClose();\n }, [onChooseItem, onClose]);\n\n return (\n <Drawer\n isOpen={isOpen}\n onClose={onClose}\n enforceFocus={false}\n style={{ padding: '0', width: 'unset' }}>\n <Search\n style={{ height: '100vh', width: '80vw', minWidth: '500px', maxWidth: '100vw' }}\n availableClassIDs={availableClassIDs}\n implicitCriteria={implicitCriteria}\n stateName=\"superseding-item-selector-search\"\n onOpenItem={handleOpenItem}\n />\n </Drawer>\n );\n};\n\n\nexport default ItemSearchDrawer;\n"]}
@@ -9,10 +9,26 @@ export interface ChangeRequestContextSpec {
9
9
  */
10
10
  changeRequest?: CR | null;
11
11
  /**
12
- * Current user can edit the contents of this CR.
12
+ * Current user is eligible to edit the contents of this CR.
13
13
  * Always false if `changeRequest` is not defined or `null`.
14
14
  */
15
15
  canEdit: boolean;
16
+ /**
17
+ * Current user is eligible to transition the contents of this CR.
18
+ * Always false if `changeRequest` is not defined or `null`.
19
+ */
20
+ canTransition: boolean;
21
+ /**
22
+ * Current user is eligible to delete this CR.
23
+ * Always false if `changeRequest` is not defined or `null`.
24
+ */
25
+ canDelete: boolean;
26
+ /**
27
+ * Function that performs CR deletion.
28
+ * May not be present even if `canDelete` is true for variuos reasons
29
+ * (e.g., another action is in progress).
30
+ */
31
+ deleteCR?: () => Promise<void>;
16
32
  }
17
33
  export declare const ChangeRequestContext: React.Context<ChangeRequestContextSpec>;
18
34
  export declare const ChangeRequestContextProvider: React.FC<{
@@ -15,6 +15,10 @@ var _cr = require("../../types/cr");
15
15
 
16
16
  var _BrowserCtx = require("../BrowserCtx");
17
17
 
18
+ var _itemPathUtils = require("../itemPathUtils");
19
+
20
+ var _TransitionOptions = require("./TransitionOptions");
21
+
18
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); }
19
23
 
20
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; }
@@ -24,7 +28,9 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
24
28
  /** @jsxFrag React.Fragment */
25
29
  const ChangeRequestContext = _react2.default.createContext({
26
30
  changeRequest: null,
27
- canEdit: false
31
+ canEdit: false,
32
+ canTransition: false,
33
+ canDelete: false
28
34
  });
29
35
 
30
36
  exports.ChangeRequestContext = ChangeRequestContext;
@@ -33,10 +39,13 @@ const ChangeRequestContextProvider = function ({
33
39
  changeRequestID,
34
40
  children
35
41
  }) {
36
- var _a, _b;
42
+ var _a, _b, _c;
37
43
 
38
44
  const {
39
- useObjectData
45
+ useObjectData,
46
+ updateTree,
47
+ performOperation,
48
+ isBusy
40
49
  } = (0, _react2.useContext)(_context.DatasetContext);
41
50
  const {
42
51
  stakeholder
@@ -47,10 +56,25 @@ const ChangeRequestContextProvider = function ({
47
56
  nounLabel: 'proposal(s)'
48
57
  }).value) === null || _a === void 0 ? void 0 : _a.data[crPath !== null && crPath !== void 0 ? crPath : '']) !== null && _b !== void 0 ? _b : crPath ? undefined : null;
49
58
  const canEdit = changeRequest && stakeholder && (0, _cr.canBeEditedBy)(stakeholder, changeRequest) ? true : false;
59
+ const canTransition = changeRequest && stakeholder && (0, _TransitionOptions.canBeTransitionedBy)(stakeholder, changeRequest) ? true : false;
60
+ const canDelete = changeRequest && stakeholder && (0, _cr.canBeDeletedBy)(stakeholder, changeRequest) ? true : false;
61
+ const crItemEntries = Object.entries((_c = changeRequest === null || changeRequest === void 0 ? void 0 : changeRequest.items) !== null && _c !== void 0 ? _c : []).map(i => JSON.stringify(i));
62
+ const hasItems = crItemEntries.length > 0;
63
+ const deleteCR = (0, _react2.useMemo)(() => !isBusy && (changeRequest === null || changeRequest === void 0 ? void 0 : changeRequest.id) && canDelete && updateTree && !hasItems && !changeRequest.timeProposed ? performOperation('deleting proposal', async function handleDelete() {
64
+ const subtreeRoot = (0, _itemPathUtils.crIDToCRPath)(changeRequest.id).replace('/main.yaml', '');
65
+ await updateTree({
66
+ subtreeRoot,
67
+ newSubtreeRoot: null,
68
+ commitMessage: 'remove unproposed CR draft'
69
+ });
70
+ }) : undefined, [isBusy, performOperation, updateTree, hasItems, canDelete, changeRequest === null || changeRequest === void 0 ? void 0 : changeRequest.id, changeRequest === null || changeRequest === void 0 ? void 0 : changeRequest.timeProposed]);
50
71
  const ctx = (0, _react2.useMemo)(() => ({
51
72
  changeRequest,
52
- canEdit
53
- }), [changeRequest, canEdit]);
73
+ canEdit,
74
+ canTransition,
75
+ canDelete,
76
+ deleteCR
77
+ }), [changeRequest, canEdit, deleteCR, canDelete]);
54
78
  return (0, _react.jsx)(ChangeRequestContext.Provider, {
55
79
  value: ctx
56
80
  }, children);
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeRequestContext.js","sourceRoot":"","sources":["../../../src/views/change-request/ChangeRequestContext.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAqB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAiB3C,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,aAAa,CAA2B;IAChF,aAAa,EAAE,IAAI;IACnB,OAAO,EAAE,KAAK;CACf,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAEpC,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE;;IAC1C,MAAM,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,eAAe;QAC5B,CAAC,CAAC,cAAc,eAAe,YAAY;QAC3C,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,aAAa,GAAG,MAAA,MAAA,aAAa,CAAC;QAClC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACnC,SAAS,EAAE,aAAa;KACzB,CAAC,CAAC,KAAK,0CAAE,IAAI,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAO,mCAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAElE,MAAM,OAAO,GAAG,aAAa;WACxB,WAAW;WACX,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC;QAC1C,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,KAAK,CAAC;IAEZ,MAAM,GAAG,GAA6B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,aAAa;QACb,OAAO;KACR,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/B,OAAO,CACL,IAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,GAAG,IACtC,QAAQ,CACqB,CACjC,CAAC;AACJ,CAAC,CAAC","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, canBeEditedBy } from '../../types/cr';\nimport { BrowserCtx } from '../BrowserCtx';\n\n\nexport interface ChangeRequestContextSpec {\n /**\n * Change request object, undefined if not available/loading,\n * null if not expected (i.e. changeRequestID is not given).\n */\n changeRequest?: CR | null\n\n /**\n * Current user can edit the contents of this CR.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canEdit: boolean\n}\n\nexport const ChangeRequestContext = React.createContext<ChangeRequestContextSpec>({\n changeRequest: null,\n canEdit: false,\n});\n\nexport const ChangeRequestContextProvider: React.FC<{\n changeRequestID: string | null\n}> = function ({ changeRequestID, children }) {\n const { useObjectData } = 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 ctx: ChangeRequestContextSpec = useMemo((() => ({\n changeRequest,\n canEdit,\n })), [changeRequest, canEdit]);\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, type Proposed, 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 if not expected (i.e. changeRequestID is not given).\n */\n changeRequest?: CR | null\n\n /**\n * Current user is eligible to edit the contents of this CR.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canEdit: boolean\n\n /**\n * Current user is eligible to transition the contents of this CR.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canTransition: boolean\n\n /**\n * Current user is eligible to delete this CR.\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 even if `canDelete` is true for variuos reasons\n * (e.g., another action is in progress).\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 && changeRequest?.id && canDelete && updateTree && !hasItems && !(changeRequest as Proposed).timeProposed\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 changeRequest?.id, (changeRequest as Proposed)?.timeProposed]);\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"]}
@@ -9,7 +9,9 @@ declare const Proposals: React.FC<{
9
9
  }>;
10
10
  interface ProposalProps<P extends ChangeProposal> {
11
11
  proposal: P;
12
+ /** Highlight changes. */
12
13
  showDiff?: boolean;
14
+ /** In diff mode, only show changed data. (Provisional.) */
13
15
  showOnlyChanged?: boolean;
14
16
  itemRef: InternalItemReference;
15
17
  item: RegisterItem<Payload>;
@@ -9,8 +9,6 @@ var _react = _interopRequireWildcard(require("react"));
9
9
 
10
10
  var _react2 = require("@emotion/react");
11
11
 
12
- var _styled = _interopRequireDefault(require("@emotion/styled"));
13
-
14
12
  var _core = require("@blueprintjs/core");
15
13
 
16
14
  var _select = require("@blueprintjs/select");
@@ -19,6 +17,8 @@ var _HelpTooltip = _interopRequireDefault(require("@riboseinc/paneron-extension-
19
17
 
20
18
  var _ErrorBoundary = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/ErrorBoundary"));
21
19
 
20
+ var _ErrorState = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/ErrorState"));
21
+
22
22
  var _protocolRegistry = require("../protocolRegistry");
23
23
 
24
24
  var _BrowserCtx = require("../BrowserCtx");
@@ -27,7 +27,7 @@ var _itemPathUtils = require("../itemPathUtils");
27
27
 
28
28
  var _useItemClassConfig = _interopRequireDefault(require("../hooks/useItemClassConfig"));
29
29
 
30
- var _StructuredDiff = _interopRequireDefault(require("../diffing/StructuredDiff"));
30
+ var _InlineDiff = require("../diffing/InlineDiff");
31
31
 
32
32
  var _RegisterItem = require("../detail/RegisterItem");
33
33
 
@@ -48,11 +48,13 @@ const Proposals = function ({
48
48
  proposals,
49
49
  className
50
50
  }) {
51
- var _a, _b, _c;
51
+ var _a, _b;
52
+
53
+ const [selectedProposal, selectProposal] = (0, _react.useState)(null);
54
+ const [preferDiff, setPreferDiff] = (0, _react.useState)(false); // TODO: Temporarily unsupported
55
+ // (limitations of current change annotation implementation)
56
+ //const [ showOnlyChanged, setShowOnlyChanged ] = useState(true);
52
57
 
53
- const [_selectedProposal, selectProposal] = (0, _react.useState)(null);
54
- const [showDiff, setShowDiff] = (0, _react.useState)(false);
55
- const [showOnlyChanged, setShowOnlyChanged] = (0, _react.useState)(true);
56
58
  const outerBrowserCtx = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
57
59
  const {
58
60
  jumpTo,
@@ -78,16 +80,7 @@ const Proposals = function ({
78
80
  const proposalBrowserCtx = (0, _react.useMemo)(() => ({ ...outerBrowserCtx,
79
81
  jumpTo: handleCRJump
80
82
  }), [handleCRJump, outerBrowserCtx]);
81
- const firstProposal = Object.keys(proposals)[0]; // Effective selected proposal
82
-
83
- const selectedProposal = (_b = (_a = _selectedProposal && proposals[_selectedProposal] ? _selectedProposal : null) !== null && _a !== void 0 ? _a : firstProposal) !== null && _b !== void 0 ? _b : undefined; // Force select available proposal
84
-
85
- (0, _react.useEffect)(() => {
86
- if (firstProposal && (_selectedProposal === null || !proposals[_selectedProposal])) {
87
- selectProposal(firstProposal !== null && firstProposal !== void 0 ? firstProposal : null);
88
- }
89
- }, [firstProposal, _selectedProposal, proposals]);
90
- const selectedItemRef = (0, _itemPathUtils.useItemRef)(subregisters !== undefined, selectedProposal); // Data for proposed items
83
+ /** Paths of register items in proposal. */
91
84
 
92
85
  const proposedItemPaths = Object.entries(proposals).map(([itemPath, proposal]) => {
93
86
  if (proposal.type === 'clarification' || proposal.type === 'addition') {
@@ -96,9 +89,12 @@ const Proposals = function ({
96
89
  return undefined;
97
90
  }
98
91
  }).filter(s => s !== undefined);
92
+ /** Proposed data of register items in proposal. */
93
+
99
94
  const proposedItemDataReq = useRegisterItemData({
100
95
  itemPaths: proposedItemPaths
101
- }); // Data for pre-existing items
96
+ });
97
+ /** Pre-existing data of register items in proposal. */
102
98
 
103
99
  const currentItemDataReq = useRegisterItemData({
104
100
  itemPaths: Object.keys(proposals),
@@ -114,8 +110,13 @@ const Proposals = function ({
114
110
 
115
111
  return (_a = proposedItemDataReq.value[itemPath]) !== null && _a !== void 0 ? _a : null;
116
112
  }, [proposedItemDataReq.value]);
117
- const selectedItemCurrent = getCurrentItem(selectedProposal);
118
- const selectedItemProposed = getProposedItem(selectedProposal);
113
+ /** Current register item (if any) corresponding to selected proposal. */
114
+
115
+ const selectedItemCurrent = selectedProposal ? getCurrentItem(selectedProposal) : null;
116
+ /** Proposed register item corresponding to selected proposal. */
117
+
118
+ const selectedItemProposed = selectedProposal ? getProposedItem(selectedProposal) : null;
119
+ const selectedItemRef = (0, _itemPathUtils.useItemRef)(subregisters !== undefined, selectedProposal);
119
120
  const handleItemSelect = (0, _react.useCallback)(item => selectProposal(item.itemPath), [selectProposal]);
120
121
  const activeItem = (0, _react.useMemo)(() => selectedProposal ? {
121
122
  itemPath: selectedProposal,
@@ -134,34 +135,51 @@ const Proposals = function ({
134
135
  itemBefore: undefined,
135
136
  itemRef: (0, _itemPathUtils.itemPathToItemRef)(subregisters !== undefined, itemPath)
136
137
  };
137
- }).filter(cpi => cpi.item !== null), [proposals, getCurrentItem, getProposedItem]);
138
+ }), [proposals, getCurrentItem, getProposedItem]);
139
+ const haveSelectedItem = selectedProposal && selectedItemRef && proposals[selectedProposal] && (selectedItemProposed || selectedItemCurrent);
140
+ const proposalCount = Object.keys(proposals).length;
141
+ (0, _react.useEffect)(() => {
142
+ if (!selectedProposal) {
143
+ const firstProposal = Object.keys(proposals)[0];
138
144
 
139
- if (selectedProposal && selectedItemRef && proposals[selectedProposal] && !currentItemDataReq.isUpdating && !proposedItemDataReq.isUpdating) {
140
- const selectedItemSummary = (0, _react2.jsx)(ProposalSummary, {
145
+ if (firstProposal) {
146
+ if (getCurrentItem(firstProposal) || getProposedItem(firstProposal)) {
147
+ selectProposal(firstProposal);
148
+ }
149
+ }
150
+ }
151
+ }, [proposalCount, selectedProposal, getCurrentItem, getProposedItem]);
152
+ const canShowDiff = haveSelectedItem && ((_a = proposals[selectedProposal]) === null || _a === void 0 ? void 0 : _a.type) === 'clarification' ? true : false;
153
+ const showDiff = canShowDiff && preferDiff;
154
+
155
+ if (!currentItemDataReq.isUpdating && !proposedItemDataReq.isUpdating) {
156
+ const selectedItemSummary = haveSelectedItem ? (0, _react2.jsx)(ProposalSummary, {
141
157
  itemRef: selectedItemRef,
142
158
  item: selectedItemProposed !== null && selectedItemProposed !== void 0 ? selectedItemProposed : selectedItemCurrent,
143
159
  itemBefore: selectedItemCurrent !== null && selectedItemCurrent !== void 0 ? selectedItemCurrent : undefined,
144
160
  proposal: proposals[selectedProposal]
145
- });
161
+ }) : (0, _react2.jsx)(_react.default.Fragment, null, "Select item\u2026");
162
+ const icon = haveSelectedItem ? getProposalIcon(proposals[selectedProposal]) : undefined;
146
163
  return (0, _react2.jsx)("div", {
147
164
  css: (0, _react2.css)`display: flex; flex-flow: column nowrap;`,
148
165
  className: className
149
- }, (0, _react2.jsx)("div", null, (0, _react2.jsx)(_core.ControlGroup, null, (0, _react2.jsx)(_core.Switch, {
150
- checked: showDiff,
151
- onChange: evt => setShowDiff(evt.currentTarget.checked),
152
- label: "View source",
153
- css: (0, _react2.css)`margin-right: 1em !important`
154
- }), (0, _react2.jsx)(_core.Switch, {
155
- checked: showDiff && showOnlyChanged,
156
- disabled: !showDiff,
157
- onChange: evt => setShowOnlyChanged(evt.currentTarget.checked),
158
- label: "Show clarified properties only"
159
- })), (0, _react2.jsx)(_core.ButtonGroup, null, (0, _react2.jsx)(_core.Button, {
160
- disabled: !jumpTo || ((_c = proposals[selectedProposal]) === null || _c === void 0 ? void 0 : _c.type) === 'addition',
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',
161
170
  icon: 'locate',
162
171
  onClick: () => jumpTo === null || jumpTo === void 0 ? void 0 : jumpTo(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${selectedProposal}`),
163
172
  title: "Open selected item in a new tab (not applicable to proposed additions)"
164
- }, "Reveal in registry"), Object.keys(proposals).length > 1 ? (0, _react2.jsx)(_react2.ClassNames, null, ({
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, ({
165
183
  css: css2
166
184
  }) => (0, _react2.jsx)(_select.Select2, {
167
185
  filterable: false,
@@ -179,13 +197,9 @@ const Proposals = function ({
179
197
  onItemSelect: handleItemSelect
180
198
  }, (0, _react2.jsx)(_core.Button, {
181
199
  rightIcon: "chevron-down",
182
- icon: getProposalIcon(proposals[selectedProposal])
183
- }, selectedItemSummary))) : (0, _react2.jsx)(_core.Button, {
184
- fill: true,
185
- alignText: "left",
186
- icon: getProposalIcon(proposals[selectedProposal]),
187
- rightIcon: "chevron-down"
188
- }, selectedItemSummary))), (0, _react2.jsx)("div", {
200
+ icon: icon,
201
+ css: (0, _react2.css)`white-space: nowrap;`
202
+ }, selectedItemSummary)))) : null, haveSelectedItem ? (0, _react2.jsx)("div", {
189
203
  css: (0, _react2.css)`position: relative; flex: 1;`
190
204
  }, (0, _react2.jsx)(_BrowserCtx.BrowserCtx.Provider, {
191
205
  value: proposalBrowserCtx
@@ -194,11 +208,11 @@ const Proposals = function ({
194
208
  }, (0, _react2.jsx)(ProposalDetail, {
195
209
  itemRef: selectedItemRef,
196
210
  showDiff: showDiff,
197
- showOnlyChanged: showOnlyChanged,
211
+ //showOnlyChanged={showOnlyChanged}
198
212
  item: selectedItemProposed !== null && selectedItemProposed !== void 0 ? selectedItemProposed : selectedItemCurrent,
199
213
  itemBefore: selectedItemCurrent !== null && selectedItemCurrent !== void 0 ? selectedItemCurrent : undefined,
200
214
  proposal: proposals[selectedProposal]
201
- })))));
215
+ })))) : null);
202
216
  } else {
203
217
  return (0, _react2.jsx)(_core.NonIdealState, {
204
218
  icon: 'clean',
@@ -213,21 +227,31 @@ const ChangeProposalItemView = (item, {
213
227
  modifiers,
214
228
  query
215
229
  }) => {
216
- const proposalConfig = item.proposal.type === 'amendment' ? PROPOSAL_VIEWS[item.proposal.amendmentType] : PROPOSAL_VIEWS[item.proposal.type];
217
- const ProposalTypeLabel = proposalConfig.summary;
218
- return (0, _react2.jsx)(_core.MenuItem, {
219
- active: modifiers.active,
220
- disabled: modifiers.disabled,
221
- labelElement: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(ProposalTypeLabel, { ...item
222
- }), " ", (0, _react2.jsx)(_HelpTooltip.default, {
223
- content: (0, _react2.jsx)(_react.default.Fragment, null, "Proposed to be ", proposalConfig.hint)
224
- })),
225
- key: item.itemPath,
226
- onClick: handleClick,
227
- icon: getProposalIcon(item.proposal),
228
- text: (0, _react2.jsx)(ProposalSummary, { ...item
229
- })
230
- });
230
+ if (item.item !== null) {
231
+ 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
+ return (0, _react2.jsx)(_core.MenuItem, {
235
+ active: modifiers.active,
236
+ 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
+ })),
241
+ key: item.itemPath,
242
+ onClick: handleClick,
243
+ icon: getProposalIcon(item.proposal),
244
+ text: (0, _react2.jsx)(ProposalSummary, { ...i
245
+ })
246
+ });
247
+ } else {
248
+ return (0, _react2.jsx)(_core.MenuItem, {
249
+ disabled: true,
250
+ icon: "heart-broken",
251
+ onClick: handleClick,
252
+ text: `Broken proposal entry at path ${item.itemPath}`
253
+ });
254
+ }
231
255
  };
232
256
 
233
257
  const ProposalDetail = (0, _react.memo)(function ({
@@ -239,7 +263,7 @@ const ProposalDetail = (0, _react.memo)(function ({
239
263
  itemBefore,
240
264
  onChange
241
265
  }) {
242
- var _a, _b;
266
+ var _a;
243
267
 
244
268
  const itemClass = (0, _useItemClassConfig.default)((_a = itemRef.classID) !== null && _a !== void 0 ? _a : 'NONEXISTENT_CLASS_ID');
245
269
 
@@ -247,17 +271,23 @@ const ProposalDetail = (0, _react.memo)(function ({
247
271
  throw new Error(`Unknown item class “${itemRef.classID}”!`);
248
272
  }
249
273
 
250
- const view = showDiff ? (0, _react2.jsx)(MaximizedStructuredDiff, {
251
- item1: (_b = itemBefore === null || itemBefore === void 0 ? void 0 : itemBefore.data) !== null && _b !== void 0 ? _b : ITEM_DATA_PLACEHOLDER,
252
- item2: item.data,
253
- showUnchanged: !showOnlyChanged,
254
- css: (0, _react2.css)`background: white; border-radius: 2.5px; padding: 10px 0; margin: 10px 0;`,
255
- className: _core.Classes.ELEVATION_2
274
+ const view = showDiff ? (0, _react2.jsx)(_InlineDiff.InlineDiffGeneric, {
275
+ item1: itemBefore !== null && itemBefore !== void 0 ? itemBefore : {},
276
+ item2: item,
277
+ css: (0, _react2.css)`
278
+ position: absolute; inset: 0; padding: 10px; overflow: auto;
279
+ background-color: white;
280
+ .bp4-dark & {
281
+ background-color: ${_core.Colors.DARK_GRAY2};
282
+ }
283
+ `,
284
+ className: `${_core.Classes.ELEVATION_2} ${_core.Classes.RUNNING_TEXT}`
256
285
  }) : (0, _react2.jsx)(_RegisterItem.ItemDetail, {
257
286
  itemRef: itemRef,
258
287
  item: item,
259
288
  itemClass: itemClass,
260
- key: JSON.stringify(itemRef)
289
+ key: JSON.stringify(itemRef),
290
+ compactHeader: true
261
291
  });
262
292
  return (0, _react2.jsx)("div", {
263
293
  css: (0, _react2.css)`position: absolute; inset: 0; display: flex; flex-flow: column;`
@@ -272,17 +302,28 @@ const ProposalSummary = function ({
272
302
  itemBefore,
273
303
  onChange
274
304
  }) {
305
+ var _a, _b;
306
+
275
307
  const {
276
308
  itemClasses
277
309
  } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
278
310
  const {
279
311
  classID
280
312
  } = itemRef;
281
- const ListItemView = itemClasses[classID].views.listItemView;
282
- return (0, _react2.jsx)(ListItemView, {
283
- itemRef: itemRef,
284
- itemData: item.data
285
- });
313
+ const ListItemView = (_b = (_a = itemClasses[classID]) === null || _a === void 0 ? void 0 : _a.views) === null || _b === void 0 ? void 0 : _b.listItemView;
314
+
315
+ if (ListItemView) {
316
+ return (0, _react2.jsx)(ListItemView, {
317
+ itemRef: itemRef,
318
+ itemData: item.data
319
+ });
320
+ } else {
321
+ return (0, _react2.jsx)(_ErrorState.default, {
322
+ viewName: "list item view",
323
+ inline: true,
324
+ error: "unable to load list item view"
325
+ });
326
+ }
286
327
  };
287
328
 
288
329
  exports.ProposalSummary = ProposalSummary;
@@ -326,10 +367,6 @@ const invalidation = {
326
367
  item
327
368
  }) => (0, _react2.jsx)(_react.default.Fragment, null, "Invalidation"), () => true)
328
369
  };
329
- const MaximizedStructuredDiff = (0, _styled.default)(_StructuredDiff.default)`
330
- position: absolute;
331
- inset: 0;
332
- `;
333
370
  const PROPOSAL_VIEWS = {
334
371
  clarification,
335
372
  addition,
@@ -343,5 +380,4 @@ function getProposalIcon(proposal) {
343
380
  }
344
381
 
345
382
  var _default = Proposals;
346
- exports.default = _default;
347
- const ITEM_DATA_PLACEHOLDER = {};
383
+ exports.default = _default;