@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/cjs/index.cjs +211 -107
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/index.js +212 -108
- package/dist/esm/index.js.map +1 -1
- package/dist/types/components/QueryPanel/LiteralValue.d.ts +8 -0
- package/dist/types/components/QueryPanel/operations/DrillOperations.d.ts +6 -0
- package/dist/types/components/ResultPanel/ResultDisplay.d.ts +8 -2
- package/package.json +6 -6
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
|
-
|
|
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
|
})
|