ze-react-component-library
Version:
ZeroETP React Component Library
1,308 lines (1,163 loc) • 41.8 kB
JavaScript
import "antd/es/tabs/style";
import _Tabs from "antd/es/tabs";
import "antd/es/modal/style";
import _Modal from "antd/es/modal";
import "antd/es/divider/style";
import _Divider from "antd/es/divider";
import "antd/es/card/style";
import _Card from "antd/es/card";
import "antd/es/message/style";
import _message from "antd/es/message";
import "antd/es/input/style";
import _Input from "antd/es/input";
import "antd/es/spin/style";
import _Spin from "antd/es/spin";
import "antd/es/tag/style";
import _Tag from "antd/es/tag";
import "antd/es/space/style";
import _Space from "antd/es/space";
import "antd/es/menu/style";
import _Menu from "antd/es/menu";
import "antd/es/dropdown/style";
import _Dropdown from "antd/es/dropdown";
import "antd/es/empty/style";
import _Empty from "antd/es/empty";
import "antd/es/result/style";
import _Result from "antd/es/result";
import "antd/es/form/style";
import _Form from "antd/es/form";
import "antd/es/button/style";
import _Button from "antd/es/button";
import "antd/es/tooltip/style";
import _Tooltip from "antd/es/tooltip";
var __assign = this && this.__assign || function () {
__assign = Object.assign || function (t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) {
if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function (resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = this && this.__generator || function (thisArg, body) {
var _ = {
label: 0,
sent: function sent() {
if (t[0] & 1) throw t[1];
return t[1];
},
trys: [],
ops: []
},
f,
y,
t,
g;
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function () {
return this;
}), g;
function verb(n) {
return function (v) {
return step([n, v]);
};
}
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) {
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [0];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2]) _.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [6, e];
y = 0;
} finally {
f = t = 0;
}
}
if (op[0] & 5) throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
};
var __spreadArray = this && this.__spreadArray || function (to, from) {
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) {
to[j] = from[i];
}
return to;
};
/**
* 这个控件通过接受Logicform,展示复杂结果
*/
import { useRequest, useHistoryTravel, useSize } from "@umijs/hooks";
import { ErrorBoundary } from "react-error-boundary";
import React, { useState, useMemo, useEffect, useRef } from "react";
import _ from "underscore";
import { isDistinct, isEntity, isSimpleQuery } from "zeroetp-api-sdk";
import { requestGuess, requestLogicform, requestRecommend } from "../request";
import ZELogicformVisualizer from "../ZELogicformVisualizer";
import { EllipsisOutlined, CloseOutlined, ExclamationCircleOutlined, BugOutlined, EditOutlined, OrderedListOutlined } from "@ant-design/icons";
import RepresentationChanger from "./RepresentationChanger";
import "./ZECard.less";
import LogicFormTraveler from "./LogicFormTraveler";
import { ErrorFallBack, autoUnitForData, enableShowSubTotalsSetting } from "../util";
import GroupByMenu from "../components/GroupByMenu";
import CodeViewer from "../components/CodeViewer";
import ErrorDisplayer from "./ErrorDisplayer";
import MultiEntitySelector from "./MultiEntitySelector";
import ZEFeedback from "../ZEFeedback";
import { ThemeContext } from "../hooks/useTheme";
import useAsk from "../hooks/useAsk";
import { getDefaultRepresentation, representationMap, chartTypes } from "./representations";
import { drilldownLogicform, useDrillDownDbClick, formatLogicformForEditor } from "./util";
import useLocale from "../hooks/useLocale";
import LLMChatter from "./LLMChatter";
import { FrontConfigContext, useFrontConfig } from "../hooks/useFrontConfig";
import useCurrency, { CurrencySymbolContext } from "../hooks/useCurrency";
import ZESchemaForm from "../ZESchemaForm";
import LogicformEditor from "../components/LogicformEditor";
var CardCloseHandler = function CardCloseHandler(_a) {
var close = _a.close;
return close ? /*#__PURE__*/React.createElement(_Tooltip, {
title: "\u5173\u95ED\u6B64\u5361\u7247"
}, /*#__PURE__*/React.createElement(_Button, {
className: "ze-card-closer",
icon: /*#__PURE__*/React.createElement(CloseOutlined, null),
onClick: function onClick() {
return close();
}
})) : null;
};
var ZECard = function ZECard(_a) {
var _b;
var id = _a.id,
_loading = _a.loading,
showFeedback = _a.showFeedback,
initialLogicform = _a.logicform,
logicformQuery = _a.logicformQuery,
_formatResult = _a.formatResult,
_title = _a.title,
showTitleEditor = _a.showTitleEditor,
_question = _a.question,
titleRender = _a.titleRender,
warning = _a.warning,
mainContent = _a.mainContent,
additionalContent = _a.additionalContent,
extra = _a.extra,
_c = _a.extraMenus,
extraMenus = _c === void 0 ? [] : _c,
footer = _a.footer,
_d = _a.bodyStyle,
bodyStyle = _d === void 0 ? {} : _d,
_e = _a.headStyle,
headStyle = _e === void 0 ? {} : _e,
repr = _a.representation,
getResult = _a.getResult,
exportToExcel = _a.exportToExcel,
xlsx = _a.xlsx,
_f = _a.debug,
debug = _f === void 0 ? false : _f,
_g = _a.showRecommender,
showRecommender = _g === void 0 ? false : _g,
_h = _a.showRepresentationChanger,
showRepresentationChanger = _h === void 0 ? true : _h,
askMore = _a.askMore,
onChangeQuestion = _a.onChangeQuestion,
showMainContentOnly = _a.showMainContentOnly,
_j = _a.tableProps,
tableProps = _j === void 0 ? {} : _j,
_k = _a.sheetProps,
sheetProps = _k === void 0 ? {} : _k,
_l = _a.detailProps,
detailProps = _l === void 0 ? {} : _l,
_m = _a.showVisualizer,
showVisualizer = _m === void 0 ? true : _m,
_o = _a.visualizerProps,
visualizerProps = _o === void 0 ? {} : _o,
_p = _a.chartProps,
chartProps = _p === void 0 ? {} : _p,
_q = _a.compact,
compact = _q === void 0 ? false : _q,
pieThreshold = _a.pieThreshold,
barFirst = _a.barFirst,
_r = _a.valueDisplayerProps,
valueDisplayerProps = _r === void 0 ? {} : _r,
close = _a.close,
_s = _a.enableGroupByMenu,
enableGroupByMenu = _s === void 0 ? true : _s,
_onChange = _a.onChange,
askError = _a.askError,
askErrorPath = _a.askErrorPath,
_t = _a.useSheet,
useSheet = _t === void 0 ? true : _t,
_u = _a.allowDrillDown,
allowDrillDown = _u === void 0 ? true : _u,
preprocessDrilldownLogicform = _a.preprocessDrilldownLogicform,
_v = _a.useLLM,
useLLM = _v === void 0 ? false : _v,
refreshInterval = _a.refreshInterval,
_w = _a.theme,
theme = _w === void 0 ? "light" : _w,
style = _a.style,
_x = _a.showExtra,
showExtra = _x === void 0 ? true : _x,
chatAvatar = _a.chatAvatar,
promptTemplate = _a.promptTemplate,
llmMaxRows = _a.llmMaxRows,
llmProps = _a.llmProps,
_y = _a.echartsSetting,
_echartsSetting = _y === void 0 ? {
seriesLabel: {
show: true
},
averageLine: {
show: false
},
sheet: {
showSubTotals: true
}
} : _y,
_z = _a.enableEchartsSetting,
enableEchartsSetting = _z === void 0 ? true : _z,
analyzer = _a.analyzer,
_0 = _a.menuFilter,
menuFilter = _0 === void 0 ? function () {
return true;
} : _0;
var _1 = useState(_title),
title = _1[0],
setTitle = _1[1];
var _2 = useState(_title),
currentTitle = _2[0],
setCurrentTitle = _2[1];
var _3 = useState(false),
titleEditing = _3[0],
setTitleEditing = _3[1];
var t = useLocale().t;
var cardDivRef = useRef();
var contentRef = useRef();
var size = useSize(contentRef.current)[0];
var cardFullSize = useSize(cardDivRef.current)[0];
var currencyState = useCurrency(initialLogicform === null || initialLogicform === void 0 ? void 0 : initialLogicform.currency);
var _4 = useState(_echartsSetting),
echartsSetting = _4[0],
setEchartsSetting = _4[1];
var echartsSettingModalTrigger = useRef(null);
var form = _Form.useForm()[0]; // iframe: post message
if (window.top && window.top !== window) {
window.top.postMessage({
app: "chatbi",
action: "card/sizechange",
size: cardFullSize
}, "*");
} // question默认为title
var question = _question;
if (!_question) {
question = _title;
} // 手机最大宽度,适配charts
var isMobile = size.width && size.width <= 750;
var _5 = useState(null),
chartClickPos = _5[0],
setChartClickPos = _5[1];
var _6 = useHistoryTravel(initialLogicform),
logicform = _6.value,
_setLogicform = _6.setValue,
backLength = _6.backLength,
forwardLength = _6.forwardLength,
_go = _6.go,
_back = _6.back,
_forward = _6.forward;
var _7 = useState(),
logicFormWithSkipAndSort = _7[0],
setLogicFormWithSkipAndSort = _7[1];
var _8 = useState(),
errorMessage = _8[0],
setErrorMessage = _8[1]; // 用来给前端修正logicform的,比较常见的用法是MultiEntity
var _9 = useState(),
errorLogicform = _9[0],
setErrorLogicform = _9[1];
var _10 = useRequest(function () {
if (logicform) {
var lf = logicFormWithSkipAndSort || logicform;
return requestLogicform(__assign(__assign({}, lf), tableProps.dragSortable ? {
sort: __assign(__assign({}, lf.sort || {}), {
order: -1
})
} : {}));
} else {
return new Promise(function (resolve) {
return resolve(null);
});
}
}, {
pollingInterval: refreshInterval > 0 ? refreshInterval : undefined,
refreshDeps: [logicform, logicFormWithSkipAndSort, refreshInterval],
onSuccess: function onSuccess(res) {
getResult === null || getResult === void 0 ? void 0 : getResult(res);
setErrorMessage(undefined);
},
onError: function onError(e) {
// iframe: post message
if (window.top && window.top !== window) {
window.top.postMessage({
app: "chatbi",
action: "card/data",
error: e.message === "没有此数据权限" ? "noauth" : e.message
}, "*");
}
setErrorMessage(e.message);
},
formatResult: function formatResult(res) {
if (!res) return null; // iframe: post message
if (window.top && window.top !== window) {
window.top.postMessage({
app: "chatbi",
action: "data",
res: res
}, "*");
}
if (res.error) {
if (res.logicform) {
if (res.errorCode) {
return res;
} else {
setErrorLogicform(res);
}
}
return null;
}
var resData = res;
if (_formatResult) {
resData = _formatResult(res);
} // Feat: auto unit
autoUnitForData(resData, t);
return resData;
}
}),
data = _10.data,
dataLoading = _10.loading,
fetchData = _10.run;
var loading = _loading || dataLoading; // 图表设置是否展示显示小记的选项
var enableShowSubTotals = enableShowSubTotalsSetting(data === null || data === void 0 ? void 0 : data.logicform); // 前端配置
var frontConfig = useFrontConfig({
logicform: logicform,
echartsSetting: echartsSetting,
cardResult: data,
analyzer: analyzer
});
var recommendsWithGuess = useRequest(function () {
if (!initialLogicform || !showRecommender) {
return new Promise(function (resolve) {
return resolve({
data: []
});
});
}
return requestGuess(question);
}, {
initialData: [],
formatResult: function formatResult(res) {
return res.data;
}
}).data;
var recommends = useRequest(function () {
if (!initialLogicform || !showRecommender) {
return new Promise(function (resolve) {
return resolve({
recommends: []
});
});
}
return requestRecommend(initialLogicform);
}, {
initialData: [],
formatResult: function formatResult(res) {
return res.recommends;
}
}).data;
var _11 = useState(repr),
representation = _11[0],
setRepresentation = _11[1];
var _12 = useState(),
selectedItem = _12[0],
setSelectedItem = _12[1];
var _13 = useState(false),
showSql = _13[0],
setShowSql = _13[1];
var finalRepresentation = useMemo(function () {
var finalRep = representation;
if (data) {
finalRep = getDefaultRepresentation(data, pieThreshold, barFirst); // 用户指定的representation
if (data.logicform.representation && representationMap[data.logicform.representation].valid(data)) {
finalRep = data.logicform.representation;
}
if (representation && representationMap[representation].valid(data)) {
finalRep = representation;
}
}
return finalRep;
}, [data, representation]);
var onDbClick = useDrillDownDbClick({
logicform: logicform,
onChangeLogicform: function onChangeLogicform(logicform) {
if (allowDrillDown) {
preprocessDrilldownLogicform === null || preprocessDrilldownLogicform === void 0 ? void 0 : preprocessDrilldownLogicform(logicform);
_setLogicform(logicform);
}
},
back: _back
}).onDbClick;
var tableContent = useMemo(function () {
var finalTableProps = __assign(__assign({
logicform: logicform,
setLogicform: function setLogicform(val, valWithSkipAndSorter) {
if (val) {
_setLogicform(val);
}
setLogicFormWithSkipAndSort(valWithSkipAndSorter);
},
xlsx: xlsx,
exportToExcel: exportToExcel,
onRow: function onRow(record) {
return {
onClick: function onClick(e) {
onDbClick(record, data);
}
};
},
result: data,
reload: fetchData
}, tableProps), {
title: tableProps.title || title
});
return representationMap.table.component(finalTableProps);
}, [data, tableProps, exportToExcel, title]);
var content = useMemo(function () {
var _a, _b; // LLM
var showLLMChatter = data && useLLM;
var component;
var additionalComponent = null; // 自定义Content
if (mainContent) {
component = mainContent((data === null || data === void 0 ? void 0 : data.logicform) || logicform, data, _setLogicform);
}
if (additionalContent) {
additionalComponent = additionalContent((data === null || data === void 0 ? void 0 : data.logicform) || logicform, data, _setLogicform);
} // Error
if (errorMessage) {
console.log("errorMessage", errorMessage);
component = /*#__PURE__*/React.createElement(_Result, {
status: "error",
title: errorMessage
});
} // 如果没有自定义Content,则自动判断
if (!component) {
// console.log("finalRepresentation", finalRepresentation);
if (askError) {
component = /*#__PURE__*/React.createElement(ErrorDisplayer, {
question: question,
error: askError,
// helperLink={askErrorHelperLink}
// onChangeLogicform={(lf) => setLogicform(lf)}
askMore: askMore,
avatarSrc: chatAvatar
});
} else if (errorLogicform) {
component = /*#__PURE__*/React.createElement(MultiEntitySelector, {
logicform: logicform,
errorLogicform: errorLogicform,
onSelectEntity: function onSelectEntity(newLF) {
_setLogicform(newLF);
setErrorLogicform(null);
}
});
} else if (data === null || data === void 0 ? void 0 : data.errorCode) {
component = /*#__PURE__*/React.createElement(ErrorDisplayer, {
error: "\u62B1\u6B49\uFF0C\u4F3C\u4E4E\u9047\u5230\u4E86\u4E9B\u95EE\u9898\uFF0C\u4EE5\u4E0B\u662F\u62A5\u9519\u4FE1\u606F\uFF0C\u8BF7\u8054\u7CFB\u6280\u672F\u652F\u6301\u3002\n\n ````" + data.error + "````"
});
} else if (finalRepresentation === "table" && logicform && isSimpleQuery(logicform)) {
component = tableContent;
} else if (finalRepresentation === "value") {
component = representationMap.value.component(__assign(__assign({
data: data,
onChangeLogicform: _setLogicform
}, valueDisplayerProps), {
exportTitle: valueDisplayerProps.exportTitle || title
}));
} else if (data) {
if (!data.result || ((_a = data.result) === null || _a === void 0 ? void 0 : _a.length) === 0) {
component = /*#__PURE__*/React.createElement(_Empty, {
description: "\u6CA1\u6709\u6570\u636E"
});
} else if (chartTypes.includes(finalRepresentation)) {
component = representationMap[finalRepresentation].component(__assign(__assign({
result: data,
isMobile: isMobile,
eventsDict: {
click: function click(params, _item) {
// 20221223: 点击图表后出来的下钻菜单比较不舒服,暂时去掉
if (!params) {
setSelectedItem(null);
return;
}
var dataIndex = params.dataIndex;
var item = _item || (data === null || data === void 0 ? void 0 : data.result[dataIndex]);
if (item && JSON.stringify(item) === JSON.stringify(selectedItem)) {
// 重复点击,取消选中
setSelectedItem(null);
setChartClickPos(undefined);
return;
}
setChartClickPos(params === null || params === void 0 ? void 0 : params.event);
setSelectedItem(item);
},
dblclick: function dblclick(params, _item) {
var _a; // console.log("dblclick", params);
var dataIndex = params.dataIndex;
var item = _item || (data === null || data === void 0 ? void 0 : data.result[dataIndex]);
if (item) {
var drilldownData = __assign(__assign({}, data), {
logicform: __assign(__assign({}, data.logicform), {
// 图表数据处理后使用的groupby
groupby: item.groupby || ((_a = data.logicform) === null || _a === void 0 ? void 0 : _a.groupby)
})
});
drilldownLogicform(item, drilldownData, _setLogicform);
}
}
}
}, chartProps), {
title: chartProps.title || title
}));
} else if (finalRepresentation === "entity" && ((_b = data.result) === null || _b === void 0 ? void 0 : _b.length) === 1) {
component = representationMap.entity.component({
data: data,
tableProps: tableProps,
detailProps: detailProps
});
} else if (data && useSheet && data.logicform.groupby && data.columnProperties.find(function (p) {
return p.primal_type === "number";
}) // 这个条件是说没value的不要进来,例如$distinct
) {
component = representationMap.sheet.component(__assign(__assign({
logicform: logicform,
setLogicform: _setLogicform,
result: data,
xlsx: xlsx,
onChange: function onChange(v) {
_onChange === null || _onChange === void 0 ? void 0 : _onChange({
sheetProps: {
s2DataConfig: v
}
});
},
height: size.height,
onRow: function onRow(record) {
onDbClick(record, data);
}
}, sheetProps), {
title: sheetProps.title || title
}));
} else {
component = tableContent;
}
}
}
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
className: "ze-card-main-content",
ref: contentRef,
style: {
marginTop: compact ? 5 : 10
}
}, component), additionalComponent, data && /*#__PURE__*/React.createElement(LLMChatter, __assign({
hide: !showLLMChatter,
question: question,
data: data,
avatarSrc: chatAvatar,
promptTemplate: promptTemplate
}, llmProps, {
bodyStyle: llmMaxRows ? {
maxHeight: llmMaxRows * 22,
overflowY: "auto"
} : {}
})));
}, [data, logicform, finalRepresentation, errorLogicform, isMobile, compact, tableProps, errorMessage, useLLM, selectedItem, promptTemplate, mainContent]);
var renderGroupByMenu = function renderGroupByMenu() {
var _a, _b, _c, _d, _e;
if ((finalRepresentation === "value" || selectedItem) && enableGroupByMenu && chartClickPos) {
var maxHeight = 150;
return /*#__PURE__*/React.createElement(GroupByMenu, {
key: JSON.stringify(selectedItem),
result: data,
placement: "bottom",
onChangeLogicform: function onChangeLogicform(newLF) {
_setLogicform(newLF);
setSelectedItem(undefined);
},
selectedItem: selectedItem,
open: true,
onClose: function onClose() {
setSelectedItem(null);
setChartClickPos(undefined);
},
overlayClassName: "ze-card-group-by-menu-drop-down",
menuStyle: {
maxHeight: maxHeight > window.innerHeight / 2 ? window.innerHeight / 2 : maxHeight,
overflow: "auto"
}
}, /*#__PURE__*/React.createElement("div", {
style: {
position: "absolute",
left: ((_a = chartClickPos.event) === null || _a === void 0 ? void 0 : _a.clientX) - ((_d = (_c = (_b = cardDivRef.current) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect()) === null || _c === void 0 ? void 0 : _c.x) !== null && _d !== void 0 ? _d : 0),
top: ((_e = chartClickPos.event) === null || _e === void 0 ? void 0 : _e.zrY) + maxHeight / 2,
width: 1,
height: 1
}
}));
}
return null;
}; // extra + default extra
var extras = [];
if (extra) {
extras.push( /*#__PURE__*/React.createElement("div", {
key: "default"
}, extra));
}
if (backLength > 0) {
extras.push( /*#__PURE__*/React.createElement(LogicFormTraveler, {
key: "traveler",
go: function go(step) {
_go(step);
setSelectedItem(undefined);
},
back: function back() {
_back();
setSelectedItem(undefined);
},
forward: function forward() {
_forward();
setSelectedItem(undefined);
},
backLength: backLength,
forwardLength: forwardLength
}));
}
if (logicform && showRepresentationChanger && !isEntity(logicform) && !isDistinct(logicform)) {
var showEntityCard = false;
if (((_b = data === null || data === void 0 ? void 0 : data.schema) === null || _b === void 0 ? void 0 : _b.type) === "entity" && data.result.length === 1 && !logicform.groupby) {
showEntityCard = true;
}
if (!showEntityCard) {
extras.push( /*#__PURE__*/React.createElement(RepresentationChanger, {
key: "RepresentationChanger",
representationType: finalRepresentation,
onChange: function onChange(v) {
setRepresentation(v);
setSelectedItem(undefined);
},
result: data
})); // 下钻分析
extras.push( /*#__PURE__*/React.createElement(GroupByMenu, {
result: data,
key: "groupBy",
onChangeLogicform: _setLogicform,
placement: "bottomRight",
menuStyle: {
maxHeight: 300,
overflow: "auto"
}
}));
}
}
var dropdownMenuItems = __spreadArray([debug && {
label: "查看Sql",
key: "sql",
icon: /*#__PURE__*/React.createElement(BugOutlined, null),
onClick: function onClick() {
setShowSql(true);
}
}, enableEchartsSetting && {
label: t("图表设置"),
key: "echart",
icon: /*#__PURE__*/React.createElement(EditOutlined, null),
onClick: function onClick() {
if (echartsSettingModalTrigger.current) {
echartsSettingModalTrigger.current.click();
}
}
}, {
label: "显示数据明细",
key: "list",
icon: /*#__PURE__*/React.createElement(OrderedListOutlined, null),
onClick: function onClick() {
_setLogicform(__assign(__assign({}, logicform), {
preds: undefined,
groupby: undefined,
limit: undefined,
sort: undefined,
having: undefined,
skip: undefined
}));
}
}, showTitleEditor && {
label: "修改卡片标题",
key: "title",
icon: /*#__PURE__*/React.createElement(EditOutlined, null),
onClick: function onClick() {
setTitleEditing(true);
}
}], extraMenus).filter(function (f) {
return f && menuFilter(String(f.key));
});
if (dropdownMenuItems.length > 0) {
extras.push( /*#__PURE__*/React.createElement(_Dropdown, {
key: "more-drop",
overlay: /*#__PURE__*/React.createElement(_Menu, {
className: "ze-card-drop-menus",
items: dropdownMenuItems
}),
trigger: ["click"]
}, /*#__PURE__*/React.createElement(_Button, {
icon: /*#__PURE__*/React.createElement(EllipsisOutlined, null)
})));
}
extras.push( /*#__PURE__*/React.createElement(CardCloseHandler, {
close: close,
key: "close"
})); // Recommends
var totalRecommends = _.uniq(__spreadArray(__spreadArray([], (recommends || []).map(function (row) {
return row.question;
})), (recommendsWithGuess || []).map(function (row) {
return row.target;
}))); // console.log("totalRecommends", totalRecommends);
var recommendComponent;
var feedbackEl;
if ((totalRecommends === null || totalRecommends === void 0 ? void 0 : totalRecommends.length) > 0) {
recommendComponent = /*#__PURE__*/React.createElement("div", {
className: "ze-card-recommends"
}, /*#__PURE__*/React.createElement("div", {
className: "ze-card-recommends-title"
}, t("nlq.recommend")), /*#__PURE__*/React.createElement("div", {
className: "ze-card-recommends-content"
}, /*#__PURE__*/React.createElement(_Space, {
wrap: true,
className: "ze-card-recommends-items"
}, totalRecommends.slice(0, 5).map(function (g) {
return /*#__PURE__*/React.createElement(_Tooltip, {
key: g,
title: g,
placement: "top"
}, /*#__PURE__*/React.createElement(_Tag, {
className: "ze-tag-primary",
onClick: function onClick(e) {
e.preventDefault();
askMore === null || askMore === void 0 ? void 0 : askMore(g);
}
}, g));
}))));
}
if (showFeedback) {
feedbackEl = /*#__PURE__*/React.createElement(ZEFeedback, {
size: "small",
question: question,
logicform: initialLogicform ? JSON.stringify(logicform) : null,
style: showRecommender ? {
marginLeft: 92
} : {}
});
}
useEffect(function () {
setChartClickPos(null);
}, [loading]);
useEffect(function () {
_onChange === null || _onChange === void 0 ? void 0 : _onChange({
logicform: logicform,
title: title,
question: question,
representation: finalRepresentation,
echartsSetting: echartsSetting
});
}, [logicform, finalRepresentation, title, question, echartsSetting]);
if (showMainContentOnly) {
// 有自动refresh的情况下,不要spin
return /*#__PURE__*/React.createElement(_Spin, {
spinning: refreshInterval ? false : loading
}, content);
}
if (!warning || warning.length === 0) {
if (data === null || data === void 0 ? void 0 : data.columnProperties) {
warning = data.columnProperties.filter(function (property) {
var _a;
return ((_a = property.warning) === null || _a === void 0 ? void 0 : _a.length) > 0;
}).map(function (property) {
return property.name + "\uFF1A" + property.warning;
}).join("\n");
}
}
var renderTitleContent = function renderTitleContent() {
if (titleEditing) {
return /*#__PURE__*/React.createElement("div", {
style: {
width: "100%",
display: "flex",
alignItems: "center",
gap: 12,
paddingRight: 12
}
}, /*#__PURE__*/React.createElement(_Input, {
value: currentTitle,
style: {
flex: 1
},
allowClear: true,
onChange: function onChange(e) {
setCurrentTitle(e.target.value);
}
}), /*#__PURE__*/React.createElement(_Button, {
onClick: function onClick() {
setCurrentTitle(title);
setTitleEditing(false);
}
}, "\u53D6\u6D88"), /*#__PURE__*/React.createElement(_Button, {
type: "primary",
onClick: function onClick() {
var v = ("" + (currentTitle !== null && currentTitle !== void 0 ? currentTitle : "")).trim();
if (v.length > 0) {
setTitle(currentTitle);
setTitleEditing(false);
} else {
_message.error("卡片标题不能为空");
}
}
}, "\u786E\u5B9A"));
}
return titleRender ? titleRender(title) : title;
};
var resetForm = function resetForm() {
var _a, _b, _c;
var initialValues = {
是否显示图表标签: (_a = echartsSetting === null || echartsSetting === void 0 ? void 0 : echartsSetting.seriesLabel) === null || _a === void 0 ? void 0 : _a.show,
是否显示平均线: (_b = echartsSetting === null || echartsSetting === void 0 ? void 0 : echartsSetting.averageLine) === null || _b === void 0 ? void 0 : _b.show,
是否显示小计: enableShowSubTotals && ((_c = echartsSetting === null || echartsSetting === void 0 ? void 0 : echartsSetting.sheet) === null || _c === void 0 ? void 0 : _c.showSubTotals)
};
form.setFieldsValue(initialValues);
};
useEffect(function () {
resetForm();
}, [echartsSetting]);
useEffect(function () {
if (logicformQuery) {
_setLogicform(__assign(__assign({}, logicform), {
query: __assign(__assign({}, logicform.query || {}), logicformQuery)
}));
}
}, [logicformQuery]); // 有自动refresh的情况下,不要spin
return /*#__PURE__*/React.createElement(ThemeContext.Provider, {
value: {
theme: theme
}
}, /*#__PURE__*/React.createElement(CurrencySymbolContext.Provider, {
value: currencyState
}, /*#__PURE__*/React.createElement(FrontConfigContext.Provider, {
value: frontConfig
}, /*#__PURE__*/React.createElement(_Spin, {
spinning: refreshInterval ? false : loading
}, /*#__PURE__*/React.createElement("div", {
ref: cardDivRef,
className: ["ze-card", theme].join(" ")
}, /*#__PURE__*/React.createElement(_Card, {
size: compact ? "small" : "default",
title: /*#__PURE__*/React.createElement("div", {
id: id,
style: {
color: theme === "light" ? undefined : "white"
}
}, renderTitleContent()),
extra: showExtra ? /*#__PURE__*/React.createElement(_Space, null, extras) : undefined,
bodyStyle: __assign(__assign({}, bodyStyle), {
display: "flex",
flexDirection: "column"
}),
headStyle: headStyle,
style: __assign({
background: theme === "light" ? "white" : "transparent"
}, style)
}, showVisualizer && (data === null || data === void 0 ? void 0 : data.schema) && /*#__PURE__*/React.createElement(ZELogicformVisualizer, __assign({
mode: "compact"
}, visualizerProps, {
logicform: __assign(__assign({}, data.logicform), {
schemaName: data.schema.name
}),
onChange: function onChange(newLLF) {
_setLogicform(__assign(__assign({}, logicform), newLLF));
},
onQueryChange: function onQueryChange(query) {
_setLogicform(__assign(__assign({}, logicform), {
query: query,
// 重置entity_id
entity_id: undefined
}));
},
onChangeWord: function onChangeWord(word, subsitute) {
return __awaiter(void 0, void 0, void 0, function () {
var newQuestion;
return __generator(this, function (_a) {
newQuestion = question.replace(new RegExp(word, "gi"), subsitute);
onChangeQuestion === null || onChangeQuestion === void 0 ? void 0 : onChangeQuestion(newQuestion);
return [2
/*return*/
];
});
});
}
})), (warning === null || warning === void 0 ? void 0 : warning.length) > 0 && /*#__PURE__*/React.createElement("div", {
style: {
margin: compact ? 5 : 10
}
}, /*#__PURE__*/React.createElement(ExclamationCircleOutlined, {
className: "warningIcon"
}), /*#__PURE__*/React.createElement("span", {
style: {
marginLeft: 5,
color: "#525252"
}
}, warning)), content, (footer || recommendComponent || feedbackEl) && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_Divider, {
className: "ze-card-divider"
}), recommendComponent, typeof footer !== "function" && footer, typeof footer === "function" && footer(logicform), feedbackEl))), renderGroupByMenu(), /*#__PURE__*/React.createElement(_Modal, {
centered: true,
title: null,
open: showSql,
closable: true,
width: "calc(100% - 48px)",
bodyStyle: {
height: "70vh",
padding: 0
},
className: "ze-card-sql-viewer",
footer: false,
onCancel: function onCancel() {
setShowSql(false);
}
}, /*#__PURE__*/React.createElement(_Tabs, null, /*#__PURE__*/React.createElement(_Tabs.TabPane, {
tab: "SQL",
key: "item-1"
}, (data === null || data === void 0 ? void 0 : data.sqls) ? /*#__PURE__*/React.createElement(CodeViewer, {
code: data === null || data === void 0 ? void 0 : data.sqls,
language: "sql"
}) : "-"), /*#__PURE__*/React.createElement(_Tabs.TabPane, {
tab: "Logicform",
key: "item-2"
}, (data === null || data === void 0 ? void 0 : data.logicform) ? /*#__PURE__*/React.createElement(LogicformEditor, {
value: formatLogicformForEditor(data.logicform),
onChange: function onChange(v) {
_setLogicform(v);
setShowSql(false);
}
}) : "-"), /*#__PURE__*/React.createElement(_Tabs.TabPane, {
tab: "\u5206\u8BCD",
key: "item-3"
}, askErrorPath || (initialLogicform === null || initialLogicform === void 0 ? void 0 : initialLogicform._path) ? /*#__PURE__*/React.createElement("div", null, (askErrorPath || (initialLogicform === null || initialLogicform === void 0 ? void 0 : initialLogicform._path)).map(function (pathItem, i) {
var text = pathItem.n;
if (pathItem.norm && pathItem.norm !== pathItem.n && !pathItem.norm.startsWith("$")) {
text += "(" + pathItem.norm + ")";
}
var tooltipTitle = "";
if (pathItem.s) {
tooltipTitle = "schema: " + pathItem.s;
}
var color = "success";
if (pathItem.t === "unknown") {
color = "error";
tooltipTitle = "无法理解";
}
return /*#__PURE__*/React.createElement(_Tooltip, {
title: tooltipTitle,
key: i
}, /*#__PURE__*/React.createElement(_Tag, {
color: color
}, text));
})) : "-"))), /*#__PURE__*/React.createElement(ZESchemaForm, {
layout: "inline",
layoutType: "ModalForm",
trigger: /*#__PURE__*/React.createElement("div", {
ref: echartsSettingModalTrigger,
style: {
opacity: 0,
position: "fixed",
top: "-100vh",
left: "-100vw"
}
}),
form: form,
modalProps: {
title: t("图表设置"),
width: 600,
centered: true,
maskClosable: false,
onCancel: function onCancel() {
resetForm();
}
},
onFinish: function onFinish(v) {
return __awaiter(void 0, void 0, void 0, function () {
return __generator(this, function (_a) {
setEchartsSetting(function (p) {
return __assign(__assign({}, p), {
seriesLabel: __assign(__assign({}, p.seriesLabel), {
show: v.是否显示图表标签
}),
averageLine: __assign(__assign({}, p.averageLine), {
show: v.是否显示平均线
}),
sheet: {
showSubTotals: enableShowSubTotals && v.是否显示小计
}
});
});
return [2
/*return*/
, true];
});
});
},
schema: {
name: "echarts",
_id: "echarts",
type: "entity",
properties: [{
_id: "是否显示图表标签",
name: "是否显示图表标签",
type: "boolean",
primal_type: "boolean"
}, {
_id: "是否显示平均线",
name: "是否显示平均线",
type: "boolean",
primal_type: "boolean"
}, enableShowSubTotals ? {
_id: "是否显示小计",
name: "是否显示小计",
type: "boolean",
primal_type: "boolean"
} : null].filter(function (f) {
return f;
})
}
})))));
};
var ZECardWithAsk = function ZECardWithAsk(props) {
var enableAsk = props.question && !props.logicform; // 传入了question,未传入logicform时,触发ask请求
var _a = useAsk(__assign({
question: enableAsk ? props.question : undefined
}, props.askProps)),
answer = _a.answer,
logicformsToChoose = _a.logicformsToChoose,
render = _a.render,
loading = _a.loading;
var logicform = props.logicform || (answer === null || answer === void 0 ? void 0 : answer.logicform);
return /*#__PURE__*/React.createElement(ZECard, __assign({}, props, {
// ask接管过程中,报错的话要用card包裹
showMainContentOnly: logicform ? props.showMainContentOnly : false,
key: JSON.stringify(answer),
title: props.title || (answer === null || answer === void 0 ? void 0 : answer.question) || props.question,
loading: props.loading || loading,
mainContent: logicformsToChoose.length > 0 ? render : props.mainContent,
logicform: logicform,
askError: enableAsk ? (answer === null || answer === void 0 ? void 0 : answer.suggestion) || (answer === null || answer === void 0 ? void 0 : answer.error) : undefined,
askErrorPath: enableAsk ? answer === null || answer === void 0 ? void 0 : answer._path : undefined
}));
};
var ZECardWrapper = function ZECardWrapper(props) {
return /*#__PURE__*/React.createElement(ErrorBoundary, {
fallbackRender: function fallbackRender(errorProps) {
return /*#__PURE__*/React.createElement(ErrorFallBack, __assign({}, errorProps, {
cardProps: {
title: props.title,
extra: /*#__PURE__*/React.createElement(CardCloseHandler, {
close: props.close,
key: "close"
})
}
}));
}
}, /*#__PURE__*/React.createElement(ZECardWithAsk, __assign({}, props)));
};
export default ZECardWrapper;