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