@riboseinc/paneron-registry-kit 2.2.32 → 2.2.34

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 (153) hide show
  1. package/index.d.ts +2 -2
  2. package/index.js +3 -3
  3. package/index.js.map +1 -1
  4. package/item-classes/Tree.js +6 -8
  5. package/item-classes/Tree.js.map +1 -1
  6. package/package.json +4 -3
  7. package/{views/change-request → proposals}/ChangeRequestContext.d.ts +3 -2
  8. package/{views/change-request → proposals}/ChangeRequestContext.js +8 -8
  9. package/proposals/ChangeRequestContext.js.map +1 -0
  10. package/{views/ProposalHistoryDrawer.js → proposals/HistoryDrawer.js} +11 -13
  11. package/proposals/HistoryDrawer.js.map +1 -0
  12. package/proposals/ListItem.d.ts +8 -0
  13. package/proposals/ListItem.js +40 -0
  14. package/proposals/ListItem.js.map +1 -0
  15. package/{views/change-request/Summary.d.ts → proposals/MetaProperties.d.ts} +4 -3
  16. package/proposals/MetaProperties.js +94 -0
  17. package/proposals/MetaProperties.js.map +1 -0
  18. package/proposals/NewProposalMenu.d.ts +10 -0
  19. package/proposals/NewProposalMenu.js +113 -0
  20. package/proposals/NewProposalMenu.js.map +1 -0
  21. package/proposals/ProposalBrowser.d.ts +22 -0
  22. package/{views/change-request/Proposals.js → proposals/ProposalBrowser.js} +20 -258
  23. package/proposals/ProposalBrowser.js.map +1 -0
  24. package/proposals/ProposalDetail.d.ts +6 -0
  25. package/proposals/ProposalDetail.js +67 -0
  26. package/proposals/ProposalDetail.js.map +1 -0
  27. package/proposals/ProposalItem.d.ts +16 -0
  28. package/proposals/ProposalItem.js +57 -0
  29. package/proposals/ProposalItem.js.map +1 -0
  30. package/proposals/ProposalSummary.d.ts +6 -0
  31. package/proposals/ProposalSummary.js +62 -0
  32. package/proposals/ProposalSummary.js.map +1 -0
  33. package/proposals/ProposalTab.d.ts +12 -0
  34. package/proposals/ProposalTab.js +102 -0
  35. package/proposals/ProposalTab.js.map +1 -0
  36. package/proposals/ProposalType.d.ts +11 -0
  37. package/proposals/ProposalType.js +99 -0
  38. package/proposals/ProposalType.js.map +1 -0
  39. package/proposals/ProposalWorkspace.d.ts +13 -0
  40. package/proposals/ProposalWorkspace.js +132 -0
  41. package/proposals/ProposalWorkspace.js.map +1 -0
  42. package/proposals/Search.d.ts +26 -0
  43. package/proposals/Search.js +109 -0
  44. package/proposals/Search.js.map +1 -0
  45. package/{views/change-request → proposals}/TransitionHistory.d.ts +3 -2
  46. package/{views/change-request → proposals}/TransitionHistory.js +18 -14
  47. package/proposals/TransitionHistory.js.map +1 -0
  48. package/{views/change-request → proposals}/TransitionOptions.d.ts +3 -3
  49. package/{views/change-request → proposals}/TransitionOptions.js +34 -12
  50. package/proposals/TransitionOptions.js.map +1 -0
  51. package/proposals/actionableGroups/Tree.js +23 -5
  52. package/proposals/actionableGroups/Tree.js.map +1 -1
  53. package/proposals/actionableGroups/queries.d.ts +0 -1
  54. package/proposals/actionableGroups/queries.js +7 -10
  55. package/proposals/actionableGroups/queries.js.map +1 -1
  56. package/proposals/actionableGroups/treeNodes.d.ts +2 -1
  57. package/proposals/actionableGroups/treeNodes.js +42 -10
  58. package/proposals/actionableGroups/treeNodes.js.map +1 -1
  59. package/proposals/index.d.ts +6 -0
  60. package/proposals/index.js +83 -0
  61. package/proposals/index.js.map +1 -0
  62. package/{views/change-request → proposals}/objectChangeset.d.ts +4 -4
  63. package/{views/change-request → proposals}/objectChangeset.js +6 -6
  64. package/proposals/objectChangeset.js.map +1 -0
  65. package/proposals/queries.d.ts +4 -0
  66. package/proposals/queries.js +14 -0
  67. package/proposals/queries.js.map +1 -0
  68. package/{types/cr.d.ts → proposals/types.d.ts} +80 -5
  69. package/{types/cr.js → proposals/types.js} +72 -3
  70. package/proposals/types.js.map +1 -0
  71. package/types/index.d.ts +0 -1
  72. package/types/index.js +0 -13
  73. package/types/index.js.map +1 -1
  74. package/types/util.d.ts +1 -1
  75. package/types/util.js.map +1 -1
  76. package/types/views.d.ts +1 -1
  77. package/types/views.js.map +1 -1
  78. package/views/FilterCriteria/models.d.ts +2 -0
  79. package/views/FilterCriteria/models.js +12 -2
  80. package/views/FilterCriteria/models.js.map +1 -1
  81. package/views/GenericRelatedItemView.js +4 -4
  82. package/views/GenericRelatedItemView.js.map +1 -1
  83. package/views/RegisterStakeholder.d.ts +4 -1
  84. package/views/RegisterStakeholder.js +19 -13
  85. package/views/RegisterStakeholder.js.map +1 -1
  86. package/views/detail/ChangeRequest/index.js +12 -160
  87. package/views/detail/ChangeRequest/index.js.map +1 -1
  88. package/views/detail/ProposalWork.d.ts +8 -0
  89. package/views/detail/ProposalWork.js +213 -0
  90. package/views/detail/ProposalWork.js.map +1 -0
  91. package/views/detail/RegisterHome/ActiveProposalDetails.d.ts +1 -1
  92. package/views/detail/RegisterHome/ActiveProposalDetails.js +4 -4
  93. package/views/detail/RegisterHome/ActiveProposalDetails.js.map +1 -1
  94. package/views/detail/RegisterHome/Proposal.d.ts +1 -1
  95. package/views/detail/RegisterHome/Proposal.js +2 -6
  96. package/views/detail/RegisterHome/Proposal.js.map +1 -1
  97. package/views/detail/RegisterHome/index.js +12 -16
  98. package/views/detail/RegisterHome/index.js.map +1 -1
  99. package/views/detail/RegisterHome2/index.d.ts +5 -0
  100. package/views/detail/RegisterHome2/index.js +58 -0
  101. package/views/detail/RegisterHome2/index.js.map +1 -0
  102. package/views/detail/RegisterItem/index.d.ts +2 -1
  103. package/views/detail/RegisterItem/index.js +62 -21
  104. package/views/detail/RegisterItem/index.js.map +1 -1
  105. package/views/detail/RegisterItemClass.js +1 -1
  106. package/views/detail/RegisterItemClass.js.map +1 -1
  107. package/views/detail/RegisterMeta/RegisterMetaForm.js +1 -46
  108. package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
  109. package/views/hooks/useLatestAcceptedProposal.d.ts +2 -0
  110. package/views/hooks/useLatestAcceptedProposal.js +48 -0
  111. package/views/hooks/useLatestAcceptedProposal.js.map +1 -0
  112. package/views/hooks/useRegisterVersion.d.ts +5 -0
  113. package/views/hooks/useRegisterVersion.js +47 -0
  114. package/views/hooks/useRegisterVersion.js.map +1 -0
  115. package/views/hooks/useSingleRegisterItemData.js.map +1 -1
  116. package/views/index.js +38 -16
  117. package/views/index.js.map +1 -1
  118. package/views/itemQueryUtils.d.ts +1 -1
  119. package/views/itemQueryUtils.js +12 -7
  120. package/views/itemQueryUtils.js.map +1 -1
  121. package/views/protocolRegistry.d.ts +1 -0
  122. package/views/protocolRegistry.js +4 -0
  123. package/views/protocolRegistry.js.map +1 -1
  124. package/views/sidebar/Browse/index.js +2 -2
  125. package/views/sidebar/Browse/index.js.map +1 -1
  126. package/views/sidebar/Registration/index.d.ts +0 -1
  127. package/views/sidebar/Registration/index.js +9 -37
  128. package/views/sidebar/Registration/index.js.map +1 -1
  129. package/views/sidebar/Search/index.d.ts +3 -0
  130. package/views/sidebar/Search/index.js +12 -11
  131. package/views/sidebar/Search/index.js.map +1 -1
  132. package/views/sidebar/index.js +40 -10
  133. package/views/sidebar/index.js.map +1 -1
  134. package/views/util.d.ts +6 -1
  135. package/views/util.js +30 -7
  136. package/views/util.js.map +1 -1
  137. package/types/cr.js.map +0 -1
  138. package/types/proposal.d.ts +0 -90
  139. package/types/proposal.js +0 -71
  140. package/types/proposal.js.map +0 -1
  141. package/views/ProposalHistoryDrawer.js.map +0 -1
  142. package/views/change-request/ChangeRequestContext.js.map +0 -1
  143. package/views/change-request/Proposals.d.ts +0 -40
  144. package/views/change-request/Proposals.js.map +0 -1
  145. package/views/change-request/Summary.js +0 -59
  146. package/views/change-request/Summary.js.map +0 -1
  147. package/views/change-request/TransitionHistory.js.map +0 -1
  148. package/views/change-request/TransitionOptions.js.map +0 -1
  149. package/views/change-request/objectChangeset.js.map +0 -1
  150. package/views/change-request/util.d.ts +0 -4
  151. package/views/change-request/util.js +0 -14
  152. package/views/change-request/util.js.map +0 -1
  153. /package/{views/ProposalHistoryDrawer.d.ts → proposals/HistoryDrawer.d.ts} +0 -0
@@ -5,9 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.getActionableProposalGroupsForRole = getActionableProposalGroupsForRole;
7
7
  exports.getActionableProposalGroupsForRoles = getActionableProposalGroupsForRoles;
8
- exports.CR_BASE_QUERY = void 0;
9
8
 
10
- var _cr = require("../../types/cr");
9
+ var _types = require("../types");
11
10
 
12
11
  function getActionableProposalGroupsForRole(role) {
13
12
  return CR_QUERIES_FOR_ROLES.filter(([, roles]) => roles.has(role));
@@ -17,12 +16,10 @@ function getActionableProposalGroupsForRoles(roles) {
17
16
  return roles.flatMap(getActionableProposalGroupsForRole);
18
17
  }
19
18
 
20
- const CR_BASE_QUERY = 'objPath.indexOf("/proposals/") === 0 && objPath.endsWith("main.yaml")';
21
- exports.CR_BASE_QUERY = CR_BASE_QUERY;
22
19
  const CR_QUERIES_FOR_ROLES = [['My Drafts', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {
23
20
  if (stakeholder && stakeholder.gitServerUsername) {
24
21
  const stakeholderCondition = `obj.submittingStakeholderGitServerUsername === "${stakeholder.gitServerUsername}"`;
25
- const query = `(obj.state === "${_cr.State.DRAFT}" || obj.state === "${_cr.State.RETURNED_FOR_CLARIFICATION}") && (${stakeholderCondition})`;
22
+ const query = `(obj.state === "${_types.State.DRAFT}" || obj.state === "${_types.State.RETURNED_FOR_CLARIFICATION}") && (${stakeholderCondition})`;
26
23
  return query;
27
24
  } else {
28
25
  return 'false';
@@ -31,7 +28,7 @@ const CR_QUERIES_FOR_ROLES = [['My Drafts', new Set(['submitter', 'manager', 'co
31
28
  // Rejections are actionable because they can be appealed by the submitter.
32
29
  if (stakeholder && stakeholder.gitServerUsername) {
33
30
  const stakeholderCondition = `obj.submittingStakeholderGitServerUsername === "${stakeholder.gitServerUsername}"`;
34
- const query = `(obj.state === "${_cr.State.REJECTED}") && (${stakeholderCondition})`;
31
+ const query = `(obj.state === "${_types.State.REJECTED}") && (${stakeholderCondition})`;
35
32
  return query;
36
33
  } else {
37
34
  return 'false';
@@ -39,7 +36,7 @@ const CR_QUERIES_FOR_ROLES = [['My Drafts', new Set(['submitter', 'manager', 'co
39
36
  }], ['Everyone’s Drafts or Returned', new Set(['manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {
40
37
  if (stakeholder && stakeholder.gitServerUsername) {
41
38
  const stakeholderCondition = `obj.submittingStakeholderGitServerUsername !== "${stakeholder.gitServerUsername}"`;
42
- const query = `(obj.state === "${_cr.State.DRAFT}" || obj.state === "${_cr.State.RETURNED_FOR_CLARIFICATION}") && (${stakeholderCondition})`;
39
+ const query = `(obj.state === "${_types.State.DRAFT}" || obj.state === "${_types.State.RETURNED_FOR_CLARIFICATION}") && (${stakeholderCondition})`;
43
40
  return query;
44
41
  } else {
45
42
  return 'false';
@@ -73,9 +70,9 @@ const CR_QUERIES_FOR_ROLES = [['My Drafts', new Set(['submitter', 'manager', 'co
73
70
  // // TODO: Implement limit
74
71
  // }],
75
72
  ['Pending Owner Appeal Review', new Set(['owner']), function ownerProposals() {
76
- return `obj.state === "${_cr.State.APPEALED}"`;
73
+ return `obj.state === "${_types.State.APPEALED}"`;
77
74
  }], ['Pending Control Body Review', new Set(['control-body', 'owner']), function cbProposals() {
78
- return `obj.state === "${_cr.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW}"`;
75
+ return `obj.state === "${_types.State.SUBMITTED_FOR_CONTROL_BODY_REVIEW}"`;
79
76
  }], ['Pending Manager Review', new Set(['manager', 'control-body', 'owner']), function managerProposals() {
80
- return `obj.state === "${_cr.State.PROPOSED}"`;
77
+ return `obj.state === "${_types.State.PROPOSED}"`;
81
78
  }]];
@@ -1 +1 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/proposals/actionableGroups/queries.ts"],"names":[],"mappings":"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","sourcesContent":["import { State } from '../../types/cr';\nimport type { StakeholderRoleType } from '../../types';\nimport type { ActionableProposalGroup } from './types';\n\n\nexport function getActionableProposalGroupsForRole(role: StakeholderRoleType): readonly ActionableProposalGroup[] {\n return CR_QUERIES_FOR_ROLES.filter(([, roles]) => roles.has(role));\n}\n\nexport function getActionableProposalGroupsForRoles(roles: readonly StakeholderRoleType[]): readonly ActionableProposalGroup[] {\n return roles.flatMap(getActionableProposalGroupsForRole);\n}\n\n\nexport const CR_BASE_QUERY = 'objPath.indexOf(\"/proposals/\") === 0 && objPath.endsWith(\"main.yaml\")';\n\nconst CR_QUERIES_FOR_ROLES: readonly ActionableProposalGroup[] =\n[\n ['My Drafts', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n if (stakeholder && stakeholder.gitServerUsername) {\n const stakeholderCondition = `obj.submittingStakeholderGitServerUsername === \"${stakeholder.gitServerUsername}\"`;\n const query = `(obj.state === \"${State.DRAFT}\" || obj.state === \"${State.RETURNED_FOR_CLARIFICATION}\") && (${stakeholderCondition})`;\n return query;\n } else {\n return 'false';\n }\n }],\n ['My Rejected', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n // Rejections are actionable because they can be appealed by the submitter.\n if (stakeholder && stakeholder.gitServerUsername) {\n const stakeholderCondition = `obj.submittingStakeholderGitServerUsername === \"${stakeholder.gitServerUsername}\"`;\n const query = `(obj.state === \"${State.REJECTED}\") && (${stakeholderCondition})`;\n return query;\n } else {\n return 'false';\n }\n }],\n ['Everyone’s Drafts or Returned', new Set(['manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n if (stakeholder && stakeholder.gitServerUsername) {\n const stakeholderCondition = `obj.submittingStakeholderGitServerUsername !== \"${stakeholder.gitServerUsername}\"`;\n const query = `(obj.state === \"${State.DRAFT}\" || obj.state === \"${State.RETURNED_FOR_CLARIFICATION}\") && (${stakeholderCondition})`;\n return query;\n } else {\n return 'false';\n }\n }],\n // ['latest reviewed', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n // // TODO: Should filter only rejected perhaps?\n // // Approved/accepted proposals can be shown in another (public) area.\n // if (stakeholder && stakeholder.gitServerUsername) {\n // const stakeholderCondition = stakeholder?.role !== 'submitter'\n // ? 'true'\n // : `obj.submittingStakeholderGitServerUsername === \"${stakeholder.gitServerUsername}\"`;\n // // Don’t show drafts in the list of pending proposals, unless it’s user’s own drafts.\n // const query = `(obj.state === \"${State.ACCEPTED} || obj.state === \"${State.REJECTED} || obj.state === \"${State.REJECTION_UPHELD_ON_APPEAL}\"\") && ${stakeholderCondition}`;\n // return query;\n // } else {\n // return 'false';\n // }\n // // TODO: Implement limit\n // }],\n // ['latest withdrawn', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n // if (stakeholder && stakeholder.gitServerUsername) {\n // const stakeholderCondition = stakeholder?.role !== 'submitter'\n // ? 'true'\n // : `obj.submittingStakeholderGitServerUsername === \"${stakeholder.gitServerUsername}\"`;\n // // Don’t show drafts in the list of pending proposals, unless it’s user’s own drafts.\n // const query = `(obj.state === \"${State.WITHDRAWN}\" || obj.state === \"${State.APPEAL_WITHDRAWN}\") && ${stakeholderCondition}`;\n // return query;\n // } else {\n // return 'false';\n // }\n // // TODO: Implement limit\n // }],\n ['Pending Owner Appeal Review', new Set(['owner']), function ownerProposals() {\n return `obj.state === \"${State.APPEALED}\"`;\n }],\n ['Pending Control Body Review', new Set(['control-body', 'owner']), function cbProposals() {\n return `obj.state === \"${State.SUBMITTED_FOR_CONTROL_BODY_REVIEW}\"`;\n }],\n ['Pending Manager Review', new Set(['manager', 'control-body', 'owner']), function managerProposals() {\n return `obj.state === \"${State.PROPOSED}\"`;\n }],\n] as const;\n"]}
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/proposals/actionableGroups/queries.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StakeholderRoleType } from '../../types';\nimport { State } from '../types';\nimport type { ActionableProposalGroup } from './types';\n\n\nexport function getActionableProposalGroupsForRole(role: StakeholderRoleType): readonly ActionableProposalGroup[] {\n return CR_QUERIES_FOR_ROLES.filter(([, roles]) => roles.has(role));\n}\n\nexport function getActionableProposalGroupsForRoles(roles: readonly StakeholderRoleType[]): readonly ActionableProposalGroup[] {\n return roles.flatMap(getActionableProposalGroupsForRole);\n}\n\n\nconst CR_QUERIES_FOR_ROLES: readonly ActionableProposalGroup[] =\n[\n ['My Drafts', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n if (stakeholder && stakeholder.gitServerUsername) {\n const stakeholderCondition = `obj.submittingStakeholderGitServerUsername === \"${stakeholder.gitServerUsername}\"`;\n const query = `(obj.state === \"${State.DRAFT}\" || obj.state === \"${State.RETURNED_FOR_CLARIFICATION}\") && (${stakeholderCondition})`;\n return query;\n } else {\n return 'false';\n }\n }],\n ['My Rejected', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n // Rejections are actionable because they can be appealed by the submitter.\n if (stakeholder && stakeholder.gitServerUsername) {\n const stakeholderCondition = `obj.submittingStakeholderGitServerUsername === \"${stakeholder.gitServerUsername}\"`;\n const query = `(obj.state === \"${State.REJECTED}\") && (${stakeholderCondition})`;\n return query;\n } else {\n return 'false';\n }\n }],\n ['Everyone’s Drafts or Returned', new Set(['manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n if (stakeholder && stakeholder.gitServerUsername) {\n const stakeholderCondition = `obj.submittingStakeholderGitServerUsername !== \"${stakeholder.gitServerUsername}\"`;\n const query = `(obj.state === \"${State.DRAFT}\" || obj.state === \"${State.RETURNED_FOR_CLARIFICATION}\") && (${stakeholderCondition})`;\n return query;\n } else {\n return 'false';\n }\n }],\n // ['latest reviewed', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n // // TODO: Should filter only rejected perhaps?\n // // Approved/accepted proposals can be shown in another (public) area.\n // if (stakeholder && stakeholder.gitServerUsername) {\n // const stakeholderCondition = stakeholder?.role !== 'submitter'\n // ? 'true'\n // : `obj.submittingStakeholderGitServerUsername === \"${stakeholder.gitServerUsername}\"`;\n // // Don’t show drafts in the list of pending proposals, unless it’s user’s own drafts.\n // const query = `(obj.state === \"${State.ACCEPTED} || obj.state === \"${State.REJECTED} || obj.state === \"${State.REJECTION_UPHELD_ON_APPEAL}\"\") && ${stakeholderCondition}`;\n // return query;\n // } else {\n // return 'false';\n // }\n // // TODO: Implement limit\n // }],\n // ['latest withdrawn', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n // if (stakeholder && stakeholder.gitServerUsername) {\n // const stakeholderCondition = stakeholder?.role !== 'submitter'\n // ? 'true'\n // : `obj.submittingStakeholderGitServerUsername === \"${stakeholder.gitServerUsername}\"`;\n // // Don’t show drafts in the list of pending proposals, unless it’s user’s own drafts.\n // const query = `(obj.state === \"${State.WITHDRAWN}\" || obj.state === \"${State.APPEAL_WITHDRAWN}\") && ${stakeholderCondition}`;\n // return query;\n // } else {\n // return 'false';\n // }\n // // TODO: Implement limit\n // }],\n ['Pending Owner Appeal Review', new Set(['owner']), function ownerProposals() {\n return `obj.state === \"${State.APPEALED}\"`;\n }],\n ['Pending Control Body Review', new Set(['control-body', 'owner']), function cbProposals() {\n return `obj.state === \"${State.SUBMITTED_FOR_CONTROL_BODY_REVIEW}\"`;\n }],\n ['Pending Manager Review', new Set(['manager', 'control-body', 'owner']), function managerProposals() {\n return `obj.state === \"${State.PROPOSED}\"`;\n }],\n] as const;\n"]}
@@ -2,7 +2,7 @@
2
2
  /** @jsxFrag React.Fragment */
3
3
  import type { TreeNodeInfo } from '@blueprintjs/core';
4
4
  import type { RegisterStakeholder } from '../../types';
5
- import type { SomeCR as CR } from '../../types/cr';
5
+ import type { SomeCR as CR } from '../types';
6
6
  import type { ActionableProposalGroup } from './types';
7
7
  export declare type ActionableProposalTreeNode = TreeNodeInfo<{
8
8
  type: 'group' | 'item';
@@ -16,6 +16,7 @@ export declare function getActionableProposalGroupsAsTreeNodes(groups: readonly
16
16
  selectedGroup?: string;
17
17
  selectedCRID?: string;
18
18
  activeCRID?: string;
19
+ onActivateCR?: (crID: string | null) => void | Promise<void>;
19
20
  }): ActionableProposalTreeNode[];
20
21
  export declare function getMapReduceChainsForActionableProposalGroups(proposalGroups: readonly ActionableProposalGroup[], stakeholder: RegisterStakeholder): {
21
22
  [x: string]: {
@@ -6,11 +6,13 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.getActionableProposalGroupsAsTreeNodes = getActionableProposalGroupsAsTreeNodes;
7
7
  exports.getMapReduceChainsForActionableProposalGroups = getMapReduceChainsForActionableProposalGroups;
8
8
 
9
- var _react = require("@emotion/react");
9
+ var _react = require("react");
10
+
11
+ var _react2 = require("@emotion/react");
10
12
 
11
13
  var _core = require("@blueprintjs/core");
12
14
 
13
- var _queries = require("./queries");
15
+ var _queries = require("../queries");
14
16
 
15
17
  /** @jsx jsx */
16
18
 
@@ -20,7 +22,6 @@ var _queries = require("./queries");
20
22
  * Tools for rendering proposal groups as tree nodes.
21
23
  * Each proposal group is top-level node, with proposals as nested nodes.
22
24
  */
23
- //import React, { useContext, useMemo } from 'react';
24
25
  function getActionableProposalGroupsAsTreeNodes(groups, opts) {
25
26
  return groups. //filter(({ proposals }) => proposals && proposals.length > 0).
26
27
  map(({
@@ -37,7 +38,9 @@ function getActionableProposalGroupsAsTreeNodes(groups, opts) {
37
38
  id: groupLabel,
38
39
  label: groupLabel,
39
40
  hasCaret: true,
40
- secondaryLabel: hasActiveProposal && !isExpanded ? activeCRMarker : (0, _react.jsx)(_core.Tag, {
41
+ secondaryLabel: hasActiveProposal && !isExpanded ? (0, _react2.jsx)(ActiveMarker, {
42
+ isActive: true
43
+ }) : (0, _react2.jsx)(_core.Tag, {
41
44
  minimal: !hasProposals,
42
45
  intent: hasProposals ? 'primary' : undefined
43
46
  }, hasProposals ? proposals.length : 0),
@@ -49,27 +52,56 @@ function getActionableProposalGroupsAsTreeNodes(groups, opts) {
49
52
  },
50
53
  childNodes: hasProposals && isExpanded ? proposals.map(p => getActionableProposalTreeNode(p, {
51
54
  isSelected: p.id === (opts === null || opts === void 0 ? void 0 : opts.selectedCRID),
52
- isActive: p.id === (opts === null || opts === void 0 ? void 0 : opts.activeCRID)
55
+ isActive: p.id === (opts === null || opts === void 0 ? void 0 : opts.activeCRID),
56
+ onActivateCR: opts === null || opts === void 0 ? void 0 : opts.onActivateCR
53
57
  })) : []
54
58
  };
55
59
  });
56
60
  }
57
61
 
58
- const activeCRMarker = (0, _react.jsx)(_core.Tag, {
59
- intent: 'danger'
60
- }, "active");
62
+ const ActiveMarker = function ({
63
+ onToggle,
64
+ isActive
65
+ }) {
66
+ const handleClick = (0, _react.useCallback)(evt => {
67
+ evt.stopPropagation();
68
+ onToggle === null || onToggle === void 0 ? void 0 : onToggle();
69
+ }, [onToggle]);
70
+ return (0, _react2.jsx)(_core.Button, {
71
+ icon: "eye-open",
72
+ small: true,
73
+ outlined: true,
74
+ active: isActive,
75
+ intent: isActive ? 'danger' : undefined,
76
+ disabled: !onToggle,
77
+ onClick: handleClick
78
+ });
79
+ };
61
80
 
62
81
  function getActionableProposalTreeNode(proposal, opts) {
63
82
  var _a;
64
83
 
65
84
  return {
66
85
  id: proposal.id,
67
- label: (0, _react.jsx)("span", {
86
+ label: (0, _react2.jsx)("span", {
68
87
  title: `Double-click the proposal to activate: “${proposal.justification}”`
69
88
  }, proposal.justification),
70
89
  isSelected: (_a = opts === null || opts === void 0 ? void 0 : opts.isSelected) !== null && _a !== void 0 ? _a : false,
71
90
  icon: 'lightbulb',
72
- secondaryLabel: (opts === null || opts === void 0 ? void 0 : opts.isActive) ? activeCRMarker : undefined,
91
+ secondaryLabel: (opts === null || opts === void 0 ? void 0 : opts.isActive) ? (0, _react2.jsx)(ActiveMarker, {
92
+ isActive: true,
93
+ onToggle: opts.onActivateCR ? () => {
94
+ var _a;
95
+
96
+ return (_a = opts === null || opts === void 0 ? void 0 : opts.onActivateCR) === null || _a === void 0 ? void 0 : _a.call(opts, null);
97
+ } : undefined
98
+ }) : (0, _react2.jsx)(ActiveMarker, {
99
+ onToggle: (opts === null || opts === void 0 ? void 0 : opts.onActivateCR) ? () => {
100
+ var _a;
101
+
102
+ return (_a = opts === null || opts === void 0 ? void 0 : opts.onActivateCR) === null || _a === void 0 ? void 0 : _a.call(opts, proposal.id);
103
+ } : undefined
104
+ }),
73
105
  nodeData: {
74
106
  type: 'item'
75
107
  }
@@ -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\n//import React, { useContext, useMemo } from 'react';\nimport { jsx } from '@emotion/react';\n\nimport { Tag } from '@blueprintjs/core';\nimport type { IconName, TreeNodeInfo } from '@blueprintjs/core';\nimport type { RegisterStakeholder } from '../../types';\nimport type { SomeCR as CR } from '../../types/cr';\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 },\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 ? activeCRMarker\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 }))\n : [],\n };\n });\n}\n\nconst activeCRMarker = <Tag intent='danger'>active</Tag>;\n\nfunction getActionableProposalTreeNode(\n proposal: CR,\n opts?: { isSelected?: boolean, isActive?: boolean },\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 ? activeCRMarker : 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 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"]}
@@ -0,0 +1,6 @@
1
+ export * from './ChangeRequestContext';
2
+ export * from './objectChangeset';
3
+ export * from './types';
4
+ export * from './ProposalBrowser';
5
+ export * from './queries';
6
+ export * from './actionableGroups/queries';
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _ChangeRequestContext = require("./ChangeRequestContext");
8
+
9
+ Object.keys(_ChangeRequestContext).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ if (key in exports && exports[key] === _ChangeRequestContext[key]) return;
12
+ Object.defineProperty(exports, key, {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _ChangeRequestContext[key];
16
+ }
17
+ });
18
+ });
19
+
20
+ var _objectChangeset = require("./objectChangeset");
21
+
22
+ Object.keys(_objectChangeset).forEach(function (key) {
23
+ if (key === "default" || key === "__esModule") return;
24
+ if (key in exports && exports[key] === _objectChangeset[key]) return;
25
+ Object.defineProperty(exports, key, {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _objectChangeset[key];
29
+ }
30
+ });
31
+ });
32
+
33
+ var _types = require("./types");
34
+
35
+ Object.keys(_types).forEach(function (key) {
36
+ if (key === "default" || key === "__esModule") return;
37
+ if (key in exports && exports[key] === _types[key]) return;
38
+ Object.defineProperty(exports, key, {
39
+ enumerable: true,
40
+ get: function () {
41
+ return _types[key];
42
+ }
43
+ });
44
+ });
45
+
46
+ var _ProposalBrowser = require("./ProposalBrowser");
47
+
48
+ Object.keys(_ProposalBrowser).forEach(function (key) {
49
+ if (key === "default" || key === "__esModule") return;
50
+ if (key in exports && exports[key] === _ProposalBrowser[key]) return;
51
+ Object.defineProperty(exports, key, {
52
+ enumerable: true,
53
+ get: function () {
54
+ return _ProposalBrowser[key];
55
+ }
56
+ });
57
+ });
58
+
59
+ var _queries = require("./queries");
60
+
61
+ Object.keys(_queries).forEach(function (key) {
62
+ if (key === "default" || key === "__esModule") return;
63
+ if (key in exports && exports[key] === _queries[key]) return;
64
+ Object.defineProperty(exports, key, {
65
+ enumerable: true,
66
+ get: function () {
67
+ return _queries[key];
68
+ }
69
+ });
70
+ });
71
+
72
+ var _queries2 = require("./actionableGroups/queries");
73
+
74
+ Object.keys(_queries2).forEach(function (key) {
75
+ if (key === "default" || key === "__esModule") return;
76
+ if (key in exports && exports[key] === _queries2[key]) return;
77
+ Object.defineProperty(exports, key, {
78
+ enumerable: true,
79
+ get: function () {
80
+ return _queries2[key];
81
+ }
82
+ });
83
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/proposals/index.tsx"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,4BAA4B,CAAC","sourcesContent":["export * from './ChangeRequestContext';\nexport * from './objectChangeset';\nexport * from './types';\nexport * from './ProposalBrowser';\nexport * from './queries';\nexport * from './actionableGroups/queries';\n"]}
@@ -1,9 +1,9 @@
1
1
  import type { ObjectDataset, ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';
2
- import type { InternalItemReference, RegisterItem, ProposalSet, ChangeProposal, ItemClassConfigurationSet } from '../../types';
3
- import type { Version as RegisterVersion } from '../../types/register';
4
- import { type Drafted, type ReturnedForClarificationByManager, type ReturnedForClarificationByControlBody, ImportableCR } from '../../types/cr';
2
+ import type { InternalItemReference, RegisterItem, ItemClassConfigurationSet } from '../types';
3
+ import type { ProposalSet, ChangeProposal } from './types';
4
+ import { type Drafted, type ReturnedForClarificationByManager, type ReturnedForClarificationByControlBody, ImportableCR } from './types';
5
5
  /** Takes a justification and ID, returns an object changeset. */
6
- export declare function newCRObjectChangeset(id: string, justification: string, registerVersion: RegisterVersion, stakeholderGitServerUsername: string): ObjectChangeset;
6
+ export declare function newCRObjectChangeset(id: string, justification: string, registerVersion: string, stakeholderGitServerUsername: string): ObjectChangeset;
7
7
  /**
8
8
  * Returns an object changeset given an importable proposal,
9
9
  * item class definitions for register to import it to,
@@ -8,11 +8,11 @@ exports.importedProposalToCRObjectChangeset = importedProposalToCRObjectChangese
8
8
  exports.updateCRObjectChangeset = updateCRObjectChangeset;
9
9
  exports.proposalsToObjectChangeset = proposalsToObjectChangeset;
10
10
 
11
- var _types = require("../../types");
11
+ var _itemPathUtils = require("../views/itemPathUtils");
12
12
 
13
- var _cr = require("../../types/cr");
13
+ var _types = require("../types");
14
14
 
15
- var _itemPathUtils = require("../itemPathUtils");
15
+ var _types2 = require("./types");
16
16
 
17
17
  /** Takes a justification and ID, returns an object changeset. */
18
18
  function newCRObjectChangeset(id, justification, registerVersion, stakeholderGitServerUsername) {
@@ -24,8 +24,8 @@ function newCRObjectChangeset(id, justification, registerVersion, stakeholderGit
24
24
  justification,
25
25
  submittingStakeholderGitServerUsername: stakeholderGitServerUsername,
26
26
  items: {},
27
- state: _cr.State.DRAFT,
28
- registerVersion: registerVersion.id
27
+ state: _types2.State.DRAFT,
28
+ registerVersion
29
29
  };
30
30
  const crObjectPath = (0, _itemPathUtils.crIDToCRPath)(id);
31
31
  return {
@@ -380,4 +380,4 @@ async function proposalToObjectChangeset(crID, proposal, itemRef, itemPath, item
380
380
  newValue: updatedItem
381
381
  };
382
382
  return changeset;
383
- } // Helper
383
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objectChangeset.js","sourceRoot":"","sources":["../../src/proposals/objectChangeset.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Change, Changeset } from '@riboseinc/paneron-extension-kit/types/changes';\nimport type { ObjectDataset, ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\n\nimport {\n crIDToCRPath,\n itemPathInCR,\n itemPathToItemRef,\n itemRefToItemPath,\n} from '../views/itemPathUtils';\nimport type {\n InternalItemReference,\n RegisterItem,\n ItemClassConfigurationSet,\n} from '../types';\nimport { isRegisterItem } from '../types';\n\nimport type {\n ProposalSet,\n ChangeProposal,\n Amendment,\n Supersession,\n} from './types';\nimport {\n State,\n type Drafted,\n type ReturnedForClarificationByManager,\n type ReturnedForClarificationByControlBody,\n ImportableCR,\n} from './types';\n\n\n/** Takes a justification and ID, returns an object changeset. */\nexport function newCRObjectChangeset(\n id: string,\n justification: string,\n registerVersion: string,\n stakeholderGitServerUsername: string,\n): ObjectChangeset {\n\n const timeStarted = new Date();\n const cr: Drafted = {\n id,\n timeStarted,\n timeEdited: timeStarted,\n justification,\n submittingStakeholderGitServerUsername: stakeholderGitServerUsername,\n items: {},\n state: State.DRAFT,\n registerVersion,\n };\n const crObjectPath = crIDToCRPath(id);\n return {\n [crObjectPath]: {\n oldValue: null,\n newValue: cr,\n },\n }\n}\n\n\n/**\n * Returns an object changeset given an importable proposal,\n * item class definitions for register to import it to,\n * and a function to fetch register item data.\n *\n * Throws an error if importable proposal data isn’t compatible\n * with item class definitions or existing register data.\n */\nexport async function importedProposalToCRObjectChangeset(\n importableCR: ImportableCR,\n /** Available item classes per register configuration. */\n itemClasses: ItemClassConfigurationSet,\n /** VCS username of the person performing the import. */\n importingStakeholderGitServerUsername: string,\n getObjectData: (opts: { objectPaths: string[] }) => Promise<{ data: ObjectDataset }>,\n resolvePredicates?: (predicates: Set<string>) => Promise<ResolvedPredicates>,\n //findObjects: (predicate: string) => Promise<any[]>,\n): Promise<[changeset: ObjectChangeset, id: string]> {\n const proposalDraft: Drafted = importableCR.proposalDraft;\n proposalDraft.submittingStakeholderGitServerUsername = importingStakeholderGitServerUsername;\n const crID = proposalDraft.id;\n const crPath = crIDToCRPath(crID);\n\n const itemPaths = Object.keys(proposalDraft.items);\n const proposals = Object.values(proposalDraft.items);\n\n for (const itemPath of itemPaths) {\n const itemRef = itemPathToItemRef(false, itemPath);\n if (!itemClasses[itemRef.classID]) {\n throw new Error(`Imported proposal contains item(s) of unknown class ${itemRef.classID}`);\n }\n }\n\n if (proposals.find(prop => prop.type !== 'addition')) {\n throw new Error(\"Only addition proposals can be imported at this time\");\n }\n\n const existingItems = (await getObjectData({ objectPaths: itemPaths })).data;\n if (Object.values(existingItems).find(v => v !== null)) {\n throw new Error(\"Register already contains item(s) in this proposal\");\n }\n\n const changeset: ObjectChangeset = {\n [crPath]: {\n oldValue: null,\n newValue: proposalDraft,\n },\n };\n\n for (const [itemPath, itemPayload] of Object.entries(importableCR.itemPayloads ?? {})) {\n if (itemPaths.indexOf(itemPath) < 0) {\n throw new Error(`No proposal found for item at ${itemPath}, but item data is given`);\n }\n if (!isRegisterItem(itemPayload)) {\n throw new Error(`Invalid register item data at ${itemPath}`);\n }\n const predicates = collectPredicates(itemPayload);\n if (predicates.size < 1) {\n changeset[itemPathInCR(itemPath, crID)] = {\n oldValue: null,\n newValue: itemPayload,\n };\n } else {\n if (!resolvePredicates) {\n throw new Error(\"Cannot resolve some predicates in imported proposal\");\n }\n changeset[itemPathInCR(itemPath, crID)] = {\n oldValue: null,\n newValue: replacePredicates(itemPayload, await resolvePredicates(predicates)),\n };\n }\n }\n\n return [changeset, crID];\n}\n\n\n/**\n * When importable CR wants to link to preexisting register items,\n * and it does not know their exact UUIDs but knows some other properties,\n * it can provide this structure in place of a reference.\n *\n * `resolvePredicates()` will resolve any such placeholders to item UUIDs\n * at import time.\n *\n * `mode` should specify whether the predicate should be replaced with\n * only a UUID string ('id', used when classID is already known)\n * or full `InternalItemReference` instance ('generic').\n */\nexport interface Predicate {\n __isPredicate: true\n /**\n * Predicate expression to resolve.\n * Example: `data.identifier && parseInt(data.identifier, 10) === 123`.\n */\n predicate: string\n // TODO: Specify different subtypes for generic and ID?\n mode: 'generic' | 'id'\n}\n\n\nfunction isPredicate(val: any): val is Predicate {\n return val && val.__isPredicate === true;\n}\n\n/** Maps found predicates to resolved item references. */\ntype ResolvedPredicates = Record<string, InternalItemReference>;\n\n/**\n * Resolves any properties that should reference register item UUIDs,\n * but have predicates instead, using a map of found predicates\n * and item references they already were resolved to.\n */\nfunction replacePredicates<T>(\n value: T,\n resolvedPredicates: Readonly<ResolvedPredicates>,\n): T /*extends Predicate ? (string | InternalItemReference) : WithPredicatesResolved<T>*/ {\n // NOTE: Return types are cast because https://github.com/microsoft/TypeScript/issues/33912.\n if (isPredicate(value)) {\n const ref = resolvedPredicates[value.predicate];\n if (!ref) {\n throw new Error(`Could not resolve predicate “${value.predicate}”`);\n }\n if (value.mode === 'generic') {\n return ref as unknown as T;\n } else {\n return ref.itemID as unknown as T;\n }\n } else if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n return value.map((v: any) => replacePredicates(v, resolvedPredicates)) as any;\n } else {\n // Assume plain non-array object.\n for (const [key, v] of Object.entries(value)) {\n value[key as keyof typeof value] = replacePredicates(v, resolvedPredicates);\n }\n return value as any;\n }\n } else {\n return value as any;\n }\n}\n\nfunction collectPredicates(\n /**\n * Imported register item data with possibly some predicates\n * instead of related item references.\n */\n value: unknown | unknown[],\n\n /** Cache for recursive calls, don’t supply. */\n _cache?: Set<string>,\n): Set<string> {\n const collected = _cache ?? new Set<string>();\n\n if (isPredicate(value)) {\n collected.add(value.predicate);\n } else if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n for (const item in value) {\n collectPredicates(item, collected);\n }\n value.map((v: any) => collectPredicates(v, collected));\n } else {\n // Assume plain non-array object.\n for (const v of Object.values(value)) {\n collectPredicates(v, collected);\n }\n }\n }\n\n return collected;\n}\n\n\n/**\n * Returns an object changeset to update CR with new given proposal items.\n * Only applicable to CR at draft edit stage.\n */\nexport function updateCRObjectChangeset(\n /**\n * Change request data.\n */\n cr: Drafted | ReturnedForClarificationByManager | ReturnedForClarificationByControlBody,\n\n /**\n * Proposals by item path.\n * Will be merged with those already existing in `cr`.\n * If a proposal is undefined, it will be removed.\n */\n proposalItems: Record<string, ChangeProposal | null>,\n\n /**\n * New item data must be provided for additions and clarifications,\n * keyed by item path.\n */\n itemData: Record<string, RegisterItem<any>> = {},\n): ObjectChangeset {\n const changeset: ObjectChangeset = {};\n const newItems = { ...cr.items };\n for (const [itemPath, proposal] of Object.entries(proposalItems)) {\n // Update proposals on CR\n if (proposal !== null) {\n newItems[itemPath] = proposal;\n } else if (newItems[itemPath]) {\n delete newItems[itemPath];\n }\n // Add/remove item data\n if (proposal?.type === 'addition' || proposal?.type === 'clarification') {\n const proposedItemData = itemData[itemPath];\n if (proposedItemData === null || !isRegisterItem(proposedItemData)) {\n console.error(\"Unable to convert proposals to object changeset: original item data is missing\", itemPath);\n throw new Error(\"Unable to convert proposals to object changeset: original item data is missing\");\n }\n changeset[itemPathInCR(itemPath, cr.id)] = {\n // When editing a draft, we don’t care\n // about overwriting proposed item data so we omit oldValue.\n newValue: proposedItemData,\n };\n } else {\n changeset[itemPathInCR(itemPath, cr.id)] = {\n // When editing a draft, we don’t care\n // about overwriting proposed item data so we omit oldValue.\n newValue: null,\n };\n }\n }\n // Update main CR data\n const crPath = crIDToCRPath(cr.id);\n changeset[crPath] = {\n oldValue: cr,\n newValue: { ...cr, items: newItems, timeEdited: new Date() },\n };\n return changeset;\n}\n\n\n/**\n * Given change proposals, returns applicable changes\n * to objects in the dataset.\n */\nexport async function proposalsToObjectChangeset(\n crID: string,\n hasSubregisters: boolean,\n proposals: ProposalSet,\n itemData: Record<string, RegisterItem<any> | null>,\n newItemData: Record<string, RegisterItem<any> | null>,\n): Promise<ObjectChangeset> {\n const cs: ObjectChangeset = {};\n\n for (const [itemPath, proposal] of Object.entries(proposals)) {\n //const originalItem: RegisterItem<any> | undefined = (itemData[itemPath] ?? undefined);\n const itemRef = itemPathToItemRef(hasSubregisters, itemPath);\n\n if (proposal.type !== 'addition') {\n if (itemData[itemPath] === undefined) {\n console.error(\"Unable to convert proposals to object changeset: original item data is missing\", itemPath);\n throw new Error(\"Unable to convert proposals to object changeset: original item data is missing\");\n }\n if (proposal.type === 'amendment' && proposal.amendmentType === 'supersession') {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n } else {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n }\n } else {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n }\n }\n\n return cs;\n}\n\n// TODO: Refactor out the business logic of proposal approval.\n/**\n * Given a change proposal, returns applicable changes\n * to objects in the dataset.\n * Core logic of approving a proposal.\n * Takes a proposal and extra options (depending on proposal type).\n * Returns a Changeset containing register items at appropriate paths.\n */\nasync function proposalToObjectChangeset(\n crID: string,\n proposal: ChangeProposal,\n itemRef: InternalItemReference,\n itemPath: string,\n itemData: Record<string, RegisterItem<any> | null>,\n newItemData: Record<string, RegisterItem<any> | null>,\n): Promise<Changeset<Change<RegisterItem<any>>>> {\n let updatedItem: RegisterItem<any>;\n const changeset: Changeset<Change<RegisterItem<any>>> = {};\n\n const origItem = itemData[itemPath] ?? null;\n const newItem = newItemData[itemPathInCR(itemPath, crID)] ?? null;\n\n if (proposal.type !== 'addition') {\n if (origItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires original item data for non-additions\");\n }\n\n updatedItem = { ...origItem };\n\n switch (proposal.type) {\n case 'clarification':\n if (newItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires new item data for clarifications\");\n }\n //const clarification = proposal as Clarification;\n updatedItem.data = newItem.data //clarification.payload;\n break;\n case 'amendment':\n const amendment = proposal as Amendment;\n updatedItem.amendedInCR = crID;\n\n switch (amendment.amendmentType) {\n case 'retirement':\n updatedItem.status = 'retired';\n break;\n case 'invalidation':\n updatedItem.status = 'invalid';\n break;\n case 'supersession':\n const supersession = proposal as Supersession;\n updatedItem.status = 'superseded';\n updatedItem.supersededBy = supersession.supersedingItemIDs.map(itemID => ({\n itemID,\n classID: itemRef.classID,\n subregisterID: itemRef.subregisterID,\n }));\n for (const supersedingItemPath of updatedItem.supersededBy.map(ip => itemRefToItemPath(ip))) {\n const supersedingItemData = itemData[supersedingItemPath];\n if (supersedingItemData) {\n changeset[supersedingItemPath] = {\n oldValue: supersedingItemData,\n newValue: {\n ...supersedingItemData,\n supersedes: [ ...(supersedingItemData.supersedes ?? []), itemRef ],\n },\n };\n }\n }\n break;\n }\n break;\n }\n } else {\n if (newItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires new item data for additions\");\n }\n updatedItem = {\n id: itemRef.itemID,\n data: newItem.data,\n status: 'valid',\n dateAccepted: new Date(),\n };\n }\n\n changeset[itemPath] = {\n oldValue: origItem,\n newValue: updatedItem,\n };\n\n return changeset;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ /** Basic predicate/query to get just group proposal entry points (main.yaml) */
2
+ export declare const CR_BASE_QUERY = "objPath.indexOf(\"/proposals/\") === 0 && objPath.endsWith(\"main.yaml\")";
3
+ /** Predicate/query to get only disposed group proposals */
4
+ export declare const DISPOSED_CR_QUERY = "obj.timeDisposed !== undefined && obj.timeDisposed !== null";
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DISPOSED_CR_QUERY = exports.CR_BASE_QUERY = void 0;
7
+
8
+ /** Basic predicate/query to get just group proposal entry points (main.yaml) */
9
+ const CR_BASE_QUERY = 'objPath.indexOf("/proposals/") === 0 && objPath.endsWith("main.yaml")';
10
+ /** Predicate/query to get only disposed group proposals */
11
+
12
+ exports.CR_BASE_QUERY = CR_BASE_QUERY;
13
+ const DISPOSED_CR_QUERY = 'obj.timeDisposed !== undefined && obj.timeDisposed !== null';
14
+ exports.DISPOSED_CR_QUERY = DISPOSED_CR_QUERY;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/proposals/queries.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,CAAC,MAAM,aAAa,GAAG,uEAAuE,CAAC;AAErG,2DAA2D;AAC3D,MAAM,CAAC,MAAM,iBAAiB,GAAG,6DAA6D,CAAC","sourcesContent":["/** Basic predicate/query to get just group proposal entry points (main.yaml) */\nexport const CR_BASE_QUERY = 'objPath.indexOf(\"/proposals/\") === 0 && objPath.endsWith(\"main.yaml\")';\n\n/** Predicate/query to get only disposed group proposals */\nexport const DISPOSED_CR_QUERY = 'obj.timeDisposed !== undefined && obj.timeDisposed !== null';\n"]}
@@ -1,9 +1,72 @@
1
- /** Change request types, states and state transitions. */
1
+ /**
2
+ * Proposals, group proposals,
3
+ * group proposal states and state transitions.
4
+ */
2
5
  import type React from 'react';
3
6
  import type { DatasetContext } from '@riboseinc/paneron-extension-kit/types/renderer';
4
- import type { ProposalSet } from './proposal';
5
- import type { RegisterStakeholder } from './stakeholder';
6
- import type { RegisterItem } from './item';
7
+ import type { InternalItemReference, Payload, RegisterItem } from '../types';
8
+ import type { RegisterStakeholder } from '../types/stakeholder';
9
+ import type { Citation } from '../types/util';
10
+ /**
11
+ * Item paths in proposal set must start with a slash
12
+ * and will be treated relative to dataset root.
13
+ * Object paths should conform to registry item path shape
14
+ * of `/<classID>/<itemID>.yaml`.
15
+ * (the `[/subregisterID]/<classID>/<itemID>.yaml` is acceptable
16
+ * but deprecated, as subregisters are deprecated).
17
+ */
18
+ export declare type ProposalSet = {
19
+ [objectPath: string]: ChangeProposal;
20
+ };
21
+ export declare const ChangeProposalType: {
22
+ readonly ADDITION: "addition";
23
+ readonly CLARIFICATION: "clarification";
24
+ readonly AMENDMENT: "amendment";
25
+ };
26
+ export declare const PROPOSAL_TYPES: readonly ["addition", "clarification", "amendment"];
27
+ interface BaseProposal {
28
+ disposition?: 'accepted' | 'notAccepted';
29
+ type: typeof PROPOSAL_TYPES[number];
30
+ sources?: Citation[];
31
+ }
32
+ export interface Addition extends BaseProposal {
33
+ type: typeof ChangeProposalType.ADDITION;
34
+ }
35
+ export interface Clarification extends BaseProposal {
36
+ type: typeof ChangeProposalType.CLARIFICATION;
37
+ }
38
+ export declare const AmendmentType: {
39
+ readonly SUPERSESSION: "supersession";
40
+ readonly RETIREMENT: "retirement";
41
+ readonly INVALIDATION: "invalidation";
42
+ };
43
+ export declare type AmendmentTypeType = typeof AmendmentType[keyof typeof AmendmentType];
44
+ export declare const AMENDMENT_TYPES: readonly ["supersession", "retirement", "invalidation"];
45
+ interface BaseAmendment extends BaseProposal {
46
+ type: typeof ChangeProposalType.AMENDMENT;
47
+ amendmentType: AmendmentTypeType;
48
+ }
49
+ export interface Retirement extends BaseAmendment {
50
+ amendmentType: typeof AmendmentType.RETIREMENT;
51
+ }
52
+ export interface Supersession extends BaseAmendment {
53
+ amendmentType: typeof AmendmentType.SUPERSESSION;
54
+ supersedingItemIDs: string[];
55
+ }
56
+ export interface Invalidation extends BaseAmendment {
57
+ amendmentType: typeof AmendmentType.INVALIDATION;
58
+ }
59
+ export declare type Amendment = Supersession | Retirement | Invalidation;
60
+ export declare type ChangeProposal = Amendment | Clarification | Addition;
61
+ export declare function isBaseProposal(val: any): val is BaseProposal;
62
+ export declare function isProposal(val: any): val is ChangeProposal;
63
+ export declare function isAddition(val: BaseProposal): val is Addition;
64
+ export declare function isClarification(val: BaseProposal): val is Clarification;
65
+ export declare function isBaseAmendment(val: BaseProposal): val is BaseAmendment;
66
+ export declare function isAmendment(val: any): val is Amendment;
67
+ export declare function isRetirement(val: BaseAmendment): val is Retirement;
68
+ export declare function isSupersession(val: BaseAmendment): val is Supersession;
69
+ export declare function isInvalidation(val: BaseAmendment): val is Invalidation;
7
70
  export declare function isSubmittedBy(stakeholder: RegisterStakeholder, cr: Base): boolean;
8
71
  declare type ItemDataset = Record<string, RegisterItem<any> | null>;
9
72
  /** Used in place of enum for convenience. */
@@ -44,7 +107,7 @@ export interface Base<S extends StateType = StateType> {
44
107
  submittingStakeholderGitServerUsername: string;
45
108
  items: ProposalSet;
46
109
  /**
47
- * Against to which register version changes were proposed.
110
+ * Against which register version changes were proposed.
48
111
  */
49
112
  registerVersion: string;
50
113
  /**
@@ -106,6 +169,7 @@ export declare function isWithdrawn(cr: Base): cr is Withdrawn;
106
169
  export declare function hadBeenProposed(cr: Base): cr is Base & {
107
170
  timeProposed: Date;
108
171
  };
172
+ /** A proposal that had been disposed is not pending, not actionable. */
109
173
  export declare function isDisposed(cr: Base): cr is Base & {
110
174
  timeDisposed: Date;
111
175
  };
@@ -254,4 +318,15 @@ export declare type Transitions = {
254
318
  [State.REJECTION_UPHELD_ON_APPEAL]: TransitionConfig<Appealed, RejectionUpheld, RegisterOwnerInput>;
255
319
  };
256
320
  };
321
+ export interface ProposalProps<P extends ChangeProposal> {
322
+ proposal: P;
323
+ /** Highlight changes. */
324
+ showDiff?: boolean;
325
+ /** In diff mode, only show changed data. (Provisional.) */
326
+ showOnlyChanged?: boolean;
327
+ itemRef: InternalItemReference;
328
+ item: RegisterItem<Payload>;
329
+ itemBefore: P extends Clarification ? RegisterItem<Payload> : undefined;
330
+ onChange?: (newProposal: P) => void;
331
+ }
257
332
  export {};