@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,7 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import React from 'react';
4
+ declare const AnnotatedChange: React.FC<{
5
+ type: 'added' | 'removed';
6
+ }>;
7
+ export default AnnotatedChange;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("@emotion/react");
9
+
10
+ var _react2 = _interopRequireWildcard(require("react"));
11
+
12
+ var _core = require("@blueprintjs/core");
13
+
14
+ var _roughNotation = require("rough-notation");
15
+
16
+ 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); }
17
+
18
+ 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; }
19
+
20
+ /** @jsx jsx */
21
+
22
+ /** @jsxFrag React.Fragment */
23
+ function annotateChange(type, wrappingEl, childIsBoxy) {
24
+ const highlightConfig = {
25
+ type: 'highlight',
26
+ animate: false,
27
+ color: _core.Colors.GOLD5,
28
+ iterations: 3
29
+ };
30
+ let changeConfig;
31
+
32
+ if (type === 'added') {
33
+ changeConfig = {
34
+ type: childIsBoxy ? 'bracket' : 'underline',
35
+ iterations: 1,
36
+ color: _core.Colors.BLUE4
37
+ };
38
+ } else {
39
+ changeConfig = {
40
+ type: 'crossed-off',
41
+ iterations: 1,
42
+ color: _core.Colors.RED3
43
+ };
44
+ }
45
+
46
+ const highlightAnnotation = (0, _roughNotation.annotate)(wrappingEl, highlightConfig);
47
+ const changeAnnotation = (0, _roughNotation.annotate)(wrappingEl, changeConfig);
48
+ return [highlightAnnotation, changeAnnotation];
49
+ }
50
+
51
+ const AnnotatedChange = ({
52
+ type,
53
+ children
54
+ }) => {
55
+ const elRef = (0, _react2.useRef)(null);
56
+
57
+ const firstChild = _react2.default.Children.toArray(children)[0];
58
+
59
+ const childType = _react2.default.isValidElement(firstChild) ? firstChild.type : undefined;
60
+ const childIsBoxy = childType === 'div'; // Could it bring more accuracy to block/inline detection?
61
+ //const childCount = React.isValidElement(firstChild) ? React.Children.count(firstChild.props.children) : undefined;
62
+
63
+ (0, _react2.useEffect)(() => {
64
+ if (elRef.current) {
65
+ const annotations = annotateChange(type, elRef.current, childIsBoxy);
66
+
67
+ for (const a of annotations) {
68
+ a.show();
69
+ }
70
+
71
+ return function cleanup() {
72
+ for (const a of annotations) {
73
+ a.remove();
74
+ }
75
+ };
76
+ }
77
+
78
+ return;
79
+ }, [elRef.current]);
80
+ return (0, _react.jsx)("mark", {
81
+ style: {
82
+ display: childIsBoxy ? 'block' : 'inline',
83
+ background: 'none'
84
+ },
85
+ ref: elRef,
86
+ title: `(${type} in this proposal)`
87
+ }, children);
88
+ };
89
+
90
+ var _default = AnnotatedChange;
91
+ exports.default = _default;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnnotatedChange.js","sourceRoot":"","sources":["../../src/views/AnnotatedChange.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI1C,SAAS,cAAc,CACrB,IAAyB,EACzB,UAA2B,EAC3B,WAAgC;IAEhC,MAAM,eAAe,GAA0B;QAC7C,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU,EAAE,CAAC;KACd,CAAC;IACF,IAAI,YAAmC,CAAC;IACxC,IAAI,IAAI,KAAK,OAAO,EAAE;QACpB,YAAY,GAAG;YACb,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;YAC3C,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;KACH;SAAM;QACL,YAAY,GAAG;YACb,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,MAAM,CAAC,IAAI;SACnB,CAAC;KACH;IACD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAClE,MAAM,gBAAgB,GAAG,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAE5D,OAAO,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;AACjD,CAAC;AAGD,MAAM,eAAe,GAA4C,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;IACtF,MAAM,KAAK,GAAG,MAAM,CAAyB,IAAI,CAAC,CAAC;IAEnD,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,MAAM,WAAW,GAAG,SAAS,KAAK,KAAK,CAAC;IAExC,0DAA0D;IAC1D,oHAAoH;IAEpH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,OAAO,EAAE;YACjB,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACrE,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE;gBAC3B,CAAC,CAAC,IAAI,EAAE,CAAC;aACV;YACD,OAAO,SAAS,OAAO;gBACrB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE;oBAC3B,CAAC,CAAC,MAAM,EAAE,CAAC;iBACZ;YACH,CAAC,CAAA;SACF;QACD,OAAO;IACT,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAEpB,OAAO,CACL,cACI,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EACxE,GAAG,EAAE,KAAK,EACV,KAAK,EAAE,IAAI,IAAI,oBAAoB,IACpC,QAAQ,CACJ,CACR,CAAC;AACJ,CAAC,CAAC;AAGF,eAAe,eAAe,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx } from '@emotion/react';\nimport React, { useRef, useEffect } from 'react';\nimport { Colors } from '@blueprintjs/core'\nimport { annotate } from 'rough-notation';\nimport { RoughAnnotation, RoughAnnotationConfig } from 'rough-notation/lib/model';\n\n\nfunction annotateChange(\n type: 'added' | 'removed',\n wrappingEl: HTMLSpanElement,\n childIsBoxy: boolean | undefined):\nRoughAnnotation[] {\n const highlightConfig: RoughAnnotationConfig = {\n type: 'highlight',\n animate: false,\n color: Colors.GOLD5,\n iterations: 3,\n };\n let changeConfig: RoughAnnotationConfig;\n if (type === 'added') {\n changeConfig = {\n type: childIsBoxy ? 'bracket' : 'underline',\n iterations: 1,\n color: Colors.BLUE4,\n };\n } else {\n changeConfig = {\n type: 'crossed-off',\n iterations: 1,\n color: Colors.RED3,\n };\n }\n const highlightAnnotation = annotate(wrappingEl, highlightConfig);\n const changeAnnotation = annotate(wrappingEl, changeConfig);\n\n return [highlightAnnotation, changeAnnotation];\n}\n\n\nconst AnnotatedChange: React.FC<{ type: 'added' | 'removed' }> = ({ type, children }) => {\n const elRef = useRef<HTMLSpanElement | null>(null);\n\n const firstChild = React.Children.toArray(children)[0];\n\n const childType = React.isValidElement(firstChild) ? firstChild.type : undefined;\n const childIsBoxy = childType === 'div';\n\n // Could it bring more accuracy to block/inline detection?\n //const childCount = React.isValidElement(firstChild) ? React.Children.count(firstChild.props.children) : undefined;\n\n useEffect(() => {\n if (elRef.current) {\n const annotations = annotateChange(type, elRef.current, childIsBoxy);\n for (const a of annotations) {\n a.show();\n }\n return function cleanup() {\n for (const a of annotations) {\n a.remove();\n }\n }\n }\n return;\n }, [elRef.current]);\n\n return (\n <mark\n style={{ display: childIsBoxy ? 'block' : 'inline', background: 'none' }}\n ref={elRef}\n title={`(${type} in this proposal)`}>\n {children}\n </mark>\n );\n};\n\n\nexport default AnnotatedChange;\n"]}
@@ -1,9 +1,73 @@
1
+ /** @jsx jsx */
1
2
  /// <reference types="react" />
2
- import { ItemClassConfigurationSet, RegisterItemDataHook, Subregisters } from '../types';
3
+ import type { CustomViewConfiguration, ItemClassConfigurationSet, ItemClassConfiguration, RegisterItem, RegisterItemDataHook, Register, RegisterStakeholder, RelatedItemClassConfiguration, Subregisters, InternalItemReference } from '../types';
4
+ import { type CriteriaGroup } from './FilterCriteria/models';
5
+ import { type Protocol } from './protocolRegistry';
3
6
  export declare type BrowserCtx = {
4
7
  itemClasses: ItemClassConfigurationSet;
5
8
  subregisters?: Subregisters;
9
+ /**
10
+ * Stakeholder corresponding to the current user.
11
+ * If current user is not a stakeholder, undefined.
12
+ */
13
+ stakeholder?: RegisterStakeholder;
14
+ /**
15
+ * Common “key expression” (used for sorting) across the register.
16
+ * Should contain the expression itself, no “return” statement.
17
+ */
18
+ keyExpression?: string;
19
+ /** Default search criteria to be used by the Search sidebar */
20
+ defaultSearchCriteria?: CriteriaGroup;
21
+ /**
22
+ * Allows to access register metadata
23
+ * (e.g., version, stakeholders).
24
+ *
25
+ * `undefined` if loading, `null` if unspecified.
26
+ */
27
+ registerMetadata?: Register | null;
28
+ /** Hook for getting register item data. */
6
29
  useRegisterItemData: RegisterItemDataHook;
7
- jumpToItem?: (classID: string, itemID: string, subregisterID?: string) => void;
30
+ /**
31
+ * Invoked to navigate to an item.
32
+ * In SPA tabbed context, could translate to `spawnTab()`;
33
+ * in static web context, could translate to navigating browser location.
34
+ */
35
+ jumpTo?: (uri: `${Protocol}:${string}`) => void;
36
+ /**
37
+ * If a register item is selected, provide its data here.
38
+ *
39
+ * If item data is still loading or invalid, `undefined`.
40
+ * If item is not selected, `null`.
41
+ */
42
+ selectedRegisterItem?: {
43
+ item: RegisterItem<any>;
44
+ ref: InternalItemReference;
45
+ itemClass: ItemClassConfiguration<any>;
46
+ } | null;
47
+ /**
48
+ * Change request being drafted or reviewed.
49
+ * `undefined` if loading, `null` if there is no active change request.
50
+ */
51
+ activeChangeRequestID?: string | null;
52
+ /**
53
+ * Setter for `activeChangeRequest()`. Set to `null` to unset.
54
+ */
55
+ setActiveChangeRequestID?: (id: string | null) => void;
56
+ /**
57
+ * An async function for retrieving data of register items
58
+ * at given paths. For cases where the hook doesn’t work.
59
+ *
60
+ * If a path contains nothing or contains not a register item,
61
+ * the result will be null.
62
+ */
63
+ /**
64
+ * Extension-provided additional views that don’t correspond
65
+ * to entities like register item, change request, etc. handled by RegistryKit.
66
+ */
67
+ customViews: CustomViewConfiguration[];
68
+ /**
69
+ * Given item class ID, returns a small subset of relevant class configuration data.
70
+ */
71
+ getRelatedItemClassConfiguration: (clsID: string) => RelatedItemClassConfiguration;
8
72
  };
9
73
  export declare const BrowserCtx: import("react").Context<BrowserCtx>;
@@ -5,16 +5,27 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.BrowserCtx = void 0;
7
7
 
8
- var _react = require("react");
8
+ var _react = require("@emotion/react");
9
9
 
10
- const BrowserCtx = (0, _react.createContext)({
10
+ var _react2 = require("react");
11
+
12
+ /** @jsx jsx */
13
+ const BrowserCtx = (0, _react2.createContext)({
11
14
  itemClasses: {},
15
+ customViews: [],
16
+ // getRegisterItemData: async () => ({}),
17
+ selectedRegisterItem: null,
18
+ registerMetadata: undefined,
12
19
  useRegisterItemData: () => ({
13
20
  value: {},
14
21
  _reqCounter: -1,
15
22
  errors: [],
16
23
  isUpdating: true,
17
24
  refresh: () => void 0
25
+ }),
26
+ getRelatedItemClassConfiguration: () => ({
27
+ title: 'N/A',
28
+ itemView: () => (0, _react.jsx)("span", null, "Loading\u2026")
18
29
  })
19
30
  });
20
31
  exports.BrowserCtx = BrowserCtx;
@@ -1 +1 @@
1
- {"version":3,"file":"BrowserCtx.js","sourceRoot":"","sources":["../../src/views/BrowserCtx.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAWtC,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAa;IAClD,WAAW,EAAE,EAAE;IACf,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1B,KAAK,EAAE,EAAE;QACT,WAAW,EAAE,CAAC,CAAC;QACf,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC;KACtB,CAAC;CACH,CAAC,CAAC","sourcesContent":["import { createContext } from 'react';\nimport { ItemClassConfigurationSet, RegisterItemDataHook, Subregisters } from '../types';\n\n\nexport type BrowserCtx = {\n itemClasses: ItemClassConfigurationSet\n subregisters?: Subregisters\n useRegisterItemData: RegisterItemDataHook\n jumpToItem?: (classID: string, itemID: string, subregisterID?: string) => void;\n};\n\nexport const BrowserCtx = createContext<BrowserCtx>({\n itemClasses: {},\n useRegisterItemData: () => ({\n value: {},\n _reqCounter: -1,\n errors: [],\n isUpdating: true,\n refresh: () => void 0,\n }),\n});\n"]}
1
+ {"version":3,"file":"BrowserCtx.js","sourceRoot":"","sources":["../../src/views/BrowserCtx.tsx"],"names":[],"mappings":"AAAA,eAAe;AAEf,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAyGtC,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAa;IAClD,WAAW,EAAE,EAAE;IACf,WAAW,EAAE,EAAE;IACf,yCAAyC;IACzC,oBAAoB,EAAE,IAAI;IAC1B,gBAAgB,EAAE,SAAS;IAC3B,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1B,KAAK,EAAE,EAAE;QACT,WAAW,EAAE,CAAC,CAAC;QACf,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC;KACtB,CAAC;IACF,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,kCAAqB,EAAE,CAAC;CAClG,CAAC,CAAC","sourcesContent":["/** @jsx jsx */\n\nimport { jsx } from '@emotion/react';\nimport { createContext } from 'react';\nimport type {\n CustomViewConfiguration,\n ItemClassConfigurationSet,\n ItemClassConfiguration,\n RegisterItem,\n RegisterItemDataHook,\n Register,\n RegisterStakeholder,\n RelatedItemClassConfiguration,\n // SaveProposalHandler,\n Subregisters,\n InternalItemReference,\n} from '../types';\nimport { type CriteriaGroup } from './FilterCriteria/models';\nimport { type Protocol } from './protocolRegistry';\n\n\n// TODO(perf): split into smaller contexts\nexport type BrowserCtx = {\n itemClasses: ItemClassConfigurationSet\n subregisters?: Subregisters\n\n /**\n * Stakeholder corresponding to the current user.\n * If current user is not a stakeholder, undefined.\n */\n stakeholder?: RegisterStakeholder\n\n /**\n * Common “key expression” (used for sorting) across the register.\n * Should contain the expression itself, no “return” statement.\n */\n keyExpression?: string\n\n /** Default search criteria to be used by the Search sidebar */\n defaultSearchCriteria?: CriteriaGroup\n\n /**\n * Allows to access register metadata\n * (e.g., version, stakeholders).\n *\n * `undefined` if loading, `null` if unspecified.\n */\n registerMetadata?: Register | null\n\n /** Hook for getting register item data. */\n useRegisterItemData: RegisterItemDataHook\n\n /**\n * Invoked to navigate to an item.\n * In SPA tabbed context, could translate to `spawnTab()`;\n * in static web context, could translate to navigating browser location.\n */\n jumpTo?: (uri: `${Protocol}:${string}`) => void\n\n /**\n * If a register item is selected, provide its data here.\n *\n * If item data is still loading or invalid, `undefined`.\n * If item is not selected, `null`.\n */\n selectedRegisterItem?: {\n item: RegisterItem<any>\n ref: InternalItemReference\n itemClass: ItemClassConfiguration<any>\n } | null\n\n /**\n * Change request being drafted or reviewed.\n * `undefined` if loading, `null` if there is no active change request.\n */\n activeChangeRequestID?: string | null\n\n /**\n * Setter for `activeChangeRequest()`. Set to `null` to unset.\n */\n setActiveChangeRequestID?: (id: string | null) => void\n\n /**\n * An async function for retrieving data of register items\n * at given paths. For cases where the hook doesn’t work.\n *\n * If a path contains nothing or contains not a register item,\n * the result will be null.\n */\n // getRegisterItemData: (opts: { itemPaths: string[] }) => Promise<Record<string, RegisterItem<any> | null>>\n\n /**\n * Extension-provided additional views that don’t correspond\n * to entities like register item, change request, etc. handled by RegistryKit.\n */\n customViews: CustomViewConfiguration[]\n\n // onPropose?: SaveProposalHandler\n\n //selectedItemPath?: string\n\n /**\n * Given item class ID, returns a small subset of relevant class configuration data.\n */\n getRelatedItemClassConfiguration: (clsID: string) => RelatedItemClassConfiguration\n // TODO: Rename to just “get class config”\n};\n\nexport const BrowserCtx = createContext<BrowserCtx>({\n itemClasses: {},\n customViews: [],\n // getRegisterItemData: async () => ({}),\n selectedRegisterItem: null,\n registerMetadata: undefined,\n useRegisterItemData: () => ({\n value: {},\n _reqCounter: -1,\n errors: [],\n isUpdating: true,\n refresh: () => void 0,\n }),\n getRelatedItemClassConfiguration: () => ({ title: 'N/A', itemView: () => <span>Loading…</span> }),\n});\n"]}
@@ -0,0 +1,17 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import { CriteriaConfiguration, CriterionConfiguration } from './models';
4
+ export declare const ITEM_CLASS: CriterionConfiguration<{
5
+ classID?: string;
6
+ }>;
7
+ export declare const SUBREGISTER: CriterionConfiguration<{
8
+ subregisterID?: string;
9
+ }>;
10
+ export declare const RAW_SUBSTRING: CriterionConfiguration<{
11
+ substring?: string;
12
+ }>;
13
+ export declare const CUSTOM_CONDITION: CriterionConfiguration<{
14
+ customExpression?: string;
15
+ }>;
16
+ export declare const CRITERIA_CONFIGURATION: CriteriaConfiguration;
17
+ export default CRITERIA_CONFIGURATION;
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.CRITERIA_CONFIGURATION = exports.CUSTOM_CONDITION = exports.RAW_SUBSTRING = exports.SUBREGISTER = exports.ITEM_CLASS = void 0;
7
+
8
+ var _react = require("@emotion/react");
9
+
10
+ var _PropertyView = require("@riboseinc/paneron-extension-kit/widgets/Sidebar/PropertyView");
11
+
12
+ var _index = require("./index");
13
+
14
+ /** @jsx jsx */
15
+
16
+ /** @jsxFrag React.Fragment */
17
+ const ITEM_CLASS = {
18
+ label: "item class is",
19
+ icon: 'cube',
20
+ toQuery: ({
21
+ classID
22
+ }, {
23
+ subregisters
24
+ }) => `objPath.indexOf("/${classID}/") >= ${subregisters ? _index.SUBREGISTER_PATH_PREFIX.length - 1 : 0}`,
25
+ fromQuery: query => ({
26
+ classID: query.split('/')[1]
27
+ }),
28
+ toSummary: ({
29
+ classID
30
+ }, {
31
+ itemClasses
32
+ }) => {
33
+ if (classID) {
34
+ var _itemClasses$classID;
35
+
36
+ return ((_itemClasses$classID = itemClasses[classID]) === null || _itemClasses$classID === void 0 ? void 0 : _itemClasses$classID.meta.title) ?? classID;
37
+ } else {
38
+ return "(N/A)";
39
+ }
40
+ },
41
+ widget: ({
42
+ data,
43
+ onChange,
44
+ itemClasses,
45
+ availableClassIDs,
46
+ className,
47
+ style
48
+ }) => {
49
+ const itemClassChoices = [...Object.entries(itemClasses).filter(([clsID]) => availableClassIDs.indexOf(clsID) >= 0).map(([classID, classData]) => {
50
+ var _classData$meta;
51
+
52
+ return {
53
+ value: classID,
54
+ label: (classData === null || classData === void 0 ? void 0 : (_classData$meta = classData.meta) === null || _classData$meta === void 0 ? void 0 : _classData$meta.title) ?? "Unknown class"
55
+ };
56
+ }), {
57
+ value: '',
58
+ label: "(not selected)"
59
+ }];
60
+ return (0, _react.jsx)(_PropertyView.Select, {
61
+ className: className,
62
+ style: style,
63
+ fill: true,
64
+ options: itemClassChoices,
65
+ value: data.classID ?? '',
66
+ disabled: !onChange,
67
+ onChange: onChange ? evt => onChange({
68
+ classID: evt.currentTarget.value
69
+ }) : undefined
70
+ });
71
+ }
72
+ };
73
+ exports.ITEM_CLASS = ITEM_CLASS;
74
+ const SUBREGISTER = {
75
+ label: "is in subregister",
76
+ icon: 'folder-open',
77
+ isEnabled: ({
78
+ subregisters
79
+ }) => subregisters !== undefined,
80
+ toQuery: ({
81
+ subregisterID
82
+ }, {
83
+ subregisters
84
+ }) => subregisters !== undefined && subregisterID !== null && subregisterID !== void 0 && subregisterID.trim() ? `objPath.indexOf("/subregisters/${subregisterID}/") === 0` : 'true',
85
+ fromQuery: query => ({
86
+ subregisterID: query.split('/')[2]
87
+ }),
88
+ toSummary: ({
89
+ subregisterID
90
+ }, {
91
+ subregisters
92
+ }) => {
93
+ if (subregisters && subregisterID) {
94
+ return subregisters[subregisterID].title;
95
+ } else {
96
+ return "(N/A)";
97
+ }
98
+ },
99
+ widget: ({
100
+ data,
101
+ onChange,
102
+ subregisters,
103
+ className,
104
+ style
105
+ }) => {
106
+ const subregisterChoices = [...Object.entries(subregisters ?? {}).map(([subregisterID, subregisterInfo]) => {
107
+ return {
108
+ value: subregisterID,
109
+ label: subregisterInfo.title
110
+ };
111
+ }), {
112
+ value: '',
113
+ label: "(not selected)"
114
+ }];
115
+ return (0, _react.jsx)(_PropertyView.Select, {
116
+ className: className,
117
+ style: style,
118
+ fill: true,
119
+ options: subregisterChoices,
120
+ value: data.subregisterID ?? '',
121
+ disabled: !onChange,
122
+ onChange: onChange ? evt => onChange({
123
+ subregisterID: evt.currentTarget.value
124
+ }) : undefined
125
+ });
126
+ }
127
+ };
128
+ exports.SUBREGISTER = SUBREGISTER;
129
+ const RAW_SUBSTRING = {
130
+ label: "raw data contains",
131
+ icon: 'search-text',
132
+ toQuery: ({
133
+ substring
134
+ }) => substring !== null && substring !== void 0 && substring.trim() ? `JSON.stringify(obj.data ?? {}).toLowerCase().indexOf("${substring.toLowerCase().replace(/"/g, "\\\"")}") >= 0` : `true`,
135
+ fromQuery: query => {
136
+ var _query$split$;
137
+
138
+ return {
139
+ substring: (((_query$split$ = query.split('JSON.stringify(obj.data ?? {}).toLowerCase().indexOf("')[1]) === null || _query$split$ === void 0 ? void 0 : _query$split$.split('") >= 0')[0]) ?? '').replace(/\\"/g, '"')
140
+ };
141
+ },
142
+ toSummary: ({
143
+ substring
144
+ }) => {
145
+ if (substring) {
146
+ return substring.length > 20 ? `${substring.slice(0, 20)}…` : substring;
147
+ } else {
148
+ return 'N/A';
149
+ }
150
+ },
151
+ widget: ({
152
+ data,
153
+ onChange,
154
+ className,
155
+ style
156
+ }) => {
157
+ return (0, _react.jsx)(_PropertyView.TextInput, {
158
+ className: className,
159
+ style: style,
160
+ value: data.substring ?? '',
161
+ onChange: onChange ? substring => onChange({
162
+ substring
163
+ }) : undefined
164
+ });
165
+ }
166
+ };
167
+ exports.RAW_SUBSTRING = RAW_SUBSTRING;
168
+ const CUSTOM_CONDITION = {
169
+ label: "condition is met",
170
+ icon: 'code',
171
+ toQuery: ({
172
+ customExpression
173
+ }) => customExpression ?? 'true',
174
+ fromQuery: query => ({
175
+ customExpression: query
176
+ }),
177
+ toSummary: () => "(custom test expr.)",
178
+ widget: ({
179
+ data,
180
+ onChange,
181
+ className
182
+ }) => {
183
+ return (0, _react.jsx)(_PropertyView.TextInput, {
184
+ className: className,
185
+ value: data.customExpression ?? 'true',
186
+ placeholder: "Enter a valid query expression\u2026",
187
+ onChange: onChange ? customExpression => onChange({
188
+ customExpression
189
+ }) : undefined
190
+ });
191
+ }
192
+ };
193
+ exports.CUSTOM_CONDITION = CUSTOM_CONDITION;
194
+ const CRITERIA_CONFIGURATION = {
195
+ 'item-class': ITEM_CLASS,
196
+ 'subregister': SUBREGISTER,
197
+ 'raw-substring': RAW_SUBSTRING,
198
+ 'custom': CUSTOM_CONDITION
199
+ };
200
+ exports.CRITERIA_CONFIGURATION = CRITERIA_CONFIGURATION;
201
+ var _default = CRITERIA_CONFIGURATION;
202
+ exports.default = _default;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CRITERIA_CONFIGURATION.js","sourceRoot":"","sources":["../../../src/views/FilterCriteria/CRITERIA_CONFIGURATION.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx } from '@emotion/react';\nimport { OptionProps } from '@blueprintjs/core';\nimport { Select, TextInput } from '@riboseinc/paneron-extension-kit/widgets/Sidebar/PropertyView';\nimport { CriteriaConfiguration, CriterionConfiguration } from './models';\nimport { SUBREGISTER_PATH_PREFIX } from './index';\n\n\nexport const ITEM_CLASS: CriterionConfiguration<{ classID?: string }> = {\n label: \"item class is\",\n icon: 'cube',\n toQuery: ({ classID }, { subregisters }) => `objPath.indexOf(\"/${classID}/\") >= ${subregisters ? SUBREGISTER_PATH_PREFIX.length - 1 : 0}`,\n fromQuery: (query) => ({\n classID: query.split('/')[1],\n }),\n toSummary: ({ classID }, { itemClasses }) => {\n if (classID) {\n return itemClasses[classID]?.meta.title ?? classID;\n } else {\n return \"(N/A)\";\n }\n },\n widget: ({ data, onChange, itemClasses, availableClassIDs, className, style }) => {\n const itemClassChoices: OptionProps[] = [\n ...Object.entries(itemClasses).\n filter(([clsID, ]) => availableClassIDs.indexOf(clsID) >= 0).\n map(([classID, classData]) => {\n return { value: classID, label: classData?.meta?.title ?? \"Unknown class\" };\n }),\n { value: '', label: \"(not selected)\" },\n ];\n return (\n <Select\n className={className}\n style={style}\n fill\n options={itemClassChoices}\n value={data.classID ?? ''}\n disabled={!onChange}\n onChange={onChange\n ? (evt) => onChange!({ classID: evt.currentTarget.value })\n : undefined} />\n );\n },\n};\n\n\nexport const SUBREGISTER: CriterionConfiguration<{ subregisterID?: string }> = {\n label: \"is in subregister\",\n icon: 'folder-open',\n isEnabled: ({ subregisters }) => subregisters !== undefined,\n toQuery: ({ subregisterID }, { subregisters }) => subregisters !== undefined && subregisterID?.trim()\n ? `objPath.indexOf(\"/subregisters/${subregisterID}/\") === 0`\n : 'true',\n fromQuery: (query) => ({\n subregisterID: query.split('/')[2],\n }),\n toSummary: ({ subregisterID }, { subregisters }) => {\n if (subregisters && subregisterID) {\n return subregisters[subregisterID].title;\n } else {\n return \"(N/A)\";\n }\n },\n widget: ({ data, onChange, subregisters, className, style }) => {\n const subregisterChoices: OptionProps[] = [\n ...Object.entries(subregisters ?? {}).\n map(([subregisterID, subregisterInfo]) => {\n return { value: subregisterID, label: subregisterInfo.title };\n }),\n { value: '', label: \"(not selected)\" },\n ];\n return (\n <Select\n className={className}\n style={style}\n fill\n options={subregisterChoices}\n value={data.subregisterID ?? ''}\n disabled={!onChange}\n onChange={onChange\n ? (evt) => onChange!({ subregisterID: evt.currentTarget.value })\n : undefined} />\n );\n },\n};\n\n\nexport const RAW_SUBSTRING: CriterionConfiguration<{ substring?: string }> = {\n label: \"raw data contains\",\n icon: 'search-text',\n toQuery: ({ substring }) =>\n substring?.trim()\n ? `JSON.stringify(obj.data ?? {}).toLowerCase().indexOf(\"${substring.toLowerCase().replace(/\"/g, \"\\\\\\\"\")}\") >= 0`\n : `true`,\n fromQuery: (query) => ({\n substring: (query.\n split('JSON.stringify(obj.data ?? {}).toLowerCase().indexOf(\"')[1]?.\n split('\") >= 0')[0] ?? '').replace(/\\\\\"/g, '\"'),\n }),\n toSummary: ({ substring }) => {\n if (substring) {\n return substring.length > 20 ? `${substring.slice(0, 20)}…` : substring;\n } else {\n return 'N/A';\n }\n },\n widget: ({ data, onChange, className, style }) => {\n return <TextInput\n className={className}\n style={style}\n value={data.substring ?? ''}\n onChange={onChange ? substring => onChange!({ substring }) : undefined}\n />;\n },\n}\n\n\nexport const CUSTOM_CONDITION: CriterionConfiguration<{ customExpression?: string; }> = {\n label: \"condition is met\",\n icon: 'code',\n toQuery: ({ customExpression }) => customExpression ?? 'true',\n fromQuery: (query) => ({\n customExpression: query,\n }),\n toSummary: () => \"(custom test expr.)\",\n widget: ({ data, onChange, className }) => {\n return (\n <TextInput\n className={className}\n value={data.customExpression ?? 'true'}\n placeholder=\"Enter a valid query expression…\"\n onChange={onChange\n ? (customExpression) => onChange!({ customExpression })\n : undefined} />\n );\n },\n}\n\n\nexport const CRITERIA_CONFIGURATION: CriteriaConfiguration = {\n 'item-class': ITEM_CLASS,\n 'subregister': SUBREGISTER,\n 'raw-substring': RAW_SUBSTRING,\n 'custom': CUSTOM_CONDITION,\n};\n\n\nexport default CRITERIA_CONFIGURATION;\n"]}
@@ -0,0 +1,6 @@
1
+ import { CriteriaGroup } from './models';
2
+ /**
3
+ * Given a CriteriaGroup,
4
+ * returns a query expression suitable for use with filtered object indexes..
5
+ */
6
+ export default function criteriaGroupToQueryExpression(cg: CriteriaGroup): string;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = criteriaGroupToQueryExpression;
7
+
8
+ var _models = require("./models");
9
+
10
+ /**
11
+ * Given a CriteriaGroup,
12
+ * returns a query expression suitable for use with filtered object indexes..
13
+ */
14
+ function criteriaGroupToQueryExpression(cg) {
15
+ const exps = [];
16
+
17
+ for (const c of cg.criteria) {
18
+ if ((0, _models.isCriteriaGroup)(c)) {
19
+ if (c.criteria.length > 1) {
20
+ exps.push(`(${criteriaGroupToQueryExpression(c)})`);
21
+ } else if (c.criteria.length > 0) {
22
+ exps.push(`${criteriaGroupToQueryExpression(c)}`);
23
+ }
24
+ } else {
25
+ exps.push(c.query);
26
+ }
27
+ }
28
+
29
+ let result;
30
+
31
+ if (exps.length < 1) {
32
+ result = 'true';
33
+ } else {
34
+ switch (cg.require) {
35
+ case 'all':
36
+ result = exps.join(' && ');
37
+ break;
38
+
39
+ case 'any':
40
+ result = exps.join(' || ');
41
+ break;
42
+
43
+ case 'none':
44
+ result = exps.map(exp => `${exp} === false`).join(' && ');
45
+ break;
46
+ }
47
+ }
48
+
49
+ return result;
50
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criteriaGroupToQueryExpression.js","sourceRoot":"","sources":["../../../src/views/FilterCriteria/criteriaGroupToQueryExpression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,eAAe,EAAE,MAAM,UAAU,CAAC;AAG1D;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,8BAA8B,CAAC,EAAiB;IACtE,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;QAC3B,IAAI,eAAe,CAAC,CAAC,CAAC,EAAE;YACtB,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzB,IAAI,CAAC,IAAI,CAAC,IAAI,8BAA8B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aACrD;iBAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChC,IAAI,CAAC,IAAI,CAAC,GAAG,8BAA8B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aACnD;SACF;aAAM;YACL,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SACpB;KACF;IAED,IAAI,MAAc,CAAC;IACnB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACnB,MAAM,GAAG,MAAM,CAAC;KACjB;SAAM;QACL,QAAQ,EAAE,CAAC,OAAO,EAAE;YAClB,KAAK,KAAK;gBACR,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,KAAK;gBACR,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1D,MAAM;SACT;KACF;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { CriteriaGroup, isCriteriaGroup } from './models';\n\n\n/**\n * Given a CriteriaGroup,\n * returns a query expression suitable for use with filtered object indexes..\n */\nexport default function criteriaGroupToQueryExpression(cg: CriteriaGroup): string {\n const exps: string[] = [];\n\n for (const c of cg.criteria) {\n if (isCriteriaGroup(c)) {\n if (c.criteria.length > 1) {\n exps.push(`(${criteriaGroupToQueryExpression(c)})`);\n } else if (c.criteria.length > 0) {\n exps.push(`${criteriaGroupToQueryExpression(c)}`);\n }\n } else {\n exps.push(c.query);\n }\n }\n\n let result: string;\n if (exps.length < 1) {\n result = 'true';\n } else {\n switch (cg.require) {\n case 'all':\n result = exps.join(' && ');\n break;\n case 'any':\n result = exps.join(' || ');\n break;\n case 'none':\n result = exps.map(exp => `${exp} === false`).join(' && ');\n break;\n }\n }\n\n return result;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ /// <reference types="react" />
4
+ import { CriteriaGroup, CommonOpts } from './models';
5
+ export default function criteriaGroupToSummary(cg: CriteriaGroup, opts: CommonOpts): JSX.Element;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = criteriaGroupToSummary;
7
+
8
+ var _react = require("@emotion/react");
9
+
10
+ var _react2 = _interopRequireDefault(require("react"));
11
+
12
+ var _models = require("./models");
13
+
14
+ var _CRITERIA_CONFIGURATION = require("./CRITERIA_CONFIGURATION");
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ /** @jsx jsx */
19
+
20
+ /** @jsxFrag React.Fragment */
21
+
22
+ /* Building query summary */
23
+ function criteriaGroupToSummary(cg, opts) {
24
+ const exps = [];
25
+
26
+ for (const c of cg.criteria) {
27
+ if ((0, _models.isCriteriaGroup)(c)) {
28
+ exps.push(criteriaGroupToSummary(c, opts));
29
+ } else {
30
+ const cfg = _CRITERIA_CONFIGURATION.CRITERIA_CONFIGURATION[c.key];
31
+
32
+ if (!cfg) {
33
+ console.error("Missing criterion configuration for key", c.key);
34
+ throw new Error("Missing criterion configuration");
35
+ }
36
+
37
+ exps.push((0, _react.jsx)(_react2.default.Fragment, null, cfg.label, " ", (0, _react.jsx)("em", null, cfg.toSummary(cfg.fromQuery(c.query, opts), opts))));
38
+ }
39
+ }
40
+
41
+ let result;
42
+
43
+ if (exps.length < 1) {
44
+ result = (0, _react.jsx)(_react2.default.Fragment, null, "(no criteria)");
45
+ } else {
46
+ switch (cg.require) {
47
+ case 'all':
48
+ result = (0, _react.jsx)(_react2.default.Fragment, null, exps.reduce((acc, current, index) => [...acc, index ? ', ' : '', current], []));
49
+ break;
50
+
51
+ case 'any':
52
+ result = (0, _react.jsx)(_react2.default.Fragment, null, exps.reduce((acc, current, index) => [...acc, index ? ' or ' : '', current], []));
53
+ break;
54
+
55
+ case 'none':
56
+ result = (0, _react.jsx)(_react2.default.Fragment, null, "neither ", exps.reduce((acc, current, index) => [...acc, index ? ' nor ' : '', current], []));
57
+ break;
58
+ }
59
+ }
60
+
61
+ return result;
62
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criteriaGroupToSummary.js","sourceRoot":"","sources":["../../../src/views/FilterCriteria/criteriaGroupToSummary.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,EAA6B,eAAe,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,4BAA4B;AAG5B,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAiB,EAAE,IAAgB;IAChF,MAAM,IAAI,GAAkB,EAAE,CAAC;IAE/B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;QAC3B,IAAI,eAAe,CAAC,CAAC,CAAC,EAAE;YACtB,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;SAC5C;aAAM;YACL,MAAM,GAAG,GAAG,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC,GAAG,EAAE;gBACR,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;gBAChE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;aACpD;YACD,IAAI,CAAC,IAAI,CAAC;gBAAG,GAAG,CAAC,KAAK;;gBAAE,gBAAK,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAM,CAAG,CAAC,CAAC;SAC1F;KACF;IAED,IAAI,MAAmB,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACnB,MAAM,GAAG,0CAAkB,CAAC;KAC7B;SAAM;QACL,QAAQ,EAAE,CAAC,OAAO,EAAE;YAClB,KAAK,KAAK;gBACR,MAAM,GAAG,0BAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAmB,EAAE,OAAkB,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAI,CAAC;gBAClI,MAAM;YACR,KAAK,KAAK;gBACR,MAAM,GAAG,0BAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAmB,EAAE,OAAkB,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAI,CAAC;gBACpI,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,GAAG;;oBAAW,IAAI,CAAC,MAAM,CAAC,CAAC,GAAmB,EAAE,OAAkB,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAI,CAAC;gBAC7I,MAAM;SACT;KACF;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx } from '@emotion/react';\nimport React, { ReactNode, ReactNodeArray } from 'react';\nimport { CriteriaGroup, CommonOpts, isCriteriaGroup } from './models';\nimport { CRITERIA_CONFIGURATION } from \"./CRITERIA_CONFIGURATION\";\n\n/* Building query summary */\n\n\nexport default function criteriaGroupToSummary(cg: CriteriaGroup, opts: CommonOpts): JSX.Element {\n const exps: JSX.Element[] = [];\n\n for (const c of cg.criteria) {\n if (isCriteriaGroup(c)) {\n exps.push(criteriaGroupToSummary(c, opts));\n } else {\n const cfg = CRITERIA_CONFIGURATION[c.key];\n if (!cfg) {\n console.error(\"Missing criterion configuration for key\", c.key);\n throw new Error(\"Missing criterion configuration\");\n }\n exps.push(<>{cfg.label} <em>{cfg.toSummary(cfg.fromQuery(c.query, opts), opts)}</em></>);\n }\n }\n\n let result: JSX.Element;\n if (exps.length < 1) {\n result = <>(no criteria)</>;\n } else {\n switch (cg.require) {\n case 'all':\n result = <>{exps.reduce((acc: ReactNodeArray, current: ReactNode, index: number) => [...acc, index ? ', ' : '', current], [])}</>;\n break;\n case 'any':\n result = <>{exps.reduce((acc: ReactNodeArray, current: ReactNode, index: number) => [...acc, index ? ' or ' : '', current], [])}</>;\n break;\n case 'none':\n result = <>neither {exps.reduce((acc: ReactNodeArray, current: ReactNode, index: number) => [...acc, index ? ' nor ' : '', current], [])}</>;\n break;\n }\n }\n\n return result;\n}\n"]}
@@ -0,0 +1,24 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import { TreeNodeInfo } from '@blueprintjs/core';
4
+ import { ItemClassConfigurationSet, Subregisters } from '../../types';
5
+ import { CriteriaGroup, Criterion } from './models';
6
+ /**
7
+ * Builds Blueprint’s tree nodes given criteria,
8
+ * callbacks and relevant register configuration.
9
+ */
10
+ export default function criteriaToNodes(cs: (CriteriaGroup | Criterion)[], opts: {
11
+ path?: number[];
12
+ /** XXX: This seems to be obsolete. Don’t use, investigate for usefulness. */
13
+ implied?: true;
14
+ /**
15
+ * Called when criteria is being edited. `commit` is set to true
16
+ * when change should take effect.
17
+ */
18
+ onEditItem?: (parent: number[], idx: number, newItem: CriteriaGroup | Criterion, commit?: true) => void;
19
+ onDeleteItem?: (parent: number[], idx: number) => void;
20
+ onAddGroup?: (parent: number[]) => void;
21
+ itemClasses: ItemClassConfigurationSet;
22
+ availableClassIDs: string[];
23
+ subregisters?: Subregisters;
24
+ }): TreeNodeInfo[];