@emuanalytics/flow-rdf-ui 4.1.27 → 4.2.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.
@@ -1,7 +1,7 @@
1
1
  import { html } from 'lit';
2
2
  import { ifDefined } from 'lit/directives/if-defined.js';
3
3
  import { ensureArray } from '../../internal/ensure-array.mjs';
4
- import { isFunction, isDefined } from '../../internal/type-checks.mjs';
4
+ import { isFunction, isDefined, isStringFull } from '../../internal/type-checks.mjs';
5
5
 
6
6
  function getDefault(defaultVal, fallback) {
7
7
  if (isFunction(defaultVal)) {
@@ -49,83 +49,80 @@ const defaultNumberTemplate = (rule, field, qb, update) => {
49
49
  ></flow-ui-input>
50
50
  `;
51
51
  };
52
- const defaultDateTimeTemplate = (rule, field, qb, update) => {
53
- const handleChange = (ev) => {
54
- const target = ev.target;
55
- rule.value = target.value === "" ? void 0 : target.value;
56
- target.setCustomValidity(field.validator?.(rule) ?? "");
57
- update();
58
- };
59
- const format = getDefault(field.dateFormat, "F");
60
- const timezone = getDefault(field.timezone);
61
- const locale = getDefault(field.locale);
62
- return html`
63
- <flow-ui-date-time-picker
64
- filled
65
- class="query-builder__rule-value-control"
66
- value=${rule.value ?? ""}
67
- size=${qb.size}
68
- placeholder="Enter a date/time"
69
- format=${ifDefined(format)}
70
- timezone=${ifDefined(timezone)}
71
- locale=${ifDefined(locale)}
72
- ?disabled=${!rule.enabled}
73
- @flow-ui-change=${handleChange}
74
- ></flow-ui-date-time-picker>
75
- `;
76
- };
77
- const defaultDateTemplate = (rule, field, qb, update) => {
78
- const handleChange = (ev) => {
79
- const target = ev.target;
80
- rule.value = target.value === "" ? void 0 : target.value;
81
- target.setCustomValidity(field.validator?.(rule) ?? "");
82
- update();
83
- };
84
- const format = getDefault(field.dateFormat, "D");
85
- const timezone = getDefault(field.timezone);
86
- const locale = getDefault(field.locale);
87
- return html`
88
- <flow-ui-date-time-picker
89
- filled
90
- class="query-builder__rule-value-control"
91
- value=${rule.value ?? ""}
92
- display-mode="date"
93
- size=${qb.size}
94
- placeholder="Enter a date"
95
- format=${ifDefined(format)}
96
- timezone=${ifDefined(timezone)}
97
- locale=${ifDefined(locale)}
98
- ?disabled=${!rule.enabled}
99
- @flow-ui-change=${handleChange}
100
- ></flow-ui-date-time-picker>
101
- `;
102
- };
103
- const defaultTimeTemplate = (rule, field, qb, update) => {
52
+ function intervalFromRuleValue(value) {
53
+ return Array.isArray(value) && value.length === 2 && value.every(isStringFull) ? `${value[0]}/${value[1]}` : "";
54
+ }
55
+ function ruleValueFromInterval(interval) {
56
+ const [start, end] = interval.split("/");
57
+ return isStringFull(start) && isStringFull(end) ? [start, end] : void 0;
58
+ }
59
+ function dateTimePickerTemplate(rule, field, qb, update, options) {
60
+ const isBetween = rule.operator === "between";
104
61
  const handleChange = (ev) => {
105
62
  const target = ev.target;
106
- rule.value = target.value === "" ? void 0 : target.value;
63
+ if (isBetween) {
64
+ rule.value = ruleValueFromInterval(target.value);
65
+ } else {
66
+ rule.value = target.value === "" ? void 0 : target.value;
67
+ }
107
68
  target.setCustomValidity(field.validator?.(rule) ?? "");
108
69
  update();
109
70
  };
110
- const format = getDefault(field.dateFormat, "TTT");
71
+ const defaultFormat = isBetween ? options.rangeDefaultFormat ?? options.defaultFormat : options.defaultFormat;
72
+ const format = getDefault(field.dateFormat, defaultFormat);
111
73
  const timezone = getDefault(field.timezone);
112
74
  const locale = getDefault(field.locale);
113
- return html`
114
- <flow-ui-date-time-picker
115
- filled
116
- class="query-builder__rule-value-control"
117
- value=${rule.value ?? ""}
118
- display-mode="time"
119
- size=${qb.size}
120
- placeholder="Enter a time"
121
- format=${ifDefined(format)}
122
- timezone=${ifDefined(timezone)}
123
- locale=${ifDefined(locale)}
124
- ?disabled=${!rule.enabled}
125
- @flow-ui-change=${handleChange}
126
- ></flow-ui-date-time-picker>
127
- `;
128
- };
75
+ return isBetween ? html`
76
+ <flow-ui-date-time-picker
77
+ filled
78
+ range
79
+ class="query-builder__rule-value-control"
80
+ value=${intervalFromRuleValue(rule.value)}
81
+ display-mode=${options.displayMode}
82
+ size=${qb.size}
83
+ placeholder=${options.rangePlaceholder ?? options.placeholder}
84
+ format=${ifDefined(format)}
85
+ timezone=${ifDefined(timezone)}
86
+ locale=${ifDefined(locale)}
87
+ ?disabled=${!rule.enabled}
88
+ @flow-ui-change=${handleChange}
89
+ ></flow-ui-date-time-picker>
90
+ ` : html`
91
+ <flow-ui-date-time-picker
92
+ filled
93
+ class="query-builder__rule-value-control"
94
+ value=${rule.value ?? ""}
95
+ display-mode=${options.displayMode}
96
+ size=${qb.size}
97
+ placeholder=${options.placeholder}
98
+ format=${ifDefined(format)}
99
+ timezone=${ifDefined(timezone)}
100
+ locale=${ifDefined(locale)}
101
+ ?disabled=${!rule.enabled}
102
+ @flow-ui-change=${handleChange}
103
+ ></flow-ui-date-time-picker>
104
+ `;
105
+ }
106
+ const defaultDateTimeTemplate = (rule, field, qb, update) => dateTimePickerTemplate(rule, field, qb, update, {
107
+ displayMode: "datetime",
108
+ defaultFormat: "F",
109
+ placeholder: "Enter a date/time",
110
+ rangePlaceholder: "Enter a date/time range"
111
+ });
112
+ const defaultDateTemplate = (rule, field, qb, update) => dateTimePickerTemplate(rule, field, qb, update, {
113
+ displayMode: "date",
114
+ defaultFormat: "D",
115
+ placeholder: "Enter a date",
116
+ rangePlaceholder: "Enter a date range"
117
+ });
118
+ const defaultTimeTemplate = (rule, field, qb, update) => dateTimePickerTemplate(rule, field, qb, update, {
119
+ displayMode: "time",
120
+ defaultFormat: "TTT",
121
+ placeholder: "Enter a time",
122
+ // An end time of 24:00 can only be shown with the H token
123
+ rangeDefaultFormat: "HH:mm",
124
+ rangePlaceholder: "Enter a time range"
125
+ });
129
126
  const defaultSelectTemplate = (rule, field, qb, update) => {
130
127
  const isMulti = rule.operator === "in" || rule.operator === "!in";
131
128
  const handleChange = (ev) => {
@@ -1,5 +1,6 @@
1
1
  import cloneDeep from 'clone-deep';
2
- import { isObjectFull, isDefined } from '../../internal/type-checks.mjs';
2
+ import { DateTime } from 'luxon';
3
+ import { isObjectFull, isNil, isDefined, isFunction } from '../../internal/type-checks.mjs';
3
4
 
4
5
  function filterRuleSet(ruleset, options) {
5
6
  return transformRuleSet(ruleset, (rule) => {
@@ -52,5 +53,20 @@ function countRuleSet(ruleset) {
52
53
  const isRule = (r) => isObjectFull(r) && "field" in r;
53
54
  const isRuleSet = (r) => isObjectFull(r) && "rules" in r;
54
55
  const isRuleOrRuleset = (r) => isRule(r) || isRuleSet(r);
56
+ function betweenRuleValues(rule, field) {
57
+ const value = rule.value;
58
+ if (!Array.isArray(value) || value.length !== 2 || value.some((v) => isNil(v) || v === "")) {
59
+ return void 0;
60
+ }
61
+ const convert = (v) => isFunction(field.convertValue) ? field.convertValue(v) : v;
62
+ if (field.type === "time") {
63
+ const start = DateTime.fromISO(String(value[0]), { setZone: true });
64
+ const end = DateTime.fromISO(String(value[1]), { setZone: true });
65
+ if (start.isValid && end.isValid && end >= start.startOf("day").plus({ days: 1 })) {
66
+ return [convert(value[0]), void 0];
67
+ }
68
+ }
69
+ return [convert(value[0]), convert(value[1])];
70
+ }
55
71
 
56
- export { countRuleSet, filterRuleSet, isRule, isRuleOrRuleset, isRuleSet, renameRuleSetFields, transformRuleSet };
72
+ export { betweenRuleValues, countRuleSet, filterRuleSet, isRule, isRuleOrRuleset, isRuleSet, renameRuleSetFields, transformRuleSet };
@@ -150,7 +150,12 @@ const _FlowUiQueryBuilder = class _FlowUiQueryBuilder extends FlowRdfElement {
150
150
  handleOperatorChanged(ev, rule) {
151
151
  ev.stopPropagation();
152
152
  const target = ev.target;
153
- rule.operator = target.value;
153
+ const operator = target.value;
154
+ if (rule.operator === "between" !== (operator === "between")) {
155
+ rule.value = void 0;
156
+ }
157
+ rule.operator = operator;
158
+ this.requestUpdate();
154
159
  this.emitValueChange();
155
160
  }
156
161
  handleConditionChange(ev) {
@@ -535,11 +540,11 @@ FlowUiQueryBuilder.registerFieldDefinition("datetime", {
535
540
  });
536
541
  FlowUiQueryBuilder.registerFieldDefinition("date", {
537
542
  template: defaultDateTemplate,
538
- operators: ["=", "!=", "<", "<=", ">=", ">"]
543
+ operators: ["=", "!=", "<", "<=", ">=", ">", "between"]
539
544
  });
540
545
  FlowUiQueryBuilder.registerFieldDefinition("time", {
541
546
  template: defaultTimeTemplate,
542
- operators: ["=", "!=", "<", "<=", ">=", ">"]
547
+ operators: ["=", "!=", "<", "<=", ">=", ">", "between"]
543
548
  });
544
549
  FlowUiQueryBuilder.registerFieldDefinition("select", {
545
550
  template: defaultSelectTemplate,