@riboseinc/paneron-registry-kit 2.0.0-dev9 → 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 (179) 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 -19
  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 +13 -1
  38. package/views/FilterCriteria/CRITERIA_CONFIGURATION.js +178 -85
  39. package/views/FilterCriteria/CRITERIA_CONFIGURATION.js.map +1 -1
  40. package/views/FilterCriteria/criteriaGroupToQueryExpression.d.ts +4 -0
  41. package/views/FilterCriteria/criteriaGroupToQueryExpression.js +10 -3
  42. package/views/FilterCriteria/criteriaGroupToQueryExpression.js.map +1 -1
  43. package/views/FilterCriteria/criteriaGroupToSummary.js +7 -7
  44. package/views/FilterCriteria/criteriaGroupToSummary.js.map +1 -1
  45. package/views/FilterCriteria/criteriaToNodes.d.ts +9 -0
  46. package/views/FilterCriteria/criteriaToNodes.js +42 -28
  47. package/views/FilterCriteria/criteriaToNodes.js.map +1 -1
  48. package/views/FilterCriteria/index.d.ts +1 -0
  49. package/views/FilterCriteria/index.js +29 -21
  50. package/views/FilterCriteria/index.js.map +1 -1
  51. package/views/FilterCriteria/models.d.ts +29 -2
  52. package/views/FilterCriteria/models.js +17 -10
  53. package/views/FilterCriteria/models.js.map +1 -1
  54. package/views/FilterCriteria/mutateGroup.d.ts +4 -1
  55. package/views/FilterCriteria/mutateGroup.js +4 -3
  56. package/views/FilterCriteria/mutateGroup.js.map +1 -1
  57. package/views/GenericRelatedItemView.d.ts +1 -1
  58. package/views/GenericRelatedItemView.js +142 -102
  59. package/views/GenericRelatedItemView.js.map +1 -1
  60. package/views/RegisterStakeholder.d.ts +9 -0
  61. package/views/RegisterStakeholder.js +40 -0
  62. package/views/RegisterStakeholder.js.map +1 -0
  63. package/views/RegisterVersion.d.ts +9 -0
  64. package/views/RegisterVersion.js +41 -0
  65. package/views/RegisterVersion.js.map +1 -0
  66. package/views/SearchQuery.d.ts +13 -0
  67. package/views/SearchQuery.js +137 -0
  68. package/views/SearchQuery.js.map +1 -0
  69. package/views/change-request/ChangeRequestContext.d.ts +20 -0
  70. package/views/change-request/ChangeRequestContext.js +56 -0
  71. package/views/change-request/ChangeRequestContext.js.map +1 -0
  72. package/views/change-request/Proposals.d.ts +21 -0
  73. package/views/change-request/Proposals.js +331 -0
  74. package/views/change-request/Proposals.js.map +1 -0
  75. package/views/change-request/objectChangeset.d.ts +31 -0
  76. package/views/change-request/objectChangeset.js +229 -0
  77. package/views/change-request/objectChangeset.js.map +1 -0
  78. package/views/detail/ChangeRequest/Proposal.d.ts +0 -0
  79. package/views/detail/ChangeRequest/Proposal.js +142 -0
  80. package/views/detail/ChangeRequest/Proposal.js.map +1 -0
  81. package/views/detail/ChangeRequest/index.d.ts +13 -0
  82. package/views/detail/ChangeRequest/index.js +207 -0
  83. package/views/detail/ChangeRequest/index.js.map +1 -0
  84. package/views/detail/ChangeRequest/transitions.d.ts +28 -0
  85. package/views/detail/ChangeRequest/transitions.js +530 -0
  86. package/views/detail/ChangeRequest/transitions.js.map +1 -0
  87. package/views/detail/CustomView/index.d.ts +13 -0
  88. package/views/detail/CustomView/index.js +68 -0
  89. package/views/detail/CustomView/index.js.map +1 -0
  90. package/views/detail/RegisterHome/index.d.ts +5 -0
  91. package/views/detail/RegisterHome/index.js +128 -0
  92. package/views/detail/RegisterHome/index.js.map +1 -0
  93. package/views/detail/RegisterItem/RelatedItems.d.ts +13 -0
  94. package/views/detail/RegisterItem/RelatedItems.js +61 -0
  95. package/views/detail/RegisterItem/RelatedItems.js.map +1 -0
  96. package/views/detail/RegisterItem/SupersedingItemMenu.d.ts +13 -0
  97. package/views/detail/RegisterItem/SupersedingItemMenu.js +56 -0
  98. package/views/detail/RegisterItem/SupersedingItemMenu.js.map +1 -0
  99. package/views/detail/RegisterItem/index.d.ts +13 -0
  100. package/views/detail/RegisterItem/index.js +356 -0
  101. package/views/detail/RegisterItem/index.js.map +1 -0
  102. package/views/detail/RegisterMeta/RegisterMetaForm.d.ts +10 -0
  103. package/views/detail/RegisterMeta/RegisterMetaForm.js +331 -0
  104. package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -0
  105. package/views/detail/RegisterMeta/index.d.ts +10 -0
  106. package/views/detail/RegisterMeta/index.js +111 -0
  107. package/views/detail/RegisterMeta/index.js.map +1 -0
  108. package/views/detail/index.d.ts +1 -0
  109. package/views/detail/index.js +24 -0
  110. package/views/detail/index.js.map +1 -0
  111. package/views/diffing/InlineDiff.d.ts +12 -0
  112. package/views/diffing/InlineDiff.js +58 -0
  113. package/views/diffing/InlineDiff.js.map +1 -0
  114. package/views/diffing/StructuredDiff.d.ts +11 -0
  115. package/views/diffing/StructuredDiff.js +65 -0
  116. package/views/diffing/StructuredDiff.js.map +1 -0
  117. package/views/hooks/useCustomView.d.ts +3 -0
  118. package/views/hooks/useCustomView.js +24 -0
  119. package/views/hooks/useCustomView.js.map +1 -0
  120. package/views/hooks/useItemClassConfig.d.ts +3 -0
  121. package/views/hooks/useItemClassConfig.js +24 -0
  122. package/views/hooks/useItemClassConfig.js.map +1 -0
  123. package/views/hooks/useItemRef.d.ts +3 -0
  124. package/views/hooks/useItemRef.js +39 -0
  125. package/views/hooks/useItemRef.js.map +1 -0
  126. package/views/hooks/useSingleRegisterItemData.d.ts +3 -0
  127. package/views/hooks/useSingleRegisterItemData.js +32 -0
  128. package/views/hooks/useSingleRegisterItemData.js.map +1 -0
  129. package/views/index.d.ts +2 -2
  130. package/views/index.js +161 -130
  131. package/views/index.js.map +1 -1
  132. package/views/itemPathUtils.d.ts +45 -2
  133. package/views/itemPathUtils.js +101 -14
  134. package/views/itemPathUtils.js.map +1 -1
  135. package/views/itemQueryUtils.d.ts +11 -0
  136. package/views/itemQueryUtils.js +48 -0
  137. package/views/itemQueryUtils.js.map +1 -0
  138. package/views/protocolRegistry.d.ts +12 -0
  139. package/views/protocolRegistry.js +42 -0
  140. package/views/protocolRegistry.js.map +1 -0
  141. package/views/sidebar/Browse/index.d.ts +11 -0
  142. package/views/sidebar/Browse/index.js +453 -0
  143. package/views/sidebar/Browse/index.js.map +1 -0
  144. package/views/sidebar/Export/index.d.ts +5 -0
  145. package/views/sidebar/Export/index.js +94 -0
  146. package/views/sidebar/Export/index.js.map +1 -0
  147. package/views/sidebar/ListItem.d.ts +10 -0
  148. package/views/sidebar/ListItem.js +43 -0
  149. package/views/sidebar/ListItem.js.map +1 -0
  150. package/views/sidebar/Registration/index.d.ts +5 -0
  151. package/views/sidebar/Registration/index.js +163 -0
  152. package/views/sidebar/Registration/index.js.map +1 -0
  153. package/views/sidebar/Search/index.d.ts +18 -0
  154. package/views/sidebar/Search/index.js +177 -0
  155. package/views/sidebar/Search/index.js.map +1 -0
  156. package/views/sidebar/index.d.ts +6 -0
  157. package/views/sidebar/index.js +104 -0
  158. package/views/sidebar/index.js.map +1 -0
  159. package/views/util.d.ts +29 -5
  160. package/views/util.js +92 -6
  161. package/views/util.js.map +1 -1
  162. package/views/ChangeRequest.d.ts +0 -12
  163. package/views/ChangeRequest.js +0 -689
  164. package/views/ChangeRequest.js.map +0 -1
  165. package/views/ItemBrowser.d.ts +0 -12
  166. package/views/ItemBrowser.js +0 -258
  167. package/views/ItemBrowser.js.map +0 -1
  168. package/views/ItemDetails.d.ts +0 -14
  169. package/views/ItemDetails.js +0 -128
  170. package/views/ItemDetails.js.map +0 -1
  171. package/views/MainView.d.ts +0 -8
  172. package/views/MainView.js +0 -34
  173. package/views/MainView.js.map +0 -1
  174. package/views/RegisterInformation.d.ts +0 -7
  175. package/views/RegisterInformation.js +0 -264
  176. package/views/RegisterInformation.js.map +0 -1
  177. package/views/RegisterItemGrid.d.ts +0 -25
  178. package/views/RegisterItemGrid.js +0 -276
  179. package/views/RegisterItemGrid.js.map +0 -1
@@ -0,0 +1,453 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _react2 = require("@emotion/react");
11
+
12
+ var _core = require("@blueprintjs/core");
13
+
14
+ var _popover = require("@blueprintjs/popover2");
15
+
16
+ var _context = require("@riboseinc/paneron-extension-kit/context");
17
+
18
+ var _context2 = require("@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context");
19
+
20
+ var _SearchResultList = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/SearchResultList"));
21
+
22
+ var _criteriaGroupToQueryExpression = _interopRequireDefault(require("../../FilterCriteria/criteriaGroupToQueryExpression"));
23
+
24
+ var _CRITERIA_CONFIGURATION = _interopRequireDefault(require("../../FilterCriteria/CRITERIA_CONFIGURATION"));
25
+
26
+ var _itemPathUtils = require("../../itemPathUtils");
27
+
28
+ var _itemQueryUtils = require("../../itemQueryUtils");
29
+
30
+ var _ChangeRequestContext = require("../../change-request/ChangeRequestContext");
31
+
32
+ var _objectChangeset = require("../../change-request/objectChangeset");
33
+
34
+ var _BrowserCtx = require("../../BrowserCtx");
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
+ 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); }
43
+
44
+ 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; }
45
+
46
+ /** @jsx jsx */
47
+
48
+ /** @jsxFrag React.Fragment */
49
+ const Browse = function ({
50
+ stateName,
51
+ onOpenItem,
52
+ className,
53
+ style
54
+ }) {
55
+ const {
56
+ performOperation,
57
+ updateObjects,
58
+ makeRandomID,
59
+ usePersistentDatasetStateReducer
60
+ } = (0, _react.useContext)(_context.DatasetContext);
61
+ const {
62
+ spawnTab,
63
+ focusedTabURI
64
+ } = (0, _react.useContext)(_context2.TabbedWorkspaceContext);
65
+ const {
66
+ keyExpression,
67
+ itemClasses,
68
+ subregisters
69
+ } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
70
+ const {
71
+ changeRequest: activeCR,
72
+ canEdit: activeCRIsEditable
73
+ } = (0, _react.useContext)(_ChangeRequestContext.ChangeRequestContext);
74
+ const [state, dispatch] = usePersistentDatasetStateReducer(stateName ?? 'browse-sidebar', undefined, function valdateState(loadedValue) {
75
+ function validateFolderID(foldID) {
76
+ return foldID !== undefined && (foldID === null || foldID.startsWith('by-item-class/') || foldID.startsWith('by-subregister/'));
77
+ }
78
+
79
+ return validateFolderID(loadedValue.enteredFolderID) && validateFolderID(loadedValue.selectedFolderID) && loadedValue.selectedItemPath !== undefined;
80
+ }, (prevState, action) => {
81
+ switch (action.type) {
82
+ case 'select-folder':
83
+ if (prevState.enteredFolderID !== null) {
84
+ return prevState;
85
+ } else {
86
+ return { ...prevState,
87
+ selectedFolderID: action.payload.id
88
+ };
89
+ }
90
+
91
+ case 'enter-folder':
92
+ if (prevState.enteredFolderID === null) {
93
+ return { ...prevState,
94
+ selectedFolderID: action.payload.id,
95
+ enteredFolderID: action.payload.id
96
+ };
97
+ } else {
98
+ return prevState;
99
+ }
100
+
101
+ case 'exit-folder':
102
+ if (prevState.enteredFolderID !== null) {
103
+ return { ...prevState,
104
+ enteredFolderID: null,
105
+ selectedItemPath: null
106
+ };
107
+ } else {
108
+ return prevState;
109
+ }
110
+
111
+ case 'select-item':
112
+ if (prevState.enteredFolderID && prevState.selectedFolderID) {
113
+ return { ...prevState,
114
+ selectedItemPath: action.payload.itemPath
115
+ };
116
+ } else {
117
+ return prevState;
118
+ }
119
+
120
+ default:
121
+ throw new Error("Unexpected browse state");
122
+ }
123
+ }, {
124
+ selectedFolderID: null,
125
+ enteredFolderID: null,
126
+ selectedItemPath: null
127
+ }, null); // If currently focused tab changed, select corresponding item in view
128
+
129
+ (0, _react.useEffect)(() => {
130
+ if (focusedTabURI) {
131
+ const [proto, itemPath] = focusedTabURI.split(':'); // TODO: also check entered folder?
132
+
133
+ if (proto === _protocolRegistry.Protocols.ITEM_DETAILS) {
134
+ dispatch({
135
+ type: 'select-item',
136
+ payload: {
137
+ itemPath
138
+ }
139
+ });
140
+ }
141
+ }
142
+ }, [focusedTabURI]);
143
+
144
+ async function handleAdd(classID, subregisterID) {
145
+ if (!updateObjects || !makeRandomID || !activeCRIsEditable || !activeCR) {
146
+ throw new Error("Unable to create item: likely current proposal is not editable or dataset is read-only");
147
+ }
148
+
149
+ if (subregisters && !subregisterID) {
150
+ throw new Error("Unable to create item: register uses subregisters, but subregister ID was not provided");
151
+ }
152
+
153
+ const clsConfig = itemClasses[classID];
154
+
155
+ if (!clsConfig) {
156
+ throw new Error("Unable to generate new item data: item class configuration is missing");
157
+ }
158
+
159
+ const initialItemData = (clsConfig === null || clsConfig === void 0 ? void 0 : clsConfig.defaults) ?? {};
160
+ const itemID = await makeRandomID();
161
+ const ref = {
162
+ classID,
163
+ itemID,
164
+ subregisterID
165
+ };
166
+ const registerItem = {
167
+ id: itemID,
168
+ dateAccepted: new Date(),
169
+ status: 'valid',
170
+ data: initialItemData
171
+ };
172
+ const itemPath = (0, _itemPathUtils.itemRefToItemPath)(ref);
173
+ await updateObjects({
174
+ commitMessage: `propose to add new ${ref.classID}`,
175
+ objectChangeset: (0, _objectChangeset.updateCRObjectChangeset)(activeCR, {
176
+ [itemPath]: {
177
+ type: 'addition'
178
+ }
179
+ }, {
180
+ [itemPath]: registerItem
181
+ }),
182
+ _dangerouslySkipValidation: true
183
+ });
184
+ spawnTab(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${(0, _itemPathUtils.itemRefToItemPath)(ref, activeCR.id)}`);
185
+ }
186
+
187
+ if (state.enteredFolderID !== null) {
188
+ // If we are in a folder, show a tree with a single element
189
+ // indicating currently entered folder
190
+ // followed by windowed search result list
191
+ // with query according to the folder (item class, subregister)
192
+ let criteria;
193
+ let folderInfo;
194
+
195
+ if (state.enteredFolderID.startsWith('by-item-class/')) {
196
+ var _clsConfig$meta;
197
+
198
+ const classID = state.enteredFolderID.split('/')[1];
199
+ const clsConfig = itemClasses[classID];
200
+ folderInfo = {
201
+ title: (clsConfig === null || clsConfig === void 0 ? void 0 : (_clsConfig$meta = clsConfig.meta) === null || _clsConfig$meta === void 0 ? void 0 : _clsConfig$meta.title) ?? classID,
202
+ moreMenu: clsConfig ? (0, _react2.jsx)(ItemClassMenu, {
203
+ cfg: itemClasses[classID],
204
+ onCreate: !subregisters && activeCRIsEditable && performOperation ? () => performOperation('generating new item', handleAdd)(classID) : undefined
205
+ }) : undefined
206
+ };
207
+ criteria = {
208
+ require: 'all',
209
+ criteria: [{
210
+ key: 'item-class',
211
+ query: _CRITERIA_CONFIGURATION.default['item-class'].toQuery({
212
+ classID
213
+ }, {
214
+ itemClasses,
215
+ subregisters
216
+ })
217
+ }]
218
+ };
219
+ } else if (subregisters && state.enteredFolderID.startsWith('by-subregister/')) {
220
+ const subregisterID = state.enteredFolderID.split('/')[1];
221
+ const subregConfig = subregisters[subregisterID];
222
+ folderInfo = {
223
+ title: (subregConfig === null || subregConfig === void 0 ? void 0 : subregConfig.title) ?? subregisterID,
224
+ moreMenu: subregConfig ? (0, _react2.jsx)(SubregisterMenu, {
225
+ cfg: subregConfig,
226
+ itemClasses: itemClasses,
227
+ onCreate: activeCRIsEditable && performOperation ? clsID => performOperation('generating new item', handleAdd)(clsID, subregisterID) : undefined
228
+ }) : undefined
229
+ };
230
+ criteria = {
231
+ require: 'all',
232
+ criteria: [{
233
+ key: 'subregister',
234
+ query: _CRITERIA_CONFIGURATION.default['subregister'].toQuery({
235
+ subregisterID
236
+ }, {
237
+ itemClasses,
238
+ subregisters
239
+ })
240
+ }]
241
+ };
242
+ } else {
243
+ folderInfo = {
244
+ title: ''
245
+ };
246
+ criteria = {
247
+ require: 'all',
248
+ criteria: []
249
+ };
250
+ }
251
+
252
+ const queryExpression = (0, _criteriaGroupToQueryExpression.default)(criteria);
253
+ return (0, _react2.jsx)("div", {
254
+ css: (0, _react2.css)`display: flex; flex-flow: column nowrap;`,
255
+ className: className,
256
+ style: style
257
+ }, (0, _react2.jsx)(_core.Tree, {
258
+ css: (0, _react2.css)`flex: 0;`,
259
+ onNodeClick: () => dispatch({
260
+ type: 'select-item',
261
+ payload: {
262
+ itemPath: null
263
+ }
264
+ }),
265
+ onNodeCollapse: () => dispatch({
266
+ type: 'exit-folder'
267
+ }),
268
+ onNodeDoubleClick: () => dispatch({
269
+ type: 'exit-folder'
270
+ }),
271
+ contents: [{
272
+ id: 'opened-class',
273
+ isSelected: state.selectedItemPath === null,
274
+ isExpanded: true,
275
+ hasCaret: true,
276
+ icon: 'folder-open',
277
+ label: folderInfo.title,
278
+ secondaryLabel: folderInfo.moreMenu ? (0, _react2.jsx)(MoreMenu, null, folderInfo.moreMenu) : undefined
279
+ }]
280
+ }), (0, _react2.jsx)("div", {
281
+ css: (0, _react2.css)`flex: 1;`
282
+ }, (0, _react2.jsx)(SearchResultList, {
283
+ queryExpression: (0, _itemQueryUtils.getRegisterItemQuery)(queryExpression, activeCR ?? undefined),
284
+ keyExpression: keyExpression,
285
+ selectedItemPath: state.selectedItemPath,
286
+ onSelectItem: itemPath => dispatch({
287
+ type: 'select-item',
288
+ payload: {
289
+ itemPath
290
+ }
291
+ }),
292
+ onOpenItem: onOpenItem ?? (itemPath => spawnTab(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${itemPath}`))
293
+ })));
294
+ } else {
295
+ // If we are *not* in a folder, show a list of available folders/views
296
+ // (item classes, subregisters)
297
+ const contents = [{
298
+ id: 'by-item-class',
299
+ isExpanded: true,
300
+ hasCaret: false,
301
+ icon: 'filter',
302
+ label: "By item class",
303
+ disabled: true,
304
+ nodeData: {
305
+ folderID: null
306
+ }
307
+ }, ...Object.entries(itemClasses).map(([classID, classConfig]) => ({
308
+ isSelected: state.selectedFolderID === `by-item-class/${classID}`,
309
+ id: classID,
310
+ isExpanded: false,
311
+ icon: 'folder-close',
312
+ hasCaret: true,
313
+ label: classConfig.meta.title,
314
+ nodeData: {
315
+ folderID: `by-item-class/${classID}`
316
+ },
317
+ secondaryLabel: (0, _react2.jsx)(MoreMenu, null, (0, _react2.jsx)(ItemClassMenu, {
318
+ cfg: classConfig,
319
+ onCreate: !subregisters && activeCRIsEditable && performOperation ? () => performOperation('generating new item', handleAdd)(classID) : undefined
320
+ }))
321
+ })), ...(subregisters ? [{
322
+ id: 'by-subregister',
323
+ isExpanded: true,
324
+ hasCaret: false,
325
+ disabled: true,
326
+ icon: 'filter',
327
+ label: "By subregister",
328
+ nodeData: {
329
+ folderID: null
330
+ }
331
+ }, ...Object.entries(subregisters).map(([subregisterID, subregisterConfig]) => ({
332
+ isSelected: state.selectedFolderID === `by-subregister/${subregisterID}`,
333
+ id: subregisterID,
334
+ isExpanded: false,
335
+ icon: 'folder-close',
336
+ hasCaret: true,
337
+ label: subregisterConfig.title,
338
+ nodeData: {
339
+ folderID: `by-subregister/${subregisterID}`
340
+ },
341
+ secondaryLabel: (0, _react2.jsx)(MoreMenu, null, (0, _react2.jsx)(SubregisterMenu, {
342
+ cfg: subregisterConfig,
343
+ itemClasses: itemClasses,
344
+ onCreate: activeCRIsEditable && performOperation ? clsID => performOperation('generating new item', handleAdd)(clsID, subregisterID) : undefined
345
+ }))
346
+ }))] : [])];
347
+
348
+ if (subregisters) {
349
+ contents.push();
350
+ }
351
+
352
+ return (0, _react2.jsx)(_core.Tree, {
353
+ css: (0, _react2.css)`flex: 1;`,
354
+ className: className,
355
+ onNodeClick: node => {
356
+ var _node$nodeData;
357
+
358
+ return (_node$nodeData = node.nodeData) !== null && _node$nodeData !== void 0 && _node$nodeData.folderID ? dispatch({
359
+ type: 'select-folder',
360
+ payload: {
361
+ id: node.nodeData.folderID
362
+ }
363
+ }) : void 0;
364
+ },
365
+ onNodeExpand: node => {
366
+ var _node$nodeData2;
367
+
368
+ return (_node$nodeData2 = node.nodeData) !== null && _node$nodeData2 !== void 0 && _node$nodeData2.folderID ? dispatch({
369
+ type: 'enter-folder',
370
+ payload: {
371
+ id: node.nodeData.folderID
372
+ }
373
+ }) : void 0;
374
+ },
375
+ onNodeDoubleClick: node => {
376
+ var _node$nodeData3;
377
+
378
+ return (_node$nodeData3 = node.nodeData) !== null && _node$nodeData3 !== void 0 && _node$nodeData3.folderID ? dispatch({
379
+ type: 'enter-folder',
380
+ payload: {
381
+ id: node.nodeData.folderID
382
+ }
383
+ }) : void 0;
384
+ },
385
+ contents: contents
386
+ });
387
+ }
388
+ };
389
+
390
+ const MoreMenu = function ({
391
+ children
392
+ }) {
393
+ return (0, _react2.jsx)(_popover.Popover2, {
394
+ minimal: true,
395
+ content: (0, _react2.jsx)(_react.default.Fragment, null, children)
396
+ }, (0, _react2.jsx)(_core.Button, {
397
+ icon: "more",
398
+ small: true,
399
+ minimal: true
400
+ }));
401
+ };
402
+
403
+ const SubregisterMenu = function ({
404
+ cfg,
405
+ itemClasses,
406
+ onCreate
407
+ }) {
408
+ return (0, _react2.jsx)(_core.Menu, null, (0, _react2.jsx)(_core.MenuDivider, {
409
+ title: `Item classes in ${cfg.title}`
410
+ }), cfg.itemClasses.map(classID => {
411
+ var _itemClasses$classID, _itemClasses$classID$;
412
+
413
+ return (0, _react2.jsx)(_core.MenuItem, {
414
+ text: ((_itemClasses$classID = itemClasses[classID]) === null || _itemClasses$classID === void 0 ? void 0 : (_itemClasses$classID$ = _itemClasses$classID.meta) === null || _itemClasses$classID$ === void 0 ? void 0 : _itemClasses$classID$.title) ?? classID,
415
+ key: classID
416
+ }, (0, _react2.jsx)(ItemClassMenu, {
417
+ cfg: itemClasses[classID],
418
+ onCreate: onCreate ? () => onCreate(classID) : undefined
419
+ }));
420
+ }));
421
+ };
422
+
423
+ const ItemClassMenu = function ({
424
+ cfg,
425
+ onCreate
426
+ }) {
427
+ return (0, _react2.jsx)(_core.Menu, null, (0, _react2.jsx)(_core.MenuDivider, {
428
+ title: "About this class"
429
+ }), (0, _react2.jsx)(_core.MenuItem, {
430
+ multiline: true,
431
+ disabled: true,
432
+ css: (0, _react2.css)`max-width: 400px`,
433
+ text: cfg.meta.description
434
+ }), onCreate ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.MenuDivider, {
435
+ title: "Quick actions"
436
+ }), (0, _react2.jsx)(_core.MenuItem, {
437
+ text: "Propose new",
438
+ intent: "primary",
439
+ onClick: onCreate,
440
+ icon: "plus"
441
+ })) : null);
442
+ };
443
+
444
+ const SearchResultList = (0, _SearchResultList.default)(_ListItem.default, objPath => ({
445
+ name: 'reg. item',
446
+ iconProps: {
447
+ icon: 'document',
448
+ title: objPath,
449
+ htmlTitle: `Icon for item at ${objPath}`
450
+ }
451
+ }));
452
+ var _default = Browse;
453
+ exports.default = _default;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Browse/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 { Button, IconName, Menu, MenuItem, MenuDivider, Tree, TreeNodeInfo } from '@blueprintjs/core';\nimport { Popover2 } from '@blueprintjs/popover2';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { 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';\n\nimport type { CriteriaGroup } from '../../FilterCriteria/models';\nimport criteriaGroupToQueryExpression from '../../FilterCriteria/criteriaGroupToQueryExpression';\nimport CRITERIA_CONFIGURATION from '../../FilterCriteria/CRITERIA_CONFIGURATION';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { getRegisterItemQuery } from '../../itemQueryUtils';\nimport { ChangeRequestContext } from '../../change-request/ChangeRequestContext';\nimport { updateCRObjectChangeset } from '../../change-request/objectChangeset';\nimport type { RegisterItem, InternalItemReference } from '../../../types';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport ListItem from '../ListItem';\nimport { Protocols } from '../../protocolRegistry';\n\n\ninterface BaseState {\n selectedFolderID: string | null\n selectedItemPath: string | null\n enteredFolderID: string | null\n}\ninterface FolderListState extends BaseState {\n enteredFolderID: null\n selectedItemPath: null\n}\ninterface ItemListState extends BaseState {\n enteredFolderID: string\n selectedFolderID: string\n}\ntype State = FolderListState | ItemListState\n\ntype Action =\n | { type: 'select-folder'; payload: { id: string | null; }; }\n | { type: 'enter-folder'; payload: { id: string; }; }\n | { type: 'exit-folder'; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nconst Browse: React.FC<{\n availableClassIDs?: string[]\n onOpenItem?: (itemPath: string) => void\n stateName?: string\n className?: string\n style?: React.CSSProperties\n}> =\nfunction ({ stateName, onOpenItem, className, style }) {\n const { performOperation, updateObjects, makeRandomID, usePersistentDatasetStateReducer } = useContext(DatasetContext);\n const { spawnTab, focusedTabURI } = useContext(TabbedWorkspaceContext);\n const { keyExpression, itemClasses, subregisters } = useContext(BrowserCtx);\n const { changeRequest: activeCR, canEdit: activeCRIsEditable } = useContext(ChangeRequestContext);\n\n const [ state, dispatch, ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)(\n stateName ?? 'browse-sidebar',\n undefined,\n function valdateState(loadedValue): loadedValue is State {\n function validateFolderID(foldID: string) {\n return foldID !== undefined &&\n (\n foldID === null || (\n foldID.startsWith('by-item-class/') ||\n foldID.startsWith('by-subregister/')\n )\n )\n\n }\n return (\n validateFolderID(loadedValue.enteredFolderID) &&\n validateFolderID(loadedValue.selectedFolderID) &&\n loadedValue.selectedItemPath !== undefined\n );\n },\n (prevState, action) => {\n switch (action.type) {\n case 'select-folder':\n if (prevState.enteredFolderID !== null) {\n return prevState;\n } else {\n return {\n ...prevState,\n selectedFolderID: action.payload.id,\n };\n }\n case 'enter-folder':\n if (prevState.enteredFolderID === null) {\n return {\n ...prevState,\n selectedFolderID: action.payload.id,\n enteredFolderID: action.payload.id,\n };\n } else {\n return prevState;\n }\n case 'exit-folder':\n if (prevState.enteredFolderID !== null) {\n return {\n ...prevState,\n enteredFolderID: null,\n selectedItemPath: null,\n };\n } else {\n return prevState;\n }\n case 'select-item':\n if (prevState.enteredFolderID && prevState.selectedFolderID) {\n return {\n ...prevState,\n selectedItemPath: action.payload.itemPath,\n };\n } else {\n return prevState;\n }\n default:\n throw new Error(\"Unexpected browse state\");\n }\n },\n {\n selectedFolderID: null,\n enteredFolderID: null,\n selectedItemPath: null,\n },\n null);\n\n // If currently focused tab changed, select corresponding item in view\n useEffect(() => {\n if (focusedTabURI) {\n const [proto, itemPath] = focusedTabURI.split(':');\n // TODO: also check entered folder?\n if (proto === Protocols.ITEM_DETAILS) {\n dispatch({ type: 'select-item', payload: { itemPath } });\n }\n }\n }, [focusedTabURI]);\n\n async function handleAdd(classID: string, subregisterID?: string) {\n if (!updateObjects || !makeRandomID || !activeCRIsEditable || !activeCR) {\n throw new Error(\"Unable to create item: likely current proposal is not editable or dataset is read-only\");\n }\n if (subregisters && !subregisterID) {\n throw new Error(\"Unable to create item: register uses subregisters, but subregister ID was not provided\");\n }\n const clsConfig = itemClasses[classID];\n if (!clsConfig) {\n throw new Error(\"Unable to generate new item data: item class configuration is missing\");\n }\n const initialItemData = clsConfig?.defaults ?? {};\n const itemID = await makeRandomID();\n const ref: InternalItemReference = { classID, itemID, subregisterID };\n const registerItem: RegisterItem<any> = {\n id: itemID,\n dateAccepted: new Date(),\n status: 'valid',\n data: initialItemData,\n };\n const itemPath = itemRefToItemPath(ref);\n await updateObjects({\n commitMessage: `propose to add new ${ref.classID}`,\n objectChangeset: updateCRObjectChangeset(\n activeCR as any,\n { [itemPath]: { type: 'addition' } },\n { [itemPath]: registerItem },\n ),\n _dangerouslySkipValidation: true,\n });\n spawnTab(`${Protocols.ITEM_DETAILS}:${itemRefToItemPath(ref, activeCR.id)}`);\n }\n\n if (state.enteredFolderID !== null) {\n // If we are in a folder, show a tree with a single element\n // indicating currently entered folder\n // followed by windowed search result list\n // with query according to the folder (item class, subregister)\n\n let criteria: CriteriaGroup;\n let folderInfo: { title: string; moreMenu?: JSX.Element };\n\n if (state.enteredFolderID.startsWith('by-item-class/')) {\n const classID = state.enteredFolderID.split('/')[1];\n const clsConfig = itemClasses[classID];\n folderInfo = {\n title: clsConfig?.meta?.title ?? classID,\n moreMenu: clsConfig\n ? <ItemClassMenu\n cfg={itemClasses[classID]}\n onCreate={!subregisters && activeCRIsEditable && performOperation\n ? () => performOperation('generating new item', handleAdd)(classID)\n : undefined}\n />\n : undefined,\n };\n criteria = {\n require: 'all',\n criteria: [\n {\n key: 'item-class',\n query: CRITERIA_CONFIGURATION['item-class'].toQuery(\n { classID },\n { itemClasses, subregisters }),\n },\n ],\n };\n } else if (subregisters && state.enteredFolderID.startsWith('by-subregister/')) {\n const subregisterID = state.enteredFolderID.split('/')[1];\n const subregConfig = subregisters[subregisterID];\n folderInfo = {\n title: subregConfig?.title ?? subregisterID,\n moreMenu: subregConfig\n ? <SubregisterMenu\n cfg={subregConfig}\n itemClasses={itemClasses}\n onCreate={activeCRIsEditable && performOperation\n ? (clsID) => performOperation('generating new item', handleAdd)(clsID, subregisterID)\n : undefined}\n />\n : undefined,\n };\n criteria = {\n require: 'all',\n criteria: [\n {\n key: 'subregister',\n query: CRITERIA_CONFIGURATION['subregister'].toQuery(\n { subregisterID },\n { itemClasses, subregisters }),\n },\n ],\n };\n } else {\n folderInfo = { title: '' };\n criteria = { require: 'all', criteria: [] };\n }\n\n\n const queryExpression = criteriaGroupToQueryExpression(criteria);\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className} style={style}>\n {/* */}\n <Tree\n css={css`flex: 0;`}\n onNodeClick={() => dispatch({ type: 'select-item', payload: { itemPath: null }})}\n onNodeCollapse={() => dispatch({ type: 'exit-folder' })}\n onNodeDoubleClick={() => dispatch({ type: 'exit-folder' })}\n contents={[{\n id: 'opened-class',\n isSelected: state.selectedItemPath === null,\n isExpanded: true,\n hasCaret: true,\n icon: 'folder-open',\n label: folderInfo.title,\n secondaryLabel: folderInfo.moreMenu ? <MoreMenu>{folderInfo.moreMenu}</MoreMenu> : undefined,\n }]}\n />\n <div css={css`flex: 1;`}>\n <SearchResultList\n queryExpression={getRegisterItemQuery(queryExpression, activeCR ?? undefined)}\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 </div>\n </div>\n );\n } else {\n // If we are *not* in a folder, show a list of available folders/views\n // (item classes, subregisters)\n\n const contents: TreeNodeInfo<{ folderID: string | null }>[] = [{\n id: 'by-item-class',\n isExpanded: true,\n hasCaret: false,\n icon: 'filter',\n label: \"By item class\",\n disabled: true,\n nodeData: { folderID: null },\n }, ...Object.entries(itemClasses).map(([classID, classConfig]) => ({\n isSelected: state.selectedFolderID === `by-item-class/${classID}`,\n id: classID,\n isExpanded: false,\n icon: 'folder-close' as IconName,\n hasCaret: true,\n label: classConfig.meta.title,\n nodeData: { folderID: `by-item-class/${classID}` },\n secondaryLabel:\n <MoreMenu>\n <ItemClassMenu\n cfg={classConfig}\n onCreate={!subregisters && activeCRIsEditable && performOperation\n ? () => performOperation('generating new item', handleAdd)(classID)\n : undefined}\n />\n </MoreMenu>,\n })), ...(subregisters\n ? [{\n id: 'by-subregister',\n isExpanded: true,\n hasCaret: false,\n disabled: true,\n icon: 'filter' as IconName,\n label: \"By subregister\",\n nodeData: { folderID: null },\n }, ...Object.entries(subregisters).map(([subregisterID, subregisterConfig]) => ({\n isSelected: state.selectedFolderID === `by-subregister/${subregisterID}`,\n id: subregisterID,\n isExpanded: false,\n icon: 'folder-close' as IconName,\n hasCaret: true,\n label: subregisterConfig.title,\n nodeData: { folderID: `by-subregister/${subregisterID}` },\n secondaryLabel:\n <MoreMenu>\n <SubregisterMenu\n cfg={subregisterConfig}\n itemClasses={itemClasses}\n onCreate={activeCRIsEditable && performOperation\n ? (clsID) => performOperation('generating new item', handleAdd)(clsID, subregisterID)\n : undefined}\n />\n </MoreMenu>,\n }))]\n : [])\n ];\n if (subregisters) {\n contents.push()\n }\n return (\n <Tree\n css={css`flex: 1;`}\n className={className}\n onNodeClick={node => node.nodeData?.folderID\n ? dispatch({ type: 'select-folder', payload: { id: node.nodeData.folderID }})\n : void 0}\n onNodeExpand={node => node.nodeData?.folderID\n ? dispatch({ type: 'enter-folder', payload: { id: node.nodeData.folderID }})\n : void 0}\n onNodeDoubleClick={node => node.nodeData?.folderID\n ? dispatch({ type: 'enter-folder', payload: { id: node.nodeData.folderID }})\n : void 0}\n contents={contents}\n />\n );\n }\n};\n\n\nconst MoreMenu: React.FC<Record<never, never>> = function ({ children }) {\n return (\n <Popover2 minimal content={<>{children}</>}>\n <Button icon=\"more\" small minimal />\n </Popover2>\n );\n}\n\n\nconst SubregisterMenu: React.FC<{\n cfg: { title: string, itemClasses: string[] };\n itemClasses: BrowserCtx[\"itemClasses\"];\n onCreate?: (classID: string) => void;\n}> = function ({ cfg, itemClasses, onCreate }) {\n return (\n <Menu>\n <MenuDivider title={`Item classes in ${cfg.title}`} />\n {cfg.itemClasses.map(classID =>\n <MenuItem\n text={itemClasses[classID]?.meta?.title ?? classID}\n key={classID}>\n <ItemClassMenu\n cfg={itemClasses[classID]}\n onCreate={onCreate ? () => onCreate(classID) : undefined}\n />\n </MenuItem>\n )}\n </Menu>\n );\n}\n\n\nconst ItemClassMenu: React.FC<{\n cfg: BrowserCtx[\"itemClasses\"][string];\n onCreate?: () => void;\n}> = function ({ cfg, onCreate }) {\n return (\n <Menu>\n <MenuDivider title=\"About this class\" />\n <MenuItem multiline disabled css={css`max-width: 400px`} text={cfg.meta.description} />\n {onCreate\n ? <>\n <MenuDivider title=\"Quick actions\" />\n <MenuItem\n text=\"Propose new\"\n intent=\"primary\"\n onClick={onCreate} icon=\"plus\"\n />\n </>\n : null}\n </Menu>\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 Browse;\n"]}
@@ -0,0 +1,5 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import React from 'react';
4
+ export declare const ExportSidebarBlock: React.FC<Record<never, never>>;
5
+ export default ExportSidebarBlock;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.ExportSidebarBlock = 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/context");
15
+
16
+ var _BrowserCtx = require("../../BrowserCtx");
17
+
18
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
+
20
+ 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; }
21
+
22
+ /** @jsx jsx */
23
+
24
+ /** @jsxFrag React.Fragment */
25
+ const ExportSidebarBlock = function () {
26
+ const {
27
+ writeFileToFilesystem,
28
+ getObjectData,
29
+ getBlob
30
+ } = (0, _react.useContext)(_context.DatasetContext);
31
+ const {
32
+ selectedRegisterItem
33
+ } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
34
+
35
+ async function handleExport(bufferData) {
36
+ if (!writeFileToFilesystem) {
37
+ throw new Error("Unable to export: filesystem write function unavailable");
38
+ }
39
+
40
+ await writeFileToFilesystem({
41
+ dialogOpts: {
42
+ prompt: "Choose location to export to",
43
+ filters: [{
44
+ name: 'All files',
45
+ extensions: ['*']
46
+ }]
47
+ },
48
+ bufferData
49
+ });
50
+ }
51
+
52
+ async function getExportedData(formatConfig) {
53
+ if (!selectedRegisterItem) {
54
+ throw new Error("Unable to export item: current item data not available");
55
+ }
56
+
57
+ if (!getBlob) {
58
+ throw new Error("Unable to export item: no blob helper");
59
+ }
60
+
61
+ if (formatConfig) {
62
+ return await formatConfig.exportItem(selectedRegisterItem.item, {
63
+ getObjectData,
64
+ getBlob
65
+ });
66
+ } else {
67
+ return await getBlob(JSON.stringify(selectedRegisterItem.item));
68
+ }
69
+ }
70
+
71
+ if (!selectedRegisterItem) {
72
+ return (0, _react2.jsx)(_react.default.Fragment, null);
73
+ } else {
74
+ var _selectedRegisterItem;
75
+
76
+ return (0, _react2.jsx)(_core.ButtonGroup, {
77
+ vertical: true,
78
+ fill: true
79
+ }, ((selectedRegisterItem === null || selectedRegisterItem === void 0 ? void 0 : (_selectedRegisterItem = selectedRegisterItem.itemClass) === null || _selectedRegisterItem === void 0 ? void 0 : _selectedRegisterItem.exportFormats) ?? []).map((exportFormat, idx) => (0, _react2.jsx)(_core.Button, {
80
+ fill: true,
81
+ key: idx,
82
+ alignText: "left",
83
+ onClick: async () => await handleExport(await getExportedData(exportFormat))
84
+ }, exportFormat.label)), (0, _react2.jsx)(_core.Button, {
85
+ fill: true,
86
+ alignText: "left",
87
+ onClick: async () => await handleExport(await getExportedData())
88
+ }, "JSON"));
89
+ }
90
+ };
91
+
92
+ exports.ExportSidebarBlock = ExportSidebarBlock;
93
+ var _default = ExportSidebarBlock;
94
+ exports.default = _default;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Export/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,CAAC,MAAM,kBAAkB,GAAmC;IAChE,MAAM,EAAE,qBAAqB,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACrF,MAAM,EAAE,oBAAoB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAExD,KAAK,UAAU,YAAY,CAAC,UAAsB;QAChD,IAAI,CAAC,qBAAqB,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;SAC5E;QAED,MAAM,qBAAqB,CAAC;YAC1B,UAAU,EAAE;gBACV,MAAM,EAAE,8BAA8B;gBACtC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;aACpD;YACD,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,eAAe,CAAC,YAA6C;QAC1E,IAAI,CAAC,oBAAoB,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;SAC3E;QACD,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;SAC1D;QACD,IAAI,YAAY,EAAE;YAChB,OAAO,MAAM,YAAY,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;SAC7F;aAAM;YACL,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;SACjE;IACH,CAAC;IAED,IAAI,CAAC,oBAAoB,EAAE;QACzB,OAAO,yBAAK,CAAC;KACd;SAAM;QACL,OAAO,CACN,IAAC,WAAW,IAAC,QAAQ,QAAC,IAAI;YACvB,CAAC,oBAAoB,EAAE,SAAS,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,GAAG,EAAE,EAAE,CAChF,IAAC,MAAM,IAAC,IAAI,QAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAC,MAAM,EAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,YAAY,CAAC,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC,IACjH,YAAY,CAAC,KAAK,CACZ,CACV;YACD,IAAC,MAAM,IAAC,IAAI,QAAC,SAAS,EAAC,MAAM,EAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,YAAY,CAAC,MAAM,eAAe,EAAE,CAAC,WAErF,CACG,CACd,CAAC;KACH;AACH,CAAC,CAAA;AAED,eAAe,kBAAkB,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport { jsx } from '@emotion/react';\nimport { Button, ButtonGroup } from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { ExportFormatConfiguration } from '../../../types';\nimport { BrowserCtx } from '../../BrowserCtx';\n\n\nexport const ExportSidebarBlock: React.FC<Record<never, never>> = function () {\n const { writeFileToFilesystem, getObjectData, getBlob } = useContext(DatasetContext);\n const { selectedRegisterItem } = useContext(BrowserCtx);\n\n async function handleExport(bufferData: Uint8Array) {\n if (!writeFileToFilesystem) {\n throw new Error(\"Unable to export: filesystem write function unavailable\");\n }\n\n await writeFileToFilesystem({\n dialogOpts: {\n prompt: \"Choose location to export to\",\n filters: [{ name: 'All files', extensions: ['*'] }],\n },\n bufferData,\n });\n }\n\n async function getExportedData(formatConfig?: ExportFormatConfiguration<any>): Promise<Uint8Array> {\n if (!selectedRegisterItem) {\n throw new Error(\"Unable to export item: current item data not available\");\n }\n if (!getBlob) {\n throw new Error(\"Unable to export item: no blob helper\");\n }\n if (formatConfig) {\n return await formatConfig.exportItem(selectedRegisterItem.item, { getObjectData, getBlob });\n } else {\n return await getBlob(JSON.stringify(selectedRegisterItem.item));\n }\n }\n\n if (!selectedRegisterItem) {\n return <></>;\n } else {\n return (\n <ButtonGroup vertical fill>\n {(selectedRegisterItem?.itemClass?.exportFormats ?? []).map((exportFormat, idx) =>\n <Button fill key={idx} alignText=\"left\" onClick={async () => await handleExport(await getExportedData(exportFormat))}>\n {exportFormat.label}\n </Button>\n )}\n <Button fill alignText=\"left\" onClick={async () => await handleExport(await getExportedData())}>\n JSON\n </Button>\n </ButtonGroup>\n );\n }\n}\n\nexport default ExportSidebarBlock;\n"]}
@@ -0,0 +1,10 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import React from 'react';
4
+ import type { RegisterItem } from '../../types';
5
+ /** Register item list view. */
6
+ declare const ListItem: React.FC<{
7
+ objectData: RegisterItem<any>;
8
+ objectPath: string;
9
+ }>;
10
+ export default ListItem;
@@ -0,0 +1,43 @@
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 _BrowserCtx = require("../BrowserCtx");
13
+
14
+ var _itemPathUtils = require("../itemPathUtils");
15
+
16
+ /** @jsx jsx */
17
+
18
+ /** @jsxFrag React.Fragment */
19
+
20
+ /** Register item list view. */
21
+ const ListItem = function ({
22
+ objectData,
23
+ objectPath
24
+ }) {
25
+ const {
26
+ subregisters,
27
+ getRelatedItemClassConfiguration
28
+ } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
29
+ const itemRef = (0, _itemPathUtils.itemPathToItemRef)(subregisters !== undefined, objectPath);
30
+ const clsConfig = getRelatedItemClassConfiguration(itemRef.classID);
31
+ const ListItemView = clsConfig.itemView;
32
+ const itemPayload = objectData === null || objectData === void 0 ? void 0 : objectData.data;
33
+ const itemView = itemPayload ? (0, _react2.jsx)(ListItemView, {
34
+ itemData: itemPayload,
35
+ itemRef: itemRef
36
+ }) : (0, _react2.jsx)("span", {
37
+ css: (0, _react2.css)`opacity: .4`
38
+ }, "(missing item data at ", objectPath, ")");
39
+ return itemView;
40
+ };
41
+
42
+ var _default = ListItem;
43
+ exports.default = _default;