@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.
- package/common.d.ts +1 -1
- package/common.js +1 -1
- package/common.js.map +1 -1
- package/index.d.ts +3 -3
- package/index.js +3 -3
- package/index.js.map +1 -1
- package/package.json +26 -18
- package/types/cr.d.ts +216 -0
- package/types/cr.js +175 -0
- package/types/cr.js.map +1 -0
- package/types/index.d.ts +1 -0
- package/types/index.js +19 -0
- package/types/index.js.map +1 -1
- package/types/item.d.ts +13 -3
- package/types/item.js +11 -1
- package/types/item.js.map +1 -1
- package/types/proposal.d.ts +31 -14
- package/types/proposal.js +1 -1
- package/types/proposal.js.map +1 -1
- package/types/register.d.ts +6 -5
- package/types/register.js +19 -1
- package/types/register.js.map +1 -1
- package/types/registry.d.ts +8 -3
- package/types/registry.js +8 -1
- package/types/registry.js.map +1 -1
- package/types/stakeholder.d.ts +40 -16
- package/types/stakeholder.js +47 -3
- package/types/stakeholder.js.map +1 -1
- package/types/views.d.ts +98 -24
- package/types/views.js.map +1 -1
- package/views/AnnotatedChange.d.ts +7 -0
- package/views/AnnotatedChange.js +91 -0
- package/views/AnnotatedChange.js.map +1 -0
- package/views/BrowserCtx.d.ts +66 -2
- package/views/BrowserCtx.js +13 -2
- package/views/BrowserCtx.js.map +1 -1
- package/views/FilterCriteria/CRITERIA_CONFIGURATION.d.ts +17 -0
- package/views/FilterCriteria/CRITERIA_CONFIGURATION.js +202 -0
- package/views/FilterCriteria/CRITERIA_CONFIGURATION.js.map +1 -0
- package/views/FilterCriteria/criteriaGroupToQueryExpression.d.ts +6 -0
- package/views/FilterCriteria/criteriaGroupToQueryExpression.js +50 -0
- package/views/FilterCriteria/criteriaGroupToQueryExpression.js.map +1 -0
- package/views/FilterCriteria/criteriaGroupToSummary.d.ts +5 -0
- package/views/FilterCriteria/criteriaGroupToSummary.js +62 -0
- package/views/FilterCriteria/criteriaGroupToSummary.js.map +1 -0
- package/views/FilterCriteria/criteriaToNodes.d.ts +24 -0
- package/views/FilterCriteria/criteriaToNodes.js +159 -0
- package/views/FilterCriteria/criteriaToNodes.js.map +1 -0
- package/views/FilterCriteria/index.d.ts +23 -0
- package/views/FilterCriteria/index.js +130 -0
- package/views/FilterCriteria/index.js.map +1 -0
- package/views/FilterCriteria/models.d.ts +68 -0
- package/views/FilterCriteria/models.js +34 -0
- package/views/FilterCriteria/models.js.map +1 -0
- package/views/FilterCriteria/mutateGroup.d.ts +17 -0
- package/views/FilterCriteria/mutateGroup.js +59 -0
- package/views/FilterCriteria/mutateGroup.js.map +1 -0
- package/views/GenericRelatedItemView.d.ts +1 -1
- package/views/GenericRelatedItemView.js +143 -101
- package/views/GenericRelatedItemView.js.map +1 -1
- package/views/RegisterStakeholder.d.ts +9 -0
- package/views/RegisterStakeholder.js +40 -0
- package/views/RegisterStakeholder.js.map +1 -0
- package/views/RegisterVersion.d.ts +9 -0
- package/views/RegisterVersion.js +41 -0
- package/views/RegisterVersion.js.map +1 -0
- package/views/SearchQuery.d.ts +13 -0
- package/views/SearchQuery.js +137 -0
- package/views/SearchQuery.js.map +1 -0
- package/views/change-request/ChangeRequestContext.d.ts +20 -0
- package/views/change-request/ChangeRequestContext.js +56 -0
- package/views/change-request/ChangeRequestContext.js.map +1 -0
- package/views/change-request/Proposals.d.ts +21 -0
- package/views/change-request/Proposals.js +331 -0
- package/views/change-request/Proposals.js.map +1 -0
- package/views/change-request/objectChangeset.d.ts +31 -0
- package/views/change-request/objectChangeset.js +229 -0
- package/views/change-request/objectChangeset.js.map +1 -0
- package/views/detail/ChangeRequest/Proposal.d.ts +0 -0
- package/views/detail/ChangeRequest/Proposal.js +142 -0
- package/views/detail/ChangeRequest/Proposal.js.map +1 -0
- package/views/detail/ChangeRequest/index.d.ts +13 -0
- package/views/detail/ChangeRequest/index.js +207 -0
- package/views/detail/ChangeRequest/index.js.map +1 -0
- package/views/detail/ChangeRequest/transitions.d.ts +28 -0
- package/views/detail/ChangeRequest/transitions.js +530 -0
- package/views/detail/ChangeRequest/transitions.js.map +1 -0
- package/views/detail/CustomView/index.d.ts +13 -0
- package/views/detail/CustomView/index.js +68 -0
- package/views/detail/CustomView/index.js.map +1 -0
- package/views/detail/RegisterHome/index.d.ts +5 -0
- package/views/detail/RegisterHome/index.js +128 -0
- package/views/detail/RegisterHome/index.js.map +1 -0
- package/views/detail/RegisterItem/RelatedItems.d.ts +13 -0
- package/views/detail/RegisterItem/RelatedItems.js +61 -0
- package/views/detail/RegisterItem/RelatedItems.js.map +1 -0
- package/views/detail/RegisterItem/SupersedingItemMenu.d.ts +13 -0
- package/views/detail/RegisterItem/SupersedingItemMenu.js +56 -0
- package/views/detail/RegisterItem/SupersedingItemMenu.js.map +1 -0
- package/views/detail/RegisterItem/index.d.ts +13 -0
- package/views/detail/RegisterItem/index.js +356 -0
- package/views/detail/RegisterItem/index.js.map +1 -0
- package/views/detail/RegisterMeta/RegisterMetaForm.d.ts +10 -0
- package/views/detail/RegisterMeta/RegisterMetaForm.js +331 -0
- package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -0
- package/views/detail/RegisterMeta/index.d.ts +10 -0
- package/views/detail/RegisterMeta/index.js +111 -0
- package/views/detail/RegisterMeta/index.js.map +1 -0
- package/views/detail/index.d.ts +1 -0
- package/views/detail/index.js +24 -0
- package/views/detail/index.js.map +1 -0
- package/views/diffing/InlineDiff.d.ts +12 -0
- package/views/diffing/InlineDiff.js +58 -0
- package/views/diffing/InlineDiff.js.map +1 -0
- package/views/diffing/StructuredDiff.d.ts +11 -0
- package/views/diffing/StructuredDiff.js +65 -0
- package/views/diffing/StructuredDiff.js.map +1 -0
- package/views/hooks/useCustomView.d.ts +3 -0
- package/views/hooks/useCustomView.js +24 -0
- package/views/hooks/useCustomView.js.map +1 -0
- package/views/hooks/useItemClassConfig.d.ts +3 -0
- package/views/hooks/useItemClassConfig.js +24 -0
- package/views/hooks/useItemClassConfig.js.map +1 -0
- package/views/hooks/useItemRef.d.ts +3 -0
- package/views/hooks/useItemRef.js +39 -0
- package/views/hooks/useItemRef.js.map +1 -0
- package/views/hooks/useSingleRegisterItemData.d.ts +3 -0
- package/views/hooks/useSingleRegisterItemData.js +32 -0
- package/views/hooks/useSingleRegisterItemData.js.map +1 -0
- package/views/index.d.ts +2 -2
- package/views/index.js +161 -130
- package/views/index.js.map +1 -1
- package/views/itemPathUtils.d.ts +45 -2
- package/views/itemPathUtils.js +101 -14
- package/views/itemPathUtils.js.map +1 -1
- package/views/itemQueryUtils.d.ts +11 -0
- package/views/itemQueryUtils.js +48 -0
- package/views/itemQueryUtils.js.map +1 -0
- package/views/protocolRegistry.d.ts +12 -0
- package/views/protocolRegistry.js +42 -0
- package/views/protocolRegistry.js.map +1 -0
- package/views/sidebar/Browse/index.d.ts +11 -0
- package/views/sidebar/Browse/index.js +453 -0
- package/views/sidebar/Browse/index.js.map +1 -0
- package/views/sidebar/Export/index.d.ts +5 -0
- package/views/sidebar/Export/index.js +94 -0
- package/views/sidebar/Export/index.js.map +1 -0
- package/views/sidebar/ListItem.d.ts +10 -0
- package/views/sidebar/ListItem.js +43 -0
- package/views/sidebar/ListItem.js.map +1 -0
- package/views/sidebar/Registration/index.d.ts +5 -0
- package/views/sidebar/Registration/index.js +163 -0
- package/views/sidebar/Registration/index.js.map +1 -0
- package/views/sidebar/Search/index.d.ts +18 -0
- package/views/sidebar/Search/index.js +177 -0
- package/views/sidebar/Search/index.js.map +1 -0
- package/views/sidebar/index.d.ts +6 -0
- package/views/sidebar/index.js +104 -0
- package/views/sidebar/index.js.map +1 -0
- package/views/util.d.ts +29 -5
- package/views/util.js +92 -6
- package/views/util.js.map +1 -1
- package/views/ChangeRequest.d.ts +0 -12
- package/views/ChangeRequest.js +0 -689
- package/views/ChangeRequest.js.map +0 -1
- package/views/FilterCriteria.d.ts +0 -27
- package/views/FilterCriteria.js +0 -410
- package/views/FilterCriteria.js.map +0 -1
- package/views/ItemBrowser.d.ts +0 -12
- package/views/ItemBrowser.js +0 -255
- package/views/ItemBrowser.js.map +0 -1
- package/views/ItemDetails.d.ts +0 -14
- package/views/ItemDetails.js +0 -128
- package/views/ItemDetails.js.map +0 -1
- package/views/MainView.d.ts +0 -8
- package/views/MainView.js +0 -34
- package/views/MainView.js.map +0 -1
- package/views/RegisterInformation.d.ts +0 -7
- package/views/RegisterInformation.js +0 -264
- package/views/RegisterInformation.js.map +0 -1
- package/views/RegisterItemGrid.d.ts +0 -25
- package/views/RegisterItemGrid.js +0 -248
- package/views/RegisterItemGrid.js.map +0 -1
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = criteriaToNodes;
|
|
7
|
+
|
|
8
|
+
var _react = require("@emotion/react");
|
|
9
|
+
|
|
10
|
+
var _react2 = _interopRequireDefault(require("react"));
|
|
11
|
+
|
|
12
|
+
var _core = require("@blueprintjs/core");
|
|
13
|
+
|
|
14
|
+
var _PropertyView = require("@riboseinc/paneron-extension-kit/widgets/Sidebar/PropertyView");
|
|
15
|
+
|
|
16
|
+
var _models = require("./models");
|
|
17
|
+
|
|
18
|
+
var _index = require("./index");
|
|
19
|
+
|
|
20
|
+
var _CRITERIA_CONFIGURATION = require("./CRITERIA_CONFIGURATION");
|
|
21
|
+
|
|
22
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
+
|
|
24
|
+
/** @jsx jsx */
|
|
25
|
+
|
|
26
|
+
/** @jsxFrag React.Fragment */
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Builds Blueprint’s tree nodes given criteria,
|
|
30
|
+
* callbacks and relevant register configuration.
|
|
31
|
+
*/
|
|
32
|
+
function criteriaToNodes(cs, opts) {
|
|
33
|
+
const path = opts.path ?? [];
|
|
34
|
+
return [...cs.entries()].map(([idx, c]) => {
|
|
35
|
+
const isRoot = path.length < 1;
|
|
36
|
+
const defaultIcon = isRoot && opts.implied === true ? 'manual' : undefined;
|
|
37
|
+
const disabled = opts.implied === true;
|
|
38
|
+
const deleteButton = idx < cs.length - 1 && opts.onDeleteItem ? (0, _react.jsx)(_core.Button, {
|
|
39
|
+
minimal: true,
|
|
40
|
+
small: true,
|
|
41
|
+
onClick: () => opts.onDeleteItem(path, idx),
|
|
42
|
+
title: "Delete this criterion or criteria block",
|
|
43
|
+
disabled: isRoot,
|
|
44
|
+
icon: "cross"
|
|
45
|
+
}) : null;
|
|
46
|
+
const addGroupButton = opts.onAddGroup ? (0, _react.jsx)(_core.Button, {
|
|
47
|
+
minimal: true,
|
|
48
|
+
small: true,
|
|
49
|
+
title: "Add nested criteria block",
|
|
50
|
+
icon: "add-to-artifact",
|
|
51
|
+
onClick: () => opts.onAddGroup([...path, idx])
|
|
52
|
+
}) : null;
|
|
53
|
+
|
|
54
|
+
if ((0, _models.isCriteriaGroup)(c)) {
|
|
55
|
+
// Render criteria group recursively
|
|
56
|
+
const cg = c;
|
|
57
|
+
return {
|
|
58
|
+
id: `${path.join('-')}-${idx}-${opts.implied}`,
|
|
59
|
+
disabled,
|
|
60
|
+
hasCaret: true,
|
|
61
|
+
isExpanded: true,
|
|
62
|
+
icon: defaultIcon,
|
|
63
|
+
label: (0, _react.jsx)(_index.CriteriaGroupLabel, {
|
|
64
|
+
css: (0, _react.css)`margin: 2.5px 0`,
|
|
65
|
+
criteriaGroup: cg,
|
|
66
|
+
onUpdate: opts.onEditItem ? op => opts.onEditItem(path, idx, { ...cg,
|
|
67
|
+
require: op
|
|
68
|
+
}, true) : undefined
|
|
69
|
+
}),
|
|
70
|
+
secondaryLabel: (0, _react.jsx)(_core.ButtonGroup, null, opts.implied && isRoot ? (0, _react.jsx)(_react2.default.Fragment, null, "(implied)") : null, addGroupButton, deleteButton),
|
|
71
|
+
childNodes: criteriaToNodes(opts.onEditItem ? [...cg.criteria, {
|
|
72
|
+
key: 'custom',
|
|
73
|
+
query: ''
|
|
74
|
+
}] : cg.criteria, { ...opts,
|
|
75
|
+
path: [...path, idx]
|
|
76
|
+
})
|
|
77
|
+
};
|
|
78
|
+
} else {
|
|
79
|
+
// Render leaf criterion
|
|
80
|
+
const ci = c;
|
|
81
|
+
const {
|
|
82
|
+
subregisters,
|
|
83
|
+
itemClasses
|
|
84
|
+
} = opts;
|
|
85
|
+
|
|
86
|
+
if (!(0, _models.isCriteriaKey)(ci.key)) {
|
|
87
|
+
console.error("Invalid criteria key encountered", ci.key);
|
|
88
|
+
throw new Error("Invalid criteria key encountered");
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const cfg = _CRITERIA_CONFIGURATION.CRITERIA_CONFIGURATION[ci.key];
|
|
92
|
+
|
|
93
|
+
if (!cfg) {
|
|
94
|
+
console.error("Missing criterion configuration for key", ci.key);
|
|
95
|
+
throw new Error("Missing criterion configuration");
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const Widget = cfg.widget;
|
|
99
|
+
const data = cfg.fromQuery(ci.query, {
|
|
100
|
+
subregisters,
|
|
101
|
+
itemClasses
|
|
102
|
+
});
|
|
103
|
+
const criterionTypeOptions = Object.entries(_CRITERIA_CONFIGURATION.CRITERIA_CONFIGURATION).map(([key, cfg]) => {
|
|
104
|
+
return {
|
|
105
|
+
value: key,
|
|
106
|
+
label: cfg.label
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
const isPlaceholder = ci.key === 'custom' && ci.query === '';
|
|
110
|
+
const label = isPlaceholder ? (0, _react.jsx)(_core.Button, {
|
|
111
|
+
small: true,
|
|
112
|
+
minimal: true,
|
|
113
|
+
icon: "plus",
|
|
114
|
+
onClick: () => opts.onEditItem(path, idx, {
|
|
115
|
+
key: 'custom',
|
|
116
|
+
query: cfg.toQuery({
|
|
117
|
+
customExpression: 'false'
|
|
118
|
+
}, {
|
|
119
|
+
subregisters,
|
|
120
|
+
itemClasses
|
|
121
|
+
})
|
|
122
|
+
}, true)
|
|
123
|
+
}, "criteria") : (0, _react.jsx)(_core.ControlGroup, {
|
|
124
|
+
vertical: true,
|
|
125
|
+
css: (0, _react.css)`margin-bottom: 2.5px;`
|
|
126
|
+
}, (0, _react.jsx)(_PropertyView.Select, {
|
|
127
|
+
options: criterionTypeOptions,
|
|
128
|
+
value: ci.key,
|
|
129
|
+
disabled: !opts.onEditItem,
|
|
130
|
+
onChange: opts.onEditItem ? evt => {
|
|
131
|
+
if (evt.currentTarget.value !== '' && (0, _models.isCriteriaKey)(evt.currentTarget.value)) {
|
|
132
|
+
opts.onEditItem(path, idx, {
|
|
133
|
+
key: evt.currentTarget.value,
|
|
134
|
+
query: ''
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
} : undefined
|
|
138
|
+
}), (0, _react.jsx)(Widget, {
|
|
139
|
+
itemClasses: opts.itemClasses,
|
|
140
|
+
availableClassIDs: opts.availableClassIDs,
|
|
141
|
+
subregisters: opts.subregisters,
|
|
142
|
+
data: data,
|
|
143
|
+
onChange: val => opts.onEditItem(path, idx, {
|
|
144
|
+
key: ci.key,
|
|
145
|
+
query: cfg.toQuery(val, {
|
|
146
|
+
subregisters,
|
|
147
|
+
itemClasses
|
|
148
|
+
})
|
|
149
|
+
}, true)
|
|
150
|
+
}));
|
|
151
|
+
return {
|
|
152
|
+
id: `${path.join('-')}-${idx}-${opts.implied ? 'implied' : ''}`,
|
|
153
|
+
disabled,
|
|
154
|
+
label,
|
|
155
|
+
secondaryLabel: (0, _react.jsx)(_core.ButtonGroup, null, deleteButton)
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"criteriaToNodes.js","sourceRoot":"","sources":["../../../src/views/FilterCriteria/criteriaToNodes.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,WAAW,EAA6B,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,MAAM,EAAE,MAAM,+DAA+D,CAAC;AAEvF,OAAO,EAA4B,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,EAAiC,EACjC,IAiBC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAE7B,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAgB,EAAE;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;YACjD,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;QACvC,MAAM,YAAY,GAChB,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY;YACxC,CAAC,CAAC,IAAC,MAAM,IAAC,OAAO,QAAC,KAAK,QACnB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAa,CAAC,IAAI,EAAE,GAAG,CAAC,EAC5C,KAAK,EAAC,yCAAyC,EAC/C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAC,OAAO,GAAG;YACnB,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,cAAc,GAAuB,IAAI,CAAC,UAAU;YACxD,CAAC,CAAC,IAAC,MAAM,IACL,OAAO,QACP,KAAK,QACL,KAAK,EAAC,2BAA2B,EACjC,IAAI,EAAC,iBAAiB,EACtB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAW,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,GAAI;YACvD,CAAC,CAAC,IAAI,CAAC;QAET,IAAI,eAAe,CAAC,CAAC,CAAC,EAAE;YAEtB,oCAAoC;YAEpC,MAAM,EAAE,GAAG,CAAkB,CAAC;YAC9B,OAAO;gBACL,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE;gBAC9C,QAAQ;gBACR,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,IAAC,kBAAkB,IACxB,GAAG,EAAE,GAAG,CAAA,iBAAiB,EACzB,aAAa,EAAE,EAAE,EACjB,QAAQ,EAAE,IAAI,CAAC,UAAU;wBACvB,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,UAAW,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;wBACrE,CAAC,CAAC,SAAS,GAAI;gBACnB,cAAc,EAAE,IAAC,WAAW;oBACzB,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,sCAAc,CAAC,CAAC,CAAC,IAAI;oBAC9C,cAAc;oBACd,YAAY,CACD;gBACd,UAAU,EAAE,eAAe,CACzB,IAAI,CAAC,UAAU;oBACb,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;oBAChD,CAAC,CAAC,EAAE,CAAC,QAAQ,EACf,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;aACrC,CAAC;SAEH;aAAM;YAEL,wBAAwB;YAExB,MAAM,EAAE,GAAG,CAAc,CAAC;YAC1B,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;YAC3C,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;gBAC1B,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;aACrD;YACD,MAAM,GAAG,GAAG,sBAAsB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,GAAG,EAAE;gBACR,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;aACpD;YACD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;YACpE,MAAM,oBAAoB,GAAkB,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC;gBAChF,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;gBACjB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;YAC1C,CAAC,CAAC,CAAC;YACL,MAAM,aAAa,GAAG,EAAE,CAAC,GAAG,KAAK,QAAQ,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,aAAa;gBACzB,CAAC,CAAC,IAAC,MAAM,IACH,KAAK,QACL,OAAO,QACP,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAW,CAC7B,IAAI,EACJ,GAAG,EACH,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,EAAE,EACnG,IAAI,CAAC,eAEF;gBACX,CAAC,CAAC,IAAC,YAAY,IAAC,QAAQ,QAAC,GAAG,EAAE,GAAG,CAAA,uBAAuB;oBACpD,IAAC,MAAM,IACL,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,EAAE,CAAC,GAAG,EACb,QAAQ,EAAE,CAAC,IAAI,CAAC,UAAU,EAC1B,QAAQ,EAAE,IAAI,CAAC,UAAU;4BACvB,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE;gCACR,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,KAAK,EAAE,IAAI,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;oCAC5E,IAAI,CAAC,UAAW,CACd,IAAI,EACJ,GAAG,EACH,EAAE,GAAG,EAAE,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAC5C,CAAC;iCACH;4BACH,CAAC;4BACD,CAAC,CAAC,SAAS,GAAI;oBACnB,IAAC,MAAM,IACL,WAAW,EAAE,IAAI,CAAC,WAAW,EAC7B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EACzC,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,UAAW,CACjC,IAAI,EACJ,GAAG,EACH,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,EAAE,EACvE,IAAI,CAAC,GAAI,CACA,CAAC;YACpB,OAAO;gBACL,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/D,QAAQ;gBACR,KAAK;gBACL,cAAc,EAAE,IAAC,WAAW,QACzB,YAAY,CACD;aACf,CAAC;SAEH;IAEH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx, css } from '@emotion/react';\nimport React from 'react';\nimport { Button, ButtonGroup, OptionProps, TreeNodeInfo, ControlGroup } from '@blueprintjs/core';\nimport { Select } from '@riboseinc/paneron-extension-kit/widgets/Sidebar/PropertyView';\nimport { ItemClassConfigurationSet, Subregisters } from '../../types';\nimport { CriteriaGroup, Criterion, isCriteriaGroup, isCriteriaKey } from './models';\nimport { CriteriaGroupLabel } from './index';\nimport { CRITERIA_CONFIGURATION } from './CRITERIA_CONFIGURATION';\n\n\n/**\n * Builds Blueprint’s tree nodes given criteria,\n * callbacks and relevant register configuration.\n */\nexport default function criteriaToNodes(\n cs: (CriteriaGroup | Criterion)[],\n opts: {\n path?: number[];\n\n /** XXX: This seems to be obsolete. Don’t use, investigate for usefulness. */\n implied?: true;\n\n /**\n * Called when criteria is being edited. `commit` is set to true\n * when change should take effect.\n */\n onEditItem?: (parent: number[], idx: number, newItem: CriteriaGroup | Criterion, commit?: true) => void;\n onDeleteItem?: (parent: number[], idx: number) => void;\n onAddGroup?: (parent: number[]) => void;\n\n itemClasses: ItemClassConfigurationSet;\n availableClassIDs: string[];\n subregisters?: Subregisters;\n }): TreeNodeInfo[] {\n const path = opts.path ?? [];\n\n return [...cs.entries()].map(([idx, c]): TreeNodeInfo => {\n const isRoot = path.length < 1;\n const defaultIcon = isRoot && opts.implied === true\n ? 'manual'\n : undefined;\n\n const disabled = opts.implied === true;\n const deleteButton: JSX.Element | null =\n idx < (cs.length - 1) && opts.onDeleteItem\n ? <Button minimal small\n onClick={() => opts.onDeleteItem!(path, idx)}\n title=\"Delete this criterion or criteria block\"\n disabled={isRoot}\n icon=\"cross\" />\n : null;\n const addGroupButton: JSX.Element | null = opts.onAddGroup\n ? <Button\n minimal\n small\n title=\"Add nested criteria block\"\n icon=\"add-to-artifact\"\n onClick={() => opts.onAddGroup!([...path, idx])} />\n : null;\n\n if (isCriteriaGroup(c)) {\n\n // Render criteria group recursively\n\n const cg = c as CriteriaGroup;\n return {\n id: `${path.join('-')}-${idx}-${opts.implied}`,\n disabled,\n hasCaret: true,\n isExpanded: true,\n icon: defaultIcon,\n label: <CriteriaGroupLabel\n css={css`margin: 2.5px 0`}\n criteriaGroup={cg}\n onUpdate={opts.onEditItem\n ? ((op) => opts.onEditItem!(path, idx, { ...cg, require: op }, true))\n : undefined} />,\n secondaryLabel: <ButtonGroup>\n {opts.implied && isRoot ? <>(implied)</> : null}\n {addGroupButton}\n {deleteButton}\n </ButtonGroup>,\n childNodes: criteriaToNodes(\n opts.onEditItem\n ? [...cg.criteria, { key: 'custom', query: '' }]\n : cg.criteria,\n { ...opts, path: [...path, idx] }),\n };\n\n } else {\n\n // Render leaf criterion\n\n const ci = c as Criterion;\n const { subregisters, itemClasses } = opts;\n if (!isCriteriaKey(ci.key)) {\n console.error(\"Invalid criteria key encountered\", ci.key);\n throw new Error(\"Invalid criteria key encountered\");\n }\n const cfg = CRITERIA_CONFIGURATION[ci.key];\n if (!cfg) {\n console.error(\"Missing criterion configuration for key\", ci.key);\n throw new Error(\"Missing criterion configuration\");\n }\n const Widget = cfg.widget;\n const data = cfg.fromQuery(ci.query, { subregisters, itemClasses });\n const criterionTypeOptions: OptionProps[] = Object.entries(CRITERIA_CONFIGURATION).\n map(([key, cfg]) => {\n return { value: key, label: cfg.label };\n });\n const isPlaceholder = ci.key === 'custom' && ci.query === '';\n const label = isPlaceholder\n ? <Button\n small\n minimal\n icon=\"plus\"\n onClick={() => opts.onEditItem!(\n path,\n idx,\n { key: 'custom', query: cfg.toQuery({ customExpression: 'false' }, { subregisters, itemClasses }) },\n true)}>\n criteria\n </Button>\n : <ControlGroup vertical css={css`margin-bottom: 2.5px;`}>\n <Select\n options={criterionTypeOptions}\n value={ci.key}\n disabled={!opts.onEditItem}\n onChange={opts.onEditItem\n ? (evt) => {\n if (evt.currentTarget.value !== '' && isCriteriaKey(evt.currentTarget.value)) {\n opts.onEditItem!(\n path,\n idx,\n { key: evt.currentTarget.value, query: '' }\n );\n }\n }\n : undefined} />\n <Widget\n itemClasses={opts.itemClasses}\n availableClassIDs={opts.availableClassIDs}\n subregisters={opts.subregisters}\n data={data}\n onChange={(val) => opts.onEditItem!(\n path,\n idx,\n { key: ci.key, query: cfg.toQuery(val, { subregisters, itemClasses }) },\n true)} />\n </ControlGroup>;\n return {\n id: `${path.join('-')}-${idx}-${opts.implied ? 'implied' : ''}`,\n disabled,\n label,\n secondaryLabel: <ButtonGroup>\n {deleteButton}\n </ButtonGroup>,\n };\n\n }\n\n });\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
/** @jsxFrag React.Fragment */
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { ItemClassConfigurationSet, Subregisters } from '../../types';
|
|
5
|
+
import { CriteriaGroup, CompositionOperator } from './models';
|
|
6
|
+
export declare const SUBREGISTER_PATH_PREFIX = "/subregisters/";
|
|
7
|
+
interface CriteriaTreeProps {
|
|
8
|
+
impliedCriteria?: CriteriaGroup;
|
|
9
|
+
criteria: CriteriaGroup;
|
|
10
|
+
onChange?: (criteria: CriteriaGroup) => void;
|
|
11
|
+
className?: string;
|
|
12
|
+
availableClassIDs: string[];
|
|
13
|
+
itemClasses: ItemClassConfigurationSet;
|
|
14
|
+
subregisters?: Subregisters;
|
|
15
|
+
}
|
|
16
|
+
export declare const CriteriaTree: React.FC<CriteriaTreeProps>;
|
|
17
|
+
export default CriteriaTree;
|
|
18
|
+
interface CriteriaGroupLabelProps {
|
|
19
|
+
criteriaGroup: CriteriaGroup;
|
|
20
|
+
onUpdate?: (op: CompositionOperator) => void;
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const CriteriaGroupLabel: React.FC<CriteriaGroupLabelProps>;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.CriteriaGroupLabel = exports.default = exports.CriteriaTree = exports.SUBREGISTER_PATH_PREFIX = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = require("@emotion/react");
|
|
9
|
+
|
|
10
|
+
var _react2 = require("react");
|
|
11
|
+
|
|
12
|
+
var _core = require("@blueprintjs/core");
|
|
13
|
+
|
|
14
|
+
var _models = require("./models");
|
|
15
|
+
|
|
16
|
+
var _mutateGroup = _interopRequireDefault(require("./mutateGroup"));
|
|
17
|
+
|
|
18
|
+
var _criteriaToNodes = _interopRequireDefault(require("./criteriaToNodes"));
|
|
19
|
+
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
+
|
|
22
|
+
/** @jsx jsx */
|
|
23
|
+
|
|
24
|
+
/** @jsxFrag React.Fragment */
|
|
25
|
+
const SUBREGISTER_PATH_PREFIX = '/subregisters/';
|
|
26
|
+
exports.SUBREGISTER_PATH_PREFIX = SUBREGISTER_PATH_PREFIX;
|
|
27
|
+
|
|
28
|
+
const CriteriaTree = function ({
|
|
29
|
+
criteria,
|
|
30
|
+
impliedCriteria,
|
|
31
|
+
onChange,
|
|
32
|
+
availableClassIDs,
|
|
33
|
+
itemClasses,
|
|
34
|
+
subregisters,
|
|
35
|
+
className
|
|
36
|
+
}) {
|
|
37
|
+
const [crit, updateCriteria] = (0, _react2.useState)(criteria);
|
|
38
|
+
(0, _react2.useEffect)(() => {
|
|
39
|
+
updateCriteria(criteria);
|
|
40
|
+
}, [JSON.stringify(criteria)]);
|
|
41
|
+
|
|
42
|
+
function onAddGroup(parent) {
|
|
43
|
+
const p = reverseArray(parent);
|
|
44
|
+
var newCriteria = JSON.parse(JSON.stringify([crit]));
|
|
45
|
+
const newGroup = (0, _models.makeBlankCriteria)();
|
|
46
|
+
(0, _mutateGroup.default)(newCriteria, p, {
|
|
47
|
+
action: 'insert',
|
|
48
|
+
item: newGroup
|
|
49
|
+
});
|
|
50
|
+
updateCriteria(newCriteria[0]);
|
|
51
|
+
onChange(newCriteria[0]);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function onDelete(parent, idx) {
|
|
55
|
+
const p = reverseArray(parent);
|
|
56
|
+
var newCriteria = JSON.parse(JSON.stringify([crit]));
|
|
57
|
+
(0, _mutateGroup.default)(newCriteria, p, {
|
|
58
|
+
action: 'delete',
|
|
59
|
+
idx
|
|
60
|
+
});
|
|
61
|
+
updateCriteria(newCriteria[0]);
|
|
62
|
+
onChange(newCriteria[0]);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function onEditItem(parent, idx, newItem, commit) {
|
|
66
|
+
const p = reverseArray(parent);
|
|
67
|
+
var newCriteria = JSON.parse(JSON.stringify([crit]));
|
|
68
|
+
(0, _mutateGroup.default)(newCriteria, p, {
|
|
69
|
+
action: 'edit',
|
|
70
|
+
idx,
|
|
71
|
+
item: newItem
|
|
72
|
+
});
|
|
73
|
+
updateCriteria(newCriteria[0]);
|
|
74
|
+
|
|
75
|
+
if (commit) {
|
|
76
|
+
onChange(newCriteria[0]);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const nodes = (0, _criteriaToNodes.default)([crit], {
|
|
81
|
+
onEditItem: onChange ? onEditItem : undefined,
|
|
82
|
+
onAddGroup: onChange ? onAddGroup : undefined,
|
|
83
|
+
onDeleteItem: onChange ? onDelete : undefined,
|
|
84
|
+
itemClasses,
|
|
85
|
+
subregisters,
|
|
86
|
+
availableClassIDs
|
|
87
|
+
});
|
|
88
|
+
const implied = impliedCriteria !== undefined ? (0, _criteriaToNodes.default)([impliedCriteria], {
|
|
89
|
+
implied: true,
|
|
90
|
+
itemClasses,
|
|
91
|
+
subregisters,
|
|
92
|
+
availableClassIDs
|
|
93
|
+
}) : [];
|
|
94
|
+
return (0, _react.jsx)(_core.Tree, {
|
|
95
|
+
contents: [...implied, ...nodes],
|
|
96
|
+
className: className,
|
|
97
|
+
css: (0, _react.css)`
|
|
98
|
+
.bp4-tree-node-content { height: unset; }
|
|
99
|
+
.bp4-tree-node-label { overflow: unset; }
|
|
100
|
+
.bp4-tree-node-caret, .bp4-tree-node-caret-none { display: none; }
|
|
101
|
+
`
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
exports.CriteriaTree = CriteriaTree;
|
|
106
|
+
var _default = CriteriaTree;
|
|
107
|
+
exports.default = _default;
|
|
108
|
+
|
|
109
|
+
const CriteriaGroupLabel = function ({
|
|
110
|
+
criteriaGroup,
|
|
111
|
+
onUpdate,
|
|
112
|
+
className
|
|
113
|
+
}) {
|
|
114
|
+
return (0, _react.jsx)("div", {
|
|
115
|
+
className: className
|
|
116
|
+
}, onUpdate ? (0, _react.jsx)(_core.ButtonGroup, null, _models.COMPOSITION_OPERATORS.map(op => (0, _react.jsx)(_core.Button, {
|
|
117
|
+
key: op,
|
|
118
|
+
small: true,
|
|
119
|
+
onClick: () => onUpdate ? onUpdate(op) : void 0,
|
|
120
|
+
active: criteriaGroup.require === op
|
|
121
|
+
}, op))) : (0, _react.jsx)("strong", null, criteriaGroup.require), " ", "of:");
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
exports.CriteriaGroupLabel = CriteriaGroupLabel;
|
|
125
|
+
|
|
126
|
+
function reverseArray(arr) {
|
|
127
|
+
var copy = JSON.parse(JSON.stringify(arr));
|
|
128
|
+
copy.reverse();
|
|
129
|
+
return copy;
|
|
130
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/FilterCriteria/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx, css } from '@emotion/react';\nimport React, { useEffect, useState } from 'react';\nimport { Button, ButtonGroup, TreeNodeInfo, Tree } from '@blueprintjs/core';\nimport { ItemClassConfigurationSet, Subregisters } from '../../types';\nimport { CriteriaGroup, makeBlankCriteria, Criterion, CompositionOperator, COMPOSITION_OPERATORS } from './models';\nimport mutateGroup from './mutateGroup';\nimport criteriaToNodes from './criteriaToNodes';\n\n\nexport const SUBREGISTER_PATH_PREFIX = '/subregisters/';\n\n\ninterface CriteriaTreeProps {\n impliedCriteria?: CriteriaGroup\n criteria: CriteriaGroup\n onChange?: (criteria: CriteriaGroup) => void\n className?: string\n availableClassIDs: string[]\n\n // TODO: move to context\n itemClasses: ItemClassConfigurationSet\n subregisters?: Subregisters\n}\n\n\nexport const CriteriaTree: React.FC<CriteriaTreeProps> =\nfunction ({ criteria, impliedCriteria, onChange, availableClassIDs, itemClasses, subregisters, className }) {\n const [crit, updateCriteria] = useState<CriteriaGroup>(criteria);\n\n useEffect(() => {\n updateCriteria(criteria);\n }, [JSON.stringify(criteria)]);\n\n function onAddGroup(parent: number[]) {\n const p = reverseArray(parent);\n var newCriteria = JSON.parse(JSON.stringify([crit]));\n const newGroup: CriteriaGroup = makeBlankCriteria();\n mutateGroup(newCriteria, p, { action: 'insert', item: newGroup });\n updateCriteria(newCriteria[0]);\n onChange!(newCriteria[0]);\n }\n\n function onDelete(parent: number[], idx: number) {\n const p = reverseArray(parent);\n var newCriteria = JSON.parse(JSON.stringify([crit]));\n mutateGroup(newCriteria, p, { action: 'delete', idx });\n updateCriteria(newCriteria[0]);\n onChange!(newCriteria[0]);\n }\n\n function onEditItem(parent: number[], idx: number, newItem: CriteriaGroup | Criterion, commit?: true) {\n const p = reverseArray(parent);\n var newCriteria = JSON.parse(JSON.stringify([crit]));\n mutateGroup(newCriteria, p, { action: 'edit', idx, item: newItem });\n updateCriteria(newCriteria[0]);\n if (commit) {\n onChange!(newCriteria[0]);\n }\n }\n\n const nodes: TreeNodeInfo[] = criteriaToNodes([crit], {\n onEditItem: onChange ? onEditItem : undefined,\n onAddGroup: onChange ? onAddGroup : undefined,\n onDeleteItem: onChange ? onDelete : undefined,\n itemClasses,\n subregisters,\n availableClassIDs,\n });\n\n const implied: TreeNodeInfo[] = impliedCriteria !== undefined\n ? criteriaToNodes([impliedCriteria], {\n implied: true,\n itemClasses,\n subregisters,\n availableClassIDs,\n })\n : [];\n\n return (\n <Tree\n contents={[ ...implied, ...nodes ]}\n className={className}\n css={css`\n .bp4-tree-node-content { height: unset; }\n .bp4-tree-node-label { overflow: unset; }\n .bp4-tree-node-caret, .bp4-tree-node-caret-none { display: none; }\n `}\n />\n );\n}\n\nexport default CriteriaTree;\n\n\n/* Displaying criteria group labels */\n\ninterface CriteriaGroupLabelProps {\n criteriaGroup: CriteriaGroup\n onUpdate?: (op: CompositionOperator) => void\n className?: string\n}\nexport const CriteriaGroupLabel: React.FC<CriteriaGroupLabelProps> =\nfunction ({ criteriaGroup, onUpdate, className }) {\n return <div className={className}>\n {onUpdate\n ? <ButtonGroup>\n {COMPOSITION_OPERATORS.map(op =>\n <Button\n key={op}\n small\n onClick={() => onUpdate ? onUpdate(op) : void 0}\n active={criteriaGroup.require === op}>\n {op}\n </Button>\n )}\n </ButtonGroup>\n : <strong>{criteriaGroup.require}</strong>}\n {\" \"}\n of:\n </div>;\n}\n\n\nfunction reverseArray<T>(arr: T[]): T[] {\n var copy = JSON.parse(JSON.stringify(arr));\n copy.reverse();\n return copy;\n}\n"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
import { IconName } from '@blueprintjs/core';
|
|
3
|
+
import type { ItemClassConfigurationSet, Subregisters } from '../../types';
|
|
4
|
+
/**
|
|
5
|
+
* Defines how to display a search criterion.
|
|
6
|
+
* T: criteria data structure.
|
|
7
|
+
*/
|
|
8
|
+
export interface CriterionConfiguration<T extends Record<string, any>> {
|
|
9
|
+
icon?: IconName;
|
|
10
|
+
label: string;
|
|
11
|
+
/**
|
|
12
|
+
* Widget that displays and optionally allows editing
|
|
13
|
+
* criteria data structure.
|
|
14
|
+
*/
|
|
15
|
+
widget: CriteriaWidget<T>;
|
|
16
|
+
/**
|
|
17
|
+
* Determines whether to enable this search criteria based on
|
|
18
|
+
* registry configuration.
|
|
19
|
+
*/
|
|
20
|
+
isEnabled?: (opts: CommonOpts) => boolean;
|
|
21
|
+
/** Summarizes criteria in a human-readable way. */
|
|
22
|
+
toSummary: (data: T, opts: CommonOpts) => string | JSX.Element;
|
|
23
|
+
/**
|
|
24
|
+
* Coverts criteria structure to a string
|
|
25
|
+
* that can be passed to filtering backend.
|
|
26
|
+
*/
|
|
27
|
+
toQuery: (data: T, opts: CommonOpts) => string;
|
|
28
|
+
/** Converts a query string to criteria structure. */
|
|
29
|
+
fromQuery: (query: string, opts: CommonOpts) => T;
|
|
30
|
+
}
|
|
31
|
+
export declare type CriteriaConfiguration = {
|
|
32
|
+
[key in CriterionKey]: CriterionConfiguration<Record<string, unknown>>;
|
|
33
|
+
};
|
|
34
|
+
export declare type CriteriaTransformer = (existing: CriteriaGroup) => CriteriaGroup;
|
|
35
|
+
export declare const COMPOSITION_OPERATORS: readonly ["all", "any", "none"];
|
|
36
|
+
export declare type CompositionOperator = typeof COMPOSITION_OPERATORS[number];
|
|
37
|
+
declare const CRITERIA_KEYS: readonly ["item-class", "subregister", "custom", "raw-substring"];
|
|
38
|
+
declare type CriterionKey = typeof CRITERIA_KEYS[number];
|
|
39
|
+
export declare function isCriteriaKey(val: string): val is CriterionKey;
|
|
40
|
+
declare type CriteriaWidget<T extends Record<string, any>> = React.FC<{
|
|
41
|
+
data: T;
|
|
42
|
+
onChange?: (newData: T) => void;
|
|
43
|
+
availableClassIDs: string[];
|
|
44
|
+
itemClasses: ItemClassConfigurationSet;
|
|
45
|
+
subregisters?: Subregisters;
|
|
46
|
+
className?: string;
|
|
47
|
+
style?: React.CSSProperties;
|
|
48
|
+
}>;
|
|
49
|
+
export interface Criterion {
|
|
50
|
+
/** Specific criterion as a string. */
|
|
51
|
+
query: string;
|
|
52
|
+
/** Key in criteria configuration that defines how to work with this criterion. */
|
|
53
|
+
key: CriterionKey;
|
|
54
|
+
}
|
|
55
|
+
/** Register metadata that may be needed to display filter criteria. */
|
|
56
|
+
export interface CommonOpts {
|
|
57
|
+
subregisters?: Subregisters;
|
|
58
|
+
itemClasses: ItemClassConfigurationSet;
|
|
59
|
+
}
|
|
60
|
+
export interface CriteriaGroup {
|
|
61
|
+
require: 'all' | 'any' | 'none';
|
|
62
|
+
criteria: (CriteriaGroup | Criterion)[];
|
|
63
|
+
}
|
|
64
|
+
export declare function isCriteriaGroup(val: any): val is CriteriaGroup;
|
|
65
|
+
export declare function makeBlankCriteria(): CriteriaGroup;
|
|
66
|
+
/** Useful as no-op default where a valid criteria is required. */
|
|
67
|
+
export declare const BLANK_CRITERIA: CriteriaGroup;
|
|
68
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isCriteriaKey = isCriteriaKey;
|
|
7
|
+
exports.isCriteriaGroup = isCriteriaGroup;
|
|
8
|
+
exports.makeBlankCriteria = makeBlankCriteria;
|
|
9
|
+
exports.BLANK_CRITERIA = exports.COMPOSITION_OPERATORS = void 0;
|
|
10
|
+
const COMPOSITION_OPERATORS = ['all', 'any', 'none']; // TODO: Can we not hard-code keys here? Would require some smart generic typing.
|
|
11
|
+
|
|
12
|
+
exports.COMPOSITION_OPERATORS = COMPOSITION_OPERATORS;
|
|
13
|
+
const CRITERIA_KEYS = ['item-class', 'subregister', 'custom', 'raw-substring'];
|
|
14
|
+
|
|
15
|
+
function isCriteriaKey(val) {
|
|
16
|
+
return CRITERIA_KEYS.indexOf(val) >= 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function isCriteriaGroup(val) {
|
|
20
|
+
return val && val.hasOwnProperty('require') && val.hasOwnProperty('criteria');
|
|
21
|
+
} // TODO: Deprecate in favour of `BLANK_CRITERIA`?
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
function makeBlankCriteria() {
|
|
25
|
+
return BLANK_CRITERIA;
|
|
26
|
+
}
|
|
27
|
+
/** Useful as no-op default where a valid criteria is required. */
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
const BLANK_CRITERIA = {
|
|
31
|
+
require: 'all',
|
|
32
|
+
criteria: []
|
|
33
|
+
};
|
|
34
|
+
exports.BLANK_CRITERIA = BLANK_CRITERIA;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/views/FilterCriteria/models.ts"],"names":[],"mappings":"AA4CA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,KAAK;IACL,KAAK;IACL,MAAM;CACE,CAAC;AAGX,iFAAiF;AACjF,MAAM,aAAa,GAAG;IACpB,YAAY;IACZ,aAAa;IACb,QAAQ;IACR,eAAe;CACP,CAAC;AAGX,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,aAAa,CAAC,OAAO,CAAC,GAAmB,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC;AA+BD,MAAM,UAAU,eAAe,CAAC,GAAQ;IACtC,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AAChF,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,EAAE;CACb,CAAC","sourcesContent":["import type React from 'react';\nimport { IconName } from '@blueprintjs/core';\nimport type { ItemClassConfigurationSet, Subregisters } from '../../types';\n\n\n/**\n * Defines how to display a search criterion.\n * T: criteria data structure.\n */\nexport interface CriterionConfiguration<T extends Record<string, any>> {\n icon?: IconName\n label: string;\n\n /**\n * Widget that displays and optionally allows editing\n * criteria data structure.\n */\n widget: CriteriaWidget<T>;\n\n /**\n * Determines whether to enable this search criteria based on \n * registry configuration.\n */\n isEnabled?: (opts: CommonOpts) => boolean\n\n /** Summarizes criteria in a human-readable way. */\n toSummary: (data: T, opts: CommonOpts) => string | JSX.Element;\n\n /**\n * Coverts criteria structure to a string\n * that can be passed to filtering backend.\n */\n toQuery: (data: T, opts: CommonOpts) => string;\n\n /** Converts a query string to criteria structure. */\n fromQuery: (query: string, opts: CommonOpts) => T;\n}\n\nexport type CriteriaConfiguration = {\n [key in CriterionKey]: CriterionConfiguration<Record<string, unknown>>;\n};\n\nexport type CriteriaTransformer = (existing: CriteriaGroup) => CriteriaGroup;\n\nexport const COMPOSITION_OPERATORS = [\n 'all',\n 'any',\n 'none',\n] as const;\nexport type CompositionOperator = typeof COMPOSITION_OPERATORS[number];\n\n// TODO: Can we not hard-code keys here? Would require some smart generic typing.\nconst CRITERIA_KEYS = [\n 'item-class',\n 'subregister',\n 'custom',\n 'raw-substring',\n] as const;\ntype CriterionKey = typeof CRITERIA_KEYS[number];\n\nexport function isCriteriaKey(val: string): val is CriterionKey {\n return CRITERIA_KEYS.indexOf(val as CriterionKey) >= 0;\n}\n\ntype CriteriaWidget<T extends Record<string, any>> = React.FC<{\n data: T;\n onChange?: (newData: T) => void;\n availableClassIDs: string[];\n itemClasses: ItemClassConfigurationSet;\n subregisters?: Subregisters;\n className?: string;\n style?: React.CSSProperties;\n}>;\n\nexport interface Criterion {\n /** Specific criterion as a string. */\n query: string;\n\n /** Key in criteria configuration that defines how to work with this criterion. */\n key: CriterionKey;\n}\n\n/** Register metadata that may be needed to display filter criteria. */\nexport interface CommonOpts {\n subregisters?: Subregisters;\n itemClasses: ItemClassConfigurationSet;\n}\n\nexport interface CriteriaGroup {\n require: 'all' | 'any' | 'none';\n criteria: (CriteriaGroup | Criterion)[];\n}\n\nexport function isCriteriaGroup(val: any): val is CriteriaGroup {\n return val && val.hasOwnProperty('require') && val.hasOwnProperty('criteria');\n}\n\n// TODO: Deprecate in favour of `BLANK_CRITERIA`?\nexport function makeBlankCriteria(): CriteriaGroup {\n return BLANK_CRITERIA;\n}\n\n/** Useful as no-op default where a valid criteria is required. */\nexport const BLANK_CRITERIA: CriteriaGroup = {\n require: 'all',\n criteria: [],\n};\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CriteriaGroup, Criterion } from './models';
|
|
2
|
+
declare type TreeMutation<T> = {
|
|
3
|
+
action: 'delete';
|
|
4
|
+
idx: number;
|
|
5
|
+
} | {
|
|
6
|
+
action: 'insert';
|
|
7
|
+
item: T;
|
|
8
|
+
} | {
|
|
9
|
+
action: 'edit';
|
|
10
|
+
idx: number;
|
|
11
|
+
item: T;
|
|
12
|
+
};
|
|
13
|
+
/** Mutates given criteria tree in place. */
|
|
14
|
+
export default function mutateGroup(criteria: (CriteriaGroup | Criterion)[],
|
|
15
|
+
/** Here path must be parent node path in reverse (top-level index coming last). */
|
|
16
|
+
path: number[], mutation: TreeMutation<CriteriaGroup | Criterion>): void;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = mutateGroup;
|
|
7
|
+
|
|
8
|
+
/** Mutates given criteria tree in place. */
|
|
9
|
+
function mutateGroup(criteria,
|
|
10
|
+
/** Here path must be parent node path in reverse (top-level index coming last). */
|
|
11
|
+
path, mutation) {
|
|
12
|
+
if (path.length < 1 && mutation.action === 'edit') {
|
|
13
|
+
criteria[0].require = mutation.item.require;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
for (const [curIdx, c] of criteria.entries()) {
|
|
17
|
+
if (curIdx === path[path.length - 1]) {
|
|
18
|
+
path.pop();
|
|
19
|
+
let cg;
|
|
20
|
+
|
|
21
|
+
if (c.hasOwnProperty('criteria')) {
|
|
22
|
+
// This item is a group, let’s go in and delete descendants
|
|
23
|
+
cg = c;
|
|
24
|
+
} else {
|
|
25
|
+
// This item is a predicate string, can’t go in and delete descendants
|
|
26
|
+
throw new Error(`Cannot enter item: not a group at path ${path.join('/')}/${curIdx}: ${c}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (path.length > 0) {
|
|
30
|
+
mutateGroup(cg.criteria, path, mutation);
|
|
31
|
+
} else {
|
|
32
|
+
if (mutation.action === 'delete') {
|
|
33
|
+
cg.criteria.splice(mutation.idx, 1);
|
|
34
|
+
} else if (mutation.action === 'insert') {
|
|
35
|
+
cg.criteria.push(mutation.item);
|
|
36
|
+
} else if (mutation.action === 'edit') {
|
|
37
|
+
if (cg.criteria[mutation.idx] === undefined && mutation.idx === cg.criteria.length) {
|
|
38
|
+
if (mutation.item.hasOwnProperty('require')) {
|
|
39
|
+
console.error(cg.criteria, mutation);
|
|
40
|
+
throw new Error("Won’t auto-insert new group");
|
|
41
|
+
} // It may be that a new item is being appended
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
cg.criteria.push(mutation.item);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const isGroup = cg.criteria[mutation.idx].hasOwnProperty('require');
|
|
48
|
+
|
|
49
|
+
if (isGroup) {
|
|
50
|
+
// If it’s a group, only change the predicate operator to preserve nested items:
|
|
51
|
+
cg.criteria[mutation.idx].require = mutation.item.require;
|
|
52
|
+
} else {
|
|
53
|
+
cg.criteria[mutation.idx] = mutation.item;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutateGroup.js","sourceRoot":"","sources":["../../../src/views/FilterCriteria/mutateGroup.ts"],"names":[],"mappings":"AASA,4CAA4C;AAC5C,MAAM,CAAC,OAAO,UAAU,WAAW,CACjC,QAAuC;AAEvC,mFAAmF;AACnF,IAAc,EAEd,QAAiD;IAGjD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE;QAChD,QAAQ,CAAC,CAAC,CAAmB,CAAC,OAAO,GAAI,QAAQ,CAAC,IAAsB,CAAC,OAAO,CAAC;KACnF;IACD,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;QAC5C,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YAEX,IAAI,EAAiB,CAAC;YACtB,IAAI,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;gBAChC,2DAA2D;gBAC3D,EAAE,GAAG,CAAkB,CAAC;aACzB;iBAAM;gBACL,sEAAsE;gBACtE,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;aAC7F;YAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;aAC1C;iBAAM;gBACL,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;oBAChC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;iBACrC;qBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;oBACvC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;iBACjC;qBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE;oBACrC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE;wBAClF,IAAI,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE;4BAC3C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACrC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;yBAChD;wBACD,8CAA8C;wBAC9C,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;qBACjC;oBACD,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;oBACpE,IAAI,OAAO,EAAE;wBACX,gFAAgF;wBAC/E,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAmB,CAAC,OAAO;4BACjD,QAAQ,CAAC,IAAsB,CAAC,OAAO,CAAC;qBAC5C;yBAAM;wBACL,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;qBAC3C;iBACF;aACF;SACF;KACF;AACH,CAAC","sourcesContent":["import { CriteriaGroup, Criterion } from './models';\n\n\ntype TreeMutation<T> =\n { action: 'delete'; idx: number; } |\n { action: 'insert'; item: T; } |\n { action: 'edit'; idx: number; item: T; };\n\n\n/** Mutates given criteria tree in place. */\nexport default function mutateGroup(\n criteria: (CriteriaGroup | Criterion)[],\n\n /** Here path must be parent node path in reverse (top-level index coming last). */\n path: number[],\n\n mutation: TreeMutation<CriteriaGroup | Criterion>,\n) {\n\n if (path.length < 1 && mutation.action === 'edit') {\n (criteria[0] as CriteriaGroup).require = (mutation.item as CriteriaGroup).require;\n }\n for (const [curIdx, c] of criteria.entries()) {\n if (curIdx === path[path.length - 1]) {\n path.pop();\n\n let cg: CriteriaGroup;\n if (c.hasOwnProperty('criteria')) {\n // This item is a group, let’s go in and delete descendants\n cg = c as CriteriaGroup;\n } else {\n // This item is a predicate string, can’t go in and delete descendants\n throw new Error(`Cannot enter item: not a group at path ${path.join('/')}/${curIdx}: ${c}`);\n }\n\n if (path.length > 0) {\n mutateGroup(cg.criteria, path, mutation);\n } else {\n if (mutation.action === 'delete') {\n cg.criteria.splice(mutation.idx, 1);\n } else if (mutation.action === 'insert') {\n cg.criteria.push(mutation.item);\n } else if (mutation.action === 'edit') {\n if (cg.criteria[mutation.idx] === undefined && mutation.idx === cg.criteria.length) {\n if (mutation.item.hasOwnProperty('require')) {\n console.error(cg.criteria, mutation);\n throw new Error(\"Won’t auto-insert new group\");\n }\n // It may be that a new item is being appended\n cg.criteria.push(mutation.item);\n }\n const isGroup = cg.criteria[mutation.idx].hasOwnProperty('require');\n if (isGroup) {\n // If it’s a group, only change the predicate operator to preserve nested items:\n (cg.criteria[mutation.idx] as CriteriaGroup).require =\n (mutation.item as CriteriaGroup).require;\n } else {\n cg.criteria[mutation.idx] = mutation.item;\n }\n }\n }\n }\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** @jsx jsx */
|
|
2
2
|
/** @jsxFrag React.Fragment */
|
|
3
3
|
import React from 'react';
|
|
4
|
-
import { GenericRelatedItemViewProps } from '../types';
|
|
4
|
+
import { type GenericRelatedItemViewProps } from '../types';
|
|
5
5
|
export declare const GenericRelatedItemView: React.FC<GenericRelatedItemViewProps>;
|
|
6
6
|
export default GenericRelatedItemView;
|