@riboseinc/paneron-registry-kit 2.0.0-dev8 → 2.0.0

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 (183) hide show
  1. package/common.d.ts +1 -1
  2. package/common.js +1 -1
  3. package/common.js.map +1 -1
  4. package/index.d.ts +3 -3
  5. package/index.js +3 -3
  6. package/index.js.map +1 -1
  7. package/package.json +26 -18
  8. package/types/cr.d.ts +216 -0
  9. package/types/cr.js +175 -0
  10. package/types/cr.js.map +1 -0
  11. package/types/index.d.ts +1 -0
  12. package/types/index.js +19 -0
  13. package/types/index.js.map +1 -1
  14. package/types/item.d.ts +13 -3
  15. package/types/item.js +11 -1
  16. package/types/item.js.map +1 -1
  17. package/types/proposal.d.ts +31 -14
  18. package/types/proposal.js +1 -1
  19. package/types/proposal.js.map +1 -1
  20. package/types/register.d.ts +6 -5
  21. package/types/register.js +19 -1
  22. package/types/register.js.map +1 -1
  23. package/types/registry.d.ts +8 -3
  24. package/types/registry.js +8 -1
  25. package/types/registry.js.map +1 -1
  26. package/types/stakeholder.d.ts +40 -16
  27. package/types/stakeholder.js +47 -3
  28. package/types/stakeholder.js.map +1 -1
  29. package/types/views.d.ts +98 -24
  30. package/types/views.js.map +1 -1
  31. package/views/AnnotatedChange.d.ts +7 -0
  32. package/views/AnnotatedChange.js +91 -0
  33. package/views/AnnotatedChange.js.map +1 -0
  34. package/views/BrowserCtx.d.ts +66 -2
  35. package/views/BrowserCtx.js +13 -2
  36. package/views/BrowserCtx.js.map +1 -1
  37. package/views/FilterCriteria/CRITERIA_CONFIGURATION.d.ts +17 -0
  38. package/views/FilterCriteria/CRITERIA_CONFIGURATION.js +202 -0
  39. package/views/FilterCriteria/CRITERIA_CONFIGURATION.js.map +1 -0
  40. package/views/FilterCriteria/criteriaGroupToQueryExpression.d.ts +6 -0
  41. package/views/FilterCriteria/criteriaGroupToQueryExpression.js +50 -0
  42. package/views/FilterCriteria/criteriaGroupToQueryExpression.js.map +1 -0
  43. package/views/FilterCriteria/criteriaGroupToSummary.d.ts +5 -0
  44. package/views/FilterCriteria/criteriaGroupToSummary.js +62 -0
  45. package/views/FilterCriteria/criteriaGroupToSummary.js.map +1 -0
  46. package/views/FilterCriteria/criteriaToNodes.d.ts +24 -0
  47. package/views/FilterCriteria/criteriaToNodes.js +159 -0
  48. package/views/FilterCriteria/criteriaToNodes.js.map +1 -0
  49. package/views/FilterCriteria/index.d.ts +23 -0
  50. package/views/FilterCriteria/index.js +130 -0
  51. package/views/FilterCriteria/index.js.map +1 -0
  52. package/views/FilterCriteria/models.d.ts +68 -0
  53. package/views/FilterCriteria/models.js +34 -0
  54. package/views/FilterCriteria/models.js.map +1 -0
  55. package/views/FilterCriteria/mutateGroup.d.ts +17 -0
  56. package/views/FilterCriteria/mutateGroup.js +59 -0
  57. package/views/FilterCriteria/mutateGroup.js.map +1 -0
  58. package/views/GenericRelatedItemView.d.ts +1 -1
  59. package/views/GenericRelatedItemView.js +143 -101
  60. package/views/GenericRelatedItemView.js.map +1 -1
  61. package/views/RegisterStakeholder.d.ts +9 -0
  62. package/views/RegisterStakeholder.js +40 -0
  63. package/views/RegisterStakeholder.js.map +1 -0
  64. package/views/RegisterVersion.d.ts +9 -0
  65. package/views/RegisterVersion.js +41 -0
  66. package/views/RegisterVersion.js.map +1 -0
  67. package/views/SearchQuery.d.ts +13 -0
  68. package/views/SearchQuery.js +137 -0
  69. package/views/SearchQuery.js.map +1 -0
  70. package/views/change-request/ChangeRequestContext.d.ts +20 -0
  71. package/views/change-request/ChangeRequestContext.js +56 -0
  72. package/views/change-request/ChangeRequestContext.js.map +1 -0
  73. package/views/change-request/Proposals.d.ts +21 -0
  74. package/views/change-request/Proposals.js +331 -0
  75. package/views/change-request/Proposals.js.map +1 -0
  76. package/views/change-request/objectChangeset.d.ts +31 -0
  77. package/views/change-request/objectChangeset.js +229 -0
  78. package/views/change-request/objectChangeset.js.map +1 -0
  79. package/views/detail/ChangeRequest/Proposal.d.ts +0 -0
  80. package/views/detail/ChangeRequest/Proposal.js +142 -0
  81. package/views/detail/ChangeRequest/Proposal.js.map +1 -0
  82. package/views/detail/ChangeRequest/index.d.ts +13 -0
  83. package/views/detail/ChangeRequest/index.js +207 -0
  84. package/views/detail/ChangeRequest/index.js.map +1 -0
  85. package/views/detail/ChangeRequest/transitions.d.ts +28 -0
  86. package/views/detail/ChangeRequest/transitions.js +530 -0
  87. package/views/detail/ChangeRequest/transitions.js.map +1 -0
  88. package/views/detail/CustomView/index.d.ts +13 -0
  89. package/views/detail/CustomView/index.js +68 -0
  90. package/views/detail/CustomView/index.js.map +1 -0
  91. package/views/detail/RegisterHome/index.d.ts +5 -0
  92. package/views/detail/RegisterHome/index.js +128 -0
  93. package/views/detail/RegisterHome/index.js.map +1 -0
  94. package/views/detail/RegisterItem/RelatedItems.d.ts +13 -0
  95. package/views/detail/RegisterItem/RelatedItems.js +61 -0
  96. package/views/detail/RegisterItem/RelatedItems.js.map +1 -0
  97. package/views/detail/RegisterItem/SupersedingItemMenu.d.ts +13 -0
  98. package/views/detail/RegisterItem/SupersedingItemMenu.js +56 -0
  99. package/views/detail/RegisterItem/SupersedingItemMenu.js.map +1 -0
  100. package/views/detail/RegisterItem/index.d.ts +13 -0
  101. package/views/detail/RegisterItem/index.js +356 -0
  102. package/views/detail/RegisterItem/index.js.map +1 -0
  103. package/views/detail/RegisterMeta/RegisterMetaForm.d.ts +10 -0
  104. package/views/detail/RegisterMeta/RegisterMetaForm.js +331 -0
  105. package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -0
  106. package/views/detail/RegisterMeta/index.d.ts +10 -0
  107. package/views/detail/RegisterMeta/index.js +111 -0
  108. package/views/detail/RegisterMeta/index.js.map +1 -0
  109. package/views/detail/index.d.ts +1 -0
  110. package/views/detail/index.js +24 -0
  111. package/views/detail/index.js.map +1 -0
  112. package/views/diffing/InlineDiff.d.ts +12 -0
  113. package/views/diffing/InlineDiff.js +58 -0
  114. package/views/diffing/InlineDiff.js.map +1 -0
  115. package/views/diffing/StructuredDiff.d.ts +11 -0
  116. package/views/diffing/StructuredDiff.js +65 -0
  117. package/views/diffing/StructuredDiff.js.map +1 -0
  118. package/views/hooks/useCustomView.d.ts +3 -0
  119. package/views/hooks/useCustomView.js +24 -0
  120. package/views/hooks/useCustomView.js.map +1 -0
  121. package/views/hooks/useItemClassConfig.d.ts +3 -0
  122. package/views/hooks/useItemClassConfig.js +24 -0
  123. package/views/hooks/useItemClassConfig.js.map +1 -0
  124. package/views/hooks/useItemRef.d.ts +3 -0
  125. package/views/hooks/useItemRef.js +39 -0
  126. package/views/hooks/useItemRef.js.map +1 -0
  127. package/views/hooks/useSingleRegisterItemData.d.ts +3 -0
  128. package/views/hooks/useSingleRegisterItemData.js +32 -0
  129. package/views/hooks/useSingleRegisterItemData.js.map +1 -0
  130. package/views/index.d.ts +2 -2
  131. package/views/index.js +161 -130
  132. package/views/index.js.map +1 -1
  133. package/views/itemPathUtils.d.ts +45 -2
  134. package/views/itemPathUtils.js +101 -14
  135. package/views/itemPathUtils.js.map +1 -1
  136. package/views/itemQueryUtils.d.ts +11 -0
  137. package/views/itemQueryUtils.js +48 -0
  138. package/views/itemQueryUtils.js.map +1 -0
  139. package/views/protocolRegistry.d.ts +12 -0
  140. package/views/protocolRegistry.js +42 -0
  141. package/views/protocolRegistry.js.map +1 -0
  142. package/views/sidebar/Browse/index.d.ts +11 -0
  143. package/views/sidebar/Browse/index.js +453 -0
  144. package/views/sidebar/Browse/index.js.map +1 -0
  145. package/views/sidebar/Export/index.d.ts +5 -0
  146. package/views/sidebar/Export/index.js +94 -0
  147. package/views/sidebar/Export/index.js.map +1 -0
  148. package/views/sidebar/ListItem.d.ts +10 -0
  149. package/views/sidebar/ListItem.js +43 -0
  150. package/views/sidebar/ListItem.js.map +1 -0
  151. package/views/sidebar/Registration/index.d.ts +5 -0
  152. package/views/sidebar/Registration/index.js +163 -0
  153. package/views/sidebar/Registration/index.js.map +1 -0
  154. package/views/sidebar/Search/index.d.ts +18 -0
  155. package/views/sidebar/Search/index.js +177 -0
  156. package/views/sidebar/Search/index.js.map +1 -0
  157. package/views/sidebar/index.d.ts +6 -0
  158. package/views/sidebar/index.js +104 -0
  159. package/views/sidebar/index.js.map +1 -0
  160. package/views/util.d.ts +29 -5
  161. package/views/util.js +92 -6
  162. package/views/util.js.map +1 -1
  163. package/views/ChangeRequest.d.ts +0 -12
  164. package/views/ChangeRequest.js +0 -689
  165. package/views/ChangeRequest.js.map +0 -1
  166. package/views/FilterCriteria.d.ts +0 -27
  167. package/views/FilterCriteria.js +0 -410
  168. package/views/FilterCriteria.js.map +0 -1
  169. package/views/ItemBrowser.d.ts +0 -12
  170. package/views/ItemBrowser.js +0 -255
  171. package/views/ItemBrowser.js.map +0 -1
  172. package/views/ItemDetails.d.ts +0 -14
  173. package/views/ItemDetails.js +0 -128
  174. package/views/ItemDetails.js.map +0 -1
  175. package/views/MainView.d.ts +0 -8
  176. package/views/MainView.js +0 -34
  177. package/views/MainView.js.map +0 -1
  178. package/views/RegisterInformation.d.ts +0 -7
  179. package/views/RegisterInformation.js +0 -264
  180. package/views/RegisterInformation.js.map +0 -1
  181. package/views/RegisterItemGrid.d.ts +0 -25
  182. package/views/RegisterItemGrid.js +0 -248
  183. package/views/RegisterItemGrid.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListItem.js","sourceRoot":"","sources":["../../../src/views/sidebar/ListItem.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,+BAA+B;AAC/B,MAAM,QAAQ,GACd,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE;IAClC,MAAM,EAAE,YAAY,EAAE,gCAAgC,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,iBAAiB,CAAC,YAAY,KAAK,SAAS,EAAE,UAAU,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,gCAAgC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC;IACxC,MAAM,WAAW,GAAG,UAAU,EAAE,IAAI,CAAC;IAErC,MAAM,QAAQ,GAAG,WAAW;QAC1B,CAAC,CAAC,IAAC,YAAY,IACX,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,OAAO,GAChB;QACJ,CAAC,CAAC,cAAM,GAAG,EAAE,GAAG,CAAA,aAAa;;YACF,UAAU;gBAC5B,CAAC;IAEZ,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAA;AAGD,eAAe,QAAQ,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport type { RegisterItem } from '../../types';\nimport { BrowserCtx } from '../BrowserCtx';\nimport { itemPathToItemRef } from '../itemPathUtils';\n\n\n/** Register item list view. */\nconst ListItem: React.FC<{ objectData: RegisterItem<any>, objectPath: string }> =\nfunction ({ objectData, objectPath }) {\n const { subregisters, getRelatedItemClassConfiguration } = useContext(BrowserCtx);\n const itemRef = itemPathToItemRef(subregisters !== undefined, objectPath);\n const clsConfig = getRelatedItemClassConfiguration(itemRef.classID);\n const ListItemView = clsConfig.itemView;\n const itemPayload = objectData?.data;\n\n const itemView = itemPayload\n ? <ListItemView\n itemData={itemPayload}\n itemRef={itemRef}\n />\n : <span css={css`opacity: .4`}>\n (missing item data at {objectPath})\n </span>;\n\n return itemView;\n}\n\n\nexport default ListItem;\n"]}
@@ -0,0 +1,5 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import React from 'react';
4
+ export declare const PendingChangeRequestsBlock: React.FC<Record<never, never>>;
5
+ export declare const ChangeRequestHistoryBlock: React.FC<Record<never, never>>;
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ChangeRequestHistoryBlock = exports.PendingChangeRequestsBlock = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _react2 = require("@emotion/react");
11
+
12
+ var _core = require("@blueprintjs/core");
13
+
14
+ var _context = require("@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context");
15
+
16
+ var _context2 = require("@riboseinc/paneron-extension-kit/context");
17
+
18
+ var _SearchResultList = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/SearchResultList"));
19
+
20
+ var _cr = require("../../../types/cr");
21
+
22
+ var _BrowserCtx = require("../../BrowserCtx");
23
+
24
+ var _itemPathUtils = require("../../itemPathUtils");
25
+
26
+ var _util = require("../../../views/util");
27
+
28
+ var _protocolRegistry = require("../../protocolRegistry");
29
+
30
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
+
32
+ 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); }
33
+
34
+ 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; }
35
+
36
+ /** @jsx jsx */
37
+
38
+ /** @jsxFrag React.Fragment */
39
+ //import { DatasetContext } from '@riboseinc/paneron-extension-kit/context';
40
+ const PendingChangeRequestsBlock = function () {
41
+ const {
42
+ stakeholder
43
+ } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
44
+ const stakeholderUsername = stakeholder === null || stakeholder === void 0 ? void 0 : stakeholder.gitServerUsername;
45
+ const stakeholderCondition = stakeholderUsername ? `obj.submittingStakeholderGitServerUsername === "${stakeholderUsername}"` : 'false'; // Don’t show drafts in the list of pending proposals, unless it’s user’s own drafts.
46
+
47
+ const query = `!obj.timeDisposed && (obj.state !== "draft" || ${stakeholderCondition})`;
48
+ return (0, _react2.jsx)(ChangeRequestListBlock, {
49
+ impliedQuery: query
50
+ });
51
+ };
52
+
53
+ exports.PendingChangeRequestsBlock = PendingChangeRequestsBlock;
54
+
55
+ const ChangeRequestHistoryBlock = function () {
56
+ return (0, _react2.jsx)(ChangeRequestListBlock, {
57
+ impliedQuery: DISPOSED_CR_QUERY
58
+ });
59
+ };
60
+
61
+ exports.ChangeRequestHistoryBlock = ChangeRequestHistoryBlock;
62
+ const CR_BASE_QUERY = 'objPath.indexOf("/proposals/") === 0 && objPath.endsWith("main.yaml")';
63
+ const DISPOSED_CR_QUERY = 'obj.timeDisposed !== undefined && obj.timeDisposed !== null';
64
+
65
+ const ChangeRequestListBlock = function ({
66
+ impliedQuery
67
+ }) {
68
+ const {
69
+ usePersistentDatasetStateReducer
70
+ } = (0, _react.useContext)(_context2.DatasetContext);
71
+ const {
72
+ spawnTab,
73
+ focusedTabURI
74
+ } = (0, _react.useContext)(_context.TabbedWorkspaceContext);
75
+ const {
76
+ selectedRegisterItem
77
+ } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
78
+ const initialState = {
79
+ quickSubstringQuery: '',
80
+ selectedItemPath: null
81
+ };
82
+ const itemPath = selectedRegisterItem ? (0, _itemPathUtils.itemRefToItemPath)(selectedRegisterItem.ref) : selectedRegisterItem; // ^ Adopt undefined value if no data is available, null if item is not selected
83
+
84
+ const [state, dispatch] = usePersistentDatasetStateReducer(`change-request-list-block-${itemPath === null ? 'global' : itemPath}-${impliedQuery}`, undefined, undefined, (prevState, action) => {
85
+ switch (action.type) {
86
+ case 'update-quick-substring-query':
87
+ return { ...prevState,
88
+ quickSubstringQuery: action.payload.substring
89
+ };
90
+
91
+ case 'select-item':
92
+ return { ...prevState,
93
+ selectedItemPath: action.payload.itemPath
94
+ };
95
+
96
+ default:
97
+ throw new Error("Unexpected search state");
98
+ }
99
+ }, initialState, null);
100
+ const query = itemPath ? `return ${CR_BASE_QUERY} && ${impliedQuery} && obj.items["${itemPath}"] !== undefined` : itemPath === null ? `return ${CR_BASE_QUERY} && ${impliedQuery}` // If item data is loading or unavailable, don’t show any CRs
101
+ // to avoid flashing all CRs during item switching.
102
+ : `return false`;
103
+ const selectedCRPath = focusedTabURI && focusedTabURI.startsWith(`${_protocolRegistry.Protocols.CHANGE_REQUEST}:`) ? focusedTabURI.split(':')[1] : null;
104
+ (0, _react.useEffect)(() => {
105
+ if (itemPath !== undefined && selectedCRPath) {
106
+ setTimeout(() => {
107
+ dispatch({
108
+ type: 'select-item',
109
+ payload: {
110
+ itemPath: selectedCRPath
111
+ }
112
+ });
113
+ }, 500);
114
+ }
115
+ }, [itemPath, selectedCRPath]);
116
+ return (0, _react2.jsx)(ChangeRequestSearchResultList, {
117
+ queryExpression: query,
118
+ selectedItemPath: state.selectedItemPath,
119
+ onSelectItem: itemPath => dispatch({
120
+ type: 'select-item',
121
+ payload: {
122
+ itemPath
123
+ }
124
+ }),
125
+ onOpenItem: itemPath => spawnTab(`${_protocolRegistry.Protocols.CHANGE_REQUEST}:${itemPath}`)
126
+ });
127
+ };
128
+
129
+ const CRHistoryItem = function ({
130
+ objectData
131
+ }) {
132
+ const {
133
+ activeChangeRequestID,
134
+ setActiveChangeRequestID
135
+ } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
136
+ const isActive = activeChangeRequestID === objectData.id;
137
+ const canToggle = activeChangeRequestID == null || isActive;
138
+ const justification = (0, _cr.hasSubmitterInput)(objectData) ? objectData.justification : 'N/A';
139
+ return (0, _react2.jsx)("span", {
140
+ title: `${justification} (proposal ID: ${objectData.id})`
141
+ }, (0, _react2.jsx)(_core.Icon, {
142
+ icon: isActive ? 'record' : 'dot',
143
+ css: (0, _react2.css)`vertical-align: top; ${canToggle ? 'cursor: pointer; transition: all .2s;' : 'opacity: .5;'}`,
144
+ title: canToggle ? isActive ? "Click to deactivate this proposal" : "Click to activate this proposal" : undefined,
145
+ onClick: canToggle ? () => setActiveChangeRequestID === null || setActiveChangeRequestID === void 0 ? void 0 : setActiveChangeRequestID(activeChangeRequestID === objectData.id ? null : objectData.id) : undefined,
146
+ intent: isActive ? 'danger' : canToggle ? 'primary' : undefined
147
+ }), "\u00A0", (0, _cr.isDisposed)(objectData) ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_util.Datestamp, {
148
+ date: objectData.timeDisposed,
149
+ title: "Disposed"
150
+ }), ": ") : (0, _cr.hadBeenProposed)(objectData) ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_util.Datestamp, {
151
+ date: objectData.timeProposed,
152
+ title: "Proposed"
153
+ }), ": ") : null, justification);
154
+ };
155
+
156
+ const ChangeRequestSearchResultList = (0, _SearchResultList.default)(CRHistoryItem, objPath => ({
157
+ name: 'Prp.',
158
+ iconProps: {
159
+ icon: 'lightbulb',
160
+ title: objPath,
161
+ htmlTitle: `icon for proposal at ${objPath}`
162
+ }
163
+ }));
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Registration/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useEffect, useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Icon } from '@blueprintjs/core';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\n//import { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport makeSearchResultList from '@riboseinc/paneron-extension-kit/widgets/SearchResultList';\nimport { type Base as BaseCR, hasSubmitterInput, isDisposed, hadBeenProposed } from '../../../types/cr';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { Datestamp } from '../../../views/util';\nimport { Protocols } from '../../protocolRegistry';\n\n\nexport const PendingChangeRequestsBlock: React.FC<Record<never, never>> = function () {\n const { stakeholder } = useContext(BrowserCtx);\n const stakeholderUsername = stakeholder?.gitServerUsername;\n const stakeholderCondition = stakeholderUsername\n ? `obj.submittingStakeholderGitServerUsername === \"${stakeholderUsername}\"`\n : 'false';\n // Don’t show drafts in the list of pending proposals, unless it’s user’s own drafts.\n const query = `!obj.timeDisposed && (obj.state !== \"draft\" || ${stakeholderCondition})`;\n\n return <ChangeRequestListBlock impliedQuery={query} />;\n};\n\n\nexport const ChangeRequestHistoryBlock: React.FC<Record<never, never>> = function () {\n return <ChangeRequestListBlock impliedQuery={DISPOSED_CR_QUERY} />;\n};\n\n\nconst CR_BASE_QUERY = 'objPath.indexOf(\"/proposals/\") === 0 && objPath.endsWith(\"main.yaml\")';\nconst DISPOSED_CR_QUERY = 'obj.timeDisposed !== undefined && obj.timeDisposed !== null';\n\n\ninterface ChangeRequestBlockState {\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\ntype ChangeRequestBlockAction =\n | { type: 'update-quick-substring-query'; payload: { substring: string; }; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\n\nconst ChangeRequestListBlock: React.FC<{ impliedQuery: string }> = function ({ impliedQuery }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n const { spawnTab, focusedTabURI } = useContext(TabbedWorkspaceContext);\n const { selectedRegisterItem } = useContext(BrowserCtx);\n\n const initialState: ChangeRequestBlockState = {\n quickSubstringQuery: '',\n selectedItemPath: null,\n };\n\n const itemPath = selectedRegisterItem\n ? itemRefToItemPath(selectedRegisterItem.ref)\n : selectedRegisterItem;\n // ^ Adopt undefined value if no data is available, null if item is not selected\n\n const [ state, dispatch, ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<ChangeRequestBlockState, ChangeRequestBlockAction>)(\n `change-request-list-block-${itemPath === null ? 'global' : itemPath}-${impliedQuery}`,\n undefined,\n undefined,\n (prevState, action) => {\n switch (action.type) {\n case 'update-quick-substring-query':\n return {\n ...prevState,\n quickSubstringQuery: action.payload.substring,\n };\n case 'select-item':\n return {\n ...prevState,\n selectedItemPath: action.payload.itemPath,\n };\n default:\n throw new Error(\"Unexpected search state\");\n }\n },\n initialState,\n null);\n\n const query = itemPath\n ? `return ${CR_BASE_QUERY} && ${impliedQuery} && obj.items[\"${itemPath}\"] !== undefined`\n : itemPath === null\n ? `return ${CR_BASE_QUERY} && ${impliedQuery}`\n // If item data is loading or unavailable, don’t show any CRs\n // to avoid flashing all CRs during item switching.\n : `return false`;\n\n const selectedCRPath: string | null =\n focusedTabURI && focusedTabURI.startsWith(`${Protocols.CHANGE_REQUEST}:`)\n ? focusedTabURI.split(':')[1]\n : null;\n\n useEffect(() => {\n if (itemPath !== undefined && selectedCRPath) {\n setTimeout(() => {\n dispatch({ type: 'select-item', payload: { itemPath: selectedCRPath } });\n }, 500);\n }\n }, [itemPath, selectedCRPath]);\n\n return (\n <ChangeRequestSearchResultList\n queryExpression={query}\n selectedItemPath={state.selectedItemPath}\n onSelectItem={itemPath => dispatch({ type: 'select-item', payload: { itemPath }})}\n onOpenItem={(itemPath) => spawnTab(`${Protocols.CHANGE_REQUEST}:${itemPath}`)}\n />\n )\n};\n\n\nconst CRHistoryItem: React.FC<{\n objectData: BaseCR,\n objectPath: string,\n}> = function ({ objectData }) {\n const { activeChangeRequestID, setActiveChangeRequestID } = useContext(BrowserCtx);\n const isActive = activeChangeRequestID === objectData.id;\n const canToggle = activeChangeRequestID == null || isActive;\n\n const justification = hasSubmitterInput(objectData) ? objectData.justification : 'N/A';\n\n return <span title={`${justification} (proposal ID: ${objectData.id})`}>\n <Icon\n icon={isActive ? 'record' : 'dot'}\n css={css`vertical-align: top; ${canToggle ? 'cursor: pointer; transition: all .2s;' : 'opacity: .5;'}`}\n title={canToggle\n ? isActive\n ? \"Click to deactivate this proposal\"\n : \"Click to activate this proposal\"\n : undefined}\n onClick={canToggle\n ? () => setActiveChangeRequestID?.(activeChangeRequestID === objectData.id ? null : objectData.id)\n : undefined}\n intent={isActive\n ? 'danger'\n : canToggle\n ? 'primary'\n : undefined}\n />\n &nbsp;\n {isDisposed(objectData)\n ? <><Datestamp date={objectData.timeDisposed} title=\"Disposed\" />: </>\n : hadBeenProposed(objectData)\n ? <><Datestamp date={objectData.timeProposed} title=\"Proposed\" />: </>\n : null}\n {justification}\n </span>;\n};\n\n\nconst ChangeRequestSearchResultList = makeSearchResultList<BaseCR>(CRHistoryItem, (objPath) => ({\n name: 'Prp.',\n iconProps: {\n icon: 'lightbulb',\n title: objPath,\n htmlTitle: `icon for proposal at ${objPath}`,\n },\n}));\n"]}
@@ -0,0 +1,18 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import React from 'react';
4
+ import { type CriteriaGroup } from '../../FilterCriteria/models';
5
+ declare const Search: React.FC<{
6
+ /**
7
+ * Criteria that will always apply.
8
+ * Used e.g. in superseding item selection
9
+ * (to limit to the same item class).
10
+ */
11
+ implicitCriteria?: CriteriaGroup;
12
+ availableClassIDs?: string[];
13
+ onOpenItem?: (itemPath: string) => void;
14
+ stateName?: string;
15
+ className?: string;
16
+ style?: React.CSSProperties;
17
+ }>;
18
+ export default Search;
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _react2 = require("@emotion/react");
11
+
12
+ var _context = require("@riboseinc/paneron-extension-kit/context");
13
+
14
+ var _context2 = require("@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context");
15
+
16
+ var _SearchResultList = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/SearchResultList"));
17
+
18
+ var _useDebounce = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/useDebounce"));
19
+
20
+ var _models = require("../../FilterCriteria/models");
21
+
22
+ var _criteriaGroupToQueryExpression = _interopRequireDefault(require("../../FilterCriteria/criteriaGroupToQueryExpression"));
23
+
24
+ var _CRITERIA_CONFIGURATION = require("../../FilterCriteria/CRITERIA_CONFIGURATION");
25
+
26
+ var _ChangeRequestContext = require("../../change-request/ChangeRequestContext");
27
+
28
+ var _itemPathUtils = require("../../itemPathUtils");
29
+
30
+ var _itemQueryUtils = require("../../itemQueryUtils");
31
+
32
+ var _BrowserCtx = require("../../BrowserCtx");
33
+
34
+ var _SearchQuery = _interopRequireDefault(require("../../SearchQuery"));
35
+
36
+ var _ListItem = _interopRequireDefault(require("../ListItem"));
37
+
38
+ var _protocolRegistry = require("../../protocolRegistry");
39
+
40
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
41
+
42
+ /** @jsx jsx */
43
+
44
+ /** @jsxFrag React.Fragment */
45
+ const Search = function ({
46
+ implicitCriteria,
47
+ availableClassIDs,
48
+ stateName,
49
+ onOpenItem,
50
+ className,
51
+ style
52
+ }) {
53
+ const {
54
+ usePersistentDatasetStateReducer
55
+ } = (0, _react.useContext)(_context.DatasetContext);
56
+ const {
57
+ spawnTab
58
+ } = (0, _react.useContext)(_context2.TabbedWorkspaceContext);
59
+ const {
60
+ keyExpression,
61
+ itemClasses,
62
+ subregisters,
63
+ selectedRegisterItem
64
+ } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
65
+ const {
66
+ changeRequest
67
+ } = (0, _react.useContext)(_ChangeRequestContext.ChangeRequestContext);
68
+ const initialState = {
69
+ query: {
70
+ criteria: _models.BLANK_CRITERIA
71
+ },
72
+ quickSubstringQuery: '',
73
+ selectedItemPath: null
74
+ };
75
+ const [state, dispatch, stateRecalled] = usePersistentDatasetStateReducer(stateName ?? 'search-sidebar', undefined, undefined, (prevState, action) => {
76
+ switch (action.type) {
77
+ case 'update-query':
78
+ return { ...prevState,
79
+ query: action.payload.query
80
+ };
81
+
82
+ case 'update-quick-substring-query':
83
+ return { ...prevState,
84
+ quickSubstringQuery: action.payload.substring
85
+ };
86
+
87
+ case 'select-item':
88
+ return { ...prevState,
89
+ selectedItemPath: action.payload.itemPath
90
+ };
91
+
92
+ default:
93
+ throw new Error("Unexpected search state");
94
+ }
95
+ }, initialState, null);
96
+ const selectedItemPath = selectedRegisterItem !== null && selectedRegisterItem !== void 0 && selectedRegisterItem.ref ? (0, _itemPathUtils.itemRefToItemPath)(selectedRegisterItem.ref, changeRequest === null || changeRequest === void 0 ? void 0 : changeRequest.id) : null;
97
+ (0, _react.useEffect)(() => {
98
+ if (selectedItemPath) {
99
+ dispatch({
100
+ type: 'select-item',
101
+ payload: {
102
+ itemPath: selectedItemPath
103
+ }
104
+ });
105
+ }
106
+ }, [selectedItemPath]);
107
+ const quickSearchString = (state.quickSubstringQuery ?? '').trim();
108
+ const withSearchString = state.query.criteria.criteria.length < 1 && quickSearchString !== '' ? {
109
+ require: 'all',
110
+ criteria: [{
111
+ key: 'raw-substring',
112
+ query: _CRITERIA_CONFIGURATION.RAW_SUBSTRING.toQuery({
113
+ substring: quickSearchString
114
+ }, {
115
+ itemClasses,
116
+ subregisters
117
+ })
118
+ }]
119
+ } : state.query.criteria;
120
+ const withImplicit = implicitCriteria ? {
121
+ require: 'all',
122
+ criteria: [implicitCriteria, withSearchString]
123
+ } : withSearchString;
124
+ const effectiveQueryExpression = withImplicit.criteria.length > 0 ? (0, _criteriaGroupToQueryExpression.default)(withImplicit) // If no criteria provided, don’t show anything by default.
125
+ : 'false';
126
+ const stateRecalledDebounced = (0, _useDebounce.default)(stateRecalled, 100);
127
+ const queryExpressionDebounced = (0, _useDebounce.default)(effectiveQueryExpression, stateRecalledDebounced ? 500 : 0);
128
+ const datasetObjectSearchQueryExpression = queryExpressionDebounced != 'false' ? (0, _itemQueryUtils.getRegisterItemQuery)(queryExpressionDebounced, changeRequest ?? undefined) : 'return false';
129
+ return (0, _react2.jsx)("div", {
130
+ css: (0, _react2.css)`display: flex; flex-flow: column nowrap;`,
131
+ className: className,
132
+ style: style
133
+ }, (0, _react2.jsx)(_SearchQuery.default, {
134
+ rootCriteria: state.query.criteria,
135
+ quickSearchString: state.quickSubstringQuery,
136
+ availableClassIDs: availableClassIDs,
137
+ onCriteriaChange: criteria => dispatch({
138
+ type: 'update-query',
139
+ payload: {
140
+ query: {
141
+ criteria
142
+ }
143
+ }
144
+ }),
145
+ onQuickSearchStringChange: substring => dispatch({
146
+ type: 'update-quick-substring-query',
147
+ payload: {
148
+ substring
149
+ }
150
+ }),
151
+ css: (0, _react2.css)`padding: 5px;`
152
+ }), (0, _react2.jsx)("div", {
153
+ css: (0, _react2.css)`flex: 1;`
154
+ }, stateRecalledDebounced ? (0, _react2.jsx)(SearchResultList, {
155
+ queryExpression: datasetObjectSearchQueryExpression,
156
+ keyExpression: keyExpression,
157
+ selectedItemPath: state.selectedItemPath,
158
+ onSelectItem: itemPath => dispatch({
159
+ type: 'select-item',
160
+ payload: {
161
+ itemPath
162
+ }
163
+ }),
164
+ onOpenItem: onOpenItem ?? (itemPath => spawnTab(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${itemPath}`))
165
+ }) : null));
166
+ };
167
+
168
+ const SearchResultList = (0, _SearchResultList.default)(_ListItem.default, objPath => ({
169
+ name: 'reg. item',
170
+ iconProps: {
171
+ icon: 'document',
172
+ title: objPath,
173
+ htmlTitle: `Icon for item at ${objPath}`
174
+ }
175
+ }));
176
+ var _default = Search;
177
+ exports.default = _default;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Search/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useEffect } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport makeSearchResultList from '@riboseinc/paneron-extension-kit/widgets/SearchResultList';\nimport useDebounce from '@riboseinc/paneron-extension-kit/useDebounce';\nimport { type CriteriaGroup, BLANK_CRITERIA } from '../../FilterCriteria/models';\nimport criteriaGroupToQueryExpression from '../../FilterCriteria/criteriaGroupToQueryExpression';\nimport { RAW_SUBSTRING } from '../../FilterCriteria/CRITERIA_CONFIGURATION';\nimport { ChangeRequestContext } from '../../change-request/ChangeRequestContext';\nimport type { RegisterItem } from '../../../types';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { getRegisterItemQuery } from '../../itemQueryUtils';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport SearchQuery from '../../SearchQuery';\nimport ListItem from '../ListItem';\nimport { Protocols } from '../../protocolRegistry';\n\n\n// TODO: Move Search widget core out of sidebar, as it’s used elsewhere too.\n\n\ninterface Query {\n criteria: CriteriaGroup;\n}\ninterface State {\n query: Query;\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\ntype Action =\n | { type: 'update-query'; payload: { query: Query; }; }\n | { type: 'update-quick-substring-query'; payload: { substring: string; }; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nconst Search: React.FC<{\n /**\n * Criteria that will always apply.\n * Used e.g. in superseding item selection\n * (to limit to the same item class).\n */\n implicitCriteria?: CriteriaGroup,\n\n availableClassIDs?: string[]\n onOpenItem?: (itemPath: string) => void\n\n stateName?: string\n\n className?: string\n style?: React.CSSProperties\n}> =\nfunction ({ implicitCriteria, availableClassIDs, stateName, onOpenItem, className, style }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const { keyExpression, itemClasses, subregisters, selectedRegisterItem } = useContext(BrowserCtx);\n const { changeRequest } = useContext(ChangeRequestContext);\n\n const initialState: State = {\n query: { criteria: BLANK_CRITERIA },\n quickSubstringQuery: '',\n selectedItemPath: null,\n };\n\n const [ state, dispatch, stateRecalled ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)(\n stateName ?? 'search-sidebar',\n undefined,\n undefined,\n (prevState, action) => {\n switch (action.type) {\n case 'update-query':\n return {\n ...prevState,\n query: action.payload.query,\n };\n case 'update-quick-substring-query':\n return {\n ...prevState,\n quickSubstringQuery: action.payload.substring,\n };\n case 'select-item':\n return {\n ...prevState,\n selectedItemPath: action.payload.itemPath,\n };\n default:\n throw new Error(\"Unexpected search state\");\n }\n },\n initialState,\n null);\n\n const selectedItemPath = selectedRegisterItem?.ref\n ? itemRefToItemPath(selectedRegisterItem.ref, changeRequest?.id)\n : null;\n useEffect(() => {\n if (selectedItemPath) {\n dispatch({ type: 'select-item', payload: { itemPath: selectedItemPath } });\n }\n }, [selectedItemPath]);\n\n const quickSearchString = (state.quickSubstringQuery ?? '').trim();\n const withSearchString: CriteriaGroup = state.query.criteria.criteria.length < 1 && quickSearchString !== ''\n ? {\n require: 'all',\n criteria: [\n {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters }),\n },\n ],\n }\n : state.query.criteria;\n\n const withImplicit: CriteriaGroup = implicitCriteria\n ? {\n require: 'all',\n criteria: [ implicitCriteria, withSearchString ],\n }\n : withSearchString;\n\n const effectiveQueryExpression = withImplicit.criteria.length > 0\n ? criteriaGroupToQueryExpression(withImplicit)\n // If no criteria provided, don’t show anything by default.\n : 'false';\n\n const stateRecalledDebounced = useDebounce(stateRecalled, 100);\n const queryExpressionDebounced = useDebounce(\n effectiveQueryExpression,\n stateRecalledDebounced ? 500 : 0,\n );\n\n const datasetObjectSearchQueryExpression = queryExpressionDebounced != 'false'\n ? getRegisterItemQuery(queryExpressionDebounced, changeRequest ?? undefined)\n : 'return false';\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className} style={style}>\n <SearchQuery\n rootCriteria={state.query.criteria}\n quickSearchString={state.quickSubstringQuery}\n availableClassIDs={availableClassIDs}\n onCriteriaChange={criteria => dispatch({ type: 'update-query', payload: { query: { criteria } } })}\n onQuickSearchStringChange={substring => dispatch({ type: 'update-quick-substring-query', payload: { substring } })}\n css={css`padding: 5px;`}\n />\n <div css={css`flex: 1;`}>\n {stateRecalledDebounced\n ? <SearchResultList\n queryExpression={datasetObjectSearchQueryExpression}\n keyExpression={keyExpression}\n selectedItemPath={state.selectedItemPath}\n onSelectItem={itemPath => dispatch({ type: 'select-item', payload: { itemPath }})}\n onOpenItem={onOpenItem ?? (itemPath => spawnTab(`${Protocols.ITEM_DETAILS}:${itemPath}`))}\n />\n : null}\n </div>\n </div>\n );\n};\n\n\nconst SearchResultList = makeSearchResultList<RegisterItem<any>>(ListItem, (objPath) => ({\n name: 'reg. item',\n iconProps: {\n icon: 'document',\n title: objPath,\n htmlTitle: `Icon for item at ${objPath}`,\n },\n}));\n\n\nexport default Search;\n"]}
@@ -0,0 +1,6 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import type { SuperSidebarConfig } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/types';
4
+ export declare const sidebarIDs: readonly ["Browse", "Registration", "Export"];
5
+ export declare type SidebarID = typeof sidebarIDs[number];
6
+ export declare const sidebarConfig: SuperSidebarConfig<SidebarID>;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.sidebarConfig = exports.sidebarIDs = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _react2 = require("@emotion/react");
11
+
12
+ var _core = require("@blueprintjs/core");
13
+
14
+ var _HelpTooltip = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/HelpTooltip"));
15
+
16
+ var _Browse = _interopRequireDefault(require("./Browse"));
17
+
18
+ var _Search = _interopRequireDefault(require("./Search"));
19
+
20
+ var _Registration = require("./Registration");
21
+
22
+ var _Export = _interopRequireDefault(require("./Export"));
23
+
24
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
+
26
+ /** @jsx jsx */
27
+
28
+ /** @jsxFrag React.Fragment */
29
+ const sidebarIDs = ['Browse', 'Registration', 'Export'];
30
+ exports.sidebarIDs = sidebarIDs;
31
+ const sidebarConfig = {
32
+ Browse: {
33
+ icon: () => (0, _react2.jsx)(_core.Icon, {
34
+ icon: "list"
35
+ }),
36
+ title: "Register items",
37
+ blocks: [{
38
+ key: 'browse',
39
+ title: (0, _react2.jsx)("div", {
40
+ css: (0, _react2.css)`display: flex; justify-content: space-between`
41
+ }, "Preset searches", (0, _react2.jsx)(_HelpTooltip.default, {
42
+ content: "Browse register items by pre-made categories"
43
+ })),
44
+ content: (0, _react2.jsx)(_Browse.default, {
45
+ css: (0, _react2.css)`position: absolute; inset: 0;`
46
+ }),
47
+ nonCollapsible: false,
48
+ // These have to have height specified due to absolute positioning.
49
+ height: 400
50
+ }, {
51
+ key: 'search',
52
+ title: "New search",
53
+ content: (0, _react2.jsx)(_Search.default, {
54
+ css: (0, _react2.css)`position: absolute; inset: 0;`
55
+ }),
56
+ nonCollapsible: false,
57
+ height: 400
58
+ }]
59
+ },
60
+ Registration: {
61
+ icon: () => (0, _react2.jsx)(_core.Icon, {
62
+ icon: "lightbulb"
63
+ }),
64
+ title: "Proposals",
65
+ blocks: [{
66
+ key: 'pending-crs',
67
+ title: (0, _react2.jsx)("div", {
68
+ css: (0, _react2.css)`display: flex; justify-content: space-between`
69
+ }, "Pending proposals", (0, _react2.jsx)(_HelpTooltip.default, {
70
+ content: "Proposals pending decision. If a register item is selected, only proposals affecting that item are shown."
71
+ })),
72
+ content: (0, _react2.jsx)(_Registration.PendingChangeRequestsBlock, null),
73
+ height: 300
74
+ }, {
75
+ key: 'cr-history',
76
+ title: (0, _react2.jsx)("div", {
77
+ css: (0, _react2.css)`display: flex; justify-content: space-between`
78
+ }, "History", (0, _react2.jsx)(_HelpTooltip.default, {
79
+ content: "Resolved proposals. If a register item is selected, only proposals affecting that item are shown."
80
+ })),
81
+ content: (0, _react2.jsx)(_Registration.ChangeRequestHistoryBlock, null),
82
+ height: 300
83
+ }]
84
+ },
85
+ Export: {
86
+ icon: () => (0, _react2.jsx)(_core.Icon, {
87
+ icon: "changes"
88
+ }),
89
+ title: "Import and export",
90
+ blocks: [{
91
+ key: 'export',
92
+ title: "Export",
93
+ content: (0, _react2.jsx)(_Export.default, null),
94
+ nonCollapsible: true
95
+ }, {
96
+ key: 'import',
97
+ title: "Import",
98
+ content: (0, _react2.jsx)(_react.default.Fragment, null, "Import TBD"),
99
+ nonCollapsible: false,
100
+ collapsedByDefault: true
101
+ }]
102
+ }
103
+ };
104
+ exports.sidebarConfig = sidebarConfig;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/sidebar/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,OAAO,WAAW,MAAM,sDAAsD,CAAC;AAE/E,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,MAAM,MAAM,UAAU,CAAC;AAG9B,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ;IACR,cAAc;IACd,QAAQ;CACA,CAAC;AAIX,MAAM,CAAC,MAAM,aAAa,GAAkC;IAC1D,MAAM,EAAE;QACN,IAAI,EAAE,GAAG,EAAE,CAAC,IAAC,IAAI,IAAC,IAAI,EAAC,MAAM,GAAG;QAChC,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,CAAC;gBACP,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,aAAK,GAAG,EAAE,GAAG,CAAA,+CAA+C;;oBAEjE,IAAC,WAAW,IAAC,OAAO,EAAC,8CAA8C,GAAG,CAClE;gBACN,OAAO,EAAE,IAAC,MAAM,IAAC,GAAG,EAAE,GAAG,CAAA,+BAA+B,GAAI;gBAC5D,cAAc,EAAE,KAAK;gBACrB,mEAAmE;gBACnE,MAAM,EAAE,GAAG;aACZ,EAAE;gBACD,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,YAAY;gBACnB,OAAO,EAAE,IAAC,MAAM,IAAC,GAAG,EAAE,GAAG,CAAA,+BAA+B,GAAI;gBAC5D,cAAc,EAAE,KAAK;gBACrB,MAAM,EAAE,GAAG;aACZ,CAAC;KACH;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,GAAG,EAAE,CAAC,IAAC,IAAI,IAAC,IAAI,EAAC,WAAW,GAAG;QACrC,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,CAAC;gBACP,GAAG,EAAE,aAAa;gBAClB,KAAK,EAAE,aAAK,GAAG,EAAE,GAAG,CAAA,+CAA+C;;oBAEjE,IAAC,WAAW,IAAC,OAAO,EAAC,2GAA2G,GAAG,CAC/H;gBACN,OAAO,EAAE,IAAC,0BAA0B,OAAG;gBACvC,MAAM,EAAE,GAAG;aACZ,EAAE;gBACD,GAAG,EAAE,YAAY;gBACjB,KAAK,EAAE,aAAK,GAAG,EAAE,GAAG,CAAA,+CAA+C;;oBAEjE,IAAC,WAAW,IAAC,OAAO,EAAC,mGAAmG,GAAG,CACvH;gBACN,OAAO,EAAE,IAAC,yBAAyB,OAAG;gBACtC,MAAM,EAAE,GAAG;aACZ,CAAC;KACH;IACD,MAAM,EAAE;QACN,IAAI,EAAE,GAAG,EAAE,CAAC,IAAC,IAAI,IAAC,IAAI,EAAC,SAAS,GAAG;QACnC,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,CAAC;gBACP,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,IAAC,MAAM,OAAG;gBACnB,cAAc,EAAE,IAAI;aACrB,EAAE;gBACD,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,uCAAe;gBACxB,cAAc,EAAE,KAAK;gBACrB,kBAAkB,EAAE,IAAI;aACzB,CAAC;KACH;CACF,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Icon } from '@blueprintjs/core';\n\nimport type { SuperSidebarConfig } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/types';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\n\nimport Browse from './Browse';\nimport Search from './Search';\nimport { PendingChangeRequestsBlock, ChangeRequestHistoryBlock } from './Registration';\nimport Export from './Export';\n\n\nexport const sidebarIDs = [\n 'Browse',\n 'Registration',\n 'Export',\n] as const;\n\nexport type SidebarID = typeof sidebarIDs[number];\n\nexport const sidebarConfig: SuperSidebarConfig<SidebarID> = {\n Browse: {\n icon: () => <Icon icon=\"list\" />,\n title: \"Register items\",\n blocks: [{\n key: 'browse',\n title: <div css={css`display: flex; justify-content: space-between`}>\n Preset searches\n <HelpTooltip content=\"Browse register items by pre-made categories\" />\n </div>,\n content: <Browse css={css`position: absolute; inset: 0;`} />,\n nonCollapsible: false,\n // These have to have height specified due to absolute positioning.\n height: 400,\n }, {\n key: 'search',\n title: \"New search\",\n content: <Search css={css`position: absolute; inset: 0;`} />,\n nonCollapsible: false,\n height: 400,\n }],\n },\n Registration: {\n icon: () => <Icon icon=\"lightbulb\" />,\n title: \"Proposals\",\n blocks: [{\n key: 'pending-crs',\n title: <div css={css`display: flex; justify-content: space-between`}>\n Pending proposals\n <HelpTooltip content=\"Proposals pending decision. If a register item is selected, only proposals affecting that item are shown.\" />\n </div>,\n content: <PendingChangeRequestsBlock />,\n height: 300,\n }, {\n key: 'cr-history',\n title: <div css={css`display: flex; justify-content: space-between`}>\n History\n <HelpTooltip content=\"Resolved proposals. If a register item is selected, only proposals affecting that item are shown.\" />\n </div>,\n content: <ChangeRequestHistoryBlock />,\n height: 300,\n }],\n },\n Export: {\n icon: () => <Icon icon=\"changes\" />,\n title: \"Import and export\",\n blocks: [{\n key: 'export',\n title: \"Export\",\n content: <Export />,\n nonCollapsible: true,\n }, {\n key: 'import',\n title: \"Import\",\n content: <>Import TBD</>,\n nonCollapsible: false,\n collapsedByDefault: true,\n }],\n },\n};\n"]}
package/views/util.d.ts CHANGED
@@ -1,12 +1,36 @@
1
1
  /** @jsx jsx */
2
2
  /** @jsxFrag React.Fragment */
3
3
  import React from 'react';
4
- import { ItemClassConfiguration, RelatedItemClassConfiguration } from '../types';
5
- import { IFormGroupProps } from '@blueprintjs/core';
4
+ import { HelmetProps } from 'react-helmet';
5
+ import { FormGroupProps } from '@blueprintjs/core';
6
+ import type { ItemClassConfiguration, RelatedItemClassConfiguration } from '../types';
6
7
  export { GenericRelatedItemView } from './GenericRelatedItemView';
8
+ /**
9
+ * Get give string truncated & with ellipsis appended
10
+ * if its length exceeds given number of characters.
11
+ */
12
+ export declare function maybeEllipsizeString(str: string, maxLength?: number): string;
13
+ export declare const RegisterHelmet: React.FC<HelmetProps>;
7
14
  export declare const PropertyDetailView: React.FC<{
8
- title: IFormGroupProps["label"];
9
- secondaryTitle?: IFormGroupProps["labelInfo"];
10
- inline?: IFormGroupProps["inline"];
15
+ title: FormGroupProps["label"];
16
+ secondaryTitle?: FormGroupProps["labelInfo"];
17
+ inline?: FormGroupProps["inline"];
11
18
  }>;
19
+ /** Formats given date as a span with tooltip set to full ISO date & time. */
20
+ export declare const Datestamp: React.FC<{
21
+ date: Date;
22
+ title?: string;
23
+ className?: string;
24
+ }>;
25
+ /** Foramts given date as plain text. */
26
+ export declare function formatDate(date: Date): string;
12
27
  export declare const _getRelatedClass: (classes: Record<string, ItemClassConfiguration<any>>) => (clsID: string) => RelatedItemClassConfiguration;
28
+ /**
29
+ * Suitable for use as tab contents for TabbedWorkspace.
30
+ * Provides top bar with actions and main content.
31
+ */
32
+ export declare const TabContentsWithActions: React.FC<{
33
+ actions: JSX.Element;
34
+ main: JSX.Element;
35
+ className?: string;
36
+ }>;