@sentio/ui-dashboard 0.3.11 → 0.3.13

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/index.js CHANGED
@@ -30,6 +30,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/index.ts
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
+ AddPanel: () => AddPanel,
34
+ AddPanelSlideover: () => AddPanelSlideover,
33
35
  AggregateInput: () => AggregateInput,
34
36
  AreaIcon: () => AreaIcon_default,
35
37
  ArgumentInput: () => ArgumentInput,
@@ -41,7 +43,10 @@ __export(index_exports, {
41
43
  ChartLegend: () => ChartLegend,
42
44
  ChartTooltip: () => ChartTooltip,
43
45
  ChartTypeButtonGroup: () => ChartTypeButtonGroup,
46
+ CodeBlockWithTitle: () => CodeBlockWithTitle,
47
+ CurlDialog: () => CurlDialog,
44
48
  DEFAULT_HIGHLIGHT_KEY: () => DEFAULT_HIGHLIGHT_KEY,
49
+ DashboardButtonsMemo: () => DashboardButtonsMemo,
45
50
  DashboardRefresh: () => DashboardRefresh,
46
51
  DataControls: () => DataControls,
47
52
  EditDashboardDialog: () => EditDashboardDialog,
@@ -49,6 +54,10 @@ __export(index_exports, {
49
54
  ErrorChart: () => ErrorChart,
50
55
  EventsFunctionCategories: () => EventsFunctionCategories,
51
56
  EventsFunctionMap: () => EventsFunctionMap,
57
+ ExportChartMenu: () => ExportChartMenu,
58
+ ExportDashboardDialog: () => ExportDashboardDialog,
59
+ ExportType: () => ExportType,
60
+ ExtraSettingMenu: () => ExtraSettingMenu,
52
61
  FunctionInput: () => FunctionInput,
53
62
  FunctionMap: () => FunctionMap,
54
63
  FunctionsCategories: () => FunctionsCategories,
@@ -61,6 +70,7 @@ __export(index_exports, {
61
70
  LineControls: () => LineControls,
62
71
  LineIcon: () => LineIcon_default,
63
72
  MarkerControls: () => MarkerControls,
73
+ PanelOwner: () => PanelOwner,
64
74
  PieChart: () => PieChart2,
65
75
  PieChartControls: () => PieChartControls,
66
76
  PieIcon: () => PieIcon_default,
@@ -68,6 +78,7 @@ __export(index_exports, {
68
78
  QueryValueControls: () => QueryValueControls,
69
79
  QueryValueIcon: () => QueryValueIcon_default,
70
80
  ReactEChartsBase: () => ReactEChartsBase,
81
+ ReadonlyExtraSettingMenu: () => ReadonlyExtraSettingMenu,
71
82
  RefreshButton: () => RefreshButton,
72
83
  RefreshContext: () => RefreshContext,
73
84
  ScatterChartTooltip: () => ScatterChartTooltip,
@@ -80,21 +91,33 @@ __export(index_exports, {
80
91
  TableIcon: () => TableIcon_default,
81
92
  TimeRangeOverride: () => TimeRangeOverride,
82
93
  TimeSeriesChart: () => TimeSeriesChart,
94
+ UserInfo: () => UserInfo,
83
95
  ValueControls: () => ValueControls,
84
96
  ValueFormatters: () => ValueFormatters,
85
97
  ValueOptions: () => ValueOptions,
86
98
  ValueStringMapping: () => ValueStringMapping,
87
99
  XAxisControls: () => XAxisControls,
88
100
  YaxisControls: () => YaxisControls,
101
+ defaultAnalyticChart: () => defaultAnalyticChart,
89
102
  defaultBarGaugeConfig: () => defaultConfig2,
90
103
  defaultDataConfig: () => defaultConfig5,
104
+ defaultEventChart: () => defaultEventChart,
105
+ defaultGroupChart: () => defaultGroupChart,
106
+ defaultInsightChart: () => defaultInsightChart,
107
+ defaultMetricChart: () => defaultMetricChart,
108
+ defaultNoteChart: () => defaultNoteChart,
91
109
  defaultPieConfig: () => defaultConfig,
92
110
  defaultQueryValueConfig: () => defaultConfig9,
111
+ defaultRetentionChart: () => defaultRetentionChart,
93
112
  defaultScatterConfig: () => defaultConfig6,
113
+ defaultSqlChart: () => defaultSqlChart,
94
114
  defaultTableConfig: () => defaultConfig7,
95
115
  defaultTimeRangeOverrideConfig: () => defaultConfig8,
96
116
  defaultValueConfig: () => defaultConfig3,
97
117
  defaultValueControlsConfig: () => defaultConfig4,
118
+ escapeBody: () => escapeBody,
119
+ generateCurlCode: () => generateCurlCode,
120
+ generateNodeCode: () => generateNodeCode,
98
121
  getDefaultValueConfig: () => getDefaultValueConfig,
99
122
  getHighlightHex: () => getHighlightHex,
100
123
  isAggrOrRollupFunction: () => isAggrOrRollupFunction,
@@ -6682,8 +6705,8 @@ function aliasTemplate(alias, labels) {
6682
6705
  function escapeColumnId(id) {
6683
6706
  return id.replace(/[\W_.]+/g, "_");
6684
6707
  }
6685
- function getColumnNameId(labels, alias, displayName) {
6686
- const s = aliasTemplate(alias, labels) || (0, import_lodash12.startCase)(displayName);
6708
+ function getColumnNameId(labels, alias, displayName2) {
6709
+ const s = aliasTemplate(alias, labels) || (0, import_lodash12.startCase)(displayName2);
6687
6710
  return { columnName: s, columnId: escapeColumnId(s) };
6688
6711
  }
6689
6712
 
@@ -7968,8 +7991,1315 @@ var ImportPanelDialog = ({
7968
7991
  }
7969
7992
  );
7970
7993
  };
7994
+
7995
+ // src/dashboard/ExportDashboardDialog.tsx
7996
+ var import_ui_core37 = require("@sentio/ui-core");
7997
+ var import_react33 = __toESM(require("@monaco-editor/react"));
7998
+ var import_lu11 = require("react-icons/lu");
7999
+ var import_jsx_runtime49 = require("react/jsx-runtime");
8000
+ function ExportDashboardDialog({
8001
+ open,
8002
+ onClose,
8003
+ dashboardId,
8004
+ json,
8005
+ onBeforeMount
8006
+ }) {
8007
+ const isDarkMode = (0, import_ui_core37.useDarkMode)();
8008
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
8009
+ import_ui_core37.BaseDialog,
8010
+ {
8011
+ title: "Export dashboard JSON",
8012
+ open,
8013
+ onClose,
8014
+ onCancel: onClose,
8015
+ cancelText: "Close",
8016
+ footerBorder: false,
8017
+ extraButtons: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "absolute left-4 inline-flex", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
8018
+ "a",
8019
+ {
8020
+ download: dashboardId ? `dashboard-${dashboardId}.json` : "dashboard.json",
8021
+ href: "data:text/json;charset=utf-8," + encodeURIComponent(json),
8022
+ children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_ui_core37.Button, { role: "text", icon: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lu11.LuDownload, {}), children: "Save to a file" })
8023
+ }
8024
+ ) }),
8025
+ children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("form", { className: "relative", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "px-[18px] py-4", children: [
8026
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
8027
+ "div",
8028
+ {
8029
+ className: "absolute right-10 top-8 z-10",
8030
+ onClick: (evt) => evt.preventDefault(),
8031
+ children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_ui_core37.CopyButton, { text: json, size: 16 })
8032
+ }
8033
+ ),
8034
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "focus-within:border-primary-300 h-[324px] overflow-hidden rounded-sm border", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
8035
+ import_react33.default,
8036
+ {
8037
+ value: json,
8038
+ theme: isDarkMode ? "sentio-dark" : "sentio",
8039
+ language: "json",
8040
+ beforeMount: onBeforeMount,
8041
+ options: {
8042
+ readOnly: true,
8043
+ minimap: { enabled: false },
8044
+ lineNumbers: "off"
8045
+ }
8046
+ }
8047
+ ) })
8048
+ ] }) })
8049
+ }
8050
+ );
8051
+ }
8052
+
8053
+ // src/dashboard/CurlDialog.tsx
8054
+ var import_react36 = require("react");
8055
+ var import_react37 = require("@headlessui/react");
8056
+ var import_ui_core39 = require("@sentio/ui-core");
8057
+ var import_tb = require("react-icons/tb");
8058
+ var import_lu13 = require("react-icons/lu");
8059
+ var import_omit = __toESM(require("lodash/omit"));
8060
+
8061
+ // src/common/CodeBlock.tsx
8062
+ var import_react34 = __toESM(require("@monaco-editor/react"));
8063
+ var import_react35 = require("react");
8064
+ var import_ui_core38 = require("@sentio/ui-core");
8065
+ var import_lu12 = require("react-icons/lu");
8066
+ var import_jsx_runtime50 = require("react/jsx-runtime");
8067
+ var LANGUAGE_MAP = {
8068
+ bash: "shell",
8069
+ jsx: "javascript",
8070
+ tsx: "typescript"
8071
+ };
8072
+ function toMonacoLanguage(lang) {
8073
+ return LANGUAGE_MAP[lang] ?? lang;
8074
+ }
8075
+ var BASE_OPTIONS = {
8076
+ readOnly: true,
8077
+ scrollBeyondLastLine: false,
8078
+ minimap: { enabled: false },
8079
+ renderLineHighlight: "none",
8080
+ folding: false
8081
+ };
8082
+ var CodeBlockWithTitle = ({
8083
+ title,
8084
+ icon,
8085
+ value,
8086
+ language,
8087
+ showLineNumbers,
8088
+ maxHeight = "300px",
8089
+ className,
8090
+ onBeforeMount
8091
+ }) => {
8092
+ const isDarkMode = (0, import_ui_core38.useDarkMode)();
8093
+ const [collapsed, setCollapsed] = (0, import_react35.useState)(false);
8094
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(
8095
+ "div",
8096
+ {
8097
+ className: (0, import_ui_core38.classNames)(
8098
+ "text-icontent border-main overflow-hidden rounded-lg border",
8099
+ className
8100
+ ),
8101
+ children: [
8102
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(
8103
+ "div",
8104
+ {
8105
+ className: "flex w-full cursor-pointer items-center justify-between border-b bg-gray-200 p-2",
8106
+ onClick: () => setCollapsed((c) => !c),
8107
+ children: [
8108
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("span", { className: "text-ilabel text-text-foreground font-medium", children: [
8109
+ icon,
8110
+ title
8111
+ ] }),
8112
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("div", { className: "flex items-center gap-1", children: [
8113
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_ui_core38.CopyButton, { text: value, size: 16 }) }),
8114
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
8115
+ import_lu12.LuChevronDown,
8116
+ {
8117
+ className: (0, import_ui_core38.classNames)(
8118
+ "text-text-foreground-secondary h-4 w-4 transition-transform duration-200",
8119
+ collapsed ? "-rotate-90" : ""
8120
+ )
8121
+ }
8122
+ )
8123
+ ] })
8124
+ ]
8125
+ }
8126
+ ),
8127
+ !collapsed && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
8128
+ import_react34.default,
8129
+ {
8130
+ theme: isDarkMode ? "sentio-dark" : "sentio",
8131
+ language: toMonacoLanguage(language),
8132
+ value,
8133
+ height: maxHeight,
8134
+ beforeMount: onBeforeMount,
8135
+ options: {
8136
+ ...BASE_OPTIONS,
8137
+ lineNumbers: showLineNumbers ? "on" : "off"
8138
+ }
8139
+ }
8140
+ )
8141
+ ]
8142
+ }
8143
+ );
8144
+ };
8145
+
8146
+ // src/dashboard/code-utils.ts
8147
+ var import_isEmpty = __toESM(require("lodash/isEmpty"));
8148
+ function escapeBody(body) {
8149
+ if (typeof body !== "string") return body;
8150
+ return body.replace(/'/g, `'\\''`);
8151
+ }
8152
+ function generateNodeCode(url, data, headers, apiKey = "<API_KEY>", method = "POST", apiKeyPosition = "header") {
8153
+ if (apiKeyPosition === "header") {
8154
+ headers = headers ? { ...headers, "api-key": apiKey } : { "api-key": apiKey };
8155
+ } else {
8156
+ url = url.includes("?") ? `${url}&api-key=${apiKey}` : `${url}?api-key=${apiKey}`;
8157
+ }
8158
+ return `const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
8159
+
8160
+ const url = '${url}';
8161
+ const data = ${JSON.stringify(data, null, 2)};
8162
+ const method = '${method}';
8163
+ ${headers ? `const headers = ${JSON.stringify(headers, null, 2)};` : ""}
8164
+
8165
+ fetch(url, {
8166
+ method,
8167
+ headers: {
8168
+ 'Content-Type': 'application/json',${headers ? "\n ...headers," : ""}
8169
+ },
8170
+ body: method === 'GET' ? undefined : JSON.stringify(data),
8171
+ })
8172
+ .then(response => {
8173
+ if (!response.ok) {
8174
+ throw new Error('Network response was not ok');
8175
+ }
8176
+ return response.json();
8177
+ })
8178
+ .then(data => {
8179
+ // Do something with the data
8180
+ console.log(data);
8181
+ })
8182
+ .catch(error => {
8183
+ // Handle the error
8184
+ console.error('Error:', error);
8185
+ });
8186
+
8187
+ `;
8188
+ }
8189
+ function generateCurlCode(url, data, headers, apiKey = "<API_KEY>", method = "POST", apiKeyPosition = "header") {
8190
+ if (apiKeyPosition === "header") {
8191
+ headers = headers ? { ...headers, "api-key": apiKey } : { "api-key": apiKey };
8192
+ } else {
8193
+ url = url.includes("?") ? `${url}&api-key=${apiKey}` : `${url}?api-key=${apiKey}`;
8194
+ }
8195
+ let curlCommand = `curl -L -X ${method} '${url}' \\
8196
+ -H 'Content-Type: application/json'`;
8197
+ if (headers && !(0, import_isEmpty.default)(headers)) {
8198
+ curlCommand += " \\\n" + Object.entries(headers).map(([key, value]) => ` -H '${key}: ${value}' \\`).join("\n");
8199
+ } else {
8200
+ curlCommand += ` \\`;
8201
+ }
8202
+ if (data) {
8203
+ curlCommand += `
8204
+ --data-raw '${escapeBody(JSON.stringify(data, null, 2))}'`;
8205
+ } else {
8206
+ curlCommand = curlCommand.slice(0, -1);
8207
+ }
8208
+ return curlCommand;
8209
+ }
8210
+
8211
+ // src/dashboard/CurlDialog.tsx
8212
+ var import_jsx_runtime51 = require("react/jsx-runtime");
8213
+ var ExportType = /* @__PURE__ */ ((ExportType2) => {
8214
+ ExportType2["CURL"] = "curl";
8215
+ ExportType2["NODE"] = "node";
8216
+ return ExportType2;
8217
+ })(ExportType || {});
8218
+ function CurlDialog({
8219
+ open,
8220
+ onClose,
8221
+ payload,
8222
+ apiHost = "",
8223
+ apiUrl,
8224
+ headers,
8225
+ defaultType = "curl" /* CURL */,
8226
+ noOmit,
8227
+ onBeforeMount
8228
+ }) {
8229
+ const data = noOmit ? payload : (0, import_omit.default)(payload, ["projectSlug", "projectOwner", "projectId"]);
8230
+ const [type, setType] = (0, import_react36.useState)(defaultType);
8231
+ const [curlContent, setCurlContent] = (0, import_react36.useState)("");
8232
+ const [curlContentWithApiKey, setCurlContentWithApiKey] = (0, import_react36.useState)("");
8233
+ const [nodeContent, setNodeContent] = (0, import_react36.useState)("");
8234
+ (0, import_react36.useEffect)(() => {
8235
+ let path = apiUrl || "";
8236
+ path = path.startsWith("/api/") ? path.substring(4) : path;
8237
+ const url = path.startsWith("/") ? `${apiHost}${path}` : path;
8238
+ setCurlContent(generateCurlCode(url, data, headers));
8239
+ setCurlContentWithApiKey(
8240
+ generateCurlCode(url, data, headers, void 0, void 0, "param")
8241
+ );
8242
+ setNodeContent(generateNodeCode(url, data, headers));
8243
+ }, [apiUrl, apiHost, data, headers]);
8244
+ (0, import_react36.useEffect)(() => {
8245
+ setType(defaultType);
8246
+ }, [defaultType]);
8247
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_react37.Transition.Root, { show: open, as: import_react36.Fragment, children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
8248
+ import_react37.Dialog,
8249
+ {
8250
+ as: "div",
8251
+ className: "text-icontent relative z-10",
8252
+ onClose,
8253
+ children: [
8254
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
8255
+ import_react37.Transition.Child,
8256
+ {
8257
+ as: import_react36.Fragment,
8258
+ enter: "ease-out duration-300",
8259
+ enterFrom: "opacity-0",
8260
+ enterTo: "opacity-100",
8261
+ leave: "ease-in duration-200",
8262
+ leaveFrom: "opacity-100",
8263
+ leaveTo: "opacity-0",
8264
+ children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "fixed inset-0 bg-gray-200/40 transition-opacity dark:bg-gray-200/50" })
8265
+ }
8266
+ ),
8267
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "fixed inset-0 z-10 overflow-y-auto", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
8268
+ import_react37.Transition.Child,
8269
+ {
8270
+ as: import_react36.Fragment,
8271
+ enter: "ease-out duration-300",
8272
+ enterFrom: "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95",
8273
+ enterTo: "opacity-100 translate-y-0 sm:scale-100",
8274
+ leave: "ease-in duration-200",
8275
+ leaveFrom: "opacity-100 translate-y-0 sm:scale-100",
8276
+ leaveTo: "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95",
8277
+ children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_react37.Dialog.Panel, { className: "bg-default-bg relative transform overflow-hidden rounded-lg pb-4 pt-5 text-left shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-4xl", children: [
8278
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
8279
+ import_react37.Dialog.Title,
8280
+ {
8281
+ as: "h3",
8282
+ className: "text-text-foreground px-4 text-lg font-medium leading-6 sm:px-6",
8283
+ children: "Export As Code Snippet"
8284
+ }
8285
+ ),
8286
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: "my-2 space-y-4 border-t px-4 pt-4 sm:px-6", children: [
8287
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: "text-icontent bg-primary-50 flex w-full flex-wrap items-center justify-between gap-y-1 rounded-md px-4 py-2 font-medium", children: [
8288
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("span", { children: [
8289
+ "Replace",
8290
+ " ",
8291
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("code", { className: "text-primary-600 dark:text-primary-800", children: "<API_KEY>" }),
8292
+ ` `,
8293
+ "with your real API key."
8294
+ ] }),
8295
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("a", { href: "/profile/apikeys", target: "_blank", rel: "noreferrer", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: "border-primary-400 text-primary-600 dark:text-primary-800 dark:border-primary-600 hover:bg-primary-100 active:bg-primary-200 flex flex-row items-center justify-center gap-1 rounded-md border border-solid pb-[7px] pl-2.5 pr-2.5 pt-[7px]", children: [
8296
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "text-icontent text-left font-medium", children: "Create a new API Key" }),
8297
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_lu13.LuArrowRight, { className: "h-4 w-4" })
8298
+ ] }) })
8299
+ ] }),
8300
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
8301
+ import_ui_core39.NewButtonGroup,
8302
+ {
8303
+ value: type,
8304
+ onChange: setType,
8305
+ buttons: [
8306
+ {
8307
+ label: "Shell",
8308
+ value: "curl" /* CURL */,
8309
+ icon: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_ui_core39.ShellIcon, { className: "mr-2 h-4 w-4" })
8310
+ },
8311
+ {
8312
+ label: "Node",
8313
+ value: "node" /* NODE */,
8314
+ icon: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tb.TbBrandNodejs, { className: "mr-2 h-4 w-4" })
8315
+ }
8316
+ ]
8317
+ }
8318
+ ) }),
8319
+ type === "curl" /* CURL */ && /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_jsx_runtime51.Fragment, { children: [
8320
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
8321
+ CodeBlockWithTitle,
8322
+ {
8323
+ value: curlContent,
8324
+ showLineNumbers: true,
8325
+ language: "bash",
8326
+ title: "Shell (Auth with Header)",
8327
+ icon: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tb.TbTerminal, { className: "mr-2 inline-block h-4 w-4" }),
8328
+ onBeforeMount
8329
+ }
8330
+ ),
8331
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
8332
+ CodeBlockWithTitle,
8333
+ {
8334
+ value: curlContentWithApiKey,
8335
+ showLineNumbers: true,
8336
+ language: "bash",
8337
+ title: "Shell (Auth with Query Param)",
8338
+ icon: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tb.TbTerminal, { className: "mr-2 inline-block h-4 w-4" }),
8339
+ onBeforeMount
8340
+ }
8341
+ )
8342
+ ] }),
8343
+ type === "node" /* NODE */ && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
8344
+ CodeBlockWithTitle,
8345
+ {
8346
+ value: nodeContent,
8347
+ showLineNumbers: true,
8348
+ language: "typescript",
8349
+ title: "Nodejs",
8350
+ icon: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_tb.TbBrandNodejs, { className: "mr-2 inline-block h-4 w-4" }),
8351
+ onBeforeMount
8352
+ }
8353
+ )
8354
+ ] })
8355
+ ] })
8356
+ }
8357
+ ) }) })
8358
+ ]
8359
+ }
8360
+ ) });
8361
+ }
8362
+
8363
+ // src/dashboard/PanelOwner.tsx
8364
+ var import_ui_core41 = require("@sentio/ui-core");
8365
+
8366
+ // src/common/ImgWithFallback.tsx
8367
+ var import_react38 = require("react");
8368
+ var import_ui_core40 = require("@sentio/ui-core");
8369
+ var import_jsx_runtime52 = require("react/jsx-runtime");
8370
+ var TRANSPARENT_GIF = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";
8371
+ var ImgWithFallback = ({
8372
+ src,
8373
+ fallback = TRANSPARENT_GIF,
8374
+ ...props
8375
+ }) => {
8376
+ const [loadError, setLoadError] = (0, import_react38.useState)(false);
8377
+ (0, import_react38.useEffect)(() => {
8378
+ setLoadError(false);
8379
+ }, [src]);
8380
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
8381
+ "img",
8382
+ {
8383
+ alt: "",
8384
+ "data-src": src,
8385
+ src: loadError ? fallback : src ?? fallback,
8386
+ ...props,
8387
+ className: (0, import_ui_core40.classNames)(
8388
+ props.className,
8389
+ loadError && "bg-gray-200 dark:bg-gray-700"
8390
+ ),
8391
+ onError: () => {
8392
+ setLoadError(true);
8393
+ }
8394
+ }
8395
+ );
8396
+ };
8397
+
8398
+ // src/dashboard/PanelOwner.tsx
8399
+ var import_jsx_runtime53 = require("react/jsx-runtime");
8400
+ var USER_CONTAINER_CLASSES = "inline-flex items-center gap-1 px-1 text-xs cursor-pointer";
8401
+ var AVATAR_CLASSES = "h-3 w-3 rounded-full";
8402
+ var TOOLTIP_CLASSES = "flex items-center gap-2";
8403
+ var LABEL_CLASSES = "text-xs font-semibold text-text-foreground-secondary";
8404
+ function displayName(user) {
8405
+ return user.firstName && user.lastName ? `${user.firstName} ${user.lastName}` : user.username;
8406
+ }
8407
+ var UserInfo = ({
8408
+ avatarSrc,
8409
+ avatarAlt,
8410
+ username,
8411
+ containerClassName = USER_CONTAINER_CLASSES
8412
+ }) => /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: containerClassName, children: [
8413
+ avatarSrc && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8414
+ ImgWithFallback,
8415
+ {
8416
+ className: AVATAR_CLASSES,
8417
+ src: avatarSrc,
8418
+ alt: avatarAlt || username || ""
8419
+ }
8420
+ ),
8421
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("span", { className: "max-w-[120px] truncate", children: username })
8422
+ ] });
8423
+ var TooltipUserDisplay = ({
8424
+ user,
8425
+ label,
8426
+ onNavigateToUser
8427
+ }) => /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: "flex flex-col gap-1 p-1", children: [
8428
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("div", { className: LABEL_CLASSES, children: label }),
8429
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: TOOLTIP_CLASSES, children: [
8430
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8431
+ ImgWithFallback,
8432
+ {
8433
+ className: "h-4 w-4 rounded-full",
8434
+ src: user.picture,
8435
+ alt: user.username
8436
+ }
8437
+ ),
8438
+ onNavigateToUser && user.username ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8439
+ "a",
8440
+ {
8441
+ className: "text-xs font-medium hover:underline",
8442
+ href: `/user/${user.username}`,
8443
+ onClick: (e) => {
8444
+ e.preventDefault();
8445
+ onNavigateToUser(user.username);
8446
+ },
8447
+ children: displayName(user)
8448
+ }
8449
+ ) : /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("span", { className: "text-xs font-medium", children: displayName(user) })
8450
+ ] })
8451
+ ] });
8452
+ var UserWithTooltip = ({
8453
+ mainUser,
8454
+ tooltipUser,
8455
+ tooltipLabel,
8456
+ onNavigateToUser
8457
+ }) => /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8458
+ import_ui_core41.PopoverTooltip,
8459
+ {
8460
+ text: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8461
+ TooltipUserDisplay,
8462
+ {
8463
+ user: tooltipUser,
8464
+ label: tooltipLabel,
8465
+ onNavigateToUser
8466
+ }
8467
+ ),
8468
+ maxWidth: "max-w-[240px]",
8469
+ offsetOptions: 10,
8470
+ children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8471
+ UserInfo,
8472
+ {
8473
+ avatarSrc: mainUser.picture,
8474
+ avatarAlt: mainUser.username,
8475
+ username: mainUser.username
8476
+ }
8477
+ )
8478
+ }
8479
+ );
8480
+ var UserWithBothTooltip = ({
8481
+ mainUser,
8482
+ creator,
8483
+ updater,
8484
+ onNavigateToUser
8485
+ }) => /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8486
+ import_ui_core41.PopoverTooltip,
8487
+ {
8488
+ text: /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: "space-y-3 p-1", children: [
8489
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8490
+ TooltipUserDisplay,
8491
+ {
8492
+ user: creator,
8493
+ label: "Created by",
8494
+ onNavigateToUser
8495
+ }
8496
+ ),
8497
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8498
+ TooltipUserDisplay,
8499
+ {
8500
+ user: updater,
8501
+ label: "Last updated by",
8502
+ onNavigateToUser
8503
+ }
8504
+ )
8505
+ ] }),
8506
+ maxWidth: "max-w-[280px]",
8507
+ offsetOptions: 10,
8508
+ children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8509
+ UserInfo,
8510
+ {
8511
+ avatarSrc: mainUser.picture,
8512
+ avatarAlt: mainUser.username,
8513
+ username: mainUser.username
8514
+ }
8515
+ )
8516
+ }
8517
+ );
8518
+ var PanelOwner = ({
8519
+ creator,
8520
+ updater,
8521
+ ownerName,
8522
+ ownerAvatarUrl,
8523
+ onNavigateToUser
8524
+ }) => {
8525
+ if (!creator && !updater) {
8526
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8527
+ UserInfo,
8528
+ {
8529
+ avatarSrc: ownerAvatarUrl,
8530
+ avatarAlt: ownerName,
8531
+ username: ownerName
8532
+ }
8533
+ );
8534
+ }
8535
+ if (creator && updater) {
8536
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8537
+ UserWithBothTooltip,
8538
+ {
8539
+ mainUser: updater,
8540
+ creator,
8541
+ updater,
8542
+ onNavigateToUser
8543
+ }
8544
+ );
8545
+ }
8546
+ if (creator) {
8547
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8548
+ UserWithTooltip,
8549
+ {
8550
+ mainUser: creator,
8551
+ tooltipUser: creator,
8552
+ tooltipLabel: "Created by",
8553
+ onNavigateToUser
8554
+ }
8555
+ );
8556
+ }
8557
+ if (updater) {
8558
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
8559
+ UserWithTooltip,
8560
+ {
8561
+ mainUser: updater,
8562
+ tooltipUser: updater,
8563
+ tooltipLabel: "Last updated by",
8564
+ onNavigateToUser
8565
+ }
8566
+ );
8567
+ }
8568
+ return null;
8569
+ };
8570
+
8571
+ // src/dashboard/AddPanel.tsx
8572
+ var import_react40 = require("react");
8573
+ var import_ui_core43 = require("@sentio/ui-core");
8574
+ var import_lu14 = require("react-icons/lu");
8575
+
8576
+ // src/dashboard/AddPanelSlideover.tsx
8577
+ var import_react39 = require("react");
8578
+ var import_ui_core42 = require("@sentio/ui-core");
8579
+ var import_jsx_runtime54 = require("react/jsx-runtime");
8580
+ var PanelCard = ({
8581
+ icon,
8582
+ label,
8583
+ onClick,
8584
+ dataType
8585
+ }) => {
8586
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
8587
+ "div",
8588
+ {
8589
+ onClick: (e) => onClick?.(e),
8590
+ className: "group cursor-pointer space-y-2",
8591
+ "data-type": dataType,
8592
+ children: [
8593
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "group-hover:bg-hover rounded-md p-4 transition-colors", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "mx-auto grid h-14 w-14 items-center justify-center", children: icon }) }),
8594
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "group-hover:text-text-foreground text-text-foreground-secondary w-full text-center text-xs group-hover:font-medium", children: label })
8595
+ ]
8596
+ }
8597
+ );
8598
+ };
8599
+ var AnotationsPanels = [
8600
+ {
8601
+ icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.NoteIcon, {}),
8602
+ label: "Note",
8603
+ type: "annotations.note"
8604
+ }
8605
+ ];
8606
+ var InsightsPanels = [
8607
+ {
8608
+ icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.LinesIcon, {}),
8609
+ label: "Lines",
8610
+ type: "insights.line",
8611
+ chartType: "LINE"
8612
+ },
8613
+ { icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.BarsIcon, {}), label: "Bars", type: "insights.bar", chartType: "BAR" },
8614
+ {
8615
+ icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.AreasIcon, {}),
8616
+ label: "Areas",
8617
+ type: "insights.area",
8618
+ chartType: "AREA"
8619
+ },
8620
+ {
8621
+ icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.GaugeIcon, {}),
8622
+ label: "Bar Gauge",
8623
+ type: "insights.bargauge",
8624
+ chartType: "BAR_GAUGE"
8625
+ },
8626
+ {
8627
+ icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.ScatterIcon, {}),
8628
+ label: "Scatter",
8629
+ type: "insights.scatter",
8630
+ chartType: "SCATTER"
8631
+ },
8632
+ {
8633
+ icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.QueryValueIcon, {}),
8634
+ label: "Query Value",
8635
+ type: "insights.queryvalue",
8636
+ chartType: "QUERY_VALUE"
8637
+ },
8638
+ {
8639
+ icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.TableIcon, {}),
8640
+ label: "Table",
8641
+ type: "insights.table",
8642
+ chartType: "TABLE"
8643
+ },
8644
+ { icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.PieIcon, {}), label: "Pie", type: "insights.pie", chartType: "PIE" }
8645
+ ];
8646
+ var EventsPanels = [
8647
+ {
8648
+ icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.EventLogsIcon, {}),
8649
+ label: "Event Logs",
8650
+ type: "events.log"
8651
+ }
8652
+ ];
8653
+ var SqlPanels = [
8654
+ {
8655
+ icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.SQlIcon, {}),
8656
+ label: "SQL Chart",
8657
+ type: "sql.table",
8658
+ chartType: "TABLE"
8659
+ }
8660
+ ];
8661
+ var ContainerPanels = [
8662
+ {
8663
+ icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.GroupsIcon, {}),
8664
+ label: "Empty Group",
8665
+ type: "group.container"
8666
+ }
8667
+ ];
8668
+ function defaultLinkGenerator(chartType, datasource, query) {
8669
+ const { owner, slug, id: dashboardId, ...restQuery } = query;
8670
+ const search = new URLSearchParams();
8671
+ for (const [key, value] of Object.entries(restQuery)) {
8672
+ if (Array.isArray(value)) {
8673
+ value.forEach((v) => search.append(key, v));
8674
+ } else if (value != null) {
8675
+ search.append(key, value);
8676
+ }
8677
+ }
8678
+ const qs = search.toString();
8679
+ const url = `/${owner}/${slug}/dashboards/${dashboardId}/panels/new`;
8680
+ return `${url}${qs ? `?${qs}` : ""}#tab=edit&chart_type=${chartType}&datasource=${datasource}`;
8681
+ }
8682
+ var AddPanelSlideover = ({
8683
+ open,
8684
+ onClose,
8685
+ onSelect,
8686
+ routerQuery = {},
8687
+ generateLinkHref = defaultLinkGenerator,
8688
+ allowImport
8689
+ }) => {
8690
+ const onClick = (0, import_react39.useCallback)(
8691
+ (evt) => {
8692
+ evt.stopPropagation();
8693
+ const target = evt.currentTarget;
8694
+ const type = target.getAttribute("data-type");
8695
+ if (type && onSelect) {
8696
+ onSelect(type);
8697
+ }
8698
+ },
8699
+ [onSelect]
8700
+ );
8701
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.SlideOver, { open, onClose, title: "Add Panel", size: "xs", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "relative h-full w-full space-y-6 overflow-y-auto px-4 py-6", children: [
8702
+ allowImport && /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { children: [
8703
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("h3", { className: "text-ilabel font-ilabel text-text-foreground-secondary mb-2", children: "Import & SQL" }),
8704
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "grid grid-cols-2 gap-x-2.5 gap-y-5", children: [
8705
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
8706
+ PanelCard,
8707
+ {
8708
+ icon: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_ui_core42.ImportIcon, { className: "h-14 w-auto" }),
8709
+ dataType: "",
8710
+ label: "Import",
8711
+ onClick: (evt) => {
8712
+ evt.stopPropagation();
8713
+ onSelect?.("import");
8714
+ }
8715
+ }
8716
+ ),
8717
+ SqlPanels.map(({ icon, label, type }, index) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
8718
+ "a",
8719
+ {
8720
+ href: generateLinkHref("TABLE", "SQL", routerQuery),
8721
+ children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(PanelCard, { icon, label, dataType: type })
8722
+ },
8723
+ index
8724
+ ))
8725
+ ] })
8726
+ ] }),
8727
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { children: [
8728
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("h3", { className: "text-ilabel font-ilabel text-text-foreground-secondary mb-2", children: "Containers" }),
8729
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "grid grid-cols-2 gap-x-2.5 gap-y-5", children: ContainerPanels.map(({ icon, label, type }, index) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
8730
+ PanelCard,
8731
+ {
8732
+ icon,
8733
+ label,
8734
+ dataType: type,
8735
+ onClick
8736
+ },
8737
+ index
8738
+ )) })
8739
+ ] }),
8740
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { children: [
8741
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("h3", { className: "text-ilabel font-ilabel text-text-foreground-secondary mb-2", children: "Insights" }),
8742
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "grid grid-cols-2 gap-x-2.5 gap-y-5", children: InsightsPanels.map(({ icon, label, type, chartType }, index) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
8743
+ "a",
8744
+ {
8745
+ href: generateLinkHref(chartType, "INSIGHTS", routerQuery),
8746
+ children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(PanelCard, { icon, label, dataType: type })
8747
+ },
8748
+ index
8749
+ )) })
8750
+ ] }),
8751
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { children: [
8752
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("h3", { className: "text-ilabel font-ilabel text-text-foreground-secondary mb-2", children: "Anotations" }),
8753
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "grid grid-cols-2 gap-x-2.5 gap-y-5", children: AnotationsPanels.map(({ icon, label, type }, index) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
8754
+ PanelCard,
8755
+ {
8756
+ icon,
8757
+ label,
8758
+ dataType: type,
8759
+ onClick
8760
+ },
8761
+ index
8762
+ )) })
8763
+ ] }),
8764
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { children: [
8765
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("h3", { className: "text-ilabel font-ilabel text-text-foreground-secondary mb-2", children: "Events" }),
8766
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "grid grid-cols-2 gap-x-2.5 gap-y-5", children: EventsPanels.map(({ icon, label, type }, index) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
8767
+ PanelCard,
8768
+ {
8769
+ icon,
8770
+ label,
8771
+ dataType: type,
8772
+ onClick
8773
+ },
8774
+ index
8775
+ )) })
8776
+ ] }),
8777
+ !allowImport && /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { children: [
8778
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("h3", { className: "text-ilabel font-ilabel text-text-foreground-secondary mb-2", children: "SQL" }),
8779
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "grid grid-cols-2 gap-x-2.5 gap-y-5", children: SqlPanels.map(({ icon, label, type }, index) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
8780
+ "a",
8781
+ {
8782
+ href: generateLinkHref("TABLE", "SQL", routerQuery),
8783
+ children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(PanelCard, { icon, label, dataType: type })
8784
+ },
8785
+ index
8786
+ )) })
8787
+ ] })
8788
+ ] }) });
8789
+ };
8790
+
8791
+ // src/dashboard/AddPanel.tsx
8792
+ var import_jsx_runtime55 = require("react/jsx-runtime");
8793
+ var defaultMetricChart = {
8794
+ type: "LINE",
8795
+ datasourceType: "METRICS"
8796
+ };
8797
+ var defaultNoteChart = {
8798
+ type: "NOTE",
8799
+ note: {
8800
+ content: ""
8801
+ },
8802
+ datasourceType: "NOTES"
8803
+ };
8804
+ var defaultAnalyticChart = {
8805
+ type: "LINE",
8806
+ datasourceType: "ANALYTICS",
8807
+ config: {
8808
+ timeRangeOverride: {
8809
+ timeRange: {
8810
+ interval: { unit: "d", value: 1 }
8811
+ }
8812
+ }
8813
+ }
8814
+ };
8815
+ var defaultInsightChart = {
8816
+ type: "LINE",
8817
+ datasourceType: "INSIGHTS",
8818
+ insightsQueries: [
8819
+ {
8820
+ dataSource: "METRICS",
8821
+ metricsQuery: {
8822
+ query: "",
8823
+ alias: "",
8824
+ id: "a"
8825
+ }
8826
+ }
8827
+ ],
8828
+ config: {
8829
+ timeRangeOverride: {
8830
+ timeRange: {}
8831
+ }
8832
+ }
8833
+ };
8834
+ var defaultEventChart = {
8835
+ type: "TABLE",
8836
+ datasourceType: "EVENTS",
8837
+ eventLogsConfig: {
8838
+ columnsConfig: {},
8839
+ query: "",
8840
+ timeRangeOverride: {
8841
+ enabled: false
8842
+ }
8843
+ }
8844
+ };
8845
+ var defaultGroupChart = {
8846
+ type: "GROUP",
8847
+ datasourceType: "GROUP",
8848
+ group: {
8849
+ title: "New Group",
8850
+ collapsed: false
8851
+ }
8852
+ };
8853
+ var defaultRetentionChart = {
8854
+ type: "LINE",
8855
+ datasourceType: "RETENTION",
8856
+ config: {
8857
+ timeRangeOverride: {
8858
+ timeRange: {}
8859
+ }
8860
+ },
8861
+ retentionQuery: {
8862
+ resources: [
8863
+ { eventNames: [], filter: { timeFilter: { type: "Disable" } } },
8864
+ { eventNames: [], filter: { timeFilter: { type: "Disable" } } }
8865
+ ],
8866
+ windowSize: 7,
8867
+ interval: { unit: "Day", value: 1 },
8868
+ groupBy: [],
8869
+ segmentBy: [],
8870
+ criteria: "On"
8871
+ }
8872
+ };
8873
+ var defaultSqlChart = {
8874
+ type: "TABLE",
8875
+ datasourceType: "SQL",
8876
+ sqlQuery: JSON.stringify({ sql: "", size: 100, version: "AUTO" })
8877
+ };
8878
+ var AddPanel = (0, import_react40.forwardRef)(function AddPanel2({ onNewPanel, onImportPanel, saving, routerQuery, generateLinkHref }, ref) {
8879
+ const [slideOverVisible, setSlideOverVisible] = (0, import_react40.useState)(false);
8880
+ const closeSlideOver = (0, import_react40.useCallback)(() => setSlideOverVisible(false), []);
8881
+ const openSlideOver = (0, import_react40.useCallback)(() => setSlideOverVisible(true), []);
8882
+ const onSelectNewPanel = (0, import_react40.useCallback)(
8883
+ (type) => {
8884
+ const [chartCategory, chartType] = type.split(".");
8885
+ let chart;
8886
+ switch (chartCategory) {
8887
+ case "import":
8888
+ onImportPanel();
8889
+ closeSlideOver();
8890
+ return;
8891
+ case "annotations":
8892
+ chart = { ...defaultNoteChart };
8893
+ break;
8894
+ case "group":
8895
+ closeSlideOver();
8896
+ onNewPanel({ ...defaultGroupChart });
8897
+ return;
8898
+ case "analytics":
8899
+ chart = { ...defaultAnalyticChart };
8900
+ break;
8901
+ case "insights":
8902
+ chart = { ...defaultInsightChart };
8903
+ break;
8904
+ case "events":
8905
+ chart = { ...defaultEventChart };
8906
+ break;
8907
+ case "retention":
8908
+ chart = { ...defaultRetentionChart };
8909
+ break;
8910
+ case "sql":
8911
+ chart = { ...defaultSqlChart };
8912
+ break;
8913
+ case "timeseries":
8914
+ default:
8915
+ chart = { ...defaultMetricChart };
8916
+ }
8917
+ switch (chartType) {
8918
+ case "line":
8919
+ chart.type = "LINE";
8920
+ break;
8921
+ case "bar":
8922
+ chart.type = "BAR";
8923
+ break;
8924
+ case "area":
8925
+ chart.type = "AREA";
8926
+ break;
8927
+ case "bargauge":
8928
+ chart.type = "BAR_GAUGE";
8929
+ break;
8930
+ case "queryvalue":
8931
+ chart.type = "QUERY_VALUE";
8932
+ break;
8933
+ case "table":
8934
+ chart.type = "TABLE";
8935
+ break;
8936
+ case "pie":
8937
+ chart.type = "PIE";
8938
+ break;
8939
+ case "note":
8940
+ chart.type = "NOTE";
8941
+ break;
8942
+ case "log":
8943
+ chart.type = "TABLE";
8944
+ break;
8945
+ default:
8946
+ chart = void 0;
8947
+ }
8948
+ if (chart) {
8949
+ closeSlideOver();
8950
+ onNewPanel(chart);
8951
+ }
8952
+ },
8953
+ [closeSlideOver, onNewPanel, onImportPanel]
8954
+ );
8955
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "inline-flex", children: [
8956
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
8957
+ import_ui_core43.Button,
8958
+ {
8959
+ ref,
8960
+ processing: saving,
8961
+ icon: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_lu14.LuPlus, {}),
8962
+ role: "primary",
8963
+ onClick: openSlideOver,
8964
+ size: "md",
8965
+ children: "Add Panel"
8966
+ }
8967
+ ),
8968
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
8969
+ AddPanelSlideover,
8970
+ {
8971
+ open: slideOverVisible,
8972
+ onClose: closeSlideOver,
8973
+ onSelect: onSelectNewPanel,
8974
+ routerQuery,
8975
+ generateLinkHref,
8976
+ allowImport: true
8977
+ }
8978
+ )
8979
+ ] });
8980
+ });
8981
+
8982
+ // src/dashboard/DashboardButtons.tsx
8983
+ var import_react42 = require("react");
8984
+ var import_ui_core46 = require("@sentio/ui-core");
8985
+
8986
+ // src/dashboard/ExportChartMenu.tsx
8987
+ var import_react41 = require("react");
8988
+ var import_immer17 = require("immer");
8989
+ var import_ui_core44 = require("@sentio/ui-core");
8990
+ var import_ai = require("react-icons/ai");
8991
+ var import_lu15 = require("react-icons/lu");
8992
+ var import_jsx_runtime56 = require("react/jsx-runtime");
8993
+ var DefaultMenuItems = [
8994
+ [
8995
+ {
8996
+ label: "Take a snapshot",
8997
+ icon: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_lu15.LuCamera, { className: "mr-2 w-4" }),
8998
+ key: "snapshot"
8999
+ }
9000
+ ],
9001
+ [
9002
+ {
9003
+ key: "png",
9004
+ label: "Export as PNG",
9005
+ icon: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_lu15.LuSquareArrowOutUpRight, { className: "mr-2 w-4" })
9006
+ },
9007
+ {
9008
+ key: "svg",
9009
+ label: "Export as SVG",
9010
+ icon: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_lu15.LuDownload, { className: "mr-2 w-4" })
9011
+ },
9012
+ {
9013
+ key: "csv",
9014
+ label: "Export as CSV",
9015
+ icon: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_lu15.LuDownload, { className: "mr-2 w-4" })
9016
+ }
9017
+ ],
9018
+ [
9019
+ {
9020
+ label: "Export as API",
9021
+ icon: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_ai.AiOutlineApi, { className: "mr-2 h-4 w-4" }),
9022
+ key: "curl"
9023
+ }
9024
+ ]
9025
+ ];
9026
+ function ExportChartMenu({
9027
+ allowEdit,
9028
+ onSelect,
9029
+ allowEmbed,
9030
+ canExportCurl,
9031
+ exportCurlHint
9032
+ }) {
9033
+ const menuItems2 = (0, import_react41.useMemo)(() => {
9034
+ return (0, import_immer17.produce)(DefaultMenuItems, (draft) => {
9035
+ draft[0][0].disabled = !allowEdit;
9036
+ const last = draft[draft.length - 1];
9037
+ last[0].disabled = !canExportCurl || !allowEdit;
9038
+ last[0].disabledHint = exportCurlHint;
9039
+ if (allowEmbed) {
9040
+ last.push({
9041
+ label: "Embed Iframe",
9042
+ icon: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_lu15.LuLink2, { className: "mr-2 h-4 w-4" }),
9043
+ key: "embed"
9044
+ });
9045
+ }
9046
+ });
9047
+ }, [allowEdit, canExportCurl, exportCurlHint, allowEmbed]);
9048
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
9049
+ import_ui_core44.PopupMenuButton,
9050
+ {
9051
+ items: menuItems2,
9052
+ onSelect,
9053
+ ariaLabel: "export",
9054
+ buttonIcon: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_lu15.LuSquareArrowOutUpRight, { className: "w-4" }),
9055
+ buttonClassName: "cursor-pointer"
9056
+ }
9057
+ );
9058
+ }
9059
+
9060
+ // src/dashboard/ExtraSettingMenu.tsx
9061
+ var import_lu16 = require("react-icons/lu");
9062
+ var import_ui_core45 = require("@sentio/ui-core");
9063
+ var import_jsx_runtime57 = require("react/jsx-runtime");
9064
+ var menuItems = [
9065
+ [
9066
+ {
9067
+ label: "Clone",
9068
+ icon: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lu16.LuLayers2, { className: "mr-2 w-4" }),
9069
+ key: "clone"
9070
+ },
9071
+ {
9072
+ label: "Copy configuration",
9073
+ icon: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lu16.LuClipboard, { className: "mr-2 w-4" }),
9074
+ key: "copy"
9075
+ }
9076
+ ],
9077
+ [
9078
+ {
9079
+ label: "Delete",
9080
+ key: "delete",
9081
+ status: "danger",
9082
+ icon: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lu16.LuTrash2, { className: "mr-2 w-4" })
9083
+ }
9084
+ ]
9085
+ ];
9086
+ function ExtraSettingMenu({ onSelect }) {
9087
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
9088
+ import_ui_core45.PopupMenuButton,
9089
+ {
9090
+ items: menuItems,
9091
+ onSelect,
9092
+ ariaLabel: "settings",
9093
+ buttonIcon: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lu16.LuSettings, { className: "w-4" }),
9094
+ buttonClassName: "cursor-pointer"
9095
+ }
9096
+ );
9097
+ }
9098
+ function ReadonlyExtraSettingMenu({ onSelect }) {
9099
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
9100
+ import_ui_core45.PopupMenuButton,
9101
+ {
9102
+ items: [
9103
+ [
9104
+ {
9105
+ label: "Copy configuration",
9106
+ icon: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lu16.LuClipboard, { className: "mr-2 w-4" }),
9107
+ key: "copy"
9108
+ }
9109
+ ]
9110
+ ],
9111
+ onSelect,
9112
+ ariaLabel: "settings",
9113
+ buttonIcon: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lu16.LuSettings, { className: "w-4" }),
9114
+ buttonClassName: "cursor-pointer"
9115
+ }
9116
+ );
9117
+ }
9118
+
9119
+ // src/dashboard/DashboardButtons.tsx
9120
+ var import_ai2 = require("react-icons/ai");
9121
+ var import_lu17 = require("react-icons/lu");
9122
+ var import_jsx_runtime58 = require("react/jsx-runtime");
9123
+ var StaticButtons = {
9124
+ fullscreen: {
9125
+ label: "Full screen",
9126
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuExpand, { className: "mr-2 w-4" }),
9127
+ key: "fullscreen"
9128
+ },
9129
+ refresh: {
9130
+ label: "Refresh panel",
9131
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuRefreshCw, { className: "mr-2 w-4" }),
9132
+ key: "refresh"
9133
+ },
9134
+ edit: {
9135
+ label: "Edit panel",
9136
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuPencil, { className: "mr-2 w-4" }),
9137
+ key: "edit"
9138
+ },
9139
+ clone: {
9140
+ label: "Clone",
9141
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuLayers2, { className: "mr-2 w-4" }),
9142
+ key: "clone"
9143
+ },
9144
+ copy: {
9145
+ label: "Copy configuration",
9146
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuClipboard, { className: "mr-2 w-4" }),
9147
+ key: "copy"
9148
+ },
9149
+ delete: {
9150
+ label: "Delete",
9151
+ key: "delete",
9152
+ status: "danger",
9153
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuTrash2, { className: "mr-2 w-4" })
9154
+ }
9155
+ };
9156
+ var DashboardButtons = ({
9157
+ allowEdit,
9158
+ onMenuSelect,
9159
+ allowExport = true,
9160
+ allowFullScreen = true,
9161
+ allowViewPanel = true,
9162
+ allowEmbed = false,
9163
+ canExportCurl = false,
9164
+ exportCurlHint
9165
+ }) => {
9166
+ const menuRef = (0, import_react42.useRef)(null);
9167
+ const exportButton = allowExport ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
9168
+ ExportChartMenu,
9169
+ {
9170
+ allowEdit,
9171
+ onSelect: onMenuSelect,
9172
+ allowEmbed,
9173
+ canExportCurl,
9174
+ exportCurlHint
9175
+ }
9176
+ ) : null;
9177
+ const fullScreenButton = allowFullScreen ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
9178
+ "button",
9179
+ {
9180
+ type: "button",
9181
+ className: "text-text-foreground-secondary hover:text-primary-600 w-6 px-1",
9182
+ "aria-label": "Full screen",
9183
+ onClick: () => {
9184
+ onMenuSelect("fullscreen");
9185
+ },
9186
+ children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuExpand, {})
9187
+ }
9188
+ ) : null;
9189
+ const items = (0, import_react42.useMemo)(() => {
9190
+ const ret = [];
9191
+ const curlItem = {
9192
+ label: "Export as API",
9193
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_ai2.AiOutlineApi, { className: "mr-2 h-4 w-4" }),
9194
+ key: "curl"
9195
+ };
9196
+ if (!canExportCurl) {
9197
+ curlItem.disabled = true;
9198
+ curlItem.disabledHint = exportCurlHint;
9199
+ }
9200
+ const lastGroup = [curlItem];
9201
+ if (allowEmbed) {
9202
+ lastGroup.push({
9203
+ label: "Embed Iframe",
9204
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuLink2, { className: "mr-2 h-4 w-4" }),
9205
+ key: "embed"
9206
+ });
9207
+ }
9208
+ const exportGroup = {
9209
+ label: "Export",
9210
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuSquareArrowOutUpRight, { className: "mr-2 w-4" }),
9211
+ key: "export",
9212
+ items: [
9213
+ [
9214
+ {
9215
+ label: "Take a snapshot",
9216
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuCamera, { className: "mr-2 w-4" }),
9217
+ key: "snapshot"
9218
+ }
9219
+ ],
9220
+ [
9221
+ {
9222
+ key: "png",
9223
+ label: "Export as PNG",
9224
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuSquareArrowOutUpRight, { className: "mr-2 w-4" })
9225
+ },
9226
+ {
9227
+ key: "svg",
9228
+ label: "Export as SVG",
9229
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuDownload, { className: "mr-2 w-4" })
9230
+ },
9231
+ {
9232
+ key: "csv",
9233
+ label: "Export as CSV",
9234
+ icon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuDownload, { className: "mr-2 w-4" })
9235
+ }
9236
+ ],
9237
+ lastGroup
9238
+ ]
9239
+ };
9240
+ if (allowFullScreen || allowExport) {
9241
+ ret.push([
9242
+ ...allowFullScreen ? [StaticButtons.fullscreen] : [],
9243
+ ...allowExport ? [exportGroup] : []
9244
+ ]);
9245
+ }
9246
+ const editButtons = [StaticButtons.refresh];
9247
+ if (allowViewPanel) {
9248
+ editButtons.push(StaticButtons.edit);
9249
+ }
9250
+ ret.push(editButtons);
9251
+ if (allowEdit) {
9252
+ ret.push(
9253
+ [StaticButtons.clone, StaticButtons.copy],
9254
+ [StaticButtons.delete]
9255
+ );
9256
+ } else if (allowViewPanel) {
9257
+ ret.push([StaticButtons.copy]);
9258
+ }
9259
+ return ret;
9260
+ }, [
9261
+ allowEdit,
9262
+ allowExport,
9263
+ allowFullScreen,
9264
+ allowViewPanel,
9265
+ allowEmbed,
9266
+ canExportCurl,
9267
+ exportCurlHint
9268
+ ]);
9269
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_jsx_runtime58.Fragment, { children: [
9270
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "hidden group-[.xs]:flex", ref: menuRef, children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
9271
+ import_ui_core46.PopupMenuButton,
9272
+ {
9273
+ onSelect: onMenuSelect,
9274
+ items,
9275
+ ariaLabel: "dropdown menu",
9276
+ buttonIcon: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuSettings, { className: "w-4" })
9277
+ }
9278
+ ) }),
9279
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex group-[.xs]:hidden", children: [
9280
+ fullScreenButton,
9281
+ exportButton,
9282
+ allowViewPanel && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
9283
+ "button",
9284
+ {
9285
+ type: "button",
9286
+ className: "text-text-foreground-secondary hover:text-primary-600 w-6 px-1",
9287
+ "aria-label": "Edit panel",
9288
+ onClick: () => {
9289
+ onMenuSelect("edit");
9290
+ },
9291
+ children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lu17.LuPencil, {})
9292
+ }
9293
+ ),
9294
+ allowEdit ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(ExtraSettingMenu, { onSelect: onMenuSelect }) : allowViewPanel ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(ReadonlyExtraSettingMenu, { onSelect: onMenuSelect }) : null
9295
+ ] })
9296
+ ] });
9297
+ };
9298
+ var DashboardButtonsMemo = (0, import_react42.memo)(DashboardButtons);
7971
9299
  // Annotate the CommonJS export names for ESM import in node:
7972
9300
  0 && (module.exports = {
9301
+ AddPanel,
9302
+ AddPanelSlideover,
7973
9303
  AggregateInput,
7974
9304
  AreaIcon,
7975
9305
  ArgumentInput,
@@ -7981,7 +9311,10 @@ var ImportPanelDialog = ({
7981
9311
  ChartLegend,
7982
9312
  ChartTooltip,
7983
9313
  ChartTypeButtonGroup,
9314
+ CodeBlockWithTitle,
9315
+ CurlDialog,
7984
9316
  DEFAULT_HIGHLIGHT_KEY,
9317
+ DashboardButtonsMemo,
7985
9318
  DashboardRefresh,
7986
9319
  DataControls,
7987
9320
  EditDashboardDialog,
@@ -7989,6 +9322,10 @@ var ImportPanelDialog = ({
7989
9322
  ErrorChart,
7990
9323
  EventsFunctionCategories,
7991
9324
  EventsFunctionMap,
9325
+ ExportChartMenu,
9326
+ ExportDashboardDialog,
9327
+ ExportType,
9328
+ ExtraSettingMenu,
7992
9329
  FunctionInput,
7993
9330
  FunctionMap,
7994
9331
  FunctionsCategories,
@@ -8001,6 +9338,7 @@ var ImportPanelDialog = ({
8001
9338
  LineControls,
8002
9339
  LineIcon,
8003
9340
  MarkerControls,
9341
+ PanelOwner,
8004
9342
  PieChart,
8005
9343
  PieChartControls,
8006
9344
  PieIcon,
@@ -8008,6 +9346,7 @@ var ImportPanelDialog = ({
8008
9346
  QueryValueControls,
8009
9347
  QueryValueIcon,
8010
9348
  ReactEChartsBase,
9349
+ ReadonlyExtraSettingMenu,
8011
9350
  RefreshButton,
8012
9351
  RefreshContext,
8013
9352
  ScatterChartTooltip,
@@ -8020,21 +9359,33 @@ var ImportPanelDialog = ({
8020
9359
  TableIcon,
8021
9360
  TimeRangeOverride,
8022
9361
  TimeSeriesChart,
9362
+ UserInfo,
8023
9363
  ValueControls,
8024
9364
  ValueFormatters,
8025
9365
  ValueOptions,
8026
9366
  ValueStringMapping,
8027
9367
  XAxisControls,
8028
9368
  YaxisControls,
9369
+ defaultAnalyticChart,
8029
9370
  defaultBarGaugeConfig,
8030
9371
  defaultDataConfig,
9372
+ defaultEventChart,
9373
+ defaultGroupChart,
9374
+ defaultInsightChart,
9375
+ defaultMetricChart,
9376
+ defaultNoteChart,
8031
9377
  defaultPieConfig,
8032
9378
  defaultQueryValueConfig,
9379
+ defaultRetentionChart,
8033
9380
  defaultScatterConfig,
9381
+ defaultSqlChart,
8034
9382
  defaultTableConfig,
8035
9383
  defaultTimeRangeOverrideConfig,
8036
9384
  defaultValueConfig,
8037
9385
  defaultValueControlsConfig,
9386
+ escapeBody,
9387
+ generateCurlCode,
9388
+ generateNodeCode,
8038
9389
  getDefaultValueConfig,
8039
9390
  getHighlightHex,
8040
9391
  isAggrOrRollupFunction,