@malloydata/malloy-explorer 0.0.282-dev250527225235 → 0.0.284-dev250528183401

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/dist/esm/index.js CHANGED
@@ -17,7 +17,7 @@ import { jsx, Fragment, jsxs } from "react/jsx-runtime";
17
17
  import * as React from "react";
18
18
  import React__default, { useLayoutEffect, useEffect, useMemo, useState, useRef, createElement, useContext, useCallback, createContext, memo, useReducer } from "react";
19
19
  import * as QB from "@malloydata/malloy-query-builder";
20
- import { ASTArrowQueryDefinition, ASTArrowViewDefinition, ASTSegmentViewDefinition, ASTNestViewOperation, ASTRefinementViewDefinition, ASTOrderByViewOperation, ASTGroupByViewOperation, ASTAggregateViewOperation, ASTLimitViewOperation, ASTTimeTruncationExpression, ASTFilterWithFilterString, ASTWhereViewOperation, ASTHavingViewOperation, ASTDrillViewOperation } from "@malloydata/malloy-query-builder";
20
+ import { ASTArrowQueryDefinition, ASTArrowViewDefinition, ASTSegmentViewDefinition, ASTNestViewOperation, ASTRefinementViewDefinition, ASTFilterWithLiteralEquality, ASTOrderByViewOperation, ASTGroupByViewOperation, ASTAggregateViewOperation, ASTLimitViewOperation, ASTTimeTruncationExpression, ASTFilterWithFilterString, ASTWhereViewOperation, ASTHavingViewOperation, ASTDrillViewOperation, ASTQuery } from "@malloydata/malloy-query-builder";
21
21
  import { Tag } from "@malloydata/malloy-tag";
22
22
  import { TemporalFilterExpression, BooleanFilterExpression, NumberFilterExpression, StringFilterExpression } from "@malloydata/malloy-filter";
23
23
  import "@malloydata/render/webcomponent";
@@ -26100,6 +26100,186 @@ const styles$s = {
26100
26100
  $$css: true
26101
26101
  }
26102
26102
  };
26103
+ function LiteralValue({
26104
+ value,
26105
+ customStyle
26106
+ }) {
26107
+ if (!value) {
26108
+ return /* @__PURE__ */ jsx(Token, {
26109
+ label: "∅"
26110
+ });
26111
+ }
26112
+ switch (value.kind) {
26113
+ case "boolean_literal":
26114
+ return /* @__PURE__ */ jsx(Token, {
26115
+ label: value.boolean_value ? "true" : "false",
26116
+ customStyle
26117
+ });
26118
+ case "date_literal":
26119
+ case "timestamp_literal":
26120
+ return /* @__PURE__ */ jsx(Token, {
26121
+ label: "TODO",
26122
+ customStyle
26123
+ });
26124
+ case "null_literal":
26125
+ return /* @__PURE__ */ jsx(Token, {
26126
+ label: "∅"
26127
+ });
26128
+ case "number_literal":
26129
+ return /* @__PURE__ */ jsx(Token, {
26130
+ label: value.number_value.toLocaleString(),
26131
+ customStyle
26132
+ });
26133
+ case "string_literal":
26134
+ return /* @__PURE__ */ jsx(Token, {
26135
+ label: value.string_value,
26136
+ customStyle
26137
+ });
26138
+ case "filter_expression_literal":
26139
+ return /* @__PURE__ */ jsx(Token, {
26140
+ label: value.filter_expression_value,
26141
+ customStyle
26142
+ });
26143
+ }
26144
+ }
26145
+ const QUERY_RENDERERS = ["table", "bar_chart", "dashboard", "json", "line_chart", "list", "list_detail", "point_map", "scatter_chart", "segment_map", "shape_map", "sparkline"];
26146
+ const ATOMIC_RENDERERS = ["number", "boolean", "currency", "image", "url", "percent", "text", "time"];
26147
+ const RENDERERS = [...QUERY_RENDERERS, ...ATOMIC_RENDERERS];
26148
+ function tagToRenderer(tag) {
26149
+ if (tag) {
26150
+ const tagProps = tag.getProperties();
26151
+ const tags = Object.keys(tagProps);
26152
+ for (const tag2 of tags) {
26153
+ if (RENDERERS.includes(tag2) && !tagProps[tag2].deleted) {
26154
+ return tag2;
26155
+ }
26156
+ }
26157
+ }
26158
+ return null;
26159
+ }
26160
+ function atomicTypeToIcon(type) {
26161
+ return atomicTypeMap[type];
26162
+ }
26163
+ function fieldKindToColor(kind) {
26164
+ return fieldKindMap[kind];
26165
+ }
26166
+ function fieldToIcon(field) {
26167
+ let icon;
26168
+ switch (field.kind) {
26169
+ case "view":
26170
+ icon = "query";
26171
+ break;
26172
+ case "dimension":
26173
+ case "measure":
26174
+ icon = atomicTypeToIcon(field.type.kind);
26175
+ break;
26176
+ case "join":
26177
+ icon = relationshipToIcon(field.relationship);
26178
+ break;
26179
+ }
26180
+ return icon;
26181
+ }
26182
+ function relationshipToIcon(relationship) {
26183
+ return relationshipMap[relationship];
26184
+ }
26185
+ function viewToVisualizationIcon(view) {
26186
+ const currentTag = view.getTag();
26187
+ const currentRenderer = tagToRenderer(currentTag) ?? "table";
26188
+ return `viz_${currentRenderer}`;
26189
+ }
26190
+ const atomicTypeMap = {
26191
+ array_type: "array",
26192
+ string_type: "string",
26193
+ date_type: "date",
26194
+ boolean_type: "boolean",
26195
+ number_type: "number",
26196
+ json_type: "json",
26197
+ record_type: "json",
26198
+ sql_native_type: "sql_native",
26199
+ timestamp_type: "date",
26200
+ filter_expression_type: "filter"
26201
+ };
26202
+ const fieldKindMap = {
26203
+ view: "purple",
26204
+ dimension: "cyan",
26205
+ measure: "green",
26206
+ join: void 0
26207
+ };
26208
+ const relationshipMap = {
26209
+ many: "many_to_one",
26210
+ cross: "one_to_many",
26211
+ one: "one_to_one"
26212
+ };
26213
+ function FieldToken({
26214
+ field,
26215
+ hoverActions,
26216
+ hoverActionsVisible,
26217
+ ...props2
26218
+ }) {
26219
+ let label = field.name;
26220
+ if (field.kind === "dimension" && (field.type.kind === "timestamp_type" || field.type.kind === "date_type")) {
26221
+ if (field.type.timeframe) {
26222
+ label += `.${field.type.timeframe}`;
26223
+ }
26224
+ }
26225
+ return /* @__PURE__ */ jsxs("div", {
26226
+ ...{
26227
+ 0: {
26228
+ className: "mly78zum5 mly6s0dn4 mly1nhvcw1 mly1jnr06f mly28fmrt mly1x0xcia"
26229
+ },
26230
+ 1: {
26231
+ className: "mly78zum5 mly6s0dn4 mly1nhvcw1 mly1jnr06f mlym9y5t7"
26232
+ }
26233
+ }[!!hoverActionsVisible << 0],
26234
+ children: [/* @__PURE__ */ jsx(Token, {
26235
+ label,
26236
+ color: fieldKindToColor(field.kind),
26237
+ icon: fieldToIcon(field),
26238
+ ...props2
26239
+ }), hoverActions && /* @__PURE__ */ jsx("div", {
26240
+ ...{
26241
+ className: "mly1vsucm1 mly2lah0s"
26242
+ },
26243
+ children: hoverActions
26244
+ })]
26245
+ });
26246
+ }
26247
+ function DrillOperations({
26248
+ drills
26249
+ }) {
26250
+ if (!drills.length) {
26251
+ return null;
26252
+ }
26253
+ return /* @__PURE__ */ jsxs("div", {
26254
+ children: [/* @__PURE__ */ jsx("div", {
26255
+ ..._stylex.props(styles$s.title),
26256
+ children: "drills"
26257
+ }), /* @__PURE__ */ jsx("div", {
26258
+ ...{
26259
+ className: "mly78zum5 mlydt5ytf mly1jnr06f"
26260
+ },
26261
+ children: drills.map((drill, key2) => /* @__PURE__ */ jsxs(TokenGroup, {
26262
+ color: "cyan",
26263
+ customStyle: localStyles.tokenGroup,
26264
+ children: [/* @__PURE__ */ jsx(FieldToken, {
26265
+ field: drill.filter.fieldReference.getFieldInfo()
26266
+ }), /* @__PURE__ */ jsx(Token, {
26267
+ label: "="
26268
+ }), drill.filter instanceof ASTFilterWithLiteralEquality ? /* @__PURE__ */ jsx(LiteralValue, {
26269
+ value: drill.filter.value.node
26270
+ }) : /* @__PURE__ */ jsx(Token, {
26271
+ label: drill.filter.filterString
26272
+ })]
26273
+ }, key2))
26274
+ })]
26275
+ });
26276
+ }
26277
+ const localStyles = {
26278
+ tokenGroup: {
26279
+ display: "mly78zum5",
26280
+ $$css: true
26281
+ }
26282
+ };
26103
26283
  function useCombinedRefs() {
26104
26284
  for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {
26105
26285
  refs[_key] = arguments[_key];
@@ -30036,108 +30216,6 @@ function findUniqueFieldName(fields, rename, path = []) {
30036
30216
  }
30037
30217
  return `${rename} ${idx}`;
30038
30218
  }
30039
- const QUERY_RENDERERS = ["table", "bar_chart", "dashboard", "json", "line_chart", "list", "list_detail", "point_map", "scatter_chart", "segment_map", "shape_map", "sparkline"];
30040
- const ATOMIC_RENDERERS = ["number", "boolean", "currency", "image", "url", "percent", "text", "time"];
30041
- const RENDERERS = [...QUERY_RENDERERS, ...ATOMIC_RENDERERS];
30042
- function tagToRenderer(tag) {
30043
- if (tag) {
30044
- const tagProps = tag.getProperties();
30045
- const tags = Object.keys(tagProps);
30046
- for (const tag2 of tags) {
30047
- if (RENDERERS.includes(tag2) && !tagProps[tag2].deleted) {
30048
- return tag2;
30049
- }
30050
- }
30051
- }
30052
- return null;
30053
- }
30054
- function atomicTypeToIcon(type) {
30055
- return atomicTypeMap[type];
30056
- }
30057
- function fieldKindToColor(kind) {
30058
- return fieldKindMap[kind];
30059
- }
30060
- function fieldToIcon(field) {
30061
- let icon;
30062
- switch (field.kind) {
30063
- case "view":
30064
- icon = "query";
30065
- break;
30066
- case "dimension":
30067
- case "measure":
30068
- icon = atomicTypeToIcon(field.type.kind);
30069
- break;
30070
- case "join":
30071
- icon = relationshipToIcon(field.relationship);
30072
- break;
30073
- }
30074
- return icon;
30075
- }
30076
- function relationshipToIcon(relationship) {
30077
- return relationshipMap[relationship];
30078
- }
30079
- function viewToVisualizationIcon(view) {
30080
- const currentTag = view.getTag();
30081
- const currentRenderer = tagToRenderer(currentTag) ?? "table";
30082
- return `viz_${currentRenderer}`;
30083
- }
30084
- const atomicTypeMap = {
30085
- array_type: "array",
30086
- string_type: "string",
30087
- date_type: "date",
30088
- boolean_type: "boolean",
30089
- number_type: "number",
30090
- json_type: "json",
30091
- record_type: "json",
30092
- sql_native_type: "sql_native",
30093
- timestamp_type: "date",
30094
- filter_expression_type: "filter"
30095
- };
30096
- const fieldKindMap = {
30097
- view: "purple",
30098
- dimension: "cyan",
30099
- measure: "green",
30100
- join: void 0
30101
- };
30102
- const relationshipMap = {
30103
- many: "many_to_one",
30104
- cross: "one_to_many",
30105
- one: "one_to_one"
30106
- };
30107
- function FieldToken({
30108
- field,
30109
- hoverActions,
30110
- hoverActionsVisible,
30111
- ...props2
30112
- }) {
30113
- let label = field.name;
30114
- if (field.kind === "dimension" && (field.type.kind === "timestamp_type" || field.type.kind === "date_type")) {
30115
- if (field.type.timeframe) {
30116
- label += `.${field.type.timeframe}`;
30117
- }
30118
- }
30119
- return /* @__PURE__ */ jsxs("div", {
30120
- ...{
30121
- 0: {
30122
- className: "mly78zum5 mly6s0dn4 mly1nhvcw1 mly1jnr06f mly28fmrt mly1x0xcia"
30123
- },
30124
- 1: {
30125
- className: "mly78zum5 mly6s0dn4 mly1nhvcw1 mly1jnr06f mlym9y5t7"
30126
- }
30127
- }[!!hoverActionsVisible << 0],
30128
- children: [/* @__PURE__ */ jsx(Token, {
30129
- label,
30130
- color: fieldKindToColor(field.kind),
30131
- icon: fieldToIcon(field),
30132
- ...props2
30133
- }), hoverActions && /* @__PURE__ */ jsx("div", {
30134
- ...{
30135
- className: "mly1vsucm1 mly2lah0s"
30136
- },
30137
- children: hoverActions
30138
- })]
30139
- });
30140
- }
30141
30219
  function BadgeForField({
30142
30220
  field
30143
30221
  }) {
@@ -34396,6 +34474,7 @@ function Operations({
34396
34474
  }) {
34397
34475
  const groupBys = [];
34398
34476
  const aggregates = [];
34477
+ const drills = [];
34399
34478
  const filters = [];
34400
34479
  const orderBys = [];
34401
34480
  const nests = [];
@@ -34417,8 +34496,9 @@ function Operations({
34417
34496
  orderBys.push(operation);
34418
34497
  } else if (operation instanceof ASTNestViewOperation) {
34419
34498
  nests.push(operation);
34420
- } else if (operation instanceof ASTDrillViewOperation) ;
34421
- else {
34499
+ } else if (operation instanceof ASTDrillViewOperation) {
34500
+ drills.push(operation);
34501
+ } else {
34422
34502
  limit = operation;
34423
34503
  }
34424
34504
  });
@@ -34436,6 +34516,9 @@ function Operations({
34436
34516
  segment,
34437
34517
  view,
34438
34518
  aggregates
34519
+ }), /* @__PURE__ */ jsx(DrillOperations, {
34520
+ rootQuery,
34521
+ drills
34439
34522
  }), /* @__PURE__ */ jsx(FilterOperations, {
34440
34523
  rootQuery,
34441
34524
  filters
@@ -35458,6 +35541,7 @@ const styles$5 = {
35458
35541
  }
35459
35542
  };
35460
35543
  function ResultDisplay({
35544
+ source,
35461
35545
  query
35462
35546
  }) {
35463
35547
  let displayComponent;
@@ -35491,6 +35575,7 @@ function ResultDisplay({
35491
35575
  break;
35492
35576
  case "finished":
35493
35577
  displayComponent = /* @__PURE__ */ jsx(ResponseDisplay, {
35578
+ source,
35494
35579
  response: query.response
35495
35580
  });
35496
35581
  break;
@@ -35498,6 +35583,7 @@ function ResultDisplay({
35498
35583
  return displayComponent;
35499
35584
  }
35500
35585
  function ResponseDisplay({
35586
+ source,
35501
35587
  response
35502
35588
  }) {
35503
35589
  let messageComponent = null;
@@ -35523,7 +35609,8 @@ function ResponseDisplay({
35523
35609
  children: [(response == null ? void 0 : response.runInfo) && /* @__PURE__ */ jsx(RunInfoHover, {
35524
35610
  runInfo: response.runInfo
35525
35611
  }), messageComponent, (response == null ? void 0 : response.result) && /* @__PURE__ */ jsx(RenderedResult, {
35526
- result: response.result
35612
+ result: response.result,
35613
+ source
35527
35614
  })]
35528
35615
  });
35529
35616
  }
@@ -35566,14 +35653,30 @@ function Banners({
35566
35653
  });
35567
35654
  }
35568
35655
  function RenderedResult({
35569
- result
35656
+ result,
35657
+ source
35570
35658
  }) {
35571
35659
  const [renderer, setRenderer] = useState();
35660
+ const {
35661
+ setQuery
35662
+ } = useContext(QueryEditorContext);
35572
35663
  useEffect(() => {
35573
35664
  const renderer2 = document.createElement("malloy-render");
35574
35665
  renderer2.malloyResult = result;
35666
+ renderer2.onDrill = ({
35667
+ stableQuery
35668
+ }) => {
35669
+ const rootQuery = new ASTQuery({
35670
+ query: stableQuery,
35671
+ source
35672
+ });
35673
+ setQuery == null ? void 0 : setQuery(rootQuery.build());
35674
+ };
35675
+ renderer2.tableConfig = {
35676
+ enableDrill: true
35677
+ };
35575
35678
  setRenderer(renderer2);
35576
- }, [result]);
35679
+ }, [result, source, setQuery]);
35577
35680
  if (renderer) {
35578
35681
  return /* @__PURE__ */ jsx(DOMElement, {
35579
35682
  element: renderer,
@@ -35813,6 +35916,7 @@ function ResultPanel({
35813
35916
  })]
35814
35917
  })]
35815
35918
  }), /* @__PURE__ */ jsx(ResultDisplay, {
35919
+ source,
35816
35920
  query: submittedQuery
35817
35921
  })]
35818
35922
  })