@malloydata/malloy-explorer 0.0.277-dev250515002611 → 0.0.278-dev250515234639

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.
@@ -19,6 +19,7 @@ const jsxRuntime = require("react/jsx-runtime");
19
19
  const React = require("react");
20
20
  const QB = require("@malloydata/malloy-query-builder");
21
21
  const malloyTag = require("@malloydata/malloy-tag");
22
+ const malloyFilter = require("@malloydata/malloy-filter");
22
23
  require("@malloydata/render/webcomponent");
23
24
  const ReactDOM = require("react-dom");
24
25
  function _interopNamespaceDefault(e) {
@@ -33272,94 +33273,6 @@ class ErrorElement extends React__namespace.Component {
33272
33273
  return this.props.children;
33273
33274
  }
33274
33275
  }
33275
- function FilterOperations({
33276
- rootQuery,
33277
- filters
33278
- }) {
33279
- const {
33280
- setQuery
33281
- } = React.useContext(QueryEditorContext);
33282
- if (filters.length === 0) {
33283
- return null;
33284
- }
33285
- return /* @__PURE__ */ jsxRuntime.jsxs("div", {
33286
- children: [/* @__PURE__ */ jsxRuntime.jsx("div", {
33287
- ..._stylex.props(styles$s.title),
33288
- children: "filter by"
33289
- }), /* @__PURE__ */ jsxRuntime.jsx("div", {
33290
- ..._stylex.props(styles$s.tokenContainer),
33291
- children: filters.map((filterOperation, key2) => {
33292
- return /* @__PURE__ */ jsxRuntime.jsx(ErrorElement, {
33293
- fallback: /* @__PURE__ */ jsxRuntime.jsxs("div", {
33294
- children: ["Invalid filter", /* @__PURE__ */ jsxRuntime.jsx(ClearButton, {
33295
- onClick: () => {
33296
- filterOperation.delete();
33297
- setQuery == null ? void 0 : setQuery(rootQuery.build());
33298
- }
33299
- })]
33300
- }),
33301
- children: /* @__PURE__ */ jsxRuntime.jsx(SingleFilterOperation, {
33302
- filterOperation,
33303
- rootQuery
33304
- })
33305
- }, key2);
33306
- })
33307
- })]
33308
- });
33309
- }
33310
- function SingleFilterOperation({
33311
- rootQuery,
33312
- filterOperation
33313
- }) {
33314
- const {
33315
- fieldReference,
33316
- filterString
33317
- } = filterOperation.filter;
33318
- const filter = filterOperation.filter.getFilter();
33319
- const fieldInfo = fieldReference.getFieldInfo();
33320
- const {
33321
- setQuery
33322
- } = React.useContext(QueryEditorContext);
33323
- if (fieldInfo.kind !== "dimension" && fieldInfo.kind !== "measure") {
33324
- throw new Error(`Invalid filter field kind: ${fieldInfo.kind}`);
33325
- }
33326
- const setFilter = React.useCallback((filter2) => {
33327
- filterOperation.filter.setFilter(filter2);
33328
- setQuery == null ? void 0 : setQuery(rootQuery.build());
33329
- }, [filterOperation.filter, rootQuery, setQuery]);
33330
- const {
33331
- op,
33332
- value
33333
- } = parsedToLabels(filter, filterString);
33334
- const label = `${fieldInfo.name} ${op} ${value}`;
33335
- return /* @__PURE__ */ jsxRuntime.jsxs("div", {
33336
- ..._stylex.props(hoverStyles.main),
33337
- children: [/* @__PURE__ */ jsxRuntime.jsx(FilterPopover, {
33338
- fieldInfo,
33339
- path: fieldReference.path ?? [],
33340
- filter,
33341
- setFilter,
33342
- trigger: /* @__PURE__ */ jsxRuntime.jsx(Token, {
33343
- icon: "filter",
33344
- color: "cyan",
33345
- label
33346
- }),
33347
- layoutProps: {
33348
- align: "start",
33349
- side: "bottom",
33350
- sideOffset: 1
33351
- }
33352
- }), /* @__PURE__ */ jsxRuntime.jsx("div", {
33353
- ..._stylex.props(hoverStyles.hoverActions),
33354
- children: /* @__PURE__ */ jsxRuntime.jsx(ClearButton, {
33355
- onClick: () => {
33356
- filterOperation.delete();
33357
- setQuery == null ? void 0 : setQuery(rootQuery.build());
33358
- }
33359
- })
33360
- })]
33361
- });
33362
- }
33363
33276
  const parsedToLabels = (parsed, filterString) => {
33364
33277
  if (parsed.parsed === null) {
33365
33278
  return {
@@ -33539,6 +33452,94 @@ function displayTimeFromMoment(momentObj) {
33539
33452
  }
33540
33453
  return momentObj.moment;
33541
33454
  }
33455
+ function FilterOperations({
33456
+ rootQuery,
33457
+ filters
33458
+ }) {
33459
+ const {
33460
+ setQuery
33461
+ } = React.useContext(QueryEditorContext);
33462
+ if (filters.length === 0) {
33463
+ return null;
33464
+ }
33465
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", {
33466
+ children: [/* @__PURE__ */ jsxRuntime.jsx("div", {
33467
+ ..._stylex.props(styles$s.title),
33468
+ children: "filter by"
33469
+ }), /* @__PURE__ */ jsxRuntime.jsx("div", {
33470
+ ..._stylex.props(styles$s.tokenContainer),
33471
+ children: filters.map((filterOperation, key2) => {
33472
+ return /* @__PURE__ */ jsxRuntime.jsx(ErrorElement, {
33473
+ fallback: /* @__PURE__ */ jsxRuntime.jsxs("div", {
33474
+ children: ["Invalid filter", /* @__PURE__ */ jsxRuntime.jsx(ClearButton, {
33475
+ onClick: () => {
33476
+ filterOperation.delete();
33477
+ setQuery == null ? void 0 : setQuery(rootQuery.build());
33478
+ }
33479
+ })]
33480
+ }),
33481
+ children: /* @__PURE__ */ jsxRuntime.jsx(SingleFilterOperation, {
33482
+ filterOperation,
33483
+ rootQuery
33484
+ })
33485
+ }, key2);
33486
+ })
33487
+ })]
33488
+ });
33489
+ }
33490
+ function SingleFilterOperation({
33491
+ rootQuery,
33492
+ filterOperation
33493
+ }) {
33494
+ const {
33495
+ fieldReference,
33496
+ filterString
33497
+ } = filterOperation.filter;
33498
+ const filter = filterOperation.filter.getFilter();
33499
+ const fieldInfo = fieldReference.getFieldInfo();
33500
+ const {
33501
+ setQuery
33502
+ } = React.useContext(QueryEditorContext);
33503
+ if (fieldInfo.kind !== "dimension" && fieldInfo.kind !== "measure") {
33504
+ throw new Error(`Invalid filter field kind: ${fieldInfo.kind}`);
33505
+ }
33506
+ const setFilter = React.useCallback((filter2) => {
33507
+ filterOperation.filter.setFilter(filter2);
33508
+ setQuery == null ? void 0 : setQuery(rootQuery.build());
33509
+ }, [filterOperation.filter, rootQuery, setQuery]);
33510
+ const {
33511
+ op,
33512
+ value
33513
+ } = parsedToLabels(filter, filterString);
33514
+ const label = `${fieldInfo.name} ${op} ${value}`;
33515
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", {
33516
+ ..._stylex.props(hoverStyles.main),
33517
+ children: [/* @__PURE__ */ jsxRuntime.jsx(FilterPopover, {
33518
+ fieldInfo,
33519
+ path: fieldReference.path ?? [],
33520
+ filter,
33521
+ setFilter,
33522
+ trigger: /* @__PURE__ */ jsxRuntime.jsx(Token, {
33523
+ icon: "filter",
33524
+ color: "cyan",
33525
+ label
33526
+ }),
33527
+ layoutProps: {
33528
+ align: "start",
33529
+ side: "bottom",
33530
+ sideOffset: 1
33531
+ }
33532
+ }), /* @__PURE__ */ jsxRuntime.jsx("div", {
33533
+ ..._stylex.props(hoverStyles.hoverActions),
33534
+ children: /* @__PURE__ */ jsxRuntime.jsx(ClearButton, {
33535
+ onClick: () => {
33536
+ filterOperation.delete();
33537
+ setQuery == null ? void 0 : setQuery(rootQuery.build());
33538
+ }
33539
+ })
33540
+ })]
33541
+ });
33542
+ }
33542
33543
  function LimitOperation({
33543
33544
  rootQuery,
33544
33545
  limit
@@ -34644,8 +34645,128 @@ const styles$a = {
34644
34645
  $$css: true
34645
34646
  }
34646
34647
  };
34648
+ function FilterLiteralEditor({
34649
+ filterType,
34650
+ value,
34651
+ setValue
34652
+ }) {
34653
+ let filter = null;
34654
+ switch (filterType) {
34655
+ case "string_type":
34656
+ {
34657
+ const {
34658
+ parsed
34659
+ } = malloyFilter.StringFilterExpression.parse(value.filter_expression_value);
34660
+ filter = {
34661
+ kind: "string",
34662
+ parsed
34663
+ };
34664
+ }
34665
+ break;
34666
+ case "number_type":
34667
+ {
34668
+ const {
34669
+ parsed
34670
+ } = malloyFilter.NumberFilterExpression.parse(value.filter_expression_value);
34671
+ filter = {
34672
+ kind: "number",
34673
+ parsed
34674
+ };
34675
+ }
34676
+ break;
34677
+ case "boolean_type":
34678
+ {
34679
+ const {
34680
+ parsed
34681
+ } = malloyFilter.BooleanFilterExpression.parse(value.filter_expression_value);
34682
+ filter = {
34683
+ kind: "boolean",
34684
+ parsed
34685
+ };
34686
+ }
34687
+ break;
34688
+ case "date_type":
34689
+ {
34690
+ const {
34691
+ parsed
34692
+ } = malloyFilter.TemporalFilterExpression.parse(value.filter_expression_value);
34693
+ filter = {
34694
+ kind: "date",
34695
+ parsed
34696
+ };
34697
+ }
34698
+ break;
34699
+ case "timestamp_type":
34700
+ {
34701
+ const {
34702
+ parsed
34703
+ } = malloyFilter.TemporalFilterExpression.parse(value.filter_expression_value);
34704
+ filter = {
34705
+ kind: "timestamp",
34706
+ parsed
34707
+ };
34708
+ }
34709
+ break;
34710
+ }
34711
+ const {
34712
+ op,
34713
+ value: filterValue
34714
+ } = parsedToLabels(filter, value.filter_expression_value);
34715
+ const label = `${op} ${filterValue}`;
34716
+ const fieldInfo = {
34717
+ kind: "dimension",
34718
+ name: "parameter",
34719
+ type: {
34720
+ kind: filterType
34721
+ }
34722
+ };
34723
+ const setFilter = (parsed) => {
34724
+ switch (parsed.kind) {
34725
+ case "string":
34726
+ setValue({
34727
+ kind: "filter_expression_literal",
34728
+ filter_expression_value: malloyFilter.StringFilterExpression.unparse(parsed.parsed)
34729
+ });
34730
+ break;
34731
+ case "boolean":
34732
+ setValue({
34733
+ kind: "filter_expression_literal",
34734
+ filter_expression_value: malloyFilter.BooleanFilterExpression.unparse(parsed.parsed)
34735
+ });
34736
+ break;
34737
+ case "number":
34738
+ setValue({
34739
+ kind: "filter_expression_literal",
34740
+ filter_expression_value: malloyFilter.NumberFilterExpression.unparse(parsed.parsed)
34741
+ });
34742
+ break;
34743
+ case "date":
34744
+ case "timestamp":
34745
+ setValue({
34746
+ kind: "filter_expression_literal",
34747
+ filter_expression_value: malloyFilter.TemporalFilterExpression.unparse(parsed.parsed)
34748
+ });
34749
+ break;
34750
+ }
34751
+ };
34752
+ return /* @__PURE__ */ jsxRuntime.jsx(FilterPopover, {
34753
+ fieldInfo,
34754
+ path: [],
34755
+ filter,
34756
+ setFilter,
34757
+ trigger: /* @__PURE__ */ jsxRuntime.jsx(Token, {
34758
+ label
34759
+ }),
34760
+ layoutProps: {
34761
+ align: "start",
34762
+ side: "bottom",
34763
+ sideOffset: 1
34764
+ }
34765
+ });
34766
+ }
34647
34767
  function LiteralValueEditor({
34648
34768
  value,
34769
+ filterType,
34649
34770
  setValue,
34650
34771
  customStyle
34651
34772
  }) {
@@ -34700,12 +34821,10 @@ function LiteralValueEditor({
34700
34821
  customStyle
34701
34822
  });
34702
34823
  case "filter_expression_literal":
34703
- return /* @__PURE__ */ jsxRuntime.jsx(EditableToken, {
34704
- value: value.filter_expression_value,
34705
- onChange: (value2) => setValue({
34706
- kind: "filter_expression_literal",
34707
- filter_expression_value: value2
34708
- }),
34824
+ return /* @__PURE__ */ jsxRuntime.jsx(FilterLiteralEditor, {
34825
+ value,
34826
+ filterType,
34827
+ setValue,
34709
34828
  customStyle
34710
34829
  });
34711
34830
  }
@@ -34736,6 +34855,7 @@ function Parameters({
34736
34855
  icon: atomicTypeToIcon(parameter.type.kind),
34737
34856
  label: parameter.name
34738
34857
  }), /* @__PURE__ */ jsxRuntime.jsx(LiteralValueEditor, {
34858
+ filterType: parameter.type.kind === "filter_expression_type" ? parameter.type.filter_type.kind : "string_type",
34739
34859
  value: ((_a2 = source.tryGetParameter(parameter.name)) == null ? void 0 : _a2.parameter.value) ?? parameter.default_value,
34740
34860
  setValue: (value) => {
34741
34861
  source.setParameter(parameter.name, value);