@truedat/qx 7.13.6 → 7.13.8

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 (74) hide show
  1. package/package.json +3 -3
  2. package/src/components/QxRoutes.js +8 -6
  3. package/src/components/common/ResourceSelector.js +25 -6
  4. package/src/components/common/TypeSelector.js +14 -9
  5. package/src/components/common/__tests__/__snapshots__/ResourceSelector.spec.js.snap +269 -241
  6. package/src/components/common/__tests__/__snapshots__/TypeSelector.spec.js.snap +198 -190
  7. package/src/components/common/expressions/Clauses.js +19 -11
  8. package/src/components/common/expressions/Condition.js +32 -31
  9. package/src/components/common/expressions/FieldSelector.js +30 -16
  10. package/src/components/common/expressions/FunctionSelector.js +38 -23
  11. package/src/components/common/expressions/ShapeSelector.js +6 -5
  12. package/src/components/common/expressions/__tests__/ShapeSelector.spec.js +1 -1
  13. package/src/components/common/expressions/__tests__/__snapshots__/Clauses.spec.js.snap +36 -12
  14. package/src/components/common/expressions/__tests__/__snapshots__/Condition.spec.js.snap +87 -75
  15. package/src/components/common/expressions/__tests__/__snapshots__/ConstantSelector.spec.js.snap +99 -97
  16. package/src/components/common/expressions/__tests__/__snapshots__/Expression.spec.js.snap +236 -216
  17. package/src/components/common/expressions/__tests__/__snapshots__/FunctionArgs.spec.js.snap +97 -89
  18. package/src/components/common/expressions/__tests__/__snapshots__/FunctionSelector.spec.js.snap +373 -345
  19. package/src/components/common/expressions/constantInputs/AnySelector.js +2 -1
  20. package/src/components/common/expressions/constantInputs/BooleanSelector.js +20 -15
  21. package/src/components/common/expressions/constantInputs/DefaultSelector.js +0 -1
  22. package/src/components/common/expressions/constantInputs/__tests__/__snapshots__/AnySelector.spec.js.snap +189 -182
  23. package/src/components/common/expressions/constantInputs/__tests__/__snapshots__/BooleanSelector.spec.js.snap +74 -66
  24. package/src/components/common/expressions/constantInputs/__tests__/__snapshots__/DefaultSelector.spec.js.snap +2 -4
  25. package/src/components/common/resourceSelectors/DataStructureSelector.js +5 -4
  26. package/src/components/common/resourceSelectors/DataViewSelector.js +4 -3
  27. package/src/components/common/resourceSelectors/ReferenceDatasetSelector.js +4 -3
  28. package/src/components/common/resourceSelectors/__tests__/__snapshots__/DataStructureSelector.spec.js.snap +65 -61
  29. package/src/components/common/resourceSelectors/__tests__/__snapshots__/DataViewSelector.spec.js.snap +38 -34
  30. package/src/components/common/resourceSelectors/__tests__/__snapshots__/ReferenceDatasetSelector.spec.js.snap +38 -34
  31. package/src/components/dataViews/BreadCrumb.js +20 -0
  32. package/src/components/dataViews/DataViewEditor.js +169 -178
  33. package/src/components/dataViews/DataViews.js +113 -135
  34. package/src/components/dataViews/__tests__/AdvancedDataViewEditor.spec.js +260 -0
  35. package/src/components/dataViews/__tests__/DataViewEditor.spec.js +173 -239
  36. package/src/components/dataViews/__tests__/DataViewSelect.spec.js +1 -1
  37. package/src/components/dataViews/__tests__/DataViews.spec.js +124 -51
  38. package/src/components/dataViews/__tests__/Queryable.spec.js +1 -1
  39. package/src/components/dataViews/__tests__/Queryables.spec.js +1 -1
  40. package/src/components/dataViews/__tests__/SimpleDataViewEditor.spec.js +164 -0
  41. package/src/components/dataViews/__tests__/__snapshots__/{DataViewEditor.spec.js.snap → AdvancedDataViewEditor.spec.js.snap} +230 -200
  42. package/src/components/dataViews/__tests__/__snapshots__/DataViews.spec.js.snap +141 -29
  43. package/src/components/dataViews/__tests__/__snapshots__/Queryable.spec.js.snap +184 -141
  44. package/src/components/dataViews/__tests__/__snapshots__/Queryables.spec.js.snap +126 -91
  45. package/src/components/dataViews/actions/CancelButton.js +33 -0
  46. package/src/components/dataViews/actions/DeleteButton.js +33 -0
  47. package/src/components/dataViews/advancedForm/AdvancedDataViewEditor.js +159 -0
  48. package/src/components/dataViews/{DataViewSelect.js → advancedForm/DataViewSelect.js} +2 -2
  49. package/src/components/dataViews/{Queryable.js → advancedForm/Queryable.js} +2 -2
  50. package/src/components/dataViews/queryableFunctions.js +7 -0
  51. package/src/components/dataViews/queryableProperties/GroupBy.js +23 -27
  52. package/src/components/dataViews/queryableProperties/Join.js +0 -3
  53. package/src/components/dataViews/queryableProperties/__tests__/__snapshots__/From.spec.js.snap +30 -26
  54. package/src/components/dataViews/queryableProperties/__tests__/__snapshots__/GroupBy.spec.js.snap +130 -102
  55. package/src/components/dataViews/queryableProperties/__tests__/__snapshots__/Join.spec.js.snap +42 -31
  56. package/src/components/dataViews/queryableProperties/__tests__/__snapshots__/Select.spec.js.snap +81 -69
  57. package/src/components/dataViews/queryableProperties/__tests__/__snapshots__/SelectField.spec.js.snap +62 -54
  58. package/src/components/dataViews/queryableProperties/__tests__/__snapshots__/Where.spec.js.snap +12 -4
  59. package/src/components/dataViews/simpleForm/AggregationForm.js +179 -0
  60. package/src/components/dataViews/simpleForm/DatasetForm.js +199 -0
  61. package/src/components/dataViews/simpleForm/FormQueryable.js +114 -0
  62. package/src/components/dataViews/simpleForm/InformationForm.js +107 -0
  63. package/src/components/dataViews/simpleForm/SelectionForm.js +50 -0
  64. package/src/components/dataViews/simpleForm/SimpleDataViewEditor.js +265 -0
  65. package/src/components/functions/__tests__/__snapshots__/FunctionEditor.spec.js.snap +663 -631
  66. package/src/components/functions/__tests__/__snapshots__/FunctionParams.spec.js.snap +113 -109
  67. package/src/components/qualityControls/__tests__/__snapshots__/ControlProperties.spec.js.snap +92 -76
  68. package/src/components/qualityControls/__tests__/__snapshots__/EditQualityControl.spec.js.snap +108 -80
  69. package/src/components/qualityControls/__tests__/__snapshots__/NewDraftQualityControl.spec.js.snap +108 -80
  70. package/src/components/qualityControls/__tests__/__snapshots__/QualityControlEditor.spec.js.snap +108 -80
  71. package/src/components/qualityControls/controlProperties/__tests__/__snapshots__/Count.spec.js.snap +40 -36
  72. package/src/components/qualityControls/controlProperties/__tests__/__snapshots__/Ratio.spec.js.snap +92 -76
  73. package/src/hooks/useDataViews.js +7 -0
  74. /package/src/components/dataViews/{Queryables.js → advancedForm/Queryables.js} +0 -0
@@ -2,7 +2,14 @@ import _ from "lodash/fp";
2
2
  import { useState, use } from "react";
3
3
  import { useIntl } from "react-intl";
4
4
  import { Controller, useFormContext } from "react-hook-form";
5
- import { Dropdown, Accordion, Icon, Label, Header } from "semantic-ui-react";
5
+ import {
6
+ Dropdown,
7
+ Accordion,
8
+ Form,
9
+ Icon,
10
+ Label,
11
+ Header,
12
+ } from "semantic-ui-react";
6
13
  import { typeToColor, typeToIcon } from "@truedat/qx/types";
7
14
  import QxContext from "@truedat/qx/components/QxContext";
8
15
  import FunctionArgs from "./FunctionArgs";
@@ -76,33 +83,41 @@ export default function FunctionSelector() {
76
83
  <Controller
77
84
  control={control}
78
85
  name={`${field}.value`}
79
- rules={{ required: true }}
86
+ rules={{
87
+ required: {
88
+ value: true,
89
+ message: formatMessage({ id: "quality_control.form.required" }),
90
+ },
91
+ }}
80
92
  render={({
81
93
  field: { onBlur, onChange, value },
82
94
  fieldState: { error },
83
95
  }) => (
84
- <Dropdown
85
- deburr
86
- onBlur={onBlur}
87
- error={!!error}
88
- options={funcOpts}
89
- onChange={(_e, { value }) =>
90
- onChange(
91
- _.omit(["isCondition"])({
92
- ...currentFunction,
93
- ...keyToFn(value),
94
- })
95
- )
96
- }
97
- placeholder={formatMessage(
98
- { id: "functions.form.expression.function.placeholder" },
99
- { type }
96
+ <Form.Field width={16}>
97
+ <Dropdown
98
+ deburr
99
+ onBlur={onBlur}
100
+ error={!!error?.message}
101
+ options={funcOpts}
102
+ onChange={(_e, { value }) => {
103
+ onChange({ ...currentFunction, ...keyToFn(value) });
104
+ onBlur && onBlur();
105
+ }}
106
+ placeholder={formatMessage(
107
+ { id: "functions.form.expression.function.placeholder" },
108
+ { type }
109
+ )}
110
+ search
111
+ fluid
112
+ selection
113
+ value={fnToKey(value || {})}
114
+ />
115
+ {error?.message && (
116
+ <Label prompt pointing>
117
+ {error?.message}
118
+ </Label>
100
119
  )}
101
- search
102
- fluid
103
- selection
104
- value={fnToKey(value || {})}
105
- />
120
+ </Form.Field>
106
121
  )}
107
122
  />
108
123
  </div>
@@ -20,6 +20,10 @@ export default function ShapeSelector() {
20
20
  const params = watch("params");
21
21
  const value = watch(`${field}.value`);
22
22
  const isCondition = _.prop("isCondition")(value);
23
+ const setTargetValue = (field, value) => {
24
+ const targetValue = value === "function" ? undefined : { isCondition };
25
+ setValue(field, targetValue);
26
+ }
23
27
 
24
28
  const emptyTypeParams = _.flow(
25
29
  _.filter((param) => type === "any" || param.type == type),
@@ -72,11 +76,8 @@ export default function ShapeSelector() {
72
76
  options={shapeDropdownOptions}
73
77
  onChange={(_e, { value }) => {
74
78
  onChange(value);
75
- setValue(
76
- `${field}.value`,
77
- { isCondition },
78
- { shouldValidate: true }
79
- );
79
+ setTargetValue(`${field}.value`, value);
80
+
80
81
  }}
81
82
  trigger={
82
83
  <div className="shape-selector-trigger">{shapeToSymbol[shape]}</div>
@@ -95,7 +95,7 @@ describe("<ShapeSelector />", () => {
95
95
  );
96
96
 
97
97
  expect(watcher).toHaveBeenLastCalledWith({
98
- test: { shape: "function", value: { isCondition: undefined } },
98
+ test: { shape: "function", value: undefined },
99
99
  });
100
100
 
101
101
  expect(rendered.container).toMatchSnapshot();
@@ -11,11 +11,19 @@ exports[`<Clauses /> matches the latest snapshot 1`] = `
11
11
  <div
12
12
  class="ui horizontal divider"
13
13
  >
14
- <button
15
- class="ui mini button"
14
+ <div
15
+ class="ui medium basic buttons"
16
16
  >
17
- Add Group
18
- </button>
17
+ <button
18
+ class="ui button"
19
+ >
20
+ <i
21
+ aria-hidden="true"
22
+ class="plus icon"
23
+ />
24
+ Add Group
25
+ </button>
26
+ </div>
19
27
  </div>
20
28
  </div>
21
29
  </div>
@@ -39,11 +47,19 @@ exports[`<Clauses /> matches the latest snapshot with content 1`] = `
39
47
  <div
40
48
  class="ui horizontal divider"
41
49
  >
42
- <button
43
- class="ui mini button"
50
+ <div
51
+ class="ui medium basic buttons"
44
52
  >
45
- addExpression
46
- </button>
53
+ <button
54
+ class="ui button"
55
+ >
56
+ <i
57
+ aria-hidden="true"
58
+ class="plus icon"
59
+ />
60
+ addExpression
61
+ </button>
62
+ </div>
47
63
  </div>
48
64
  </div>
49
65
  <div
@@ -53,11 +69,19 @@ exports[`<Clauses /> matches the latest snapshot with content 1`] = `
53
69
  <div
54
70
  class="ui horizontal divider"
55
71
  >
56
- <button
57
- class="ui mini button"
72
+ <div
73
+ class="ui medium basic buttons"
58
74
  >
59
- Add Group
60
- </button>
75
+ <button
76
+ class="ui button"
77
+ >
78
+ <i
79
+ aria-hidden="true"
80
+ class="plus icon"
81
+ />
82
+ Add Group
83
+ </button>
84
+ </div>
61
85
  </div>
62
86
  </div>
63
87
  </div>
@@ -92,38 +92,42 @@ exports[`<Condition /> matches the latest snapshot 1`] = `
92
92
  class="dropdown icon"
93
93
  />
94
94
  <div
95
- aria-expanded="false"
96
- class="ui fluid search selection dropdown"
97
- role="combobox"
95
+ class="sixteen wide field"
98
96
  >
99
- <input
100
- aria-autocomplete="list"
101
- autocomplete="off"
102
- class="search"
103
- tabindex="0"
104
- type="text"
105
- value=""
106
- />
107
97
  <div
108
- aria-atomic="true"
109
- aria-live="polite"
110
- class="divider text"
111
- role="alert"
112
- >
113
- functions.form.expression.function.placeholder
114
- </div>
115
- <i
116
- aria-hidden="true"
117
- class="dropdown icon"
118
- />
119
- <div
120
- class="menu transition"
121
- role="listbox"
98
+ aria-expanded="false"
99
+ class="ui fluid search selection dropdown"
100
+ role="combobox"
122
101
  >
102
+ <input
103
+ aria-autocomplete="list"
104
+ autocomplete="off"
105
+ class="search"
106
+ tabindex="0"
107
+ type="text"
108
+ value=""
109
+ />
110
+ <div
111
+ aria-atomic="true"
112
+ aria-live="polite"
113
+ class="divider text"
114
+ role="alert"
115
+ >
116
+ functions.form.expression.function.placeholder
117
+ </div>
118
+ <i
119
+ aria-hidden="true"
120
+ class="dropdown icon"
121
+ />
123
122
  <div
124
- class="message"
123
+ class="menu transition"
124
+ role="listbox"
125
125
  >
126
- No results found.
126
+ <div
127
+ class="message"
128
+ >
129
+ No results found.
130
+ </div>
127
131
  </div>
128
132
  </div>
129
133
  </div>
@@ -144,34 +148,38 @@ exports[`<Condition /> matches the latest snapshot 1`] = `
144
148
  class="flex-justify-center"
145
149
  >
146
150
  <div
147
- aria-expanded="false"
148
- class="ui top left pointing dropdown"
149
- role="listbox"
150
- tabindex="0"
151
+ class="field"
151
152
  >
152
153
  <div
153
- class="condition-operator-trigger"
154
- >
155
- <span>
156
- expression.condition.selectFunction
157
- </span>
158
- </div>
159
- <div
160
- class="menu transition"
154
+ aria-expanded="false"
155
+ class="ui fluid top left pointing dropdown"
156
+ role="listbox"
157
+ tabindex="0"
161
158
  >
162
159
  <div
163
- aria-checked="false"
164
- aria-selected="true"
165
- class="selected item"
166
- role="option"
167
- style="pointer-events: all;"
160
+ class="condition-operator-trigger"
168
161
  >
169
- <span
170
- class="text"
171
- >
172
- expression.condition.customExpression
162
+ <span>
163
+ expression.condition.selectFunction
173
164
  </span>
174
165
  </div>
166
+ <div
167
+ class="menu transition"
168
+ >
169
+ <div
170
+ aria-checked="false"
171
+ aria-selected="true"
172
+ class="selected item"
173
+ role="option"
174
+ style="pointer-events: all;"
175
+ >
176
+ <span
177
+ class="text"
178
+ >
179
+ expression.condition.customExpression
180
+ </span>
181
+ </div>
182
+ </div>
175
183
  </div>
176
184
  </div>
177
185
  </div>
@@ -262,38 +270,42 @@ exports[`<Condition /> matches the latest snapshot 1`] = `
262
270
  class="dropdown icon"
263
271
  />
264
272
  <div
265
- aria-expanded="false"
266
- class="ui fluid search selection dropdown"
267
- role="combobox"
273
+ class="sixteen wide field"
268
274
  >
269
- <input
270
- aria-autocomplete="list"
271
- autocomplete="off"
272
- class="search"
273
- tabindex="0"
274
- type="text"
275
- value=""
276
- />
277
275
  <div
278
- aria-atomic="true"
279
- aria-live="polite"
280
- class="divider text"
281
- role="alert"
282
- >
283
- functions.form.expression.function.placeholder
284
- </div>
285
- <i
286
- aria-hidden="true"
287
- class="dropdown icon"
288
- />
289
- <div
290
- class="menu transition"
291
- role="listbox"
276
+ aria-expanded="false"
277
+ class="ui fluid search selection dropdown"
278
+ role="combobox"
292
279
  >
280
+ <input
281
+ aria-autocomplete="list"
282
+ autocomplete="off"
283
+ class="search"
284
+ tabindex="0"
285
+ type="text"
286
+ value=""
287
+ />
288
+ <div
289
+ aria-atomic="true"
290
+ aria-live="polite"
291
+ class="divider text"
292
+ role="alert"
293
+ >
294
+ functions.form.expression.function.placeholder
295
+ </div>
296
+ <i
297
+ aria-hidden="true"
298
+ class="dropdown icon"
299
+ />
293
300
  <div
294
- class="message"
301
+ class="menu transition"
302
+ role="listbox"
295
303
  >
296
- No results found.
304
+ <div
305
+ class="message"
306
+ >
307
+ No results found.
308
+ </div>
297
309
  </div>
298
310
  </div>
299
311
  </div>
@@ -3,14 +3,13 @@
3
3
  exports[`<ConstantSelector /> matches the latest snapshot 1`] = `
4
4
  <div>
5
5
  <div
6
- class="required field"
6
+ class="field"
7
7
  >
8
8
  <div
9
9
  class="ui input"
10
10
  >
11
11
  <input
12
12
  autocomplete="off"
13
- required=""
14
13
  type="text"
15
14
  />
16
15
  </div>
@@ -21,124 +20,127 @@ exports[`<ConstantSelector /> matches the latest snapshot 1`] = `
21
20
  exports[`<ConstantSelector /> user interaction 1`] = `
22
21
  <div>
23
22
  <div
24
- aria-expanded="false"
25
- class="ui basic button dropdown"
26
- name="type"
27
- role="listbox"
23
+ class="field"
28
24
  style=""
29
- tabindex="0"
30
25
  >
31
26
  <div
32
- aria-atomic="true"
33
- aria-live="polite"
34
- class="divider text"
35
- role="alert"
36
- >
37
- expressions.data_type.string
38
- </div>
39
- <i
40
- aria-hidden="true"
41
- class="dropdown icon"
42
- />
43
- <div
44
- class="menu transition"
27
+ aria-expanded="false"
28
+ class="ui button fluid dropdown"
29
+ name="type"
30
+ role="listbox"
31
+ tabindex="0"
45
32
  >
46
33
  <div
47
- aria-checked="false"
48
- aria-selected="false"
49
- class="item"
50
- role="option"
51
- style="pointer-events: all;"
34
+ aria-atomic="true"
35
+ aria-live="polite"
36
+ class="divider text"
37
+ role="alert"
52
38
  >
53
- <i
54
- aria-hidden="true"
55
- class="adjust icon"
56
- />
57
- <span
58
- class="text"
59
- >
60
- expressions.data_type.boolean
61
- </span>
39
+ expressions.data_type.string
62
40
  </div>
41
+ <i
42
+ aria-hidden="true"
43
+ class="dropdown icon"
44
+ />
63
45
  <div
64
- aria-checked="true"
65
- aria-selected="true"
66
- class="active selected item"
67
- role="option"
68
- style="pointer-events: all;"
46
+ class="menu transition"
69
47
  >
70
- <i
71
- aria-hidden="true"
72
- class="font icon"
73
- />
74
- <span
75
- class="text"
48
+ <div
49
+ aria-checked="false"
50
+ aria-selected="false"
51
+ class="item"
52
+ role="option"
53
+ style="pointer-events: all;"
76
54
  >
77
- expressions.data_type.string
78
- </span>
79
- </div>
80
- <div
81
- aria-checked="false"
82
- aria-selected="false"
83
- class="item"
84
- role="option"
85
- style="pointer-events: all;"
86
- >
87
- <i
88
- aria-hidden="true"
89
- class="hashtag icon"
90
- />
91
- <span
92
- class="text"
55
+ <i
56
+ aria-hidden="true"
57
+ class="adjust icon"
58
+ />
59
+ <span
60
+ class="text"
61
+ >
62
+ expressions.data_type.boolean
63
+ </span>
64
+ </div>
65
+ <div
66
+ aria-checked="true"
67
+ aria-selected="true"
68
+ class="active selected item"
69
+ role="option"
70
+ style="pointer-events: all;"
93
71
  >
94
- expressions.data_type.number
95
- </span>
96
- </div>
97
- <div
98
- aria-checked="false"
99
- aria-selected="false"
100
- class="item"
101
- role="option"
102
- style="pointer-events: all;"
103
- >
104
- <i
105
- aria-hidden="true"
106
- class="calendar alternate outline icon"
107
- />
108
- <span
109
- class="text"
72
+ <i
73
+ aria-hidden="true"
74
+ class="font icon"
75
+ />
76
+ <span
77
+ class="text"
78
+ >
79
+ expressions.data_type.string
80
+ </span>
81
+ </div>
82
+ <div
83
+ aria-checked="false"
84
+ aria-selected="false"
85
+ class="item"
86
+ role="option"
87
+ style="pointer-events: all;"
110
88
  >
111
- expressions.data_type.date
112
- </span>
113
- </div>
114
- <div
115
- aria-checked="false"
116
- aria-selected="false"
117
- class="item"
118
- role="option"
119
- style="pointer-events: all;"
120
- >
121
- <i
122
- aria-hidden="true"
123
- class="clock outline icon"
124
- />
125
- <span
126
- class="text"
89
+ <i
90
+ aria-hidden="true"
91
+ class="hashtag icon"
92
+ />
93
+ <span
94
+ class="text"
95
+ >
96
+ expressions.data_type.number
97
+ </span>
98
+ </div>
99
+ <div
100
+ aria-checked="false"
101
+ aria-selected="false"
102
+ class="item"
103
+ role="option"
104
+ style="pointer-events: all;"
105
+ >
106
+ <i
107
+ aria-hidden="true"
108
+ class="calendar alternate outline icon"
109
+ />
110
+ <span
111
+ class="text"
112
+ >
113
+ expressions.data_type.date
114
+ </span>
115
+ </div>
116
+ <div
117
+ aria-checked="false"
118
+ aria-selected="false"
119
+ class="item"
120
+ role="option"
121
+ style="pointer-events: all;"
127
122
  >
128
- expressions.data_type.timestamp
129
- </span>
123
+ <i
124
+ aria-hidden="true"
125
+ class="clock outline icon"
126
+ />
127
+ <span
128
+ class="text"
129
+ >
130
+ expressions.data_type.timestamp
131
+ </span>
132
+ </div>
130
133
  </div>
131
134
  </div>
132
135
  </div>
133
136
  <div
134
- class="required field"
137
+ class="field"
135
138
  >
136
139
  <div
137
140
  class="ui input"
138
141
  >
139
142
  <input
140
143
  autocomplete="off"
141
- required=""
142
144
  type="text"
143
145
  value=""
144
146
  />