@sentio/ui-dashboard 0.3.10 → 0.3.12

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/timeseries/AggregateInput.tsx","../src/timeseries/labels.ts","../src/timeseries/ArgumentInput.tsx","../src/timeseries/functions.ts","../src/timeseries/FunctionInput.tsx","../src/timeseries/FunctionsPanel.tsx","../src/timeseries/LabelsInput.tsx","../src/timeseries/LabelSearchContext.tsx","../src/charts/EchartsBase.tsx","../src/charts/ChartLegend.tsx","../src/common/Tooltip.tsx","../src/utils/is-mobile.ts","../src/charts/theme/register.ts","../src/charts/theme/sentio-colors.ts","../src/charts/theme/sentio-theme.ts","../src/utils/use-dark-mode.ts","../src/charts/RefreshContext.tsx","../src/charts/ChartTypeButtonGroup.tsx","../src/charts/icons/BarGuageIcon.tsx","../src/charts/icons/QueryValueIcon.tsx","../src/charts/icons/TableIcon.tsx","../src/charts/icons/AreaIcon.tsx","../src/charts/icons/BarIcon.tsx","../src/charts/icons/LineIcon.tsx","../src/charts/icons/PieIcon.tsx","../src/charts/icons/ScatterIcon.tsx","../src/charts/ChartTooltip.tsx","../src/charts/duration.ts","../src/charts/ScatterChartTooltip.tsx","../src/charts/PieChart.tsx","../src/charts/BarGaugeChart.tsx","../src/charts/QueryValueChart.tsx","../src/charts/TimeSeriesChart.tsx","../src/charts/series-utils.ts","../src/charts/time-utils.ts","../src/charts/options/YaxisControls.tsx","../src/charts/options/controls-ui.tsx","../src/charts/options/XaxisControls.tsx","../src/charts/options/LineControls.tsx","../src/charts/options/LabelControls.tsx","../src/charts/options/PieChartControls.tsx","../src/charts/options/BarGaugeControls.tsx","../src/charts/options/ValueOptions.tsx","../src/charts/options/ValueStringMapping.tsx","../src/charts/options/ValueControls.tsx","../src/charts/options/MarkerControls.tsx","../src/charts/options/DataControls.tsx","../src/charts/options/ScatterControls.tsx","../src/charts/options/TableControls.tsx","../src/charts/table-utils.ts","../src/dashboard/EditDashboardDialog.tsx","../src/dashboard/EditGroupDialog.tsx","../src/dashboard/group-styles.ts","../src/dashboard/DashboardRefresh.tsx","../src/dashboard/ShareDashboardDialog.tsx","../src/dashboard/TimeRangeOverride.tsx","../src/dashboard/SeriesControls.tsx","../src/dashboard/QueryValueControls.tsx"],"sourcesContent":["import { useMemo } from 'react'\nimport { capitalize } from 'lodash'\nimport { produce } from 'immer'\nimport { NewMultipleSelect } from '@sentio/ui-core'\nimport type {\n AggregateOpsLike,\n MetricInfoLike,\n QueryLike\n} from '../types/metrics'\nimport { SystemLabels } from './labels'\n\nconst AggregateAggregateOps: AggregateOpsLike[] = [\n 'AVG',\n 'SUM',\n 'MIN',\n 'MAX',\n 'COUNT'\n]\n\ninterface Props {\n metric?: MetricInfoLike\n value: QueryLike\n onChange: (value: QueryLike) => void\n}\n\ntype Label = { label: string; value: string }\n\nexport function AggregateInput({ metric, value, onChange }: Props) {\n const { labels, selectedLabels } = useMemo(() => {\n const labels: Label[] = []\n for (const sl of SystemLabels) {\n labels.push({ label: sl.name, value: sl.field })\n }\n Object.keys(metric?.labels || {}).forEach((l) => {\n labels.push({ label: l, value: l })\n })\n const selectedLabels: Label[] = []\n for (const l of value?.aggregate?.grouping || []) {\n const label = labels.find((lb) => lb.value === l)\n if (label) {\n selectedLabels.push(label)\n }\n }\n\n return { labels, selectedLabels }\n }, [metric, value])\n\n const onSelectLabel = (labels: Label[]) => {\n onChange(\n produce(value, (draft) => {\n draft.aggregate = draft.aggregate || {}\n draft.aggregate.grouping = labels.map((l) => l.value)\n })\n )\n }\n\n const onSelectFunc = (f: string) => {\n onChange(\n produce(value, (draft) => {\n if (f == 'none') {\n delete draft.aggregate\n } else {\n const aggr = draft.aggregate || {}\n aggr.op = f as AggregateOpsLike\n draft.aggregate = aggr\n }\n })\n )\n }\n\n return (\n <div className=\"min-h-8 flex grow items-center justify-stretch\">\n <select\n value={value.aggregate?.op || ''}\n className=\"sm:text-ilabel border-main text-text-foreground inline-flex h-8 items-center rounded-l-md border border-r-0 bg-gray-50 py-1 pl-4 pr-7 focus:border-0 focus:ring-inset\"\n onChange={(e) => onSelectFunc(e.target.value)}\n aria-label=\"aggregate\"\n >\n <option key=\"\" value={'none'}>\n No aggregate\n </option>\n {AggregateAggregateOps.map((key) => {\n return (\n <option key={key} value={key}>\n {capitalize(key)} by\n </option>\n )\n })}\n </select>\n <NewMultipleSelect<Label>\n disabled={!value.aggregate}\n className=\"border-main flex h-8 grow overflow-hidden rounded-r-md border\"\n options={labels || []}\n value={selectedLabels}\n onChange={onSelectLabel}\n displayFn={(l) => l.label}\n unSelectedText=\"(everything)\"\n optionsClassName=\"min-w-[200px]\"\n />\n </div>\n )\n}\n","import { getChainName } from '@sentio/chain'\nimport type { MetricInfoLike } from '../types/metrics'\n\nexport const SystemLabels = [\n {\n field: 'contract_name',\n name: 'contract',\n getValues(metric: MetricInfoLike) {\n return (metric.contractName || []).map((name) => ({\n value: name,\n display: name\n }))\n }\n },\n {\n field: 'contract_address',\n name: 'address',\n getValues(metric: MetricInfoLike) {\n return (metric.contractAddress || []).map((name) => ({\n value: name,\n display: name\n }))\n }\n },\n {\n field: 'chain',\n name: 'chain',\n getValues(metric: MetricInfoLike) {\n return (metric.chainId || []).map((chainId) => {\n return { value: chainId, display: getChainName(chainId) }\n })\n }\n }\n]\n\nexport function sortMetricByName(a: string, b: string) {\n const aIsSystem = a.startsWith('system.')\n const bIsSystem = b.startsWith('system.')\n\n if (aIsSystem && !bIsSystem) {\n return 1\n }\n if (!aIsSystem && bIsSystem) {\n return -1\n }\n return a.localeCompare(b)\n}\n","import { DurationInput, classNames } from '@sentio/ui-core'\nimport { ArgumentDef, ArgumentType } from './functions'\nimport type { ArgumentLike } from '../types/metrics'\n\ninterface Props {\n argument: ArgumentDef\n value?: ArgumentLike\n onChange?: (value: ArgumentLike) => void\n className?: string\n}\n\nexport function ArgumentInput({ className, argument, value, onChange }: Props) {\n switch (argument.type) {\n case ArgumentType.String:\n return (\n <input\n type=\"text\"\n className={classNames(\n className,\n 'hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 border border-transparent'\n )}\n value={value?.stringValue}\n onChange={(v) =>\n onChange && onChange({ stringValue: v.target.value })\n }\n />\n )\n case ArgumentType.Double:\n return (\n <input\n type=\"number\"\n className={classNames(\n className,\n 'hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 border border-transparent'\n )}\n value={value?.doubleValue}\n step=\"any\"\n onChange={(v) =>\n onChange && onChange({ doubleValue: parseFloat(v.target.value) })\n }\n />\n )\n case ArgumentType.Integer:\n return (\n <input\n step=\"1\"\n type=\"number\"\n className={classNames(\n className,\n 'hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 border border-transparent'\n )}\n value={value?.intValue}\n onChange={(v) =>\n onChange && onChange({ intValue: parseInt(v.target.value) })\n }\n />\n )\n case ArgumentType.Bool:\n return (\n <input\n type=\"checkbox\"\n className={classNames(\n className,\n 'hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 border border-transparent'\n )}\n checked={value?.boolValue}\n onChange={(e) =>\n onChange && onChange({ boolValue: e.target.value == 'true' })\n }\n />\n )\n case ArgumentType.Duration:\n return (\n <DurationInput\n className=\"rounded-none! border-transparent! hover:border-primary-600! focus-within:border-primary-600!\"\n inputClassName={classNames(className)}\n value={value?.durationValue}\n onChange={(e) => onChange && onChange({ durationValue: e })}\n enableDays\n />\n )\n }\n}\n","import type { ArgumentLike } from '../types/metrics'\n\nexport enum ArgumentType {\n String,\n Integer,\n Double,\n Bool,\n Duration\n}\n\nexport interface ArgumentDef {\n name: string\n type: ArgumentType\n}\n\nexport interface FunctionDef {\n name: string\n displayName?: string\n description: string\n arguments: ArgumentDef[]\n defaultArguments?: ArgumentLike[]\n deprecated?: boolean\n}\n\nconst abs: FunctionDef = {\n name: 'abs',\n description: 'Returns the absolute value.',\n arguments: []\n}\n\nconst ceil: FunctionDef = {\n name: 'ceil',\n description:\n 'Returns the smallest integer greater than or equal to a number.',\n arguments: []\n}\n\nconst floor: FunctionDef = {\n name: 'floor',\n description: 'Returns the largest integer less than or equal to a number.',\n arguments: []\n}\nconst round: FunctionDef = {\n name: 'round',\n description: 'Returns the value of a number rounded to the nearest integer.',\n arguments: []\n}\nconst log2: FunctionDef = {\n name: 'log2',\n description: 'Returns the base 2 logarithm.',\n arguments: []\n}\nconst log10: FunctionDef = {\n name: 'log10',\n description: 'Returns the base 10 logarithm.',\n arguments: []\n}\nconst ln: FunctionDef = {\n name: 'ln',\n description: 'Returns the natural logarithm.',\n arguments: []\n}\nconst aggregations = ['avg', 'count', 'last', 'max', 'min', 'sum', 'delta']\n\nconst aggregationDescriptions: { [key: string]: string } = {\n avg: 'Calculates the sum of all values in the specified interval.',\n count: 'Calculates the number of values in the specified interval.',\n last: 'Calculates the last value in the specified interval.',\n max: 'Calculates the maximum of all values in the specified interval.',\n min: 'Calculates the minimum of all values in the specified interval.',\n sum: 'Calculates the sum of all values in the specified interval.',\n delta:\n 'Calculates the difference between the first and last value in the specified interval.'\n}\n\nconst aggregateOverTimeFunctions: FunctionDef[] = aggregations.map(\n (method): FunctionDef => ({\n name: `${method}_over_time`,\n description: aggregationDescriptions[method],\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }]\n })\n)\n\nconst rollupDescriptions: { [key: string]: string } = {\n avg: 'Roll up the metric by its average value over the specified time period.',\n count:\n 'Roll up the metric by its count value over the specified time period.',\n last: 'Roll up the metric by its last value over the specified time period.',\n max: 'Roll up the metric by its maximum value over the specified time period.',\n min: 'Roll up the metric by its minimum value over the specified time period.',\n sum: 'Roll up the metric by its sum value over the specified time period.',\n delta: 'Roll up the metric by its delta value over the specified time period.'\n}\n\nconst rollupFunctions: FunctionDef[] = aggregations.map(\n (method): FunctionDef => ({\n name: `rollup_${method}`,\n description: rollupDescriptions[method],\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }]\n })\n)\n\nconst rate: FunctionDef = {\n name: 'rate',\n description:\n 'Calculates the per-second average rate of increase of the time series.',\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }]\n}\n\nconst irate: FunctionDef = {\n name: 'irate',\n description:\n 'Calculates the per-second instant rate of increase of the time series.',\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }]\n}\n\nconst delta: FunctionDef = {\n name: 'delta',\n description:\n 'Calculates the difference between the first and last value of each time series.',\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }],\n deprecated: true\n}\n\nconst moving_delta: FunctionDef = {\n name: 'moving_delta',\n description:\n 'Calculates the difference between the first and last value of each time series. (continuously)',\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }],\n deprecated: true\n}\n\nconst topk: FunctionDef = {\n name: 'topk',\n description: 'Returns the top k elements by sample value.',\n arguments: [\n {\n name: 'k',\n type: ArgumentType.Integer\n }\n ],\n defaultArguments: [{ intValue: 1 }]\n}\n\nconst bottomk: FunctionDef = {\n name: 'bottomk',\n description: 'Returns the bottom k elements by sample value.',\n arguments: [\n {\n name: 'k',\n type: ArgumentType.Integer\n }\n ],\n defaultArguments: [{ intValue: 1 }]\n}\n\nconst timestamp: FunctionDef = {\n name: 'timestamp',\n description:\n 'Returns the timestamp of each of the samples of the given vector as the number of seconds since January 1, 1970 UTC.',\n arguments: []\n}\nconst day_of_week: FunctionDef = {\n name: 'day_of_week',\n description:\n 'Returns the day of the week for each of the given times. (needs timestamp)',\n arguments: []\n}\nconst day_of_month: FunctionDef = {\n name: 'day_of_month',\n description:\n 'Returns the day of the month for each of the given times. (needs timestamp)',\n arguments: []\n}\n\nconst day_of_year: FunctionDef = {\n name: 'day_of_year',\n description:\n 'Returns the day of the year for each of the given times. (needs timestamp)',\n arguments: []\n}\n\nconst month: FunctionDef = {\n name: 'month',\n description:\n 'Returns the month of the given time. Returned values are from 1 to 12, where 1 means January etc. (needs timestamp)',\n arguments: []\n}\n\nconst year: FunctionDef = {\n name: 'year',\n description: 'Returns the year of the given time. (needs timestamp)',\n arguments: []\n}\n\nconst hour: FunctionDef = {\n name: 'hour',\n description:\n 'Returns the hour of the given time. Returned values are from 0 to 23. (needs timestamp)',\n arguments: []\n}\n\nconst minute: FunctionDef = {\n name: 'minute',\n description:\n 'Returns the minute of the given time. Returned values are from 0 to 59. (needs timestamp)',\n arguments: []\n}\n\nconst before: FunctionDef = {\n name: 'before',\n displayName: 'shift earlier',\n description: 'Shifts the vector back in time by the specified duration.',\n arguments: [\n {\n name: 'duration',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'h' } }]\n}\n\nconst after: FunctionDef = {\n name: 'after',\n displayName: 'shift later',\n description: 'Shifts the vector forward in time by the specified duration.',\n arguments: [\n {\n name: 'duration',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'h' } }]\n}\n\nexport const FunctionsCategories: { [category: string]: FunctionDef[] } = {\n Math: [abs, ceil, floor, round, log2, log10, ln],\n Rollup: rollupFunctions,\n 'Aggregate Over Time': aggregateOverTimeFunctions,\n Rate: [rate, irate, delta, moving_delta],\n Rank: [topk, bottomk],\n Time: [\n timestamp,\n day_of_year,\n day_of_month,\n day_of_week,\n year,\n month,\n hour,\n minute\n ],\n TimeShift: [before, after]\n}\n\nexport const FunctionMap: { [name: string]: FunctionDef } = Object.values(\n FunctionsCategories\n).reduce(\n (acc, funcs) => {\n funcs.forEach((f) => {\n acc[f.name] = f\n })\n return acc\n },\n {} as { [name: string]: FunctionDef }\n)\n\nexport function isAggrOrRollupFunction(name: string) {\n const f = FunctionMap[name]\n return f && (f.name.startsWith('rollup_') || f.name.endsWith('_over_time'))\n}\n\nconst eventsDelta: FunctionDef = {\n name: 'delta',\n description:\n 'Calculates the difference between the first and last value of each time series.',\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }]\n}\n\nexport const EventsFunctionCategories: { [category: string]: FunctionDef[] } = {\n Rank: [topk, bottomk],\n Delta: [eventsDelta]\n}\n\nexport const EventsFunctionMap: { [name: string]: FunctionDef } = Object.values(\n EventsFunctionCategories\n).reduce(\n (acc, funcs) => {\n funcs.forEach((f) => {\n acc[f.name] = f\n })\n return acc\n },\n {} as { [name: string]: FunctionDef }\n)\n","import { Popover } from '@headlessui/react'\nimport { LuX, LuChevronDown } from 'react-icons/lu'\nimport { useFloating, autoPlacement } from '@floating-ui/react'\nimport { produce } from 'immer'\nimport isEqual from 'lodash/isEqual'\nimport { HelpIcon, PopoverButton, classNames } from '@sentio/ui-core'\nimport { FunctionsPanel } from './FunctionsPanel'\nimport { ArgumentInput } from './ArgumentInput'\nimport { FunctionDef, FunctionMap } from './functions'\nimport type { ArgumentLike, FunctionLike, QueryLike } from '../types/metrics'\n\ninterface Props {\n value: QueryLike\n onChange: (value: QueryLike) => void\n}\n\nexport function FunctionInput({ value, onChange }: Props) {\n const { x, y, refs, strategy } = useFloating({\n middleware: [autoPlacement()]\n })\n\n const onSelectFunc = (f: FunctionDef) => {\n onChange(\n produce(value, (draft) => {\n draft.functions = draft.functions || []\n draft.functions.push({\n name: f.name,\n arguments: f.defaultArguments || []\n })\n })\n )\n }\n\n const remove = (f: FunctionLike) => {\n const idx = (value.functions || []).indexOf(f)\n if (idx >= 0) {\n onChange(\n produce(value, (draft) => {\n draft.functions = draft.functions || []\n draft.functions.splice(idx, 1)\n })\n )\n }\n }\n\n function changeArgument(fidx: number, aidx: number, v: ArgumentLike) {\n onChange(\n produce(value, (draft) => {\n draft.functions = draft.functions || []\n const f = draft.functions[fidx]\n if (f) {\n f.arguments = f.arguments || []\n f.arguments[aidx] = v\n }\n })\n )\n }\n\n function changeFunction(fidx: number, f: FunctionDef) {\n onChange(\n produce(value, (draft) => {\n draft.functions = draft.functions || []\n const preFunc = draft.functions[fidx]\n let resetArg = true\n if (preFunc.arguments?.length === f.defaultArguments?.length) {\n const firstArg = preFunc.arguments?.[0]\n const firstDefaultArg = f.defaultArguments?.[0]\n if (firstArg && firstDefaultArg) {\n resetArg = isEqual(\n Object.keys(firstArg),\n Object.keys(firstDefaultArg)\n )\n ? false\n : true\n }\n }\n draft.functions[fidx] = {\n name: f.name,\n arguments: resetArg ? f.defaultArguments || [] : preFunc.arguments\n }\n })\n )\n }\n\n return (\n <>\n <Functions\n functions={value.functions || []}\n onRemove={remove}\n onChangeArgument={changeArgument}\n onChangeFunction={changeFunction}\n />\n <div className=\"inline-flex items-center\">\n <div className=\"bg-border-color h-px w-2.5 self-center\"></div>\n <Popover className=\"relative\">\n {({ open }) => (\n <>\n <Popover.Button\n ref={refs.setReference}\n aria-label=\"Add function\"\n className={classNames(\n 'text-ilabel focus:border-primary-600 focus:ring-primary-600/30 focus:ring-3 relative -ml-px inline-flex h-8 items-center space-x-2 rounded-md',\n 'border-main hover:border-primary-600 border px-4 font-normal',\n open\n ? 'text-primary-600 ring-1'\n : 'text-text-foreground-secondary hover:text-text-foreground'\n )}\n >\n <span className=\"flex text-sm\">f(x)</span>\n <HelpIcon text={'Add functions to query.'} />\n </Popover.Button>\n\n <Popover.Panel\n className=\"shadow-xs border-main z-10 mt-3 h-56 w-96 rounded-md border px-2 sm:px-0 lg:max-w-3xl\"\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0\n }}\n >\n {({ close }) => (\n <FunctionsPanel\n onClick={(f) => {\n onSelectFunc(f)\n close()\n }}\n />\n )}\n </Popover.Panel>\n </>\n )}\n </Popover>\n </div>\n </>\n )\n}\n\nfunction Functions({\n functions,\n onRemove,\n onChangeArgument,\n onChangeFunction\n}: {\n functions: FunctionLike[]\n onRemove: (f: FunctionLike) => void\n onChangeArgument: (fIdx: number, argIdx: number, value: ArgumentLike) => void\n onChangeFunction?: (fIdx: number, f: FunctionDef) => void\n}) {\n if (functions.length == 0) {\n return <></>\n }\n\n return (\n <>\n {functions.map((f, fi) => {\n const def = FunctionMap[f.name!]\n return (\n <div key={f.name} className=\"inline-flex items-center\">\n <div className=\"bg-border-color h-px w-2.5 self-center\"></div>\n <div\n className={classNames(\n 'text-ilabel focus:outline-hidden text-text-foreground-secondary relative inline-flex items-center pl-2 font-normal',\n 'border-main rounded-md border',\n 'h-8'\n )}\n >\n <PopoverButton\n containerClassName=\"h-full border-r border-light pr-2 inline-flex items-center bg-gray-50\"\n content={({ close }) => (\n <div className=\"z-10 h-56 w-96 px-2 sm:px-0 lg:max-w-3xl\">\n <FunctionsPanel\n onClick={(f) => {\n onChangeFunction?.(fi, f)\n close()\n }}\n defaultFunc={f.name}\n />\n </div>\n )}\n >\n <span className=\"hover:text-primary-600 text-text-foreground inline-flex cursor-pointer flex-nowrap items-center gap-1\">\n {def.displayName || f.name}\n <LuChevronDown className=\"h-4 w-4\" />\n </span>\n </PopoverButton>\n {def.arguments.map((arg, i) => (\n <ArgumentInput\n className=\"sm:text-ilabel block w-full pl-4\"\n key={'arg_' + i}\n argument={arg}\n value={f.arguments && f.arguments[i]}\n onChange={(v) => onChangeArgument(fi, i, v)}\n />\n ))}\n <button\n type={'button'}\n className={\n 'text-text-foreground-disabled hover:text-text-foreground hover:bg-hover h-full rounded-r-md px-2'\n }\n aria-label=\"remove function\"\n onClick={() => onRemove(f)}\n >\n <LuX className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n )\n })}\n </>\n )\n}\n","import { Tab } from '@headlessui/react'\nimport { Fragment, useEffect, useRef, useState } from 'react'\nimport { classNames } from '@sentio/ui-core'\nimport { BiCaretRight } from 'react-icons/bi'\nimport { FunctionDef, FunctionsCategories } from './functions'\n\ninterface Props {\n onClick: (func: FunctionDef) => void\n functionCategories?: typeof FunctionsCategories\n defaultFunc?: string\n}\n\nexport function FunctionsPanel({\n onClick,\n functionCategories = FunctionsCategories,\n defaultFunc\n}: Props) {\n const ulRef = useRef<HTMLUListElement>(null)\n const [selectedIdx, setSelectedIdx] = useState(0)\n useEffect(() => {\n if (!defaultFunc) return\n let targetIndex = 0\n Object.keys(functionCategories).forEach((category, idx) => {\n const func = functionCategories[category].find(\n (f) => f.name === defaultFunc\n )\n if (func) {\n targetIndex = idx\n }\n })\n setSelectedIdx(targetIndex)\n setTimeout(() => {\n const target = ulRef.current?.querySelector(\n `li[data-name=\"${defaultFunc}\"]`\n )\n if (target) {\n target.scrollIntoView({ block: 'center' })\n }\n }, 0)\n }, [defaultFunc])\n return (\n <div className=\"bg-default-bg flex h-full overflow-hidden rounded-md\">\n <Tab.Group vertical selectedIndex={selectedIdx} onChange={setSelectedIdx}>\n <Tab.List\n as=\"ul\"\n className=\"native-scroller border-main flex w-44 shrink-0 flex-col flex-nowrap divide-y divide-gray-200 overflow-auto border-r\"\n >\n {Object.keys(functionCategories).map((category, idx) => (\n <Tab as={Fragment} key={category}>\n {({ selected }) => (\n <li\n onMouseOver={() => setSelectedIdx(idx)}\n className={classNames(\n selected\n ? 'bg-primary-500 hover:bg-primary-600'\n : 'bg-default-bg hover:bg-gray-50',\n selected ? 'text-white' : 'text-foreground',\n 'flex cursor-pointer items-center justify-between p-2 text-sm font-medium'\n )}\n >\n <p\n className={classNames(\n 'text-ilabel flex-1 truncate font-medium'\n )}\n >\n {category}\n </p>\n <BiCaretRight\n className={classNames('h-3 w-3 shrink-0 self-center')}\n />\n </li>\n )}\n </Tab>\n ))}\n </Tab.List>\n <Tab.Panels className=\"flex-1\">\n {Object.keys(functionCategories).map((category) => (\n <Tab.Panel\n as=\"ul\"\n key={category}\n className=\"h-full divide-y overflow-y-auto\"\n ref={ulRef}\n >\n {functionCategories[category]\n .filter((f) => !f.deprecated)\n .map((func) => (\n <li\n key={func.name}\n className={classNames(\n 'group cursor-pointer space-y-1 px-2 py-1.5',\n func.name === defaultFunc\n ? 'bg-primary-600 dark:bg-primary-600 text-white'\n : 'hover:bg-sentio-gray-100 dark:hover:bg-sentio-gray-400 text-text-foreground dark:hover:text-white'\n )}\n onClick={() => onClick(func)}\n data-name={func.name}\n >\n <div className=\"flex items-center justify-between\">\n <p className=\"text-ilabel truncate font-medium\">\n {func.displayName || func.name}\n </p>\n </div>\n <div className=\"flex\">\n <div\n className={classNames(\n 'text-icontent flex items-center',\n func.name === defaultFunc\n ? 'text-white/80'\n : 'text-text-foreground-secondary'\n )}\n >\n <p>{func.description}</p>\n </div>\n </div>\n </li>\n ))}\n </Tab.Panel>\n ))}\n </Tab.Panels>\n </Tab.Group>\n </div>\n )\n}\n","import { useMemo, useState } from 'react'\nimport { produce } from 'immer'\nimport { isEqual, sortBy, sortedUniqBy } from 'lodash'\nimport { LuCheck } from 'react-icons/lu'\nimport { VscRegex } from 'react-icons/vsc'\nimport { NewMultipleSelect, classNames } from '@sentio/ui-core'\nimport type { MetricInfoLike, QueryLike } from '../types/metrics'\nimport type { TemplateVariableLike } from '../types/dashboard'\nimport { SystemLabels } from './labels'\nimport { useLabelSearch } from './LabelSearchContext'\n\ninterface Props {\n metric?: MetricInfoLike\n value: QueryLike\n onChange: (value: QueryLike) => void\n variables?: { [p: string]: TemplateVariableLike }\n small?: boolean\n useRegex?: boolean\n}\n\ntype LabelSelector = { display: string; key: string; value: string }\n\nexport function LabelsInput({\n value,\n metric,\n variables,\n onChange,\n small,\n useRegex\n}: Props) {\n const [input, setInput] = useState('')\n const onSelectLabel = (labels: LabelSelector[]) => {\n const selector: { [key: string]: string } = {}\n labels.forEach((label) => {\n selector[label.key] = label.value\n })\n onChange(\n produce(value, (draft) => {\n draft.labelSelector = selector\n })\n )\n }\n const { setLabelSearchQuery } = useLabelSearch()\n\n const labelSelectors = useMemo(() => {\n const result: LabelSelector[] = []\n if (metric) {\n Object.entries(variables || {}).forEach(([name, variable]) => {\n const varname = `$${name}`\n const labelSelector = {\n display:\n variable.field == name ? varname : `${variable.field}: ${varname}`,\n key: variable.field!,\n value: `${varname}`\n }\n if (metric.labels && metric.labels[variable.field!]) {\n result.push(labelSelector)\n } else if (\n variable?.field &&\n SystemLabels.map((l) => l.name).includes(variable?.field)\n ) {\n result.push(labelSelector)\n }\n })\n\n for (const sl of SystemLabels) {\n sl.getValues(metric).forEach(({ value, display }) => {\n result.push({\n display: `${sl.name}: ${display}`,\n key: sl.field,\n value: value\n })\n })\n }\n let inputLabel = ''\n let inputValue = ''\n if (input.includes(':')) {\n ;[inputLabel, inputValue] = input.split(':')\n inputLabel = inputLabel.trim()\n inputValue = inputValue.trim()\n } else {\n inputValue = input.trim()\n }\n Object.entries(metric?.labels || {}).forEach(([key, values]) => {\n ;(values.values || []).forEach((value) => {\n result.push({\n display: `${key}:${value}`,\n key,\n value\n })\n })\n if (\n !useRegex ||\n (inputValue && key.includes(inputLabel) === false) ||\n !inputValue\n ) {\n return\n }\n result.push({\n display: `${key}: <contains> ${inputValue}`,\n key,\n value: JSON.stringify({\n operator: 'contains',\n value: inputValue,\n ignoreCase: true\n })\n })\n })\n }\n return sortedUniqBy(\n sortBy(result, (r) => r.display),\n (r) => r.display\n )\n }, [metric, variables, input, useRegex])\n\n const selectedLabels = useMemo(() => {\n const selector = value?.labelSelector || {}\n return Object.entries(selector).map(([key, value]) => {\n return (\n labelSelectors.find((ls) => ls.key == key && ls.value == value) || {\n display: `${key}:${value}`,\n key,\n value\n }\n )\n })\n }, [value?.labelSelector, labelSelectors])\n\n return (\n <NewMultipleSelect<LabelSelector>\n input={input}\n onInputChange={setInput}\n className={classNames(\n 'border-main flex grow overflow-auto rounded-r-md border',\n small ? 'min-h-6' : 'min-h-8'\n )}\n options={labelSelectors}\n value={selectedLabels}\n onChange={onSelectLabel}\n displayFn={(o) => {\n const { display, value } = o\n const isRegex = /^\\{.*\\}$/.test(value)\n if (isRegex) {\n const valueObj = JSON.parse(value)\n return `${o.key}:<${valueObj?.opertaor ?? 'contains'}> ${valueObj?.value ?? value}`\n }\n return display\n }}\n disabled={!value.query}\n unSelectedText=\"(everywhere)\"\n maxInputSize={30}\n displayIcon={(o: LabelSelector) => {\n const isRegex = /^\\{.*\\}$/.test(o.value)\n return isRegex ? (\n <VscRegex className=\"mr-1 inline-block h-3 w-3 align-top\" />\n ) : null\n }}\n renderOption={(v: LabelSelector, _active: boolean, selected: boolean) => {\n const text = v.display\n const isRegex = /^\\{.*\\}$/.test(v.value)\n const title = `${text} ${isRegex ? ' (case-sensitive regex matcher)' : ''}`\n return (\n <>\n <span\n title={title}\n className={classNames(\n 'block truncate',\n selected && 'font-medium'\n )}\n >\n {isRegex && (\n <VscRegex className=\"mr-1 inline-block h-3 w-3 align-top\" />\n )}\n {text}\n </span>\n\n {selected && (\n <span\n className={classNames(\n 'absolute inset-y-0 right-0 flex items-center pr-4'\n )}\n >\n <LuCheck className=\"h-4 w-4\" aria-hidden=\"true\" />\n </span>\n )}\n </>\n )\n }}\n filterFn={(option: LabelSelector, input: string) => {\n const { display, value } = option\n const isRegex = /^\\{.*\\}$/.test(value)\n if (isRegex) {\n return true\n }\n return display.toLowerCase().includes(input.toLowerCase())\n }}\n validateFn={(option: LabelSelector) => {\n const isRegex = /^\\{.*\\}$/.test(option.value)\n if (isRegex) {\n return true\n }\n return labelSelectors.some((o) => isEqual(o, option))\n }}\n onFilterTextChange={setLabelSearchQuery}\n />\n )\n}\n","import React, { createContext, useContext, useState, ReactNode } from 'react'\n\ninterface LabelSearchContextType {\n labelSearchQuery: string\n setLabelSearchQuery: (query: string) => void\n}\n\nconst LabelSearchContext = createContext<LabelSearchContextType | undefined>(\n undefined\n)\n\ninterface LabelSearchProviderProps {\n children: ReactNode\n}\n\nexport function LabelSearchProvider({ children }: LabelSearchProviderProps) {\n const [labelSearchQuery, setLabelSearchQuery] = useState('')\n\n return (\n <LabelSearchContext.Provider\n value={{ labelSearchQuery, setLabelSearchQuery }}\n >\n {children}\n </LabelSearchContext.Provider>\n )\n}\n\nexport function useLabelSearchContext(): LabelSearchContextType | undefined {\n return useContext(LabelSearchContext)\n}\n\nexport function useLabelSearch(defaultQuery?: string): {\n labelSearchQuery: string\n setLabelSearchQuery: (query: string) => void\n} {\n const context = useLabelSearchContext()\n const [localQuery, setLocalQuery] = useState(defaultQuery || '')\n\n if (context) {\n return context\n }\n\n return {\n labelSearchQuery: localQuery,\n setLabelSearchQuery: setLocalQuery\n }\n}\n","import React, {\n useEffect,\n CSSProperties,\n useCallback,\n useState,\n useImperativeHandle,\n forwardRef,\n useRef,\n useMemo\n} from 'react'\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers'\nimport { init, use } from 'echarts/core'\nimport {\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n SankeyChart\n} from 'echarts/charts'\nimport {\n LegendComponent,\n GridComponent,\n TooltipComponent,\n ToolboxComponent,\n TitleComponent,\n DataZoomComponent,\n BrushComponent,\n MarkLineComponent,\n MarkAreaComponent,\n GraphicComponent,\n VisualMapComponent\n} from 'echarts/components'\nimport type { ECharts, ComposeOption, SetOptionOpts } from 'echarts/core'\nimport type {\n BarSeriesOption,\n LineSeriesOption,\n SankeySeriesOption\n} from 'echarts/charts'\nimport type {\n TitleComponentOption,\n GridComponentOption\n} from 'echarts/components'\nimport { useResizeDetector, type OnResizeCallback } from 'react-resize-detector'\nimport { LegendComponentOption, LegendOption } from 'echarts/types/dist/shared'\nimport { BarLoading } from '@sentio/ui-core'\nimport { ChartLegend } from './ChartLegend'\nimport { isMobile } from '../utils/is-mobile'\nimport { registerSentioTheme } from './theme/register'\nimport { useDarkMode } from '../utils/use-dark-mode'\nimport { sansFontFamily } from './theme/sentio-theme'\n\n// Register the required components\nuse([\n LegendComponent,\n PieChart,\n LineChart,\n ScatterChart,\n MarkLineComponent,\n MarkAreaComponent,\n BarChart,\n SankeyChart,\n GridComponent,\n TooltipComponent,\n BrushComponent,\n TitleComponent,\n ToolboxComponent, // A group of utility tools, which includes export, data view, dynamic type switching, data area zooming, and reset.\n DataZoomComponent, // Used in Line Graph Charts\n CanvasRenderer, // If you only need to use the canvas rendering mode, the bundle will not include the SVGRenderer module, which is not needed.\n GraphicComponent,\n SVGRenderer,\n VisualMapComponent\n])\n\n// Register the 'sentio' / 'sentio-dark' themes (idempotent). A function call,\n// not a bare side-effect import, so it survives tree-shaking.\nregisterSentioTheme()\n\n// Combine an Option type with only required components and charts via ComposeOption\nexport type EChartsOption = ComposeOption<\n | BarSeriesOption\n | LineSeriesOption\n | TitleComponentOption\n | GridComponentOption\n | SankeySeriesOption\n // | ScatterSeriesOption\n>\n\nexport interface ReactEChartsProps {\n group?: string\n option: EChartsOption\n style?: CSSProperties\n settings?: SetOptionOpts\n loading?: boolean\n theme?: 'light' | 'dark' | 'sentio'\n minHeight?: number\n returnedSeries?: number\n totalSeries?: number\n onSelect?: (start: number, end: number) => void\n onZoom?: (start: number, end: number) => void\n noLegend?: boolean\n onClick?: (params: any, extraParams?: any) => void\n onInitChart?: (chart: ECharts) => void\n onSeriesEvent?: (\n event: 'click' | 'mouseover' | 'mouseout',\n params: any\n ) => void\n}\n\nexport interface EChartsHandle {\n getEChart: () => ECharts | undefined\n highlightSeries: (highlighted?: SeriesFinder) => void\n getSeriesColor: (s: SeriesFinder) => string | undefined\n getFrame: () => HTMLDivElement | null\n toggleLegend: (legend: string, selected?: boolean) => void\n resize: (size: { width?: number; height?: number }) => void\n\n getSeries(seriesId: string): any\n}\n\ntype SeriesFinder = {\n seriesId?: string\n seriesIndex?: number\n seriesName?: string\n}\nconst ReactEChartsBaseComponent: React.ForwardRefRenderFunction<\n EChartsHandle,\n ReactEChartsProps\n> = (\n {\n group,\n option,\n style,\n settings,\n loading,\n theme: _theme,\n // minHeight,\n returnedSeries,\n totalSeries,\n onSelect,\n noLegend,\n onZoom,\n onClick,\n onSeriesEvent,\n onInitChart\n }: ReactEChartsProps,\n forwardedRef\n) => {\n const isDarkMode = useDarkMode()\n const theme = _theme || (isDarkMode ? 'sentio-dark' : 'sentio')\n const [legendSelected, setLegendSelected] = useState<Record<string, boolean>>(\n {}\n )\n const [chart, setChart] = useState<ECharts>()\n const echartInstanceRef = useRef<ECharts | undefined>()\n const [legendRendered, setLegendRendered] = useState(false)\n const chartRender = 'canvas'\n const frameRef = useRef<HTMLDivElement>(null)\n\n const chartHandle = useMemo(() => {\n return {\n getEChart: () => echartInstanceRef.current,\n highlightSeries(highlighted?: SeriesFinder) {\n const chart = echartInstanceRef.current\n if (chart) {\n const { series: s } = chart.getOption()\n const series = s as any[]\n if (highlighted) {\n for (let i = 0; i < series.length; i++) {\n const s = series[i]\n if (\n s.id == highlighted.seriesId ||\n highlighted.seriesIndex == i\n ) {\n s.lineStyle = s.lineStyle || {}\n s.lineStyle.opacity = 1\n } else {\n s.lineStyle = s.lineStyle || {}\n s.lineStyle.opacity = 0.2\n }\n }\n } else {\n series.forEach((s) => {\n s.lineStyle = s.lineStyle || {}\n s.lineStyle.opacity = 1\n })\n }\n chart.setOption({ series })\n }\n },\n getSeriesColor(s: SeriesFinder) {\n const chart = echartInstanceRef.current\n if (chart) {\n try {\n // Resolve a valid series index before calling getVisual to avoid\n // the \"There is no specified series model\" dev warning (ECharts warns\n // before throwing when the series can't be found).\n const { series: optionSeries } = chart.getOption()\n const seriesList = (optionSeries || []) as any[]\n\n let resolvedIndex = s.seriesIndex\n if ((resolvedIndex == null || resolvedIndex < 0) && s.seriesId) {\n resolvedIndex = seriesList.findIndex(\n (serie) => serie.id === s.seriesId\n )\n }\n if ((resolvedIndex == null || resolvedIndex < 0) && s.seriesName) {\n resolvedIndex = seriesList.findIndex(\n (serie) => serie.name === s.seriesName\n )\n }\n\n // Only call getVisual when we know the series exists.\n if (\n resolvedIndex != null &&\n resolvedIndex >= 0 &&\n resolvedIndex < seriesList.length\n ) {\n return chart.getVisual(\n { seriesIndex: resolvedIndex },\n 'color'\n ) as string | undefined\n }\n return undefined\n } catch (e) {\n // ignore error\n }\n }\n },\n getFrame() {\n return frameRef.current\n },\n toggleLegend(name: string, selected?: boolean) {\n const chart = echartInstanceRef.current\n if (selected == null) {\n chart?.dispatchAction({\n type: 'legendToggleSelect',\n name\n })\n } else {\n chart?.dispatchAction({\n type: selected ? 'legendSelect' : 'legendUnSelect',\n name\n })\n }\n },\n getSeries(seriesId: string) {\n const chart = echartInstanceRef.current\n if (chart) {\n const { series: s } = chart.getOption()\n const series = s as any[]\n return series?.find((s) => s.id == seriesId)\n }\n },\n resize: (size) => {\n const chart = echartInstanceRef.current\n chart?.resize(size)\n }\n } as EChartsHandle\n }, [])\n\n useImperativeHandle(forwardedRef, () => {\n return chartHandle\n }, [chartHandle])\n\n const onResize: OnResizeCallback = useCallback(({ width, height }) => {\n const chart = echartInstanceRef.current\n chart?.resize({\n width: width ?? undefined,\n height: height ?? undefined\n })\n }, [])\n const {\n // width,\n // height,\n ref: chartRef\n } = useResizeDetector({\n onResize,\n refreshMode: 'throttle',\n refreshRate: 100\n })\n\n useEffect(() => {\n // Initialize chart\n let instance: ECharts\n const containerNode = frameRef.current?.querySelector('.echart-container')\n if (containerNode) {\n instance = init(containerNode as HTMLDivElement, theme, {\n renderer: chartRender,\n locale: 'EN'\n })\n echartInstanceRef.current = instance\n setChart(instance)\n }\n\n // Return cleanup function\n return () => {\n echartInstanceRef.current = undefined\n instance?.dispose()\n }\n }, [theme, chartRender])\n\n useEffect(() => {\n if (!chart || chart.isDisposed()) {\n return\n }\n chart.on('legendselected', (event: any) => {\n setLegendSelected(event.selected)\n })\n chart.on('legendunselected', (event: any) => {\n setLegendSelected(event.selected)\n })\n chart.on('legendselectchanged', (event: any) => {\n setLegendSelected(event.selected)\n })\n\n chart.on('brushEnd', (params: any) => {\n const areas = params.areas[0]\n if (areas) {\n const start = areas.coordRange[0]\n const end = areas.coordRange[1]\n onSelect && onSelect(start, end)\n }\n })\n if (onZoom) {\n chart.on('dataZoom', (params: any) => {\n onZoom(params.start, params.end)\n })\n }\n\n return () => {\n if (chart.isDisposed()) return\n chart.off('legendselectchanged')\n chart.off('brushEnd')\n chart.off('dataZoom')\n }\n }, [chart, onSelect, onZoom])\n\n useEffect(() => {\n if (!chart || chart.isDisposed() || !onClick) {\n return\n }\n chart.getZr()?.on('click', (params: any) => {\n const pointInPixel = [params.offsetX, params.offsetY]\n const pointInGrid = chart.convertFromPixel('grid', pointInPixel)\n onClick(pointInGrid, params)\n })\n if (onSeriesEvent) {\n chart.on('click', 'series', (params: any) => {\n onSeriesEvent?.('click', params)\n })\n chart.on('mouseover', 'series', (params: any) => {\n onSeriesEvent?.('mouseover', params)\n })\n chart.on('mouseout', 'series', (params: any) => {\n onSeriesEvent?.('mouseout', params)\n })\n }\n\n return () => {\n if (chart.isDisposed()) return\n chart.getZr()?.off('click')\n if (onSeriesEvent) {\n chart.off('click')\n chart.off('mouseout')\n chart.off('mouseover')\n }\n }\n }, [chart, onClick, onSeriesEvent, onInitChart])\n\n // Support X/Y Axis title\n const processedOption = useMemo(() => {\n if (!option) return option\n\n const processedOpt = { ...option }\n const graphicElements: any[] = []\n let hasYAxisName = false\n let hasXAxisName = false\n\n // Get text color based on theme\n const textColor = isDarkMode ? '#A6A6A6' : '#6E7079'\n\n // Common function to create axis name graphic element\n const createAxisNameElement = (\n name: string,\n isYAxis: boolean,\n axisIndex = 0\n ) => {\n const baseStyle = {\n text: name,\n fontSize: 11,\n fontFamily: sansFontFamily,\n fontWeight: 600,\n fill: textColor,\n textAlign: 'center' as const,\n textVerticalAlign: 'middle' as const\n }\n\n if (isYAxis) {\n return {\n type: 'text',\n left: axisIndex === 0 ? 8 : 'right',\n top: 'middle',\n rotation: Math.PI / 2,\n style: baseStyle,\n z: 100,\n silent: true\n }\n } else {\n return {\n type: 'text',\n left: 'center',\n bottom: axisIndex === 0 ? 8 : 'top',\n style: baseStyle,\n z: 100,\n silent: true\n }\n }\n }\n\n // Generic function to process axis names\n const processAxisName = (\n axisConfig: any,\n isYAxis: boolean,\n axisIndex = 0\n ) => {\n if (axisConfig && typeof axisConfig === 'object' && axisConfig.name) {\n if (isYAxis) {\n hasYAxisName = true\n } else {\n hasXAxisName = true\n }\n\n const { name, ...restAxis } = axisConfig\n const graphicElement = createAxisNameElement(name, isYAxis, axisIndex)\n graphicElements.push(graphicElement)\n return restAxis\n }\n return axisConfig\n }\n\n // Process both yAxis and xAxis using the generic function\n const processAxisArray = (axisOption: any, isYAxis: boolean) => {\n if (!axisOption) return axisOption\n\n if (Array.isArray(axisOption)) {\n return axisOption.map((axis, index) =>\n processAxisName(axis, isYAxis, index)\n )\n } else {\n return processAxisName(axisOption, isYAxis, 0)\n }\n }\n\n // Process axes\n processedOpt.yAxis = processAxisArray(option.yAxis, true)\n processedOpt.xAxis = processAxisArray(option.xAxis, false)\n\n // Adjust grid spacing when axis names are present\n if (hasYAxisName || hasXAxisName) {\n const originalGrid = processedOpt.grid || {}\n\n const adjustGridSpacing = (gridItem: any) => ({\n ...gridItem,\n left: hasYAxisName\n ? typeof gridItem.left === 'number'\n ? gridItem.left + 20\n : 32\n : gridItem.left,\n bottom: hasXAxisName\n ? typeof gridItem.bottom === 'number'\n ? gridItem.bottom + 20\n : 28\n : gridItem.bottom\n })\n\n processedOpt.grid = Array.isArray(originalGrid)\n ? originalGrid.map(adjustGridSpacing)\n : adjustGridSpacing(originalGrid)\n }\n\n // Add graphic elements to the processed option\n if (graphicElements.length > 0) {\n const existingGraphic = processedOpt.graphic\n if (existingGraphic) {\n processedOpt.graphic = Array.isArray(existingGraphic)\n ? [...existingGraphic, ...graphicElements]\n : [existingGraphic, ...graphicElements]\n } else {\n processedOpt.graphic = graphicElements\n }\n }\n\n return processedOpt\n }, [option, isDarkMode])\n\n useEffect(() => {\n if (!chart || chart.isDisposed()) {\n return\n }\n try {\n chart.setOption(\n {\n ...processedOption,\n legend: {\n ...(processedOption.legend as LegendOption),\n // Persist legend selected state between re-render.\n ...(legendSelected ? { selected: legendSelected } : {})\n }\n },\n { ...settings, notMerge: true }\n )\n } catch (e) {\n console.error('echarts set option failed', e, processedOption)\n }\n onInitChart?.(chart)\n\n if (!isMobile()) {\n // Don't allow brush on mobile\n chart.dispatchAction({\n type: 'brush',\n command: 'clear',\n areas: []\n })\n chart.dispatchAction({\n type: 'takeGlobalCursor',\n key: 'brush',\n brushOption: {\n brushType: 'lineX',\n brushMode: 'single'\n }\n })\n }\n }, [\n chart,\n processedOption,\n settings,\n theme,\n onSelect,\n legendSelected,\n onInitChart\n ])\n\n useEffect(() => {\n if (loading) {\n setLegendRendered(false)\n }\n }, [loading])\n\n useEffect(() => {\n if (chart && !chart.isDisposed()) {\n chart.group = group || ''\n }\n }, [chart, group])\n\n const onMouseDown = useCallback(\n (event: React.MouseEvent) => {\n // Cancel brush selection if the pressed button is not the main button.\n if (event.button !== 0 && chartRef.current) {\n chartRef.current\n .querySelector(chartRender)\n ?.dispatchEvent(\n new MouseEvent('mouseup', event as unknown as MouseEventInit)\n )\n }\n },\n [chartRef, chartRender]\n )\n\n const legends = noLegend ? null : (\n <>\n {chart && !loading && (\n <ChartLegend\n legend={\n ((option?.legend as LegendComponentOption)?.data as string[]) || []\n }\n chartHandle={chartHandle}\n legendSelected={legendSelected}\n returnedSeries={returnedSeries}\n totalSeries={totalSeries}\n onRendered={setLegendRendered}\n />\n )}\n </>\n )\n\n return (\n <div\n className=\"relative mb-1 grid h-full\"\n style={{ gridTemplateRows: '1fr max-content', height: '270px', ...style }}\n onMouseDown={onMouseDown}\n ref={frameRef}\n >\n <div\n ref={chartRef}\n className=\"echart-container min-h-0 w-full min-w-0\"\n ></div>\n {legends}\n {loading && (\n <BarLoading\n className=\"bg-default-bg absolute w-full\"\n hint=\"Loading\"\n width={100}\n />\n )}\n </div>\n )\n}\n\nexport const ReactEChartsBase = forwardRef(ReactEChartsBaseComponent)\n","import React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { Tooltip } from '../common/Tooltip'\nimport { EChartsHandle } from './EchartsBase'\n\nconst COLOR_UNSELECTED = '#dddddd'\n\ninterface Props {\n legend: string[]\n legendSelected: Record<string, boolean>\n returnedSeries?: number\n totalSeries?: number\n onRendered: (v: boolean) => void\n chartHandle?: EChartsHandle\n}\n\nexport const ChartLegend = ({\n legend,\n legendSelected,\n returnedSeries,\n totalSeries,\n onRendered,\n chartHandle\n}: Props) => {\n const rootRef = useRef<HTMLDivElement>(null)\n const [tooltipText, setTooltipText] = useState('')\n const [tooltipReferenceElement, setTooltipReferenceElement] =\n useState<HTMLDivElement>()\n\n useEffect(() => {\n if (!rootRef.current) {\n return\n }\n const offsetHeight = rootRef?.current?.parentElement?.offsetHeight || 0\n chartHandle?.resize({\n height: offsetHeight - rootRef.current.offsetHeight\n })\n onRendered(true)\n }, [chartHandle, onRendered])\n\n const onToggleLegend = useCallback(\n (event: React.MouseEvent, name: string, _seriesIndex: number) => {\n if (event.altKey) {\n legend.forEach((n) => {\n chartHandle?.toggleLegend(n, n === name)\n })\n return\n }\n chartHandle?.toggleLegend(name)\n },\n [chartHandle, legendSelected]\n )\n\n const highlightSeries = useCallback(\n (index: number) => {\n chartHandle?.highlightSeries({ seriesIndex: index })\n },\n [chartHandle]\n )\n\n const unhighlightSeries = useCallback(() => {\n chartHandle?.highlightSeries(undefined)\n }, [chartHandle])\n\n const onToggleAll = useCallback(\n (\n legend: string[],\n legendSelected: Record<string, boolean>,\n chartHandle?: EChartsHandle\n ) => {\n const allSelected = legend.every((name) => legendSelected[name])\n legend.forEach((name) => {\n chartHandle?.toggleLegend(name, !allSelected)\n })\n },\n [legend, legendSelected, chartHandle]\n )\n\n const list = legend.map((name, index) => {\n const selected = legendSelected[name] || legendSelected[name] === undefined\n return (\n <div\n className=\"flex cursor-pointer items-center gap-0.5 whitespace-nowrap\"\n key={name + index}\n data-tip={name}\n onClick={(event) => onToggleLegend(event, name, index)}\n onDoubleClick={(event) => {\n onToggleAll(legend, legendSelected, chartHandle)\n }}\n onMouseEnter={(e) => {\n if (legendSelected[name] !== false) {\n // Only highlight when the current legend is active.\n highlightSeries(index)\n }\n setTooltipReferenceElement(e.currentTarget)\n setTooltipText(name)\n }}\n onMouseLeave={() => {\n unhighlightSeries()\n setTooltipReferenceElement(undefined)\n setTooltipText('')\n }}\n >\n <span\n className=\"rounded-xs h-2.5 w-2.5\"\n style={{\n backgroundColor: selected\n ? chartHandle?.getSeriesColor({ seriesName: name })\n : COLOR_UNSELECTED\n }}\n />\n <span\n className=\"truncate text-xs\"\n style={{\n maxWidth: '12em',\n color: selected ? undefined : COLOR_UNSELECTED\n }}\n >\n {name}\n </span>\n </div>\n )\n })\n\n return (\n <div\n ref={rootRef}\n className=\"text-text-foreground-secondary flex max-h-10 flex-wrap gap-x-3 gap-y-1 overflow-y-auto px-2 text-[13px] leading-[18px]\"\n >\n {list}\n {returnedSeries && totalSeries && returnedSeries < totalSeries ? (\n <div className=\"font-semibold\" style={{ color: '#6B7280' }}>\n showing {returnedSeries} of {totalSeries} series\n </div>\n ) : null}\n <Tooltip referenceElement={tooltipReferenceElement} text={tooltipText} />\n </div>\n )\n}\n","import { useEffect } from 'react'\nimport { useFloating, FloatingPortal, shift } from '@floating-ui/react'\n\ninterface Props {\n referenceElement?: HTMLElement\n text: string\n}\n\nexport function Tooltip({ referenceElement, text }: Props) {\n const { x, y, refs, strategy } = useFloating({\n placement: 'bottom',\n middleware: [shift()]\n })\n\n useEffect(() => {\n if (referenceElement) refs.setReference(referenceElement)\n }, [refs, referenceElement])\n\n if (!referenceElement || !text) {\n return null\n }\n\n return (\n <FloatingPortal>\n <div\n ref={refs.setFloating}\n className=\"z-tooltip pointer-events-none rounded-md bg-black/70 px-2 py-1 text-white backdrop-opacity-60\"\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0\n }}\n >\n {text}\n </div>\n </FloatingPortal>\n )\n}\n","// Plain (non-hook) UA check — mirror of the app's `lib/mobile`. Used by\n// EchartsBase inside an effect, where a hook can't be called.\nexport function isMobile() {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n}\n","import { registerTheme } from 'echarts/core'\nimport { sentioTheme, sentioThemeDark } from './sentio-theme'\n\n// Registers the 'sentio' / 'sentio-dark' ECharts themes. Exposed as a function\n// (not a bare side-effect import) so it survives tree-shaking: ui-dashboard's\n// package.json marks only *.css as side-effectful, so a side-effect-only\n// `import './register'` would be dropped by the bundler and the themes would\n// never register (charts fall back to ECharts' default palette). Callers invoke\n// this before `echarts.init(node, 'sentio')`. Idempotent.\nlet registered = false\nexport function registerSentioTheme() {\n if (registered) return\n registered = true\n registerTheme('sentio', sentioTheme)\n registerTheme('sentio-dark', sentioThemeDark)\n}\n","// Pure data module — kept free of `next/font` (and any other non-worker-safe\n// imports) so it can be safely pulled into the web-worker bundle via\n// `lib/metrics/series.ts`. Do not add side-effectful imports here.\n\nexport const sentioColors = {\n light: {\n classic: [\n '#5470f0',\n '#47c9d9',\n '#de5f94',\n '#e4bc4f',\n '#4cb275',\n '#77aeef',\n '#9368dd',\n '#e46d6d',\n '#f1904e'\n ],\n purple: [\n '#5b0fa6',\n '#6d11c9',\n '#8617e8',\n '#9b35e9',\n '#a855f7',\n '#b67af2',\n '#7a6bff',\n '#5b7cff',\n '#3e82f6'\n ]\n },\n dark: {\n classic: [\n '#6c8aff',\n '#74dfe6',\n '#ff75b0',\n '#f1cf66',\n '#67c88f',\n '#95c6ff',\n '#b189ff',\n '#f28787',\n '#ffad67'\n ],\n purple: [\n '#3f0a78',\n '#5310a0',\n '#6816c7',\n '#7c2ee6',\n '#9451f4',\n '#a874f8',\n '#6d63f6',\n '#5b7cff',\n '#4794ff'\n ]\n }\n}\n","// Inlined here (was `lib/fonts` in the app, which prepends a next/font face).\n// The app applies its custom font globally via CSS; the ECharts theme just needs\n// a sane sans stack. Exported so EchartsBase can reuse it for axis-name labels.\nexport const sansFontFamily =\n 'ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif'\nexport { sentioColors } from './sentio-colors'\nimport { sentioColors } from './sentio-colors'\n\n// Matches --text-foreground-secondary in app/styles/theme-variables.css\nconst textSecondaryLight = '#625d75'\nconst textSecondaryDark = '#b7b4c7'\n\nexport const sentioTheme = {\n color: sentioColors.light.classic,\n backgroundColor: 'rgba(0,0,0,0)',\n textStyle: {\n fontSize: 11,\n fontFamily: sansFontFamily,\n color: textSecondaryLight\n },\n title: {\n textStyle: {\n color: textSecondaryLight\n },\n subtextStyle: {\n color: textSecondaryLight\n }\n },\n line: {\n itemStyle: {\n borderWidth: 1\n },\n lineStyle: {\n width: 2\n },\n symbolSize: 4,\n symbol: 'emptyCircle',\n smooth: false\n },\n radar: {\n itemStyle: {\n borderWidth: 1\n },\n lineStyle: {\n width: 2\n },\n symbolSize: 4,\n symbol: 'emptyCircle',\n smooth: false\n },\n bar: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n pie: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n },\n label: {\n textBorderWidth: 0,\n textBorderColor: 'transparent'\n }\n },\n scatter: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n boxplot: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n parallel: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n sankey: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n funnel: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n gauge: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n candlestick: {\n itemStyle: {\n color: '#eb5454',\n color0: '#47b262',\n borderColor: '#eb5454',\n borderColor0: '#47b262',\n borderWidth: 1\n }\n },\n graph: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n },\n lineStyle: {\n width: 1,\n color: '#aaaaaa'\n },\n symbolSize: 4,\n symbol: 'emptyCircle',\n smooth: false,\n color: [\n '#2e71db',\n '#8dc869',\n '#ffdc2d',\n '#f05a4d',\n '#56bce5',\n '#73ba46',\n '#fe9f05',\n '#a452d7',\n '#a65a8b'\n ],\n label: {\n color: '#ebeff3'\n }\n },\n map: {\n itemStyle: {\n areaColor: '#eee',\n borderColor: '#444',\n borderWidth: 0.5\n },\n label: {\n color: '#000'\n },\n emphasis: {\n itemStyle: {\n areaColor: 'rgba(255,215,0,0.8)',\n borderColor: '#444',\n borderWidth: 1\n },\n label: {\n color: 'rgb(100,0,0)'\n }\n }\n },\n geo: {\n itemStyle: {\n areaColor: '#eee',\n borderColor: '#444',\n borderWidth: 0.5\n },\n label: {\n color: '#000'\n },\n emphasis: {\n itemStyle: {\n areaColor: 'rgba(255,215,0,0.8)',\n borderColor: '#444',\n borderWidth: 1\n },\n label: {\n color: 'rgb(100,0,0)'\n }\n }\n },\n categoryAxis: {\n axisLine: {\n show: true,\n lineStyle: {\n // matches CSS --border-color in light mode (rgb(235,239,243))\n color: '#EBEFF3'\n }\n },\n axisTick: {\n show: true,\n lineStyle: {\n color: '#EBEFF3'\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryLight,\n fontWeight: 'normal'\n },\n splitLine: {\n show: false,\n lineStyle: {\n color: ['#E0E6F1']\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n valueAxis: {\n axisLine: {\n show: false,\n lineStyle: {\n color: textSecondaryLight\n }\n },\n axisTick: {\n show: false,\n lineStyle: {\n color: textSecondaryLight\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryLight,\n fontWeight: 'normal'\n },\n splitLine: {\n show: true,\n lineStyle: {\n color: 'rgba(228, 232, 237, 0.3)'\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n logAxis: {\n axisLine: {\n show: false,\n lineStyle: {\n color: textSecondaryLight\n }\n },\n axisTick: {\n show: false,\n lineStyle: {\n color: textSecondaryLight\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryLight\n },\n splitLine: {\n show: true,\n lineStyle: {\n color: 'rgba(89, 93, 97, 0.8)'\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n timeAxis: {\n axisLine: {\n show: true,\n lineStyle: {\n // matches CSS --border-color in light mode (rgb(235,239,243))\n color: '#EBEFF3'\n }\n },\n axisTick: {\n show: true,\n lineStyle: {\n color: '#EBEFF3'\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryLight\n },\n splitLine: {\n show: false,\n lineStyle: {\n color: ['#E0E6F1']\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n toolbox: {\n iconStyle: {\n borderColor: '#999999'\n },\n emphasis: {\n iconStyle: {\n borderColor: '#666666'\n }\n }\n },\n legend: {\n textStyle: {\n color: textSecondaryLight,\n fontSize: 10\n },\n pageIconColor: '#4E5969',\n pageIconInactiveColor: '#C9CDD4',\n pageTextStyle: {\n color: textSecondaryLight\n }\n },\n tooltip: {\n axisPointer: {\n lineStyle: {\n color: '#e0e0e0',\n width: 1\n },\n crossStyle: {\n color: '#e0e0e0',\n width: 1\n }\n }\n },\n timeline: {\n lineStyle: {\n color: '#dae1f5',\n width: 2\n },\n itemStyle: {\n color: '#a4b1d7',\n borderWidth: 1\n },\n controlStyle: {\n color: '#a4b1d7',\n borderColor: '#a4b1d7',\n borderWidth: 1\n },\n checkpointStyle: {\n color: '#316bf3',\n borderColor: '#ffffff'\n },\n label: {\n color: '#a4b1d7'\n },\n emphasis: {\n itemStyle: {\n color: '#ffffff'\n },\n controlStyle: {\n color: '#a4b1d7',\n borderColor: '#a4b1d7',\n borderWidth: 1\n },\n label: {\n color: '#a4b1d7'\n }\n }\n },\n visualMap: {\n color: ['#bf444c', '#d88273', '#f6efa6']\n },\n dataZoom: {\n handleSize: 'undefined%',\n textStyle: {}\n },\n markPoint: {\n label: {\n color: '#ebeff3'\n },\n emphasis: {\n label: {\n color: '#ebeff3'\n }\n }\n }\n}\n\nexport const sentioThemeDark = {\n color: sentioColors.dark.classic,\n backgroundColor: 'rgba(0,0,0,0)',\n textStyle: {\n fontSize: 11,\n fontFamily: sansFontFamily,\n textBorderWidth: 0,\n textBorderColor: 'transparent',\n color: textSecondaryDark\n },\n title: {\n textStyle: {\n color: textSecondaryDark\n },\n subtextStyle: {\n color: textSecondaryDark\n }\n },\n line: {\n itemStyle: {\n borderWidth: 1\n },\n lineStyle: {\n width: 2\n },\n symbolSize: 4,\n symbol: 'emptyCircle',\n smooth: false\n },\n radar: {\n itemStyle: {\n borderWidth: 1\n },\n lineStyle: {\n width: 2\n },\n symbolSize: 4,\n symbol: 'emptyCircle',\n smooth: false\n },\n bar: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n pie: {\n itemStyle: {\n borderWidth: 0,\n borderColor: 'transparent'\n },\n label: {\n textBorderWidth: 0,\n textBorderColor: 'transparent',\n color: textSecondaryDark\n }\n },\n scatter: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n boxplot: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n parallel: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n sankey: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n funnel: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n gauge: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n candlestick: {\n itemStyle: {\n color: '#eb5454',\n color0: '#47b262',\n borderColor: '#eb5454',\n borderColor0: '#47b262',\n borderWidth: 1\n }\n },\n graph: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n },\n lineStyle: {\n width: 1,\n color: '#aaaaaa'\n },\n symbolSize: 4,\n symbol: 'emptyCircle',\n smooth: false,\n color: [\n '#2e71db',\n '#a8d58d',\n '#ffe355',\n '#f05a4d',\n '#56bce5',\n '#73ba46',\n '#ff9f05',\n '#ad56e2',\n '#e97ec2'\n ],\n label: {\n color: '#ebeff3'\n }\n },\n map: {\n itemStyle: {\n areaColor: '#eee',\n borderColor: '#444',\n borderWidth: 0.5\n },\n label: {\n color: '#000'\n },\n emphasis: {\n itemStyle: {\n areaColor: 'rgba(255,215,0,0.8)',\n borderColor: '#444',\n borderWidth: 1\n },\n label: {\n color: 'rgb(100,0,0)'\n }\n }\n },\n geo: {\n itemStyle: {\n areaColor: '#eee',\n borderColor: '#444',\n borderWidth: 0.5\n },\n label: {\n color: '#000'\n },\n emphasis: {\n itemStyle: {\n areaColor: 'rgba(255,215,0,0.8)',\n borderColor: '#444',\n borderWidth: 1\n },\n label: {\n color: 'rgb(100,0,0)'\n }\n }\n },\n categoryAxis: {\n axisLine: {\n show: true,\n lineStyle: {\n // matches CSS --border-color in dark mode (gray-100 = rgb(66,66,72))\n color: '#424248'\n }\n },\n axisTick: {\n show: true,\n lineStyle: {\n color: '#424248'\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryDark,\n fontWeight: 'normal'\n },\n splitLine: {\n show: false,\n lineStyle: {\n color: ['#E0E6F1']\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n valueAxis: {\n axisLine: {\n show: false,\n lineStyle: {\n color: textSecondaryDark\n }\n },\n axisTick: {\n show: false,\n lineStyle: {\n color: textSecondaryDark\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryDark\n },\n splitLine: {\n show: true,\n lineStyle: {\n // softer gridline on the new dark canvas — barely visible\n color: 'rgba(255, 255, 255, 0.05)',\n width: 1,\n opacity: 0.4\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n logAxis: {\n axisLine: {\n show: false,\n lineStyle: {\n color: textSecondaryDark\n }\n },\n axisTick: {\n show: false,\n lineStyle: {\n color: textSecondaryDark\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryDark,\n fontWeight: 'normal'\n },\n splitLine: {\n show: true,\n lineStyle: {\n // softer gridline on the new dark canvas\n color: ['rgba(255, 255, 255, 0.05)'],\n width: 1,\n opacity: 0.4\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n timeAxis: {\n axisLine: {\n show: true,\n lineStyle: {\n // matches CSS --border-color in dark mode (gray-100 = rgb(66,66,72))\n color: '#424248'\n }\n },\n axisTick: {\n show: true,\n lineStyle: {\n color: '#424248'\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryDark\n },\n splitLine: {\n show: false,\n lineStyle: {\n color: ['#5d6165']\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n toolbox: {\n iconStyle: {\n borderColor: '#999999'\n },\n emphasis: {\n iconStyle: {\n borderColor: '#666666'\n }\n }\n },\n legend: {\n textStyle: {\n color: textSecondaryDark\n },\n pageIconColor: '#909399',\n pageIconInactiveColor: '#606266',\n pageTextStyle: {\n color: textSecondaryDark\n }\n },\n tooltip: {\n axisPointer: {\n lineStyle: {\n color: '#e0e0e0',\n width: 1\n },\n crossStyle: {\n color: '#e0e0e0',\n width: 1\n }\n },\n backgroundColor: '#202020',\n textStyle: {\n color: textSecondaryDark\n }\n },\n timeline: {\n lineStyle: {\n color: '#dae1f5',\n width: 2\n },\n itemStyle: {\n color: '#a4b1d7',\n borderWidth: 1\n },\n controlStyle: {\n color: '#a4b1d7',\n borderColor: '#a4b1d7',\n borderWidth: 1\n },\n checkpointStyle: {\n color: '#316bf3',\n borderColor: '#ffffff'\n },\n label: {\n color: '#a4b1d7'\n },\n emphasis: {\n itemStyle: {\n color: '#ffffff'\n },\n controlStyle: {\n color: '#a4b1d7',\n borderColor: '#a4b1d7',\n borderWidth: 1\n },\n label: {\n color: '#a4b1d7'\n }\n }\n },\n visualMap: {\n color: ['#bf444c', '#d88273', '#f6efa6']\n },\n dataZoom: {\n handleSize: 'undefined%',\n textStyle: {}\n },\n markPoint: {\n label: {\n color: '#ebeff3'\n },\n emphasis: {\n label: {\n color: '#ebeff3'\n }\n }\n }\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react'\n\nclass DarkModeListener {\n private static _instance: DarkModeListener\n private isDarkMode = false\n private listeners: ((isDarkMode: boolean) => void)[] = []\n\n static get instance() {\n if (!this._instance) {\n this._instance = new DarkModeListener()\n }\n return this._instance\n }\n\n constructor() {\n this.init()\n }\n\n public addListener(listener: (isDarkMode: boolean) => void) {\n this.listeners.push(listener)\n }\n\n public removeListener(listener: (isDarkMode: boolean) => void) {\n this.listeners = this.listeners.filter((l) => l !== listener)\n }\n\n public get darkMode() {\n return this.isDarkMode\n }\n\n private _sync(theme: 'light' | 'dark' | 'system' = 'system') {\n let isDarkMode = false\n if (theme === 'system') {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n isDarkMode = mediaQuery.matches\n localStorage.setItem('theme', 'system')\n } else if (theme === 'light') {\n isDarkMode = false\n localStorage.removeItem('theme')\n } else {\n isDarkMode = theme === 'dark'\n localStorage.setItem('theme', 'dark')\n }\n\n this.isDarkMode = isDarkMode\n document.body.classList.remove('light', 'dark')\n document.body.classList.add(isDarkMode ? 'dark' : 'light')\n this.listeners.forEach((listener) => listener(isDarkMode))\n }\n\n public toggleDarkMode() {\n this.isDarkMode = document.body.classList.contains('dark')\n this._sync(this.isDarkMode ? 'light' : 'dark')\n }\n\n public setDarkMode(value: 'light' | 'dark' | 'system') {\n this._sync(value)\n }\n\n private init() {\n this.isDarkMode = document.body.classList.contains('dark')\n // Create a MutationObserver to observe changes in the class attribute\n const observer = new MutationObserver((mutationsList) => {\n for (const mutation of mutationsList) {\n if (\n mutation.type === 'attributes' &&\n mutation.attributeName === 'class'\n ) {\n const isDarkMode = document.body.classList.contains('dark')\n if (this.isDarkMode !== isDarkMode) {\n this.isDarkMode = isDarkMode\n this.listeners.forEach((listener) => listener(isDarkMode))\n }\n }\n }\n })\n\n // Configure the observer to watch for attribute changes\n const config = {\n attributes: true, // Observe attribute changes\n attributeFilter: ['class'] // Only observe changes to the 'class' attribute\n }\n\n // Start observing the body element\n observer.observe(document.body, config)\n }\n}\n\nexport const useDarkMode = (defaultValue = false) => {\n const [isDarkMode, setIsDarkMode] = useState(defaultValue)\n useEffect(() => {\n const instance = DarkModeListener.instance\n setIsDarkMode(instance.darkMode)\n instance.addListener(setIsDarkMode)\n }, [])\n\n return isDarkMode\n}\n\nexport const useSetDarkMode = () => {\n const [value, setValue] = useState('light')\n\n useEffect(() => {\n const instance = DarkModeListener.instance\n\n function syncValue() {\n const currentStorageValue = localStorage.getItem('theme')\n if (currentStorageValue === 'system') {\n setValue('system')\n } else if (!currentStorageValue || currentStorageValue === 'light') {\n setValue('light')\n } else {\n setValue('dark')\n }\n }\n\n syncValue()\n\n instance.addListener(syncValue)\n\n return () => {\n instance.removeListener(syncValue)\n }\n }, [])\n\n return {\n value,\n toggle: useCallback(() => {\n const instance = DarkModeListener.instance\n if (instance) {\n instance.toggleDarkMode()\n }\n }, []),\n onChange: useCallback((value: 'light' | 'dark' | 'system') => {\n const instance = DarkModeListener.instance\n if (instance) {\n instance.setDarkMode(value)\n }\n }, [])\n }\n}\n","import { createContext, useContext } from 'react'\nimport { Button as NewButton, type ButtonProps } from '@sentio/ui-core'\nimport { IoMdRefresh } from 'react-icons/io'\n\nexport const RefreshContext = createContext<{\n refresh?: () => void\n isRefreshing?: boolean\n}>({})\n\nexport const RefreshButton = (props: Partial<ButtonProps>) => {\n const { refresh, isRefreshing } = useContext(RefreshContext)\n if (!refresh) return null\n return (\n <div className=\"grid items-center justify-items-center\">\n <NewButton\n size=\"sm\"\n role=\"text\"\n onClick={(evt) => {\n evt.preventDefault()\n refresh()\n }}\n processing={isRefreshing}\n icon={<IoMdRefresh />}\n className=\"text-text-foreground-secondary!\"\n {...props}\n >\n Retry\n </NewButton>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useResizeDetector } from 'react-resize-detector'\nimport { NewButtonGroup as ButtonGroup } from '@sentio/ui-core'\nimport type { ChartTypeLike } from '../types'\nimport BarGuageIcon from './icons/BarGuageIcon'\nimport QueryValueIcon from './icons/QueryValueIcon'\nimport TableIcon from './icons/TableIcon'\nimport AreaIcon from './icons/AreaIcon'\nimport BarIcon from './icons/BarIcon'\nimport LineIcon from './icons/LineIcon'\nimport PieIcon from './icons/PieIcon'\nimport ScatterIcon from './icons/ScatterIcon'\n\nconst visuals: {\n label: string\n value: ChartTypeLike\n icon: React.ReactNode\n}[] = [\n {\n label: 'Lines',\n value: 'LINE',\n icon: <LineIcon className=\"mr-1 h-4 w-4\" />\n },\n { label: 'Bars', value: 'BAR', icon: <BarIcon className=\"mr-1 h-4 w-4\" /> },\n {\n label: 'Areas',\n value: 'AREA',\n icon: <AreaIcon className=\"mr-1 h-4 w-4\" />\n },\n {\n label: 'Bar Gauge',\n value: 'BAR_GAUGE',\n icon: <BarGuageIcon className=\"mr-1 h-4 w-4\" />\n },\n {\n label: 'Scatter',\n value: 'SCATTER',\n icon: <ScatterIcon className=\"mr-1 h-4 w-4\" />\n },\n {\n label: 'Query Value',\n value: 'QUERY_VALUE',\n icon: <QueryValueIcon className=\"mr-1 h-4 w-4\" />\n },\n {\n label: 'Table',\n value: 'TABLE',\n icon: <TableIcon className=\"mr-1 h-4 w-4\" />\n },\n { label: 'Pie', value: 'PIE', icon: <PieIcon className=\"mr-1 h-4 w-4\" /> }\n]\n\ntype Props = {\n value: ChartTypeLike\n onChange: (value: ChartTypeLike) => void\n small?: boolean\n}\n\nexport const ChartTypeButtonGroup = ({\n value,\n onChange,\n small = false\n}: Props) => {\n const [hideLabel, setHideLabel] = useState(small)\n const { ref } = useResizeDetector<HTMLDivElement>({\n onResize: ({ width }) => {\n if (width) {\n setHideLabel(width < 800)\n }\n },\n refreshMode: 'throttle',\n refreshRate: 100\n })\n return (\n <div className=\"w-full flex-1\" ref={ref}>\n <ButtonGroup\n buttons={visuals}\n value={value}\n onChange={onChange}\n small={small}\n hideLabel={hideLabel}\n />\n </div>\n )\n}\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.12791 1.5625V12.4375C2.12791 12.5938 2.07311 12.7267 1.96349 12.836C1.85387 12.9453 1.7207 13 1.56396 13C1.40722 13 1.27404 12.9453 1.16442 12.836C1.05481 12.7267 1 12.5938 1 12.4375V1.5625C1 1.40617 1.05481 1.27333 1.16442 1.164C1.27404 1.05467 1.40722 1 1.56396 1C1.7207 1 1.85387 1.05467 1.96349 1.164C2.07311 1.27333 2.12791 1.40617 2.12791 1.5625ZM1.56396 11.875H12.436C12.5928 11.875 12.726 11.9297 12.8356 12.039C12.9452 12.1483 13 12.2812 13 12.4375C13 12.5938 12.9452 12.7267 12.8356 12.836C12.726 12.9453 12.5928 13 12.436 13H1.56396C1.40722 13 1.27404 12.9453 1.16442 12.836C1.05481 12.7267 1 12.5938 1 12.4375C1 12.2812 1.05481 12.1483 1.16442 12.039C1.27404 11.9297 1.40722 11.875 1.56396 11.875Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M3.64159 4.02495H9.43859C9.59493 4.02495 9.72776 3.97014 9.83709 3.86052C9.94643 3.75091 10.0011 3.61773 10.0011 3.46099C10.0011 3.30425 9.94643 3.17108 9.83709 3.06146C9.72776 2.95184 9.59493 2.89703 9.43859 2.89703L3.64159 2.89703C3.48526 2.89703 3.35243 2.95184 3.24309 3.06146C3.13376 3.17108 3.07909 3.30425 3.07909 3.46099C3.07909 3.61773 3.13376 3.75091 3.24309 3.86052C3.35243 3.97014 3.48526 4.02495 3.64159 4.02495Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M3.64209 10.0244H11.4701C11.6264 10.0244 11.7593 9.96964 11.8686 9.86002C11.9779 9.7504 12.0326 9.61723 12.0326 9.46049C12.0326 9.30375 11.9779 9.17057 11.8686 9.06096C11.7593 8.95134 11.6264 8.89653 11.4701 8.89653H3.64209C3.48576 8.89653 3.35293 8.95134 3.24359 9.06096C3.13426 9.17057 3.07959 9.30375 3.07959 9.46049C3.07959 9.61723 3.13426 9.7504 3.24359 9.86002C3.35293 9.96964 3.48576 10.0244 3.64209 10.0244Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M3.64209 7.01668L7.47009 7.01668C7.62643 7.01634 7.75926 6.95886 7.86859 6.84423C7.97793 6.7296 8.03259 6.5991 8.03259 6.45272C8.03259 6.29598 7.97793 6.1628 7.86859 6.05319C7.75926 5.94357 7.62643 5.88876 7.47009 5.88876H3.64209C3.48576 5.88876 3.35293 5.94357 3.24359 6.05319C3.13426 6.1628 3.07959 6.29598 3.07959 6.45272C3.07959 6.60946 3.13426 6.74263 3.24359 6.85225C3.35293 6.96187 3.48576 7.01668 3.64209 7.01668Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_3670_4424)\">\n <path\n d=\"M11.5 1.5H2.5C1.67157 1.5 1 2.11561 1 2.875V11.125C1 11.8844 1.67157 12.5 2.5 12.5H11.5C12.3284 12.5 13 11.8844 13 11.125V2.875C13 2.11561 12.3284 1.5 11.5 1.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7.98188 5.77273H6.39097L5.75461 5.13636L6.39097 4.5H7.98188L8.61824 5.13636L7.98188 5.77273Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M7.98188 11.5H6.39097L5.75461 10.8637L6.39097 10.2273H7.98188L8.61824 10.8637L7.98188 11.5Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M8.30005 9.90907V6.09089L8.93641 5.45453L9.57278 6.09089V9.90907L8.93641 10.5454L8.30005 9.90907Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M4.80005 9.90907V6.09089L5.43641 5.45453L6.07278 6.09089V9.90907L5.43641 10.5454L4.80005 9.90907Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M1 3.5L13 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_3670_4424\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\n\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_3670_4416)\">\n <path\n d=\"M11.5 2H2.5C1.67157 2 1 2.55964 1 3.25V10.75C1 11.4404 1.67157 12 2.5 12H11.5C12.3284 12 13 11.4404 13 10.75V3.25C13 2.55964 12.3284 2 11.5 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M1 5L13 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6 2L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_3670_4416\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\n\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_1774_9545)\">\n <path\n d=\"M12.6193 13.1249H1.35364C1.21685 13.1249 1.10062 13.0771 1.00495 12.9814C0.909284 12.8857 0.86145 12.7695 0.86145 12.6327V1.35352C0.86145 1.21672 0.909284 1.10049 1.00495 1.00483C1.10062 0.909161 1.21685 0.861328 1.35364 0.861328C1.49043 0.861328 1.60666 0.909161 1.70233 1.00483C1.79799 1.10049 1.84583 1.21672 1.84583 1.35352V12.1405H12.6193C12.7561 12.1405 12.8723 12.1883 12.968 12.284C13.0636 12.3797 13.1115 12.4959 13.1115 12.6327C13.1115 12.7695 13.0636 12.8857 12.968 12.9814C12.8723 13.0771 12.7561 13.1249 12.6193 13.1249ZM2.62501 10.9374L4.22451 8.08008C4.26097 8.0162 4.31566 7.97289 4.38858 7.95014C4.46149 7.92739 4.53441 7.92972 4.60733 7.95714L6.12501 8.66808L7.73851 6.33008C7.83885 6.19329 7.96193 6.16135 8.10776 6.23427L9.61189 6.99989L11.7994 3.56814C11.8633 3.46781 11.9521 3.43368 12.0658 3.46577C12.1796 3.49785 12.2366 3.5731 12.2369 3.69152V10.8009C12.2369 10.9467 12.1845 11.072 12.0798 11.1767C11.9751 11.2814 11.8498 11.3338 11.704 11.3338H2.87176C2.77143 11.3338 2.69399 11.2905 2.63945 11.2038C2.58491 11.1172 2.58039 11.0284 2.62589 10.9374H2.62501Z\"\n fill=\"currentColor\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1774_9545\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\n\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M2.12791 1.5625V12.4375C2.12791 12.5938 2.07311 12.7267 1.96349 12.836C1.85387 12.9453 1.7207 13 1.56396 13C1.40722 13 1.27404 12.9453 1.16442 12.836C1.05481 12.7267 1 12.5938 1 12.4375V1.5625C1 1.40617 1.05481 1.27333 1.16442 1.164C1.27404 1.05467 1.40722 1 1.56396 1C1.7207 1 1.85387 1.05467 1.96349 1.164C2.07311 1.27333 2.12791 1.40617 2.12791 1.5625ZM1.56396 11.875H12.436C12.5928 11.875 12.726 11.9297 12.8356 12.039C12.9452 12.1483 13 12.2812 13 12.4375C13 12.5938 12.9452 12.7267 12.8356 12.836C12.726 12.9453 12.5928 13 12.436 13H1.56396C1.40722 13 1.27404 12.9453 1.16442 12.836C1.05481 12.7267 1 12.5938 1 12.4375C1 12.2812 1.05481 12.1483 1.16442 12.039C1.27404 11.9297 1.40722 11.875 1.56396 11.875ZM5.12014 4.578V10.375C5.12014 10.5313 5.06534 10.6642 4.95572 10.7735C4.8461 10.8828 4.71293 10.9375 4.55619 10.9375C4.39945 10.9375 4.26627 10.8828 4.15665 10.7735C4.04704 10.6642 3.99223 10.5313 3.99223 10.375V4.578C3.99223 4.42167 4.04704 4.28883 4.15665 4.1795C4.26627 4.07017 4.39945 4.0155 4.55619 4.0155C4.71293 4.0155 4.8461 4.07017 4.95572 4.1795C5.06534 4.28883 5.12014 4.42167 5.12014 4.578ZM11.1196 2.5465V10.3745C11.1196 10.5308 11.0648 10.6637 10.9552 10.773C10.8456 10.8823 10.7124 10.937 10.5557 10.937C10.3989 10.937 10.2658 10.8823 10.1562 10.773C10.0465 10.6637 9.99173 10.5308 9.99173 10.3745V2.5465C9.99173 2.39017 10.0465 2.25733 10.1562 2.148C10.2658 2.03867 10.3989 1.984 10.5557 1.984C10.7124 1.984 10.8456 2.03867 10.9552 2.148C11.0648 2.25733 11.1196 2.39017 11.1196 2.5465ZM8.11187 6.5465V10.3745C8.11187 10.5308 8.05706 10.6637 7.94745 10.773C7.83783 10.8823 7.70465 10.937 7.54792 10.937C7.39118 10.937 7.258 10.8823 7.14838 10.773C7.03877 10.6637 6.98396 10.5308 6.98396 10.3745V6.5465C6.98396 6.39017 7.03877 6.25733 7.14838 6.148C7.258 6.03867 7.39118 5.984 7.54792 5.984C7.69429 5.984 7.8248 6.03867 7.93943 6.148C8.05406 6.25733 8.11154 6.39017 8.11187 6.5465Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\n\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_1774_9563)\">\n <path\n d=\"M12.6191 13.1249H1.35352C1.21672 13.1249 1.10049 13.0771 1.00483 12.9814C0.909161 12.8857 0.861328 12.7695 0.861328 12.6327V1.35352C0.861328 1.21672 0.909161 1.10049 1.00483 1.00483C1.10049 0.909161 1.21672 0.861328 1.35352 0.861328C1.49031 0.861328 1.60654 0.909161 1.7022 1.00483C1.79787 1.10049 1.8457 1.21672 1.8457 1.35352V12.1405H12.6191C12.7559 12.1405 12.8722 12.1883 12.9678 12.284C13.0635 12.3797 13.1113 12.4959 13.1113 12.6327C13.1113 12.7695 13.0635 12.8857 12.9678 12.9814C12.8722 13.0771 12.7559 13.1249 12.6191 13.1249ZM5.26345 10.1582C5.0902 10.1582 4.95341 10.0853 4.85308 9.93945L2.7067 6.52127C2.63379 6.40285 2.61104 6.27758 2.63845 6.14545C2.66587 6.01333 2.73645 5.91081 2.8502 5.83789C2.96395 5.76497 3.08704 5.74222 3.21945 5.76964C3.35187 5.79706 3.45439 5.86545 3.52702 5.97483L5.05827 8.46333L5.68739 6.04352C5.72385 5.89768 5.81047 5.79283 5.94727 5.72895L8.43576 4.52583C8.55418 4.47099 8.67274 4.45962 8.79145 4.4917C8.91016 4.52379 9.00583 4.59437 9.07845 4.70345L10.3227 6.72689L12.155 1.21702C12.2005 1.08927 12.2826 0.993599 12.4013 0.930016C12.52 0.866432 12.6431 0.857245 12.7705 0.902453C12.898 0.947661 12.9936 1.02977 13.0575 1.14877C13.1214 1.26777 13.1306 1.39085 13.0851 1.51802L10.9247 8.03939C10.8608 8.24006 10.724 8.35177 10.5143 8.37452C10.3046 8.39727 10.1451 8.32202 10.0357 8.14877L8.46333 5.60558L6.59039 6.50814L5.74252 9.78939C5.68768 9.9991 5.55556 10.1177 5.34614 10.1451C5.31872 10.1541 5.29131 10.1586 5.26389 10.1586L5.26345 10.1582Z\"\n fill=\"currentColor\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1774_9563\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\n\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_28267_7202)\">\n <path\n d=\"M5.83329 1.86662C4.92079 2.07816 4.08149 2.52998 3.40247 3.17523C2.72345 3.82048 2.22942 4.63564 1.97164 5.53618C1.71386 6.43671 1.70171 7.38982 1.93644 8.29663C2.17118 9.20345 2.64426 10.0309 3.30661 10.6933C3.96896 11.3556 4.79646 11.8287 5.70327 12.0635C6.61009 12.2982 7.56319 12.286 8.46373 12.0283C9.36426 11.7705 10.1794 11.2765 10.8247 10.5974C11.4699 9.91841 11.9217 9.07912 12.1333 8.16662C12.1333 8.01191 12.0718 7.86353 11.9624 7.75414C11.853 7.64474 11.7047 7.58328 11.55 7.58328H7.58329C7.27387 7.58328 6.97713 7.46037 6.75833 7.24157C6.53954 7.02278 6.41662 6.72604 6.41662 6.41662V2.33328C6.40938 2.26417 6.38848 2.19719 6.35515 2.13621C6.32182 2.07524 6.27671 2.02149 6.22245 1.97808C6.16819 1.93467 6.10585 1.90247 6.03905 1.88333C5.97224 1.8642 5.90231 1.85852 5.83329 1.86662Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.75 2.04175C9.49067 2.30255 10.1634 2.72617 10.7187 3.28142C11.2739 3.83668 11.6975 4.50941 11.9583 5.25008H9.33333C9.17862 5.25008 9.03025 5.18862 8.92085 5.07923C8.81146 4.96983 8.75 4.82146 8.75 4.66675V2.04175Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_28267_7202\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\n\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_28248_7302)\">\n <path\n d=\"M1.75 1.75V12.25H12.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.66663 8.75879V8.76754\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9.33337 9.34204V9.35079\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.66663 4.10083V4.10958\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7 6.43408V6.44283\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M11.0834 6.43408V6.44283\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_28248_7302\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SvgIcon\n","import { Fragment, ReactNode, useMemo } from 'react'\nimport dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc'\nimport timezone from 'dayjs/plugin/timezone'\nimport { isNumber, some, sortBy } from 'lodash'\nimport BigDecimal from '@sentio/bigdecimal'\nimport { LuCircleUserRound, LuList } from 'react-icons/lu'\nimport { CopyButton, classNames, type DurationLike } from '@sentio/ui-core'\nimport { durationToLongString } from './duration'\n\ndayjs.extend(utc)\ndayjs.extend(timezone)\n\ninterface Props {\n data: any\n compareTimeDuration?: DurationLike\n numberFormatter: (value: number, seriesId?: string) => string\n highlightSeriesId?: string\n title?: ReactNode\n showTotal?: boolean\n onViewLogs?: (seriesId: string, seriesIndex: number) => void\n viewLogDisabled?: (seriesId: string, seriesIndex: number) => boolean\n onViewUsers?: (seriesId: string, seriesIndex: number) => void\n viewUsersDisabled?: (seriesId: string, seriesIndex: number) => boolean\n isFixed?: boolean\n}\n\nfunction isValidValue(value: any, includeZero: boolean) {\n if (includeZero) {\n return Number.isFinite(value)\n } else {\n return Number.isFinite(value) && value !== 0\n }\n}\n\nexport function ChartTooltip({\n data,\n numberFormatter,\n compareTimeDuration,\n highlightSeriesId,\n title,\n showTotal,\n onViewLogs,\n viewLogDisabled,\n onViewUsers,\n viewUsersDisabled,\n isFixed\n}: Props) {\n const {\n series,\n hasCompare,\n hasCurrent,\n currentTime,\n compareTime,\n markers,\n compareMarkers,\n total,\n compareTotal\n } = useMemo(() => {\n const params = sortBy(data, (p) => -p.value[1])\n const hasCompare = some(params, (param) =>\n param.seriesId.endsWith('_compare')\n )\n const seriesData: Record<string, any> = {}\n const markers: Record<string, string> = {}\n const compareMarkers: Record<string, string> = {}\n let currentTime: dayjs.Dayjs | undefined\n let compareTime: dayjs.Dayjs | undefined\n let total = new BigDecimal(0)\n let compareTotal = new BigDecimal(0)\n\n for (const p of params) {\n const { marker, seriesName, value, seriesId } = p\n if (seriesId.endsWith('_compare')) {\n const id = seriesId.replace('_compare', '')\n compareMarkers[id] = marker\n if (compareTime === undefined) {\n compareTime = dayjs(value[0])\n }\n if (isValidValue(value[1], hasCompare)) {\n seriesData[id] = {\n seriesId: id,\n ...seriesData[id],\n compareValue: value[1],\n compareTime: value[0],\n seriesName\n }\n compareTotal = compareTotal.plus(value[1])\n }\n } else {\n markers[seriesId] = marker\n if (currentTime === undefined) {\n currentTime = dayjs(value[0])\n }\n if (isValidValue(value[1], hasCompare)) {\n seriesData[seriesId] = {\n seriesId,\n ...seriesData[seriesId],\n time: value[0],\n value: value[1],\n seriesName\n }\n total = total.plus(value[1])\n }\n }\n }\n const series = sortBy(Object.values(seriesData), (s) => -s.value)\n const hasCurrent = series[0]?.value !== undefined\n if (compareTimeDuration && compareTime && !currentTime) {\n currentTime = compareTime.add(\n Number(compareTimeDuration.value!),\n compareTimeDuration.unit as any\n )\n }\n return {\n series,\n hasCompare,\n currentTime,\n compareTime,\n hasCurrent,\n markers,\n compareMarkers,\n total,\n compareTotal\n }\n }, [data])\n\n const renderRow = (p: any, idx: number) => {\n const { seriesName, compareValue, value, seriesId } = p\n const highlighted = seriesId === highlightSeriesId\n const marker = markers[seriesId]\n // const diff = undefined\n const diff =\n hasCompare && hasCurrent && compareValue != null && value != null\n ? new BigDecimal(value).minus(compareValue).div(compareValue).toNumber()\n : undefined\n\n const showViewLogs = onViewLogs && !viewLogDisabled?.(seriesId, idx)\n const showViewUsers = onViewUsers && !viewUsersDisabled?.(seriesId, idx)\n\n return (\n <Fragment key={idx}>\n <div\n key={idx}\n className={classNames(\n 'sentio-tooltip-item series-name text-text-foreground inline-flex items-center overflow-hidden',\n 'group',\n highlighted ? 'highlighted' : ''\n )}\n style={{ minWidth: '4rem' }}\n >\n <span dangerouslySetInnerHTML={{ __html: marker || '' }}></span>\n <span className=\"truncate\">{seriesName}</span>\n {showViewLogs && isFixed && (\n <button\n className=\"text-text-foreground/60 hover:text-text-foreground invisible ml-1 text-xs underline group-hover:visible\"\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onViewLogs(seriesId, idx)\n }}\n title=\"View logs\"\n >\n <LuList className=\"h-4 w-4\" />\n </button>\n )}\n {showViewUsers && isFixed && (\n <button\n className=\"text-text-foreground/60 hover:text-text-foreground invisible ml-1 text-xs underline group-hover:visible\"\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onViewUsers(seriesId, idx)\n }}\n title=\"View users\"\n >\n <LuCircleUserRound className=\"h-4 w-4\" />\n </button>\n )}\n {isFixed && (\n <CopyButton\n size={16}\n text={seriesName}\n className=\"invisible ml-1 group-hover:visible\"\n />\n )}\n </div>\n\n <div\n key={`${idx}-value`}\n className={classNames(\n 'sentio-tooltip-item min-w-16 flex items-center truncate pl-1 text-right font-semibold',\n highlighted ? 'highlighted' : ''\n )}\n >\n <span>{hasCurrent ? numberFormatter(value, seriesId) : '-'}</span>\n {diff !== undefined && Number.isFinite(diff) && (\n <span\n className={classNames(\n 'ml-1 text-xs',\n diff > 0 ? 'text-green-500' : 'text-red'\n )}\n >\n {diff > 0 ? '+' : ''}\n {(diff * 100).toFixed(2)}%\n </span>\n )}\n </div>\n </Fragment>\n )\n }\n\n const renderCompareRow = (p: any, idx: number) => {\n const { seriesName, compareValue, seriesId } = p\n const highlighted = seriesId === highlightSeriesId\n const compareMarker = compareMarkers[seriesId]\n return (\n <Fragment key={idx}>\n <div\n key={idx}\n className={classNames(\n 'sentio-tooltip-item sentio-tooltip-compare-item series-name text-text-foreground-secondary truncate',\n highlighted ? 'highlighted' : ''\n )}\n style={{ minWidth: '4rem' }}\n >\n <span\n dangerouslySetInnerHTML={{ __html: compareMarker || '' }}\n ></span>\n {seriesName}\n </div>\n\n <div\n key={`${idx}-value`}\n className={classNames(\n 'sentio-tooltip-item min-w-16 text-text-foreground-secondary truncate pl-1 text-right font-semibold',\n highlighted ? 'highlighted' : ''\n )}\n >\n {isNumber(compareValue)\n ? numberFormatter(compareValue, seriesId)\n : '-'}\n </div>\n </Fragment>\n )\n }\n\n const renderTotalRow = () => {\n if (!showTotal || series.length < 2) return null\n\n const diff =\n hasCompare && hasCurrent && total && compareTotal\n ? total.minus(compareTotal).div(compareTotal).toNumber()\n : undefined\n\n return (\n <div className=\"border-border-color col-span-2 mt-1 flex items-center justify-between border-t pt-1\">\n <div className=\"sentio-tooltip-item series-name text-text-foreground truncate font-semibold\">\n Total\n </div>\n <div className=\"sentio-tooltip-item min-w-16 flex items-center truncate pl-1 text-right font-semibold\">\n <span>{hasCurrent ? numberFormatter(total.toNumber()) : '-'}</span>\n {diff !== undefined && Number.isFinite(diff) && (\n <span\n className={classNames(\n 'ml-1 text-xs',\n diff > 0 ? 'text-green-500' : 'text-red'\n )}\n >\n {diff > 0 ? '+' : ''}\n {(diff * 100).toFixed(2)}%\n </span>\n )}\n </div>\n </div>\n )\n }\n\n const renderCompareTotalRow = () => {\n if (!showTotal || series.length < 2 || !hasCompare) return null\n\n return (\n <div className=\"border-border-color col-span-2 mt-1 flex items-center justify-between border-t pt-1\">\n <div className=\"sentio-tooltip-item sentio-tooltip-compare-item series-name text-text-foreground-secondary truncate font-semibold\">\n Total\n </div>\n <div className=\"sentio-tooltip-item min-w-16 text-text-foreground-secondary truncate pl-1 text-right font-semibold\">\n {isNumber(compareTotal)\n ? numberFormatter(compareTotal.toNumber())\n : '-'}\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={classNames('grid w-full px-2')}\n style={{ gridTemplateColumns: '1fr auto' }}\n >\n <div\n className={classNames(\n 'pl-2',\n 'text-text-foreground-secondary col-span-2 text-left'\n )}\n >\n {title ?? currentTime?.format('YYYY-MM-DD HH:mm:ss')}\n </div>\n {!series || series.length === 0 ? (\n <div className=\"text-text-foreground-secondary pl-2 text-sm\">\n No data available\n </div>\n ) : (\n <>\n {series.map((s, idx) => renderRow(s, idx))}\n {renderTotalRow()}\n {hasCompare && compareTimeDuration && (\n <>\n <div\n className={classNames(\n 'mt-2 pl-2',\n 'text-text-foreground-secondary col-span-2 text-left'\n )}\n >\n {compareTime?.format('YYYY-MM-DD HH:mm:ss')} (previous{' '}\n {durationToLongString(compareTimeDuration)})\n </div>\n {series.map((s, idx) => renderCompareRow(s, idx))}\n {renderCompareTotalRow()}\n </>\n )}\n </>\n )}\n </div>\n )\n}\n","import type { DurationLike } from '@sentio/ui-core'\n\nconst longUnits: Record<string, string> = {\n s: 'seconds',\n m: 'minutes',\n h: 'hours',\n d: 'days',\n w: 'weeks',\n M: 'months',\n y: 'years'\n}\n\n// \"previous hour\" / \"previous days\" — count drives singular/plural, count itself\n// not shown (matches app lib/time.durationToLongString).\nexport function durationToLongString(d: DurationLike): string {\n const u = longUnits[d.unit ?? ''] ?? ''\n return Number(d.value) === 1 ? u.replace(/s$/, '') : u\n}\n","import { Fragment, ReactNode, useMemo } from 'react'\nimport dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc'\nimport timezone from 'dayjs/plugin/timezone'\nimport { isNumber } from 'lodash'\nimport { LuCircleUserRound, LuList } from 'react-icons/lu'\nimport { CopyButton, classNames, type DurationLike } from '@sentio/ui-core'\n\ndayjs.extend(utc)\ndayjs.extend(timezone)\n\ninterface Props {\n data: any\n compareTimeDuration?: DurationLike\n numberFormatter: (value: number) => string\n highlightSeriesId?: string\n title?: ReactNode\n onViewLogs?: (seriesId: string, seriesIndex: number) => void\n viewLogDisabled?: (seriesId: string, seriesIndex: number) => boolean\n onViewUsers?: (seriesId: string, seriesIndex: number) => void\n viewUsersDisabled?: (seriesId: string, seriesIndex: number) => boolean\n isFixed?: boolean\n sizeTitle?: string\n}\n\nexport function ScatterChartTooltip({\n data,\n numberFormatter,\n highlightSeriesId,\n title,\n onViewLogs,\n viewLogDisabled,\n onViewUsers,\n viewUsersDisabled,\n isFixed,\n sizeTitle = 'Size'\n}: Props) {\n const { point, seriesName, seriesId, marker } = useMemo(() => {\n // For scatter charts, data is typically a single point\n const param = Array.isArray(data) ? data[0] : data\n\n return {\n point: param,\n seriesName: param?.seriesName || '',\n seriesId: param?.seriesId || '',\n marker: param?.marker || ''\n }\n }, [data])\n\n if (!point || !point.value) {\n return (\n <div className=\"w-full px-2\">\n <div className=\"text-text-foreground-secondary pl-2 text-sm\">\n No data available\n </div>\n </div>\n )\n }\n\n const { value } = point\n const [xValue, yValue, sizeValue] = value\n\n const highlighted = seriesId === highlightSeriesId\n const showViewLogs = onViewLogs && !viewLogDisabled?.(seriesId, 0)\n const showViewUsers = onViewUsers && !viewUsersDisabled?.(seriesId, 0)\n\n const formatValue = (val: any) => {\n if (val instanceof Date) {\n return dayjs(val).format('YYYY-MM-DD HH:mm:ss')\n } else if (isNumber(val)) {\n return numberFormatter(val)\n } else {\n return String(val)\n }\n }\n\n return (\n <div\n className={classNames('grid w-full px-2')}\n style={{ gridTemplateColumns: '1fr auto' }}\n >\n {/* Title */}\n <div\n className={classNames(\n 'mb-2 pl-2',\n 'text-text-foreground-secondary col-span-2 text-left'\n )}\n >\n {title ?? dayjs(xValue).format('YYYY-MM-DD HH:mm:ss')}\n </div>\n\n {/* Main Series Row */}\n <div\n className={classNames(\n 'sentio-tooltip-item series-name text-text-foreground inline-flex items-center overflow-hidden',\n 'group',\n highlighted ? 'highlighted' : ''\n )}\n style={{ minWidth: '4rem' }}\n >\n <span dangerouslySetInnerHTML={{ __html: marker || '' }}></span>\n <span className=\"truncate\">{seriesName}</span>\n {showViewLogs && isFixed && (\n <button\n className=\"text-text-foreground/60 hover:text-text-foreground invisible ml-1 text-xs underline group-hover:visible\"\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onViewLogs(seriesId, 0)\n }}\n title=\"View logs\"\n >\n <LuList className=\"h-4 w-4\" />\n </button>\n )}\n {showViewUsers && isFixed && (\n <button\n className=\"text-text-foreground/60 hover:text-text-foreground invisible ml-1 text-xs underline group-hover:visible\"\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onViewUsers(seriesId, 0)\n }}\n title=\"View users\"\n >\n <LuCircleUserRound className=\"h-4 w-4\" />\n </button>\n )}\n {isFixed && (\n <CopyButton\n size={16}\n text={seriesName}\n className=\"invisible ml-1 group-hover:visible\"\n />\n )}\n </div>\n\n {/* Y Value */}\n <div\n className={classNames(\n 'sentio-tooltip-item min-w-16 flex items-center truncate pl-1 text-right font-semibold',\n highlighted ? 'highlighted' : ''\n )}\n >\n <span>{formatValue(yValue)}</span>\n </div>\n\n {/* Additional Dimensions */}\n {sizeValue !== undefined && sizeValue !== null && (\n <Fragment>\n <div className=\"border-border-color col-span-2 my-2 w-full border-t\"></div>\n <div\n className=\"sentio-tooltip-item series-name text-text-foreground-secondary truncate\"\n style={{ minWidth: '4rem' }}\n >\n {sizeTitle}\n </div>\n <div className=\"sentio-tooltip-item min-w-16 text-text-foreground-secondary truncate pl-1 text-right font-semibold\">\n {formatValue(sizeValue)}\n </div>\n </Fragment>\n )}\n </div>\n )\n}\n","import { CSSProperties, forwardRef, useEffect, useState } from 'react'\nimport type { ECharts } from 'echarts/core'\nimport { useResizeDetector } from 'react-resize-detector'\nimport { EChartsHandle, EChartsOption, ReactEChartsBase } from './EchartsBase'\nimport { useDarkMode } from '../utils/use-dark-mode'\nimport { isMobile as detectMobile } from '../utils/is-mobile'\nimport type { ChartConfigLike } from '../types'\n\nconst theresholdWidth = 480\n\n// Min gap kept between the tooltip and each window edge.\nconst TOOLTIP_MIN_VIEWPORT_LEFT = 8\nconst TOOLTIP_MIN_VIEWPORT_RIGHT = 8\n\n/** Minimal shape consumed from a computed series — only name + first data point. */\nexport interface PieSeriesInput {\n name: string\n data: any[]\n}\n\nexport interface PieChartProps {\n /** Already-computed series (app runs the worker compute and passes the result). */\n series: PieSeriesInput[]\n /** Formats a slice value for tooltip/legend display. */\n valueFormatter: (value: number) => string\n config?: ChartConfigLike\n title?: string\n minHeight?: number\n loading?: boolean\n style?: CSSProperties\n onInitChart?: (chart: ECharts) => void\n}\n\nexport const PieChart = forwardRef<EChartsHandle, PieChartProps>(\n (props: PieChartProps, ref) => {\n const {\n series,\n valueFormatter,\n config,\n title,\n minHeight,\n loading,\n style,\n onInitChart\n } = props\n const [options, setOptions] = useState<EChartsOption>({})\n const isDarkMode = useDarkMode()\n const isMobile = detectMobile()\n const { width, ref: resizeRef } = useResizeDetector({\n refreshMode: 'debounce',\n refreshRate: 500,\n handleHeight: false\n })\n\n // Place tooltip near cursor while keeping it inside the viewport\n // (with extra reserved padding on the left for the app sidebar).\n // Coordinates returned are in chart-container space — ECharts translates\n // them to document coords when `appendToBody` is set.\n const tooltipPosition = (\n point: [number, number],\n _params: unknown,\n _dom: HTMLElement | unknown,\n _rect: unknown,\n size: { contentSize: [number, number]; viewSize: [number, number] }\n ): [number, number] => {\n const chartRect = (\n resizeRef as React.RefObject<HTMLDivElement>\n ).current?.getBoundingClientRect()\n const chartLeft = chartRect?.left ?? 0\n const winW =\n typeof window !== 'undefined' ? window.innerWidth : size.viewSize[0]\n const [w, h] = size.contentSize\n\n const minXInChart = TOOLTIP_MIN_VIEWPORT_LEFT - chartLeft\n const maxXInChart = winW - TOOLTIP_MIN_VIEWPORT_RIGHT - chartLeft - w\n\n let x = point[0] + 12\n if (x > maxXInChart) {\n x = point[0] - w - 12\n }\n if (x < minXInChart) x = minXInChart\n if (x > maxXInChart) x = maxXInChart\n\n const y = Math.max(0, point[1] - h / 2)\n return [x, y]\n }\n\n useEffect(() => {\n const isHLegend = width && width < theresholdWidth\n\n // Tooltip wrapping/clamping — mobile only.\n // ECharts tooltips default to `white-space: nowrap`, so a single long\n // label (e.g. a full token name) produces a wide tooltip. With\n // `appendToBody: true` that tooltip lives on <body>; near the right edge\n // of the viewport it can push past `innerWidth` and trigger horizontal\n // scroll or unwanted zoom on mobile. Cap the width and force wrapping\n // ONLY on mobile — desktop keeps the default behavior.\n const winW = typeof window !== 'undefined' ? window.innerWidth : 1024\n const tooltipMaxWidth = Math.max(160, Math.min(280, winW - 48))\n const tooltipExtraCss = isMobile\n ? `max-width: ${tooltipMaxWidth}px; white-space: normal; word-break: break-word; overflow-wrap: anywhere;`\n : ''\n\n const d = [] as any[]\n series.forEach((s) => {\n if (s.data.length > 0 && s.data[0] && s.data[0][1] != null) {\n const rawValue = s.data[0][1]\n if (config?.pieConfig?.absValue) {\n d.push({ name: s.name, value: Math.abs(rawValue) })\n } else if (rawValue > 0) {\n d.push({ name: s.name, value: rawValue })\n }\n }\n })\n\n const total = d.reduce((acc, cur) => acc + cur.value, 0)\n d.sort((a, b) => {\n const percentA = (a.value / total) * 100\n const percentB = (b.value / total) * 100\n return percentB - percentA\n })\n\n const pieSeries = [\n {\n type: 'pie',\n radius: [config?.pieConfig?.pieType == 'Donut' ? '40%' : 0, '70%'],\n center: isHLegend ? ['50%', '50%'] : ['35%', '50%'],\n label: { show: false },\n labelLine: { length: 10, length2: 10, maxSurfaceAngle: 50 },\n data: d\n }\n ]\n const options: EChartsOption = {\n title: { text: title, left: 8 },\n legend: isHLegend\n ? {\n type: 'scroll',\n orient: 'horizontal',\n bottom: 12,\n left: 'center',\n animation: true,\n animationDurationUpdate: 300,\n pageIconSize: [10, 8],\n pageButtonItemGap: 2,\n pageButtonGap: 4,\n textStyle: {\n width: width ? width * 0.4 : 100,\n overflow: 'truncate'\n },\n tooltip: {\n show: true,\n appendToBody: true,\n extraCssText: tooltipExtraCss,\n position: tooltipPosition,\n formatter: function (params: any) {\n const name = params.name\n const item = d.find((i) => i.name === name)\n let ret = name\n if (config?.pieConfig?.showValue && item) {\n ret += '<br/>' + valueFormatter(item.value)\n }\n if (config?.pieConfig?.showPercent && item) {\n const percent = (\n (item.value /\n d.reduce((acc, cur) => acc + cur.value, 0)) *\n 100\n ).toFixed(2)\n ret += config.pieConfig.showValue\n ? ` • ${percent}%`\n : `\\n${percent}%`\n }\n return ret\n }\n }\n }\n : {\n type: 'scroll',\n orient: 'vertical',\n right: 16,\n top: title ? 48 : 8,\n width: '35%',\n animation: true,\n animationDurationUpdate: 300,\n tooltip: {\n show: true,\n appendToBody: true,\n extraCssText: tooltipExtraCss,\n position: tooltipPosition,\n formatter: function (params: any) {\n const name = params.name\n const item = d.find((i) => i.name === name)\n let ret = name\n if (config?.pieConfig?.showValue && item) {\n ret += '<br/>' + valueFormatter(item.value)\n }\n if (config?.pieConfig?.showPercent && item) {\n const percent = (\n (item.value /\n d.reduce((acc, cur) => acc + cur.value, 0)) *\n 100\n ).toFixed(2)\n ret += config.pieConfig.showValue\n ? ` • ${percent}%`\n : `\\n${percent}%`\n }\n return ret\n }\n },\n icon: 'roundRect',\n itemWidth: 12,\n itemHeight: 12,\n itemGap: 6,\n show: true,\n pageIconSize: [8, 10],\n pageButtonGap: 4,\n pageButtonItemGap: 2,\n pageIconColor: isDarkMode ? '#909399' : '#4E5969',\n pageIconInactiveColor: isDarkMode ? '#606266' : '#C9CDD4',\n textStyle: {\n width: width ? width * 0.3 : 'auto',\n overflow: 'truncate',\n lineHeight: 16,\n fontSize: 12,\n rich: { value: { padding: [4, 0, 0, 0] } }\n },\n formatter: (name: string) => {\n const item = d.find((i) => i.name === name)\n let ret = name\n if (config?.pieConfig?.showValue && item) {\n ret += '\\n' + valueFormatter(item.value)\n }\n if (config?.pieConfig?.showPercent && item) {\n const percent = (\n (item.value / d.reduce((acc, cur) => acc + cur.value, 0)) *\n 100\n ).toFixed(2)\n ret += config.pieConfig.showValue\n ? ` • ${percent}%`\n : `\\n${percent}%`\n }\n return ret\n }\n },\n tooltip: {\n trigger: 'item',\n appendToBody: true,\n extraCssText: tooltipExtraCss,\n position: tooltipPosition,\n formatter: ({ name, data, percent }: any) => {\n let ret = `${name}`\n if (config?.pieConfig?.showValue) {\n ret += '<br/>' + valueFormatter(data.value)\n }\n if (config?.pieConfig?.showPercent) {\n ret += config.pieConfig.showValue\n ? ` (${percent}%)`\n : `\\n${percent}%`\n }\n return ret\n }\n },\n toolbox: { show: false },\n animation: false,\n series: pieSeries as any\n }\n setOptions(options)\n }, [series, config, valueFormatter, isDarkMode, isMobile, width, title])\n\n return (\n <div className=\"h-full w-full\" ref={resizeRef}>\n <ReactEChartsBase\n ref={ref}\n loading={loading}\n option={options}\n minHeight={minHeight}\n style={style}\n noLegend\n onInitChart={onInitChart}\n />\n </div>\n )\n }\n)\n\nPieChart.displayName = 'PieChart'\n","import { CSSProperties, forwardRef, useEffect, useMemo, useState } from 'react'\nimport type { ECharts } from 'echarts/core'\nimport type { YAXisComponentOption } from 'echarts'\nimport { EChartsHandle, EChartsOption, ReactEChartsBase } from './EchartsBase'\nimport type { ChartConfigLike } from '../types'\nimport type { PieSeriesInput } from './PieChart'\n\nconst compareOption: Intl.CollatorOptions = { numeric: true }\n\nexport interface BarGaugeChartProps {\n /** Already-computed series (app runs the worker compute and passes the result). */\n series: PieSeriesInput[]\n legend?: string[]\n /** Formats a bar value for the label / value-axis. */\n valueFormatter: (value: number) => string\n config?: ChartConfigLike\n title?: string\n minHeight?: number\n loading?: boolean\n style?: CSSProperties\n onInitChart?: (chart: ECharts) => void\n}\n\nexport const BarGaugeChart = forwardRef<EChartsHandle, BarGaugeChartProps>(\n (props: BarGaugeChartProps, ref) => {\n const {\n series: input,\n legend,\n valueFormatter,\n config,\n title,\n minHeight,\n loading,\n style,\n onInitChart\n } = props\n const [series, setSeries] = useState<any[]>([])\n const [xAxis, setXAxis] = useState<any>()\n const [yAxis, setYAxis] = useState<any>()\n const isVertical = config?.barGauge?.direction === 'VERTICAL'\n\n useEffect(() => {\n const tmpData = input.map((s) => {\n const d = s.data && s.data[0]\n return { name: s.name, value: d && d[1]! }\n })\n const sort = config?.barGauge?.sort\n switch (sort?.sortBy) {\n case 'ByName':\n tmpData.sort((a, b) =>\n sort.orderDesc\n ? b.name!.localeCompare(a.name!, undefined, compareOption)\n : a.name!.localeCompare(b.name!, undefined, compareOption)\n )\n break\n case 'ByValue':\n tmpData.sort((a, b) =>\n sort.orderDesc ? b.value - a.value : a.value - b.value\n )\n break\n }\n\n const series: { type: 'bar'; data: number[]; label: any }[] = [\n {\n type: 'bar',\n data: tmpData.map((d) => d.value),\n label: {\n show: config?.valueConfig\n ? config.valueConfig.showValueLabel\n : false,\n position:\n config?.barGauge?.direction == 'VERTICAL' ? 'top' : 'right',\n formatter: ({ value }: any) => valueFormatter(value)\n }\n }\n ]\n\n const seriesAxis = {\n type: 'category',\n data: tmpData.map((s) => s.name),\n axisLabel:\n config?.barGauge?.direction == 'VERTICAL'\n ? { interval: 0, rotate: 30 }\n : {}\n } as YAXisComponentOption\n\n if (config?.xAxis?.name) {\n seriesAxis.name = config?.xAxis?.name\n seriesAxis.nameLocation = 'middle'\n seriesAxis.nameGap = isVertical ? 45 : 60\n }\n\n const valueAxis = {\n type: 'value',\n axisLabel:\n // show dates on value-axis label is weird\n config?.valueConfig?.valueFormatter == 'DateFormatter'\n ? undefined\n : { formatter: (v: number) => valueFormatter(v) }\n }\n\n let xAxis, yAxis\n switch (config?.barGauge?.direction) {\n case 'VERTICAL':\n xAxis = seriesAxis\n yAxis = valueAxis\n break\n case 'HORIZONTAL':\n default:\n xAxis = valueAxis\n yAxis = seriesAxis\n }\n setSeries(series)\n setXAxis(xAxis)\n setYAxis(yAxis)\n }, [\n input,\n config?.barGauge?.calculation,\n config?.barGauge?.sort,\n config?.valueConfig?.showValueLabel,\n config?.xAxis?.name,\n isVertical,\n valueFormatter\n ])\n\n const dataZoom = useMemo(() => {\n if (config?.barGauge?.direction == 'HORIZONTAL') {\n return [\n {\n show: series[0]?.data.length > 15,\n type: 'slider',\n yAxisIndex: 0,\n zoomLock: true,\n width: 8,\n right: 10,\n top: 5,\n bottom: 30,\n minValueSpan: 5,\n maxValueSpan: 15,\n orient: 'vertical',\n handleSize: 0,\n showDetail: false,\n brushSelect: false,\n showDataShadow: false\n },\n {\n type: 'inside',\n id: 'insideY',\n yAxisIndex: 0,\n zoomOnMouseWheel: false,\n moveOnMouseMove: true,\n moveOnMouseWheel: true\n }\n ]\n } else {\n return [\n {\n show: series[0]?.data.length > 25,\n type: 'slider',\n xAxisIndex: 0,\n zoomLock: true,\n height: 8,\n bottom: 5,\n maxValueSpan: 25,\n minValueSpan: 10,\n handleSize: '0',\n showDetail: false,\n orient: 'horizontal',\n brushSelect: false,\n showDataShadow: false\n },\n {\n type: 'inside',\n id: 'insideX',\n xAxisIndex: 0,\n zoomOnMouseWheel: false,\n moveOnMouseMove: true,\n moveOnMouseWheel: true\n }\n ]\n }\n }, [config, series])\n\n const options: EChartsOption = {\n title: { text: title },\n grid: {\n top: title ? 48 : 16,\n right: 40,\n bottom: isVertical && config?.xAxis?.name ? 40 : 16,\n left: !isVertical && config?.xAxis?.name ? 40 : 16,\n containLabel: true\n },\n xAxis,\n legend: { data: legend, top: -10000, left: -10000 },\n toolbox: { show: false },\n yAxis,\n dataZoom,\n animation: false,\n series,\n tooltip: {\n trigger: 'axis',\n confine: true,\n extraCssText: 'max-width: 50%; max-height: 50vh; overflow-y: auto;'\n }\n }\n\n return (\n <div className=\"h-full w-full\">\n <ReactEChartsBase\n ref={ref}\n loading={loading}\n option={options}\n minHeight={minHeight}\n style={style}\n noLegend\n onInitChart={onInitChart}\n />\n </div>\n )\n }\n)\n\nBarGaugeChart.displayName = 'BarGaugeChart'\n","import { CSSProperties, forwardRef, useMemo } from 'react'\nimport type { ECharts } from 'echarts/core'\nimport { useResizeDetector } from 'react-resize-detector'\nimport { EChartsHandle, EChartsOption, ReactEChartsBase } from './EchartsBase'\n\nexport interface QueryValueChartProps {\n /** Worker-resolved render inputs (app runs the QueryValue worker compute). */\n series: any[]\n valueText?: string\n textColor?: string\n backgroundColor?: string\n minHeight?: number\n loading?: boolean\n style?: CSSProperties\n onInitChart?: (chart: ECharts) => void\n}\n\nexport const QueryValueChart = forwardRef<EChartsHandle, QueryValueChartProps>(\n (props: QueryValueChartProps, ref) => {\n const {\n series,\n valueText,\n textColor,\n backgroundColor,\n minHeight,\n loading,\n style,\n onInitChart\n } = props\n const { width, height, ref: ref2 } = useResizeDetector()\n\n const fontSize = useMemo(() => {\n return Math.min(\n (width || 0) / String(valueText).length,\n (height || 0) / 1.5\n )\n }, [width, height, valueText])\n\n const options: EChartsOption = {\n backgroundColor,\n grid: { top: 0, right: 0, bottom: 0, left: 0 },\n toolbox: { show: false },\n animation: false,\n series: series as any,\n xAxis: { type: 'time', show: false },\n yAxis: { type: 'value', show: false },\n legend: { show: false },\n graphic: {\n type: 'text',\n z: 100,\n left: 'center',\n top: 'middle',\n style: {\n text: valueText,\n fontSize,\n stroke: textColor,\n fill: textColor\n }\n }\n }\n\n return (\n <div className=\"h-full w-full\">\n <div className=\"h-full w-full\" ref={ref2}>\n <ReactEChartsBase\n ref={ref}\n loading={loading}\n option={options}\n minHeight={minHeight}\n style={style}\n noLegend\n onInitChart={onInitChart}\n />\n </div>\n </div>\n )\n }\n)\n\nQueryValueChart.displayName = 'QueryValueChart'\n","import {\n CSSProperties,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react'\nimport dayjs from 'dayjs'\nimport type { ECharts } from 'echarts/core'\nimport { EChartsHandle, EChartsOption, ReactEChartsBase } from './EchartsBase'\nimport {\n dateRangeOfSeries,\n durationToSeconds,\n calculateStepByDate,\n formatTime,\n shiftTimezone\n} from './series-utils'\nimport { alignTime, pickRangeByInterval, timeBefore } from './time-utils'\nimport {\n toDayjs,\n fromNumber,\n dateTimeToString,\n pickRangeByTimeRange,\n classNames,\n PopupMenuButton,\n type DateTimeValue,\n type DurationLike\n} from '@sentio/ui-core'\nimport YaxisControls from './options/YaxisControls'\nimport { XAxisControls } from './options/XaxisControls'\nimport { sansFontFamily } from './theme/sentio-theme'\nimport { defaultConfig as DefaultValueConfig } from './options/ValueOptions'\nimport { sentioColors } from './theme/sentio-colors'\nimport { useDarkMode } from '../utils/use-dark-mode'\nimport { ChartTooltip } from './ChartTooltip'\nimport { ScatterChartTooltip } from './ScatterChartTooltip'\nimport ReactDOMServer from 'react-dom/server'\nimport { defaults, isArray, isEqual, isNumber, uniq } from 'lodash'\nimport {\n flip,\n FloatingOverlay,\n FloatingPortal,\n shift,\n useFloating\n} from '@floating-ui/react'\nimport { useBoolean } from '@sentio/ui-core'\nimport { LuChevronDown } from 'react-icons/lu'\nimport type {\n ChartConfigLike,\n ChartTypeLike,\n YAxisConfigLike,\n XAxisConfigLike,\n SeriesLike,\n SeriesDataLike\n} from '../types'\n\nconst NumberFormat = (o: Intl.NumberFormatOptions) =>\n new Intl.NumberFormat('en-US', o)\n\nfunction roundByDPR(value: number) {\n const dpr = window.devicePixelRatio || 1\n return Math.round(value * dpr) / dpr\n}\n\nfunction onClickPreventDefault(e: React.MouseEvent) {\n e.preventDefault()\n e.stopPropagation()\n}\n\nconst closestNumber = (arr: number[] | undefined, needle: number) => {\n return arr?.reduce((a, b) =>\n Math.abs(b - needle) < Math.abs(a - needle) ? b : a\n )\n}\n\ninterface Mark {\n value?: number\n label?: string\n above?: boolean\n below?: boolean\n color?: string\n from?: Date\n to?: Date\n}\n\nexport type MarkLine = Mark\nexport type MarkArea = Omit<Mark, 'above' | 'below' | 'value'>\n\n/** Minimal structural mirror of the proto SegmentationQuery message. */\nexport interface SegmentationQueryLike {\n id?: string\n selectorExpr?: unknown\n resource?: { name?: string }\n}\n\n/** Overlay outputs injected by the app (computed by its overlay-series hook). */\nexport interface TimeSeriesOverlay {\n seriesIdToYAxisName: Map<string, string>\n overlaySeriesIdToFormatter: Map<string, (v: number) => string>\n applyOverlaySeries: (option: EChartsOption) => EChartsOption\n}\n\nconst initialConfig: ChartConfigLike = {\n xAxis: {\n type: 'category',\n min: '',\n max: '',\n scale: true,\n name: '',\n column: ''\n },\n yAxis: {\n min: '',\n max: '',\n scale: true\n }\n}\n\n// Helper function to create result object with optional name\nconst createYAxisResult = (\n min: any,\n max: any,\n scale?: boolean,\n name?: string\n) => {\n const result: any = { min, max, scale }\n if (name) {\n result.name = name\n }\n return result\n}\n\n// Helper function to calculate margin for axis values\nconst calculateMargin = (value: number, isMin: boolean) => {\n if (isMin) {\n return value >= 0 ? Math.max(0, value * 0.9) : value * 1.1\n } else {\n return value >= 0 ? value * 1.1 : value * 0.9\n }\n}\n\nconst yAxisToChartOption = (\n option?: YAxisConfigLike,\n markLines: MarkLine[] = [],\n values?: SeriesLike<Date>[]\n) => {\n const { min, max, scale, name } = option || {}\n\n // Parse option min/max values early\n const hasValidMin = min !== undefined && min !== ''\n const hasValidMax = max !== undefined && max !== ''\n const optionMin = hasValidMin ? parseFloat(min as string) || min : undefined\n const optionMax = hasValidMax ? parseFloat(max as string) || max : undefined\n\n // If both min and max are set in option, use them directly\n if (hasValidMin && hasValidMax) {\n return createYAxisResult(optionMin, optionMax, scale, name)\n }\n\n // Only calculate when markLines has valid non-zero values\n const lineValues = markLines\n .map((m) => m.value)\n .filter(\n (v) => v !== undefined && v !== 0 && (v as any as string) !== '0'\n ) as number[]\n\n // If no valid markLines values and no option values, return undefined for min and max\n if (lineValues.length === 0 && !hasValidMin && !hasValidMax) {\n return createYAxisResult(undefined, undefined, scale, name)\n }\n\n // Collect all values for calculation\n const allValues = [...lineValues]\n if (values) {\n const valueSet = new Set<number>()\n values.forEach((series) => {\n series.data.forEach((point) => {\n const value = point[1]\n if (isNumber(value)) {\n valueSet.add(value)\n }\n })\n })\n valueSet.forEach((value) => {\n allValues.push(value)\n })\n }\n\n // Calculate final min/max values\n let finalMin = optionMin\n let finalMax = optionMax\n\n if (allValues.length > 0) {\n // Calculate min if not set in option\n if (!hasValidMin) {\n const minValue = allValues.reduce(\n (min, current) => Math.min(min, current),\n Infinity\n )\n finalMin = calculateMargin(minValue, true)\n }\n\n // Calculate max if not set in option\n if (!hasValidMax) {\n const maxValue = allValues.reduce(\n (max, current) => Math.max(max, current),\n -Infinity\n )\n finalMax = calculateMargin(maxValue, false)\n }\n }\n\n return createYAxisResult(finalMin, finalMax, scale, name)\n}\n\nconst getEventName = (name: string) => {\n let eventName: undefined | string = name.split('-')[0].trim()\n if (eventName.toLowerCase() === 'all events') {\n eventName = undefined\n }\n\n return eventName\n}\n\n// In dark mode, area fills at ECharts' default opacity (0.7) blend together and\n// obscure each other when multiple areas are stacked or overlapping, making them\n// hard to tell apart against the dark background. Lower the fill opacity so the\n// areas (and the series behind them) stay distinguishable. Only kick in when\n// there is more than one series; a single area keeps the default 0.7.\nconst DARK_AREA_FILL_OPACITY = 0.35\n\nconst applyDarkAreaOpacity = (series: any[]): any[] => {\n if (series.length <= 1) {\n return series\n }\n return series.map((s) => {\n if (!s?.areaStyle) {\n return s\n }\n const existing =\n typeof s.areaStyle.opacity === 'number' ? s.areaStyle.opacity : 0.7\n return {\n ...s,\n areaStyle: {\n ...s.areaStyle,\n opacity: Math.min(existing, DARK_AREA_FILL_OPACITY)\n }\n }\n })\n}\n\n/**\n * ECharts does not support time series with gaps, make sure all the series have same time series\n * @param series source series\n * @returns\n */\nexport const fixTimeSeries = (series: SeriesLike<Date>[]): void => {\n try {\n if (!series?.length) {\n return\n }\n\n const isValidDateSeries = series.every((s) =>\n s.data?.every((point) => {\n const date = point?.[0]\n return date instanceof Date && !isNaN(date.getTime())\n })\n )\n\n if (\n !isValidDateSeries ||\n series.length < 2 ||\n uniq(series.map((s) => s.data?.length)).length === 1\n ) {\n return\n }\n\n const timeIndex: Date[] = []\n const dataIndexes = new Array(series.length).fill(0)\n\n while (\n dataIndexes.some((d, index) => d < (series[index]?.data?.length || 0))\n ) {\n const times = dataIndexes.map((d, index) => {\n const date = series[index]?.data?.[d]?.[0]\n return date instanceof Date && !isNaN(date.getTime())\n ? date.getTime()\n : Infinity\n })\n const minTime = Math.min(...times)\n\n if (!isFinite(minTime)) {\n break\n }\n\n const newDate = new Date(minTime)\n if (isNaN(newDate.getTime())) {\n break\n }\n\n timeIndex.push(newDate)\n dataIndexes.forEach((d, index) => {\n const date = series[index]?.data?.[d]?.[0]\n if (\n date instanceof Date &&\n !isNaN(date.getTime()) &&\n date.getTime() === minTime\n ) {\n dataIndexes[index]++\n }\n })\n }\n\n series.forEach((s) => {\n if (!s?.data) return\n\n const data = s.data\n const fixedData: SeriesDataLike<Date>[] = []\n let index = 0\n\n timeIndex.forEach((t) => {\n if (\n data[index]?.[0] instanceof Date &&\n !isNaN(data[index][0].getTime()) &&\n isEqual(data[index][0], t)\n ) {\n fixedData.push(data[index])\n index++\n } else {\n fixedData.push([t, null])\n }\n })\n\n s.data = fixedData\n })\n } catch (error) {\n console.warn('Error in fixTimeSeries:', error)\n }\n}\n\n/**\n * Context built by the presentational chart for a hovered/clicked series, handed\n * out to the app so it can build the log/cohort URL + navigation. The app combines\n * `value` (the data point, holding the timestamp) with its own time range.\n */\nexport interface ViewActionContext {\n value: any\n labels: Record<string, string>\n name: string\n id?: string\n isEventSeries: boolean\n eventName?: string\n query?: { selectorExpr?: unknown }\n}\n\nexport interface TimeSeriesChartProps {\n // ── Display / behaviour fields (Like-typed mirror of the app's ChartProps) ──\n group?: string\n title?: string\n startTime?: DateTimeValue\n endTime?: DateTimeValue\n tz?: string\n minHeight?: number\n onSelectTimeRange?: (start: DateTimeValue, end: DateTimeValue) => void\n loading?: boolean\n controls?: boolean\n config?: ChartConfigLike\n onChangeConfig?: (config: ChartConfigLike) => void\n style?: CSSProperties\n chartType?: ChartTypeLike\n allowClick?: boolean\n showSymbol?: boolean\n sourceType?: string\n getEventNameById?: (id?: string) => string\n noLegend?: boolean\n onInitChart?: (chart: ECharts) => void\n markAreas?: MarkArea[]\n markLines?: MarkLine[]\n nonXAxis?: boolean\n\n // ── Injected (replacing app/runtime couplings) ──\n /** Already-computed primary series (app runs the worker compute). */\n series: SeriesLike<Date>[]\n /** Already-computed compare-period series (already styled by the app, or styled here). */\n compareSeries?: SeriesLike<Date>[]\n /** Legend entries for the primary series. */\n legend?: string[]\n /** Formats a value for axis/tooltip display (replaces lib/metrics/formatter). */\n numberFormatter: (value: number, seriesId?: string) => string\n /** Overlay outputs computed by the app (replaces the overlay-series hook). */\n overlay?: TimeSeriesOverlay\n /** Template-variable keys (replaces the app's template-variables atom). */\n templateVariableKeys?: string[]\n /**\n * Per-series metric labels, indexed by series index (the worker compute's\n * `seriesToMetricLabels`; the original read `labelsRef.current[idx]`).\n */\n seriesToMetricLabels?: {\n name: string\n labels: Record<string, string>\n id?: string\n }[]\n /** Map of series id → event name (the original `eventNameMapRef.current`). */\n eventNameMap?: Map<string, string>\n /** Map of series id → events query (the original `eventsQueryMapRef.current`). */\n eventsQueryMap?: Map<string, { selectorExpr?: unknown }>\n /**\n * Navigate to logs for a clicked series. The presentational builds the context\n * (from the hovered tooltip value + injected labels/event maps) and hands it out;\n * the app maps it to a URL + navigation using its own time range.\n */\n onViewLogs?: (ctx: ViewActionContext) => void\n /** Navigate to users/accounts for a clicked series (the app builds the cohort query). */\n onViewUsers?: (ctx: ViewActionContext) => void\n /**\n * Whether the \"View Logs\" action should be disabled. The component computes the\n * context (may be null) and passes it; the app decides disabled.\n */\n viewLogDisabled?: (ctx: ViewActionContext | null) => boolean\n /** Whether the \"View Users\" action should be disabled. */\n viewUsersDisabled?: (ctx: ViewActionContext | null) => boolean\n /** Counts of returned/total samples for the data-truncation banner. */\n returnedSeries?: number\n totalSeries?: number\n}\n\nconst TimeSeriesChart = forwardRef<EChartsHandle, TimeSeriesChartProps>(\n (props: TimeSeriesChartProps, ref) => {\n const yAxisRef = useRef<any>(null)\n const {\n group,\n title,\n startTime,\n endTime,\n tz,\n minHeight,\n onSelectTimeRange,\n loading,\n controls,\n config,\n markAreas,\n markLines,\n onChangeConfig,\n style,\n chartType,\n allowClick,\n sourceType,\n getEventNameById,\n noLegend: _noLegend = false,\n onInitChart,\n nonXAxis,\n // injected\n series: seriesProp,\n compareSeries: compareSeriesProp,\n legend: legendProp,\n numberFormatter,\n overlay,\n templateVariableKeys: _templateVariableKeys,\n seriesToMetricLabels,\n eventNameMap,\n eventsQueryMap,\n onViewLogs,\n onViewUsers,\n viewLogDisabled: viewLogDisabledProp,\n viewUsersDisabled: viewUsersDisabledProp,\n returnedSeries,\n totalSeries\n } = props\n\n void _templateVariableKeys\n\n const seriesToMetricLabelsRef = useMemo(\n () => seriesToMetricLabels ?? [],\n [seriesToMetricLabels]\n )\n const eventNameMapRef = useMemo(\n () => eventNameMap ?? new Map<string, string>(),\n [eventNameMap]\n )\n const eventsQueryMapRef = useMemo(\n () => eventsQueryMap ?? new Map<string, { selectorExpr?: unknown }>(),\n [eventsQueryMap]\n )\n\n const [yAxis, setYAxis] = useState(config?.yAxis || initialConfig.yAxis)\n const [xAxis, setXAxis] = useState(config?.xAxis || initialConfig.xAxis)\n const [maximumSignificantDigits, setMaximumSignificantDigits] = useState(3)\n const isDarkMode = useDarkMode()\n\n const minRef = useRef<any>(0)\n const maxRef = useRef<any>(0)\n const getSymbolSize = useCallback(\n (value: SeriesDataLike<Date>) => {\n const val = value[2] || 0\n return normalize(\n val,\n minRef.current,\n maxRef.current,\n config?.scatterConfig?.minSize,\n config?.scatterConfig?.maxSize\n )\n },\n [config?.scatterConfig?.minSize, config?.scatterConfig?.maxSize]\n )\n\n useEffect(() => {\n setYAxis(config?.yAxis || initialConfig.yAxis)\n }, [config])\n\n const legend = useMemo(() => legendProp || [], [legendProp])\n\n // Post-process the (already computed) primary series. This used to run on the\n // worker-compute result; now it runs on the injected `series` prop.\n const series = useMemo<SeriesLike<Date>[]>(() => {\n const result = (seriesProp || []).map((s) => ({ ...s }))\n computeMarkLines(result, markLines || [])\n computeMarksAreas(result, markAreas || [])\n if (config?.yAxis?.stacked) {\n fixTimeSeries(result)\n result.forEach((s) => {\n if (config?.seriesConfig && config.seriesConfig.series?.[s.name]) {\n return\n }\n s.stack = 'Total'\n s.stackStrategy = config?.yAxis?.stacked\n })\n }\n if (config?.lineConfig) {\n result.forEach((s) => {\n s.lineStyle = {\n ...s.lineStyle,\n type: config?.lineConfig?.style?.toLowerCase() || 'solid'\n }\n if (config?.lineConfig?.smooth) {\n s.smooth = true\n }\n })\n }\n if (chartType === 'SCATTER') {\n result.forEach((s) => {\n const min = s.data?.reduce((min, p) => {\n const val = p[2] || 0\n return Math.min(min, val)\n }, Infinity)\n const max = s.data?.reduce((max, p) => {\n const val = p[2] || 0\n return Math.max(max, val)\n }, -Infinity)\n minRef.current = min\n maxRef.current = max\n s.symbolSize = getSymbolSize\n })\n }\n if (allowClick) {\n result.forEach((serie) => {\n serie.emphasis =\n serie.type === 'bar'\n ? {\n itemStyle: {\n shadowColor: 'rgba(0, 0, 0, 0.3)',\n shadowBlur: 10\n }\n }\n : {\n scale: 1.5\n }\n })\n }\n return result\n }, [\n seriesProp,\n markAreas,\n markLines,\n chartType,\n config?.yAxis,\n config?.lineConfig,\n config?.seriesConfig,\n allowClick,\n getSymbolSize\n ])\n\n // Reset the max-significant-digits whenever the data changes (the worker\n // effect did this when it set series; we key it on the series prop instead).\n useEffect(() => {\n setMaximumSignificantDigits(3)\n }, [seriesProp])\n\n // Post-process the compare series (dashed/grey, secondary x-axis).\n const compareSeries = useMemo<SeriesLike<Date>[]>(() => {\n if (!compareSeriesProp?.length) {\n return []\n }\n const result = compareSeriesProp.map((s) => ({ ...s }))\n for (const s of result) {\n s.lineStyle = {\n ...s.lineStyle,\n type: 'dashed'\n }\n s.itemStyle = {\n ...s.itemStyle,\n color: 'rgba(120, 120, 120, 0.3)'\n }\n s.xAxisIndex = 1\n if (chartType === 'SCATTER') {\n s.symbolSize = getSymbolSize\n }\n }\n return result\n }, [compareSeriesProp, chartType, getSymbolSize])\n\n const NF = NumberFormat({ notation: 'compact', maximumSignificantDigits })\n const NF_LARGE = NumberFormat({ notation: 'scientific' })\n\n const seriesIdToYAxisName =\n overlay?.seriesIdToYAxisName ?? new Map<string, string>()\n const overlaySeriesIdToFormatter =\n overlay?.overlaySeriesIdToFormatter ??\n new Map<string, (v: number) => string>()\n const applyOverlaySeries =\n overlay?.applyOverlaySeries ?? ((options: EChartsOption) => options)\n\n const setYAxisWrap = (yAxis: YAxisConfigLike) => {\n setYAxis(yAxis)\n onChangeConfig?.({ ...config, yAxis })\n }\n\n let yAxisLabel: number | undefined\n\n const [start, end] = useMemo(() => {\n const [dataStart, dataEnd] = dateRangeOfSeries(series)\n const selectStart = startTime && toDayjs(startTime, true).toDate()\n const selectEnd = endTime && toDayjs(endTime, false).toDate()\n const selStart = selectStart ? shiftTimezone(selectStart, tz) : undefined\n const selEnd = selectEnd ? shiftTimezone(selectEnd, tz) : undefined\n const start =\n dataStart && selStart\n ? dataStart.getTime() < selStart.getTime()\n ? dataStart\n : selStart\n : selStart\n const end =\n dataEnd && selEnd\n ? dataEnd.getTime() > selEnd.getTime()\n ? dataEnd\n : selEnd\n : selEnd\n return [start, end]\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [series, startTime, endTime])\n\n const xLabelFormatter = useMemo(() => {\n return config?.xAxis?.type === 'category'\n ? (value: Date) => {\n const date = shiftTimezone(value, tz)\n let interval = (config?.timeRangeOverride?.timeRange as any)\n ?.interval as DurationLike | undefined\n if (!interval && start && end) {\n interval = calculateStepByDate(start, end)\n }\n return formatTime(date, tz, interval)\n }\n : undefined\n }, [\n config?.xAxis?.type,\n config?.timeRangeOverride?.timeRange,\n tz,\n start,\n end\n ])\n\n const tooltipParmsRef = useRef<any>({})\n\n // Build the per-series context the app needs to construct the log/cohort URL\n // and navigation. Sources the hovered/clicked data value from the internal\n // tooltipParmsRef, and labels / event name / query from the injected props\n // (the original read these from labelsRef / eventNameMapRef / eventsQueryMapRef).\n const getSeriesContext = useCallback(\n (seriesId: string, seriesIndex: number): ViewActionContext | null => {\n const params = tooltipParmsRef.current?.data\n if (!params || !seriesToMetricLabelsRef) {\n return null\n }\n\n let value: any\n let idx: number\n\n // Find the correct series data\n if (Array.isArray(params)) {\n const param = params.find(\n (p: any) => p.seriesId === seriesId || p.seriesIndex === seriesIndex\n )\n if (!param) return null\n value = param.value\n idx = param.seriesIndex\n } else {\n value = params.value\n idx = seriesIndex\n }\n\n if (!value) return null\n\n const {\n labels = {},\n name = '',\n id\n } = seriesToMetricLabelsRef[idx] || {}\n const isEventSeries =\n eventNameMapRef.has(id as string) || sourceType === 'ANALYTICS'\n\n let eventName: string | undefined\n if (sourceType === 'ANALYTICS') {\n try {\n const _eventName = getEventNameById?.(id)\n eventName =\n _eventName == undefined ? getEventName(name) : _eventName\n } catch {\n //do nothing\n }\n } else if (eventNameMapRef.has(id as string)) {\n eventName = eventNameMapRef.get(id as string) || undefined\n }\n\n const query = eventsQueryMapRef.get(id as string)\n\n return {\n value,\n labels,\n name,\n id,\n isEventSeries,\n eventName,\n query\n }\n },\n [\n seriesToMetricLabelsRef,\n eventNameMapRef,\n eventsQueryMapRef,\n sourceType,\n getEventNameById\n ]\n )\n\n // Internal handlers passed to ChartTooltip (which calls them with\n // (seriesId, seriesIndex)). They build the context and delegate to the\n // outward props; the app computes time ranges / URLs / navigation itself.\n const handleViewLogs = useCallback(\n (seriesId: string, seriesIndex: number) => {\n const ctx = getSeriesContext(seriesId, seriesIndex)\n if (!ctx) return\n onViewLogs?.(ctx)\n },\n [getSeriesContext, onViewLogs]\n )\n\n const handleViewUsers = useCallback(\n (seriesId: string, seriesIndex: number) => {\n const ctx = getSeriesContext(seriesId, seriesIndex)\n if (!ctx) return\n onViewUsers?.(ctx)\n },\n [getSeriesContext, onViewUsers]\n )\n\n const getViewLogDisabled = useCallback(\n (seriesId: string, seriesIndex: number) => {\n const ctx = getSeriesContext(seriesId, seriesIndex)\n return viewLogDisabledProp?.(ctx) ?? false\n },\n [getSeriesContext, viewLogDisabledProp]\n )\n\n const getViewUsersDisabled = useCallback(\n (seriesId: string, seriesIndex: number) => {\n const ctx = getSeriesContext(seriesId, seriesIndex)\n return viewUsersDisabledProp?.(ctx) ?? false\n },\n [getSeriesContext, viewUsersDisabledProp]\n )\n\n const tooltipFormatter = useCallback(\n (params: any /*ticket, callback*/) => {\n // Normalize params to always be an array for consistent handling\n const paramsArray = Array.isArray(params) ? params : [params]\n\n if (allowClick) {\n yAxisRef.current = paramsArray.map((param: any) => ({\n value: param.value,\n seriesIndex: param.seriesIndex,\n seriesName: param.seriesName\n }))\n }\n let title: string | undefined = undefined\n if (nonXAxis) {\n const value = paramsArray?.[0]?.data?.[0]\n title = `${config?.xAxis?.column ? `${config?.xAxis?.column}:` : ''} ${value}`\n } else if (xLabelFormatter) {\n const value = paramsArray?.[0]?.data?.[0]\n title = xLabelFormatter(value)\n }\n\n // Append Y-axis name suffix to overlay series in tooltip for disambiguation\n const annotatedParams = paramsArray.map((param: any) => {\n const yAxisName = seriesIdToYAxisName.get(param.seriesId)\n if (yAxisName) {\n return { ...param, seriesName: `${param.seriesName}(${yAxisName})` }\n }\n return param\n })\n\n const parmas = {\n data: chartType === 'SCATTER' ? params : annotatedParams,\n title,\n highlightSeriesId: (global as any).highlightSeriesId,\n compareTimeDuration: config?.timeRangeOverride?.compareTime?.ago as\n | DurationLike\n | undefined,\n numberFormatter: (value: number, seriesId?: string) => {\n const seriesFormatter = seriesId\n ? overlaySeriesIdToFormatter.get(seriesId)\n : undefined\n if (seriesFormatter) {\n return seriesFormatter(value)\n }\n return numberFormatter(value) as string\n },\n showTotal: config?.valueConfig?.tooltipTotal,\n // Gate on the outward props existing (same as the original gating on the\n // handlers existing): no handler → button doesn't render.\n onViewLogs: onViewLogs ? handleViewLogs : undefined,\n viewLogDisabled: onViewLogs ? getViewLogDisabled : undefined,\n onViewUsers: onViewUsers ? handleViewUsers : undefined,\n viewUsersDisabled: onViewUsers ? getViewUsersDisabled : undefined,\n sizeTitle: config?.scatterConfig?.symbolSize\n }\n tooltipParmsRef.current = parmas\n\n // Use specialized component for scatter charts\n if (chartType === 'SCATTER') {\n return ReactDOMServer.renderToString(\n <ScatterChartTooltip\n {...parmas}\n onViewLogs={undefined}\n viewLogDisabled={undefined}\n onViewUsers={undefined}\n viewUsersDisabled={undefined}\n sizeTitle={config?.scatterConfig?.symbolSize}\n />\n )\n } else {\n return ReactDOMServer.renderToString(\n <ChartTooltip\n {...parmas}\n onViewLogs={undefined}\n viewLogDisabled={undefined}\n onViewUsers={undefined}\n viewUsersDisabled={undefined}\n />\n )\n }\n },\n [\n allowClick,\n numberFormatter,\n overlaySeriesIdToFormatter,\n config,\n nonXAxis,\n chartType,\n xLabelFormatter,\n onViewLogs,\n handleViewLogs,\n getViewLogDisabled,\n onViewUsers,\n handleViewUsers,\n getViewUsersDisabled,\n seriesIdToYAxisName\n ]\n )\n\n // the brush event will be fired from all grouped charts. So we need to check if the event is from this chart\n const [active, setActive] = useState(false)\n const onSelect = useCallback(\n (start: number, end: number) => {\n if (onSelectTimeRange && active) {\n let startTime: DateTimeValue = fromNumber(start)\n let endTime: DateTimeValue = fromNumber(end)\n const interval = (config?.timeRangeOverride?.timeRange as any)\n ?.interval as DurationLike | undefined\n if (interval) {\n startTime = alignTime(startTime, interval, tz, 'start')\n endTime = alignTime(endTime, interval, tz, 'end')\n }\n onSelectTimeRange(startTime, endTime)\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onSelectTimeRange, active]\n )\n\n const allowBrush = useMemo(() => {\n if (nonXAxis) {\n return false\n }\n if (onSelectTimeRange && startTime && endTime) {\n const interval = (config?.timeRangeOverride?.timeRange as any)\n ?.interval as DurationLike | undefined\n const diff = toDayjs(endTime).diff(toDayjs(startTime), 'seconds')\n return interval ? diff > durationToSeconds(interval) : true\n }\n return false\n }, [\n config?.timeRangeOverride?.timeRange,\n startTime,\n endTime,\n onSelectTimeRange,\n nonXAxis\n ])\n\n const xAxisData = useMemo(() => {\n if (nonXAxis) {\n return [\n {\n type: 'category',\n axisLabel: {\n hideOverlap: true,\n fontSize: 11\n },\n name: config?.xAxis?.name\n }\n ]\n }\n\n const ret = [\n {\n type: config?.xAxis?.type || 'time',\n min: config?.xAxis?.type === 'category' ? undefined : start,\n max: config?.xAxis?.type === 'category' ? undefined : end,\n axisLabel: {\n hideOverlap: true,\n fontSize: 11,\n formatter: xLabelFormatter\n },\n axisTick: {\n show: false\n }\n } as any\n ]\n if (config?.xAxis?.name) {\n ret[0].name = config?.xAxis?.name\n }\n if (config?.timeRangeOverride?.compareTime?.ago) {\n const d = config?.timeRangeOverride?.compareTime?.ago as DurationLike\n const compareStart = toDayjs(timeBefore(dayjs(start), d, true)).toDate()\n const compareEnd = toDayjs(timeBefore(dayjs(end), d, false)).toDate()\n ret.push({\n show: false,\n type: config?.xAxis?.type || 'time',\n min: config?.xAxis?.type === 'category' ? undefined : compareStart,\n max: config?.xAxis?.type === 'category' ? undefined : compareEnd,\n axisLabel: {\n hideOverlap: true,\n fontSize: 11,\n formatter: xLabelFormatter\n }\n } as any)\n }\n return ret as any\n }, [\n config?.timeRangeOverride?.compareTime,\n start,\n end,\n nonXAxis,\n config?.xAxis,\n xLabelFormatter\n ])\n\n const options: EChartsOption = useMemo(() => {\n const primarySeries =\n xAxisData.length == 2 ? [...series, ...compareSeries] : series\n\n // Build primary Y-axis\n const primaryYAxis: any = {\n type: 'value',\n axisLabel: {\n formatter: function (value: number) {\n if (value == yAxisLabel && maximumSignificantDigits < 21) {\n setMaximumSignificantDigits(maximumSignificantDigits + 1)\n }\n yAxisLabel = value\n if (value > 1e21) {\n return NF_LARGE.format(value)\n }\n return NF.format(value)\n },\n margin:\n chartType === 'SCATTER'\n ? config?.scatterConfig?.maxSize\n ? config.scatterConfig.maxSize\n : 30\n : 4\n },\n ...yAxisToChartOption(\n yAxis,\n markLines,\n primarySeries as SeriesLike<Date>[]\n )\n }\n\n const baseOptions: EChartsOption = {\n title: {\n text: title\n },\n grid: {\n top: title ? 48 : 16,\n right: chartType === 'SCATTER' ? 16 : 8,\n bottom: 8,\n left: chartType === 'SCATTER' ? 20 : 12,\n containLabel: true\n },\n xAxis: xAxisData,\n dataZoom: {\n type: 'inside',\n zoomLock: true\n },\n legend: {\n data: legend,\n top: -10000,\n left: -10000\n },\n brush: allowBrush\n ? {\n xAxisIndex: 0\n }\n : undefined,\n toolbox: {\n show: false\n },\n yAxis: primaryYAxis,\n animation: false,\n series: primarySeries as any,\n tooltip: {\n trigger: chartType === 'SCATTER' ? 'item' : 'axis',\n confine: true,\n textStyle: {\n fontSize: 14,\n fontFamily: sansFontFamily\n },\n extraCssText:\n 'max-width: 75%; max-height: 50vh; overflow-y: auto; padding: 10px 0; background-color: rgba(var(--text-background)); border-color: rgba(var(--border-color));',\n formatter: tooltipFormatter\n },\n visualMap:\n chartType === 'SCATTER' &&\n config?.scatterConfig?.color &&\n (sentioColors.dark as any)[config.scatterConfig.color]\n ? {\n dimension: 2,\n min: minRef.current,\n max: maxRef.current,\n show: false,\n inRange: {\n color: isDarkMode\n ? (sentioColors.dark as any)[config.scatterConfig.color]\n : (sentioColors.light as any)[config.scatterConfig.color]\n }\n }\n : undefined\n }\n\n const finalOptions = applyOverlaySeries(baseOptions)\n if (isDarkMode && Array.isArray(finalOptions.series)) {\n finalOptions.series = applyDarkAreaOpacity(\n finalOptions.series as any[]\n ) as any\n }\n return finalOptions\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n title,\n xAxisData,\n legend,\n allowBrush,\n yAxis,\n series,\n compareSeries,\n applyOverlaySeries,\n tooltipFormatter,\n maximumSignificantDigits,\n xAxis,\n chartType,\n isDarkMode\n ])\n\n const {\n value: isOpen,\n setFalse: setClose,\n setTrue: setOpen\n } = useBoolean(false)\n const clickEventParamsRef = useRef<any>(null)\n const [selectedSeriesIndex, setSelectedSeriesIndex] = useState(0)\n const chartPositionRef = useRef<HTMLDivElement>(null)\n\n const { x, y, strategy, refs } = useFloating({\n open: isOpen,\n placement: 'right',\n middleware: [flip(), shift()]\n })\n const onClick = useCallback(\n (params: any, rawParams?: any) => {\n if (!params) {\n setClose()\n return\n }\n const baseBoundingRect =\n chartPositionRef.current?.getBoundingClientRect()\n if (params.event) {\n const { event } = params\n clickEventParamsRef.current = params\n const targetBoundRect = event.target.getBoundingRect()\n refs.setPositionReference({\n getBoundingClientRect: () => {\n return {\n x: event.offsetX + (baseBoundingRect?.x ?? 0),\n y: event.offsetY + (baseBoundingRect?.y ?? 0),\n width: targetBoundRect.width,\n height: targetBoundRect.height,\n top: event.offsetY + (baseBoundingRect?.top ?? 0),\n right: event.offsetX + (baseBoundingRect?.right ?? 0),\n bottom: event.offsetY + (baseBoundingRect?.bottom ?? 0),\n left: event.offsetX + (baseBoundingRect?.left ?? 0)\n } as DOMRect\n }\n })\n } else if (isArray(params)) {\n const targetValue = closestNumber(\n yAxisRef.current?.map((item: any) => item.value[1]),\n params[1]\n )\n clickEventParamsRef.current = yAxisRef.current?.find(\n (item: any) => item.value[1] === targetValue\n )\n refs.setPositionReference({\n getBoundingClientRect: () => {\n return {\n x: rawParams.offsetX + (baseBoundingRect?.x ?? 0),\n y: rawParams.offsetY + (baseBoundingRect?.y ?? 0),\n width: 10,\n height: 10,\n top: rawParams.offsetY + (baseBoundingRect?.top ?? 0),\n right: rawParams.offsetX + (baseBoundingRect?.right ?? 0),\n bottom: rawParams.offsetY + (baseBoundingRect?.bottom ?? 0),\n left: rawParams.offsetX + (baseBoundingRect?.left ?? 0)\n } as DOMRect\n }\n })\n }\n setOpen()\n },\n [refs, setClose, setOpen]\n )\n\n const onSeriesEvent = useCallback((event: string, params: any) => {\n switch (event) {\n case 'click':\n setSelectedSeriesIndex(params.seriesIndex)\n break\n case 'mouseover':\n ;(global as any).highlightSeriesId = params.seriesId\n document\n .querySelectorAll(`.series_${params.seriesId}`)\n .forEach((node) => {\n node.classList.add('highlighted')\n })\n break\n case 'mouseout':\n const previousSeriesId = (global as any).highlightSeriesId\n if (previousSeriesId) {\n document\n .querySelectorAll(`.series_${previousSeriesId}`)\n .forEach((node) => {\n node.classList.remove('highlighted')\n })\n }\n ;(global as any).highlightSeriesId = ''\n }\n }, [])\n\n const onSelectSeries = useCallback(\n (seriesIndex: number) => {\n clickEventParamsRef.current = {\n seriesIndex: seriesIndex,\n seriesName: series[seriesIndex].name\n }\n if (yAxisRef.current[seriesIndex]?.value) {\n clickEventParamsRef.current.value =\n yAxisRef.current[seriesIndex].value\n }\n setSelectedSeriesIndex(seriesIndex)\n },\n [series, setSelectedSeriesIndex]\n )\n\n const switchSeries = useMemo(() => {\n const items = [\n series.map((serie, index) => ({\n label: serie.name || '',\n key: `${index}`\n }))\n ]\n return (\n <PopupMenuButton\n onSelect={(d) => onSelectSeries(parseInt(d, 10))}\n items={items}\n buttonIcon={(open: boolean) => (\n <span\n className={classNames(\n 'text-primary-100',\n 'hover:bg-primary-200/80 inline-block cursor-pointer rounded-md px-1 py-0.5',\n open ? 'bg-primary-200/80' : ''\n )}\n >\n <LuChevronDown className=\"h-3.5 w-3.5\" />\n </span>\n )}\n portal={false}\n placement=\"bottom-end\"\n itemsClassName=\"max-h-[50vh] overflow-y-auto\"\n />\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [series])\n\n // Note: `switchSeries` and `selectedSeriesIndex` participate in the fixed\n // (click) tooltip series-switching affordance; referenced to keep parity with\n // the source even though they are wired via tooltipParmsRef.\n void switchSeries\n void selectedSeriesIndex\n // `getEventName`, `sourceType`, and `getEventNameById` are now genuinely used\n // by getSeriesContext.\n\n const noLegend = useMemo(() => {\n // hide legend for single series scatter chart\n if (chartType === 'SCATTER' && series.length === 1) {\n return true\n }\n return _noLegend\n }, [_noLegend, chartType, series?.length])\n\n return (\n <div\n className=\"h-full w-full\"\n onMouseOver={() => {\n setActive(true)\n }}\n onMouseOut={() => {\n setActive(false)\n }}\n >\n <ReactEChartsBase\n ref={ref}\n loading={loading}\n group={group}\n option={options}\n minHeight={minHeight}\n returnedSeries={returnedSeries}\n totalSeries={totalSeries}\n onSelect={onSelect}\n onClick={allowClick ? onClick : undefined}\n style={style}\n onSeriesEvent={onSeriesEvent}\n noLegend={noLegend}\n onInitChart={onInitChart}\n />\n {controls && nonXAxis && (\n <XAxisControls xAxis={xAxis} setXAxis={setXAxis} defaultOpen />\n )}\n {controls && <YaxisControls yAxis={yAxis} setYAxis={setYAxisWrap} />}\n <div className=\"absolute left-0 top-0\" ref={chartPositionRef}></div>\n {isOpen && allowClick && (\n <FloatingPortal>\n <FloatingOverlay className=\"z-50 bg-gray-100/20\" onClick={setClose}>\n <div\n ref={refs.setFloating}\n className=\"border-border-color bg-default-bg min-w-64 absolute w-fit divide-y rounded-md border pb-2 shadow-sm\"\n style={{\n position: strategy,\n top: 0,\n left: 0,\n transform: `translate(${roundByDPR(x || 0)}px,${roundByDPR(y || 0)}px)`\n }}\n onClick={onClickPreventDefault}\n >\n <div className=\"text-text-foreground max-h-80 max-w-[50vw] overflow-y-auto py-2 text-sm\">\n {chartType === 'SCATTER' ? (\n <ScatterChartTooltip {...tooltipParmsRef.current} isFixed />\n ) : (\n <ChartTooltip {...tooltipParmsRef.current} isFixed />\n )}\n </div>\n </div>\n </FloatingOverlay>\n </FloatingPortal>\n )}\n </div>\n )\n }\n)\n\nTimeSeriesChart.displayName = 'TimeSeriesChart'\n\nexport { TimeSeriesChart }\nexport default TimeSeriesChart\n\nfunction computeMarkLines(series: any[], markLines: MarkLine[]) {\n if (markLines && markLines.length > 0 && series.length > 0) {\n series[0] = {\n ...series[0],\n markLine: {\n symbol: [],\n data: markLines.map((area) => {\n if (area.from || area.to) {\n return [\n {\n name: 'threshold',\n xAxis: area.from,\n yAxis: area.value ?? 'min',\n symbol: 'react',\n symbolSize: [20, 1],\n symbolOffset: [area.below ? -10 : 10, 0],\n label: {\n formatter: `${area.label}`,\n position: area.below\n ? 'insideMiddleBottom'\n : 'insideMiddleTop',\n color: area.color || '#ff0000'\n },\n lineStyle: {\n color: area.color || '#ff0000'\n }\n },\n {\n symbol: 'rect',\n symbolSize: [20, 1],\n symbolOffset: [area.below ? 10 : -10, 0],\n xAxis: area.to ? area.to : undefined,\n yAxis: area.value ?? 'max'\n }\n ]\n } else {\n return {\n name: 'threshold',\n yAxis: area.value,\n symbol: 'react',\n symbolSize: [20, 1],\n symbolOffset: [area.below ? -10 : 10, 0],\n label: {\n formatter: `${area.label}`,\n position: area.below ? 'insideStartBottom' : 'insideStartTop',\n color: area.color || '#ff0000'\n },\n lineStyle: {\n color: area.color || '#ff0000'\n }\n }\n }\n })\n }\n }\n }\n}\n\nfunction computeMarksAreas(series: any[], markAreas: MarkArea[]) {\n if (markAreas && markAreas.length > 0 && series.length > 0) {\n series[0].markArea = {\n itemStyle: {\n color: markAreas[0].color || 'rgba(255, 173, 177, 0.4)'\n }\n }\n series[0].markArea.data = markAreas.map((markArea) => {\n return [\n {\n xAxis: markArea.from ? markArea.from : undefined\n },\n {\n xAxis: markArea.to ? markArea.to : undefined\n }\n ]\n })\n }\n}\n\nconst MIN_SIZE = 5\nconst MAX_SIZE = 30\nconst LEVELS = 10\n\nfunction normalize(\n value: number,\n min: number,\n max: number,\n minSize = MIN_SIZE,\n maxSize = MAX_SIZE\n): number {\n if (max === min) return MIN_SIZE\n if (value <= min) return minSize\n if (value >= max) return maxSize\n\n const range = max - min\n const levelRange = range / LEVELS\n\n const sizeIncrement = (maxSize - minSize) / (LEVELS - 1)\n\n const level = Math.floor((value - min) / levelRange)\n const clampedLevel = Math.min(level, LEVELS - 1)\n\n return minSize + clampedLevel * sizeIncrement\n}\n","import dayjs from 'dayjs'\nimport duration from 'dayjs/plugin/duration'\nimport utc from 'dayjs/plugin/utc'\nimport timezone from 'dayjs/plugin/timezone'\nimport quarterOfYear from 'dayjs/plugin/quarterOfYear'\nimport localizedFormat from 'dayjs/plugin/localizedFormat'\nimport type { DurationLike } from '@sentio/ui-core'\nimport type { SeriesLike } from '../types'\n\ndayjs.extend(duration)\ndayjs.extend(utc)\ndayjs.extend(timezone)\ndayjs.extend(quarterOfYear)\ndayjs.extend(localizedFormat)\n\nconst TimeUnitShortNames: Record<string, string> = {\n s: 'seconds',\n m: 'minutes',\n h: 'hours',\n d: 'days',\n w: 'weeks',\n M: 'months',\n y: 'years'\n}\n\n/** [min, max] timestamp across all series (data is sorted by timestamp). */\nexport function dateRangeOfSeries(series: SeriesLike<Date>[]): [Date, Date] {\n let min = new Date()\n let max = new Date(0)\n for (const s of series) {\n if (s.data.length > 0) {\n const dmin = s.data[0][0] || min\n const dmax = s.data[s.data.length - 1][0] || max\n if (dmin < min) min = dmin\n if (dmax > max) max = dmax\n }\n }\n return [min, max]\n}\n\nexport function durationToSeconds(d?: DurationLike): number {\n if (!d) return 0\n return dayjs\n .duration(Number(d.value) || 0, d.unit as dayjs.UnitTypeShort)\n .asSeconds()\n}\n\nexport function parseDuration(s: string): DurationLike {\n const m = s.match(/(\\d+)([a-z]+)/i)\n if (m) {\n const [, value, unit] = m\n return { value: parseInt(value), unit: TimeUnitShortNames[unit] }\n }\n return { value: 0, unit: 'second' }\n}\n\n// Round a millisecond span to the nearest sensible bucket interval.\nexport function roundInterval(diff: number): string {\n switch (true) {\n case diff <= dayjs.duration(15, 'minute').asMilliseconds():\n return '10s'\n case diff <= dayjs.duration(1, 'day').asMilliseconds():\n return '1m'\n case diff <= dayjs.duration(30, 'day').asMilliseconds():\n return '1h'\n case diff <= dayjs.duration(2, 'years').asMilliseconds():\n return '1d'\n case diff <= dayjs.duration(10, 'years').asMilliseconds():\n default:\n return '7d'\n }\n}\n\nexport function calculateStepByDate(start: Date, end: Date): DurationLike {\n return parseDuration(roundInterval(end.getTime() - start.getTime()))\n}\n\n/** Shift a Date so plain formatting renders the wall-clock time in `tz`. */\nexport function shiftTimezone(time: Date | dayjs.Dayjs, tz?: string): Date {\n const origin = dayjs.isDayjs(time) ? time : dayjs(time)\n if (!tz) return origin.toDate()\n const offset = origin.tz(tz).utcOffset() - origin.utcOffset()\n return origin.add(offset, 'minute').toDate()\n}\n\nexport const formatTime = (\n time: Date,\n tz?: string,\n interval?: DurationLike\n): string => {\n const d = dayjs(shiftTimezone(time, tz))\n switch (interval?.unit) {\n case 's':\n return d.format('HH:mm:ss')\n case 'm':\n return d.format('DD HH:mm')\n case 'h':\n return d.format('MM-DD HH:mm')\n case 'd':\n case 'w':\n return d.format('YYYY-MM-DD')\n case 'M':\n return interval.value === 3\n ? `${d.format('YYYY')}-Q${d.quarter()}`\n : d.format('YYYY-MMM')\n default:\n return d.format('lll')\n }\n}\n","/*\n * Proto-coupled time helpers ported from the app's `lib/time.ts`, reimplemented\n * against `DurationLike` (from @sentio/ui-core) instead of the generated proto\n * `Duration` message. Only the helpers referenced by the render charts are\n * ported here; the proto-free core (toDayjs, fromNumber, pickRangeByTimeRange,\n * dateTimeToString, isRelativeTime, now, TimeUnitShortNames, shiftTimezone …)\n * already lives in @sentio/ui-core.\n */\nimport dayjs from 'dayjs'\nimport {\n toDayjs,\n isRelativeTime,\n now,\n TimeUnitShortNames,\n type DateTimeValue,\n type RelativeTime,\n type DurationLike\n} from '@sentio/ui-core'\nimport { durationToSeconds } from './series-utils'\nimport type { TimeLike } from '../types/chart'\n\n/** Window [currentTime, currentTime + interval] picked by a fixed interval. */\nexport function pickRangeByInterval(\n currentTime: DateTimeValue,\n interval: DurationLike\n): {\n startTime: DateTimeValue\n endTime: DateTimeValue\n} {\n const start = toDayjs(currentTime)\n const end = start.add(durationToSeconds(interval), 'second')\n\n return {\n startTime: start,\n endTime: end\n }\n}\n\n/** Snap a time to the start/end of the bucket of size `step` (timezone-aware). */\nexport function alignTime(\n time: DateTimeValue,\n step: DurationLike,\n tz?: string,\n align: 'start' | 'end' = 'start'\n): DateTimeValue {\n try {\n const d = toDayjs(time)\n const seconds = durationToSeconds(step)\n const tzOffset = (tz ? d.tz(tz).utcOffset() : 0) * 60\n const offset = (d.unix() + tzOffset) % seconds\n if (offset === 0) {\n return time\n }\n\n return align == 'start'\n ? d.subtract(offset, 'second')\n : d.add(seconds - offset, 'second')\n } catch (e) {\n // dayjs.tz may throw exception for some unknown reason\n console.error(e)\n return time\n }\n}\n\n/** Shift a time backwards by `duration`, preserving relative-time semantics. */\nexport function timeBefore(\n time: DateTimeValue,\n duration: DurationLike,\n asStart: boolean = true\n): DateTimeValue {\n const durationValue = Number(duration.value)\n if (isRelativeTime(time)) {\n const rt = time as RelativeTime\n if (rt.unit == null || time == now) {\n return {\n sign: -1,\n unit: TimeUnitShortNames[duration.unit!],\n value: durationValue\n }\n }\n if (rt.align) {\n const t = toDayjs(rt, asStart)\n return t.subtract(durationValue, TimeUnitShortNames[duration.unit!])\n }\n\n const t = toDayjs(time)\n const nt = t.subtract(durationValue, TimeUnitShortNames[duration.unit!])\n const unit = 'days'\n const value = nt.diff(dayjs(), unit)\n return { sign: value < 0 ? -1 : 1, unit, value: Math.abs(value) }\n } else {\n const t = toDayjs(time)\n return t.subtract(durationValue, TimeUnitShortNames[duration.unit!])\n }\n}\n\n// TimeLike (absolute/relative) ⇄ DateTimeValue. Ported proto-free from the\n// app's lib/time; operates on the structural `TimeLike` instead of the proto\n// `TimeRange.TimeLike` message.\nexport function fromTimeLike(tl?: TimeLike): DateTimeValue | undefined {\n if (!tl) {\n return undefined\n }\n if (tl.relativeTime) {\n const value = tl.relativeTime.value || 0\n return {\n value: Math.abs(value),\n unit: tl.relativeTime.unit as RelativeTime['unit'],\n sign: value < 0 ? -1 : 1\n }\n }\n return dayjs.unix(parseInt(tl.absoluteTime || ''))\n}\n\nexport function toTimeLike(t?: DateTimeValue): TimeLike {\n if (dayjs.isDayjs(t)) {\n return { absoluteTime: `${t.unix()}` }\n }\n const rt = t as RelativeTime\n return {\n relativeTime: { unit: rt.unit, value: rt.sign * rt.value, align: rt.align }\n }\n}\n","import { defaults } from 'lodash'\nimport type { ReactNode } from 'react'\nimport { Button, Checkbox, DisclosurePanel } from '@sentio/ui-core'\nimport { AddonLabel } from './controls-ui'\nimport type { YAxisConfigLike } from '../../types'\n\ninterface Props {\n yAxis?: YAxisConfigLike\n setYAxis: (yAxis: YAxisConfigLike) => void\n defaultOpen?: boolean\n /** Optional app-supplied column picker (sql charts). When present the Column row renders. */\n columnSelect?: ReactNode\n supportSetName?: boolean\n supportSetMinMax?: boolean\n supportStackSeries?: boolean\n supportAlwaysShowZero?: boolean\n supportReset?: boolean\n panelTitle?: string\n}\n\nconst initialConfig = {\n yAxis: {\n min: '',\n max: '',\n scale: true,\n stack: ''\n }\n}\n\nexport default function YaxisControls({\n yAxis,\n setYAxis,\n defaultOpen,\n columnSelect,\n supportSetName = true,\n supportSetMinMax = true,\n supportStackSeries = true,\n supportAlwaysShowZero = true,\n supportReset = true,\n panelTitle = 'Y-Axis Controls'\n}: Props) {\n yAxis = defaults(yAxis || {}, initialConfig.yAxis)\n const onChangeInput =\n (field: string) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = event.target\n setYAxis({\n ...yAxis,\n [field]: value || undefined,\n scale: field == 'min' && value > '0' ? true : yAxis?.scale\n })\n }\n const onToggleZero = (checked: boolean) => {\n setYAxis({ ...yAxis, scale: !checked, min: checked ? '' : yAxis?.min })\n }\n const onClickResetYAxis = () => {\n setYAxis(initialConfig.yAxis)\n }\n\n const onToggleStack = (checked: boolean) => {\n setYAxis({ ...yAxis, stacked: checked ? 'samesign' : '' })\n }\n\n const minMaxLabelCls =\n 'inline-flex items-center border border-r-0 sm:text-icontent border-main bg-gray-50 px-2 rounded-l-md'\n const minMaxInputCls =\n 'border focus:border-primary-500 rounded-r-md sm:text-icontent border-main hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30'\n\n return (\n <DisclosurePanel\n title={panelTitle}\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"text-icontent flex flex-wrap gap-[10px]\">\n {supportSetName && (\n <label className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Name\n </AddonLabel>\n <input\n type=\"text\"\n className=\"focus:border-primary-500 sm:text-icontent border-main hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 w-40 rounded-r-md border\"\n value={yAxis?.name}\n placeholder=\"Axis Name\"\n onChange={onChangeInput('name')}\n />\n </label>\n )}\n {columnSelect && (\n <span className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Column\n </AddonLabel>\n {columnSelect}\n </span>\n )}\n {supportSetMinMax && (\n <>\n <label className=\"inline-flex h-8\">\n <span className={minMaxLabelCls}>Min</span>\n <input\n type=\"text\"\n className={minMaxInputCls}\n style={{ width: '10em' }}\n value={yAxis.min}\n placeholder=\"Auto\"\n onChange={onChangeInput('min')}\n />\n </label>\n <label className=\"inline-flex h-8\">\n <span className={minMaxLabelCls}>Max</span>\n <input\n type=\"text\"\n className={minMaxInputCls}\n style={{ width: '10em' }}\n value={yAxis.max}\n placeholder=\"Auto\"\n onChange={onChangeInput('max')}\n />\n </label>\n </>\n )}\n\n {supportStackSeries && (\n <Checkbox\n checked={!!yAxis?.stacked}\n onChange={onToggleStack}\n label=\"Stack series\"\n />\n )}\n\n {supportAlwaysShowZero && (\n <Checkbox\n checked={!yAxis.scale}\n onChange={onToggleZero}\n label=\"Always show zero\"\n />\n )}\n\n {supportReset && (\n <Button type=\"button\" role=\"link\" onClick={onClickResetYAxis}>\n Reset\n </Button>\n )}\n </div>\n </DisclosurePanel>\n )\n}\n","import type { ReactNode } from 'react'\nimport { classNames } from '@sentio/ui-core'\n\n// Inline addon label sitting flush against a select/input across the option\n// panels. The base carries the invariant chrome; `className` carries the\n// per-use border-side / rounded / padding variant.\nexport const AddonLabel = ({\n className,\n children\n}: {\n className?: string\n children: ReactNode\n}) => (\n <span\n className={classNames(\n 'sm:text-icontent border-main inline-flex items-center whitespace-nowrap bg-gray-50',\n className\n )}\n >\n {children}\n </span>\n)\n","import type { ReactNode } from 'react'\nimport {\n Button,\n DisclosurePanel,\n PopoverTooltip,\n Select\n} from '@sentio/ui-core'\nimport { AddonLabel } from './controls-ui'\nimport { LuInfo } from 'react-icons/lu'\nimport type { SortByLike, XAxisConfigLike } from '../../types'\n\nconst TypeSelect = Select<string>\nconst SortSelect = Select<string>\nconst OrderSelect = Select<boolean | undefined>\n\nconst sortByItems = [\n { label: 'Name', value: 'ByName' },\n { label: 'Value', value: 'ByValue' }\n]\nconst orderItems = [\n { label: 'Ascendant', value: false },\n { label: 'Descendant', value: true }\n]\n\ninterface Props {\n xAxis?: XAxisConfigLike\n setXAxis: (val?: XAxisConfigLike) => void\n defaultOpen?: boolean\n /** Optional app-supplied column picker (sql charts). When present the Column row renders. */\n columnSelect?: ReactNode\n /** Whether the selected X column is a non-TIME column (app resolves from the data schema). */\n columnIsNonTime?: boolean\n panelTitle?: string\n supportName?: boolean\n supportSort?: boolean\n supportSetType?: boolean\n}\n\nexport const XAxisControls = ({\n xAxis,\n setXAxis,\n defaultOpen,\n columnSelect,\n columnIsNonTime,\n panelTitle = 'X-Axis Controls',\n supportName = true,\n supportSort,\n supportSetType\n}: Props) => {\n const onChangeInput =\n (field: string) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = event.target\n setXAxis({ ...xAxis, [field]: value || undefined })\n }\n const onClickResetXAxis = () => {\n setXAxis(undefined)\n }\n\n const isXAixsNoneTime = xAxis && xAxis.column && columnIsNonTime\n\n return (\n <DisclosurePanel\n title={panelTitle}\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"text-icontent flex flex-wrap gap-[10px]\">\n {supportName && (\n <label className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Name\n </AddonLabel>\n <input\n type=\"text\"\n className=\"sm:text-icontent border-main hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 w-40 rounded-r-md\"\n value={xAxis?.name}\n placeholder=\"Axis Name\"\n onChange={onChangeInput('name')}\n />\n </label>\n )}\n {supportSetType && (\n <span className=\"inline-flex h-8\">\n <span className=\"sm:text-icontent border-main inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-2\">\n X-Axis Type{' '}\n <PopoverTooltip\n strategy=\"fixed\"\n hideArrow\n placementOption=\"bottom\"\n text={\n <div className=\"text-text-foreground max-w-[300px] p-2\">\n <span className=\"font-medium\">Discrete axis</span> displays{' '}\n <span className=\"text-primary-600\">\n discrete values evenly\n </span>\n , while <span className=\"font-medium\">Continuous axis</span>{' '}\n shows{' '}\n <span className=\"text-primary-600\">\n continuous time series\n </span>{' '}\n and{' '}\n <span className=\"text-primary-600\">\n auto-fills missing time points\n </span>\n </div>\n }\n >\n <LuInfo className=\"text-text-foreground-secondary h-4 w-4\" />\n </PopoverTooltip>\n </span>\n <TypeSelect\n className=\"h-8 w-40\"\n buttonClassName=\"h-full border-main rounded-l-none items-center inline-flex items-center\"\n value={xAxis?.type || 'time'}\n onChange={(val) => {\n setXAxis({ ...xAxis, type: val })\n }}\n options={[\n { label: 'Continuous', value: 'time' },\n { label: 'Discrete', value: 'category' }\n ]}\n />\n </span>\n )}\n {columnSelect && (\n <span className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Column\n </AddonLabel>\n {columnSelect}\n </span>\n )}\n {supportSort && isXAixsNoneTime && (\n <span className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Sort By\n </AddonLabel>\n <SortSelect\n className=\"h-8 w-20 leading-8\"\n buttonClassName=\"h-full border-main rounded-none inline-flex items-center\"\n options={sortByItems}\n value={xAxis?.sort?.sortBy as string}\n onChange={(value: string) => {\n setXAxis({\n ...xAxis,\n sort: { ...xAxis?.sort, sortBy: value as SortByLike }\n })\n }}\n placeholder=\"Sort By\"\n />\n <OrderSelect\n className=\"h-8 w-40 leading-8\"\n buttonClassName=\"h-full border-l-0 border-main rounded-l-none inline-flex items-center\"\n options={orderItems}\n value={xAxis?.sort?.orderDesc}\n onChange={(value) => {\n setXAxis({\n ...xAxis,\n sort: { ...xAxis?.sort, orderDesc: value }\n })\n }}\n placeholder=\"Sort Order\"\n />\n </span>\n )}\n <Button\n type=\"button\"\n role=\"link\"\n onClick={onClickResetXAxis}\n className=\"h-8\"\n >\n Reset\n </Button>\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport {\n DisclosurePanel,\n NewButtonGroup as ButtonGroup,\n Checkbox\n} from '@sentio/ui-core'\nimport type { LineConfigLike, LineStyleLike } from '../../types'\n\nconst lineStyles: { label: string; value: LineStyleLike }[] = [\n { label: 'Solid', value: 'Solid' },\n { label: 'Dotted', value: 'Dotted' }\n]\n\ninterface Props {\n config?: LineConfigLike\n defaultOpen?: boolean\n onChange: (config: LineConfigLike) => void\n}\n\nexport const LineControls = ({ config, defaultOpen, onChange }: Props) => {\n const setStyle = (style: LineStyleLike) => {\n onChange(\n produce(config || {}, (draft) => {\n draft.style = style\n })\n )\n }\n const setSmooth = (smooth: boolean) => {\n onChange(\n produce(config || {}, (draft) => {\n draft.smooth = smooth\n })\n )\n }\n return (\n <DisclosurePanel\n title=\"Line style\"\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex items-center gap-4\">\n <ButtonGroup\n buttons={lineStyles}\n value={config?.style || 'Solid'}\n onChange={setStyle}\n small\n />\n <Checkbox\n label=\"Smooth Curves\"\n checked={config?.smooth}\n onChange={setSmooth}\n />\n </div>\n </DisclosurePanel>\n )\n}\n","import { useEffect, useMemo } from 'react'\nimport { produce } from 'immer'\nimport { Button as NewButton, DisclosurePanel, HelpIcon } from '@sentio/ui-core'\nimport type { LabelConfigLike } from '../../types'\n\ninterface Props {\n config?: LabelConfigLike\n setConfig: (value: LabelConfigLike) => void\n defaultOpen?: boolean\n}\n\nconst initialConfig: LabelConfigLike = {\n columns: [],\n alias: ''\n}\n\nexport const LabelControls = ({ config, setConfig, defaultOpen }: Props) => {\n // Migrate existing columns config to alias on component mount\n useEffect(() => {\n if (config?.columns && config.columns.length > 0 && !config.alias) {\n const aliasParts: string[] = []\n config.columns.forEach((colConfig) => {\n if (!colConfig.name) return // Skip if name is undefined\n\n if (colConfig.showLabel === false && colConfig.showValue === false) {\n // ignore\n } else if (colConfig.showValue === false) {\n aliasParts.push(colConfig.name)\n } else {\n aliasParts.push(`{{${colConfig.name}}}`)\n }\n })\n\n if (aliasParts.length > 0) {\n const migratedAlias = aliasParts.join(', ')\n setConfig(\n produce(config, (draft) => {\n draft.alias = migratedAlias\n draft.columns = [] // Clear the old columns config\n })\n )\n }\n }\n }, [config, setConfig])\n\n const onAliasChanged = (alias: string) => {\n setConfig(\n produce(config ?? initialConfig, (draft) => {\n draft.alias = alias\n })\n )\n }\n\n const _defaultOpen = useMemo(() => {\n if (defaultOpen) {\n return true\n }\n return (\n config?.alias !== '' || (config?.columns && config.columns.length > 0)\n )\n }, [config, defaultOpen])\n\n return (\n <DisclosurePanel\n title=\"Label Controls\"\n defaultOpen={_defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"inline-flex h-8\">\n <span className=\"sm:text-icontent border-main inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-2 font-medium\">\n Label Alias\n <HelpIcon\n text={\n <div className=\"text-icontent text-text-foreground\">\n <div>Series name override or template.</div>\n <div>\n Ex.{' '}\n <span className=\"text-primary mx-1 font-semibold italic\">\n {'{{contract}}'}\n </span>{' '}\n will be replaced with the value of the contract label.\n </div>\n </div>\n }\n />\n </span>\n <input\n type=\"text\"\n value={config?.alias || ''}\n onChange={(e) => onAliasChanged(e.target.value)}\n placeholder=\"Enter alias...\"\n className=\"focus:border-primary-500 sm:text-icontent border-main inline-flex w-64 items-center rounded-r-md border px-2\"\n />\n </div>\n <NewButton\n type=\"button\"\n role=\"link\"\n onClick={() => {\n setConfig(initialConfig)\n }}\n >\n Reset\n </NewButton>\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport { defaults } from 'lodash'\nimport {\n Checkbox,\n DisclosurePanel,\n NewButtonGroup as ButtonGroup\n} from '@sentio/ui-core'\nimport type { CalculationLike, PieConfigLike, PieTypeLike } from '../../types'\n\ninterface Props {\n config?: PieConfigLike\n defaultOpen?: boolean\n onChange: (config: PieConfigLike) => void\n}\n\nexport const defaultConfig: PieConfigLike = {\n pieType: 'Pie',\n calculation: 'LAST',\n showPercent: true,\n showValue: true,\n absValue: false\n}\n\nconst CalculationItems = [\n { label: 'Last', value: 'LAST' },\n { label: 'First', value: 'FIRST' },\n { label: 'Total', value: 'TOTAL' },\n { label: 'Mean', value: 'MEAN' },\n { label: 'Max', value: 'MAX' },\n { label: 'Min', value: 'MIN' }\n]\n\nconst PieTypeItems: { label: string; value: PieTypeLike }[] = [\n { label: 'Pie', value: 'Pie' },\n { label: 'Donut', value: 'Donut' }\n]\n\nexport function PieChartControls({ config, defaultOpen, onChange }: Props) {\n config = defaults(config, defaultConfig)\n\n function onCalculationChange(cal: CalculationLike) {\n config &&\n onChange(produce(config, (draft) => void (draft.calculation = cal)))\n }\n\n function onPieTypeChange(pieType: PieTypeLike) {\n config &&\n onChange(produce(config, (draft) => void (draft.pieType = pieType)))\n }\n\n function toggle(\n field: 'showValue' | 'showPercent' | 'absValue',\n value: boolean\n ) {\n config &&\n onChange(\n produce(config, (draft) => {\n draft[field] = value\n })\n )\n }\n\n return (\n <DisclosurePanel\n title=\"Pie Chart Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex items-center gap-4\">\n <div className=\"shadow-xs flex rounded-md\">\n <ButtonGroup\n small\n buttons={PieTypeItems}\n value={config.pieType}\n onChange={onPieTypeChange}\n />\n </div>\n <div className=\"shadow-xs flex rounded-md\">\n <span className=\"sm:text-ilabel border-main inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-3 \">\n Calculation\n </span>\n <select\n value={config.calculation}\n className=\"sm:text-ilabel text-text-foreground border-main hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 inline-flex items-center rounded-r-md border pl-4 pr-7\"\n onChange={(e) =>\n onCalculationChange(e.target.value as CalculationLike)\n }\n >\n {CalculationItems.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n </div>\n <Checkbox\n checked={config?.showValue}\n onChange={(v) => toggle('showValue', v)}\n label=\"Show value\"\n labelClassName=\"whitespace-nowrap\"\n />\n <Checkbox\n checked={config?.showPercent}\n onChange={(v) => toggle('showPercent', v)}\n label=\"Show percent\"\n labelClassName=\"whitespace-nowrap\"\n />\n <Checkbox\n checked={config?.absValue}\n onChange={(v) => toggle('absValue', v)}\n label=\"Use absolute values\"\n labelClassName=\"whitespace-nowrap\"\n />\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport { defaults } from 'lodash'\nimport { DisclosurePanel } from '@sentio/ui-core'\nimport type {\n BarGaugeConfigLike,\n CalculationLike,\n DirectionLike,\n SortByLike\n} from '../../types'\n\ninterface Props {\n config?: BarGaugeConfigLike\n defaultOpen?: boolean\n onChange: (config: BarGaugeConfigLike) => void\n}\n\nexport const defaultConfig: BarGaugeConfigLike = {\n direction: 'HORIZONTAL',\n calculation: 'LAST',\n sort: {\n sortBy: 'ByName',\n orderDesc: true\n }\n}\n\nconst directionItems = [\n { label: 'Horizontal', value: 'HORIZONTAL' },\n { label: 'Vertical', value: 'VERTICAL' }\n]\n\nconst CalculationItems = [\n { label: 'Last', value: 'LAST' },\n { label: 'First', value: 'FIRST' },\n { label: 'Total', value: 'TOTAL' },\n { label: 'Mean', value: 'MEAN' },\n { label: 'Max', value: 'MAX' },\n { label: 'Min', value: 'MIN' }\n]\n\nconst sortByItems = [\n { label: 'Name', value: 'ByName' },\n { label: 'Value', value: 'ByValue' }\n]\n\nconst orderItems = [\n { label: 'Ascendant', value: 'false' },\n { label: 'Descendant', value: 'true' }\n]\n\nexport function BarGaugeControls({ config, defaultOpen, onChange }: Props) {\n config = defaults(config, defaultConfig)\n\n function onCalculationChange(cal: CalculationLike) {\n config &&\n onChange(produce(config, (draft) => void (draft.calculation = cal)))\n }\n\n function onDirectionChange(dir: DirectionLike) {\n config && onChange(produce(config, (draft) => void (draft.direction = dir)))\n }\n\n function onOrderChange(orderDesc: boolean) {\n config &&\n onChange(\n produce(config, (draft) => {\n draft.sort = draft.sort || {}\n draft.sort.orderDesc = orderDesc\n })\n )\n }\n\n function onSortByChange(sortBy: SortByLike) {\n config &&\n onChange(\n produce(config, (draft) => {\n draft.sort = draft.sort || {}\n draft.sort.sortBy = sortBy\n })\n )\n }\n\n return (\n <DisclosurePanel\n title=\"Bar Gauge Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex items-center gap-4\">\n <div className=\"shadow-xs flex rounded-md\">\n <span className=\"sm:text-ilabel border-main inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-3 \">\n Direction\n </span>\n <select\n value={config.direction}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 inline-flex items-center rounded-r-md border pl-4 pr-7\"\n onChange={(e) => onDirectionChange(e.target.value as DirectionLike)}\n >\n {directionItems.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n </div>\n\n <div className=\"shadow-xs flex rounded-md\">\n <span className=\"sm:text-ilabel border-main inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-3 \">\n Calculation\n </span>\n <select\n value={config.calculation}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 inline-flex items-center rounded-r-md border pl-4 pr-7\"\n onChange={(e) =>\n onCalculationChange(e.target.value as CalculationLike)\n }\n >\n {CalculationItems.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n </div>\n\n <div className=\"shadow-xs flex rounded-md\">\n <span className=\"sm:text-ilabel border-main inline-flex items-center whitespace-nowrap rounded-l-md border border-r-0 bg-gray-50 px-3\">\n Sort by\n </span>\n <select\n value={config?.sort?.sortBy}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 inline-flex items-center border pl-4 pr-7\"\n onChange={(e) => onSortByChange(e.target.value as SortByLike)}\n >\n {sortByItems.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n <select\n value={config?.sort?.orderDesc + ''}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 inline-flex items-center rounded-r-md border border-l-0 pl-4 pr-7\"\n onChange={(e) => onOrderChange(e.target.value === 'true')}\n >\n {orderItems.map((d) => {\n return (\n <option key={d.label} value={d.value + ''}>\n {d.label}\n </option>\n )\n })}\n </select>\n </div>\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport { ComboInput, classNames } from '@sentio/ui-core'\nimport { AddonLabel as BaseAddonLabel } from './controls-ui'\nimport { ValueStringMapping } from './ValueStringMapping'\nimport type {\n MappingRuleLike,\n ValueConfigLike,\n ValueFormatterLike,\n ValueStyleLike\n} from '../../types'\n\nexport interface ValueFormatter {\n label: string\n value: ValueFormatterLike\n}\n\nexport const ValueFormatters: ValueFormatter[] = [\n { label: 'Number', value: 'NumberFormatter' },\n { label: 'Date', value: 'DateFormatter' },\n { label: 'String', value: 'StringFormatter' }\n]\n\ninterface Props {\n config: ValueConfigLike\n defaultOpen?: boolean\n onChange: (config: ValueConfigLike) => void\n formatters?: ValueFormatter[]\n showPrefix?: boolean\n showSuffix?: boolean\n}\n\nexport const defaultConfig: ValueConfigLike = {\n valueFormatter: 'NumberFormatter',\n showValueLabel: false,\n maxSignificantDigits: 3,\n dateFormat: 'LLL',\n mappingRules: [],\n style: 'None'\n}\n\nconst dateFormats = [\n { label: 'Localized format', value: 'LLL' },\n { label: 'ISO String', value: 'YYYY-MM-DDTHH:mm:ss.sssZ' }\n]\n\nconst CurrencySymbols = [\n { label: 'USD', value: '$' },\n { label: 'EUR', value: '€' },\n { label: 'GBP', value: '£' },\n { label: 'CNY or JPY', value: '¥' },\n { label: 'BTC', value: 'Ƀ' },\n { label: 'ETH', value: 'Ξ' }\n]\n\n// Value panel labels use px-3; thin adapter over the shared AddonLabel so call\n// sites keep passing only the border/rounded variant.\nconst AddonLabel = ({\n className,\n children\n}: {\n className?: string\n children: React.ReactNode\n}) => (\n <BaseAddonLabel className={classNames('px-3', className)}>\n {children}\n </BaseAddonLabel>\n)\n\nexport const ValueOptions = ({\n config,\n onChange,\n formatters = ValueFormatters,\n showPrefix,\n showSuffix\n}: Props) => {\n function onChangeDateFormat(f: string) {\n onChange(produce(config, (draft) => void (draft.dateFormat = f)))\n }\n function onChangeFormatter(f: ValueFormatterLike) {\n onChange(produce(config, (draft) => void (draft.valueFormatter = f)))\n }\n function onChangeSymbol(symbol?: string) {\n onChange(produce(config, (draft) => void (draft.currencySymbol = symbol)))\n }\n function onStyleChange(notation: ValueStyleLike) {\n onChange(\n produce(config, (draft) => {\n draft.style = notation\n })\n )\n }\n function onDigitsChange(value: string, option: string) {\n onChange(\n produce(config, (draft) => {\n const d = draft as Record<string, any>\n if (value) {\n const maxSignificantDigits = parseInt(value)\n if (maxSignificantDigits >= 0 && maxSignificantDigits <= 20) {\n d[option] = maxSignificantDigits\n }\n } else {\n delete d[option]\n }\n })\n )\n }\n\n function onMappingRulesChange(rules: MappingRuleLike[]) {\n onChange(produce(config, (draft) => void (draft.mappingRules = rules)))\n }\n\n function onPrefixChange(value: string) {\n onChange(\n produce(config, (draft) => {\n if (value) {\n draft.prefix = value\n } else {\n delete draft.prefix\n }\n })\n )\n }\n\n function onSuffixChange(value: string) {\n onChange(\n produce(config, (draft) => {\n if (value) {\n draft.suffix = value\n } else {\n delete draft.suffix\n }\n })\n )\n }\n\n function numberAddons(style: ValueStyleLike) {\n switch (style) {\n case 'None':\n return (\n <>\n <AddonLabel className=\"border border-l-0\">\n Fraction Digits\n </AddonLabel>\n <input\n disabled\n className=\"focus:border-primary-500 sm:text-ilabel min-w-20 border-main rounded-r-md border border-l-0 py-1\"\n value={''}\n />\n </>\n )\n case 'Percent':\n case 'Standard':\n return (\n <>\n <AddonLabel className=\"border border-x-0\">\n Fraction Digits\n </AddonLabel>\n <input\n type=\"number\"\n min={0}\n max={20}\n className=\"focus:border-primary-500 sm:text-ilabel min-w-20 border-main focus:ring-3 focus:ring-primary-600/30 hover:border-primary-600 rounded-r-md border py-1\"\n value={config.maxFractionDigits}\n placeholder={'0-20'}\n onChange={(e) =>\n onDigitsChange(e.target.value, 'maxFractionDigits')\n }\n />\n </>\n )\n case 'Currency':\n return (\n <>\n <AddonLabel className=\"border border-r-0\">Symbol</AddonLabel>\n <div className=\"w-28 \">\n <ComboInput\n onChange={onChangeSymbol}\n options={CurrencySymbols.map((s) => s.value)}\n displayFn={(s) => {\n const name = CurrencySymbols.find((c) => c.value === s)?.label\n return `${name} (${s})`\n }}\n placeholder={'$'}\n value={config?.currencySymbol}\n />\n </div>\n <AddonLabel className=\"border\">Precision</AddonLabel>\n <input\n type=\"number\"\n min={0}\n max={20}\n className=\"focus:border-primary-500 sm:text-ilabel min-w-20 border-main rounded-r-md border border-l-0 py-1\"\n value={config.precision}\n defaultValue={2}\n placeholder={'0-20'}\n onChange={(e) => onDigitsChange(e.target.value, 'precision')}\n />\n </>\n )\n default:\n return (\n <>\n <AddonLabel className=\"border border-x-0\">\n Max significant digits\n </AddonLabel>\n <input\n type=\"number\"\n min={1}\n max={21}\n className=\"focus:border-primary-600 sm:text-ilabel min-w-20 border-main hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 rounded-r-md border py-1\"\n value={config.maxSignificantDigits}\n placeholder={'1-21'}\n onChange={(e) =>\n onDigitsChange(e.target.value, 'maxSignificantDigits')\n }\n />\n </>\n )\n }\n }\n\n return (\n <>\n <div>\n <div className=\"flex\">\n <AddonLabel className=\"rounded-l-md border border-r-0\">\n Value formatter\n </AddonLabel>\n <select\n value={config.valueFormatter}\n className={classNames(\n 'sm:text-ilabel border-main text-text-foreground hover:border-primary-600 inline-flex items-center border py-1.5 pl-4 pr-7 focus:ring-0',\n config.valueFormatter == 'StringFormatter' ? 'rounded-r-md' : ''\n )}\n onChange={(e) =>\n onChangeFormatter(e.target.value as ValueFormatterLike)\n }\n >\n {formatters.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n {config.valueFormatter == 'NumberFormatter' && (\n <>\n <AddonLabel className=\"border border-l-0 border-r-0\">\n Style\n </AddonLabel>\n <select\n value={config.style}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 inline-flex items-center border py-1 pl-4 pr-7 focus:ring-0\"\n onChange={(e) =>\n onStyleChange(e.target.value as ValueStyleLike)\n }\n >\n <option value={'None'}>None</option>\n <option value={'Compact'}>Compact</option>\n <option value={'Standard'}>Standard</option>\n <option value={'Scientific'}>Scientific</option>\n <option value={'Percent'}>Percent</option>\n <option value={'Currency'}>Currency</option>\n </select>\n {config.style && numberAddons(config.style)}\n </>\n )}\n {config.valueFormatter == 'DateFormatter' && (\n <>\n <AddonLabel className=\"border border-l-0\">Date format</AddonLabel>\n <select\n value={config.dateFormat}\n className=\"sm:text-ilabel border-main text-text-foreground inline-flex items-center rounded-r-md border border-l-0 py-1 pl-4 pr-7\"\n onChange={(e) => onChangeDateFormat(e.target.value)}\n >\n {dateFormats.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n </>\n )}\n </div>\n </div>\n\n {/* Prefix and Suffix Configuration */}\n {(showPrefix || showSuffix) && (\n <div>\n <div className=\"mt-2 flex items-center gap-4\">\n {showPrefix && (\n <div className=\"border-main hover:border-primary-600 focus-within:border-primary-600 focus-within:ring-3 focus-within:ring-primary-500/30 text-icontent inline-flex items-center rounded-md border\">\n <div className=\"h-7.5 leading-7.5 border-r px-3\">Prefix</div>\n <input\n type=\"text\"\n className=\"border-0 px-3 py-1.5 focus:ring-0\"\n value={config.prefix || ''}\n placeholder=\"e.g., $, #\"\n onChange={(e) => onPrefixChange(e.target.value)}\n />\n </div>\n )}\n {showSuffix && (\n <div className=\"border-main hover:border-primary-600 focus-within:border-primary-600 focus-within:ring-3 focus-within:ring-primary-500/30 text-icontent inline-flex items-center rounded-md border\">\n <div className=\"h-7.5 leading-7.5 border-r px-3\">Suffix</div>\n <input\n type=\"text\"\n className=\"min-w-32 border-0 px-3 py-1.5 focus:ring-0\"\n value={config.suffix || ''}\n placeholder=\"e.g., %, USD, tokens\"\n onChange={(e) => onSuffixChange(e.target.value)}\n />\n </div>\n )}\n </div>\n </div>\n )}\n\n {config.valueFormatter == 'StringFormatter' && (\n <ValueStringMapping\n rules={config.mappingRules || []}\n onChange={onMappingRulesChange}\n />\n )}\n </>\n )\n}\n","import { LuPlus, LuTrash2 } from 'react-icons/lu'\nimport { Button, classNames } from '@sentio/ui-core'\nimport { produce } from 'immer'\nimport type { MappingRuleLike } from '../../types'\n\nconst operators = {\n '>': 'greater than',\n '>=': 'greater or equal',\n '==': 'equal',\n '!=': 'not equal',\n '<': 'less than',\n '<=': 'less or equal'\n}\n\ninterface Props {\n rules: MappingRuleLike[]\n onChange: (rules: MappingRuleLike[]) => void\n}\n\nconst renderTreeLine = (index: number, isLast: boolean) => {\n return (\n <div className=\"mr-2 flex w-3 flex-col items-center justify-center\">\n <div className=\"flex h-full w-full items-center\">\n <div\n className={classNames(\n 'w-px bg-gray-300',\n isLast\n ? 'h-1/2 self-start'\n : index === 0\n ? 'h-full self-end'\n : 'h-full'\n )}\n ></div>\n <div className=\"h-px w-3 bg-gray-300\"></div>\n </div>\n </div>\n )\n}\n\nexport function ValueStringMapping({ rules, onChange }: Props) {\n const addRule = () => {\n onChange(\n produce(rules, (draft) => {\n draft = draft || []\n draft.push({\n comparison: '==',\n value: 0,\n text: ''\n })\n })\n )\n }\n\n function removeRule(index: number) {\n onChange(\n produce(rules, (draft) => {\n draft.splice(index, 1)\n })\n )\n }\n\n function changeRule(index: number, field: string, value: any) {\n onChange(\n produce(rules, (draft) => {\n ;(draft[index] as Record<string, any>)[field] = value\n })\n )\n }\n\n return (\n <div className=\"flex w-full flex-col gap-2 rounded-md\">\n {(rules || []).map((rule, index) => {\n const isLast = index === (rules || []).length - 1\n return (\n <div\n key={index}\n className=\"text-text-foreground flex h-8 items-center\"\n >\n {renderTreeLine(index, isLast)}\n <span className=\"sm:text-ilabel inline-flex h-full items-center pr-2 font-medium\">\n If value is\n </span>\n <select\n value={rule.comparison}\n onChange={(e) => changeRule(index, 'comparison', e.target.value)}\n className=\"rounded-r-0 sm:text-ilabel border-main text-text-foreground focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 inline-flex h-full items-center rounded-l-md border border-r-0 bg-gray-50 py-1 pl-4 pr-7\"\n >\n {Object.entries(operators).map(([op, display]) => {\n return (\n <option key={op} value={op}>\n is {display}\n </option>\n )\n })}\n </select>\n <input\n type=\"text\"\n name=\"value\"\n id=\"value\"\n className=\"w-30 rounded-l-0 sm:text-ilabel border-main hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 block h-full rounded-r-md border px-2 py-1\"\n placeholder=\"0\"\n value={rule.value}\n onChange={(e) => {\n changeRule(index, 'value', e.target.value)\n }}\n />\n <span className=\"sm:text-ilabel inline-flex h-full items-center rounded-none px-2 font-medium\">\n , then show\n </span>\n <input\n type=\"text\"\n name=\"text\"\n id=\"text\"\n className=\"sm:text-ilabel border-main hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 block h-full w-80 rounded-md px-2 py-1\"\n placeholder=\"Display text (e.g. High, Low, Normal)\"\n value={rule.text}\n onChange={(e) => {\n changeRule(index, 'text', e.target.value)\n }}\n />\n {/* TODO: implement color mapping in data-grid component */}\n {/* <span className=\"sm:text-ilabel inline-flex h-full items-center rounded-none px-3 font-medium\">\n also set color\n </span>\n <span className=\"focus-within:ring-primary-500 rounded-md border border-main px-0.5 focus-within:border-transparent focus-within:ring-2\">\n <ColorSelect\n value={rule.colorTheme}\n onChange={(colorTheme) => {\n changeRule(index, 'colorTheme', colorTheme?.value)\n }}\n />\n </span>\n <div className=\"flex-1\"></div> */}\n <button\n type=\"button\"\n className=\"text-text-foreground-disabled hover:text-primary-600 mx-2 cursor-pointer\"\n aria-label=\"remove\"\n onClick={() => removeRule(index)}\n >\n <LuTrash2 className=\"icon\" aria-hidden=\"true\" />\n </button>\n </div>\n )\n })}\n <Button\n type=\"button\"\n role=\"secondary\"\n className=\"py-1.5! w-fit flex-none\"\n aria-label=\"remove\"\n onClick={addRule}\n icon={<LuPlus />}\n >\n Add Formatting Rule\n </Button>\n </div>\n )\n}\n","import { defaults } from 'lodash'\nimport { Checkbox, DisclosurePanel } from '@sentio/ui-core'\nimport { produce } from 'immer'\nimport {\n ValueFormatters,\n ValueOptions,\n type ValueFormatter\n} from './ValueOptions'\nimport type { ValueConfigLike } from '../../types'\n\ninterface Props {\n config?: ValueConfigLike\n defaultOpen?: boolean\n onChange: (config: ValueConfigLike) => void\n formatters?: ValueFormatter[]\n showPrefix?: boolean\n showSuffix?: boolean\n}\n\nexport const defaultConfig: ValueConfigLike = {\n valueFormatter: 'NumberFormatter',\n showValueLabel: false,\n maxSignificantDigits: 3,\n dateFormat: 'LLL',\n mappingRules: [],\n style: 'None',\n maxFractionDigits: 2\n}\n\nexport const ValueControls = ({\n config,\n defaultOpen,\n onChange,\n formatters = ValueFormatters,\n showPrefix,\n showSuffix\n}: Props) => {\n config = defaults(config || {}, defaultConfig)\n function toggleShowValueLabel(checked: boolean) {\n config &&\n onChange(\n produce(config, (draft) => void (draft.showValueLabel = checked))\n )\n }\n function toggleTooltipTotal(checked: boolean) {\n config &&\n onChange(produce(config, (draft) => void (draft.tooltipTotal = checked)))\n }\n return (\n <DisclosurePanel\n title=\"Value Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <ValueOptions\n onChange={onChange}\n config={config}\n formatters={formatters}\n showPrefix={showPrefix}\n showSuffix={showSuffix}\n />\n\n <div className=\"mt-2 flex items-center gap-2\">\n <Checkbox\n checked={config?.showValueLabel}\n onChange={toggleShowValueLabel}\n label=\"Show value label\"\n />\n <Checkbox\n checked={config?.tooltipTotal}\n onChange={toggleTooltipTotal}\n label=\"Show total in tooltip\"\n />\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport { LuMinus, LuPlus } from 'react-icons/lu'\nimport { Button, DisclosurePanel } from '@sentio/ui-core'\nimport type { MarkerLike } from '../../types'\n\ninterface Props {\n markers?: MarkerLike[]\n onChange: (v: MarkerLike[]) => void\n}\n\nconst labelCls =\n 'inline-flex items-center border border-r-0 sm:text-icontent border-main bg-gray-50 px-2 rounded-l-md'\nconst inputCls =\n 'border focus:border-primary-500 rounded-r-md sm:text-icontent border-main w-28 hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30'\n\nfunction MarkerInput({\n marker,\n label,\n onChange,\n onRemove\n}: {\n marker: MarkerLike\n label: string\n onChange: (v: MarkerLike) => void\n onRemove: () => void\n}) {\n const _onChange = (field: string, value: any) => {\n onChange(\n produce(marker, (draft) => {\n ;(draft as Record<string, any>)[field] = value\n })\n )\n }\n return (\n <div className=\"flex items-center gap-[10px]\">\n <label className=\"inline-flex h-8\">\n <span className={labelCls}>\n <span className=\"pr-2\">{label}</span>\n <select\n className=\"sm:text-ilabel border-main text-text-foreground inline-flex h-full items-center border border-b-0 border-t-0 bg-gray-50 p-0 pl-4 pr-7 focus:border-transparent focus:ring-inset\"\n value={marker.type}\n onChange={(e) => _onChange('type', e.target.value)}\n >\n <option value={'LINE'}>horizontal line</option>\n <option value={'LINEX'}>vertical line</option>\n </select>\n <span className=\"pl-2\">at</span>\n </span>\n {marker.type === 'LINEX' ? (\n <input\n className={inputCls}\n type=\"text\"\n value={marker.valueX}\n placeholder=\"YYYY-MM-DD\"\n onChange={(e) => _onChange('valueX', e.target.value)}\n />\n ) : (\n <input\n className={inputCls}\n type=\"text\"\n value={marker.value}\n onChange={(e) => _onChange('value', e.target.value)}\n />\n )}\n </label>\n <label className=\"inline-flex h-8\">\n <span className={labelCls}>Color</span>\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex w-8 items-center justify-center\">\n <div className=\"h-4 w-4\" style={{ background: marker.color }} />\n </div>\n <input\n className={inputCls + ' pl-8'}\n type=\"text\"\n value={marker.color}\n onChange={(e) => _onChange('color', e.target.value)}\n />\n </div>\n </label>\n <label className=\"inline-flex h-8\">\n <span className={labelCls}>Label</span>\n <input\n className={inputCls}\n type=\"text\"\n value={marker.label}\n onChange={(e) => _onChange('label', e.target.value)}\n />\n </label>\n <button\n type=\"button\"\n className=\"ml-2 flex h-4 w-4 cursor-pointer items-center justify-center rounded-full bg-gray-800 hover:bg-red-600\"\n aria-label=\"Remove marker\"\n onClick={onRemove}\n >\n <LuMinus\n className=\"dark:text-default-bg h-3 w-3 text-white\"\n aria-hidden=\"true\"\n />\n </button>\n </div>\n )\n}\n\nconst DEFAULT_MARKER: MarkerLike = { value: 0, color: '#ff0000', label: '' }\n\nexport function MarkerControls({ markers, onChange }: Props) {\n const _markers = markers?.length ? markers : []\n\n const onAdd = () => {\n onChange(\n produce(_markers, (draft) => {\n draft.push(DEFAULT_MARKER)\n })\n )\n }\n\n const onRemove = (index: number) => {\n onChange(\n produce(_markers, (draft) => {\n draft.splice(index, 1)\n })\n )\n }\n\n const _onChange = (index: number, marker: MarkerLike) => {\n onChange(\n produce(_markers, (draft) => {\n draft[index] = marker\n })\n )\n }\n\n return (\n <DisclosurePanel\n title=\"Markers\"\n containerClassName=\"w-full bg-default-bg\"\n defaultOpen={true}\n >\n <div className=\"space-y-2\">\n {_markers.map((marker, index) => (\n <MarkerInput\n marker={marker}\n key={index}\n label={String.fromCharCode(65 + (index % 26))}\n onChange={(v) => _onChange(index, v)}\n onRemove={() => onRemove(index)}\n />\n ))}\n <div>\n <Button type=\"button\" onClick={onAdd}>\n <LuPlus className=\"h-4 w-4\" aria-hidden=\"true\" />\n Add Marker\n </Button>\n </div>\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport { defaults } from 'lodash'\nimport { DisclosurePanel } from '@sentio/ui-core'\nimport { AddonLabel } from './controls-ui'\nimport type { ChartConfigLike, DataConfigLike } from '../../types'\n\ninterface Props {\n defaultOpen?: boolean\n onChange: (config: DataConfigLike) => void\n chartConfig?: ChartConfigLike\n /** Per-chart-type fallback when no explicit limit is set (app resolves from ChartTypeLimits). */\n defaultSeriesLimit?: number\n}\n\nexport const defaultConfig: DataConfigLike = {\n seriesLimit: undefined\n}\n\nexport function DataControls({\n defaultOpen,\n onChange,\n chartConfig,\n defaultSeriesLimit = 20\n}: Props) {\n const config = defaults(chartConfig?.dataConfig, defaultConfig)\n\n // migrate tableConfig.rowLimit to dataConfig.seriesLimit\n const currentSeriesLimit =\n config?.seriesLimit || chartConfig?.tableConfig?.rowLimit\n\n function onSeriesLimitChange(e: React.ChangeEvent<HTMLInputElement>) {\n const value = parseInt(e.target.value)\n if (value > 1000) {\n return\n }\n config &&\n onChange(\n produce(config, (draft) => {\n draft.seriesLimit = value\n })\n )\n }\n\n function onKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n // Prevent non-numeric character input (except for delete, backspace, arrow keys, etc.)\n if (\n !/[0-9]/.test(e.key) &&\n !['Backspace', 'Delete', 'ArrowLeft', 'ArrowRight', 'Tab'].includes(e.key)\n ) {\n e.preventDefault()\n }\n }\n\n return (\n <DisclosurePanel\n title=\"Data Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-3\">\n Max Series Limit\n </AddonLabel>\n <input\n type=\"number\"\n max={1000}\n min={20}\n className=\"text-icontent border-main hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 mr-1 w-32 rounded-r-md\"\n value={currentSeriesLimit ?? defaultSeriesLimit}\n onChange={onSeriesLimitChange}\n onKeyDown={onKeyDown}\n />\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport { defaults } from 'lodash'\nimport { useCallback, type ReactNode } from 'react'\nimport { DisclosurePanel } from '@sentio/ui-core'\nimport { AddonLabel } from './controls-ui'\nimport type { ScatterConfigLike } from '../../types'\n\ninterface Props {\n config?: ScatterConfigLike\n defaultOpen?: boolean\n onChange: (config: ScatterConfigLike) => void\n /** App-supplied sql column picker (Size By Column). */\n columnSelect?: (props: {\n value?: string\n onChange: (col: string) => void\n }) => ReactNode\n /** App-supplied color picker (Size Color Mapping). */\n colorPicker?: (props: {\n value?: string\n onChange: (color?: string) => void\n }) => ReactNode\n}\n\nexport const defaultConfig: ScatterConfigLike = {\n minSize: 5,\n maxSize: 30\n}\n\nexport function ScatterControls({\n config,\n defaultOpen,\n onChange,\n columnSelect,\n colorPicker\n}: Props) {\n config = defaults(config, defaultConfig)\n\n const onSymbolSizeColumnChange = useCallback(\n (column: string) => {\n config &&\n onChange(produce(config, (draft) => void (draft.symbolSize = column)))\n },\n [config, onChange]\n )\n\n const onSymbolColorChange = useCallback(\n (color?: string) => {\n config && onChange(produce(config, (draft) => void (draft.color = color)))\n },\n [config, onChange]\n )\n\n const onMinSizeChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseInt(event.target.value) || 5\n config &&\n onChange(produce(config, (draft) => void (draft.minSize = value)))\n },\n [config, onChange]\n )\n\n const onMaxSizeChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseInt(event.target.value) || 50\n config &&\n onChange(produce(config, (draft) => void (draft.maxSize = value)))\n },\n [config, onChange]\n )\n\n return (\n <DisclosurePanel\n title=\"Scatter Chart Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex items-center gap-4\">\n {columnSelect && (\n <div className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Size By Column\n </AddonLabel>\n {columnSelect({\n value: config.symbolSize,\n onChange: onSymbolSizeColumnChange\n })}\n </div>\n )}\n {colorPicker && (\n <div className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Size Color Mapping\n </AddonLabel>\n {colorPicker({\n value: config.color,\n onChange: onSymbolColorChange\n })}\n </div>\n )}\n <div className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Min Size\n </AddonLabel>\n <input\n name=\"minSize\"\n type=\"number\"\n className=\"focus:ring-primary-600/30 focus:border-primary-600 border-main text-icontent focus:ring-3 h-8 w-24 rounded-r-md border px-2\"\n value={config.minSize || 5}\n onChange={onMinSizeChange}\n min=\"1\"\n max=\"60\"\n />\n </div>\n <div className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Max Size\n </AddonLabel>\n <input\n name=\"maxSize\"\n type=\"number\"\n className=\"focus:ring-primary-600/30 focus:border-primary-600 border-main focus:ring-3 h-8 w-24 rounded-r-md border px-2 text-sm\"\n value={config.maxSize || 30}\n onChange={onMaxSizeChange}\n min=\"1\"\n max=\"60\"\n />\n </div>\n </div>\n </DisclosurePanel>\n )\n}\n","import { useMemo } from 'react'\nimport { produce } from 'immer'\nimport { defaults } from 'lodash'\nimport { Checkbox, DisclosurePanel, classNames } from '@sentio/ui-core'\nimport type {\n CalculationLike,\n ColumnTypeLike,\n TableConfigLike,\n TableDataLike,\n ValueConfigLike\n} from '../../types'\nimport { getColumnNameId } from '../table-utils'\nimport { ValueOptions } from './ValueOptions'\nimport { defaultConfig as defaultValueConfig } from './ValueControls'\n\ninterface Props {\n config?: TableConfigLike\n defaultOpen?: boolean\n onChange: (config: TableConfigLike) => void\n data?: TableDataLike\n}\n\nexport const defaultConfig: TableConfigLike = {\n calculation: 'LAST',\n sortColumns: [],\n showColumns: undefined,\n columnWidths: {},\n columnOrders: [],\n showPlainData: false,\n calculations: {},\n valueConfigs: {}\n}\n\nexport function getDefaultValueConfig(type?: ColumnTypeLike): ValueConfigLike {\n switch (type) {\n case 'NUMBER':\n return {\n ...defaultValueConfig,\n valueFormatter: 'NumberFormatter'\n }\n case 'TIME':\n return {\n ...defaultValueConfig,\n valueFormatter: 'DateFormatter'\n }\n default:\n return {\n ...defaultValueConfig,\n valueFormatter: 'StringFormatter'\n }\n }\n}\n\nconst CalculationItems = [\n { label: 'All', value: 'ALL' },\n { label: 'Last', value: 'LAST' },\n { label: 'First', value: 'FIRST' },\n { label: 'Total', value: 'TOTAL' },\n { label: 'Mean', value: 'MEAN' },\n { label: 'Max', value: 'MAX' },\n { label: 'Min', value: 'MIN' }\n]\n\nexport function TableControls({ config, defaultOpen, onChange, data }: Props) {\n config = defaults({}, config, defaultConfig)\n\n function onCalculationChange(col: string, cal: CalculationLike) {\n config &&\n onChange(\n produce(config, (draft) => {\n if (col === '') {\n delete draft.calculations\n draft.calculation = cal\n } else {\n draft.calculations = draft.calculations || {}\n draft.calculations[col] = cal\n }\n })\n )\n }\n\n function onValueConfigChange(col: string, valueConfig: ValueConfigLike) {\n config &&\n onChange(\n produce(config, (draft) => {\n draft.valueConfigs = draft.valueConfigs || {}\n draft.valueConfigs[col] = valueConfig\n })\n )\n }\n\n function onMapSeriesAsColumnsChange(checked: boolean) {\n config &&\n onChange(produce(config, (draft) => void (draft.showPlainData = checked)))\n }\n\n const calculations = useMemo(() => {\n if (!config?.showPlainData) {\n return CalculationItems.filter((item) => item.value !== 'ALL')\n }\n return CalculationItems\n }, [config?.showPlainData])\n\n const isSql = data?.result !== undefined\n\n const columns = useMemo(() => {\n if (config?.showPlainData) {\n return []\n }\n const map: { [k: string]: { name: string; type?: ColumnTypeLike } } = {}\n\n if (isSql) {\n const results = data?.result\n if (results) {\n for (const [name, type] of Object.entries(results?.columnTypes || {})) {\n map[name] = {\n name,\n type\n }\n }\n }\n } else {\n const results = data?.results\n for (const r of results || []) {\n for (const s of r?.matrix?.samples || []) {\n const { columnId, columnName } = getColumnNameId(\n s?.metric?.labels || {},\n r.alias,\n s.metric?.displayName\n )\n map[columnId] = {\n name: columnName\n }\n }\n }\n }\n return Object.keys(map)\n .sort()\n .map((k) => ({ columnId: k, column: map[k] }))\n }, [data, config])\n\n return (\n <DisclosurePanel\n title=\"Table Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n {!isSql && (\n <div className=\"min-h-8 flex items-center\">\n <div className=\"w-48 px-2\">\n <Checkbox\n checked={config?.showPlainData}\n onChange={onMapSeriesAsColumnsChange}\n label=\"Show plain data\"\n />\n </div>\n {config?.showPlainData && (\n <div className=\"flex\">\n <span className=\"border-main sm:text-icontent inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-3\">\n Calculation\n </span>\n <select\n value={config.calculation}\n className=\"border-main text-text-foreground sm:text-icontent focus:border-primary-600 hover:border-primary-600 inline-flex items-center rounded-r-md border pl-4 pr-7 focus:ring-0\"\n onChange={(e) => {\n onCalculationChange('', e.target.value as CalculationLike)\n }}\n >\n {calculations.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n </div>\n )}\n <div></div>\n </div>\n )}\n\n <div className=\"divide-border-color flex flex-col gap-2 divide-y\">\n {columns.map(({ columnId, column }) => (\n <div className=\"flex items-start pb-2\" key={columnId}>\n <h4 className=\"text-text-foreground text-icontent leading-7.5 w-48 px-2 font-medium\">\n {column.name}\n </h4>\n <div className=\"flex flex-1 flex-wrap items-start gap-2 rounded-md\">\n {!isSql && (\n <div className=\"flex\">\n <span className=\"sm:text-ilabel border-main inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-3\">\n Calculation\n </span>\n <select\n value={\n (config?.calculations &&\n config?.calculations[columnId]) ||\n 'LAST'\n }\n className=\"border-main text-text-foreground sm:text-icontent focus:border-primary-600 hover:border-primary-600 inline-flex items-center rounded-r-md border pl-4 pr-7 focus:ring-0\"\n onChange={(e) =>\n onCalculationChange(\n columnId,\n e.target.value as CalculationLike\n )\n }\n >\n {calculations.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n </div>\n )}\n <ValueOptions\n onChange={(cfg) => onValueConfigChange(columnId, cfg)}\n config={\n (config?.valueConfigs && config.valueConfigs[columnId]) ||\n getDefaultValueConfig(column.type)\n }\n />\n </div>\n </div>\n ))}\n </div>\n </DisclosurePanel>\n )\n}\n","import { startCase } from 'lodash'\n\n// Curly-brace template token, e.g. \"{{ method }}\".\nconst TEMPLATE_TOKEN = /{{([\\s\\S]+?)}}/g\n\n// Map a few proto label keys to friendlier template names, preserving the\n// originals too. Pure — no proto / worker deps.\nexport function sanitizeLabels(labels: { [k: string]: string }): {\n [k: string]: string\n} {\n const result: { [k: string]: string } = {}\n for (const k in labels) {\n switch (k) {\n case 'contract_name':\n result['contract'] = labels[k]\n break\n case 'contract_address':\n result['address'] = labels[k]\n break\n }\n result[k] = labels[k]\n }\n return result\n}\n\n// Resolve a `{{token}}` alias against a series' labels. Returns undefined when\n// no alias is given so callers can fall back to a display name.\nexport function aliasTemplate(\n alias: string | undefined | null,\n labels: { [k: string]: string }\n): string | undefined {\n if (alias) {\n try {\n const safe = sanitizeLabels(labels)\n return alias.replace(TEMPLATE_TOKEN, (_, m1) => {\n const value = safe[m1.trim()]\n return value == null ? `` : value\n })\n } catch (e) {\n return alias\n }\n }\n}\n\nfunction escapeColumnId(id: string): string {\n return id.replace(/[\\W_.]+/g, '_')\n}\n\n// Derive a stable column id + human-readable name for a metrics series from\n// its alias template (or display name fallback) and labels.\nexport function getColumnNameId(\n labels: { [p: string]: string },\n alias?: string,\n displayName?: string\n): { columnName: string; columnId: string } {\n const s = aliasTemplate(alias, labels) || startCase(displayName)\n return { columnName: s, columnId: escapeColumnId(s) }\n}\n","import { useState, useRef, useCallback, useEffect, useMemo } from 'react'\nimport { BaseDialog } from '@sentio/ui-core'\nimport type { DashboardLike } from '../types/dashboard'\n\ninterface Props {\n dashboard?: DashboardLike\n open: boolean\n onClose: () => void\n onUpdate: (data: DashboardLike) => Promise<void>\n}\n\nexport const EditDashboardDialog = ({\n dashboard,\n open,\n onClose,\n onUpdate\n}: Props) => {\n const [processing, setProcessing] = useState(false)\n const [updateDisabled, setUpdateDisabled] = useState(true)\n const inputElementRef = useRef<HTMLInputElement | null>(null)\n\n const onCloseAndReset = useCallback(() => {\n onClose?.()\n if (dashboard?.name && inputElementRef.current) {\n inputElementRef.current.value = dashboard.name\n }\n }, [onClose, dashboard?.name])\n\n const onOk = useCallback(() => {\n if (!inputElementRef.current?.value) {\n return\n }\n setProcessing(true)\n onUpdate({ ...dashboard, name: inputElementRef.current?.value })\n .then(() => {\n onCloseAndReset()\n })\n .finally(() => {\n setProcessing(false)\n })\n }, [onCloseAndReset, onUpdate, dashboard])\n\n useEffect(() => {\n if (open && dashboard?.name && inputElementRef.current) {\n inputElementRef.current.value = dashboard.name\n }\n }, [open, dashboard?.name])\n\n const onInputChange = useCallback(\n (evt: React.ChangeEvent<HTMLInputElement>) => {\n const value = evt.target.value\n if (!value || value === dashboard?.name) {\n setUpdateDisabled(true)\n } else {\n setUpdateDisabled(false)\n }\n },\n [dashboard?.name]\n )\n\n const okProps = useMemo(\n () => ({\n processing,\n disabled: updateDisabled\n }),\n [updateDisabled, processing]\n )\n\n return (\n <BaseDialog\n title=\"Edit Dashboard\"\n open={open}\n onClose={onCloseAndReset}\n cancelText=\"Close\"\n onCancel={onCloseAndReset}\n onOk={onOk}\n okProps={okProps}\n okText=\"Update\"\n footerBorder={false}\n initialFocus={inputElementRef}\n >\n <form\n method=\"dialog\"\n className=\"text-text-foreground relative mb-4 mt-2 px-4\"\n onSubmit={onOk}\n >\n <div className=\"grid py-2 text-sm\">\n <div className=\"sm:text-ilabel text-text-foreground-secondary mb-2 mt-1\">\n Dashboard Name\n </div>\n <input\n defaultValue={dashboard?.name}\n placeholder=\"Provide a new name for your dashboard\"\n type=\"text\"\n required={true}\n name=\"dashboard-name\"\n id=\"new-dashboard-name\"\n className=\"focus:border-primary-600 focus:ring-primary-600/30 focus:ring-3 hover:border-primary-600 sm:text-ilabel border-main block w-full rounded-md\"\n ref={inputElementRef}\n onChange={onInputChange}\n />\n </div>\n </form>\n </BaseDialog>\n )\n}\n","import { useEffect, useMemo, useRef, useState } from 'react'\nimport { BaseDialog, Select, classNames } from '@sentio/ui-core'\nimport { LuCheck } from 'react-icons/lu'\nimport type { GroupStyleLike } from '../types/enums'\nimport { useDarkMode } from '../utils/use-dark-mode'\nimport {\n DEFAULT_HIGHLIGHT_KEY,\n HIGHLIGHT_COLORS,\n resolveHighlight\n} from './group-styles'\n\ninterface Props {\n open: boolean\n onClose: () => void\n // Existing values; the dialog seeds its draft state from them whenever it\n // opens, so cancelling discards unsaved edits.\n title: string\n style: GroupStyleLike\n highlightColor: string\n onSave: (next: {\n title: string\n style: GroupStyleLike\n highlightColor: string\n }) => void\n}\n\ninterface StyleCardProps {\n selected: boolean\n label: string\n onClick: () => void\n preview: React.ReactNode\n}\n\nfunction StyleCard({ selected, label, onClick, preview }: StyleCardProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={classNames(\n 'flex flex-col items-stretch overflow-hidden rounded-lg border text-left transition-colors',\n selected\n ? 'border-primary-600 ring-primary-600/30 ring-3 shadow-sm'\n : 'border-main hover:border-primary-400'\n )}\n >\n <div className=\"bg-hover/40 flex h-28 items-center justify-center\">\n {preview}\n </div>\n <div\n className={classNames(\n 'border-main flex items-center justify-center gap-1.5 border-t px-2 py-2 text-sm',\n selected\n ? 'text-primary-600 font-semibold'\n : 'text-text-foreground font-medium'\n )}\n >\n {selected && <LuCheck className=\"h-3.5 w-3.5\" />}\n {label}\n </div>\n </button>\n )\n}\n\n// Mini-previews — render the same visual treatment that resolveHeaderStyle\n// applies on the real GroupPanel, so the card always matches the live result.\nfunction DefaultPreview() {\n return (\n <div className=\"border-main bg-default-bg text-text-foreground flex h-16 w-32 items-center rounded border px-2 text-base\">\n Title\n </div>\n )\n}\n\nfunction EmphasisPreview({\n color\n}: {\n color: { solid: string; foreground: string }\n}) {\n return (\n <div className=\"border-main bg-default-bg flex h-16 w-32 flex-col rounded border\">\n <div\n className=\"flex h-9 items-center justify-center text-sm font-semibold\"\n style={{ backgroundColor: color.solid, color: color.foreground }}\n >\n Title\n </div>\n <div className=\"flex-1\" />\n </div>\n )\n}\n\nexport function EditGroupDialog({\n open,\n onClose,\n title,\n style,\n highlightColor,\n onSave\n}: Props) {\n const [draftTitle, setDraftTitle] = useState(title)\n const [draftStyle, setDraftStyle] = useState<GroupStyleLike>(style)\n const [draftColor, setDraftColor] = useState<string>(highlightColor)\n const titleRef = useRef<HTMLInputElement | null>(null)\n const isDark = useDarkMode()\n\n // Re-seed every time the dialog opens so cancelling leaves no residue.\n useEffect(() => {\n if (!open) return\n setDraftTitle(title)\n setDraftStyle(style || 'DEFAULT')\n // If the user is opening a styled group that never had a color set, seed\n // with the default so the preview isn't blank.\n setDraftColor(\n highlightColor ||\n (style && style !== 'DEFAULT' ? DEFAULT_HIGHLIGHT_KEY : '')\n )\n }, [open, title, style, highlightColor])\n\n const previewColor = useMemo(\n () => resolveHighlight(draftColor, isDark),\n [draftColor, isDark]\n )\n\n const onPickStyle = (next: GroupStyleLike) => {\n setDraftStyle(next)\n // Auto-seed a default color when moving into a styled mode for the first\n // time — otherwise the preview shows a blank tint.\n if (next !== 'DEFAULT' && !draftColor) {\n setDraftColor(DEFAULT_HIGHLIGHT_KEY)\n }\n }\n\n const onOk = () => {\n onSave({\n title: draftTitle.trim() || 'Group',\n style: draftStyle,\n // Persist '' for DEFAULT so we don't pollute the model with an unused\n // color when the user reverts.\n highlightColor:\n draftStyle === 'DEFAULT' ? '' : draftColor || DEFAULT_HIGHLIGHT_KEY\n })\n onClose()\n }\n\n const colorOptions = useMemo(\n () =>\n HIGHLIGHT_COLORS.map((c) => {\n const resolved = resolveHighlight(c.key, isDark)\n return {\n value: c.key,\n title: c.name,\n label: ({ selected }: { selected?: boolean }) => (\n <div className=\"flex w-full items-center gap-2.5 pr-2\">\n <div\n className=\"flex h-5 w-5 items-center justify-center rounded text-xs font-bold\"\n style={{\n backgroundColor: resolved.solid,\n color: resolved.foreground\n }}\n >\n T\n </div>\n <span className=\"flex-1 text-sm\">{c.name}</span>\n {selected && <LuCheck className=\"text-primary-600 h-4 w-4\" />}\n </div>\n )\n }\n }),\n [isDark]\n )\n\n return (\n <BaseDialog\n title=\"Edit Group\"\n open={open}\n onClose={onClose}\n cancelText=\"Cancel\"\n onCancel={onClose}\n onOk={onOk}\n okText=\"Save\"\n panelClassName=\"sm:max-w-xl\"\n initialFocus={titleRef}\n >\n <div className=\"text-text-foreground px-4 pb-2 pt-4\">\n <h4 className=\"text-text-foreground mb-3 text-sm font-semibold\">\n Display options\n </h4>\n\n <label className=\"text-text-foreground-secondary text-ilabel mb-1 block\">\n Title\n </label>\n <input\n ref={titleRef}\n type=\"text\"\n value={draftTitle}\n onChange={(e) => setDraftTitle(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n onOk()\n }\n }}\n className=\"focus:border-primary-600 focus:ring-primary-600/30 focus:ring-3 hover:border-primary-600 sm:text-ilabel border-main mb-4 block w-full rounded-md\"\n />\n\n <div className=\"mb-4 grid grid-cols-2 gap-3\">\n <StyleCard\n selected={draftStyle === 'DEFAULT'}\n label=\"Default\"\n onClick={() => onPickStyle('DEFAULT')}\n preview={<DefaultPreview />}\n />\n <StyleCard\n selected={draftStyle === 'EMPHASIS'}\n label=\"Emphasis\"\n onClick={() => onPickStyle('EMPHASIS')}\n preview={<EmphasisPreview color={previewColor} />}\n />\n </div>\n\n {draftStyle !== 'DEFAULT' && (\n <>\n <label className=\"text-text-foreground-secondary text-ilabel mb-1 block\">\n Highlight Color\n </label>\n <Select\n value={draftColor || DEFAULT_HIGHLIGHT_KEY}\n onChange={(v) => setDraftColor(v as string)}\n options={colorOptions}\n size=\"md\"\n asLayer\n />\n </>\n )}\n </div>\n </BaseDialog>\n )\n}\n","import type { GroupStyleLike } from '../types/enums'\nimport { sentioColors } from '../charts/theme/sentio-colors'\n\n// Curated palette for the Group header highlight. Keys are persisted on the\n// Panel as `highlight_color`; the visual color is resolved from the shared\n// `sentioColors.classic` palette so groups always track the chart palette.\nexport type HighlightColorKey =\n | ''\n | 'blue'\n | 'cyan'\n | 'pink'\n | 'yellow'\n | 'green'\n | 'lightblue'\n | 'purple'\n | 'red'\n | 'orange'\n\n// Each highlight key maps to an INDEX into sentioColors.{light,dark}.classic\n// so EMPHASIS picks up the theme-appropriate hue automatically.\n// classic[0]=blue 1=cyan 2=pink 3=yellow 4=green 5=lightblue 6=purple 7=red 8=orange\nconst CLASSIC_INDEX: Record<Exclude<HighlightColorKey, ''>, number> = {\n blue: 0,\n cyan: 1,\n pink: 2,\n yellow: 3,\n green: 4,\n lightblue: 5,\n purple: 6,\n red: 7,\n orange: 8\n}\n\nexport interface HighlightColorMeta {\n key: Exclude<HighlightColorKey, ''>\n name: string\n}\n\nexport const HIGHLIGHT_COLORS: HighlightColorMeta[] = [\n { key: 'green', name: 'Sentio Green' },\n { key: 'blue', name: 'Sentio Blue' },\n { key: 'cyan', name: 'Sentio Cyan' },\n { key: 'lightblue', name: 'Sentio Light Blue' },\n { key: 'purple', name: 'Sentio Purple' },\n { key: 'pink', name: 'Sentio Pink' },\n { key: 'red', name: 'Sentio Red' },\n { key: 'orange', name: 'Sentio Orange' },\n { key: 'yellow', name: 'Sentio Yellow' }\n]\n\n// Default key used when the user picks EMPHASIS without choosing a color yet —\n// keeps the preview from rendering an invisible white bar.\nexport const DEFAULT_HIGHLIGHT_KEY: Exclude<HighlightColorKey, ''> = 'green'\n\n// Resolve the base CSS color (hex) for a highlight key + theme. Returns\n// undefined for an unknown key so callers can fall back to the default.\nexport function getHighlightHex(\n key: string | undefined,\n isDark: boolean\n): string | undefined {\n if (!key) return undefined\n const idx = CLASSIC_INDEX[key as Exclude<HighlightColorKey, ''>]\n if (idx === undefined) return undefined\n return sentioColors[isDark ? 'dark' : 'light'].classic[idx]\n}\n\n// Compute a readable foreground (#000 or #fff) for a given hex bg using the\n// W3C relative-luminance formula. Avoids hardcoding a per-color text color so\n// the palette can change without re-tuning contrast.\nfunction readableForeground(hex: string): string {\n const m = hex.replace('#', '')\n const r = parseInt(m.slice(0, 2), 16) / 255\n const g = parseInt(m.slice(2, 4), 16) / 255\n const b = parseInt(m.slice(4, 6), 16) / 255\n const lin = (v: number) =>\n v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4)\n const L = 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b)\n return L > 0.5 ? '#1f2937' : '#ffffff'\n}\n\nexport interface ResolvedHighlight {\n solid: string\n foreground: string\n}\n\nexport function resolveHighlight(\n colorKey: string | undefined,\n isDark: boolean\n): ResolvedHighlight {\n const hex =\n getHighlightHex(colorKey, isDark) ??\n getHighlightHex(DEFAULT_HIGHLIGHT_KEY, isDark)!\n return { solid: hex, foreground: readableForeground(hex) }\n}\n\n// Resolve the CSS styles to apply to the GroupPanel HEADER row based on the\n// configured style + color + theme. Returns an empty object for DEFAULT.\nexport function resolveHeaderStyle(\n style: GroupStyleLike | undefined,\n colorKey: string | undefined,\n isDark: boolean\n): React.CSSProperties {\n if (!style || style === 'DEFAULT') return {}\n const color = resolveHighlight(colorKey, isDark)\n return { backgroundColor: color.solid, color: color.foreground }\n}\n","import dayjs from 'dayjs'\nimport relativeTime from 'dayjs/plugin/relativeTime'\nimport updateLocale from 'dayjs/plugin/updateLocale'\nimport { classNames } from '@sentio/ui-core'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { IoMdRefresh } from 'react-icons/io'\nimport dayjsEn from 'dayjs/locale/en'\nimport type { ComputeStatsLike } from '../types/dashboard'\n\ndayjs.extend(relativeTime)\ndayjs.extend(updateLocale)\n\ndayjs.locale('en.short', {\n ...dayjsEn,\n relativeTime: {\n // relative time format strings, keep %s %d as the same\n future: 'in %s',\n past: '%s ago',\n s: '<1s',\n m: '1min',\n mm: '%dmin',\n h: '1h',\n hh: '%dh',\n d: '1d',\n dd: '%dd',\n M: '1m',\n MM: '%dm',\n y: '1y',\n yy: '%dy'\n }\n})\ndayjs.locale('en')\n\ninterface Props {\n stats?: ComputeStatsLike\n onRefresh: () => Promise<void>\n}\n\nenum COLORS {\n WARNNING = 'text-[#D98200] border-[#D98200] border',\n NORMAL = 'text-[#4CAF1D] border-[#4CAF1D] border'\n}\n\nexport const DashboardRefresh = ({ stats, onRefresh }: Props) => {\n const timeRef = useRef<HTMLSpanElement>(null)\n const [fetching, setFetching] = useState(false)\n const [currentColor, setCurrentColor] = useState<COLORS>(COLORS.NORMAL)\n useEffect(() => {\n const updateFn = () => {\n if (!stats || !stats.computedAt) return\n const computedAt = dayjs(stats.computedAt).locale('en.short')\n timeRef.current!.textContent = computedAt.fromNow(true)\n if (computedAt.isBefore(dayjs().subtract(1, 'hour'))) {\n setCurrentColor(COLORS.WARNNING)\n } else {\n setCurrentColor(COLORS.NORMAL)\n }\n }\n updateFn()\n const interval = setInterval(() => {\n updateFn()\n }, 1000)\n return () => {\n clearInterval(interval)\n }\n }, [stats])\n\n const onClick = useCallback(() => {\n setFetching((prevState) => {\n if (prevState) return prevState\n onRefresh().finally(() => {\n setFetching(false)\n })\n return true\n })\n }, [onRefresh])\n\n useEffect(() => {\n if (typeof window == 'object') {\n window.addEventListener('refresh_all', onClick)\n return () => {\n window.removeEventListener('refresh_all', onClick)\n }\n }\n }, [])\n\n const showReload = fetching || stats?.isRefreshing\n return (\n <div\n className={classNames(\n 'group/refresh relative ml-1 flex items-center gap-1 rounded-sm py-px pl-1 text-xs transition-all',\n currentColor,\n showReload ? 'pr-5' : 'pr-1.5 hover:pr-5'\n )}\n >\n <span className=\"cursor-default text-[10px]\" ref={timeRef} />\n <button\n onClick={onClick}\n className={classNames(\n 'absolute right-1',\n showReload ? 'block' : 'hidden group-hover/refresh:block'\n )}\n >\n <IoMdRefresh\n className={classNames(\n 'h-3.5 w-3.5',\n showReload ? 'animate-spin' : ''\n )}\n />\n </button>\n </div>\n )\n}\n","import { useMemo, useState } from 'react'\nimport {\n BaseDialog,\n CopyButton,\n Checkbox,\n dateTimeToString\n} from '@sentio/ui-core'\nimport type { DateTimeValue } from '@sentio/ui-core'\nimport type {\n DashboardSharingLike,\n SharingConfigLike\n} from '../types/dashboard'\n\ninterface Props {\n open: boolean\n initData?: DashboardSharingLike\n onUnshare?: () => void\n onClose: () => void\n onConfigChange?: (config: SharingConfigLike) => void\n startTime?: DateTimeValue\n endTime?: DateTimeValue\n tz?: string\n}\n\nexport const ShareDashboardDialog = ({\n open,\n initData,\n onUnshare,\n onClose,\n onConfigChange,\n startTime,\n endTime,\n tz\n}: Props) => {\n const [isReadonly, setIsReadonly] = useState(\n initData?.config?.isReadonly ?? false\n )\n const [hideModifiers, setHideModifiers] = useState(\n initData?.config?.hideModifiers ?? false\n )\n\n const linkText = useMemo(() => {\n if (initData?.id) {\n let timeSuffix =\n startTime && endTime\n ? `?from=${encodeURIComponent(dateTimeToString(startTime))}&to=${encodeURIComponent(dateTimeToString(endTime))}&tz=${tz}`\n : ''\n if (tz) {\n timeSuffix += `&tz=${tz}`\n }\n return `${location.origin}/share/${initData?.id}${timeSuffix}`\n }\n return ''\n }, [initData?.id, startTime, endTime])\n\n const handleConfigChange = (\n newIsReadonly: boolean,\n newHideModifiers: boolean\n ) => {\n const config: SharingConfigLike = {\n isReadonly: newIsReadonly,\n hideModifiers: newHideModifiers\n }\n onConfigChange?.(config)\n }\n\n const handleReadonlyChange = (checked: boolean) => {\n setIsReadonly(checked)\n handleConfigChange(checked, hideModifiers)\n }\n\n const handleHideModifiersChange = (checked: boolean) => {\n setHideModifiers(checked)\n handleConfigChange(isReadonly, checked)\n }\n\n return (\n <BaseDialog\n title=\"Sharing: ON\"\n open={open}\n onCancel={() => {\n onUnshare?.()\n onClose()\n }}\n cancelText=\"Revoke URL\"\n cancelProps={{\n status: 'danger'\n }}\n okText=\"Done\"\n onOk={() => {\n onClose()\n }}\n onClose={onClose}\n buttonsClassName=\"justify-between\"\n footerBorder={false}\n >\n <div className=\"mx-4 my-4\">\n <div className=\"flex overflow-hidden rounded-md border pl-3\">\n <span className=\"text-ilabel font-ilabel text-text-foreground flex-1 grow truncate leading-8\">\n {linkText}\n </span>\n <div className=\"group cursor-pointer border-l bg-gray-200 px-2 py-1 hover:bg-gray-100\">\n <CopyButton\n text={linkText}\n size={18}\n className=\"text-text-foreground group-hover:text-primary h-4 w-4 align-middle\"\n />\n </div>\n </div>\n <div className=\"text-text-foreground-secondary mt-2 text-[11px]\">\n Anyone with the link can access this dashboard. You can revoke the\n link at any time.\n </div>\n\n {/* Sharing Configuration Options */}\n <div className=\"mt-4 space-y-3 border-t pt-4\">\n <div className=\"text-text-foreground text-sm font-medium\">\n Access Settings\n </div>\n\n <div className=\"space-y-4\">\n <div>\n <Checkbox\n checked={isReadonly}\n onChange={handleReadonlyChange}\n label=\"Panel read-only access\"\n />\n <div className=\"text-text-foreground-secondary ml-6 text-xs\">\n Viewers can only view the dashboard without entering panel edit\n mode or copy configuration.\n </div>\n </div>\n\n <div>\n <Checkbox\n checked={hideModifiers}\n onChange={handleHideModifiersChange}\n label=\"Hide controls\"\n />\n <div className=\"text-text-foreground-secondary ml-6 text-xs\">\n Hide panel creator and modifier for viewers\n </div>\n </div>\n </div>\n </div>\n </div>\n </BaseDialog>\n )\n}\n","import { defaults } from 'lodash'\nimport { produce } from 'immer'\nimport { Switch, TimeRangePicker } from '@sentio/ui-core'\nimport type { DateTimeValue } from '@sentio/ui-core'\nimport type { TimeRangeOverrideLike } from '../types/chart'\nimport { fromTimeLike, toTimeLike } from '../charts/time-utils'\n\ninterface Props {\n config?: TimeRangeOverrideLike\n onChange: (config: TimeRangeOverrideLike) => void\n // Global dashboard time range, injected by the app (it owns the data hook /\n // local-storage default). When override is OFF the picker drives these.\n globalStartTime?: DateTimeValue\n globalEndTime?: DateTimeValue\n globalTz?: string\n onSetGlobalTimeRange: (\n start?: DateTimeValue,\n end?: DateTimeValue,\n tz?: string\n ) => void\n}\n\nexport const defaultConfig: TimeRangeOverrideLike = {\n enabled: false\n}\n\nexport function TimeRangeOverride({\n config,\n onChange,\n globalStartTime,\n globalEndTime,\n globalTz,\n onSetGlobalTimeRange\n}: Props) {\n config = defaults(config || {}, defaultConfig)\n\n const setEnabled = (enabled: boolean) => {\n config &&\n onChange(\n produce(config, (draft) => {\n draft.enabled = enabled\n if (enabled) {\n draft.timeRange = {\n start: toTimeLike(globalStartTime),\n end: toTimeLike(globalEndTime),\n step: draft.timeRange?.step,\n interval: draft.timeRange?.interval,\n timezone: draft.timeRange?.timezone\n }\n }\n })\n )\n }\n\n function onTimeRangeChange(\n start?: DateTimeValue,\n end?: DateTimeValue,\n tz?: string\n ) {\n if (config?.enabled) {\n onChange(\n produce(config, (draft) => {\n draft.timeRange = {\n start: toTimeLike(start),\n end: toTimeLike(end),\n timezone: tz,\n step: draft.timeRange?.step,\n interval: draft.timeRange?.interval\n }\n })\n )\n } else {\n onSetGlobalTimeRange(start, end, tz)\n }\n }\n\n return (\n <div className=\"flex flex-wrap items-center gap-4 p-2\">\n <div className=\"flex items-center\">\n <Switch\n checked={config.enabled || false}\n onChange={setEnabled}\n label=\"Override Global Time\"\n />\n </div>\n\n <TimeRangePicker\n startTime={\n config.enabled\n ? fromTimeLike(config.timeRange?.start)\n : globalStartTime\n }\n endTime={\n config.enabled ? fromTimeLike(config.timeRange?.end) : globalEndTime\n }\n tz={config.enabled ? config.timeRange?.timezone || globalTz : globalTz}\n onChange={onTimeRangeChange}\n />\n </div>\n )\n}\n","import { useEffect, useRef, useState, useLayoutEffect } from 'react'\nimport { Select, classNames } from '@sentio/ui-core'\nimport LineIcon from '../charts/icons/LineIcon'\nimport BarIcon from '../charts/icons/BarIcon'\nimport AreaIcon from '../charts/icons/AreaIcon'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport { LuChevronRight, LuMountainSnow } from 'react-icons/lu'\nimport { cloneDeep } from 'lodash'\nimport { Disclosure } from '@headlessui/react'\nimport type { ChartConfigLike, SeriesConfigLike } from '../types/chart'\nimport type { ChartTypeLike } from '../types/enums'\n\ninterface Props {\n config?: ChartConfigLike\n chartType?: ChartTypeLike\n setSeriesConfig: (seriesConfig: SeriesConfigLike) => void\n // Series names computed by the app (worker parses the SQL response); injected\n // so this panel stays free of the web worker.\n series: string[]\n // Mixed-chart feature flag, injected by the app.\n enabled?: boolean\n}\n\n// Define the available chart types for individual series\nconst seriesChartTypes = [\n {\n value: 'default',\n label: (\n <div className=\"flex items-center\">\n <LuMountainSnow className=\"mr-2 h-4 w-4\" />\n Default\n </div>\n )\n },\n {\n value: 'LINE',\n label: (\n <div className=\"flex items-center\">\n <LineIcon className=\"mr-2 h-4 w-4\" />\n Line\n </div>\n )\n },\n {\n value: 'BAR',\n label: (\n <div className=\"flex items-center\">\n <BarIcon className=\"mr-2 h-4 w-4\" />\n Bar\n </div>\n )\n },\n {\n value: 'AREA',\n label: (\n <div className=\"flex items-center\">\n <AreaIcon className=\"mr-2 h-4 w-4\" />\n Area\n </div>\n )\n }\n]\n\nexport const SeriesControls = ({\n config,\n setSeriesConfig,\n series,\n enabled\n}: Props) => {\n const parentRef = useRef<HTMLDivElement>(null)\n const [isDisclosureOpen, setIsDisclosureOpen] = useState(true)\n\n // Only use virtualization when there are more than 10 series\n const shouldVirtualize = series.length > 10\n\n // Setup virtualizer only when disclosure is open and should virtualize\n const virtualizer = useVirtualizer({\n count: shouldVirtualize && isDisclosureOpen ? series.length : 0,\n getScrollElement: () => parentRef.current,\n estimateSize: () => 40,\n overscan: 5 // Render 5 extra items outside viewport for smooth scrolling\n })\n\n // Re-measure virtualizer when disclosure state changes\n useLayoutEffect(() => {\n if (isDisclosureOpen && shouldVirtualize && parentRef.current) {\n // Small delay to ensure DOM is updated\n const timeoutId = setTimeout(() => {\n virtualizer.measure()\n }, 10)\n return () => clearTimeout(timeoutId)\n }\n }, [isDisclosureOpen, shouldVirtualize, virtualizer])\n\n const handleSeriesTypeChange = (seriesName: string, selectedType: string) => {\n const currentSeriesConfig = config?.seriesConfig || { series: {} }\n\n if (selectedType === 'default') {\n // For 'default', we'll remove the series from config to use chart's default type\n const newSeriesConfig = cloneDeep(currentSeriesConfig)\n if (newSeriesConfig.series && newSeriesConfig.series[seriesName]) {\n delete newSeriesConfig.series[seriesName]\n }\n setSeriesConfig(newSeriesConfig)\n return\n }\n\n const newSeriesConfig: SeriesConfigLike = {\n ...currentSeriesConfig,\n series: {\n ...currentSeriesConfig.series,\n [seriesName]: { type: selectedType as ChartTypeLike }\n }\n }\n\n setSeriesConfig(newSeriesConfig)\n }\n\n const handleReset = () => {\n setSeriesConfig({ series: {} })\n }\n\n // Render single series item component\n const renderSeriesItem = (seriesName: string) => {\n const currentType =\n config?.seriesConfig?.series?.[seriesName]?.type || 'default'\n\n return (\n <div\n key={seriesName}\n className=\"text-icontent inline-flex h-8 w-full basis-0 px-2\"\n >\n <div className=\"sm:text-icontent bg-sentio-gray-100 dark:bg-sentio-gray-200 border-main inline-flex shrink items-center rounded-l-md border border-r-0 px-2 font-medium sm:min-w-[160px]\">\n <span className=\"truncate\" title={seriesName}>\n {seriesName}\n </span>\n </div>\n <span className=\"sm:text-icontent bg-sentio-gray-100 dark:bg-sentio-gray-200 border-main inline-flex items-center whitespace-nowrap border border-r-0 px-2\">\n Show as\n </span>\n <div className=\"w-40\">\n <Select\n options={seriesChartTypes}\n value={currentType}\n onChange={(selectedType) =>\n handleSeriesTypeChange(seriesName, selectedType as string)\n }\n className=\"focus:border-primary-500 sm:text-icontent border-main h-full rounded-r-md border\"\n buttonClassName=\"border-none! h-full!\"\n placeholder=\"Select chart type\"\n asLayer={true}\n />\n </div>\n </div>\n )\n }\n\n if (!enabled) {\n return null\n }\n\n const titleWithReset = (\n <div className=\"flex w-full items-center justify-between pr-2\">\n <span>{`Series (${series.length})`}</span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation() // Prevent disclosure toggle\n handleReset()\n }}\n className=\"rounded-sm bg-gray-200 px-2 py-1 text-xs transition-colors hover:bg-gray-300\"\n title=\"Reset all series to default\"\n >\n Reset\n </button>\n </div>\n )\n\n return (\n <Disclosure defaultOpen={true}>\n {({ open }) => {\n // Synchronize disclosure state with `open` using useEffect\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useEffect(() => {\n setIsDisclosureOpen(open)\n }, [open])\n\n return (\n <div className=\"bg-default-bg w-full rounded-sm\">\n <Disclosure.Button\n className={classNames(\n open ? 'rounded-t' : 'rounded-sm',\n 'focus-visible:ring-primary-500/75 text-ilabel font-ilabel text-text-foreground hover:bg-sentio-gray-100 dark:hover:bg-sentio-gray-400 focus:outline-hidden focus-visible:ring-3 flex w-full px-2 py-1.5 text-left'\n )}\n >\n <LuChevronRight\n className={classNames(\n open ? 'rotate-90 transform' : '',\n 'mr-1 h-5 w-5 self-center transition-all'\n )}\n />\n {titleWithReset}\n </Disclosure.Button>\n <Disclosure.Panel className=\"p-2\">\n {shouldVirtualize && open ? (\n // Virtualized rendering for large lists - only render when open\n <div\n ref={parentRef}\n className=\"text-icontent h-[200px] overflow-auto\"\n style={{\n contain: 'strict'\n }}\n >\n <div\n style={{\n height: `${virtualizer?.getTotalSize() ?? 0}px`,\n width: '100%',\n position: 'relative'\n }}\n >\n {virtualizer?.getVirtualItems().map((virtualItem) => {\n const seriesName = series[virtualItem.index]\n if (!seriesName) return null\n\n return (\n <div\n key={virtualItem.key}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`\n }}\n >\n {renderSeriesItem(seriesName)}\n </div>\n )\n })}\n </div>\n </div>\n ) : (\n // Normal rendering for small lists\n <div className=\"text-icontent flex max-h-[200px] flex-col gap-2 overflow-y-auto\">\n {series.map((seriesName) => renderSeriesItem(seriesName))}\n </div>\n )}\n </Disclosure.Panel>\n </div>\n )\n }}\n </Disclosure>\n )\n}\n","import { produce } from 'immer'\nimport { defaults } from 'lodash'\nimport { Checkbox, DisclosurePanel } from '@sentio/ui-core'\nimport type { ReactNode } from 'react'\nimport type { QueryValueConfigLike, ColorThemeLike } from '../types/chart'\nimport type { CalculationLike } from '../types/enums'\n\ninterface Props {\n config?: QueryValueConfigLike\n defaultOpen?: boolean\n onChange: (config: QueryValueConfigLike) => void\n // ColorSelect is bound to the app's query-value-theme (pulled into the chart\n // web worker), so it stays app-side and is injected as a slot.\n renderColorSelect: (\n value: ColorThemeLike | undefined,\n onChange: (picked: { value?: ColorThemeLike }) => void\n ) => ReactNode\n}\n\nexport const defaultConfig: QueryValueConfigLike = {\n calculation: 'LAST',\n colorTheme: {\n themeType: 'Gray'\n },\n showBackgroundChart: false\n}\n\nconst CalculationItems = [\n { label: 'Last', value: 'LAST' },\n { label: 'First', value: 'FIRST' },\n { label: 'Total', value: 'TOTAL' },\n { label: 'Mean', value: 'MEAN' },\n { label: 'Max', value: 'MAX' },\n { label: 'Min', value: 'MIN' }\n]\n\nexport function QueryValueControls({\n config,\n defaultOpen,\n onChange,\n renderColorSelect\n}: Props) {\n config = defaults(config, defaultConfig)\n\n function onCalculationChange(cal: CalculationLike) {\n config &&\n onChange(produce(config, (draft) => void (draft.calculation = cal)))\n }\n\n function onSeriesCalculationChange(cal: CalculationLike) {\n config &&\n onChange(produce(config, (draft) => void (draft.seriesCalculation = cal)))\n }\n\n function onSelectColor(c: { value?: ColorThemeLike }) {\n config &&\n onChange(\n produce(config, (draft) => {\n draft.colorTheme = c.value\n })\n )\n }\n\n function toggleShowBackgroundChart() {\n config &&\n onChange(\n produce(config, (draft) => {\n draft.showBackgroundChart = !draft.showBackgroundChart\n })\n )\n }\n\n return (\n <DisclosurePanel\n title=\"Query Value Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex flex-wrap items-center gap-4\">\n <div className=\"shadow-xs flex h-8 rounded-md\">\n <span className=\"sm:text-ilabel border-main text-text-foreground inline-flex items-center whitespace-nowrap rounded-l-md border border-r-0 bg-gray-50 px-3\">\n For each series, calculate the\n </span>\n <select\n value={config?.calculation}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 inline-flex items-center border py-0.5 pl-4 pr-7 focus:relative focus:z-10 focus:outline-none\"\n onChange={(e) =>\n onCalculationChange(e.target.value as CalculationLike)\n }\n >\n {CalculationItems.map((d) => (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n ))}\n </select>\n <span className=\"sm:text-ilabel border-main text-text-foreground inline-flex items-center whitespace-nowrap border border-x-0 bg-gray-50 px-3\">\n value, then show the\n </span>\n <select\n value={config?.seriesCalculation}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 inline-flex items-center border py-0.5 pl-4 pr-7 focus:relative focus:z-10 focus:outline-none\"\n onChange={(e) =>\n onSeriesCalculationChange(e.target.value as CalculationLike)\n }\n >\n {CalculationItems.map((d) => (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n ))}\n </select>\n <span className=\"sm:text-ilabel border-main text-text-foreground inline-flex items-center whitespace-nowrap rounded-r-md border-b border-r border-t bg-gray-50 px-3\">\n value of multiple series\n </span>\n </div>\n\n <div className=\"focus-within:ring-primary-500 shadow-xs border-main flex h-8 divide-x divide-gray-300 rounded-md border focus-within:border-transparent focus-within:ring-2\">\n <span className=\"sm:text-ilabel text-text-foreground inline-flex items-center whitespace-nowrap rounded-l-md bg-gray-50 px-3\">\n Color Theme\n </span>\n {renderColorSelect(config?.colorTheme, onSelectColor)}\n </div>\n <Checkbox\n checked={config?.showBackgroundChart}\n onChange={toggleShowBackgroundChart}\n label=\"Show Background Chart\"\n />\n </div>\n </DisclosurePanel>\n )\n}\n"],"mappings":"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","names":["labels","selectedLabels","ArgumentType","jsx","produce","classNames","classNames","jsx","jsxs","classNames","Fragment","jsx","jsxs","produce","classNames","f","useMemo","useState","produce","isEqual","NewMultipleSelect","classNames","useState","jsx","Fragment","jsx","jsxs","useState","produce","useMemo","value","NewMultipleSelect","classNames","input","isEqual","useEffect","useCallback","useState","useRef","useMemo","useEffect","useRef","useState","useEffect","useFloating","jsx","jsx","jsxs","useRef","useState","useEffect","legend","legendSelected","chartHandle","useCallback","useEffect","useState","Fragment","jsx","jsxs","useState","useRef","useMemo","chart","s","useCallback","useEffect","createContext","useContext","jsx","useState","useResizeDetector","jsx","jsxs","jsx","jsxs","SvgIcon","jsx","jsxs","SvgIcon","jsx","jsxs","SvgIcon","jsx","SvgIcon","jsx","jsxs","SvgIcon","jsx","jsxs","SvgIcon","jsx","jsxs","SvgIcon","jsx","useState","useResizeDetector","Fragment","useMemo","sortBy","classNames","Fragment","jsx","jsxs","useMemo","sortBy","hasCompare","markers","compareMarkers","currentTime","compareTime","total","compareTotal","series","hasCurrent","classNames","Fragment","useMemo","dayjs","utc","timezone","isNumber","LuCircleUserRound","LuList","CopyButton","classNames","jsx","jsxs","forwardRef","useEffect","useState","useResizeDetector","jsx","PieChart","forwardRef","useState","isMobile","useResizeDetector","useEffect","options","forwardRef","useEffect","useMemo","useState","jsx","forwardRef","useState","useEffect","series","xAxis","yAxis","useMemo","forwardRef","useMemo","useResizeDetector","jsx","forwardRef","useResizeDetector","useMemo","forwardRef","useCallback","useEffect","useMemo","useRef","useState","dayjs","dayjs","utc","timezone","dayjs","TimeUnitShortNames","duration","TimeUnitShortNames","t","dayjs","toDayjs","classNames","classNames","jsx","Fragment","jsx","jsxs","Button","DisclosurePanel","jsx","jsxs","DisclosurePanel","Button","isEqual","isNumber","FloatingPortal","shift","useFloating","LuChevronDown","jsx","jsxs","initialConfig","min","max","forwardRef","useRef","useMemo","useState","useCallback","useEffect","options","yAxis","toDayjs","start","end","title","startTime","endTime","dayjs","classNames","produce","DisclosurePanel","ButtonGroup","Checkbox","jsx","jsxs","useEffect","useMemo","produce","NewButton","DisclosurePanel","HelpIcon","jsx","jsxs","initialConfig","produce","defaults","Checkbox","DisclosurePanel","ButtonGroup","jsx","jsxs","produce","defaults","DisclosurePanel","jsx","jsxs","defaultConfig","CalculationItems","sortByItems","orderItems","sortBy","produce","classNames","Button","classNames","produce","jsx","jsxs","Fragment","jsx","jsxs","defaultConfig","AddonLabel","classNames","produce","defaults","Checkbox","DisclosurePanel","produce","jsx","jsxs","defaultConfig","defaults","produce","DisclosurePanel","Checkbox","produce","LuPlus","Button","DisclosurePanel","jsx","jsxs","produce","defaults","DisclosurePanel","jsx","jsxs","defaultConfig","defaults","produce","DisclosurePanel","produce","defaults","useCallback","DisclosurePanel","jsx","jsxs","defaultConfig","defaults","useCallback","produce","DisclosurePanel","useMemo","produce","defaults","Checkbox","DisclosurePanel","jsx","jsxs","defaultConfig","CalculationItems","defaults","produce","useMemo","DisclosurePanel","Checkbox","useState","useRef","useCallback","useEffect","useMemo","jsx","jsxs","useEffect","useMemo","useRef","useState","BaseDialog","Select","classNames","LuCheck","Fragment","jsx","jsxs","classNames","LuCheck","useState","useRef","useEffect","useMemo","BaseDialog","Select","dayjs","classNames","useCallback","useEffect","useRef","useState","IoMdRefresh","jsx","jsxs","useRef","useState","useEffect","dayjs","useCallback","jsxs","classNames","jsx","IoMdRefresh","useMemo","useState","BaseDialog","CopyButton","Checkbox","dateTimeToString","jsx","jsxs","defaults","produce","jsx","jsxs","defaultConfig","defaults","produce","useEffect","useRef","useState","Select","classNames","jsx","jsxs","useRef","useState","newSeriesConfig","Select","useEffect","classNames","produce","defaults","Checkbox","DisclosurePanel","jsx","jsxs","defaultConfig","CalculationItems"]}
1
+ {"version":3,"sources":["../src/timeseries/AggregateInput.tsx","../src/timeseries/labels.ts","../src/timeseries/ArgumentInput.tsx","../src/timeseries/functions.ts","../src/timeseries/FunctionInput.tsx","../src/timeseries/FunctionsPanel.tsx","../src/timeseries/LabelsInput.tsx","../src/timeseries/LabelSearchContext.tsx","../src/charts/EchartsBase.tsx","../src/charts/ChartLegend.tsx","../src/common/Tooltip.tsx","../src/utils/is-mobile.ts","../src/charts/theme/register.ts","../src/charts/theme/sentio-colors.ts","../src/charts/theme/sentio-theme.ts","../src/utils/use-dark-mode.ts","../src/charts/RefreshContext.tsx","../src/charts/ChartTypeButtonGroup.tsx","../src/charts/icons/BarGuageIcon.tsx","../src/charts/icons/QueryValueIcon.tsx","../src/charts/icons/TableIcon.tsx","../src/charts/icons/AreaIcon.tsx","../src/charts/icons/BarIcon.tsx","../src/charts/icons/LineIcon.tsx","../src/charts/icons/PieIcon.tsx","../src/charts/icons/ScatterIcon.tsx","../src/charts/ChartTooltip.tsx","../src/charts/duration.ts","../src/charts/ScatterChartTooltip.tsx","../src/charts/PieChart.tsx","../src/charts/BarGaugeChart.tsx","../src/charts/QueryValueChart.tsx","../src/charts/TimeSeriesChart.tsx","../src/charts/series-utils.ts","../src/charts/time-utils.ts","../src/charts/options/YaxisControls.tsx","../src/charts/options/controls-ui.tsx","../src/charts/options/XaxisControls.tsx","../src/charts/options/LineControls.tsx","../src/charts/options/LabelControls.tsx","../src/charts/options/PieChartControls.tsx","../src/charts/options/BarGaugeControls.tsx","../src/charts/options/ValueOptions.tsx","../src/charts/options/ValueStringMapping.tsx","../src/charts/options/ValueControls.tsx","../src/charts/options/MarkerControls.tsx","../src/charts/options/DataControls.tsx","../src/charts/options/ScatterControls.tsx","../src/charts/options/TableControls.tsx","../src/charts/table-utils.ts","../src/dashboard/EditDashboardDialog.tsx","../src/dashboard/ErrorChart.tsx","../src/dashboard/EditGroupDialog.tsx","../src/dashboard/group-styles.ts","../src/dashboard/DashboardRefresh.tsx","../src/dashboard/ShareDashboardDialog.tsx","../src/dashboard/TimeRangeOverride.tsx","../src/dashboard/SeriesControls.tsx","../src/dashboard/QueryValueControls.tsx","../src/dashboard/ImportPanelDialog.tsx","../src/dashboard/ExportDashboardDialog.tsx"],"sourcesContent":["import { useMemo } from 'react'\nimport { capitalize } from 'lodash'\nimport { produce } from 'immer'\nimport { NewMultipleSelect } from '@sentio/ui-core'\nimport type {\n AggregateOpsLike,\n MetricInfoLike,\n QueryLike\n} from '../types/metrics'\nimport { SystemLabels } from './labels'\n\nconst AggregateAggregateOps: AggregateOpsLike[] = [\n 'AVG',\n 'SUM',\n 'MIN',\n 'MAX',\n 'COUNT'\n]\n\ninterface Props {\n metric?: MetricInfoLike\n value: QueryLike\n onChange: (value: QueryLike) => void\n}\n\ntype Label = { label: string; value: string }\n\nexport function AggregateInput({ metric, value, onChange }: Props) {\n const { labels, selectedLabels } = useMemo(() => {\n const labels: Label[] = []\n for (const sl of SystemLabels) {\n labels.push({ label: sl.name, value: sl.field })\n }\n Object.keys(metric?.labels || {}).forEach((l) => {\n labels.push({ label: l, value: l })\n })\n const selectedLabels: Label[] = []\n for (const l of value?.aggregate?.grouping || []) {\n const label = labels.find((lb) => lb.value === l)\n if (label) {\n selectedLabels.push(label)\n }\n }\n\n return { labels, selectedLabels }\n }, [metric, value])\n\n const onSelectLabel = (labels: Label[]) => {\n onChange(\n produce(value, (draft) => {\n draft.aggregate = draft.aggregate || {}\n draft.aggregate.grouping = labels.map((l) => l.value)\n })\n )\n }\n\n const onSelectFunc = (f: string) => {\n onChange(\n produce(value, (draft) => {\n if (f == 'none') {\n delete draft.aggregate\n } else {\n const aggr = draft.aggregate || {}\n aggr.op = f as AggregateOpsLike\n draft.aggregate = aggr\n }\n })\n )\n }\n\n return (\n <div className=\"min-h-8 flex grow items-center justify-stretch\">\n <select\n value={value.aggregate?.op || ''}\n className=\"sm:text-ilabel border-main text-text-foreground inline-flex h-8 items-center rounded-l-md border border-r-0 bg-gray-50 py-1 pl-4 pr-7 focus:border-0 focus:ring-inset\"\n onChange={(e) => onSelectFunc(e.target.value)}\n aria-label=\"aggregate\"\n >\n <option key=\"\" value={'none'}>\n No aggregate\n </option>\n {AggregateAggregateOps.map((key) => {\n return (\n <option key={key} value={key}>\n {capitalize(key)} by\n </option>\n )\n })}\n </select>\n <NewMultipleSelect<Label>\n disabled={!value.aggregate}\n className=\"border-main flex h-8 grow overflow-hidden rounded-r-md border\"\n options={labels || []}\n value={selectedLabels}\n onChange={onSelectLabel}\n displayFn={(l) => l.label}\n unSelectedText=\"(everything)\"\n optionsClassName=\"min-w-[200px]\"\n />\n </div>\n )\n}\n","import { getChainName } from '@sentio/chain'\nimport type { MetricInfoLike } from '../types/metrics'\n\nexport const SystemLabels = [\n {\n field: 'contract_name',\n name: 'contract',\n getValues(metric: MetricInfoLike) {\n return (metric.contractName || []).map((name) => ({\n value: name,\n display: name\n }))\n }\n },\n {\n field: 'contract_address',\n name: 'address',\n getValues(metric: MetricInfoLike) {\n return (metric.contractAddress || []).map((name) => ({\n value: name,\n display: name\n }))\n }\n },\n {\n field: 'chain',\n name: 'chain',\n getValues(metric: MetricInfoLike) {\n return (metric.chainId || []).map((chainId) => {\n return { value: chainId, display: getChainName(chainId) }\n })\n }\n }\n]\n\nexport function sortMetricByName(a: string, b: string) {\n const aIsSystem = a.startsWith('system.')\n const bIsSystem = b.startsWith('system.')\n\n if (aIsSystem && !bIsSystem) {\n return 1\n }\n if (!aIsSystem && bIsSystem) {\n return -1\n }\n return a.localeCompare(b)\n}\n","import { DurationInput, classNames } from '@sentio/ui-core'\nimport { ArgumentDef, ArgumentType } from './functions'\nimport type { ArgumentLike } from '../types/metrics'\n\ninterface Props {\n argument: ArgumentDef\n value?: ArgumentLike\n onChange?: (value: ArgumentLike) => void\n className?: string\n}\n\nexport function ArgumentInput({ className, argument, value, onChange }: Props) {\n switch (argument.type) {\n case ArgumentType.String:\n return (\n <input\n type=\"text\"\n className={classNames(\n className,\n 'hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 border border-transparent'\n )}\n value={value?.stringValue}\n onChange={(v) =>\n onChange && onChange({ stringValue: v.target.value })\n }\n />\n )\n case ArgumentType.Double:\n return (\n <input\n type=\"number\"\n className={classNames(\n className,\n 'hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 border border-transparent'\n )}\n value={value?.doubleValue}\n step=\"any\"\n onChange={(v) =>\n onChange && onChange({ doubleValue: parseFloat(v.target.value) })\n }\n />\n )\n case ArgumentType.Integer:\n return (\n <input\n step=\"1\"\n type=\"number\"\n className={classNames(\n className,\n 'hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 border border-transparent'\n )}\n value={value?.intValue}\n onChange={(v) =>\n onChange && onChange({ intValue: parseInt(v.target.value) })\n }\n />\n )\n case ArgumentType.Bool:\n return (\n <input\n type=\"checkbox\"\n className={classNames(\n className,\n 'hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 border border-transparent'\n )}\n checked={value?.boolValue}\n onChange={(e) =>\n onChange && onChange({ boolValue: e.target.value == 'true' })\n }\n />\n )\n case ArgumentType.Duration:\n return (\n <DurationInput\n className=\"rounded-none! border-transparent! hover:border-primary-600! focus-within:border-primary-600!\"\n inputClassName={classNames(className)}\n value={value?.durationValue}\n onChange={(e) => onChange && onChange({ durationValue: e })}\n enableDays\n />\n )\n }\n}\n","import type { ArgumentLike } from '../types/metrics'\n\nexport enum ArgumentType {\n String,\n Integer,\n Double,\n Bool,\n Duration\n}\n\nexport interface ArgumentDef {\n name: string\n type: ArgumentType\n}\n\nexport interface FunctionDef {\n name: string\n displayName?: string\n description: string\n arguments: ArgumentDef[]\n defaultArguments?: ArgumentLike[]\n deprecated?: boolean\n}\n\nconst abs: FunctionDef = {\n name: 'abs',\n description: 'Returns the absolute value.',\n arguments: []\n}\n\nconst ceil: FunctionDef = {\n name: 'ceil',\n description:\n 'Returns the smallest integer greater than or equal to a number.',\n arguments: []\n}\n\nconst floor: FunctionDef = {\n name: 'floor',\n description: 'Returns the largest integer less than or equal to a number.',\n arguments: []\n}\nconst round: FunctionDef = {\n name: 'round',\n description: 'Returns the value of a number rounded to the nearest integer.',\n arguments: []\n}\nconst log2: FunctionDef = {\n name: 'log2',\n description: 'Returns the base 2 logarithm.',\n arguments: []\n}\nconst log10: FunctionDef = {\n name: 'log10',\n description: 'Returns the base 10 logarithm.',\n arguments: []\n}\nconst ln: FunctionDef = {\n name: 'ln',\n description: 'Returns the natural logarithm.',\n arguments: []\n}\nconst aggregations = ['avg', 'count', 'last', 'max', 'min', 'sum', 'delta']\n\nconst aggregationDescriptions: { [key: string]: string } = {\n avg: 'Calculates the sum of all values in the specified interval.',\n count: 'Calculates the number of values in the specified interval.',\n last: 'Calculates the last value in the specified interval.',\n max: 'Calculates the maximum of all values in the specified interval.',\n min: 'Calculates the minimum of all values in the specified interval.',\n sum: 'Calculates the sum of all values in the specified interval.',\n delta:\n 'Calculates the difference between the first and last value in the specified interval.'\n}\n\nconst aggregateOverTimeFunctions: FunctionDef[] = aggregations.map(\n (method): FunctionDef => ({\n name: `${method}_over_time`,\n description: aggregationDescriptions[method],\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }]\n })\n)\n\nconst rollupDescriptions: { [key: string]: string } = {\n avg: 'Roll up the metric by its average value over the specified time period.',\n count:\n 'Roll up the metric by its count value over the specified time period.',\n last: 'Roll up the metric by its last value over the specified time period.',\n max: 'Roll up the metric by its maximum value over the specified time period.',\n min: 'Roll up the metric by its minimum value over the specified time period.',\n sum: 'Roll up the metric by its sum value over the specified time period.',\n delta: 'Roll up the metric by its delta value over the specified time period.'\n}\n\nconst rollupFunctions: FunctionDef[] = aggregations.map(\n (method): FunctionDef => ({\n name: `rollup_${method}`,\n description: rollupDescriptions[method],\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }]\n })\n)\n\nconst rate: FunctionDef = {\n name: 'rate',\n description:\n 'Calculates the per-second average rate of increase of the time series.',\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }]\n}\n\nconst irate: FunctionDef = {\n name: 'irate',\n description:\n 'Calculates the per-second instant rate of increase of the time series.',\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }]\n}\n\nconst delta: FunctionDef = {\n name: 'delta',\n description:\n 'Calculates the difference between the first and last value of each time series.',\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }],\n deprecated: true\n}\n\nconst moving_delta: FunctionDef = {\n name: 'moving_delta',\n description:\n 'Calculates the difference between the first and last value of each time series. (continuously)',\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }],\n deprecated: true\n}\n\nconst topk: FunctionDef = {\n name: 'topk',\n description: 'Returns the top k elements by sample value.',\n arguments: [\n {\n name: 'k',\n type: ArgumentType.Integer\n }\n ],\n defaultArguments: [{ intValue: 1 }]\n}\n\nconst bottomk: FunctionDef = {\n name: 'bottomk',\n description: 'Returns the bottom k elements by sample value.',\n arguments: [\n {\n name: 'k',\n type: ArgumentType.Integer\n }\n ],\n defaultArguments: [{ intValue: 1 }]\n}\n\nconst timestamp: FunctionDef = {\n name: 'timestamp',\n description:\n 'Returns the timestamp of each of the samples of the given vector as the number of seconds since January 1, 1970 UTC.',\n arguments: []\n}\nconst day_of_week: FunctionDef = {\n name: 'day_of_week',\n description:\n 'Returns the day of the week for each of the given times. (needs timestamp)',\n arguments: []\n}\nconst day_of_month: FunctionDef = {\n name: 'day_of_month',\n description:\n 'Returns the day of the month for each of the given times. (needs timestamp)',\n arguments: []\n}\n\nconst day_of_year: FunctionDef = {\n name: 'day_of_year',\n description:\n 'Returns the day of the year for each of the given times. (needs timestamp)',\n arguments: []\n}\n\nconst month: FunctionDef = {\n name: 'month',\n description:\n 'Returns the month of the given time. Returned values are from 1 to 12, where 1 means January etc. (needs timestamp)',\n arguments: []\n}\n\nconst year: FunctionDef = {\n name: 'year',\n description: 'Returns the year of the given time. (needs timestamp)',\n arguments: []\n}\n\nconst hour: FunctionDef = {\n name: 'hour',\n description:\n 'Returns the hour of the given time. Returned values are from 0 to 23. (needs timestamp)',\n arguments: []\n}\n\nconst minute: FunctionDef = {\n name: 'minute',\n description:\n 'Returns the minute of the given time. Returned values are from 0 to 59. (needs timestamp)',\n arguments: []\n}\n\nconst before: FunctionDef = {\n name: 'before',\n displayName: 'shift earlier',\n description: 'Shifts the vector back in time by the specified duration.',\n arguments: [\n {\n name: 'duration',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'h' } }]\n}\n\nconst after: FunctionDef = {\n name: 'after',\n displayName: 'shift later',\n description: 'Shifts the vector forward in time by the specified duration.',\n arguments: [\n {\n name: 'duration',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'h' } }]\n}\n\nexport const FunctionsCategories: { [category: string]: FunctionDef[] } = {\n Math: [abs, ceil, floor, round, log2, log10, ln],\n Rollup: rollupFunctions,\n 'Aggregate Over Time': aggregateOverTimeFunctions,\n Rate: [rate, irate, delta, moving_delta],\n Rank: [topk, bottomk],\n Time: [\n timestamp,\n day_of_year,\n day_of_month,\n day_of_week,\n year,\n month,\n hour,\n minute\n ],\n TimeShift: [before, after]\n}\n\nexport const FunctionMap: { [name: string]: FunctionDef } = Object.values(\n FunctionsCategories\n).reduce(\n (acc, funcs) => {\n funcs.forEach((f) => {\n acc[f.name] = f\n })\n return acc\n },\n {} as { [name: string]: FunctionDef }\n)\n\nexport function isAggrOrRollupFunction(name: string) {\n const f = FunctionMap[name]\n return f && (f.name.startsWith('rollup_') || f.name.endsWith('_over_time'))\n}\n\nconst eventsDelta: FunctionDef = {\n name: 'delta',\n description:\n 'Calculates the difference between the first and last value of each time series.',\n arguments: [\n {\n name: 'interval',\n type: ArgumentType.Duration\n }\n ],\n defaultArguments: [{ durationValue: { value: 1, unit: 'm' } }]\n}\n\nexport const EventsFunctionCategories: { [category: string]: FunctionDef[] } = {\n Rank: [topk, bottomk],\n Delta: [eventsDelta]\n}\n\nexport const EventsFunctionMap: { [name: string]: FunctionDef } = Object.values(\n EventsFunctionCategories\n).reduce(\n (acc, funcs) => {\n funcs.forEach((f) => {\n acc[f.name] = f\n })\n return acc\n },\n {} as { [name: string]: FunctionDef }\n)\n","import { Popover } from '@headlessui/react'\nimport { LuX, LuChevronDown } from 'react-icons/lu'\nimport { useFloating, autoPlacement } from '@floating-ui/react'\nimport { produce } from 'immer'\nimport isEqual from 'lodash/isEqual'\nimport { HelpIcon, PopoverButton, classNames } from '@sentio/ui-core'\nimport { FunctionsPanel } from './FunctionsPanel'\nimport { ArgumentInput } from './ArgumentInput'\nimport { FunctionDef, FunctionMap } from './functions'\nimport type { ArgumentLike, FunctionLike, QueryLike } from '../types/metrics'\n\ninterface Props {\n value: QueryLike\n onChange: (value: QueryLike) => void\n}\n\nexport function FunctionInput({ value, onChange }: Props) {\n const { x, y, refs, strategy } = useFloating({\n middleware: [autoPlacement()]\n })\n\n const onSelectFunc = (f: FunctionDef) => {\n onChange(\n produce(value, (draft) => {\n draft.functions = draft.functions || []\n draft.functions.push({\n name: f.name,\n arguments: f.defaultArguments || []\n })\n })\n )\n }\n\n const remove = (f: FunctionLike) => {\n const idx = (value.functions || []).indexOf(f)\n if (idx >= 0) {\n onChange(\n produce(value, (draft) => {\n draft.functions = draft.functions || []\n draft.functions.splice(idx, 1)\n })\n )\n }\n }\n\n function changeArgument(fidx: number, aidx: number, v: ArgumentLike) {\n onChange(\n produce(value, (draft) => {\n draft.functions = draft.functions || []\n const f = draft.functions[fidx]\n if (f) {\n f.arguments = f.arguments || []\n f.arguments[aidx] = v\n }\n })\n )\n }\n\n function changeFunction(fidx: number, f: FunctionDef) {\n onChange(\n produce(value, (draft) => {\n draft.functions = draft.functions || []\n const preFunc = draft.functions[fidx]\n let resetArg = true\n if (preFunc.arguments?.length === f.defaultArguments?.length) {\n const firstArg = preFunc.arguments?.[0]\n const firstDefaultArg = f.defaultArguments?.[0]\n if (firstArg && firstDefaultArg) {\n resetArg = isEqual(\n Object.keys(firstArg),\n Object.keys(firstDefaultArg)\n )\n ? false\n : true\n }\n }\n draft.functions[fidx] = {\n name: f.name,\n arguments: resetArg ? f.defaultArguments || [] : preFunc.arguments\n }\n })\n )\n }\n\n return (\n <>\n <Functions\n functions={value.functions || []}\n onRemove={remove}\n onChangeArgument={changeArgument}\n onChangeFunction={changeFunction}\n />\n <div className=\"inline-flex items-center\">\n <div className=\"bg-border-color h-px w-2.5 self-center\"></div>\n <Popover className=\"relative\">\n {({ open }) => (\n <>\n <Popover.Button\n ref={refs.setReference}\n aria-label=\"Add function\"\n className={classNames(\n 'text-ilabel focus:border-primary-600 focus:ring-primary-600/30 focus:ring-3 relative -ml-px inline-flex h-8 items-center space-x-2 rounded-md',\n 'border-main hover:border-primary-600 border px-4 font-normal',\n open\n ? 'text-primary-600 ring-1'\n : 'text-text-foreground-secondary hover:text-text-foreground'\n )}\n >\n <span className=\"flex text-sm\">f(x)</span>\n <HelpIcon text={'Add functions to query.'} />\n </Popover.Button>\n\n <Popover.Panel\n className=\"shadow-xs border-main z-10 mt-3 h-56 w-96 rounded-md border px-2 sm:px-0 lg:max-w-3xl\"\n ref={refs.setFloating}\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0\n }}\n >\n {({ close }) => (\n <FunctionsPanel\n onClick={(f) => {\n onSelectFunc(f)\n close()\n }}\n />\n )}\n </Popover.Panel>\n </>\n )}\n </Popover>\n </div>\n </>\n )\n}\n\nfunction Functions({\n functions,\n onRemove,\n onChangeArgument,\n onChangeFunction\n}: {\n functions: FunctionLike[]\n onRemove: (f: FunctionLike) => void\n onChangeArgument: (fIdx: number, argIdx: number, value: ArgumentLike) => void\n onChangeFunction?: (fIdx: number, f: FunctionDef) => void\n}) {\n if (functions.length == 0) {\n return <></>\n }\n\n return (\n <>\n {functions.map((f, fi) => {\n const def = FunctionMap[f.name!]\n return (\n <div key={f.name} className=\"inline-flex items-center\">\n <div className=\"bg-border-color h-px w-2.5 self-center\"></div>\n <div\n className={classNames(\n 'text-ilabel focus:outline-hidden text-text-foreground-secondary relative inline-flex items-center pl-2 font-normal',\n 'border-main rounded-md border',\n 'h-8'\n )}\n >\n <PopoverButton\n containerClassName=\"h-full border-r border-light pr-2 inline-flex items-center bg-gray-50\"\n content={({ close }) => (\n <div className=\"z-10 h-56 w-96 px-2 sm:px-0 lg:max-w-3xl\">\n <FunctionsPanel\n onClick={(f) => {\n onChangeFunction?.(fi, f)\n close()\n }}\n defaultFunc={f.name}\n />\n </div>\n )}\n >\n <span className=\"hover:text-primary-600 text-text-foreground inline-flex cursor-pointer flex-nowrap items-center gap-1\">\n {def.displayName || f.name}\n <LuChevronDown className=\"h-4 w-4\" />\n </span>\n </PopoverButton>\n {def.arguments.map((arg, i) => (\n <ArgumentInput\n className=\"sm:text-ilabel block w-full pl-4\"\n key={'arg_' + i}\n argument={arg}\n value={f.arguments && f.arguments[i]}\n onChange={(v) => onChangeArgument(fi, i, v)}\n />\n ))}\n <button\n type={'button'}\n className={\n 'text-text-foreground-disabled hover:text-text-foreground hover:bg-hover h-full rounded-r-md px-2'\n }\n aria-label=\"remove function\"\n onClick={() => onRemove(f)}\n >\n <LuX className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n )\n })}\n </>\n )\n}\n","import { Tab } from '@headlessui/react'\nimport { Fragment, useEffect, useRef, useState } from 'react'\nimport { classNames } from '@sentio/ui-core'\nimport { BiCaretRight } from 'react-icons/bi'\nimport { FunctionDef, FunctionsCategories } from './functions'\n\ninterface Props {\n onClick: (func: FunctionDef) => void\n functionCategories?: typeof FunctionsCategories\n defaultFunc?: string\n}\n\nexport function FunctionsPanel({\n onClick,\n functionCategories = FunctionsCategories,\n defaultFunc\n}: Props) {\n const ulRef = useRef<HTMLUListElement>(null)\n const [selectedIdx, setSelectedIdx] = useState(0)\n useEffect(() => {\n if (!defaultFunc) return\n let targetIndex = 0\n Object.keys(functionCategories).forEach((category, idx) => {\n const func = functionCategories[category].find(\n (f) => f.name === defaultFunc\n )\n if (func) {\n targetIndex = idx\n }\n })\n setSelectedIdx(targetIndex)\n setTimeout(() => {\n const target = ulRef.current?.querySelector(\n `li[data-name=\"${defaultFunc}\"]`\n )\n if (target) {\n target.scrollIntoView({ block: 'center' })\n }\n }, 0)\n }, [defaultFunc])\n return (\n <div className=\"bg-default-bg flex h-full overflow-hidden rounded-md\">\n <Tab.Group vertical selectedIndex={selectedIdx} onChange={setSelectedIdx}>\n <Tab.List\n as=\"ul\"\n className=\"native-scroller border-main flex w-44 shrink-0 flex-col flex-nowrap divide-y divide-gray-200 overflow-auto border-r\"\n >\n {Object.keys(functionCategories).map((category, idx) => (\n <Tab as={Fragment} key={category}>\n {({ selected }) => (\n <li\n onMouseOver={() => setSelectedIdx(idx)}\n className={classNames(\n selected\n ? 'bg-primary-500 hover:bg-primary-600'\n : 'bg-default-bg hover:bg-gray-50',\n selected ? 'text-white' : 'text-foreground',\n 'flex cursor-pointer items-center justify-between p-2 text-sm font-medium'\n )}\n >\n <p\n className={classNames(\n 'text-ilabel flex-1 truncate font-medium'\n )}\n >\n {category}\n </p>\n <BiCaretRight\n className={classNames('h-3 w-3 shrink-0 self-center')}\n />\n </li>\n )}\n </Tab>\n ))}\n </Tab.List>\n <Tab.Panels className=\"flex-1\">\n {Object.keys(functionCategories).map((category) => (\n <Tab.Panel\n as=\"ul\"\n key={category}\n className=\"h-full divide-y overflow-y-auto\"\n ref={ulRef}\n >\n {functionCategories[category]\n .filter((f) => !f.deprecated)\n .map((func) => (\n <li\n key={func.name}\n className={classNames(\n 'group cursor-pointer space-y-1 px-2 py-1.5',\n func.name === defaultFunc\n ? 'bg-primary-600 dark:bg-primary-600 text-white'\n : 'hover:bg-sentio-gray-100 dark:hover:bg-sentio-gray-400 text-text-foreground dark:hover:text-white'\n )}\n onClick={() => onClick(func)}\n data-name={func.name}\n >\n <div className=\"flex items-center justify-between\">\n <p className=\"text-ilabel truncate font-medium\">\n {func.displayName || func.name}\n </p>\n </div>\n <div className=\"flex\">\n <div\n className={classNames(\n 'text-icontent flex items-center',\n func.name === defaultFunc\n ? 'text-white/80'\n : 'text-text-foreground-secondary'\n )}\n >\n <p>{func.description}</p>\n </div>\n </div>\n </li>\n ))}\n </Tab.Panel>\n ))}\n </Tab.Panels>\n </Tab.Group>\n </div>\n )\n}\n","import { useMemo, useState } from 'react'\nimport { produce } from 'immer'\nimport { isEqual, sortBy, sortedUniqBy } from 'lodash'\nimport { LuCheck } from 'react-icons/lu'\nimport { VscRegex } from 'react-icons/vsc'\nimport { NewMultipleSelect, classNames } from '@sentio/ui-core'\nimport type { MetricInfoLike, QueryLike } from '../types/metrics'\nimport type { TemplateVariableLike } from '../types/dashboard'\nimport { SystemLabels } from './labels'\nimport { useLabelSearch } from './LabelSearchContext'\n\ninterface Props {\n metric?: MetricInfoLike\n value: QueryLike\n onChange: (value: QueryLike) => void\n variables?: { [p: string]: TemplateVariableLike }\n small?: boolean\n useRegex?: boolean\n}\n\ntype LabelSelector = { display: string; key: string; value: string }\n\nexport function LabelsInput({\n value,\n metric,\n variables,\n onChange,\n small,\n useRegex\n}: Props) {\n const [input, setInput] = useState('')\n const onSelectLabel = (labels: LabelSelector[]) => {\n const selector: { [key: string]: string } = {}\n labels.forEach((label) => {\n selector[label.key] = label.value\n })\n onChange(\n produce(value, (draft) => {\n draft.labelSelector = selector\n })\n )\n }\n const { setLabelSearchQuery } = useLabelSearch()\n\n const labelSelectors = useMemo(() => {\n const result: LabelSelector[] = []\n if (metric) {\n Object.entries(variables || {}).forEach(([name, variable]) => {\n const varname = `$${name}`\n const labelSelector = {\n display:\n variable.field == name ? varname : `${variable.field}: ${varname}`,\n key: variable.field!,\n value: `${varname}`\n }\n if (metric.labels && metric.labels[variable.field!]) {\n result.push(labelSelector)\n } else if (\n variable?.field &&\n SystemLabels.map((l) => l.name).includes(variable?.field)\n ) {\n result.push(labelSelector)\n }\n })\n\n for (const sl of SystemLabels) {\n sl.getValues(metric).forEach(({ value, display }) => {\n result.push({\n display: `${sl.name}: ${display}`,\n key: sl.field,\n value: value\n })\n })\n }\n let inputLabel = ''\n let inputValue = ''\n if (input.includes(':')) {\n ;[inputLabel, inputValue] = input.split(':')\n inputLabel = inputLabel.trim()\n inputValue = inputValue.trim()\n } else {\n inputValue = input.trim()\n }\n Object.entries(metric?.labels || {}).forEach(([key, values]) => {\n ;(values.values || []).forEach((value) => {\n result.push({\n display: `${key}:${value}`,\n key,\n value\n })\n })\n if (\n !useRegex ||\n (inputValue && key.includes(inputLabel) === false) ||\n !inputValue\n ) {\n return\n }\n result.push({\n display: `${key}: <contains> ${inputValue}`,\n key,\n value: JSON.stringify({\n operator: 'contains',\n value: inputValue,\n ignoreCase: true\n })\n })\n })\n }\n return sortedUniqBy(\n sortBy(result, (r) => r.display),\n (r) => r.display\n )\n }, [metric, variables, input, useRegex])\n\n const selectedLabels = useMemo(() => {\n const selector = value?.labelSelector || {}\n return Object.entries(selector).map(([key, value]) => {\n return (\n labelSelectors.find((ls) => ls.key == key && ls.value == value) || {\n display: `${key}:${value}`,\n key,\n value\n }\n )\n })\n }, [value?.labelSelector, labelSelectors])\n\n return (\n <NewMultipleSelect<LabelSelector>\n input={input}\n onInputChange={setInput}\n className={classNames(\n 'border-main flex grow overflow-auto rounded-r-md border',\n small ? 'min-h-6' : 'min-h-8'\n )}\n options={labelSelectors}\n value={selectedLabels}\n onChange={onSelectLabel}\n displayFn={(o) => {\n const { display, value } = o\n const isRegex = /^\\{.*\\}$/.test(value)\n if (isRegex) {\n const valueObj = JSON.parse(value)\n return `${o.key}:<${valueObj?.opertaor ?? 'contains'}> ${valueObj?.value ?? value}`\n }\n return display\n }}\n disabled={!value.query}\n unSelectedText=\"(everywhere)\"\n maxInputSize={30}\n displayIcon={(o: LabelSelector) => {\n const isRegex = /^\\{.*\\}$/.test(o.value)\n return isRegex ? (\n <VscRegex className=\"mr-1 inline-block h-3 w-3 align-top\" />\n ) : null\n }}\n renderOption={(v: LabelSelector, _active: boolean, selected: boolean) => {\n const text = v.display\n const isRegex = /^\\{.*\\}$/.test(v.value)\n const title = `${text} ${isRegex ? ' (case-sensitive regex matcher)' : ''}`\n return (\n <>\n <span\n title={title}\n className={classNames(\n 'block truncate',\n selected && 'font-medium'\n )}\n >\n {isRegex && (\n <VscRegex className=\"mr-1 inline-block h-3 w-3 align-top\" />\n )}\n {text}\n </span>\n\n {selected && (\n <span\n className={classNames(\n 'absolute inset-y-0 right-0 flex items-center pr-4'\n )}\n >\n <LuCheck className=\"h-4 w-4\" aria-hidden=\"true\" />\n </span>\n )}\n </>\n )\n }}\n filterFn={(option: LabelSelector, input: string) => {\n const { display, value } = option\n const isRegex = /^\\{.*\\}$/.test(value)\n if (isRegex) {\n return true\n }\n return display.toLowerCase().includes(input.toLowerCase())\n }}\n validateFn={(option: LabelSelector) => {\n const isRegex = /^\\{.*\\}$/.test(option.value)\n if (isRegex) {\n return true\n }\n return labelSelectors.some((o) => isEqual(o, option))\n }}\n onFilterTextChange={setLabelSearchQuery}\n />\n )\n}\n","import React, { createContext, useContext, useState, ReactNode } from 'react'\n\ninterface LabelSearchContextType {\n labelSearchQuery: string\n setLabelSearchQuery: (query: string) => void\n}\n\nconst LabelSearchContext = createContext<LabelSearchContextType | undefined>(\n undefined\n)\n\ninterface LabelSearchProviderProps {\n children: ReactNode\n}\n\nexport function LabelSearchProvider({ children }: LabelSearchProviderProps) {\n const [labelSearchQuery, setLabelSearchQuery] = useState('')\n\n return (\n <LabelSearchContext.Provider\n value={{ labelSearchQuery, setLabelSearchQuery }}\n >\n {children}\n </LabelSearchContext.Provider>\n )\n}\n\nexport function useLabelSearchContext(): LabelSearchContextType | undefined {\n return useContext(LabelSearchContext)\n}\n\nexport function useLabelSearch(defaultQuery?: string): {\n labelSearchQuery: string\n setLabelSearchQuery: (query: string) => void\n} {\n const context = useLabelSearchContext()\n const [localQuery, setLocalQuery] = useState(defaultQuery || '')\n\n if (context) {\n return context\n }\n\n return {\n labelSearchQuery: localQuery,\n setLabelSearchQuery: setLocalQuery\n }\n}\n","import React, {\n useEffect,\n CSSProperties,\n useCallback,\n useState,\n useImperativeHandle,\n forwardRef,\n useRef,\n useMemo\n} from 'react'\nimport { CanvasRenderer, SVGRenderer } from 'echarts/renderers'\nimport { init, use } from 'echarts/core'\nimport {\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n SankeyChart\n} from 'echarts/charts'\nimport {\n LegendComponent,\n GridComponent,\n TooltipComponent,\n ToolboxComponent,\n TitleComponent,\n DataZoomComponent,\n BrushComponent,\n MarkLineComponent,\n MarkAreaComponent,\n GraphicComponent,\n VisualMapComponent\n} from 'echarts/components'\nimport type { ECharts, ComposeOption, SetOptionOpts } from 'echarts/core'\nimport type {\n BarSeriesOption,\n LineSeriesOption,\n SankeySeriesOption\n} from 'echarts/charts'\nimport type {\n TitleComponentOption,\n GridComponentOption\n} from 'echarts/components'\nimport { useResizeDetector, type OnResizeCallback } from 'react-resize-detector'\nimport { LegendComponentOption, LegendOption } from 'echarts/types/dist/shared'\nimport { BarLoading } from '@sentio/ui-core'\nimport { ChartLegend } from './ChartLegend'\nimport { isMobile } from '../utils/is-mobile'\nimport { registerSentioTheme } from './theme/register'\nimport { useDarkMode } from '../utils/use-dark-mode'\nimport { sansFontFamily } from './theme/sentio-theme'\n\n// Register the required components\nuse([\n LegendComponent,\n PieChart,\n LineChart,\n ScatterChart,\n MarkLineComponent,\n MarkAreaComponent,\n BarChart,\n SankeyChart,\n GridComponent,\n TooltipComponent,\n BrushComponent,\n TitleComponent,\n ToolboxComponent, // A group of utility tools, which includes export, data view, dynamic type switching, data area zooming, and reset.\n DataZoomComponent, // Used in Line Graph Charts\n CanvasRenderer, // If you only need to use the canvas rendering mode, the bundle will not include the SVGRenderer module, which is not needed.\n GraphicComponent,\n SVGRenderer,\n VisualMapComponent\n])\n\n// Register the 'sentio' / 'sentio-dark' themes (idempotent). A function call,\n// not a bare side-effect import, so it survives tree-shaking.\nregisterSentioTheme()\n\n// Combine an Option type with only required components and charts via ComposeOption\nexport type EChartsOption = ComposeOption<\n | BarSeriesOption\n | LineSeriesOption\n | TitleComponentOption\n | GridComponentOption\n | SankeySeriesOption\n // | ScatterSeriesOption\n>\n\nexport interface ReactEChartsProps {\n group?: string\n option: EChartsOption\n style?: CSSProperties\n settings?: SetOptionOpts\n loading?: boolean\n theme?: 'light' | 'dark' | 'sentio'\n minHeight?: number\n returnedSeries?: number\n totalSeries?: number\n onSelect?: (start: number, end: number) => void\n onZoom?: (start: number, end: number) => void\n noLegend?: boolean\n onClick?: (params: any, extraParams?: any) => void\n onInitChart?: (chart: ECharts) => void\n onSeriesEvent?: (\n event: 'click' | 'mouseover' | 'mouseout',\n params: any\n ) => void\n}\n\nexport interface EChartsHandle {\n getEChart: () => ECharts | undefined\n highlightSeries: (highlighted?: SeriesFinder) => void\n getSeriesColor: (s: SeriesFinder) => string | undefined\n getFrame: () => HTMLDivElement | null\n toggleLegend: (legend: string, selected?: boolean) => void\n resize: (size: { width?: number; height?: number }) => void\n\n getSeries(seriesId: string): any\n}\n\ntype SeriesFinder = {\n seriesId?: string\n seriesIndex?: number\n seriesName?: string\n}\nconst ReactEChartsBaseComponent: React.ForwardRefRenderFunction<\n EChartsHandle,\n ReactEChartsProps\n> = (\n {\n group,\n option,\n style,\n settings,\n loading,\n theme: _theme,\n // minHeight,\n returnedSeries,\n totalSeries,\n onSelect,\n noLegend,\n onZoom,\n onClick,\n onSeriesEvent,\n onInitChart\n }: ReactEChartsProps,\n forwardedRef\n) => {\n const isDarkMode = useDarkMode()\n const theme = _theme || (isDarkMode ? 'sentio-dark' : 'sentio')\n const [legendSelected, setLegendSelected] = useState<Record<string, boolean>>(\n {}\n )\n const [chart, setChart] = useState<ECharts>()\n const echartInstanceRef = useRef<ECharts | undefined>()\n const [legendRendered, setLegendRendered] = useState(false)\n const chartRender = 'canvas'\n const frameRef = useRef<HTMLDivElement>(null)\n\n const chartHandle = useMemo(() => {\n return {\n getEChart: () => echartInstanceRef.current,\n highlightSeries(highlighted?: SeriesFinder) {\n const chart = echartInstanceRef.current\n if (chart) {\n const { series: s } = chart.getOption()\n const series = s as any[]\n if (highlighted) {\n for (let i = 0; i < series.length; i++) {\n const s = series[i]\n if (\n s.id == highlighted.seriesId ||\n highlighted.seriesIndex == i\n ) {\n s.lineStyle = s.lineStyle || {}\n s.lineStyle.opacity = 1\n } else {\n s.lineStyle = s.lineStyle || {}\n s.lineStyle.opacity = 0.2\n }\n }\n } else {\n series.forEach((s) => {\n s.lineStyle = s.lineStyle || {}\n s.lineStyle.opacity = 1\n })\n }\n chart.setOption({ series })\n }\n },\n getSeriesColor(s: SeriesFinder) {\n const chart = echartInstanceRef.current\n if (chart) {\n try {\n // Resolve a valid series index before calling getVisual to avoid\n // the \"There is no specified series model\" dev warning (ECharts warns\n // before throwing when the series can't be found).\n const { series: optionSeries } = chart.getOption()\n const seriesList = (optionSeries || []) as any[]\n\n let resolvedIndex = s.seriesIndex\n if ((resolvedIndex == null || resolvedIndex < 0) && s.seriesId) {\n resolvedIndex = seriesList.findIndex(\n (serie) => serie.id === s.seriesId\n )\n }\n if ((resolvedIndex == null || resolvedIndex < 0) && s.seriesName) {\n resolvedIndex = seriesList.findIndex(\n (serie) => serie.name === s.seriesName\n )\n }\n\n // Only call getVisual when we know the series exists.\n if (\n resolvedIndex != null &&\n resolvedIndex >= 0 &&\n resolvedIndex < seriesList.length\n ) {\n return chart.getVisual(\n { seriesIndex: resolvedIndex },\n 'color'\n ) as string | undefined\n }\n return undefined\n } catch (e) {\n // ignore error\n }\n }\n },\n getFrame() {\n return frameRef.current\n },\n toggleLegend(name: string, selected?: boolean) {\n const chart = echartInstanceRef.current\n if (selected == null) {\n chart?.dispatchAction({\n type: 'legendToggleSelect',\n name\n })\n } else {\n chart?.dispatchAction({\n type: selected ? 'legendSelect' : 'legendUnSelect',\n name\n })\n }\n },\n getSeries(seriesId: string) {\n const chart = echartInstanceRef.current\n if (chart) {\n const { series: s } = chart.getOption()\n const series = s as any[]\n return series?.find((s) => s.id == seriesId)\n }\n },\n resize: (size) => {\n const chart = echartInstanceRef.current\n chart?.resize(size)\n }\n } as EChartsHandle\n }, [])\n\n useImperativeHandle(forwardedRef, () => {\n return chartHandle\n }, [chartHandle])\n\n const onResize: OnResizeCallback = useCallback(({ width, height }) => {\n const chart = echartInstanceRef.current\n chart?.resize({\n width: width ?? undefined,\n height: height ?? undefined\n })\n }, [])\n const {\n // width,\n // height,\n ref: chartRef\n } = useResizeDetector({\n onResize,\n refreshMode: 'throttle',\n refreshRate: 100\n })\n\n useEffect(() => {\n // Initialize chart\n let instance: ECharts\n const containerNode = frameRef.current?.querySelector('.echart-container')\n if (containerNode) {\n instance = init(containerNode as HTMLDivElement, theme, {\n renderer: chartRender,\n locale: 'EN'\n })\n echartInstanceRef.current = instance\n setChart(instance)\n }\n\n // Return cleanup function\n return () => {\n echartInstanceRef.current = undefined\n instance?.dispose()\n }\n }, [theme, chartRender])\n\n useEffect(() => {\n if (!chart || chart.isDisposed()) {\n return\n }\n chart.on('legendselected', (event: any) => {\n setLegendSelected(event.selected)\n })\n chart.on('legendunselected', (event: any) => {\n setLegendSelected(event.selected)\n })\n chart.on('legendselectchanged', (event: any) => {\n setLegendSelected(event.selected)\n })\n\n chart.on('brushEnd', (params: any) => {\n const areas = params.areas[0]\n if (areas) {\n const start = areas.coordRange[0]\n const end = areas.coordRange[1]\n onSelect && onSelect(start, end)\n }\n })\n if (onZoom) {\n chart.on('dataZoom', (params: any) => {\n onZoom(params.start, params.end)\n })\n }\n\n return () => {\n if (chart.isDisposed()) return\n chart.off('legendselectchanged')\n chart.off('brushEnd')\n chart.off('dataZoom')\n }\n }, [chart, onSelect, onZoom])\n\n useEffect(() => {\n if (!chart || chart.isDisposed() || !onClick) {\n return\n }\n chart.getZr()?.on('click', (params: any) => {\n const pointInPixel = [params.offsetX, params.offsetY]\n const pointInGrid = chart.convertFromPixel('grid', pointInPixel)\n onClick(pointInGrid, params)\n })\n if (onSeriesEvent) {\n chart.on('click', 'series', (params: any) => {\n onSeriesEvent?.('click', params)\n })\n chart.on('mouseover', 'series', (params: any) => {\n onSeriesEvent?.('mouseover', params)\n })\n chart.on('mouseout', 'series', (params: any) => {\n onSeriesEvent?.('mouseout', params)\n })\n }\n\n return () => {\n if (chart.isDisposed()) return\n chart.getZr()?.off('click')\n if (onSeriesEvent) {\n chart.off('click')\n chart.off('mouseout')\n chart.off('mouseover')\n }\n }\n }, [chart, onClick, onSeriesEvent, onInitChart])\n\n // Support X/Y Axis title\n const processedOption = useMemo(() => {\n if (!option) return option\n\n const processedOpt = { ...option }\n const graphicElements: any[] = []\n let hasYAxisName = false\n let hasXAxisName = false\n\n // Get text color based on theme\n const textColor = isDarkMode ? '#A6A6A6' : '#6E7079'\n\n // Common function to create axis name graphic element\n const createAxisNameElement = (\n name: string,\n isYAxis: boolean,\n axisIndex = 0\n ) => {\n const baseStyle = {\n text: name,\n fontSize: 11,\n fontFamily: sansFontFamily,\n fontWeight: 600,\n fill: textColor,\n textAlign: 'center' as const,\n textVerticalAlign: 'middle' as const\n }\n\n if (isYAxis) {\n return {\n type: 'text',\n left: axisIndex === 0 ? 8 : 'right',\n top: 'middle',\n rotation: Math.PI / 2,\n style: baseStyle,\n z: 100,\n silent: true\n }\n } else {\n return {\n type: 'text',\n left: 'center',\n bottom: axisIndex === 0 ? 8 : 'top',\n style: baseStyle,\n z: 100,\n silent: true\n }\n }\n }\n\n // Generic function to process axis names\n const processAxisName = (\n axisConfig: any,\n isYAxis: boolean,\n axisIndex = 0\n ) => {\n if (axisConfig && typeof axisConfig === 'object' && axisConfig.name) {\n if (isYAxis) {\n hasYAxisName = true\n } else {\n hasXAxisName = true\n }\n\n const { name, ...restAxis } = axisConfig\n const graphicElement = createAxisNameElement(name, isYAxis, axisIndex)\n graphicElements.push(graphicElement)\n return restAxis\n }\n return axisConfig\n }\n\n // Process both yAxis and xAxis using the generic function\n const processAxisArray = (axisOption: any, isYAxis: boolean) => {\n if (!axisOption) return axisOption\n\n if (Array.isArray(axisOption)) {\n return axisOption.map((axis, index) =>\n processAxisName(axis, isYAxis, index)\n )\n } else {\n return processAxisName(axisOption, isYAxis, 0)\n }\n }\n\n // Process axes\n processedOpt.yAxis = processAxisArray(option.yAxis, true)\n processedOpt.xAxis = processAxisArray(option.xAxis, false)\n\n // Adjust grid spacing when axis names are present\n if (hasYAxisName || hasXAxisName) {\n const originalGrid = processedOpt.grid || {}\n\n const adjustGridSpacing = (gridItem: any) => ({\n ...gridItem,\n left: hasYAxisName\n ? typeof gridItem.left === 'number'\n ? gridItem.left + 20\n : 32\n : gridItem.left,\n bottom: hasXAxisName\n ? typeof gridItem.bottom === 'number'\n ? gridItem.bottom + 20\n : 28\n : gridItem.bottom\n })\n\n processedOpt.grid = Array.isArray(originalGrid)\n ? originalGrid.map(adjustGridSpacing)\n : adjustGridSpacing(originalGrid)\n }\n\n // Add graphic elements to the processed option\n if (graphicElements.length > 0) {\n const existingGraphic = processedOpt.graphic\n if (existingGraphic) {\n processedOpt.graphic = Array.isArray(existingGraphic)\n ? [...existingGraphic, ...graphicElements]\n : [existingGraphic, ...graphicElements]\n } else {\n processedOpt.graphic = graphicElements\n }\n }\n\n return processedOpt\n }, [option, isDarkMode])\n\n useEffect(() => {\n if (!chart || chart.isDisposed()) {\n return\n }\n try {\n chart.setOption(\n {\n ...processedOption,\n legend: {\n ...(processedOption.legend as LegendOption),\n // Persist legend selected state between re-render.\n ...(legendSelected ? { selected: legendSelected } : {})\n }\n },\n { ...settings, notMerge: true }\n )\n } catch (e) {\n console.error('echarts set option failed', e, processedOption)\n }\n onInitChart?.(chart)\n\n if (!isMobile()) {\n // Don't allow brush on mobile\n chart.dispatchAction({\n type: 'brush',\n command: 'clear',\n areas: []\n })\n chart.dispatchAction({\n type: 'takeGlobalCursor',\n key: 'brush',\n brushOption: {\n brushType: 'lineX',\n brushMode: 'single'\n }\n })\n }\n }, [\n chart,\n processedOption,\n settings,\n theme,\n onSelect,\n legendSelected,\n onInitChart\n ])\n\n useEffect(() => {\n if (loading) {\n setLegendRendered(false)\n }\n }, [loading])\n\n useEffect(() => {\n if (chart && !chart.isDisposed()) {\n chart.group = group || ''\n }\n }, [chart, group])\n\n const onMouseDown = useCallback(\n (event: React.MouseEvent) => {\n // Cancel brush selection if the pressed button is not the main button.\n if (event.button !== 0 && chartRef.current) {\n chartRef.current\n .querySelector(chartRender)\n ?.dispatchEvent(\n new MouseEvent('mouseup', event as unknown as MouseEventInit)\n )\n }\n },\n [chartRef, chartRender]\n )\n\n const legends = noLegend ? null : (\n <>\n {chart && !loading && (\n <ChartLegend\n legend={\n ((option?.legend as LegendComponentOption)?.data as string[]) || []\n }\n chartHandle={chartHandle}\n legendSelected={legendSelected}\n returnedSeries={returnedSeries}\n totalSeries={totalSeries}\n onRendered={setLegendRendered}\n />\n )}\n </>\n )\n\n return (\n <div\n className=\"relative mb-1 grid h-full\"\n style={{ gridTemplateRows: '1fr max-content', height: '270px', ...style }}\n onMouseDown={onMouseDown}\n ref={frameRef}\n >\n <div\n ref={chartRef}\n className=\"echart-container min-h-0 w-full min-w-0\"\n ></div>\n {legends}\n {loading && (\n <BarLoading\n className=\"bg-default-bg absolute w-full\"\n hint=\"Loading\"\n width={100}\n />\n )}\n </div>\n )\n}\n\nexport const ReactEChartsBase = forwardRef(ReactEChartsBaseComponent)\n","import React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { Tooltip } from '../common/Tooltip'\nimport { EChartsHandle } from './EchartsBase'\n\nconst COLOR_UNSELECTED = '#dddddd'\n\ninterface Props {\n legend: string[]\n legendSelected: Record<string, boolean>\n returnedSeries?: number\n totalSeries?: number\n onRendered: (v: boolean) => void\n chartHandle?: EChartsHandle\n}\n\nexport const ChartLegend = ({\n legend,\n legendSelected,\n returnedSeries,\n totalSeries,\n onRendered,\n chartHandle\n}: Props) => {\n const rootRef = useRef<HTMLDivElement>(null)\n const [tooltipText, setTooltipText] = useState('')\n const [tooltipReferenceElement, setTooltipReferenceElement] =\n useState<HTMLDivElement>()\n\n useEffect(() => {\n if (!rootRef.current) {\n return\n }\n const offsetHeight = rootRef?.current?.parentElement?.offsetHeight || 0\n chartHandle?.resize({\n height: offsetHeight - rootRef.current.offsetHeight\n })\n onRendered(true)\n }, [chartHandle, onRendered])\n\n const onToggleLegend = useCallback(\n (event: React.MouseEvent, name: string, _seriesIndex: number) => {\n if (event.altKey) {\n legend.forEach((n) => {\n chartHandle?.toggleLegend(n, n === name)\n })\n return\n }\n chartHandle?.toggleLegend(name)\n },\n [chartHandle, legendSelected]\n )\n\n const highlightSeries = useCallback(\n (index: number) => {\n chartHandle?.highlightSeries({ seriesIndex: index })\n },\n [chartHandle]\n )\n\n const unhighlightSeries = useCallback(() => {\n chartHandle?.highlightSeries(undefined)\n }, [chartHandle])\n\n const onToggleAll = useCallback(\n (\n legend: string[],\n legendSelected: Record<string, boolean>,\n chartHandle?: EChartsHandle\n ) => {\n const allSelected = legend.every((name) => legendSelected[name])\n legend.forEach((name) => {\n chartHandle?.toggleLegend(name, !allSelected)\n })\n },\n [legend, legendSelected, chartHandle]\n )\n\n const list = legend.map((name, index) => {\n const selected = legendSelected[name] || legendSelected[name] === undefined\n return (\n <div\n className=\"flex cursor-pointer items-center gap-0.5 whitespace-nowrap\"\n key={name + index}\n data-tip={name}\n onClick={(event) => onToggleLegend(event, name, index)}\n onDoubleClick={(event) => {\n onToggleAll(legend, legendSelected, chartHandle)\n }}\n onMouseEnter={(e) => {\n if (legendSelected[name] !== false) {\n // Only highlight when the current legend is active.\n highlightSeries(index)\n }\n setTooltipReferenceElement(e.currentTarget)\n setTooltipText(name)\n }}\n onMouseLeave={() => {\n unhighlightSeries()\n setTooltipReferenceElement(undefined)\n setTooltipText('')\n }}\n >\n <span\n className=\"rounded-xs h-2.5 w-2.5\"\n style={{\n backgroundColor: selected\n ? chartHandle?.getSeriesColor({ seriesName: name })\n : COLOR_UNSELECTED\n }}\n />\n <span\n className=\"truncate text-xs\"\n style={{\n maxWidth: '12em',\n color: selected ? undefined : COLOR_UNSELECTED\n }}\n >\n {name}\n </span>\n </div>\n )\n })\n\n return (\n <div\n ref={rootRef}\n className=\"text-text-foreground-secondary flex max-h-10 flex-wrap gap-x-3 gap-y-1 overflow-y-auto px-2 text-[13px] leading-[18px]\"\n >\n {list}\n {returnedSeries && totalSeries && returnedSeries < totalSeries ? (\n <div className=\"font-semibold\" style={{ color: '#6B7280' }}>\n showing {returnedSeries} of {totalSeries} series\n </div>\n ) : null}\n <Tooltip referenceElement={tooltipReferenceElement} text={tooltipText} />\n </div>\n )\n}\n","import { useEffect } from 'react'\nimport { useFloating, FloatingPortal, shift } from '@floating-ui/react'\n\ninterface Props {\n referenceElement?: HTMLElement\n text: string\n}\n\nexport function Tooltip({ referenceElement, text }: Props) {\n const { x, y, refs, strategy } = useFloating({\n placement: 'bottom',\n middleware: [shift()]\n })\n\n useEffect(() => {\n if (referenceElement) refs.setReference(referenceElement)\n }, [refs, referenceElement])\n\n if (!referenceElement || !text) {\n return null\n }\n\n return (\n <FloatingPortal>\n <div\n ref={refs.setFloating}\n className=\"z-tooltip pointer-events-none rounded-md bg-black/70 px-2 py-1 text-white backdrop-opacity-60\"\n style={{\n position: strategy,\n top: y ?? 0,\n left: x ?? 0\n }}\n >\n {text}\n </div>\n </FloatingPortal>\n )\n}\n","// Plain (non-hook) UA check — mirror of the app's `lib/mobile`. Used by\n// EchartsBase inside an effect, where a hook can't be called.\nexport function isMobile() {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n}\n","import { registerTheme } from 'echarts/core'\nimport { sentioTheme, sentioThemeDark } from './sentio-theme'\n\n// Registers the 'sentio' / 'sentio-dark' ECharts themes. Exposed as a function\n// (not a bare side-effect import) so it survives tree-shaking: ui-dashboard's\n// package.json marks only *.css as side-effectful, so a side-effect-only\n// `import './register'` would be dropped by the bundler and the themes would\n// never register (charts fall back to ECharts' default palette). Callers invoke\n// this before `echarts.init(node, 'sentio')`. Idempotent.\nlet registered = false\nexport function registerSentioTheme() {\n if (registered) return\n registered = true\n registerTheme('sentio', sentioTheme)\n registerTheme('sentio-dark', sentioThemeDark)\n}\n","// Pure data module — kept free of `next/font` (and any other non-worker-safe\n// imports) so it can be safely pulled into the web-worker bundle via\n// `lib/metrics/series.ts`. Do not add side-effectful imports here.\n\nexport const sentioColors = {\n light: {\n classic: [\n '#5470f0',\n '#47c9d9',\n '#de5f94',\n '#e4bc4f',\n '#4cb275',\n '#77aeef',\n '#9368dd',\n '#e46d6d',\n '#f1904e'\n ],\n purple: [\n '#5b0fa6',\n '#6d11c9',\n '#8617e8',\n '#9b35e9',\n '#a855f7',\n '#b67af2',\n '#7a6bff',\n '#5b7cff',\n '#3e82f6'\n ]\n },\n dark: {\n classic: [\n '#6c8aff',\n '#74dfe6',\n '#ff75b0',\n '#f1cf66',\n '#67c88f',\n '#95c6ff',\n '#b189ff',\n '#f28787',\n '#ffad67'\n ],\n purple: [\n '#3f0a78',\n '#5310a0',\n '#6816c7',\n '#7c2ee6',\n '#9451f4',\n '#a874f8',\n '#6d63f6',\n '#5b7cff',\n '#4794ff'\n ]\n }\n}\n","// Inlined here (was `lib/fonts` in the app, which prepends a next/font face).\n// The app applies its custom font globally via CSS; the ECharts theme just needs\n// a sane sans stack. Exported so EchartsBase can reuse it for axis-name labels.\nexport const sansFontFamily =\n 'ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif'\nexport { sentioColors } from './sentio-colors'\nimport { sentioColors } from './sentio-colors'\n\n// Matches --text-foreground-secondary in app/styles/theme-variables.css\nconst textSecondaryLight = '#625d75'\nconst textSecondaryDark = '#b7b4c7'\n\nexport const sentioTheme = {\n color: sentioColors.light.classic,\n backgroundColor: 'rgba(0,0,0,0)',\n textStyle: {\n fontSize: 11,\n fontFamily: sansFontFamily,\n color: textSecondaryLight\n },\n title: {\n textStyle: {\n color: textSecondaryLight\n },\n subtextStyle: {\n color: textSecondaryLight\n }\n },\n line: {\n itemStyle: {\n borderWidth: 1\n },\n lineStyle: {\n width: 2\n },\n symbolSize: 4,\n symbol: 'emptyCircle',\n smooth: false\n },\n radar: {\n itemStyle: {\n borderWidth: 1\n },\n lineStyle: {\n width: 2\n },\n symbolSize: 4,\n symbol: 'emptyCircle',\n smooth: false\n },\n bar: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n pie: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n },\n label: {\n textBorderWidth: 0,\n textBorderColor: 'transparent'\n }\n },\n scatter: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n boxplot: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n parallel: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n sankey: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n funnel: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n gauge: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n candlestick: {\n itemStyle: {\n color: '#eb5454',\n color0: '#47b262',\n borderColor: '#eb5454',\n borderColor0: '#47b262',\n borderWidth: 1\n }\n },\n graph: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n },\n lineStyle: {\n width: 1,\n color: '#aaaaaa'\n },\n symbolSize: 4,\n symbol: 'emptyCircle',\n smooth: false,\n color: [\n '#2e71db',\n '#8dc869',\n '#ffdc2d',\n '#f05a4d',\n '#56bce5',\n '#73ba46',\n '#fe9f05',\n '#a452d7',\n '#a65a8b'\n ],\n label: {\n color: '#ebeff3'\n }\n },\n map: {\n itemStyle: {\n areaColor: '#eee',\n borderColor: '#444',\n borderWidth: 0.5\n },\n label: {\n color: '#000'\n },\n emphasis: {\n itemStyle: {\n areaColor: 'rgba(255,215,0,0.8)',\n borderColor: '#444',\n borderWidth: 1\n },\n label: {\n color: 'rgb(100,0,0)'\n }\n }\n },\n geo: {\n itemStyle: {\n areaColor: '#eee',\n borderColor: '#444',\n borderWidth: 0.5\n },\n label: {\n color: '#000'\n },\n emphasis: {\n itemStyle: {\n areaColor: 'rgba(255,215,0,0.8)',\n borderColor: '#444',\n borderWidth: 1\n },\n label: {\n color: 'rgb(100,0,0)'\n }\n }\n },\n categoryAxis: {\n axisLine: {\n show: true,\n lineStyle: {\n // matches CSS --border-color in light mode (rgb(235,239,243))\n color: '#EBEFF3'\n }\n },\n axisTick: {\n show: true,\n lineStyle: {\n color: '#EBEFF3'\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryLight,\n fontWeight: 'normal'\n },\n splitLine: {\n show: false,\n lineStyle: {\n color: ['#E0E6F1']\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n valueAxis: {\n axisLine: {\n show: false,\n lineStyle: {\n color: textSecondaryLight\n }\n },\n axisTick: {\n show: false,\n lineStyle: {\n color: textSecondaryLight\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryLight,\n fontWeight: 'normal'\n },\n splitLine: {\n show: true,\n lineStyle: {\n color: 'rgba(228, 232, 237, 0.3)'\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n logAxis: {\n axisLine: {\n show: false,\n lineStyle: {\n color: textSecondaryLight\n }\n },\n axisTick: {\n show: false,\n lineStyle: {\n color: textSecondaryLight\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryLight\n },\n splitLine: {\n show: true,\n lineStyle: {\n color: 'rgba(89, 93, 97, 0.8)'\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n timeAxis: {\n axisLine: {\n show: true,\n lineStyle: {\n // matches CSS --border-color in light mode (rgb(235,239,243))\n color: '#EBEFF3'\n }\n },\n axisTick: {\n show: true,\n lineStyle: {\n color: '#EBEFF3'\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryLight\n },\n splitLine: {\n show: false,\n lineStyle: {\n color: ['#E0E6F1']\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n toolbox: {\n iconStyle: {\n borderColor: '#999999'\n },\n emphasis: {\n iconStyle: {\n borderColor: '#666666'\n }\n }\n },\n legend: {\n textStyle: {\n color: textSecondaryLight,\n fontSize: 10\n },\n pageIconColor: '#4E5969',\n pageIconInactiveColor: '#C9CDD4',\n pageTextStyle: {\n color: textSecondaryLight\n }\n },\n tooltip: {\n axisPointer: {\n lineStyle: {\n color: '#e0e0e0',\n width: 1\n },\n crossStyle: {\n color: '#e0e0e0',\n width: 1\n }\n }\n },\n timeline: {\n lineStyle: {\n color: '#dae1f5',\n width: 2\n },\n itemStyle: {\n color: '#a4b1d7',\n borderWidth: 1\n },\n controlStyle: {\n color: '#a4b1d7',\n borderColor: '#a4b1d7',\n borderWidth: 1\n },\n checkpointStyle: {\n color: '#316bf3',\n borderColor: '#ffffff'\n },\n label: {\n color: '#a4b1d7'\n },\n emphasis: {\n itemStyle: {\n color: '#ffffff'\n },\n controlStyle: {\n color: '#a4b1d7',\n borderColor: '#a4b1d7',\n borderWidth: 1\n },\n label: {\n color: '#a4b1d7'\n }\n }\n },\n visualMap: {\n color: ['#bf444c', '#d88273', '#f6efa6']\n },\n dataZoom: {\n handleSize: 'undefined%',\n textStyle: {}\n },\n markPoint: {\n label: {\n color: '#ebeff3'\n },\n emphasis: {\n label: {\n color: '#ebeff3'\n }\n }\n }\n}\n\nexport const sentioThemeDark = {\n color: sentioColors.dark.classic,\n backgroundColor: 'rgba(0,0,0,0)',\n textStyle: {\n fontSize: 11,\n fontFamily: sansFontFamily,\n textBorderWidth: 0,\n textBorderColor: 'transparent',\n color: textSecondaryDark\n },\n title: {\n textStyle: {\n color: textSecondaryDark\n },\n subtextStyle: {\n color: textSecondaryDark\n }\n },\n line: {\n itemStyle: {\n borderWidth: 1\n },\n lineStyle: {\n width: 2\n },\n symbolSize: 4,\n symbol: 'emptyCircle',\n smooth: false\n },\n radar: {\n itemStyle: {\n borderWidth: 1\n },\n lineStyle: {\n width: 2\n },\n symbolSize: 4,\n symbol: 'emptyCircle',\n smooth: false\n },\n bar: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n pie: {\n itemStyle: {\n borderWidth: 0,\n borderColor: 'transparent'\n },\n label: {\n textBorderWidth: 0,\n textBorderColor: 'transparent',\n color: textSecondaryDark\n }\n },\n scatter: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n boxplot: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n parallel: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n sankey: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n funnel: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n gauge: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n }\n },\n candlestick: {\n itemStyle: {\n color: '#eb5454',\n color0: '#47b262',\n borderColor: '#eb5454',\n borderColor0: '#47b262',\n borderWidth: 1\n }\n },\n graph: {\n itemStyle: {\n borderWidth: 0,\n borderColor: '#ccc'\n },\n lineStyle: {\n width: 1,\n color: '#aaaaaa'\n },\n symbolSize: 4,\n symbol: 'emptyCircle',\n smooth: false,\n color: [\n '#2e71db',\n '#a8d58d',\n '#ffe355',\n '#f05a4d',\n '#56bce5',\n '#73ba46',\n '#ff9f05',\n '#ad56e2',\n '#e97ec2'\n ],\n label: {\n color: '#ebeff3'\n }\n },\n map: {\n itemStyle: {\n areaColor: '#eee',\n borderColor: '#444',\n borderWidth: 0.5\n },\n label: {\n color: '#000'\n },\n emphasis: {\n itemStyle: {\n areaColor: 'rgba(255,215,0,0.8)',\n borderColor: '#444',\n borderWidth: 1\n },\n label: {\n color: 'rgb(100,0,0)'\n }\n }\n },\n geo: {\n itemStyle: {\n areaColor: '#eee',\n borderColor: '#444',\n borderWidth: 0.5\n },\n label: {\n color: '#000'\n },\n emphasis: {\n itemStyle: {\n areaColor: 'rgba(255,215,0,0.8)',\n borderColor: '#444',\n borderWidth: 1\n },\n label: {\n color: 'rgb(100,0,0)'\n }\n }\n },\n categoryAxis: {\n axisLine: {\n show: true,\n lineStyle: {\n // matches CSS --border-color in dark mode (gray-100 = rgb(66,66,72))\n color: '#424248'\n }\n },\n axisTick: {\n show: true,\n lineStyle: {\n color: '#424248'\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryDark,\n fontWeight: 'normal'\n },\n splitLine: {\n show: false,\n lineStyle: {\n color: ['#E0E6F1']\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n valueAxis: {\n axisLine: {\n show: false,\n lineStyle: {\n color: textSecondaryDark\n }\n },\n axisTick: {\n show: false,\n lineStyle: {\n color: textSecondaryDark\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryDark\n },\n splitLine: {\n show: true,\n lineStyle: {\n // softer gridline on the new dark canvas — barely visible\n color: 'rgba(255, 255, 255, 0.05)',\n width: 1,\n opacity: 0.4\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n logAxis: {\n axisLine: {\n show: false,\n lineStyle: {\n color: textSecondaryDark\n }\n },\n axisTick: {\n show: false,\n lineStyle: {\n color: textSecondaryDark\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryDark,\n fontWeight: 'normal'\n },\n splitLine: {\n show: true,\n lineStyle: {\n // softer gridline on the new dark canvas\n color: ['rgba(255, 255, 255, 0.05)'],\n width: 1,\n opacity: 0.4\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n timeAxis: {\n axisLine: {\n show: true,\n lineStyle: {\n // matches CSS --border-color in dark mode (gray-100 = rgb(66,66,72))\n color: '#424248'\n }\n },\n axisTick: {\n show: true,\n lineStyle: {\n color: '#424248'\n }\n },\n axisLabel: {\n show: true,\n color: textSecondaryDark\n },\n splitLine: {\n show: false,\n lineStyle: {\n color: ['#5d6165']\n }\n },\n splitArea: {\n show: false,\n areaStyle: {\n color: ['rgba(250,250,250,0.2)', 'rgba(210,219,238,0.2)']\n }\n }\n },\n toolbox: {\n iconStyle: {\n borderColor: '#999999'\n },\n emphasis: {\n iconStyle: {\n borderColor: '#666666'\n }\n }\n },\n legend: {\n textStyle: {\n color: textSecondaryDark\n },\n pageIconColor: '#909399',\n pageIconInactiveColor: '#606266',\n pageTextStyle: {\n color: textSecondaryDark\n }\n },\n tooltip: {\n axisPointer: {\n lineStyle: {\n color: '#e0e0e0',\n width: 1\n },\n crossStyle: {\n color: '#e0e0e0',\n width: 1\n }\n },\n backgroundColor: '#202020',\n textStyle: {\n color: textSecondaryDark\n }\n },\n timeline: {\n lineStyle: {\n color: '#dae1f5',\n width: 2\n },\n itemStyle: {\n color: '#a4b1d7',\n borderWidth: 1\n },\n controlStyle: {\n color: '#a4b1d7',\n borderColor: '#a4b1d7',\n borderWidth: 1\n },\n checkpointStyle: {\n color: '#316bf3',\n borderColor: '#ffffff'\n },\n label: {\n color: '#a4b1d7'\n },\n emphasis: {\n itemStyle: {\n color: '#ffffff'\n },\n controlStyle: {\n color: '#a4b1d7',\n borderColor: '#a4b1d7',\n borderWidth: 1\n },\n label: {\n color: '#a4b1d7'\n }\n }\n },\n visualMap: {\n color: ['#bf444c', '#d88273', '#f6efa6']\n },\n dataZoom: {\n handleSize: 'undefined%',\n textStyle: {}\n },\n markPoint: {\n label: {\n color: '#ebeff3'\n },\n emphasis: {\n label: {\n color: '#ebeff3'\n }\n }\n }\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react'\n\nclass DarkModeListener {\n private static _instance: DarkModeListener\n private isDarkMode = false\n private listeners: ((isDarkMode: boolean) => void)[] = []\n\n static get instance() {\n if (!this._instance) {\n this._instance = new DarkModeListener()\n }\n return this._instance\n }\n\n constructor() {\n this.init()\n }\n\n public addListener(listener: (isDarkMode: boolean) => void) {\n this.listeners.push(listener)\n }\n\n public removeListener(listener: (isDarkMode: boolean) => void) {\n this.listeners = this.listeners.filter((l) => l !== listener)\n }\n\n public get darkMode() {\n return this.isDarkMode\n }\n\n private _sync(theme: 'light' | 'dark' | 'system' = 'system') {\n let isDarkMode = false\n if (theme === 'system') {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n isDarkMode = mediaQuery.matches\n localStorage.setItem('theme', 'system')\n } else if (theme === 'light') {\n isDarkMode = false\n localStorage.removeItem('theme')\n } else {\n isDarkMode = theme === 'dark'\n localStorage.setItem('theme', 'dark')\n }\n\n this.isDarkMode = isDarkMode\n document.body.classList.remove('light', 'dark')\n document.body.classList.add(isDarkMode ? 'dark' : 'light')\n this.listeners.forEach((listener) => listener(isDarkMode))\n }\n\n public toggleDarkMode() {\n this.isDarkMode = document.body.classList.contains('dark')\n this._sync(this.isDarkMode ? 'light' : 'dark')\n }\n\n public setDarkMode(value: 'light' | 'dark' | 'system') {\n this._sync(value)\n }\n\n private init() {\n this.isDarkMode = document.body.classList.contains('dark')\n // Create a MutationObserver to observe changes in the class attribute\n const observer = new MutationObserver((mutationsList) => {\n for (const mutation of mutationsList) {\n if (\n mutation.type === 'attributes' &&\n mutation.attributeName === 'class'\n ) {\n const isDarkMode = document.body.classList.contains('dark')\n if (this.isDarkMode !== isDarkMode) {\n this.isDarkMode = isDarkMode\n this.listeners.forEach((listener) => listener(isDarkMode))\n }\n }\n }\n })\n\n // Configure the observer to watch for attribute changes\n const config = {\n attributes: true, // Observe attribute changes\n attributeFilter: ['class'] // Only observe changes to the 'class' attribute\n }\n\n // Start observing the body element\n observer.observe(document.body, config)\n }\n}\n\nexport const useDarkMode = (defaultValue = false) => {\n const [isDarkMode, setIsDarkMode] = useState(defaultValue)\n useEffect(() => {\n const instance = DarkModeListener.instance\n setIsDarkMode(instance.darkMode)\n instance.addListener(setIsDarkMode)\n }, [])\n\n return isDarkMode\n}\n\nexport const useSetDarkMode = () => {\n const [value, setValue] = useState('light')\n\n useEffect(() => {\n const instance = DarkModeListener.instance\n\n function syncValue() {\n const currentStorageValue = localStorage.getItem('theme')\n if (currentStorageValue === 'system') {\n setValue('system')\n } else if (!currentStorageValue || currentStorageValue === 'light') {\n setValue('light')\n } else {\n setValue('dark')\n }\n }\n\n syncValue()\n\n instance.addListener(syncValue)\n\n return () => {\n instance.removeListener(syncValue)\n }\n }, [])\n\n return {\n value,\n toggle: useCallback(() => {\n const instance = DarkModeListener.instance\n if (instance) {\n instance.toggleDarkMode()\n }\n }, []),\n onChange: useCallback((value: 'light' | 'dark' | 'system') => {\n const instance = DarkModeListener.instance\n if (instance) {\n instance.setDarkMode(value)\n }\n }, [])\n }\n}\n","import { createContext, useContext } from 'react'\nimport { Button as NewButton, type ButtonProps } from '@sentio/ui-core'\nimport { IoMdRefresh } from 'react-icons/io'\n\nexport const RefreshContext = createContext<{\n refresh?: () => void\n isRefreshing?: boolean\n}>({})\n\nexport const RefreshButton = (props: Partial<ButtonProps>) => {\n const { refresh, isRefreshing } = useContext(RefreshContext)\n if (!refresh) return null\n return (\n <div className=\"grid items-center justify-items-center\">\n <NewButton\n size=\"sm\"\n role=\"text\"\n onClick={(evt) => {\n evt.preventDefault()\n refresh()\n }}\n processing={isRefreshing}\n icon={<IoMdRefresh />}\n className=\"text-text-foreground-secondary!\"\n {...props}\n >\n Retry\n </NewButton>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useResizeDetector } from 'react-resize-detector'\nimport { NewButtonGroup as ButtonGroup } from '@sentio/ui-core'\nimport type { ChartTypeLike } from '../types'\nimport BarGuageIcon from './icons/BarGuageIcon'\nimport QueryValueIcon from './icons/QueryValueIcon'\nimport TableIcon from './icons/TableIcon'\nimport AreaIcon from './icons/AreaIcon'\nimport BarIcon from './icons/BarIcon'\nimport LineIcon from './icons/LineIcon'\nimport PieIcon from './icons/PieIcon'\nimport ScatterIcon from './icons/ScatterIcon'\n\nconst visuals: {\n label: string\n value: ChartTypeLike\n icon: React.ReactNode\n}[] = [\n {\n label: 'Lines',\n value: 'LINE',\n icon: <LineIcon className=\"mr-1 h-4 w-4\" />\n },\n { label: 'Bars', value: 'BAR', icon: <BarIcon className=\"mr-1 h-4 w-4\" /> },\n {\n label: 'Areas',\n value: 'AREA',\n icon: <AreaIcon className=\"mr-1 h-4 w-4\" />\n },\n {\n label: 'Bar Gauge',\n value: 'BAR_GAUGE',\n icon: <BarGuageIcon className=\"mr-1 h-4 w-4\" />\n },\n {\n label: 'Scatter',\n value: 'SCATTER',\n icon: <ScatterIcon className=\"mr-1 h-4 w-4\" />\n },\n {\n label: 'Query Value',\n value: 'QUERY_VALUE',\n icon: <QueryValueIcon className=\"mr-1 h-4 w-4\" />\n },\n {\n label: 'Table',\n value: 'TABLE',\n icon: <TableIcon className=\"mr-1 h-4 w-4\" />\n },\n { label: 'Pie', value: 'PIE', icon: <PieIcon className=\"mr-1 h-4 w-4\" /> }\n]\n\ntype Props = {\n value: ChartTypeLike\n onChange: (value: ChartTypeLike) => void\n small?: boolean\n}\n\nexport const ChartTypeButtonGroup = ({\n value,\n onChange,\n small = false\n}: Props) => {\n const [hideLabel, setHideLabel] = useState(small)\n const { ref } = useResizeDetector<HTMLDivElement>({\n onResize: ({ width }) => {\n if (width) {\n setHideLabel(width < 800)\n }\n },\n refreshMode: 'throttle',\n refreshRate: 100\n })\n return (\n <div className=\"w-full flex-1\" ref={ref}>\n <ButtonGroup\n buttons={visuals}\n value={value}\n onChange={onChange}\n small={small}\n hideLabel={hideLabel}\n />\n </div>\n )\n}\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.12791 1.5625V12.4375C2.12791 12.5938 2.07311 12.7267 1.96349 12.836C1.85387 12.9453 1.7207 13 1.56396 13C1.40722 13 1.27404 12.9453 1.16442 12.836C1.05481 12.7267 1 12.5938 1 12.4375V1.5625C1 1.40617 1.05481 1.27333 1.16442 1.164C1.27404 1.05467 1.40722 1 1.56396 1C1.7207 1 1.85387 1.05467 1.96349 1.164C2.07311 1.27333 2.12791 1.40617 2.12791 1.5625ZM1.56396 11.875H12.436C12.5928 11.875 12.726 11.9297 12.8356 12.039C12.9452 12.1483 13 12.2812 13 12.4375C13 12.5938 12.9452 12.7267 12.8356 12.836C12.726 12.9453 12.5928 13 12.436 13H1.56396C1.40722 13 1.27404 12.9453 1.16442 12.836C1.05481 12.7267 1 12.5938 1 12.4375C1 12.2812 1.05481 12.1483 1.16442 12.039C1.27404 11.9297 1.40722 11.875 1.56396 11.875Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M3.64159 4.02495H9.43859C9.59493 4.02495 9.72776 3.97014 9.83709 3.86052C9.94643 3.75091 10.0011 3.61773 10.0011 3.46099C10.0011 3.30425 9.94643 3.17108 9.83709 3.06146C9.72776 2.95184 9.59493 2.89703 9.43859 2.89703L3.64159 2.89703C3.48526 2.89703 3.35243 2.95184 3.24309 3.06146C3.13376 3.17108 3.07909 3.30425 3.07909 3.46099C3.07909 3.61773 3.13376 3.75091 3.24309 3.86052C3.35243 3.97014 3.48526 4.02495 3.64159 4.02495Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M3.64209 10.0244H11.4701C11.6264 10.0244 11.7593 9.96964 11.8686 9.86002C11.9779 9.7504 12.0326 9.61723 12.0326 9.46049C12.0326 9.30375 11.9779 9.17057 11.8686 9.06096C11.7593 8.95134 11.6264 8.89653 11.4701 8.89653H3.64209C3.48576 8.89653 3.35293 8.95134 3.24359 9.06096C3.13426 9.17057 3.07959 9.30375 3.07959 9.46049C3.07959 9.61723 3.13426 9.7504 3.24359 9.86002C3.35293 9.96964 3.48576 10.0244 3.64209 10.0244Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M3.64209 7.01668L7.47009 7.01668C7.62643 7.01634 7.75926 6.95886 7.86859 6.84423C7.97793 6.7296 8.03259 6.5991 8.03259 6.45272C8.03259 6.29598 7.97793 6.1628 7.86859 6.05319C7.75926 5.94357 7.62643 5.88876 7.47009 5.88876H3.64209C3.48576 5.88876 3.35293 5.94357 3.24359 6.05319C3.13426 6.1628 3.07959 6.29598 3.07959 6.45272C3.07959 6.60946 3.13426 6.74263 3.24359 6.85225C3.35293 6.96187 3.48576 7.01668 3.64209 7.01668Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_3670_4424)\">\n <path\n d=\"M11.5 1.5H2.5C1.67157 1.5 1 2.11561 1 2.875V11.125C1 11.8844 1.67157 12.5 2.5 12.5H11.5C12.3284 12.5 13 11.8844 13 11.125V2.875C13 2.11561 12.3284 1.5 11.5 1.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7.98188 5.77273H6.39097L5.75461 5.13636L6.39097 4.5H7.98188L8.61824 5.13636L7.98188 5.77273Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M7.98188 11.5H6.39097L5.75461 10.8637L6.39097 10.2273H7.98188L8.61824 10.8637L7.98188 11.5Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M8.30005 9.90907V6.09089L8.93641 5.45453L9.57278 6.09089V9.90907L8.93641 10.5454L8.30005 9.90907Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M4.80005 9.90907V6.09089L5.43641 5.45453L6.07278 6.09089V9.90907L5.43641 10.5454L4.80005 9.90907Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M1 3.5L13 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_3670_4424\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\n\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_3670_4416)\">\n <path\n d=\"M11.5 2H2.5C1.67157 2 1 2.55964 1 3.25V10.75C1 11.4404 1.67157 12 2.5 12H11.5C12.3284 12 13 11.4404 13 10.75V3.25C13 2.55964 12.3284 2 11.5 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M1 5L13 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6 2L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_3670_4416\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\n\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_1774_9545)\">\n <path\n d=\"M12.6193 13.1249H1.35364C1.21685 13.1249 1.10062 13.0771 1.00495 12.9814C0.909284 12.8857 0.86145 12.7695 0.86145 12.6327V1.35352C0.86145 1.21672 0.909284 1.10049 1.00495 1.00483C1.10062 0.909161 1.21685 0.861328 1.35364 0.861328C1.49043 0.861328 1.60666 0.909161 1.70233 1.00483C1.79799 1.10049 1.84583 1.21672 1.84583 1.35352V12.1405H12.6193C12.7561 12.1405 12.8723 12.1883 12.968 12.284C13.0636 12.3797 13.1115 12.4959 13.1115 12.6327C13.1115 12.7695 13.0636 12.8857 12.968 12.9814C12.8723 13.0771 12.7561 13.1249 12.6193 13.1249ZM2.62501 10.9374L4.22451 8.08008C4.26097 8.0162 4.31566 7.97289 4.38858 7.95014C4.46149 7.92739 4.53441 7.92972 4.60733 7.95714L6.12501 8.66808L7.73851 6.33008C7.83885 6.19329 7.96193 6.16135 8.10776 6.23427L9.61189 6.99989L11.7994 3.56814C11.8633 3.46781 11.9521 3.43368 12.0658 3.46577C12.1796 3.49785 12.2366 3.5731 12.2369 3.69152V10.8009C12.2369 10.9467 12.1845 11.072 12.0798 11.1767C11.9751 11.2814 11.8498 11.3338 11.704 11.3338H2.87176C2.77143 11.3338 2.69399 11.2905 2.63945 11.2038C2.58491 11.1172 2.58039 11.0284 2.62589 10.9374H2.62501Z\"\n fill=\"currentColor\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1774_9545\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\n\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M2.12791 1.5625V12.4375C2.12791 12.5938 2.07311 12.7267 1.96349 12.836C1.85387 12.9453 1.7207 13 1.56396 13C1.40722 13 1.27404 12.9453 1.16442 12.836C1.05481 12.7267 1 12.5938 1 12.4375V1.5625C1 1.40617 1.05481 1.27333 1.16442 1.164C1.27404 1.05467 1.40722 1 1.56396 1C1.7207 1 1.85387 1.05467 1.96349 1.164C2.07311 1.27333 2.12791 1.40617 2.12791 1.5625ZM1.56396 11.875H12.436C12.5928 11.875 12.726 11.9297 12.8356 12.039C12.9452 12.1483 13 12.2812 13 12.4375C13 12.5938 12.9452 12.7267 12.8356 12.836C12.726 12.9453 12.5928 13 12.436 13H1.56396C1.40722 13 1.27404 12.9453 1.16442 12.836C1.05481 12.7267 1 12.5938 1 12.4375C1 12.2812 1.05481 12.1483 1.16442 12.039C1.27404 11.9297 1.40722 11.875 1.56396 11.875ZM5.12014 4.578V10.375C5.12014 10.5313 5.06534 10.6642 4.95572 10.7735C4.8461 10.8828 4.71293 10.9375 4.55619 10.9375C4.39945 10.9375 4.26627 10.8828 4.15665 10.7735C4.04704 10.6642 3.99223 10.5313 3.99223 10.375V4.578C3.99223 4.42167 4.04704 4.28883 4.15665 4.1795C4.26627 4.07017 4.39945 4.0155 4.55619 4.0155C4.71293 4.0155 4.8461 4.07017 4.95572 4.1795C5.06534 4.28883 5.12014 4.42167 5.12014 4.578ZM11.1196 2.5465V10.3745C11.1196 10.5308 11.0648 10.6637 10.9552 10.773C10.8456 10.8823 10.7124 10.937 10.5557 10.937C10.3989 10.937 10.2658 10.8823 10.1562 10.773C10.0465 10.6637 9.99173 10.5308 9.99173 10.3745V2.5465C9.99173 2.39017 10.0465 2.25733 10.1562 2.148C10.2658 2.03867 10.3989 1.984 10.5557 1.984C10.7124 1.984 10.8456 2.03867 10.9552 2.148C11.0648 2.25733 11.1196 2.39017 11.1196 2.5465ZM8.11187 6.5465V10.3745C8.11187 10.5308 8.05706 10.6637 7.94745 10.773C7.83783 10.8823 7.70465 10.937 7.54792 10.937C7.39118 10.937 7.258 10.8823 7.14838 10.773C7.03877 10.6637 6.98396 10.5308 6.98396 10.3745V6.5465C6.98396 6.39017 7.03877 6.25733 7.14838 6.148C7.258 6.03867 7.39118 5.984 7.54792 5.984C7.69429 5.984 7.8248 6.03867 7.93943 6.148C8.05406 6.25733 8.11154 6.39017 8.11187 6.5465Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\n\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_1774_9563)\">\n <path\n d=\"M12.6191 13.1249H1.35352C1.21672 13.1249 1.10049 13.0771 1.00483 12.9814C0.909161 12.8857 0.861328 12.7695 0.861328 12.6327V1.35352C0.861328 1.21672 0.909161 1.10049 1.00483 1.00483C1.10049 0.909161 1.21672 0.861328 1.35352 0.861328C1.49031 0.861328 1.60654 0.909161 1.7022 1.00483C1.79787 1.10049 1.8457 1.21672 1.8457 1.35352V12.1405H12.6191C12.7559 12.1405 12.8722 12.1883 12.9678 12.284C13.0635 12.3797 13.1113 12.4959 13.1113 12.6327C13.1113 12.7695 13.0635 12.8857 12.9678 12.9814C12.8722 13.0771 12.7559 13.1249 12.6191 13.1249ZM5.26345 10.1582C5.0902 10.1582 4.95341 10.0853 4.85308 9.93945L2.7067 6.52127C2.63379 6.40285 2.61104 6.27758 2.63845 6.14545C2.66587 6.01333 2.73645 5.91081 2.8502 5.83789C2.96395 5.76497 3.08704 5.74222 3.21945 5.76964C3.35187 5.79706 3.45439 5.86545 3.52702 5.97483L5.05827 8.46333L5.68739 6.04352C5.72385 5.89768 5.81047 5.79283 5.94727 5.72895L8.43576 4.52583C8.55418 4.47099 8.67274 4.45962 8.79145 4.4917C8.91016 4.52379 9.00583 4.59437 9.07845 4.70345L10.3227 6.72689L12.155 1.21702C12.2005 1.08927 12.2826 0.993599 12.4013 0.930016C12.52 0.866432 12.6431 0.857245 12.7705 0.902453C12.898 0.947661 12.9936 1.02977 13.0575 1.14877C13.1214 1.26777 13.1306 1.39085 13.0851 1.51802L10.9247 8.03939C10.8608 8.24006 10.724 8.35177 10.5143 8.37452C10.3046 8.39727 10.1451 8.32202 10.0357 8.14877L8.46333 5.60558L6.59039 6.50814L5.74252 9.78939C5.68768 9.9991 5.55556 10.1177 5.34614 10.1451C5.31872 10.1541 5.29131 10.1586 5.26389 10.1586L5.26345 10.1582Z\"\n fill=\"currentColor\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1774_9563\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\n\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_28267_7202)\">\n <path\n d=\"M5.83329 1.86662C4.92079 2.07816 4.08149 2.52998 3.40247 3.17523C2.72345 3.82048 2.22942 4.63564 1.97164 5.53618C1.71386 6.43671 1.70171 7.38982 1.93644 8.29663C2.17118 9.20345 2.64426 10.0309 3.30661 10.6933C3.96896 11.3556 4.79646 11.8287 5.70327 12.0635C6.61009 12.2982 7.56319 12.286 8.46373 12.0283C9.36426 11.7705 10.1794 11.2765 10.8247 10.5974C11.4699 9.91841 11.9217 9.07912 12.1333 8.16662C12.1333 8.01191 12.0718 7.86353 11.9624 7.75414C11.853 7.64474 11.7047 7.58328 11.55 7.58328H7.58329C7.27387 7.58328 6.97713 7.46037 6.75833 7.24157C6.53954 7.02278 6.41662 6.72604 6.41662 6.41662V2.33328C6.40938 2.26417 6.38848 2.19719 6.35515 2.13621C6.32182 2.07524 6.27671 2.02149 6.22245 1.97808C6.16819 1.93467 6.10585 1.90247 6.03905 1.88333C5.97224 1.8642 5.90231 1.85852 5.83329 1.86662Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.75 2.04175C9.49067 2.30255 10.1634 2.72617 10.7187 3.28142C11.2739 3.83668 11.6975 4.50941 11.9583 5.25008H9.33333C9.17862 5.25008 9.03025 5.18862 8.92085 5.07923C8.81146 4.96983 8.75 4.82146 8.75 4.66675V2.04175Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_28267_7202\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SvgIcon\n","import React from 'react'\n\ninterface Props {\n className?: string\n}\n\nconst SvgIcon = ({ className }: Props) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_28248_7302)\">\n <path\n d=\"M1.75 1.75V12.25H12.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.66663 8.75879V8.76754\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9.33337 9.34204V9.35079\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.66663 4.10083V4.10958\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7 6.43408V6.44283\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M11.0834 6.43408V6.44283\"\n stroke=\"currentColor\"\n strokeWidth=\"1.16667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_28248_7302\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n)\n\nexport default SvgIcon\n","import { Fragment, ReactNode, useMemo } from 'react'\nimport dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc'\nimport timezone from 'dayjs/plugin/timezone'\nimport { isNumber, some, sortBy } from 'lodash'\nimport BigDecimal from '@sentio/bigdecimal'\nimport { LuCircleUserRound, LuList } from 'react-icons/lu'\nimport { CopyButton, classNames, type DurationLike } from '@sentio/ui-core'\nimport { durationToLongString } from './duration'\n\ndayjs.extend(utc)\ndayjs.extend(timezone)\n\ninterface Props {\n data: any\n compareTimeDuration?: DurationLike\n numberFormatter: (value: number, seriesId?: string) => string\n highlightSeriesId?: string\n title?: ReactNode\n showTotal?: boolean\n onViewLogs?: (seriesId: string, seriesIndex: number) => void\n viewLogDisabled?: (seriesId: string, seriesIndex: number) => boolean\n onViewUsers?: (seriesId: string, seriesIndex: number) => void\n viewUsersDisabled?: (seriesId: string, seriesIndex: number) => boolean\n isFixed?: boolean\n}\n\nfunction isValidValue(value: any, includeZero: boolean) {\n if (includeZero) {\n return Number.isFinite(value)\n } else {\n return Number.isFinite(value) && value !== 0\n }\n}\n\nexport function ChartTooltip({\n data,\n numberFormatter,\n compareTimeDuration,\n highlightSeriesId,\n title,\n showTotal,\n onViewLogs,\n viewLogDisabled,\n onViewUsers,\n viewUsersDisabled,\n isFixed\n}: Props) {\n const {\n series,\n hasCompare,\n hasCurrent,\n currentTime,\n compareTime,\n markers,\n compareMarkers,\n total,\n compareTotal\n } = useMemo(() => {\n const params = sortBy(data, (p) => -p.value[1])\n const hasCompare = some(params, (param) =>\n param.seriesId.endsWith('_compare')\n )\n const seriesData: Record<string, any> = {}\n const markers: Record<string, string> = {}\n const compareMarkers: Record<string, string> = {}\n let currentTime: dayjs.Dayjs | undefined\n let compareTime: dayjs.Dayjs | undefined\n let total = new BigDecimal(0)\n let compareTotal = new BigDecimal(0)\n\n for (const p of params) {\n const { marker, seriesName, value, seriesId } = p\n if (seriesId.endsWith('_compare')) {\n const id = seriesId.replace('_compare', '')\n compareMarkers[id] = marker\n if (compareTime === undefined) {\n compareTime = dayjs(value[0])\n }\n if (isValidValue(value[1], hasCompare)) {\n seriesData[id] = {\n seriesId: id,\n ...seriesData[id],\n compareValue: value[1],\n compareTime: value[0],\n seriesName\n }\n compareTotal = compareTotal.plus(value[1])\n }\n } else {\n markers[seriesId] = marker\n if (currentTime === undefined) {\n currentTime = dayjs(value[0])\n }\n if (isValidValue(value[1], hasCompare)) {\n seriesData[seriesId] = {\n seriesId,\n ...seriesData[seriesId],\n time: value[0],\n value: value[1],\n seriesName\n }\n total = total.plus(value[1])\n }\n }\n }\n const series = sortBy(Object.values(seriesData), (s) => -s.value)\n const hasCurrent = series[0]?.value !== undefined\n if (compareTimeDuration && compareTime && !currentTime) {\n currentTime = compareTime.add(\n Number(compareTimeDuration.value!),\n compareTimeDuration.unit as any\n )\n }\n return {\n series,\n hasCompare,\n currentTime,\n compareTime,\n hasCurrent,\n markers,\n compareMarkers,\n total,\n compareTotal\n }\n }, [data])\n\n const renderRow = (p: any, idx: number) => {\n const { seriesName, compareValue, value, seriesId } = p\n const highlighted = seriesId === highlightSeriesId\n const marker = markers[seriesId]\n // const diff = undefined\n const diff =\n hasCompare && hasCurrent && compareValue != null && value != null\n ? new BigDecimal(value).minus(compareValue).div(compareValue).toNumber()\n : undefined\n\n const showViewLogs = onViewLogs && !viewLogDisabled?.(seriesId, idx)\n const showViewUsers = onViewUsers && !viewUsersDisabled?.(seriesId, idx)\n\n return (\n <Fragment key={idx}>\n <div\n key={idx}\n className={classNames(\n 'sentio-tooltip-item series-name text-text-foreground inline-flex items-center overflow-hidden',\n 'group',\n highlighted ? 'highlighted' : ''\n )}\n style={{ minWidth: '4rem' }}\n >\n <span dangerouslySetInnerHTML={{ __html: marker || '' }}></span>\n <span className=\"truncate\">{seriesName}</span>\n {showViewLogs && isFixed && (\n <button\n className=\"text-text-foreground/60 hover:text-text-foreground invisible ml-1 text-xs underline group-hover:visible\"\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onViewLogs(seriesId, idx)\n }}\n title=\"View logs\"\n >\n <LuList className=\"h-4 w-4\" />\n </button>\n )}\n {showViewUsers && isFixed && (\n <button\n className=\"text-text-foreground/60 hover:text-text-foreground invisible ml-1 text-xs underline group-hover:visible\"\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onViewUsers(seriesId, idx)\n }}\n title=\"View users\"\n >\n <LuCircleUserRound className=\"h-4 w-4\" />\n </button>\n )}\n {isFixed && (\n <CopyButton\n size={16}\n text={seriesName}\n className=\"invisible ml-1 group-hover:visible\"\n />\n )}\n </div>\n\n <div\n key={`${idx}-value`}\n className={classNames(\n 'sentio-tooltip-item min-w-16 flex items-center truncate pl-1 text-right font-semibold',\n highlighted ? 'highlighted' : ''\n )}\n >\n <span>{hasCurrent ? numberFormatter(value, seriesId) : '-'}</span>\n {diff !== undefined && Number.isFinite(diff) && (\n <span\n className={classNames(\n 'ml-1 text-xs',\n diff > 0 ? 'text-green-500' : 'text-red'\n )}\n >\n {diff > 0 ? '+' : ''}\n {(diff * 100).toFixed(2)}%\n </span>\n )}\n </div>\n </Fragment>\n )\n }\n\n const renderCompareRow = (p: any, idx: number) => {\n const { seriesName, compareValue, seriesId } = p\n const highlighted = seriesId === highlightSeriesId\n const compareMarker = compareMarkers[seriesId]\n return (\n <Fragment key={idx}>\n <div\n key={idx}\n className={classNames(\n 'sentio-tooltip-item sentio-tooltip-compare-item series-name text-text-foreground-secondary truncate',\n highlighted ? 'highlighted' : ''\n )}\n style={{ minWidth: '4rem' }}\n >\n <span\n dangerouslySetInnerHTML={{ __html: compareMarker || '' }}\n ></span>\n {seriesName}\n </div>\n\n <div\n key={`${idx}-value`}\n className={classNames(\n 'sentio-tooltip-item min-w-16 text-text-foreground-secondary truncate pl-1 text-right font-semibold',\n highlighted ? 'highlighted' : ''\n )}\n >\n {isNumber(compareValue)\n ? numberFormatter(compareValue, seriesId)\n : '-'}\n </div>\n </Fragment>\n )\n }\n\n const renderTotalRow = () => {\n if (!showTotal || series.length < 2) return null\n\n const diff =\n hasCompare && hasCurrent && total && compareTotal\n ? total.minus(compareTotal).div(compareTotal).toNumber()\n : undefined\n\n return (\n <div className=\"border-border-color col-span-2 mt-1 flex items-center justify-between border-t pt-1\">\n <div className=\"sentio-tooltip-item series-name text-text-foreground truncate font-semibold\">\n Total\n </div>\n <div className=\"sentio-tooltip-item min-w-16 flex items-center truncate pl-1 text-right font-semibold\">\n <span>{hasCurrent ? numberFormatter(total.toNumber()) : '-'}</span>\n {diff !== undefined && Number.isFinite(diff) && (\n <span\n className={classNames(\n 'ml-1 text-xs',\n diff > 0 ? 'text-green-500' : 'text-red'\n )}\n >\n {diff > 0 ? '+' : ''}\n {(diff * 100).toFixed(2)}%\n </span>\n )}\n </div>\n </div>\n )\n }\n\n const renderCompareTotalRow = () => {\n if (!showTotal || series.length < 2 || !hasCompare) return null\n\n return (\n <div className=\"border-border-color col-span-2 mt-1 flex items-center justify-between border-t pt-1\">\n <div className=\"sentio-tooltip-item sentio-tooltip-compare-item series-name text-text-foreground-secondary truncate font-semibold\">\n Total\n </div>\n <div className=\"sentio-tooltip-item min-w-16 text-text-foreground-secondary truncate pl-1 text-right font-semibold\">\n {isNumber(compareTotal)\n ? numberFormatter(compareTotal.toNumber())\n : '-'}\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={classNames('grid w-full px-2')}\n style={{ gridTemplateColumns: '1fr auto' }}\n >\n <div\n className={classNames(\n 'pl-2',\n 'text-text-foreground-secondary col-span-2 text-left'\n )}\n >\n {title ?? currentTime?.format('YYYY-MM-DD HH:mm:ss')}\n </div>\n {!series || series.length === 0 ? (\n <div className=\"text-text-foreground-secondary pl-2 text-sm\">\n No data available\n </div>\n ) : (\n <>\n {series.map((s, idx) => renderRow(s, idx))}\n {renderTotalRow()}\n {hasCompare && compareTimeDuration && (\n <>\n <div\n className={classNames(\n 'mt-2 pl-2',\n 'text-text-foreground-secondary col-span-2 text-left'\n )}\n >\n {compareTime?.format('YYYY-MM-DD HH:mm:ss')} (previous{' '}\n {durationToLongString(compareTimeDuration)})\n </div>\n {series.map((s, idx) => renderCompareRow(s, idx))}\n {renderCompareTotalRow()}\n </>\n )}\n </>\n )}\n </div>\n )\n}\n","import type { DurationLike } from '@sentio/ui-core'\n\nconst longUnits: Record<string, string> = {\n s: 'seconds',\n m: 'minutes',\n h: 'hours',\n d: 'days',\n w: 'weeks',\n M: 'months',\n y: 'years'\n}\n\n// \"previous hour\" / \"previous days\" — count drives singular/plural, count itself\n// not shown (matches app lib/time.durationToLongString).\nexport function durationToLongString(d: DurationLike): string {\n const u = longUnits[d.unit ?? ''] ?? ''\n return Number(d.value) === 1 ? u.replace(/s$/, '') : u\n}\n","import { Fragment, ReactNode, useMemo } from 'react'\nimport dayjs from 'dayjs'\nimport utc from 'dayjs/plugin/utc'\nimport timezone from 'dayjs/plugin/timezone'\nimport { isNumber } from 'lodash'\nimport { LuCircleUserRound, LuList } from 'react-icons/lu'\nimport { CopyButton, classNames, type DurationLike } from '@sentio/ui-core'\n\ndayjs.extend(utc)\ndayjs.extend(timezone)\n\ninterface Props {\n data: any\n compareTimeDuration?: DurationLike\n numberFormatter: (value: number) => string\n highlightSeriesId?: string\n title?: ReactNode\n onViewLogs?: (seriesId: string, seriesIndex: number) => void\n viewLogDisabled?: (seriesId: string, seriesIndex: number) => boolean\n onViewUsers?: (seriesId: string, seriesIndex: number) => void\n viewUsersDisabled?: (seriesId: string, seriesIndex: number) => boolean\n isFixed?: boolean\n sizeTitle?: string\n}\n\nexport function ScatterChartTooltip({\n data,\n numberFormatter,\n highlightSeriesId,\n title,\n onViewLogs,\n viewLogDisabled,\n onViewUsers,\n viewUsersDisabled,\n isFixed,\n sizeTitle = 'Size'\n}: Props) {\n const { point, seriesName, seriesId, marker } = useMemo(() => {\n // For scatter charts, data is typically a single point\n const param = Array.isArray(data) ? data[0] : data\n\n return {\n point: param,\n seriesName: param?.seriesName || '',\n seriesId: param?.seriesId || '',\n marker: param?.marker || ''\n }\n }, [data])\n\n if (!point || !point.value) {\n return (\n <div className=\"w-full px-2\">\n <div className=\"text-text-foreground-secondary pl-2 text-sm\">\n No data available\n </div>\n </div>\n )\n }\n\n const { value } = point\n const [xValue, yValue, sizeValue] = value\n\n const highlighted = seriesId === highlightSeriesId\n const showViewLogs = onViewLogs && !viewLogDisabled?.(seriesId, 0)\n const showViewUsers = onViewUsers && !viewUsersDisabled?.(seriesId, 0)\n\n const formatValue = (val: any) => {\n if (val instanceof Date) {\n return dayjs(val).format('YYYY-MM-DD HH:mm:ss')\n } else if (isNumber(val)) {\n return numberFormatter(val)\n } else {\n return String(val)\n }\n }\n\n return (\n <div\n className={classNames('grid w-full px-2')}\n style={{ gridTemplateColumns: '1fr auto' }}\n >\n {/* Title */}\n <div\n className={classNames(\n 'mb-2 pl-2',\n 'text-text-foreground-secondary col-span-2 text-left'\n )}\n >\n {title ?? dayjs(xValue).format('YYYY-MM-DD HH:mm:ss')}\n </div>\n\n {/* Main Series Row */}\n <div\n className={classNames(\n 'sentio-tooltip-item series-name text-text-foreground inline-flex items-center overflow-hidden',\n 'group',\n highlighted ? 'highlighted' : ''\n )}\n style={{ minWidth: '4rem' }}\n >\n <span dangerouslySetInnerHTML={{ __html: marker || '' }}></span>\n <span className=\"truncate\">{seriesName}</span>\n {showViewLogs && isFixed && (\n <button\n className=\"text-text-foreground/60 hover:text-text-foreground invisible ml-1 text-xs underline group-hover:visible\"\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onViewLogs(seriesId, 0)\n }}\n title=\"View logs\"\n >\n <LuList className=\"h-4 w-4\" />\n </button>\n )}\n {showViewUsers && isFixed && (\n <button\n className=\"text-text-foreground/60 hover:text-text-foreground invisible ml-1 text-xs underline group-hover:visible\"\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onViewUsers(seriesId, 0)\n }}\n title=\"View users\"\n >\n <LuCircleUserRound className=\"h-4 w-4\" />\n </button>\n )}\n {isFixed && (\n <CopyButton\n size={16}\n text={seriesName}\n className=\"invisible ml-1 group-hover:visible\"\n />\n )}\n </div>\n\n {/* Y Value */}\n <div\n className={classNames(\n 'sentio-tooltip-item min-w-16 flex items-center truncate pl-1 text-right font-semibold',\n highlighted ? 'highlighted' : ''\n )}\n >\n <span>{formatValue(yValue)}</span>\n </div>\n\n {/* Additional Dimensions */}\n {sizeValue !== undefined && sizeValue !== null && (\n <Fragment>\n <div className=\"border-border-color col-span-2 my-2 w-full border-t\"></div>\n <div\n className=\"sentio-tooltip-item series-name text-text-foreground-secondary truncate\"\n style={{ minWidth: '4rem' }}\n >\n {sizeTitle}\n </div>\n <div className=\"sentio-tooltip-item min-w-16 text-text-foreground-secondary truncate pl-1 text-right font-semibold\">\n {formatValue(sizeValue)}\n </div>\n </Fragment>\n )}\n </div>\n )\n}\n","import { CSSProperties, forwardRef, useEffect, useState } from 'react'\nimport type { ECharts } from 'echarts/core'\nimport { useResizeDetector } from 'react-resize-detector'\nimport { EChartsHandle, EChartsOption, ReactEChartsBase } from './EchartsBase'\nimport { useDarkMode } from '../utils/use-dark-mode'\nimport { isMobile as detectMobile } from '../utils/is-mobile'\nimport type { ChartConfigLike } from '../types'\n\nconst theresholdWidth = 480\n\n// Min gap kept between the tooltip and each window edge.\nconst TOOLTIP_MIN_VIEWPORT_LEFT = 8\nconst TOOLTIP_MIN_VIEWPORT_RIGHT = 8\n\n/** Minimal shape consumed from a computed series — only name + first data point. */\nexport interface PieSeriesInput {\n name: string\n data: any[]\n}\n\nexport interface PieChartProps {\n /** Already-computed series (app runs the worker compute and passes the result). */\n series: PieSeriesInput[]\n /** Formats a slice value for tooltip/legend display. */\n valueFormatter: (value: number) => string\n config?: ChartConfigLike\n title?: string\n minHeight?: number\n loading?: boolean\n style?: CSSProperties\n onInitChart?: (chart: ECharts) => void\n}\n\nexport const PieChart = forwardRef<EChartsHandle, PieChartProps>(\n (props: PieChartProps, ref) => {\n const {\n series,\n valueFormatter,\n config,\n title,\n minHeight,\n loading,\n style,\n onInitChart\n } = props\n const [options, setOptions] = useState<EChartsOption>({})\n const isDarkMode = useDarkMode()\n const isMobile = detectMobile()\n const { width, ref: resizeRef } = useResizeDetector({\n refreshMode: 'debounce',\n refreshRate: 500,\n handleHeight: false\n })\n\n // Place tooltip near cursor while keeping it inside the viewport\n // (with extra reserved padding on the left for the app sidebar).\n // Coordinates returned are in chart-container space — ECharts translates\n // them to document coords when `appendToBody` is set.\n const tooltipPosition = (\n point: [number, number],\n _params: unknown,\n _dom: HTMLElement | unknown,\n _rect: unknown,\n size: { contentSize: [number, number]; viewSize: [number, number] }\n ): [number, number] => {\n const chartRect = (\n resizeRef as React.RefObject<HTMLDivElement>\n ).current?.getBoundingClientRect()\n const chartLeft = chartRect?.left ?? 0\n const winW =\n typeof window !== 'undefined' ? window.innerWidth : size.viewSize[0]\n const [w, h] = size.contentSize\n\n const minXInChart = TOOLTIP_MIN_VIEWPORT_LEFT - chartLeft\n const maxXInChart = winW - TOOLTIP_MIN_VIEWPORT_RIGHT - chartLeft - w\n\n let x = point[0] + 12\n if (x > maxXInChart) {\n x = point[0] - w - 12\n }\n if (x < minXInChart) x = minXInChart\n if (x > maxXInChart) x = maxXInChart\n\n const y = Math.max(0, point[1] - h / 2)\n return [x, y]\n }\n\n useEffect(() => {\n const isHLegend = width && width < theresholdWidth\n\n // Tooltip wrapping/clamping — mobile only.\n // ECharts tooltips default to `white-space: nowrap`, so a single long\n // label (e.g. a full token name) produces a wide tooltip. With\n // `appendToBody: true` that tooltip lives on <body>; near the right edge\n // of the viewport it can push past `innerWidth` and trigger horizontal\n // scroll or unwanted zoom on mobile. Cap the width and force wrapping\n // ONLY on mobile — desktop keeps the default behavior.\n const winW = typeof window !== 'undefined' ? window.innerWidth : 1024\n const tooltipMaxWidth = Math.max(160, Math.min(280, winW - 48))\n const tooltipExtraCss = isMobile\n ? `max-width: ${tooltipMaxWidth}px; white-space: normal; word-break: break-word; overflow-wrap: anywhere;`\n : ''\n\n const d = [] as any[]\n series.forEach((s) => {\n if (s.data.length > 0 && s.data[0] && s.data[0][1] != null) {\n const rawValue = s.data[0][1]\n if (config?.pieConfig?.absValue) {\n d.push({ name: s.name, value: Math.abs(rawValue) })\n } else if (rawValue > 0) {\n d.push({ name: s.name, value: rawValue })\n }\n }\n })\n\n const total = d.reduce((acc, cur) => acc + cur.value, 0)\n d.sort((a, b) => {\n const percentA = (a.value / total) * 100\n const percentB = (b.value / total) * 100\n return percentB - percentA\n })\n\n const pieSeries = [\n {\n type: 'pie',\n radius: [config?.pieConfig?.pieType == 'Donut' ? '40%' : 0, '70%'],\n center: isHLegend ? ['50%', '50%'] : ['35%', '50%'],\n label: { show: false },\n labelLine: { length: 10, length2: 10, maxSurfaceAngle: 50 },\n data: d\n }\n ]\n const options: EChartsOption = {\n title: { text: title, left: 8 },\n legend: isHLegend\n ? {\n type: 'scroll',\n orient: 'horizontal',\n bottom: 12,\n left: 'center',\n animation: true,\n animationDurationUpdate: 300,\n pageIconSize: [10, 8],\n pageButtonItemGap: 2,\n pageButtonGap: 4,\n textStyle: {\n width: width ? width * 0.4 : 100,\n overflow: 'truncate'\n },\n tooltip: {\n show: true,\n appendToBody: true,\n extraCssText: tooltipExtraCss,\n position: tooltipPosition,\n formatter: function (params: any) {\n const name = params.name\n const item = d.find((i) => i.name === name)\n let ret = name\n if (config?.pieConfig?.showValue && item) {\n ret += '<br/>' + valueFormatter(item.value)\n }\n if (config?.pieConfig?.showPercent && item) {\n const percent = (\n (item.value /\n d.reduce((acc, cur) => acc + cur.value, 0)) *\n 100\n ).toFixed(2)\n ret += config.pieConfig.showValue\n ? ` • ${percent}%`\n : `\\n${percent}%`\n }\n return ret\n }\n }\n }\n : {\n type: 'scroll',\n orient: 'vertical',\n right: 16,\n top: title ? 48 : 8,\n width: '35%',\n animation: true,\n animationDurationUpdate: 300,\n tooltip: {\n show: true,\n appendToBody: true,\n extraCssText: tooltipExtraCss,\n position: tooltipPosition,\n formatter: function (params: any) {\n const name = params.name\n const item = d.find((i) => i.name === name)\n let ret = name\n if (config?.pieConfig?.showValue && item) {\n ret += '<br/>' + valueFormatter(item.value)\n }\n if (config?.pieConfig?.showPercent && item) {\n const percent = (\n (item.value /\n d.reduce((acc, cur) => acc + cur.value, 0)) *\n 100\n ).toFixed(2)\n ret += config.pieConfig.showValue\n ? ` • ${percent}%`\n : `\\n${percent}%`\n }\n return ret\n }\n },\n icon: 'roundRect',\n itemWidth: 12,\n itemHeight: 12,\n itemGap: 6,\n show: true,\n pageIconSize: [8, 10],\n pageButtonGap: 4,\n pageButtonItemGap: 2,\n pageIconColor: isDarkMode ? '#909399' : '#4E5969',\n pageIconInactiveColor: isDarkMode ? '#606266' : '#C9CDD4',\n textStyle: {\n width: width ? width * 0.3 : 'auto',\n overflow: 'truncate',\n lineHeight: 16,\n fontSize: 12,\n rich: { value: { padding: [4, 0, 0, 0] } }\n },\n formatter: (name: string) => {\n const item = d.find((i) => i.name === name)\n let ret = name\n if (config?.pieConfig?.showValue && item) {\n ret += '\\n' + valueFormatter(item.value)\n }\n if (config?.pieConfig?.showPercent && item) {\n const percent = (\n (item.value / d.reduce((acc, cur) => acc + cur.value, 0)) *\n 100\n ).toFixed(2)\n ret += config.pieConfig.showValue\n ? ` • ${percent}%`\n : `\\n${percent}%`\n }\n return ret\n }\n },\n tooltip: {\n trigger: 'item',\n appendToBody: true,\n extraCssText: tooltipExtraCss,\n position: tooltipPosition,\n formatter: ({ name, data, percent }: any) => {\n let ret = `${name}`\n if (config?.pieConfig?.showValue) {\n ret += '<br/>' + valueFormatter(data.value)\n }\n if (config?.pieConfig?.showPercent) {\n ret += config.pieConfig.showValue\n ? ` (${percent}%)`\n : `\\n${percent}%`\n }\n return ret\n }\n },\n toolbox: { show: false },\n animation: false,\n series: pieSeries as any\n }\n setOptions(options)\n }, [series, config, valueFormatter, isDarkMode, isMobile, width, title])\n\n return (\n <div className=\"h-full w-full\" ref={resizeRef}>\n <ReactEChartsBase\n ref={ref}\n loading={loading}\n option={options}\n minHeight={minHeight}\n style={style}\n noLegend\n onInitChart={onInitChart}\n />\n </div>\n )\n }\n)\n\nPieChart.displayName = 'PieChart'\n","import { CSSProperties, forwardRef, useEffect, useMemo, useState } from 'react'\nimport type { ECharts } from 'echarts/core'\nimport type { YAXisComponentOption } from 'echarts'\nimport { EChartsHandle, EChartsOption, ReactEChartsBase } from './EchartsBase'\nimport type { ChartConfigLike } from '../types'\nimport type { PieSeriesInput } from './PieChart'\n\nconst compareOption: Intl.CollatorOptions = { numeric: true }\n\nexport interface BarGaugeChartProps {\n /** Already-computed series (app runs the worker compute and passes the result). */\n series: PieSeriesInput[]\n legend?: string[]\n /** Formats a bar value for the label / value-axis. */\n valueFormatter: (value: number) => string\n config?: ChartConfigLike\n title?: string\n minHeight?: number\n loading?: boolean\n style?: CSSProperties\n onInitChart?: (chart: ECharts) => void\n}\n\nexport const BarGaugeChart = forwardRef<EChartsHandle, BarGaugeChartProps>(\n (props: BarGaugeChartProps, ref) => {\n const {\n series: input,\n legend,\n valueFormatter,\n config,\n title,\n minHeight,\n loading,\n style,\n onInitChart\n } = props\n const [series, setSeries] = useState<any[]>([])\n const [xAxis, setXAxis] = useState<any>()\n const [yAxis, setYAxis] = useState<any>()\n const isVertical = config?.barGauge?.direction === 'VERTICAL'\n\n useEffect(() => {\n const tmpData = input.map((s) => {\n const d = s.data && s.data[0]\n return { name: s.name, value: d && d[1]! }\n })\n const sort = config?.barGauge?.sort\n switch (sort?.sortBy) {\n case 'ByName':\n tmpData.sort((a, b) =>\n sort.orderDesc\n ? b.name!.localeCompare(a.name!, undefined, compareOption)\n : a.name!.localeCompare(b.name!, undefined, compareOption)\n )\n break\n case 'ByValue':\n tmpData.sort((a, b) =>\n sort.orderDesc ? b.value - a.value : a.value - b.value\n )\n break\n }\n\n const series: { type: 'bar'; data: number[]; label: any }[] = [\n {\n type: 'bar',\n data: tmpData.map((d) => d.value),\n label: {\n show: config?.valueConfig\n ? config.valueConfig.showValueLabel\n : false,\n position:\n config?.barGauge?.direction == 'VERTICAL' ? 'top' : 'right',\n formatter: ({ value }: any) => valueFormatter(value)\n }\n }\n ]\n\n const seriesAxis = {\n type: 'category',\n data: tmpData.map((s) => s.name),\n axisLabel:\n config?.barGauge?.direction == 'VERTICAL'\n ? { interval: 0, rotate: 30 }\n : {}\n } as YAXisComponentOption\n\n if (config?.xAxis?.name) {\n seriesAxis.name = config?.xAxis?.name\n seriesAxis.nameLocation = 'middle'\n seriesAxis.nameGap = isVertical ? 45 : 60\n }\n\n const valueAxis = {\n type: 'value',\n axisLabel:\n // show dates on value-axis label is weird\n config?.valueConfig?.valueFormatter == 'DateFormatter'\n ? undefined\n : { formatter: (v: number) => valueFormatter(v) }\n }\n\n let xAxis, yAxis\n switch (config?.barGauge?.direction) {\n case 'VERTICAL':\n xAxis = seriesAxis\n yAxis = valueAxis\n break\n case 'HORIZONTAL':\n default:\n xAxis = valueAxis\n yAxis = seriesAxis\n }\n setSeries(series)\n setXAxis(xAxis)\n setYAxis(yAxis)\n }, [\n input,\n config?.barGauge?.calculation,\n config?.barGauge?.sort,\n config?.valueConfig?.showValueLabel,\n config?.xAxis?.name,\n isVertical,\n valueFormatter\n ])\n\n const dataZoom = useMemo(() => {\n if (config?.barGauge?.direction == 'HORIZONTAL') {\n return [\n {\n show: series[0]?.data.length > 15,\n type: 'slider',\n yAxisIndex: 0,\n zoomLock: true,\n width: 8,\n right: 10,\n top: 5,\n bottom: 30,\n minValueSpan: 5,\n maxValueSpan: 15,\n orient: 'vertical',\n handleSize: 0,\n showDetail: false,\n brushSelect: false,\n showDataShadow: false\n },\n {\n type: 'inside',\n id: 'insideY',\n yAxisIndex: 0,\n zoomOnMouseWheel: false,\n moveOnMouseMove: true,\n moveOnMouseWheel: true\n }\n ]\n } else {\n return [\n {\n show: series[0]?.data.length > 25,\n type: 'slider',\n xAxisIndex: 0,\n zoomLock: true,\n height: 8,\n bottom: 5,\n maxValueSpan: 25,\n minValueSpan: 10,\n handleSize: '0',\n showDetail: false,\n orient: 'horizontal',\n brushSelect: false,\n showDataShadow: false\n },\n {\n type: 'inside',\n id: 'insideX',\n xAxisIndex: 0,\n zoomOnMouseWheel: false,\n moveOnMouseMove: true,\n moveOnMouseWheel: true\n }\n ]\n }\n }, [config, series])\n\n const options: EChartsOption = {\n title: { text: title },\n grid: {\n top: title ? 48 : 16,\n right: 40,\n bottom: isVertical && config?.xAxis?.name ? 40 : 16,\n left: !isVertical && config?.xAxis?.name ? 40 : 16,\n containLabel: true\n },\n xAxis,\n legend: { data: legend, top: -10000, left: -10000 },\n toolbox: { show: false },\n yAxis,\n dataZoom,\n animation: false,\n series,\n tooltip: {\n trigger: 'axis',\n confine: true,\n extraCssText: 'max-width: 50%; max-height: 50vh; overflow-y: auto;'\n }\n }\n\n return (\n <div className=\"h-full w-full\">\n <ReactEChartsBase\n ref={ref}\n loading={loading}\n option={options}\n minHeight={minHeight}\n style={style}\n noLegend\n onInitChart={onInitChart}\n />\n </div>\n )\n }\n)\n\nBarGaugeChart.displayName = 'BarGaugeChart'\n","import { CSSProperties, forwardRef, useMemo } from 'react'\nimport type { ECharts } from 'echarts/core'\nimport { useResizeDetector } from 'react-resize-detector'\nimport { EChartsHandle, EChartsOption, ReactEChartsBase } from './EchartsBase'\n\nexport interface QueryValueChartProps {\n /** Worker-resolved render inputs (app runs the QueryValue worker compute). */\n series: any[]\n valueText?: string\n textColor?: string\n backgroundColor?: string\n minHeight?: number\n loading?: boolean\n style?: CSSProperties\n onInitChart?: (chart: ECharts) => void\n}\n\nexport const QueryValueChart = forwardRef<EChartsHandle, QueryValueChartProps>(\n (props: QueryValueChartProps, ref) => {\n const {\n series,\n valueText,\n textColor,\n backgroundColor,\n minHeight,\n loading,\n style,\n onInitChart\n } = props\n const { width, height, ref: ref2 } = useResizeDetector()\n\n const fontSize = useMemo(() => {\n return Math.min(\n (width || 0) / String(valueText).length,\n (height || 0) / 1.5\n )\n }, [width, height, valueText])\n\n const options: EChartsOption = {\n backgroundColor,\n grid: { top: 0, right: 0, bottom: 0, left: 0 },\n toolbox: { show: false },\n animation: false,\n series: series as any,\n xAxis: { type: 'time', show: false },\n yAxis: { type: 'value', show: false },\n legend: { show: false },\n graphic: {\n type: 'text',\n z: 100,\n left: 'center',\n top: 'middle',\n style: {\n text: valueText,\n fontSize,\n stroke: textColor,\n fill: textColor\n }\n }\n }\n\n return (\n <div className=\"h-full w-full\">\n <div className=\"h-full w-full\" ref={ref2}>\n <ReactEChartsBase\n ref={ref}\n loading={loading}\n option={options}\n minHeight={minHeight}\n style={style}\n noLegend\n onInitChart={onInitChart}\n />\n </div>\n </div>\n )\n }\n)\n\nQueryValueChart.displayName = 'QueryValueChart'\n","import {\n CSSProperties,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react'\nimport dayjs from 'dayjs'\nimport type { ECharts } from 'echarts/core'\nimport { EChartsHandle, EChartsOption, ReactEChartsBase } from './EchartsBase'\nimport {\n dateRangeOfSeries,\n durationToSeconds,\n calculateStepByDate,\n formatTime,\n shiftTimezone\n} from './series-utils'\nimport { alignTime, pickRangeByInterval, timeBefore } from './time-utils'\nimport {\n toDayjs,\n fromNumber,\n dateTimeToString,\n pickRangeByTimeRange,\n classNames,\n PopupMenuButton,\n type DateTimeValue,\n type DurationLike\n} from '@sentio/ui-core'\nimport YaxisControls from './options/YaxisControls'\nimport { XAxisControls } from './options/XaxisControls'\nimport { sansFontFamily } from './theme/sentio-theme'\nimport { defaultConfig as DefaultValueConfig } from './options/ValueOptions'\nimport { sentioColors } from './theme/sentio-colors'\nimport { useDarkMode } from '../utils/use-dark-mode'\nimport { ChartTooltip } from './ChartTooltip'\nimport { ScatterChartTooltip } from './ScatterChartTooltip'\nimport ReactDOMServer from 'react-dom/server'\nimport { defaults, isArray, isEqual, isNumber, uniq } from 'lodash'\nimport {\n flip,\n FloatingOverlay,\n FloatingPortal,\n shift,\n useFloating\n} from '@floating-ui/react'\nimport { useBoolean } from '@sentio/ui-core'\nimport { LuChevronDown } from 'react-icons/lu'\nimport type {\n ChartConfigLike,\n ChartTypeLike,\n YAxisConfigLike,\n XAxisConfigLike,\n SeriesLike,\n SeriesDataLike\n} from '../types'\n\nconst NumberFormat = (o: Intl.NumberFormatOptions) =>\n new Intl.NumberFormat('en-US', o)\n\nfunction roundByDPR(value: number) {\n const dpr = window.devicePixelRatio || 1\n return Math.round(value * dpr) / dpr\n}\n\nfunction onClickPreventDefault(e: React.MouseEvent) {\n e.preventDefault()\n e.stopPropagation()\n}\n\nconst closestNumber = (arr: number[] | undefined, needle: number) => {\n return arr?.reduce((a, b) =>\n Math.abs(b - needle) < Math.abs(a - needle) ? b : a\n )\n}\n\ninterface Mark {\n value?: number\n label?: string\n above?: boolean\n below?: boolean\n color?: string\n from?: Date\n to?: Date\n}\n\nexport type MarkLine = Mark\nexport type MarkArea = Omit<Mark, 'above' | 'below' | 'value'>\n\n/** Minimal structural mirror of the proto SegmentationQuery message. */\nexport interface SegmentationQueryLike {\n id?: string\n selectorExpr?: unknown\n resource?: { name?: string }\n}\n\n/** Overlay outputs injected by the app (computed by its overlay-series hook). */\nexport interface TimeSeriesOverlay {\n seriesIdToYAxisName: Map<string, string>\n overlaySeriesIdToFormatter: Map<string, (v: number) => string>\n applyOverlaySeries: (option: EChartsOption) => EChartsOption\n}\n\nconst initialConfig: ChartConfigLike = {\n xAxis: {\n type: 'category',\n min: '',\n max: '',\n scale: true,\n name: '',\n column: ''\n },\n yAxis: {\n min: '',\n max: '',\n scale: true\n }\n}\n\n// Helper function to create result object with optional name\nconst createYAxisResult = (\n min: any,\n max: any,\n scale?: boolean,\n name?: string\n) => {\n const result: any = { min, max, scale }\n if (name) {\n result.name = name\n }\n return result\n}\n\n// Helper function to calculate margin for axis values\nconst calculateMargin = (value: number, isMin: boolean) => {\n if (isMin) {\n return value >= 0 ? Math.max(0, value * 0.9) : value * 1.1\n } else {\n return value >= 0 ? value * 1.1 : value * 0.9\n }\n}\n\nconst yAxisToChartOption = (\n option?: YAxisConfigLike,\n markLines: MarkLine[] = [],\n values?: SeriesLike<Date>[]\n) => {\n const { min, max, scale, name } = option || {}\n\n // Parse option min/max values early\n const hasValidMin = min !== undefined && min !== ''\n const hasValidMax = max !== undefined && max !== ''\n const optionMin = hasValidMin ? parseFloat(min as string) || min : undefined\n const optionMax = hasValidMax ? parseFloat(max as string) || max : undefined\n\n // If both min and max are set in option, use them directly\n if (hasValidMin && hasValidMax) {\n return createYAxisResult(optionMin, optionMax, scale, name)\n }\n\n // Only calculate when markLines has valid non-zero values\n const lineValues = markLines\n .map((m) => m.value)\n .filter(\n (v) => v !== undefined && v !== 0 && (v as any as string) !== '0'\n ) as number[]\n\n // If no valid markLines values and no option values, return undefined for min and max\n if (lineValues.length === 0 && !hasValidMin && !hasValidMax) {\n return createYAxisResult(undefined, undefined, scale, name)\n }\n\n // Collect all values for calculation\n const allValues = [...lineValues]\n if (values) {\n const valueSet = new Set<number>()\n values.forEach((series) => {\n series.data.forEach((point) => {\n const value = point[1]\n if (isNumber(value)) {\n valueSet.add(value)\n }\n })\n })\n valueSet.forEach((value) => {\n allValues.push(value)\n })\n }\n\n // Calculate final min/max values\n let finalMin = optionMin\n let finalMax = optionMax\n\n if (allValues.length > 0) {\n // Calculate min if not set in option\n if (!hasValidMin) {\n const minValue = allValues.reduce(\n (min, current) => Math.min(min, current),\n Infinity\n )\n finalMin = calculateMargin(minValue, true)\n }\n\n // Calculate max if not set in option\n if (!hasValidMax) {\n const maxValue = allValues.reduce(\n (max, current) => Math.max(max, current),\n -Infinity\n )\n finalMax = calculateMargin(maxValue, false)\n }\n }\n\n return createYAxisResult(finalMin, finalMax, scale, name)\n}\n\nconst getEventName = (name: string) => {\n let eventName: undefined | string = name.split('-')[0].trim()\n if (eventName.toLowerCase() === 'all events') {\n eventName = undefined\n }\n\n return eventName\n}\n\n// In dark mode, area fills at ECharts' default opacity (0.7) blend together and\n// obscure each other when multiple areas are stacked or overlapping, making them\n// hard to tell apart against the dark background. Lower the fill opacity so the\n// areas (and the series behind them) stay distinguishable. Only kick in when\n// there is more than one series; a single area keeps the default 0.7.\nconst DARK_AREA_FILL_OPACITY = 0.35\n\nconst applyDarkAreaOpacity = (series: any[]): any[] => {\n if (series.length <= 1) {\n return series\n }\n return series.map((s) => {\n if (!s?.areaStyle) {\n return s\n }\n const existing =\n typeof s.areaStyle.opacity === 'number' ? s.areaStyle.opacity : 0.7\n return {\n ...s,\n areaStyle: {\n ...s.areaStyle,\n opacity: Math.min(existing, DARK_AREA_FILL_OPACITY)\n }\n }\n })\n}\n\n/**\n * ECharts does not support time series with gaps, make sure all the series have same time series\n * @param series source series\n * @returns\n */\nexport const fixTimeSeries = (series: SeriesLike<Date>[]): void => {\n try {\n if (!series?.length) {\n return\n }\n\n const isValidDateSeries = series.every((s) =>\n s.data?.every((point) => {\n const date = point?.[0]\n return date instanceof Date && !isNaN(date.getTime())\n })\n )\n\n if (\n !isValidDateSeries ||\n series.length < 2 ||\n uniq(series.map((s) => s.data?.length)).length === 1\n ) {\n return\n }\n\n const timeIndex: Date[] = []\n const dataIndexes = new Array(series.length).fill(0)\n\n while (\n dataIndexes.some((d, index) => d < (series[index]?.data?.length || 0))\n ) {\n const times = dataIndexes.map((d, index) => {\n const date = series[index]?.data?.[d]?.[0]\n return date instanceof Date && !isNaN(date.getTime())\n ? date.getTime()\n : Infinity\n })\n const minTime = Math.min(...times)\n\n if (!isFinite(minTime)) {\n break\n }\n\n const newDate = new Date(minTime)\n if (isNaN(newDate.getTime())) {\n break\n }\n\n timeIndex.push(newDate)\n dataIndexes.forEach((d, index) => {\n const date = series[index]?.data?.[d]?.[0]\n if (\n date instanceof Date &&\n !isNaN(date.getTime()) &&\n date.getTime() === minTime\n ) {\n dataIndexes[index]++\n }\n })\n }\n\n series.forEach((s) => {\n if (!s?.data) return\n\n const data = s.data\n const fixedData: SeriesDataLike<Date>[] = []\n let index = 0\n\n timeIndex.forEach((t) => {\n if (\n data[index]?.[0] instanceof Date &&\n !isNaN(data[index][0].getTime()) &&\n isEqual(data[index][0], t)\n ) {\n fixedData.push(data[index])\n index++\n } else {\n fixedData.push([t, null])\n }\n })\n\n s.data = fixedData\n })\n } catch (error) {\n console.warn('Error in fixTimeSeries:', error)\n }\n}\n\n/**\n * Context built by the presentational chart for a hovered/clicked series, handed\n * out to the app so it can build the log/cohort URL + navigation. The app combines\n * `value` (the data point, holding the timestamp) with its own time range.\n */\nexport interface ViewActionContext {\n value: any\n labels: Record<string, string>\n name: string\n id?: string\n isEventSeries: boolean\n eventName?: string\n query?: { selectorExpr?: unknown }\n}\n\nexport interface TimeSeriesChartProps {\n // ── Display / behaviour fields (Like-typed mirror of the app's ChartProps) ──\n group?: string\n title?: string\n startTime?: DateTimeValue\n endTime?: DateTimeValue\n tz?: string\n minHeight?: number\n onSelectTimeRange?: (start: DateTimeValue, end: DateTimeValue) => void\n loading?: boolean\n controls?: boolean\n config?: ChartConfigLike\n onChangeConfig?: (config: ChartConfigLike) => void\n style?: CSSProperties\n chartType?: ChartTypeLike\n allowClick?: boolean\n showSymbol?: boolean\n sourceType?: string\n getEventNameById?: (id?: string) => string\n noLegend?: boolean\n onInitChart?: (chart: ECharts) => void\n markAreas?: MarkArea[]\n markLines?: MarkLine[]\n nonXAxis?: boolean\n\n // ── Injected (replacing app/runtime couplings) ──\n /** Already-computed primary series (app runs the worker compute). */\n series: SeriesLike<Date>[]\n /** Already-computed compare-period series (already styled by the app, or styled here). */\n compareSeries?: SeriesLike<Date>[]\n /** Legend entries for the primary series. */\n legend?: string[]\n /** Formats a value for axis/tooltip display (replaces lib/metrics/formatter). */\n numberFormatter: (value: number, seriesId?: string) => string\n /** Overlay outputs computed by the app (replaces the overlay-series hook). */\n overlay?: TimeSeriesOverlay\n /** Template-variable keys (replaces the app's template-variables atom). */\n templateVariableKeys?: string[]\n /**\n * Per-series metric labels, indexed by series index (the worker compute's\n * `seriesToMetricLabels`; the original read `labelsRef.current[idx]`).\n */\n seriesToMetricLabels?: {\n name: string\n labels: Record<string, string>\n id?: string\n }[]\n /** Map of series id → event name (the original `eventNameMapRef.current`). */\n eventNameMap?: Map<string, string>\n /** Map of series id → events query (the original `eventsQueryMapRef.current`). */\n eventsQueryMap?: Map<string, { selectorExpr?: unknown }>\n /**\n * Navigate to logs for a clicked series. The presentational builds the context\n * (from the hovered tooltip value + injected labels/event maps) and hands it out;\n * the app maps it to a URL + navigation using its own time range.\n */\n onViewLogs?: (ctx: ViewActionContext) => void\n /** Navigate to users/accounts for a clicked series (the app builds the cohort query). */\n onViewUsers?: (ctx: ViewActionContext) => void\n /**\n * Whether the \"View Logs\" action should be disabled. The component computes the\n * context (may be null) and passes it; the app decides disabled.\n */\n viewLogDisabled?: (ctx: ViewActionContext | null) => boolean\n /** Whether the \"View Users\" action should be disabled. */\n viewUsersDisabled?: (ctx: ViewActionContext | null) => boolean\n /** Counts of returned/total samples for the data-truncation banner. */\n returnedSeries?: number\n totalSeries?: number\n}\n\nconst TimeSeriesChart = forwardRef<EChartsHandle, TimeSeriesChartProps>(\n (props: TimeSeriesChartProps, ref) => {\n const yAxisRef = useRef<any>(null)\n const {\n group,\n title,\n startTime,\n endTime,\n tz,\n minHeight,\n onSelectTimeRange,\n loading,\n controls,\n config,\n markAreas,\n markLines,\n onChangeConfig,\n style,\n chartType,\n allowClick,\n sourceType,\n getEventNameById,\n noLegend: _noLegend = false,\n onInitChart,\n nonXAxis,\n // injected\n series: seriesProp,\n compareSeries: compareSeriesProp,\n legend: legendProp,\n numberFormatter,\n overlay,\n templateVariableKeys: _templateVariableKeys,\n seriesToMetricLabels,\n eventNameMap,\n eventsQueryMap,\n onViewLogs,\n onViewUsers,\n viewLogDisabled: viewLogDisabledProp,\n viewUsersDisabled: viewUsersDisabledProp,\n returnedSeries,\n totalSeries\n } = props\n\n void _templateVariableKeys\n\n const seriesToMetricLabelsRef = useMemo(\n () => seriesToMetricLabels ?? [],\n [seriesToMetricLabels]\n )\n const eventNameMapRef = useMemo(\n () => eventNameMap ?? new Map<string, string>(),\n [eventNameMap]\n )\n const eventsQueryMapRef = useMemo(\n () => eventsQueryMap ?? new Map<string, { selectorExpr?: unknown }>(),\n [eventsQueryMap]\n )\n\n const [yAxis, setYAxis] = useState(config?.yAxis || initialConfig.yAxis)\n const [xAxis, setXAxis] = useState(config?.xAxis || initialConfig.xAxis)\n const [maximumSignificantDigits, setMaximumSignificantDigits] = useState(3)\n const isDarkMode = useDarkMode()\n\n const minRef = useRef<any>(0)\n const maxRef = useRef<any>(0)\n const getSymbolSize = useCallback(\n (value: SeriesDataLike<Date>) => {\n const val = value[2] || 0\n return normalize(\n val,\n minRef.current,\n maxRef.current,\n config?.scatterConfig?.minSize,\n config?.scatterConfig?.maxSize\n )\n },\n [config?.scatterConfig?.minSize, config?.scatterConfig?.maxSize]\n )\n\n useEffect(() => {\n setYAxis(config?.yAxis || initialConfig.yAxis)\n }, [config])\n\n const legend = useMemo(() => legendProp || [], [legendProp])\n\n // Post-process the (already computed) primary series. This used to run on the\n // worker-compute result; now it runs on the injected `series` prop.\n const series = useMemo<SeriesLike<Date>[]>(() => {\n const result = (seriesProp || []).map((s) => ({ ...s }))\n computeMarkLines(result, markLines || [])\n computeMarksAreas(result, markAreas || [])\n if (config?.yAxis?.stacked) {\n fixTimeSeries(result)\n result.forEach((s) => {\n if (config?.seriesConfig && config.seriesConfig.series?.[s.name]) {\n return\n }\n s.stack = 'Total'\n s.stackStrategy = config?.yAxis?.stacked\n })\n }\n if (config?.lineConfig) {\n result.forEach((s) => {\n s.lineStyle = {\n ...s.lineStyle,\n type: config?.lineConfig?.style?.toLowerCase() || 'solid'\n }\n if (config?.lineConfig?.smooth) {\n s.smooth = true\n }\n })\n }\n if (chartType === 'SCATTER') {\n result.forEach((s) => {\n const min = s.data?.reduce((min, p) => {\n const val = p[2] || 0\n return Math.min(min, val)\n }, Infinity)\n const max = s.data?.reduce((max, p) => {\n const val = p[2] || 0\n return Math.max(max, val)\n }, -Infinity)\n minRef.current = min\n maxRef.current = max\n s.symbolSize = getSymbolSize\n })\n }\n if (allowClick) {\n result.forEach((serie) => {\n serie.emphasis =\n serie.type === 'bar'\n ? {\n itemStyle: {\n shadowColor: 'rgba(0, 0, 0, 0.3)',\n shadowBlur: 10\n }\n }\n : {\n scale: 1.5\n }\n })\n }\n return result\n }, [\n seriesProp,\n markAreas,\n markLines,\n chartType,\n config?.yAxis,\n config?.lineConfig,\n config?.seriesConfig,\n allowClick,\n getSymbolSize\n ])\n\n // Reset the max-significant-digits whenever the data changes (the worker\n // effect did this when it set series; we key it on the series prop instead).\n useEffect(() => {\n setMaximumSignificantDigits(3)\n }, [seriesProp])\n\n // Post-process the compare series (dashed/grey, secondary x-axis).\n const compareSeries = useMemo<SeriesLike<Date>[]>(() => {\n if (!compareSeriesProp?.length) {\n return []\n }\n const result = compareSeriesProp.map((s) => ({ ...s }))\n for (const s of result) {\n s.lineStyle = {\n ...s.lineStyle,\n type: 'dashed'\n }\n s.itemStyle = {\n ...s.itemStyle,\n color: 'rgba(120, 120, 120, 0.3)'\n }\n s.xAxisIndex = 1\n if (chartType === 'SCATTER') {\n s.symbolSize = getSymbolSize\n }\n }\n return result\n }, [compareSeriesProp, chartType, getSymbolSize])\n\n const NF = NumberFormat({ notation: 'compact', maximumSignificantDigits })\n const NF_LARGE = NumberFormat({ notation: 'scientific' })\n\n const seriesIdToYAxisName =\n overlay?.seriesIdToYAxisName ?? new Map<string, string>()\n const overlaySeriesIdToFormatter =\n overlay?.overlaySeriesIdToFormatter ??\n new Map<string, (v: number) => string>()\n const applyOverlaySeries =\n overlay?.applyOverlaySeries ?? ((options: EChartsOption) => options)\n\n const setYAxisWrap = (yAxis: YAxisConfigLike) => {\n setYAxis(yAxis)\n onChangeConfig?.({ ...config, yAxis })\n }\n\n let yAxisLabel: number | undefined\n\n const [start, end] = useMemo(() => {\n const [dataStart, dataEnd] = dateRangeOfSeries(series)\n const selectStart = startTime && toDayjs(startTime, true).toDate()\n const selectEnd = endTime && toDayjs(endTime, false).toDate()\n const selStart = selectStart ? shiftTimezone(selectStart, tz) : undefined\n const selEnd = selectEnd ? shiftTimezone(selectEnd, tz) : undefined\n const start =\n dataStart && selStart\n ? dataStart.getTime() < selStart.getTime()\n ? dataStart\n : selStart\n : selStart\n const end =\n dataEnd && selEnd\n ? dataEnd.getTime() > selEnd.getTime()\n ? dataEnd\n : selEnd\n : selEnd\n return [start, end]\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [series, startTime, endTime])\n\n const xLabelFormatter = useMemo(() => {\n return config?.xAxis?.type === 'category'\n ? (value: Date) => {\n const date = shiftTimezone(value, tz)\n let interval = (config?.timeRangeOverride?.timeRange as any)\n ?.interval as DurationLike | undefined\n if (!interval && start && end) {\n interval = calculateStepByDate(start, end)\n }\n return formatTime(date, tz, interval)\n }\n : undefined\n }, [\n config?.xAxis?.type,\n config?.timeRangeOverride?.timeRange,\n tz,\n start,\n end\n ])\n\n const tooltipParmsRef = useRef<any>({})\n\n // Build the per-series context the app needs to construct the log/cohort URL\n // and navigation. Sources the hovered/clicked data value from the internal\n // tooltipParmsRef, and labels / event name / query from the injected props\n // (the original read these from labelsRef / eventNameMapRef / eventsQueryMapRef).\n const getSeriesContext = useCallback(\n (seriesId: string, seriesIndex: number): ViewActionContext | null => {\n const params = tooltipParmsRef.current?.data\n if (!params || !seriesToMetricLabelsRef) {\n return null\n }\n\n let value: any\n let idx: number\n\n // Find the correct series data\n if (Array.isArray(params)) {\n const param = params.find(\n (p: any) => p.seriesId === seriesId || p.seriesIndex === seriesIndex\n )\n if (!param) return null\n value = param.value\n idx = param.seriesIndex\n } else {\n value = params.value\n idx = seriesIndex\n }\n\n if (!value) return null\n\n const {\n labels = {},\n name = '',\n id\n } = seriesToMetricLabelsRef[idx] || {}\n const isEventSeries =\n eventNameMapRef.has(id as string) || sourceType === 'ANALYTICS'\n\n let eventName: string | undefined\n if (sourceType === 'ANALYTICS') {\n try {\n const _eventName = getEventNameById?.(id)\n eventName =\n _eventName == undefined ? getEventName(name) : _eventName\n } catch {\n //do nothing\n }\n } else if (eventNameMapRef.has(id as string)) {\n eventName = eventNameMapRef.get(id as string) || undefined\n }\n\n const query = eventsQueryMapRef.get(id as string)\n\n return {\n value,\n labels,\n name,\n id,\n isEventSeries,\n eventName,\n query\n }\n },\n [\n seriesToMetricLabelsRef,\n eventNameMapRef,\n eventsQueryMapRef,\n sourceType,\n getEventNameById\n ]\n )\n\n // Internal handlers passed to ChartTooltip (which calls them with\n // (seriesId, seriesIndex)). They build the context and delegate to the\n // outward props; the app computes time ranges / URLs / navigation itself.\n const handleViewLogs = useCallback(\n (seriesId: string, seriesIndex: number) => {\n const ctx = getSeriesContext(seriesId, seriesIndex)\n if (!ctx) return\n onViewLogs?.(ctx)\n },\n [getSeriesContext, onViewLogs]\n )\n\n const handleViewUsers = useCallback(\n (seriesId: string, seriesIndex: number) => {\n const ctx = getSeriesContext(seriesId, seriesIndex)\n if (!ctx) return\n onViewUsers?.(ctx)\n },\n [getSeriesContext, onViewUsers]\n )\n\n const getViewLogDisabled = useCallback(\n (seriesId: string, seriesIndex: number) => {\n const ctx = getSeriesContext(seriesId, seriesIndex)\n return viewLogDisabledProp?.(ctx) ?? false\n },\n [getSeriesContext, viewLogDisabledProp]\n )\n\n const getViewUsersDisabled = useCallback(\n (seriesId: string, seriesIndex: number) => {\n const ctx = getSeriesContext(seriesId, seriesIndex)\n return viewUsersDisabledProp?.(ctx) ?? false\n },\n [getSeriesContext, viewUsersDisabledProp]\n )\n\n const tooltipFormatter = useCallback(\n (params: any /*ticket, callback*/) => {\n // Normalize params to always be an array for consistent handling\n const paramsArray = Array.isArray(params) ? params : [params]\n\n if (allowClick) {\n yAxisRef.current = paramsArray.map((param: any) => ({\n value: param.value,\n seriesIndex: param.seriesIndex,\n seriesName: param.seriesName\n }))\n }\n let title: string | undefined = undefined\n if (nonXAxis) {\n const value = paramsArray?.[0]?.data?.[0]\n title = `${config?.xAxis?.column ? `${config?.xAxis?.column}:` : ''} ${value}`\n } else if (xLabelFormatter) {\n const value = paramsArray?.[0]?.data?.[0]\n title = xLabelFormatter(value)\n }\n\n // Append Y-axis name suffix to overlay series in tooltip for disambiguation\n const annotatedParams = paramsArray.map((param: any) => {\n const yAxisName = seriesIdToYAxisName.get(param.seriesId)\n if (yAxisName) {\n return { ...param, seriesName: `${param.seriesName}(${yAxisName})` }\n }\n return param\n })\n\n const parmas = {\n data: chartType === 'SCATTER' ? params : annotatedParams,\n title,\n highlightSeriesId: (global as any).highlightSeriesId,\n compareTimeDuration: config?.timeRangeOverride?.compareTime?.ago as\n | DurationLike\n | undefined,\n numberFormatter: (value: number, seriesId?: string) => {\n const seriesFormatter = seriesId\n ? overlaySeriesIdToFormatter.get(seriesId)\n : undefined\n if (seriesFormatter) {\n return seriesFormatter(value)\n }\n return numberFormatter(value) as string\n },\n showTotal: config?.valueConfig?.tooltipTotal,\n // Gate on the outward props existing (same as the original gating on the\n // handlers existing): no handler → button doesn't render.\n onViewLogs: onViewLogs ? handleViewLogs : undefined,\n viewLogDisabled: onViewLogs ? getViewLogDisabled : undefined,\n onViewUsers: onViewUsers ? handleViewUsers : undefined,\n viewUsersDisabled: onViewUsers ? getViewUsersDisabled : undefined,\n sizeTitle: config?.scatterConfig?.symbolSize\n }\n tooltipParmsRef.current = parmas\n\n // Use specialized component for scatter charts\n if (chartType === 'SCATTER') {\n return ReactDOMServer.renderToString(\n <ScatterChartTooltip\n {...parmas}\n onViewLogs={undefined}\n viewLogDisabled={undefined}\n onViewUsers={undefined}\n viewUsersDisabled={undefined}\n sizeTitle={config?.scatterConfig?.symbolSize}\n />\n )\n } else {\n return ReactDOMServer.renderToString(\n <ChartTooltip\n {...parmas}\n onViewLogs={undefined}\n viewLogDisabled={undefined}\n onViewUsers={undefined}\n viewUsersDisabled={undefined}\n />\n )\n }\n },\n [\n allowClick,\n numberFormatter,\n overlaySeriesIdToFormatter,\n config,\n nonXAxis,\n chartType,\n xLabelFormatter,\n onViewLogs,\n handleViewLogs,\n getViewLogDisabled,\n onViewUsers,\n handleViewUsers,\n getViewUsersDisabled,\n seriesIdToYAxisName\n ]\n )\n\n // the brush event will be fired from all grouped charts. So we need to check if the event is from this chart\n const [active, setActive] = useState(false)\n const onSelect = useCallback(\n (start: number, end: number) => {\n if (onSelectTimeRange && active) {\n let startTime: DateTimeValue = fromNumber(start)\n let endTime: DateTimeValue = fromNumber(end)\n const interval = (config?.timeRangeOverride?.timeRange as any)\n ?.interval as DurationLike | undefined\n if (interval) {\n startTime = alignTime(startTime, interval, tz, 'start')\n endTime = alignTime(endTime, interval, tz, 'end')\n }\n onSelectTimeRange(startTime, endTime)\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onSelectTimeRange, active]\n )\n\n const allowBrush = useMemo(() => {\n if (nonXAxis) {\n return false\n }\n if (onSelectTimeRange && startTime && endTime) {\n const interval = (config?.timeRangeOverride?.timeRange as any)\n ?.interval as DurationLike | undefined\n const diff = toDayjs(endTime).diff(toDayjs(startTime), 'seconds')\n return interval ? diff > durationToSeconds(interval) : true\n }\n return false\n }, [\n config?.timeRangeOverride?.timeRange,\n startTime,\n endTime,\n onSelectTimeRange,\n nonXAxis\n ])\n\n const xAxisData = useMemo(() => {\n if (nonXAxis) {\n return [\n {\n type: 'category',\n axisLabel: {\n hideOverlap: true,\n fontSize: 11\n },\n name: config?.xAxis?.name\n }\n ]\n }\n\n const ret = [\n {\n type: config?.xAxis?.type || 'time',\n min: config?.xAxis?.type === 'category' ? undefined : start,\n max: config?.xAxis?.type === 'category' ? undefined : end,\n axisLabel: {\n hideOverlap: true,\n fontSize: 11,\n formatter: xLabelFormatter\n },\n axisTick: {\n show: false\n }\n } as any\n ]\n if (config?.xAxis?.name) {\n ret[0].name = config?.xAxis?.name\n }\n if (config?.timeRangeOverride?.compareTime?.ago) {\n const d = config?.timeRangeOverride?.compareTime?.ago as DurationLike\n const compareStart = toDayjs(timeBefore(dayjs(start), d, true)).toDate()\n const compareEnd = toDayjs(timeBefore(dayjs(end), d, false)).toDate()\n ret.push({\n show: false,\n type: config?.xAxis?.type || 'time',\n min: config?.xAxis?.type === 'category' ? undefined : compareStart,\n max: config?.xAxis?.type === 'category' ? undefined : compareEnd,\n axisLabel: {\n hideOverlap: true,\n fontSize: 11,\n formatter: xLabelFormatter\n }\n } as any)\n }\n return ret as any\n }, [\n config?.timeRangeOverride?.compareTime,\n start,\n end,\n nonXAxis,\n config?.xAxis,\n xLabelFormatter\n ])\n\n const options: EChartsOption = useMemo(() => {\n const primarySeries =\n xAxisData.length == 2 ? [...series, ...compareSeries] : series\n\n // Build primary Y-axis\n const primaryYAxis: any = {\n type: 'value',\n axisLabel: {\n formatter: function (value: number) {\n if (value == yAxisLabel && maximumSignificantDigits < 21) {\n setMaximumSignificantDigits(maximumSignificantDigits + 1)\n }\n yAxisLabel = value\n if (value > 1e21) {\n return NF_LARGE.format(value)\n }\n return NF.format(value)\n },\n margin:\n chartType === 'SCATTER'\n ? config?.scatterConfig?.maxSize\n ? config.scatterConfig.maxSize\n : 30\n : 4\n },\n ...yAxisToChartOption(\n yAxis,\n markLines,\n primarySeries as SeriesLike<Date>[]\n )\n }\n\n const baseOptions: EChartsOption = {\n title: {\n text: title\n },\n grid: {\n top: title ? 48 : 16,\n right: chartType === 'SCATTER' ? 16 : 8,\n bottom: 8,\n left: chartType === 'SCATTER' ? 20 : 12,\n containLabel: true\n },\n xAxis: xAxisData,\n dataZoom: {\n type: 'inside',\n zoomLock: true\n },\n legend: {\n data: legend,\n top: -10000,\n left: -10000\n },\n brush: allowBrush\n ? {\n xAxisIndex: 0\n }\n : undefined,\n toolbox: {\n show: false\n },\n yAxis: primaryYAxis,\n animation: false,\n series: primarySeries as any,\n tooltip: {\n trigger: chartType === 'SCATTER' ? 'item' : 'axis',\n confine: true,\n textStyle: {\n fontSize: 14,\n fontFamily: sansFontFamily\n },\n extraCssText:\n 'max-width: 75%; max-height: 50vh; overflow-y: auto; padding: 10px 0; background-color: rgba(var(--text-background)); border-color: rgba(var(--border-color));',\n formatter: tooltipFormatter\n },\n visualMap:\n chartType === 'SCATTER' &&\n config?.scatterConfig?.color &&\n (sentioColors.dark as any)[config.scatterConfig.color]\n ? {\n dimension: 2,\n min: minRef.current,\n max: maxRef.current,\n show: false,\n inRange: {\n color: isDarkMode\n ? (sentioColors.dark as any)[config.scatterConfig.color]\n : (sentioColors.light as any)[config.scatterConfig.color]\n }\n }\n : undefined\n }\n\n const finalOptions = applyOverlaySeries(baseOptions)\n if (isDarkMode && Array.isArray(finalOptions.series)) {\n finalOptions.series = applyDarkAreaOpacity(\n finalOptions.series as any[]\n ) as any\n }\n return finalOptions\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n title,\n xAxisData,\n legend,\n allowBrush,\n yAxis,\n series,\n compareSeries,\n applyOverlaySeries,\n tooltipFormatter,\n maximumSignificantDigits,\n xAxis,\n chartType,\n isDarkMode\n ])\n\n const {\n value: isOpen,\n setFalse: setClose,\n setTrue: setOpen\n } = useBoolean(false)\n const clickEventParamsRef = useRef<any>(null)\n const [selectedSeriesIndex, setSelectedSeriesIndex] = useState(0)\n const chartPositionRef = useRef<HTMLDivElement>(null)\n\n const { x, y, strategy, refs } = useFloating({\n open: isOpen,\n placement: 'right',\n middleware: [flip(), shift()]\n })\n const onClick = useCallback(\n (params: any, rawParams?: any) => {\n if (!params) {\n setClose()\n return\n }\n const baseBoundingRect =\n chartPositionRef.current?.getBoundingClientRect()\n if (params.event) {\n const { event } = params\n clickEventParamsRef.current = params\n const targetBoundRect = event.target.getBoundingRect()\n refs.setPositionReference({\n getBoundingClientRect: () => {\n return {\n x: event.offsetX + (baseBoundingRect?.x ?? 0),\n y: event.offsetY + (baseBoundingRect?.y ?? 0),\n width: targetBoundRect.width,\n height: targetBoundRect.height,\n top: event.offsetY + (baseBoundingRect?.top ?? 0),\n right: event.offsetX + (baseBoundingRect?.right ?? 0),\n bottom: event.offsetY + (baseBoundingRect?.bottom ?? 0),\n left: event.offsetX + (baseBoundingRect?.left ?? 0)\n } as DOMRect\n }\n })\n } else if (isArray(params)) {\n const targetValue = closestNumber(\n yAxisRef.current?.map((item: any) => item.value[1]),\n params[1]\n )\n clickEventParamsRef.current = yAxisRef.current?.find(\n (item: any) => item.value[1] === targetValue\n )\n refs.setPositionReference({\n getBoundingClientRect: () => {\n return {\n x: rawParams.offsetX + (baseBoundingRect?.x ?? 0),\n y: rawParams.offsetY + (baseBoundingRect?.y ?? 0),\n width: 10,\n height: 10,\n top: rawParams.offsetY + (baseBoundingRect?.top ?? 0),\n right: rawParams.offsetX + (baseBoundingRect?.right ?? 0),\n bottom: rawParams.offsetY + (baseBoundingRect?.bottom ?? 0),\n left: rawParams.offsetX + (baseBoundingRect?.left ?? 0)\n } as DOMRect\n }\n })\n }\n setOpen()\n },\n [refs, setClose, setOpen]\n )\n\n const onSeriesEvent = useCallback((event: string, params: any) => {\n switch (event) {\n case 'click':\n setSelectedSeriesIndex(params.seriesIndex)\n break\n case 'mouseover':\n ;(global as any).highlightSeriesId = params.seriesId\n document\n .querySelectorAll(`.series_${params.seriesId}`)\n .forEach((node) => {\n node.classList.add('highlighted')\n })\n break\n case 'mouseout':\n const previousSeriesId = (global as any).highlightSeriesId\n if (previousSeriesId) {\n document\n .querySelectorAll(`.series_${previousSeriesId}`)\n .forEach((node) => {\n node.classList.remove('highlighted')\n })\n }\n ;(global as any).highlightSeriesId = ''\n }\n }, [])\n\n const onSelectSeries = useCallback(\n (seriesIndex: number) => {\n clickEventParamsRef.current = {\n seriesIndex: seriesIndex,\n seriesName: series[seriesIndex].name\n }\n if (yAxisRef.current[seriesIndex]?.value) {\n clickEventParamsRef.current.value =\n yAxisRef.current[seriesIndex].value\n }\n setSelectedSeriesIndex(seriesIndex)\n },\n [series, setSelectedSeriesIndex]\n )\n\n const switchSeries = useMemo(() => {\n const items = [\n series.map((serie, index) => ({\n label: serie.name || '',\n key: `${index}`\n }))\n ]\n return (\n <PopupMenuButton\n onSelect={(d) => onSelectSeries(parseInt(d, 10))}\n items={items}\n buttonIcon={(open: boolean) => (\n <span\n className={classNames(\n 'text-primary-100',\n 'hover:bg-primary-200/80 inline-block cursor-pointer rounded-md px-1 py-0.5',\n open ? 'bg-primary-200/80' : ''\n )}\n >\n <LuChevronDown className=\"h-3.5 w-3.5\" />\n </span>\n )}\n portal={false}\n placement=\"bottom-end\"\n itemsClassName=\"max-h-[50vh] overflow-y-auto\"\n />\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [series])\n\n // Note: `switchSeries` and `selectedSeriesIndex` participate in the fixed\n // (click) tooltip series-switching affordance; referenced to keep parity with\n // the source even though they are wired via tooltipParmsRef.\n void switchSeries\n void selectedSeriesIndex\n // `getEventName`, `sourceType`, and `getEventNameById` are now genuinely used\n // by getSeriesContext.\n\n const noLegend = useMemo(() => {\n // hide legend for single series scatter chart\n if (chartType === 'SCATTER' && series.length === 1) {\n return true\n }\n return _noLegend\n }, [_noLegend, chartType, series?.length])\n\n return (\n <div\n className=\"h-full w-full\"\n onMouseOver={() => {\n setActive(true)\n }}\n onMouseOut={() => {\n setActive(false)\n }}\n >\n <ReactEChartsBase\n ref={ref}\n loading={loading}\n group={group}\n option={options}\n minHeight={minHeight}\n returnedSeries={returnedSeries}\n totalSeries={totalSeries}\n onSelect={onSelect}\n onClick={allowClick ? onClick : undefined}\n style={style}\n onSeriesEvent={onSeriesEvent}\n noLegend={noLegend}\n onInitChart={onInitChart}\n />\n {controls && nonXAxis && (\n <XAxisControls xAxis={xAxis} setXAxis={setXAxis} defaultOpen />\n )}\n {controls && <YaxisControls yAxis={yAxis} setYAxis={setYAxisWrap} />}\n <div className=\"absolute left-0 top-0\" ref={chartPositionRef}></div>\n {isOpen && allowClick && (\n <FloatingPortal>\n <FloatingOverlay className=\"z-50 bg-gray-100/20\" onClick={setClose}>\n <div\n ref={refs.setFloating}\n className=\"border-border-color bg-default-bg min-w-64 absolute w-fit divide-y rounded-md border pb-2 shadow-sm\"\n style={{\n position: strategy,\n top: 0,\n left: 0,\n transform: `translate(${roundByDPR(x || 0)}px,${roundByDPR(y || 0)}px)`\n }}\n onClick={onClickPreventDefault}\n >\n <div className=\"text-text-foreground max-h-80 max-w-[50vw] overflow-y-auto py-2 text-sm\">\n {chartType === 'SCATTER' ? (\n <ScatterChartTooltip {...tooltipParmsRef.current} isFixed />\n ) : (\n <ChartTooltip {...tooltipParmsRef.current} isFixed />\n )}\n </div>\n </div>\n </FloatingOverlay>\n </FloatingPortal>\n )}\n </div>\n )\n }\n)\n\nTimeSeriesChart.displayName = 'TimeSeriesChart'\n\nexport { TimeSeriesChart }\nexport default TimeSeriesChart\n\nfunction computeMarkLines(series: any[], markLines: MarkLine[]) {\n if (markLines && markLines.length > 0 && series.length > 0) {\n series[0] = {\n ...series[0],\n markLine: {\n symbol: [],\n data: markLines.map((area) => {\n if (area.from || area.to) {\n return [\n {\n name: 'threshold',\n xAxis: area.from,\n yAxis: area.value ?? 'min',\n symbol: 'react',\n symbolSize: [20, 1],\n symbolOffset: [area.below ? -10 : 10, 0],\n label: {\n formatter: `${area.label}`,\n position: area.below\n ? 'insideMiddleBottom'\n : 'insideMiddleTop',\n color: area.color || '#ff0000'\n },\n lineStyle: {\n color: area.color || '#ff0000'\n }\n },\n {\n symbol: 'rect',\n symbolSize: [20, 1],\n symbolOffset: [area.below ? 10 : -10, 0],\n xAxis: area.to ? area.to : undefined,\n yAxis: area.value ?? 'max'\n }\n ]\n } else {\n return {\n name: 'threshold',\n yAxis: area.value,\n symbol: 'react',\n symbolSize: [20, 1],\n symbolOffset: [area.below ? -10 : 10, 0],\n label: {\n formatter: `${area.label}`,\n position: area.below ? 'insideStartBottom' : 'insideStartTop',\n color: area.color || '#ff0000'\n },\n lineStyle: {\n color: area.color || '#ff0000'\n }\n }\n }\n })\n }\n }\n }\n}\n\nfunction computeMarksAreas(series: any[], markAreas: MarkArea[]) {\n if (markAreas && markAreas.length > 0 && series.length > 0) {\n series[0].markArea = {\n itemStyle: {\n color: markAreas[0].color || 'rgba(255, 173, 177, 0.4)'\n }\n }\n series[0].markArea.data = markAreas.map((markArea) => {\n return [\n {\n xAxis: markArea.from ? markArea.from : undefined\n },\n {\n xAxis: markArea.to ? markArea.to : undefined\n }\n ]\n })\n }\n}\n\nconst MIN_SIZE = 5\nconst MAX_SIZE = 30\nconst LEVELS = 10\n\nfunction normalize(\n value: number,\n min: number,\n max: number,\n minSize = MIN_SIZE,\n maxSize = MAX_SIZE\n): number {\n if (max === min) return MIN_SIZE\n if (value <= min) return minSize\n if (value >= max) return maxSize\n\n const range = max - min\n const levelRange = range / LEVELS\n\n const sizeIncrement = (maxSize - minSize) / (LEVELS - 1)\n\n const level = Math.floor((value - min) / levelRange)\n const clampedLevel = Math.min(level, LEVELS - 1)\n\n return minSize + clampedLevel * sizeIncrement\n}\n","import dayjs from 'dayjs'\nimport duration from 'dayjs/plugin/duration'\nimport utc from 'dayjs/plugin/utc'\nimport timezone from 'dayjs/plugin/timezone'\nimport quarterOfYear from 'dayjs/plugin/quarterOfYear'\nimport localizedFormat from 'dayjs/plugin/localizedFormat'\nimport type { DurationLike } from '@sentio/ui-core'\nimport type { SeriesLike } from '../types'\n\ndayjs.extend(duration)\ndayjs.extend(utc)\ndayjs.extend(timezone)\ndayjs.extend(quarterOfYear)\ndayjs.extend(localizedFormat)\n\nconst TimeUnitShortNames: Record<string, string> = {\n s: 'seconds',\n m: 'minutes',\n h: 'hours',\n d: 'days',\n w: 'weeks',\n M: 'months',\n y: 'years'\n}\n\n/** [min, max] timestamp across all series (data is sorted by timestamp). */\nexport function dateRangeOfSeries(series: SeriesLike<Date>[]): [Date, Date] {\n let min = new Date()\n let max = new Date(0)\n for (const s of series) {\n if (s.data.length > 0) {\n const dmin = s.data[0][0] || min\n const dmax = s.data[s.data.length - 1][0] || max\n if (dmin < min) min = dmin\n if (dmax > max) max = dmax\n }\n }\n return [min, max]\n}\n\nexport function durationToSeconds(d?: DurationLike): number {\n if (!d) return 0\n return dayjs\n .duration(Number(d.value) || 0, d.unit as dayjs.UnitTypeShort)\n .asSeconds()\n}\n\nexport function parseDuration(s: string): DurationLike {\n const m = s.match(/(\\d+)([a-z]+)/i)\n if (m) {\n const [, value, unit] = m\n return { value: parseInt(value), unit: TimeUnitShortNames[unit] }\n }\n return { value: 0, unit: 'second' }\n}\n\n// Round a millisecond span to the nearest sensible bucket interval.\nexport function roundInterval(diff: number): string {\n switch (true) {\n case diff <= dayjs.duration(15, 'minute').asMilliseconds():\n return '10s'\n case diff <= dayjs.duration(1, 'day').asMilliseconds():\n return '1m'\n case diff <= dayjs.duration(30, 'day').asMilliseconds():\n return '1h'\n case diff <= dayjs.duration(2, 'years').asMilliseconds():\n return '1d'\n case diff <= dayjs.duration(10, 'years').asMilliseconds():\n default:\n return '7d'\n }\n}\n\nexport function calculateStepByDate(start: Date, end: Date): DurationLike {\n return parseDuration(roundInterval(end.getTime() - start.getTime()))\n}\n\n/** Shift a Date so plain formatting renders the wall-clock time in `tz`. */\nexport function shiftTimezone(time: Date | dayjs.Dayjs, tz?: string): Date {\n const origin = dayjs.isDayjs(time) ? time : dayjs(time)\n if (!tz) return origin.toDate()\n const offset = origin.tz(tz).utcOffset() - origin.utcOffset()\n return origin.add(offset, 'minute').toDate()\n}\n\nexport const formatTime = (\n time: Date,\n tz?: string,\n interval?: DurationLike\n): string => {\n const d = dayjs(shiftTimezone(time, tz))\n switch (interval?.unit) {\n case 's':\n return d.format('HH:mm:ss')\n case 'm':\n return d.format('DD HH:mm')\n case 'h':\n return d.format('MM-DD HH:mm')\n case 'd':\n case 'w':\n return d.format('YYYY-MM-DD')\n case 'M':\n return interval.value === 3\n ? `${d.format('YYYY')}-Q${d.quarter()}`\n : d.format('YYYY-MMM')\n default:\n return d.format('lll')\n }\n}\n","/*\n * Proto-coupled time helpers ported from the app's `lib/time.ts`, reimplemented\n * against `DurationLike` (from @sentio/ui-core) instead of the generated proto\n * `Duration` message. Only the helpers referenced by the render charts are\n * ported here; the proto-free core (toDayjs, fromNumber, pickRangeByTimeRange,\n * dateTimeToString, isRelativeTime, now, TimeUnitShortNames, shiftTimezone …)\n * already lives in @sentio/ui-core.\n */\nimport dayjs from 'dayjs'\nimport {\n toDayjs,\n isRelativeTime,\n now,\n TimeUnitShortNames,\n type DateTimeValue,\n type RelativeTime,\n type DurationLike\n} from '@sentio/ui-core'\nimport { durationToSeconds } from './series-utils'\nimport type { TimeLike } from '../types/chart'\n\n/** Window [currentTime, currentTime + interval] picked by a fixed interval. */\nexport function pickRangeByInterval(\n currentTime: DateTimeValue,\n interval: DurationLike\n): {\n startTime: DateTimeValue\n endTime: DateTimeValue\n} {\n const start = toDayjs(currentTime)\n const end = start.add(durationToSeconds(interval), 'second')\n\n return {\n startTime: start,\n endTime: end\n }\n}\n\n/** Snap a time to the start/end of the bucket of size `step` (timezone-aware). */\nexport function alignTime(\n time: DateTimeValue,\n step: DurationLike,\n tz?: string,\n align: 'start' | 'end' = 'start'\n): DateTimeValue {\n try {\n const d = toDayjs(time)\n const seconds = durationToSeconds(step)\n const tzOffset = (tz ? d.tz(tz).utcOffset() : 0) * 60\n const offset = (d.unix() + tzOffset) % seconds\n if (offset === 0) {\n return time\n }\n\n return align == 'start'\n ? d.subtract(offset, 'second')\n : d.add(seconds - offset, 'second')\n } catch (e) {\n // dayjs.tz may throw exception for some unknown reason\n console.error(e)\n return time\n }\n}\n\n/** Shift a time backwards by `duration`, preserving relative-time semantics. */\nexport function timeBefore(\n time: DateTimeValue,\n duration: DurationLike,\n asStart: boolean = true\n): DateTimeValue {\n const durationValue = Number(duration.value)\n if (isRelativeTime(time)) {\n const rt = time as RelativeTime\n if (rt.unit == null || time == now) {\n return {\n sign: -1,\n unit: TimeUnitShortNames[duration.unit!],\n value: durationValue\n }\n }\n if (rt.align) {\n const t = toDayjs(rt, asStart)\n return t.subtract(durationValue, TimeUnitShortNames[duration.unit!])\n }\n\n const t = toDayjs(time)\n const nt = t.subtract(durationValue, TimeUnitShortNames[duration.unit!])\n const unit = 'days'\n const value = nt.diff(dayjs(), unit)\n return { sign: value < 0 ? -1 : 1, unit, value: Math.abs(value) }\n } else {\n const t = toDayjs(time)\n return t.subtract(durationValue, TimeUnitShortNames[duration.unit!])\n }\n}\n\n// TimeLike (absolute/relative) ⇄ DateTimeValue. Ported proto-free from the\n// app's lib/time; operates on the structural `TimeLike` instead of the proto\n// `TimeRange.TimeLike` message.\nexport function fromTimeLike(tl?: TimeLike): DateTimeValue | undefined {\n if (!tl) {\n return undefined\n }\n if (tl.relativeTime) {\n const value = tl.relativeTime.value || 0\n return {\n value: Math.abs(value),\n unit: tl.relativeTime.unit as RelativeTime['unit'],\n sign: value < 0 ? -1 : 1\n }\n }\n return dayjs.unix(parseInt(tl.absoluteTime || ''))\n}\n\nexport function toTimeLike(t?: DateTimeValue): TimeLike {\n if (dayjs.isDayjs(t)) {\n return { absoluteTime: `${t.unix()}` }\n }\n const rt = t as RelativeTime\n return {\n relativeTime: { unit: rt.unit, value: rt.sign * rt.value, align: rt.align }\n }\n}\n","import { defaults } from 'lodash'\nimport type { ReactNode } from 'react'\nimport { Button, Checkbox, DisclosurePanel } from '@sentio/ui-core'\nimport { AddonLabel } from './controls-ui'\nimport type { YAxisConfigLike } from '../../types'\n\ninterface Props {\n yAxis?: YAxisConfigLike\n setYAxis: (yAxis: YAxisConfigLike) => void\n defaultOpen?: boolean\n /** Optional app-supplied column picker (sql charts). When present the Column row renders. */\n columnSelect?: ReactNode\n supportSetName?: boolean\n supportSetMinMax?: boolean\n supportStackSeries?: boolean\n supportAlwaysShowZero?: boolean\n supportReset?: boolean\n panelTitle?: string\n}\n\nconst initialConfig = {\n yAxis: {\n min: '',\n max: '',\n scale: true,\n stack: ''\n }\n}\n\nexport default function YaxisControls({\n yAxis,\n setYAxis,\n defaultOpen,\n columnSelect,\n supportSetName = true,\n supportSetMinMax = true,\n supportStackSeries = true,\n supportAlwaysShowZero = true,\n supportReset = true,\n panelTitle = 'Y-Axis Controls'\n}: Props) {\n yAxis = defaults(yAxis || {}, initialConfig.yAxis)\n const onChangeInput =\n (field: string) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = event.target\n setYAxis({\n ...yAxis,\n [field]: value || undefined,\n scale: field == 'min' && value > '0' ? true : yAxis?.scale\n })\n }\n const onToggleZero = (checked: boolean) => {\n setYAxis({ ...yAxis, scale: !checked, min: checked ? '' : yAxis?.min })\n }\n const onClickResetYAxis = () => {\n setYAxis(initialConfig.yAxis)\n }\n\n const onToggleStack = (checked: boolean) => {\n setYAxis({ ...yAxis, stacked: checked ? 'samesign' : '' })\n }\n\n const minMaxLabelCls =\n 'inline-flex items-center border border-r-0 sm:text-icontent border-main bg-gray-50 px-2 rounded-l-md'\n const minMaxInputCls =\n 'border focus:border-primary-500 rounded-r-md sm:text-icontent border-main hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30'\n\n return (\n <DisclosurePanel\n title={panelTitle}\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"text-icontent flex flex-wrap gap-[10px]\">\n {supportSetName && (\n <label className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Name\n </AddonLabel>\n <input\n type=\"text\"\n className=\"focus:border-primary-500 sm:text-icontent border-main hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 w-40 rounded-r-md border\"\n value={yAxis?.name}\n placeholder=\"Axis Name\"\n onChange={onChangeInput('name')}\n />\n </label>\n )}\n {columnSelect && (\n <span className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Column\n </AddonLabel>\n {columnSelect}\n </span>\n )}\n {supportSetMinMax && (\n <>\n <label className=\"inline-flex h-8\">\n <span className={minMaxLabelCls}>Min</span>\n <input\n type=\"text\"\n className={minMaxInputCls}\n style={{ width: '10em' }}\n value={yAxis.min}\n placeholder=\"Auto\"\n onChange={onChangeInput('min')}\n />\n </label>\n <label className=\"inline-flex h-8\">\n <span className={minMaxLabelCls}>Max</span>\n <input\n type=\"text\"\n className={minMaxInputCls}\n style={{ width: '10em' }}\n value={yAxis.max}\n placeholder=\"Auto\"\n onChange={onChangeInput('max')}\n />\n </label>\n </>\n )}\n\n {supportStackSeries && (\n <Checkbox\n checked={!!yAxis?.stacked}\n onChange={onToggleStack}\n label=\"Stack series\"\n />\n )}\n\n {supportAlwaysShowZero && (\n <Checkbox\n checked={!yAxis.scale}\n onChange={onToggleZero}\n label=\"Always show zero\"\n />\n )}\n\n {supportReset && (\n <Button type=\"button\" role=\"link\" onClick={onClickResetYAxis}>\n Reset\n </Button>\n )}\n </div>\n </DisclosurePanel>\n )\n}\n","import type { ReactNode } from 'react'\nimport { classNames } from '@sentio/ui-core'\n\n// Inline addon label sitting flush against a select/input across the option\n// panels. The base carries the invariant chrome; `className` carries the\n// per-use border-side / rounded / padding variant.\nexport const AddonLabel = ({\n className,\n children\n}: {\n className?: string\n children: ReactNode\n}) => (\n <span\n className={classNames(\n 'sm:text-icontent border-main inline-flex items-center whitespace-nowrap bg-gray-50',\n className\n )}\n >\n {children}\n </span>\n)\n","import type { ReactNode } from 'react'\nimport {\n Button,\n DisclosurePanel,\n PopoverTooltip,\n Select\n} from '@sentio/ui-core'\nimport { AddonLabel } from './controls-ui'\nimport { LuInfo } from 'react-icons/lu'\nimport type { SortByLike, XAxisConfigLike } from '../../types'\n\nconst TypeSelect = Select<string>\nconst SortSelect = Select<string>\nconst OrderSelect = Select<boolean | undefined>\n\nconst sortByItems = [\n { label: 'Name', value: 'ByName' },\n { label: 'Value', value: 'ByValue' }\n]\nconst orderItems = [\n { label: 'Ascendant', value: false },\n { label: 'Descendant', value: true }\n]\n\ninterface Props {\n xAxis?: XAxisConfigLike\n setXAxis: (val?: XAxisConfigLike) => void\n defaultOpen?: boolean\n /** Optional app-supplied column picker (sql charts). When present the Column row renders. */\n columnSelect?: ReactNode\n /** Whether the selected X column is a non-TIME column (app resolves from the data schema). */\n columnIsNonTime?: boolean\n panelTitle?: string\n supportName?: boolean\n supportSort?: boolean\n supportSetType?: boolean\n}\n\nexport const XAxisControls = ({\n xAxis,\n setXAxis,\n defaultOpen,\n columnSelect,\n columnIsNonTime,\n panelTitle = 'X-Axis Controls',\n supportName = true,\n supportSort,\n supportSetType\n}: Props) => {\n const onChangeInput =\n (field: string) => (event: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = event.target\n setXAxis({ ...xAxis, [field]: value || undefined })\n }\n const onClickResetXAxis = () => {\n setXAxis(undefined)\n }\n\n const isXAixsNoneTime = xAxis && xAxis.column && columnIsNonTime\n\n return (\n <DisclosurePanel\n title={panelTitle}\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"text-icontent flex flex-wrap gap-[10px]\">\n {supportName && (\n <label className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Name\n </AddonLabel>\n <input\n type=\"text\"\n className=\"sm:text-icontent border-main hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 w-40 rounded-r-md\"\n value={xAxis?.name}\n placeholder=\"Axis Name\"\n onChange={onChangeInput('name')}\n />\n </label>\n )}\n {supportSetType && (\n <span className=\"inline-flex h-8\">\n <span className=\"sm:text-icontent border-main inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-2\">\n X-Axis Type{' '}\n <PopoverTooltip\n strategy=\"fixed\"\n hideArrow\n placementOption=\"bottom\"\n text={\n <div className=\"text-text-foreground max-w-[300px] p-2\">\n <span className=\"font-medium\">Discrete axis</span> displays{' '}\n <span className=\"text-primary-600\">\n discrete values evenly\n </span>\n , while <span className=\"font-medium\">Continuous axis</span>{' '}\n shows{' '}\n <span className=\"text-primary-600\">\n continuous time series\n </span>{' '}\n and{' '}\n <span className=\"text-primary-600\">\n auto-fills missing time points\n </span>\n </div>\n }\n >\n <LuInfo className=\"text-text-foreground-secondary h-4 w-4\" />\n </PopoverTooltip>\n </span>\n <TypeSelect\n className=\"h-8 w-40\"\n buttonClassName=\"h-full border-main rounded-l-none items-center inline-flex items-center\"\n value={xAxis?.type || 'time'}\n onChange={(val) => {\n setXAxis({ ...xAxis, type: val })\n }}\n options={[\n { label: 'Continuous', value: 'time' },\n { label: 'Discrete', value: 'category' }\n ]}\n />\n </span>\n )}\n {columnSelect && (\n <span className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Column\n </AddonLabel>\n {columnSelect}\n </span>\n )}\n {supportSort && isXAixsNoneTime && (\n <span className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Sort By\n </AddonLabel>\n <SortSelect\n className=\"h-8 w-20 leading-8\"\n buttonClassName=\"h-full border-main rounded-none inline-flex items-center\"\n options={sortByItems}\n value={xAxis?.sort?.sortBy as string}\n onChange={(value: string) => {\n setXAxis({\n ...xAxis,\n sort: { ...xAxis?.sort, sortBy: value as SortByLike }\n })\n }}\n placeholder=\"Sort By\"\n />\n <OrderSelect\n className=\"h-8 w-40 leading-8\"\n buttonClassName=\"h-full border-l-0 border-main rounded-l-none inline-flex items-center\"\n options={orderItems}\n value={xAxis?.sort?.orderDesc}\n onChange={(value) => {\n setXAxis({\n ...xAxis,\n sort: { ...xAxis?.sort, orderDesc: value }\n })\n }}\n placeholder=\"Sort Order\"\n />\n </span>\n )}\n <Button\n type=\"button\"\n role=\"link\"\n onClick={onClickResetXAxis}\n className=\"h-8\"\n >\n Reset\n </Button>\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport {\n DisclosurePanel,\n NewButtonGroup as ButtonGroup,\n Checkbox\n} from '@sentio/ui-core'\nimport type { LineConfigLike, LineStyleLike } from '../../types'\n\nconst lineStyles: { label: string; value: LineStyleLike }[] = [\n { label: 'Solid', value: 'Solid' },\n { label: 'Dotted', value: 'Dotted' }\n]\n\ninterface Props {\n config?: LineConfigLike\n defaultOpen?: boolean\n onChange: (config: LineConfigLike) => void\n}\n\nexport const LineControls = ({ config, defaultOpen, onChange }: Props) => {\n const setStyle = (style: LineStyleLike) => {\n onChange(\n produce(config || {}, (draft) => {\n draft.style = style\n })\n )\n }\n const setSmooth = (smooth: boolean) => {\n onChange(\n produce(config || {}, (draft) => {\n draft.smooth = smooth\n })\n )\n }\n return (\n <DisclosurePanel\n title=\"Line style\"\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex items-center gap-4\">\n <ButtonGroup\n buttons={lineStyles}\n value={config?.style || 'Solid'}\n onChange={setStyle}\n small\n />\n <Checkbox\n label=\"Smooth Curves\"\n checked={config?.smooth}\n onChange={setSmooth}\n />\n </div>\n </DisclosurePanel>\n )\n}\n","import { useEffect, useMemo } from 'react'\nimport { produce } from 'immer'\nimport { Button as NewButton, DisclosurePanel, HelpIcon } from '@sentio/ui-core'\nimport type { LabelConfigLike } from '../../types'\n\ninterface Props {\n config?: LabelConfigLike\n setConfig: (value: LabelConfigLike) => void\n defaultOpen?: boolean\n}\n\nconst initialConfig: LabelConfigLike = {\n columns: [],\n alias: ''\n}\n\nexport const LabelControls = ({ config, setConfig, defaultOpen }: Props) => {\n // Migrate existing columns config to alias on component mount\n useEffect(() => {\n if (config?.columns && config.columns.length > 0 && !config.alias) {\n const aliasParts: string[] = []\n config.columns.forEach((colConfig) => {\n if (!colConfig.name) return // Skip if name is undefined\n\n if (colConfig.showLabel === false && colConfig.showValue === false) {\n // ignore\n } else if (colConfig.showValue === false) {\n aliasParts.push(colConfig.name)\n } else {\n aliasParts.push(`{{${colConfig.name}}}`)\n }\n })\n\n if (aliasParts.length > 0) {\n const migratedAlias = aliasParts.join(', ')\n setConfig(\n produce(config, (draft) => {\n draft.alias = migratedAlias\n draft.columns = [] // Clear the old columns config\n })\n )\n }\n }\n }, [config, setConfig])\n\n const onAliasChanged = (alias: string) => {\n setConfig(\n produce(config ?? initialConfig, (draft) => {\n draft.alias = alias\n })\n )\n }\n\n const _defaultOpen = useMemo(() => {\n if (defaultOpen) {\n return true\n }\n return (\n config?.alias !== '' || (config?.columns && config.columns.length > 0)\n )\n }, [config, defaultOpen])\n\n return (\n <DisclosurePanel\n title=\"Label Controls\"\n defaultOpen={_defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"inline-flex h-8\">\n <span className=\"sm:text-icontent border-main inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-2 font-medium\">\n Label Alias\n <HelpIcon\n text={\n <div className=\"text-icontent text-text-foreground\">\n <div>Series name override or template.</div>\n <div>\n Ex.{' '}\n <span className=\"text-primary mx-1 font-semibold italic\">\n {'{{contract}}'}\n </span>{' '}\n will be replaced with the value of the contract label.\n </div>\n </div>\n }\n />\n </span>\n <input\n type=\"text\"\n value={config?.alias || ''}\n onChange={(e) => onAliasChanged(e.target.value)}\n placeholder=\"Enter alias...\"\n className=\"focus:border-primary-500 sm:text-icontent border-main inline-flex w-64 items-center rounded-r-md border px-2\"\n />\n </div>\n <NewButton\n type=\"button\"\n role=\"link\"\n onClick={() => {\n setConfig(initialConfig)\n }}\n >\n Reset\n </NewButton>\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport { defaults } from 'lodash'\nimport {\n Checkbox,\n DisclosurePanel,\n NewButtonGroup as ButtonGroup\n} from '@sentio/ui-core'\nimport type { CalculationLike, PieConfigLike, PieTypeLike } from '../../types'\n\ninterface Props {\n config?: PieConfigLike\n defaultOpen?: boolean\n onChange: (config: PieConfigLike) => void\n}\n\nexport const defaultConfig: PieConfigLike = {\n pieType: 'Pie',\n calculation: 'LAST',\n showPercent: true,\n showValue: true,\n absValue: false\n}\n\nconst CalculationItems = [\n { label: 'Last', value: 'LAST' },\n { label: 'First', value: 'FIRST' },\n { label: 'Total', value: 'TOTAL' },\n { label: 'Mean', value: 'MEAN' },\n { label: 'Max', value: 'MAX' },\n { label: 'Min', value: 'MIN' }\n]\n\nconst PieTypeItems: { label: string; value: PieTypeLike }[] = [\n { label: 'Pie', value: 'Pie' },\n { label: 'Donut', value: 'Donut' }\n]\n\nexport function PieChartControls({ config, defaultOpen, onChange }: Props) {\n config = defaults(config, defaultConfig)\n\n function onCalculationChange(cal: CalculationLike) {\n config &&\n onChange(produce(config, (draft) => void (draft.calculation = cal)))\n }\n\n function onPieTypeChange(pieType: PieTypeLike) {\n config &&\n onChange(produce(config, (draft) => void (draft.pieType = pieType)))\n }\n\n function toggle(\n field: 'showValue' | 'showPercent' | 'absValue',\n value: boolean\n ) {\n config &&\n onChange(\n produce(config, (draft) => {\n draft[field] = value\n })\n )\n }\n\n return (\n <DisclosurePanel\n title=\"Pie Chart Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex items-center gap-4\">\n <div className=\"shadow-xs flex rounded-md\">\n <ButtonGroup\n small\n buttons={PieTypeItems}\n value={config.pieType}\n onChange={onPieTypeChange}\n />\n </div>\n <div className=\"shadow-xs flex rounded-md\">\n <span className=\"sm:text-ilabel border-main inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-3 \">\n Calculation\n </span>\n <select\n value={config.calculation}\n className=\"sm:text-ilabel text-text-foreground border-main hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 inline-flex items-center rounded-r-md border pl-4 pr-7\"\n onChange={(e) =>\n onCalculationChange(e.target.value as CalculationLike)\n }\n >\n {CalculationItems.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n </div>\n <Checkbox\n checked={config?.showValue}\n onChange={(v) => toggle('showValue', v)}\n label=\"Show value\"\n labelClassName=\"whitespace-nowrap\"\n />\n <Checkbox\n checked={config?.showPercent}\n onChange={(v) => toggle('showPercent', v)}\n label=\"Show percent\"\n labelClassName=\"whitespace-nowrap\"\n />\n <Checkbox\n checked={config?.absValue}\n onChange={(v) => toggle('absValue', v)}\n label=\"Use absolute values\"\n labelClassName=\"whitespace-nowrap\"\n />\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport { defaults } from 'lodash'\nimport { DisclosurePanel } from '@sentio/ui-core'\nimport type {\n BarGaugeConfigLike,\n CalculationLike,\n DirectionLike,\n SortByLike\n} from '../../types'\n\ninterface Props {\n config?: BarGaugeConfigLike\n defaultOpen?: boolean\n onChange: (config: BarGaugeConfigLike) => void\n}\n\nexport const defaultConfig: BarGaugeConfigLike = {\n direction: 'HORIZONTAL',\n calculation: 'LAST',\n sort: {\n sortBy: 'ByName',\n orderDesc: true\n }\n}\n\nconst directionItems = [\n { label: 'Horizontal', value: 'HORIZONTAL' },\n { label: 'Vertical', value: 'VERTICAL' }\n]\n\nconst CalculationItems = [\n { label: 'Last', value: 'LAST' },\n { label: 'First', value: 'FIRST' },\n { label: 'Total', value: 'TOTAL' },\n { label: 'Mean', value: 'MEAN' },\n { label: 'Max', value: 'MAX' },\n { label: 'Min', value: 'MIN' }\n]\n\nconst sortByItems = [\n { label: 'Name', value: 'ByName' },\n { label: 'Value', value: 'ByValue' }\n]\n\nconst orderItems = [\n { label: 'Ascendant', value: 'false' },\n { label: 'Descendant', value: 'true' }\n]\n\nexport function BarGaugeControls({ config, defaultOpen, onChange }: Props) {\n config = defaults(config, defaultConfig)\n\n function onCalculationChange(cal: CalculationLike) {\n config &&\n onChange(produce(config, (draft) => void (draft.calculation = cal)))\n }\n\n function onDirectionChange(dir: DirectionLike) {\n config && onChange(produce(config, (draft) => void (draft.direction = dir)))\n }\n\n function onOrderChange(orderDesc: boolean) {\n config &&\n onChange(\n produce(config, (draft) => {\n draft.sort = draft.sort || {}\n draft.sort.orderDesc = orderDesc\n })\n )\n }\n\n function onSortByChange(sortBy: SortByLike) {\n config &&\n onChange(\n produce(config, (draft) => {\n draft.sort = draft.sort || {}\n draft.sort.sortBy = sortBy\n })\n )\n }\n\n return (\n <DisclosurePanel\n title=\"Bar Gauge Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex items-center gap-4\">\n <div className=\"shadow-xs flex rounded-md\">\n <span className=\"sm:text-ilabel border-main inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-3 \">\n Direction\n </span>\n <select\n value={config.direction}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 inline-flex items-center rounded-r-md border pl-4 pr-7\"\n onChange={(e) => onDirectionChange(e.target.value as DirectionLike)}\n >\n {directionItems.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n </div>\n\n <div className=\"shadow-xs flex rounded-md\">\n <span className=\"sm:text-ilabel border-main inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-3 \">\n Calculation\n </span>\n <select\n value={config.calculation}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 inline-flex items-center rounded-r-md border pl-4 pr-7\"\n onChange={(e) =>\n onCalculationChange(e.target.value as CalculationLike)\n }\n >\n {CalculationItems.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n </div>\n\n <div className=\"shadow-xs flex rounded-md\">\n <span className=\"sm:text-ilabel border-main inline-flex items-center whitespace-nowrap rounded-l-md border border-r-0 bg-gray-50 px-3\">\n Sort by\n </span>\n <select\n value={config?.sort?.sortBy}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 inline-flex items-center border pl-4 pr-7\"\n onChange={(e) => onSortByChange(e.target.value as SortByLike)}\n >\n {sortByItems.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n <select\n value={config?.sort?.orderDesc + ''}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 inline-flex items-center rounded-r-md border border-l-0 pl-4 pr-7\"\n onChange={(e) => onOrderChange(e.target.value === 'true')}\n >\n {orderItems.map((d) => {\n return (\n <option key={d.label} value={d.value + ''}>\n {d.label}\n </option>\n )\n })}\n </select>\n </div>\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport { ComboInput, classNames } from '@sentio/ui-core'\nimport { AddonLabel as BaseAddonLabel } from './controls-ui'\nimport { ValueStringMapping } from './ValueStringMapping'\nimport type {\n MappingRuleLike,\n ValueConfigLike,\n ValueFormatterLike,\n ValueStyleLike\n} from '../../types'\n\nexport interface ValueFormatter {\n label: string\n value: ValueFormatterLike\n}\n\nexport const ValueFormatters: ValueFormatter[] = [\n { label: 'Number', value: 'NumberFormatter' },\n { label: 'Date', value: 'DateFormatter' },\n { label: 'String', value: 'StringFormatter' }\n]\n\ninterface Props {\n config: ValueConfigLike\n defaultOpen?: boolean\n onChange: (config: ValueConfigLike) => void\n formatters?: ValueFormatter[]\n showPrefix?: boolean\n showSuffix?: boolean\n}\n\nexport const defaultConfig: ValueConfigLike = {\n valueFormatter: 'NumberFormatter',\n showValueLabel: false,\n maxSignificantDigits: 3,\n dateFormat: 'LLL',\n mappingRules: [],\n style: 'None'\n}\n\nconst dateFormats = [\n { label: 'Localized format', value: 'LLL' },\n { label: 'ISO String', value: 'YYYY-MM-DDTHH:mm:ss.sssZ' }\n]\n\nconst CurrencySymbols = [\n { label: 'USD', value: '$' },\n { label: 'EUR', value: '€' },\n { label: 'GBP', value: '£' },\n { label: 'CNY or JPY', value: '¥' },\n { label: 'BTC', value: 'Ƀ' },\n { label: 'ETH', value: 'Ξ' }\n]\n\n// Value panel labels use px-3; thin adapter over the shared AddonLabel so call\n// sites keep passing only the border/rounded variant.\nconst AddonLabel = ({\n className,\n children\n}: {\n className?: string\n children: React.ReactNode\n}) => (\n <BaseAddonLabel className={classNames('px-3', className)}>\n {children}\n </BaseAddonLabel>\n)\n\nexport const ValueOptions = ({\n config,\n onChange,\n formatters = ValueFormatters,\n showPrefix,\n showSuffix\n}: Props) => {\n function onChangeDateFormat(f: string) {\n onChange(produce(config, (draft) => void (draft.dateFormat = f)))\n }\n function onChangeFormatter(f: ValueFormatterLike) {\n onChange(produce(config, (draft) => void (draft.valueFormatter = f)))\n }\n function onChangeSymbol(symbol?: string) {\n onChange(produce(config, (draft) => void (draft.currencySymbol = symbol)))\n }\n function onStyleChange(notation: ValueStyleLike) {\n onChange(\n produce(config, (draft) => {\n draft.style = notation\n })\n )\n }\n function onDigitsChange(value: string, option: string) {\n onChange(\n produce(config, (draft) => {\n const d = draft as Record<string, any>\n if (value) {\n const maxSignificantDigits = parseInt(value)\n if (maxSignificantDigits >= 0 && maxSignificantDigits <= 20) {\n d[option] = maxSignificantDigits\n }\n } else {\n delete d[option]\n }\n })\n )\n }\n\n function onMappingRulesChange(rules: MappingRuleLike[]) {\n onChange(produce(config, (draft) => void (draft.mappingRules = rules)))\n }\n\n function onPrefixChange(value: string) {\n onChange(\n produce(config, (draft) => {\n if (value) {\n draft.prefix = value\n } else {\n delete draft.prefix\n }\n })\n )\n }\n\n function onSuffixChange(value: string) {\n onChange(\n produce(config, (draft) => {\n if (value) {\n draft.suffix = value\n } else {\n delete draft.suffix\n }\n })\n )\n }\n\n function numberAddons(style: ValueStyleLike) {\n switch (style) {\n case 'None':\n return (\n <>\n <AddonLabel className=\"border border-l-0\">\n Fraction Digits\n </AddonLabel>\n <input\n disabled\n className=\"focus:border-primary-500 sm:text-ilabel min-w-20 border-main rounded-r-md border border-l-0 py-1\"\n value={''}\n />\n </>\n )\n case 'Percent':\n case 'Standard':\n return (\n <>\n <AddonLabel className=\"border border-x-0\">\n Fraction Digits\n </AddonLabel>\n <input\n type=\"number\"\n min={0}\n max={20}\n className=\"focus:border-primary-500 sm:text-ilabel min-w-20 border-main focus:ring-3 focus:ring-primary-600/30 hover:border-primary-600 rounded-r-md border py-1\"\n value={config.maxFractionDigits}\n placeholder={'0-20'}\n onChange={(e) =>\n onDigitsChange(e.target.value, 'maxFractionDigits')\n }\n />\n </>\n )\n case 'Currency':\n return (\n <>\n <AddonLabel className=\"border border-r-0\">Symbol</AddonLabel>\n <div className=\"w-28 \">\n <ComboInput\n onChange={onChangeSymbol}\n options={CurrencySymbols.map((s) => s.value)}\n displayFn={(s) => {\n const name = CurrencySymbols.find((c) => c.value === s)?.label\n return `${name} (${s})`\n }}\n placeholder={'$'}\n value={config?.currencySymbol}\n />\n </div>\n <AddonLabel className=\"border\">Precision</AddonLabel>\n <input\n type=\"number\"\n min={0}\n max={20}\n className=\"focus:border-primary-500 sm:text-ilabel min-w-20 border-main rounded-r-md border border-l-0 py-1\"\n value={config.precision}\n defaultValue={2}\n placeholder={'0-20'}\n onChange={(e) => onDigitsChange(e.target.value, 'precision')}\n />\n </>\n )\n default:\n return (\n <>\n <AddonLabel className=\"border border-x-0\">\n Max significant digits\n </AddonLabel>\n <input\n type=\"number\"\n min={1}\n max={21}\n className=\"focus:border-primary-600 sm:text-ilabel min-w-20 border-main hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 rounded-r-md border py-1\"\n value={config.maxSignificantDigits}\n placeholder={'1-21'}\n onChange={(e) =>\n onDigitsChange(e.target.value, 'maxSignificantDigits')\n }\n />\n </>\n )\n }\n }\n\n return (\n <>\n <div>\n <div className=\"flex\">\n <AddonLabel className=\"rounded-l-md border border-r-0\">\n Value formatter\n </AddonLabel>\n <select\n value={config.valueFormatter}\n className={classNames(\n 'sm:text-ilabel border-main text-text-foreground hover:border-primary-600 inline-flex items-center border py-1.5 pl-4 pr-7 focus:ring-0',\n config.valueFormatter == 'StringFormatter' ? 'rounded-r-md' : ''\n )}\n onChange={(e) =>\n onChangeFormatter(e.target.value as ValueFormatterLike)\n }\n >\n {formatters.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n {config.valueFormatter == 'NumberFormatter' && (\n <>\n <AddonLabel className=\"border border-l-0 border-r-0\">\n Style\n </AddonLabel>\n <select\n value={config.style}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 inline-flex items-center border py-1 pl-4 pr-7 focus:ring-0\"\n onChange={(e) =>\n onStyleChange(e.target.value as ValueStyleLike)\n }\n >\n <option value={'None'}>None</option>\n <option value={'Compact'}>Compact</option>\n <option value={'Standard'}>Standard</option>\n <option value={'Scientific'}>Scientific</option>\n <option value={'Percent'}>Percent</option>\n <option value={'Currency'}>Currency</option>\n </select>\n {config.style && numberAddons(config.style)}\n </>\n )}\n {config.valueFormatter == 'DateFormatter' && (\n <>\n <AddonLabel className=\"border border-l-0\">Date format</AddonLabel>\n <select\n value={config.dateFormat}\n className=\"sm:text-ilabel border-main text-text-foreground inline-flex items-center rounded-r-md border border-l-0 py-1 pl-4 pr-7\"\n onChange={(e) => onChangeDateFormat(e.target.value)}\n >\n {dateFormats.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n </>\n )}\n </div>\n </div>\n\n {/* Prefix and Suffix Configuration */}\n {(showPrefix || showSuffix) && (\n <div>\n <div className=\"mt-2 flex items-center gap-4\">\n {showPrefix && (\n <div className=\"border-main hover:border-primary-600 focus-within:border-primary-600 focus-within:ring-3 focus-within:ring-primary-500/30 text-icontent inline-flex items-center rounded-md border\">\n <div className=\"h-7.5 leading-7.5 border-r px-3\">Prefix</div>\n <input\n type=\"text\"\n className=\"border-0 px-3 py-1.5 focus:ring-0\"\n value={config.prefix || ''}\n placeholder=\"e.g., $, #\"\n onChange={(e) => onPrefixChange(e.target.value)}\n />\n </div>\n )}\n {showSuffix && (\n <div className=\"border-main hover:border-primary-600 focus-within:border-primary-600 focus-within:ring-3 focus-within:ring-primary-500/30 text-icontent inline-flex items-center rounded-md border\">\n <div className=\"h-7.5 leading-7.5 border-r px-3\">Suffix</div>\n <input\n type=\"text\"\n className=\"min-w-32 border-0 px-3 py-1.5 focus:ring-0\"\n value={config.suffix || ''}\n placeholder=\"e.g., %, USD, tokens\"\n onChange={(e) => onSuffixChange(e.target.value)}\n />\n </div>\n )}\n </div>\n </div>\n )}\n\n {config.valueFormatter == 'StringFormatter' && (\n <ValueStringMapping\n rules={config.mappingRules || []}\n onChange={onMappingRulesChange}\n />\n )}\n </>\n )\n}\n","import { LuPlus, LuTrash2 } from 'react-icons/lu'\nimport { Button, classNames } from '@sentio/ui-core'\nimport { produce } from 'immer'\nimport type { MappingRuleLike } from '../../types'\n\nconst operators = {\n '>': 'greater than',\n '>=': 'greater or equal',\n '==': 'equal',\n '!=': 'not equal',\n '<': 'less than',\n '<=': 'less or equal'\n}\n\ninterface Props {\n rules: MappingRuleLike[]\n onChange: (rules: MappingRuleLike[]) => void\n}\n\nconst renderTreeLine = (index: number, isLast: boolean) => {\n return (\n <div className=\"mr-2 flex w-3 flex-col items-center justify-center\">\n <div className=\"flex h-full w-full items-center\">\n <div\n className={classNames(\n 'w-px bg-gray-300',\n isLast\n ? 'h-1/2 self-start'\n : index === 0\n ? 'h-full self-end'\n : 'h-full'\n )}\n ></div>\n <div className=\"h-px w-3 bg-gray-300\"></div>\n </div>\n </div>\n )\n}\n\nexport function ValueStringMapping({ rules, onChange }: Props) {\n const addRule = () => {\n onChange(\n produce(rules, (draft) => {\n draft = draft || []\n draft.push({\n comparison: '==',\n value: 0,\n text: ''\n })\n })\n )\n }\n\n function removeRule(index: number) {\n onChange(\n produce(rules, (draft) => {\n draft.splice(index, 1)\n })\n )\n }\n\n function changeRule(index: number, field: string, value: any) {\n onChange(\n produce(rules, (draft) => {\n ;(draft[index] as Record<string, any>)[field] = value\n })\n )\n }\n\n return (\n <div className=\"flex w-full flex-col gap-2 rounded-md\">\n {(rules || []).map((rule, index) => {\n const isLast = index === (rules || []).length - 1\n return (\n <div\n key={index}\n className=\"text-text-foreground flex h-8 items-center\"\n >\n {renderTreeLine(index, isLast)}\n <span className=\"sm:text-ilabel inline-flex h-full items-center pr-2 font-medium\">\n If value is\n </span>\n <select\n value={rule.comparison}\n onChange={(e) => changeRule(index, 'comparison', e.target.value)}\n className=\"rounded-r-0 sm:text-ilabel border-main text-text-foreground focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 inline-flex h-full items-center rounded-l-md border border-r-0 bg-gray-50 py-1 pl-4 pr-7\"\n >\n {Object.entries(operators).map(([op, display]) => {\n return (\n <option key={op} value={op}>\n is {display}\n </option>\n )\n })}\n </select>\n <input\n type=\"text\"\n name=\"value\"\n id=\"value\"\n className=\"w-30 rounded-l-0 sm:text-ilabel border-main hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 block h-full rounded-r-md border px-2 py-1\"\n placeholder=\"0\"\n value={rule.value}\n onChange={(e) => {\n changeRule(index, 'value', e.target.value)\n }}\n />\n <span className=\"sm:text-ilabel inline-flex h-full items-center rounded-none px-2 font-medium\">\n , then show\n </span>\n <input\n type=\"text\"\n name=\"text\"\n id=\"text\"\n className=\"sm:text-ilabel border-main hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 block h-full w-80 rounded-md px-2 py-1\"\n placeholder=\"Display text (e.g. High, Low, Normal)\"\n value={rule.text}\n onChange={(e) => {\n changeRule(index, 'text', e.target.value)\n }}\n />\n {/* TODO: implement color mapping in data-grid component */}\n {/* <span className=\"sm:text-ilabel inline-flex h-full items-center rounded-none px-3 font-medium\">\n also set color\n </span>\n <span className=\"focus-within:ring-primary-500 rounded-md border border-main px-0.5 focus-within:border-transparent focus-within:ring-2\">\n <ColorSelect\n value={rule.colorTheme}\n onChange={(colorTheme) => {\n changeRule(index, 'colorTheme', colorTheme?.value)\n }}\n />\n </span>\n <div className=\"flex-1\"></div> */}\n <button\n type=\"button\"\n className=\"text-text-foreground-disabled hover:text-primary-600 mx-2 cursor-pointer\"\n aria-label=\"remove\"\n onClick={() => removeRule(index)}\n >\n <LuTrash2 className=\"icon\" aria-hidden=\"true\" />\n </button>\n </div>\n )\n })}\n <Button\n type=\"button\"\n role=\"secondary\"\n className=\"py-1.5! w-fit flex-none\"\n aria-label=\"remove\"\n onClick={addRule}\n icon={<LuPlus />}\n >\n Add Formatting Rule\n </Button>\n </div>\n )\n}\n","import { defaults } from 'lodash'\nimport { Checkbox, DisclosurePanel } from '@sentio/ui-core'\nimport { produce } from 'immer'\nimport {\n ValueFormatters,\n ValueOptions,\n type ValueFormatter\n} from './ValueOptions'\nimport type { ValueConfigLike } from '../../types'\n\ninterface Props {\n config?: ValueConfigLike\n defaultOpen?: boolean\n onChange: (config: ValueConfigLike) => void\n formatters?: ValueFormatter[]\n showPrefix?: boolean\n showSuffix?: boolean\n}\n\nexport const defaultConfig: ValueConfigLike = {\n valueFormatter: 'NumberFormatter',\n showValueLabel: false,\n maxSignificantDigits: 3,\n dateFormat: 'LLL',\n mappingRules: [],\n style: 'None',\n maxFractionDigits: 2\n}\n\nexport const ValueControls = ({\n config,\n defaultOpen,\n onChange,\n formatters = ValueFormatters,\n showPrefix,\n showSuffix\n}: Props) => {\n config = defaults(config || {}, defaultConfig)\n function toggleShowValueLabel(checked: boolean) {\n config &&\n onChange(\n produce(config, (draft) => void (draft.showValueLabel = checked))\n )\n }\n function toggleTooltipTotal(checked: boolean) {\n config &&\n onChange(produce(config, (draft) => void (draft.tooltipTotal = checked)))\n }\n return (\n <DisclosurePanel\n title=\"Value Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <ValueOptions\n onChange={onChange}\n config={config}\n formatters={formatters}\n showPrefix={showPrefix}\n showSuffix={showSuffix}\n />\n\n <div className=\"mt-2 flex items-center gap-2\">\n <Checkbox\n checked={config?.showValueLabel}\n onChange={toggleShowValueLabel}\n label=\"Show value label\"\n />\n <Checkbox\n checked={config?.tooltipTotal}\n onChange={toggleTooltipTotal}\n label=\"Show total in tooltip\"\n />\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport { LuMinus, LuPlus } from 'react-icons/lu'\nimport { Button, DisclosurePanel } from '@sentio/ui-core'\nimport type { MarkerLike } from '../../types'\n\ninterface Props {\n markers?: MarkerLike[]\n onChange: (v: MarkerLike[]) => void\n}\n\nconst labelCls =\n 'inline-flex items-center border border-r-0 sm:text-icontent border-main bg-gray-50 px-2 rounded-l-md'\nconst inputCls =\n 'border focus:border-primary-500 rounded-r-md sm:text-icontent border-main w-28 hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30'\n\nfunction MarkerInput({\n marker,\n label,\n onChange,\n onRemove\n}: {\n marker: MarkerLike\n label: string\n onChange: (v: MarkerLike) => void\n onRemove: () => void\n}) {\n const _onChange = (field: string, value: any) => {\n onChange(\n produce(marker, (draft) => {\n ;(draft as Record<string, any>)[field] = value\n })\n )\n }\n return (\n <div className=\"flex items-center gap-[10px]\">\n <label className=\"inline-flex h-8\">\n <span className={labelCls}>\n <span className=\"pr-2\">{label}</span>\n <select\n className=\"sm:text-ilabel border-main text-text-foreground inline-flex h-full items-center border border-b-0 border-t-0 bg-gray-50 p-0 pl-4 pr-7 focus:border-transparent focus:ring-inset\"\n value={marker.type}\n onChange={(e) => _onChange('type', e.target.value)}\n >\n <option value={'LINE'}>horizontal line</option>\n <option value={'LINEX'}>vertical line</option>\n </select>\n <span className=\"pl-2\">at</span>\n </span>\n {marker.type === 'LINEX' ? (\n <input\n className={inputCls}\n type=\"text\"\n value={marker.valueX}\n placeholder=\"YYYY-MM-DD\"\n onChange={(e) => _onChange('valueX', e.target.value)}\n />\n ) : (\n <input\n className={inputCls}\n type=\"text\"\n value={marker.value}\n onChange={(e) => _onChange('value', e.target.value)}\n />\n )}\n </label>\n <label className=\"inline-flex h-8\">\n <span className={labelCls}>Color</span>\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex w-8 items-center justify-center\">\n <div className=\"h-4 w-4\" style={{ background: marker.color }} />\n </div>\n <input\n className={inputCls + ' pl-8'}\n type=\"text\"\n value={marker.color}\n onChange={(e) => _onChange('color', e.target.value)}\n />\n </div>\n </label>\n <label className=\"inline-flex h-8\">\n <span className={labelCls}>Label</span>\n <input\n className={inputCls}\n type=\"text\"\n value={marker.label}\n onChange={(e) => _onChange('label', e.target.value)}\n />\n </label>\n <button\n type=\"button\"\n className=\"ml-2 flex h-4 w-4 cursor-pointer items-center justify-center rounded-full bg-gray-800 hover:bg-red-600\"\n aria-label=\"Remove marker\"\n onClick={onRemove}\n >\n <LuMinus\n className=\"dark:text-default-bg h-3 w-3 text-white\"\n aria-hidden=\"true\"\n />\n </button>\n </div>\n )\n}\n\nconst DEFAULT_MARKER: MarkerLike = { value: 0, color: '#ff0000', label: '' }\n\nexport function MarkerControls({ markers, onChange }: Props) {\n const _markers = markers?.length ? markers : []\n\n const onAdd = () => {\n onChange(\n produce(_markers, (draft) => {\n draft.push(DEFAULT_MARKER)\n })\n )\n }\n\n const onRemove = (index: number) => {\n onChange(\n produce(_markers, (draft) => {\n draft.splice(index, 1)\n })\n )\n }\n\n const _onChange = (index: number, marker: MarkerLike) => {\n onChange(\n produce(_markers, (draft) => {\n draft[index] = marker\n })\n )\n }\n\n return (\n <DisclosurePanel\n title=\"Markers\"\n containerClassName=\"w-full bg-default-bg\"\n defaultOpen={true}\n >\n <div className=\"space-y-2\">\n {_markers.map((marker, index) => (\n <MarkerInput\n marker={marker}\n key={index}\n label={String.fromCharCode(65 + (index % 26))}\n onChange={(v) => _onChange(index, v)}\n onRemove={() => onRemove(index)}\n />\n ))}\n <div>\n <Button type=\"button\" onClick={onAdd}>\n <LuPlus className=\"h-4 w-4\" aria-hidden=\"true\" />\n Add Marker\n </Button>\n </div>\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport { defaults } from 'lodash'\nimport { DisclosurePanel } from '@sentio/ui-core'\nimport { AddonLabel } from './controls-ui'\nimport type { ChartConfigLike, DataConfigLike } from '../../types'\n\ninterface Props {\n defaultOpen?: boolean\n onChange: (config: DataConfigLike) => void\n chartConfig?: ChartConfigLike\n /** Per-chart-type fallback when no explicit limit is set (app resolves from ChartTypeLimits). */\n defaultSeriesLimit?: number\n}\n\nexport const defaultConfig: DataConfigLike = {\n seriesLimit: undefined\n}\n\nexport function DataControls({\n defaultOpen,\n onChange,\n chartConfig,\n defaultSeriesLimit = 20\n}: Props) {\n const config = defaults(chartConfig?.dataConfig, defaultConfig)\n\n // migrate tableConfig.rowLimit to dataConfig.seriesLimit\n const currentSeriesLimit =\n config?.seriesLimit || chartConfig?.tableConfig?.rowLimit\n\n function onSeriesLimitChange(e: React.ChangeEvent<HTMLInputElement>) {\n const value = parseInt(e.target.value)\n if (value > 1000) {\n return\n }\n config &&\n onChange(\n produce(config, (draft) => {\n draft.seriesLimit = value\n })\n )\n }\n\n function onKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n // Prevent non-numeric character input (except for delete, backspace, arrow keys, etc.)\n if (\n !/[0-9]/.test(e.key) &&\n !['Backspace', 'Delete', 'ArrowLeft', 'ArrowRight', 'Tab'].includes(e.key)\n ) {\n e.preventDefault()\n }\n }\n\n return (\n <DisclosurePanel\n title=\"Data Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-3\">\n Max Series Limit\n </AddonLabel>\n <input\n type=\"number\"\n max={1000}\n min={20}\n className=\"text-icontent border-main hover:border-primary-600 focus:ring-3 focus:ring-primary-600/30 focus:border-primary-600 mr-1 w-32 rounded-r-md\"\n value={currentSeriesLimit ?? defaultSeriesLimit}\n onChange={onSeriesLimitChange}\n onKeyDown={onKeyDown}\n />\n </div>\n </DisclosurePanel>\n )\n}\n","import { produce } from 'immer'\nimport { defaults } from 'lodash'\nimport { useCallback, type ReactNode } from 'react'\nimport { DisclosurePanel } from '@sentio/ui-core'\nimport { AddonLabel } from './controls-ui'\nimport type { ScatterConfigLike } from '../../types'\n\ninterface Props {\n config?: ScatterConfigLike\n defaultOpen?: boolean\n onChange: (config: ScatterConfigLike) => void\n /** App-supplied sql column picker (Size By Column). */\n columnSelect?: (props: {\n value?: string\n onChange: (col: string) => void\n }) => ReactNode\n /** App-supplied color picker (Size Color Mapping). */\n colorPicker?: (props: {\n value?: string\n onChange: (color?: string) => void\n }) => ReactNode\n}\n\nexport const defaultConfig: ScatterConfigLike = {\n minSize: 5,\n maxSize: 30\n}\n\nexport function ScatterControls({\n config,\n defaultOpen,\n onChange,\n columnSelect,\n colorPicker\n}: Props) {\n config = defaults(config, defaultConfig)\n\n const onSymbolSizeColumnChange = useCallback(\n (column: string) => {\n config &&\n onChange(produce(config, (draft) => void (draft.symbolSize = column)))\n },\n [config, onChange]\n )\n\n const onSymbolColorChange = useCallback(\n (color?: string) => {\n config && onChange(produce(config, (draft) => void (draft.color = color)))\n },\n [config, onChange]\n )\n\n const onMinSizeChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseInt(event.target.value) || 5\n config &&\n onChange(produce(config, (draft) => void (draft.minSize = value)))\n },\n [config, onChange]\n )\n\n const onMaxSizeChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseInt(event.target.value) || 50\n config &&\n onChange(produce(config, (draft) => void (draft.maxSize = value)))\n },\n [config, onChange]\n )\n\n return (\n <DisclosurePanel\n title=\"Scatter Chart Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex items-center gap-4\">\n {columnSelect && (\n <div className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Size By Column\n </AddonLabel>\n {columnSelect({\n value: config.symbolSize,\n onChange: onSymbolSizeColumnChange\n })}\n </div>\n )}\n {colorPicker && (\n <div className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Size Color Mapping\n </AddonLabel>\n {colorPicker({\n value: config.color,\n onChange: onSymbolColorChange\n })}\n </div>\n )}\n <div className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Min Size\n </AddonLabel>\n <input\n name=\"minSize\"\n type=\"number\"\n className=\"focus:ring-primary-600/30 focus:border-primary-600 border-main text-icontent focus:ring-3 h-8 w-24 rounded-r-md border px-2\"\n value={config.minSize || 5}\n onChange={onMinSizeChange}\n min=\"1\"\n max=\"60\"\n />\n </div>\n <div className=\"inline-flex h-8\">\n <AddonLabel className=\"rounded-l-md border border-r-0 px-2\">\n Max Size\n </AddonLabel>\n <input\n name=\"maxSize\"\n type=\"number\"\n className=\"focus:ring-primary-600/30 focus:border-primary-600 border-main focus:ring-3 h-8 w-24 rounded-r-md border px-2 text-sm\"\n value={config.maxSize || 30}\n onChange={onMaxSizeChange}\n min=\"1\"\n max=\"60\"\n />\n </div>\n </div>\n </DisclosurePanel>\n )\n}\n","import { useMemo } from 'react'\nimport { produce } from 'immer'\nimport { defaults } from 'lodash'\nimport { Checkbox, DisclosurePanel, classNames } from '@sentio/ui-core'\nimport type {\n CalculationLike,\n ColumnTypeLike,\n TableConfigLike,\n TableDataLike,\n ValueConfigLike\n} from '../../types'\nimport { getColumnNameId } from '../table-utils'\nimport { ValueOptions } from './ValueOptions'\nimport { defaultConfig as defaultValueConfig } from './ValueControls'\n\ninterface Props {\n config?: TableConfigLike\n defaultOpen?: boolean\n onChange: (config: TableConfigLike) => void\n data?: TableDataLike\n}\n\nexport const defaultConfig: TableConfigLike = {\n calculation: 'LAST',\n sortColumns: [],\n showColumns: undefined,\n columnWidths: {},\n columnOrders: [],\n showPlainData: false,\n calculations: {},\n valueConfigs: {}\n}\n\nexport function getDefaultValueConfig(type?: ColumnTypeLike): ValueConfigLike {\n switch (type) {\n case 'NUMBER':\n return {\n ...defaultValueConfig,\n valueFormatter: 'NumberFormatter'\n }\n case 'TIME':\n return {\n ...defaultValueConfig,\n valueFormatter: 'DateFormatter'\n }\n default:\n return {\n ...defaultValueConfig,\n valueFormatter: 'StringFormatter'\n }\n }\n}\n\nconst CalculationItems = [\n { label: 'All', value: 'ALL' },\n { label: 'Last', value: 'LAST' },\n { label: 'First', value: 'FIRST' },\n { label: 'Total', value: 'TOTAL' },\n { label: 'Mean', value: 'MEAN' },\n { label: 'Max', value: 'MAX' },\n { label: 'Min', value: 'MIN' }\n]\n\nexport function TableControls({ config, defaultOpen, onChange, data }: Props) {\n config = defaults({}, config, defaultConfig)\n\n function onCalculationChange(col: string, cal: CalculationLike) {\n config &&\n onChange(\n produce(config, (draft) => {\n if (col === '') {\n delete draft.calculations\n draft.calculation = cal\n } else {\n draft.calculations = draft.calculations || {}\n draft.calculations[col] = cal\n }\n })\n )\n }\n\n function onValueConfigChange(col: string, valueConfig: ValueConfigLike) {\n config &&\n onChange(\n produce(config, (draft) => {\n draft.valueConfigs = draft.valueConfigs || {}\n draft.valueConfigs[col] = valueConfig\n })\n )\n }\n\n function onMapSeriesAsColumnsChange(checked: boolean) {\n config &&\n onChange(produce(config, (draft) => void (draft.showPlainData = checked)))\n }\n\n const calculations = useMemo(() => {\n if (!config?.showPlainData) {\n return CalculationItems.filter((item) => item.value !== 'ALL')\n }\n return CalculationItems\n }, [config?.showPlainData])\n\n const isSql = data?.result !== undefined\n\n const columns = useMemo(() => {\n if (config?.showPlainData) {\n return []\n }\n const map: { [k: string]: { name: string; type?: ColumnTypeLike } } = {}\n\n if (isSql) {\n const results = data?.result\n if (results) {\n for (const [name, type] of Object.entries(results?.columnTypes || {})) {\n map[name] = {\n name,\n type\n }\n }\n }\n } else {\n const results = data?.results\n for (const r of results || []) {\n for (const s of r?.matrix?.samples || []) {\n const { columnId, columnName } = getColumnNameId(\n s?.metric?.labels || {},\n r.alias,\n s.metric?.displayName\n )\n map[columnId] = {\n name: columnName\n }\n }\n }\n }\n return Object.keys(map)\n .sort()\n .map((k) => ({ columnId: k, column: map[k] }))\n }, [data, config])\n\n return (\n <DisclosurePanel\n title=\"Table Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n {!isSql && (\n <div className=\"min-h-8 flex items-center\">\n <div className=\"w-48 px-2\">\n <Checkbox\n checked={config?.showPlainData}\n onChange={onMapSeriesAsColumnsChange}\n label=\"Show plain data\"\n />\n </div>\n {config?.showPlainData && (\n <div className=\"flex\">\n <span className=\"border-main sm:text-icontent inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-3\">\n Calculation\n </span>\n <select\n value={config.calculation}\n className=\"border-main text-text-foreground sm:text-icontent focus:border-primary-600 hover:border-primary-600 inline-flex items-center rounded-r-md border pl-4 pr-7 focus:ring-0\"\n onChange={(e) => {\n onCalculationChange('', e.target.value as CalculationLike)\n }}\n >\n {calculations.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n </div>\n )}\n <div></div>\n </div>\n )}\n\n <div className=\"divide-border-color flex flex-col gap-2 divide-y\">\n {columns.map(({ columnId, column }) => (\n <div className=\"flex items-start pb-2\" key={columnId}>\n <h4 className=\"text-text-foreground text-icontent leading-7.5 w-48 px-2 font-medium\">\n {column.name}\n </h4>\n <div className=\"flex flex-1 flex-wrap items-start gap-2 rounded-md\">\n {!isSql && (\n <div className=\"flex\">\n <span className=\"sm:text-ilabel border-main inline-flex items-center rounded-l-md border border-r-0 bg-gray-50 px-3\">\n Calculation\n </span>\n <select\n value={\n (config?.calculations &&\n config?.calculations[columnId]) ||\n 'LAST'\n }\n className=\"border-main text-text-foreground sm:text-icontent focus:border-primary-600 hover:border-primary-600 inline-flex items-center rounded-r-md border pl-4 pr-7 focus:ring-0\"\n onChange={(e) =>\n onCalculationChange(\n columnId,\n e.target.value as CalculationLike\n )\n }\n >\n {calculations.map((d) => {\n return (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n )\n })}\n </select>\n </div>\n )}\n <ValueOptions\n onChange={(cfg) => onValueConfigChange(columnId, cfg)}\n config={\n (config?.valueConfigs && config.valueConfigs[columnId]) ||\n getDefaultValueConfig(column.type)\n }\n />\n </div>\n </div>\n ))}\n </div>\n </DisclosurePanel>\n )\n}\n","import { startCase } from 'lodash'\n\n// Curly-brace template token, e.g. \"{{ method }}\".\nconst TEMPLATE_TOKEN = /{{([\\s\\S]+?)}}/g\n\n// Map a few proto label keys to friendlier template names, preserving the\n// originals too. Pure — no proto / worker deps.\nexport function sanitizeLabels(labels: { [k: string]: string }): {\n [k: string]: string\n} {\n const result: { [k: string]: string } = {}\n for (const k in labels) {\n switch (k) {\n case 'contract_name':\n result['contract'] = labels[k]\n break\n case 'contract_address':\n result['address'] = labels[k]\n break\n }\n result[k] = labels[k]\n }\n return result\n}\n\n// Resolve a `{{token}}` alias against a series' labels. Returns undefined when\n// no alias is given so callers can fall back to a display name.\nexport function aliasTemplate(\n alias: string | undefined | null,\n labels: { [k: string]: string }\n): string | undefined {\n if (alias) {\n try {\n const safe = sanitizeLabels(labels)\n return alias.replace(TEMPLATE_TOKEN, (_, m1) => {\n const value = safe[m1.trim()]\n return value == null ? `` : value\n })\n } catch (e) {\n return alias\n }\n }\n}\n\nfunction escapeColumnId(id: string): string {\n return id.replace(/[\\W_.]+/g, '_')\n}\n\n// Derive a stable column id + human-readable name for a metrics series from\n// its alias template (or display name fallback) and labels.\nexport function getColumnNameId(\n labels: { [p: string]: string },\n alias?: string,\n displayName?: string\n): { columnName: string; columnId: string } {\n const s = aliasTemplate(alias, labels) || startCase(displayName)\n return { columnName: s, columnId: escapeColumnId(s) }\n}\n","import { useState, useRef, useCallback, useEffect, useMemo } from 'react'\nimport { BaseDialog } from '@sentio/ui-core'\nimport type { DashboardLike } from '../types/dashboard'\n\ninterface Props {\n dashboard?: DashboardLike\n open: boolean\n onClose: () => void\n onUpdate: (data: DashboardLike) => Promise<void>\n}\n\nexport const EditDashboardDialog = ({\n dashboard,\n open,\n onClose,\n onUpdate\n}: Props) => {\n const [processing, setProcessing] = useState(false)\n const [updateDisabled, setUpdateDisabled] = useState(true)\n const inputElementRef = useRef<HTMLInputElement | null>(null)\n\n const onCloseAndReset = useCallback(() => {\n onClose?.()\n if (dashboard?.name && inputElementRef.current) {\n inputElementRef.current.value = dashboard.name\n }\n }, [onClose, dashboard?.name])\n\n const onOk = useCallback(() => {\n if (!inputElementRef.current?.value) {\n return\n }\n setProcessing(true)\n onUpdate({ ...dashboard, name: inputElementRef.current?.value })\n .then(() => {\n onCloseAndReset()\n })\n .finally(() => {\n setProcessing(false)\n })\n }, [onCloseAndReset, onUpdate, dashboard])\n\n useEffect(() => {\n if (open && dashboard?.name && inputElementRef.current) {\n inputElementRef.current.value = dashboard.name\n }\n }, [open, dashboard?.name])\n\n const onInputChange = useCallback(\n (evt: React.ChangeEvent<HTMLInputElement>) => {\n const value = evt.target.value\n if (!value || value === dashboard?.name) {\n setUpdateDisabled(true)\n } else {\n setUpdateDisabled(false)\n }\n },\n [dashboard?.name]\n )\n\n const okProps = useMemo(\n () => ({\n processing,\n disabled: updateDisabled\n }),\n [updateDisabled, processing]\n )\n\n return (\n <BaseDialog\n title=\"Edit Dashboard\"\n open={open}\n onClose={onCloseAndReset}\n cancelText=\"Close\"\n onCancel={onCloseAndReset}\n onOk={onOk}\n okProps={okProps}\n okText=\"Update\"\n footerBorder={false}\n initialFocus={inputElementRef}\n >\n <form\n method=\"dialog\"\n className=\"text-text-foreground relative mb-4 mt-2 px-4\"\n onSubmit={onOk}\n >\n <div className=\"grid py-2 text-sm\">\n <div className=\"sm:text-ilabel text-text-foreground-secondary mb-2 mt-1\">\n Dashboard Name\n </div>\n <input\n defaultValue={dashboard?.name}\n placeholder=\"Provide a new name for your dashboard\"\n type=\"text\"\n required={true}\n name=\"dashboard-name\"\n id=\"new-dashboard-name\"\n className=\"focus:border-primary-600 focus:ring-primary-600/30 focus:ring-3 hover:border-primary-600 sm:text-ilabel border-main block w-full rounded-md\"\n ref={inputElementRef}\n onChange={onInputChange}\n />\n </div>\n </form>\n </BaseDialog>\n )\n}\n","import React from 'react'\nimport { BarLoading, Button } from '@sentio/ui-core'\nimport { useResizeDetector } from 'react-resize-detector'\nimport { isString } from 'lodash'\nimport { RefreshButton } from '../charts/RefreshContext'\n\ninterface Props {\n data?: any\n logoSrc?: string\n onNavigateToDatasource?: () => void\n}\n\nexport const ErrorChart = React.memo(function ErrorChart({\n data,\n logoSrc,\n onNavigateToDatasource\n}: Props) {\n const { ref, width, height } = useResizeDetector()\n let hintMessage: React.ReactNode\n if (data?.code === 5) {\n hintMessage = (\n <span>\n No active processor found\n <br /> Check the\n <Button role=\"link\" onClick={onNavigateToDatasource}>\n datasource\n </Button>\n page for more details.\n </span>\n )\n } else if (data?.status === 429) {\n return (\n <BarLoading\n className=\"bg-default-bg absolute w-full\"\n hint={\n <span className=\"text-xs font-normal\">\n Too many simultaneous requests, retrying later...\n </span>\n }\n width={160}\n />\n )\n } else {\n hintMessage = data?.message ?? 'Something went wrong'\n }\n const imageSize = Math.min(\n Math.min(64, width ? width * 0.4 : 64),\n Math.min(64, height ? height * 0.4 : 64)\n )\n return (\n <div className=\"flex h-full w-full items-center\" ref={ref}>\n <div className=\"w-full space-y-4 text-center\">\n {imageSize < 10 || !logoSrc ? null : (\n <img\n className=\"mx-auto\"\n src={logoSrc}\n width={imageSize}\n height={imageSize}\n style={{ width: imageSize, height: 'auto' }}\n alt=\"gray logo\"\n />\n )}\n <div\n title={isString(hintMessage) ? hintMessage : undefined}\n className={`text-text-foreground-secondary font-icontent text-icontent px-4 ${\n height && height < 200 ? 'line-clamp-1' : 'line-clamp-2'\n }`}\n >\n {hintMessage}\n </div>\n <RefreshButton />\n </div>\n </div>\n )\n})\n","import { useEffect, useMemo, useRef, useState } from 'react'\nimport { BaseDialog, Select, classNames } from '@sentio/ui-core'\nimport { LuCheck } from 'react-icons/lu'\nimport type { GroupStyleLike } from '../types/enums'\nimport { useDarkMode } from '../utils/use-dark-mode'\nimport {\n DEFAULT_HIGHLIGHT_KEY,\n HIGHLIGHT_COLORS,\n resolveHighlight\n} from './group-styles'\n\ninterface Props {\n open: boolean\n onClose: () => void\n // Existing values; the dialog seeds its draft state from them whenever it\n // opens, so cancelling discards unsaved edits.\n title: string\n style: GroupStyleLike\n highlightColor: string\n onSave: (next: {\n title: string\n style: GroupStyleLike\n highlightColor: string\n }) => void\n}\n\ninterface StyleCardProps {\n selected: boolean\n label: string\n onClick: () => void\n preview: React.ReactNode\n}\n\nfunction StyleCard({ selected, label, onClick, preview }: StyleCardProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={classNames(\n 'flex flex-col items-stretch overflow-hidden rounded-lg border text-left transition-colors',\n selected\n ? 'border-primary-600 ring-primary-600/30 ring-3 shadow-sm'\n : 'border-main hover:border-primary-400'\n )}\n >\n <div className=\"bg-hover/40 flex h-28 items-center justify-center\">\n {preview}\n </div>\n <div\n className={classNames(\n 'border-main flex items-center justify-center gap-1.5 border-t px-2 py-2 text-sm',\n selected\n ? 'text-primary-600 font-semibold'\n : 'text-text-foreground font-medium'\n )}\n >\n {selected && <LuCheck className=\"h-3.5 w-3.5\" />}\n {label}\n </div>\n </button>\n )\n}\n\n// Mini-previews — render the same visual treatment that resolveHeaderStyle\n// applies on the real GroupPanel, so the card always matches the live result.\nfunction DefaultPreview() {\n return (\n <div className=\"border-main bg-default-bg text-text-foreground flex h-16 w-32 items-center rounded border px-2 text-base\">\n Title\n </div>\n )\n}\n\nfunction EmphasisPreview({\n color\n}: {\n color: { solid: string; foreground: string }\n}) {\n return (\n <div className=\"border-main bg-default-bg flex h-16 w-32 flex-col rounded border\">\n <div\n className=\"flex h-9 items-center justify-center text-sm font-semibold\"\n style={{ backgroundColor: color.solid, color: color.foreground }}\n >\n Title\n </div>\n <div className=\"flex-1\" />\n </div>\n )\n}\n\nexport function EditGroupDialog({\n open,\n onClose,\n title,\n style,\n highlightColor,\n onSave\n}: Props) {\n const [draftTitle, setDraftTitle] = useState(title)\n const [draftStyle, setDraftStyle] = useState<GroupStyleLike>(style)\n const [draftColor, setDraftColor] = useState<string>(highlightColor)\n const titleRef = useRef<HTMLInputElement | null>(null)\n const isDark = useDarkMode()\n\n // Re-seed every time the dialog opens so cancelling leaves no residue.\n useEffect(() => {\n if (!open) return\n setDraftTitle(title)\n setDraftStyle(style || 'DEFAULT')\n // If the user is opening a styled group that never had a color set, seed\n // with the default so the preview isn't blank.\n setDraftColor(\n highlightColor ||\n (style && style !== 'DEFAULT' ? DEFAULT_HIGHLIGHT_KEY : '')\n )\n }, [open, title, style, highlightColor])\n\n const previewColor = useMemo(\n () => resolveHighlight(draftColor, isDark),\n [draftColor, isDark]\n )\n\n const onPickStyle = (next: GroupStyleLike) => {\n setDraftStyle(next)\n // Auto-seed a default color when moving into a styled mode for the first\n // time — otherwise the preview shows a blank tint.\n if (next !== 'DEFAULT' && !draftColor) {\n setDraftColor(DEFAULT_HIGHLIGHT_KEY)\n }\n }\n\n const onOk = () => {\n onSave({\n title: draftTitle.trim() || 'Group',\n style: draftStyle,\n // Persist '' for DEFAULT so we don't pollute the model with an unused\n // color when the user reverts.\n highlightColor:\n draftStyle === 'DEFAULT' ? '' : draftColor || DEFAULT_HIGHLIGHT_KEY\n })\n onClose()\n }\n\n const colorOptions = useMemo(\n () =>\n HIGHLIGHT_COLORS.map((c) => {\n const resolved = resolveHighlight(c.key, isDark)\n return {\n value: c.key,\n title: c.name,\n label: ({ selected }: { selected?: boolean }) => (\n <div className=\"flex w-full items-center gap-2.5 pr-2\">\n <div\n className=\"flex h-5 w-5 items-center justify-center rounded text-xs font-bold\"\n style={{\n backgroundColor: resolved.solid,\n color: resolved.foreground\n }}\n >\n T\n </div>\n <span className=\"flex-1 text-sm\">{c.name}</span>\n {selected && <LuCheck className=\"text-primary-600 h-4 w-4\" />}\n </div>\n )\n }\n }),\n [isDark]\n )\n\n return (\n <BaseDialog\n title=\"Edit Group\"\n open={open}\n onClose={onClose}\n cancelText=\"Cancel\"\n onCancel={onClose}\n onOk={onOk}\n okText=\"Save\"\n panelClassName=\"sm:max-w-xl\"\n initialFocus={titleRef}\n >\n <div className=\"text-text-foreground px-4 pb-2 pt-4\">\n <h4 className=\"text-text-foreground mb-3 text-sm font-semibold\">\n Display options\n </h4>\n\n <label className=\"text-text-foreground-secondary text-ilabel mb-1 block\">\n Title\n </label>\n <input\n ref={titleRef}\n type=\"text\"\n value={draftTitle}\n onChange={(e) => setDraftTitle(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n onOk()\n }\n }}\n className=\"focus:border-primary-600 focus:ring-primary-600/30 focus:ring-3 hover:border-primary-600 sm:text-ilabel border-main mb-4 block w-full rounded-md\"\n />\n\n <div className=\"mb-4 grid grid-cols-2 gap-3\">\n <StyleCard\n selected={draftStyle === 'DEFAULT'}\n label=\"Default\"\n onClick={() => onPickStyle('DEFAULT')}\n preview={<DefaultPreview />}\n />\n <StyleCard\n selected={draftStyle === 'EMPHASIS'}\n label=\"Emphasis\"\n onClick={() => onPickStyle('EMPHASIS')}\n preview={<EmphasisPreview color={previewColor} />}\n />\n </div>\n\n {draftStyle !== 'DEFAULT' && (\n <>\n <label className=\"text-text-foreground-secondary text-ilabel mb-1 block\">\n Highlight Color\n </label>\n <Select\n value={draftColor || DEFAULT_HIGHLIGHT_KEY}\n onChange={(v) => setDraftColor(v as string)}\n options={colorOptions}\n size=\"md\"\n asLayer\n />\n </>\n )}\n </div>\n </BaseDialog>\n )\n}\n","import type { GroupStyleLike } from '../types/enums'\nimport { sentioColors } from '../charts/theme/sentio-colors'\n\n// Curated palette for the Group header highlight. Keys are persisted on the\n// Panel as `highlight_color`; the visual color is resolved from the shared\n// `sentioColors.classic` palette so groups always track the chart palette.\nexport type HighlightColorKey =\n | ''\n | 'blue'\n | 'cyan'\n | 'pink'\n | 'yellow'\n | 'green'\n | 'lightblue'\n | 'purple'\n | 'red'\n | 'orange'\n\n// Each highlight key maps to an INDEX into sentioColors.{light,dark}.classic\n// so EMPHASIS picks up the theme-appropriate hue automatically.\n// classic[0]=blue 1=cyan 2=pink 3=yellow 4=green 5=lightblue 6=purple 7=red 8=orange\nconst CLASSIC_INDEX: Record<Exclude<HighlightColorKey, ''>, number> = {\n blue: 0,\n cyan: 1,\n pink: 2,\n yellow: 3,\n green: 4,\n lightblue: 5,\n purple: 6,\n red: 7,\n orange: 8\n}\n\nexport interface HighlightColorMeta {\n key: Exclude<HighlightColorKey, ''>\n name: string\n}\n\nexport const HIGHLIGHT_COLORS: HighlightColorMeta[] = [\n { key: 'green', name: 'Sentio Green' },\n { key: 'blue', name: 'Sentio Blue' },\n { key: 'cyan', name: 'Sentio Cyan' },\n { key: 'lightblue', name: 'Sentio Light Blue' },\n { key: 'purple', name: 'Sentio Purple' },\n { key: 'pink', name: 'Sentio Pink' },\n { key: 'red', name: 'Sentio Red' },\n { key: 'orange', name: 'Sentio Orange' },\n { key: 'yellow', name: 'Sentio Yellow' }\n]\n\n// Default key used when the user picks EMPHASIS without choosing a color yet —\n// keeps the preview from rendering an invisible white bar.\nexport const DEFAULT_HIGHLIGHT_KEY: Exclude<HighlightColorKey, ''> = 'green'\n\n// Resolve the base CSS color (hex) for a highlight key + theme. Returns\n// undefined for an unknown key so callers can fall back to the default.\nexport function getHighlightHex(\n key: string | undefined,\n isDark: boolean\n): string | undefined {\n if (!key) return undefined\n const idx = CLASSIC_INDEX[key as Exclude<HighlightColorKey, ''>]\n if (idx === undefined) return undefined\n return sentioColors[isDark ? 'dark' : 'light'].classic[idx]\n}\n\n// Compute a readable foreground (#000 or #fff) for a given hex bg using the\n// W3C relative-luminance formula. Avoids hardcoding a per-color text color so\n// the palette can change without re-tuning contrast.\nfunction readableForeground(hex: string): string {\n const m = hex.replace('#', '')\n const r = parseInt(m.slice(0, 2), 16) / 255\n const g = parseInt(m.slice(2, 4), 16) / 255\n const b = parseInt(m.slice(4, 6), 16) / 255\n const lin = (v: number) =>\n v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4)\n const L = 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b)\n return L > 0.5 ? '#1f2937' : '#ffffff'\n}\n\nexport interface ResolvedHighlight {\n solid: string\n foreground: string\n}\n\nexport function resolveHighlight(\n colorKey: string | undefined,\n isDark: boolean\n): ResolvedHighlight {\n const hex =\n getHighlightHex(colorKey, isDark) ??\n getHighlightHex(DEFAULT_HIGHLIGHT_KEY, isDark)!\n return { solid: hex, foreground: readableForeground(hex) }\n}\n\n// Resolve the CSS styles to apply to the GroupPanel HEADER row based on the\n// configured style + color + theme. Returns an empty object for DEFAULT.\nexport function resolveHeaderStyle(\n style: GroupStyleLike | undefined,\n colorKey: string | undefined,\n isDark: boolean\n): React.CSSProperties {\n if (!style || style === 'DEFAULT') return {}\n const color = resolveHighlight(colorKey, isDark)\n return { backgroundColor: color.solid, color: color.foreground }\n}\n","import dayjs from 'dayjs'\nimport relativeTime from 'dayjs/plugin/relativeTime'\nimport updateLocale from 'dayjs/plugin/updateLocale'\nimport { classNames } from '@sentio/ui-core'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { IoMdRefresh } from 'react-icons/io'\nimport dayjsEn from 'dayjs/locale/en'\nimport type { ComputeStatsLike } from '../types/dashboard'\n\ndayjs.extend(relativeTime)\ndayjs.extend(updateLocale)\n\ndayjs.locale('en.short', {\n ...dayjsEn,\n relativeTime: {\n // relative time format strings, keep %s %d as the same\n future: 'in %s',\n past: '%s ago',\n s: '<1s',\n m: '1min',\n mm: '%dmin',\n h: '1h',\n hh: '%dh',\n d: '1d',\n dd: '%dd',\n M: '1m',\n MM: '%dm',\n y: '1y',\n yy: '%dy'\n }\n})\ndayjs.locale('en')\n\ninterface Props {\n stats?: ComputeStatsLike\n onRefresh: () => Promise<void>\n}\n\nenum COLORS {\n WARNNING = 'text-[#D98200] border-[#D98200] border',\n NORMAL = 'text-[#4CAF1D] border-[#4CAF1D] border'\n}\n\nexport const DashboardRefresh = ({ stats, onRefresh }: Props) => {\n const timeRef = useRef<HTMLSpanElement>(null)\n const [fetching, setFetching] = useState(false)\n const [currentColor, setCurrentColor] = useState<COLORS>(COLORS.NORMAL)\n useEffect(() => {\n const updateFn = () => {\n if (!stats || !stats.computedAt) return\n const computedAt = dayjs(stats.computedAt).locale('en.short')\n timeRef.current!.textContent = computedAt.fromNow(true)\n if (computedAt.isBefore(dayjs().subtract(1, 'hour'))) {\n setCurrentColor(COLORS.WARNNING)\n } else {\n setCurrentColor(COLORS.NORMAL)\n }\n }\n updateFn()\n const interval = setInterval(() => {\n updateFn()\n }, 1000)\n return () => {\n clearInterval(interval)\n }\n }, [stats])\n\n const onClick = useCallback(() => {\n setFetching((prevState) => {\n if (prevState) return prevState\n onRefresh().finally(() => {\n setFetching(false)\n })\n return true\n })\n }, [onRefresh])\n\n useEffect(() => {\n if (typeof window == 'object') {\n window.addEventListener('refresh_all', onClick)\n return () => {\n window.removeEventListener('refresh_all', onClick)\n }\n }\n }, [])\n\n const showReload = fetching || stats?.isRefreshing\n return (\n <div\n className={classNames(\n 'group/refresh relative ml-1 flex items-center gap-1 rounded-sm py-px pl-1 text-xs transition-all',\n currentColor,\n showReload ? 'pr-5' : 'pr-1.5 hover:pr-5'\n )}\n >\n <span className=\"cursor-default text-[10px]\" ref={timeRef} />\n <button\n onClick={onClick}\n className={classNames(\n 'absolute right-1',\n showReload ? 'block' : 'hidden group-hover/refresh:block'\n )}\n >\n <IoMdRefresh\n className={classNames(\n 'h-3.5 w-3.5',\n showReload ? 'animate-spin' : ''\n )}\n />\n </button>\n </div>\n )\n}\n","import { useMemo, useState } from 'react'\nimport {\n BaseDialog,\n CopyButton,\n Checkbox,\n dateTimeToString\n} from '@sentio/ui-core'\nimport type { DateTimeValue } from '@sentio/ui-core'\nimport type {\n DashboardSharingLike,\n SharingConfigLike\n} from '../types/dashboard'\n\ninterface Props {\n open: boolean\n initData?: DashboardSharingLike\n onUnshare?: () => void\n onClose: () => void\n onConfigChange?: (config: SharingConfigLike) => void\n startTime?: DateTimeValue\n endTime?: DateTimeValue\n tz?: string\n}\n\nexport const ShareDashboardDialog = ({\n open,\n initData,\n onUnshare,\n onClose,\n onConfigChange,\n startTime,\n endTime,\n tz\n}: Props) => {\n const [isReadonly, setIsReadonly] = useState(\n initData?.config?.isReadonly ?? false\n )\n const [hideModifiers, setHideModifiers] = useState(\n initData?.config?.hideModifiers ?? false\n )\n\n const linkText = useMemo(() => {\n if (initData?.id) {\n let timeSuffix =\n startTime && endTime\n ? `?from=${encodeURIComponent(dateTimeToString(startTime))}&to=${encodeURIComponent(dateTimeToString(endTime))}&tz=${tz}`\n : ''\n if (tz) {\n timeSuffix += `&tz=${tz}`\n }\n return `${location.origin}/share/${initData?.id}${timeSuffix}`\n }\n return ''\n }, [initData?.id, startTime, endTime])\n\n const handleConfigChange = (\n newIsReadonly: boolean,\n newHideModifiers: boolean\n ) => {\n const config: SharingConfigLike = {\n isReadonly: newIsReadonly,\n hideModifiers: newHideModifiers\n }\n onConfigChange?.(config)\n }\n\n const handleReadonlyChange = (checked: boolean) => {\n setIsReadonly(checked)\n handleConfigChange(checked, hideModifiers)\n }\n\n const handleHideModifiersChange = (checked: boolean) => {\n setHideModifiers(checked)\n handleConfigChange(isReadonly, checked)\n }\n\n return (\n <BaseDialog\n title=\"Sharing: ON\"\n open={open}\n onCancel={() => {\n onUnshare?.()\n onClose()\n }}\n cancelText=\"Revoke URL\"\n cancelProps={{\n status: 'danger'\n }}\n okText=\"Done\"\n onOk={() => {\n onClose()\n }}\n onClose={onClose}\n buttonsClassName=\"justify-between\"\n footerBorder={false}\n >\n <div className=\"mx-4 my-4\">\n <div className=\"flex overflow-hidden rounded-md border pl-3\">\n <span className=\"text-ilabel font-ilabel text-text-foreground flex-1 grow truncate leading-8\">\n {linkText}\n </span>\n <div className=\"group cursor-pointer border-l bg-gray-200 px-2 py-1 hover:bg-gray-100\">\n <CopyButton\n text={linkText}\n size={18}\n className=\"text-text-foreground group-hover:text-primary h-4 w-4 align-middle\"\n />\n </div>\n </div>\n <div className=\"text-text-foreground-secondary mt-2 text-[11px]\">\n Anyone with the link can access this dashboard. You can revoke the\n link at any time.\n </div>\n\n {/* Sharing Configuration Options */}\n <div className=\"mt-4 space-y-3 border-t pt-4\">\n <div className=\"text-text-foreground text-sm font-medium\">\n Access Settings\n </div>\n\n <div className=\"space-y-4\">\n <div>\n <Checkbox\n checked={isReadonly}\n onChange={handleReadonlyChange}\n label=\"Panel read-only access\"\n />\n <div className=\"text-text-foreground-secondary ml-6 text-xs\">\n Viewers can only view the dashboard without entering panel edit\n mode or copy configuration.\n </div>\n </div>\n\n <div>\n <Checkbox\n checked={hideModifiers}\n onChange={handleHideModifiersChange}\n label=\"Hide controls\"\n />\n <div className=\"text-text-foreground-secondary ml-6 text-xs\">\n Hide panel creator and modifier for viewers\n </div>\n </div>\n </div>\n </div>\n </div>\n </BaseDialog>\n )\n}\n","import { defaults } from 'lodash'\nimport { produce } from 'immer'\nimport { Switch, TimeRangePicker } from '@sentio/ui-core'\nimport type { DateTimeValue } from '@sentio/ui-core'\nimport type { TimeRangeOverrideLike } from '../types/chart'\nimport { fromTimeLike, toTimeLike } from '../charts/time-utils'\n\ninterface Props {\n config?: TimeRangeOverrideLike\n onChange: (config: TimeRangeOverrideLike) => void\n // Global dashboard time range, injected by the app (it owns the data hook /\n // local-storage default). When override is OFF the picker drives these.\n globalStartTime?: DateTimeValue\n globalEndTime?: DateTimeValue\n globalTz?: string\n onSetGlobalTimeRange: (\n start?: DateTimeValue,\n end?: DateTimeValue,\n tz?: string\n ) => void\n}\n\nexport const defaultConfig: TimeRangeOverrideLike = {\n enabled: false\n}\n\nexport function TimeRangeOverride({\n config,\n onChange,\n globalStartTime,\n globalEndTime,\n globalTz,\n onSetGlobalTimeRange\n}: Props) {\n config = defaults(config || {}, defaultConfig)\n\n const setEnabled = (enabled: boolean) => {\n config &&\n onChange(\n produce(config, (draft) => {\n draft.enabled = enabled\n if (enabled) {\n draft.timeRange = {\n start: toTimeLike(globalStartTime),\n end: toTimeLike(globalEndTime),\n step: draft.timeRange?.step,\n interval: draft.timeRange?.interval,\n timezone: draft.timeRange?.timezone\n }\n }\n })\n )\n }\n\n function onTimeRangeChange(\n start?: DateTimeValue,\n end?: DateTimeValue,\n tz?: string\n ) {\n if (config?.enabled) {\n onChange(\n produce(config, (draft) => {\n draft.timeRange = {\n start: toTimeLike(start),\n end: toTimeLike(end),\n timezone: tz,\n step: draft.timeRange?.step,\n interval: draft.timeRange?.interval\n }\n })\n )\n } else {\n onSetGlobalTimeRange(start, end, tz)\n }\n }\n\n return (\n <div className=\"flex flex-wrap items-center gap-4 p-2\">\n <div className=\"flex items-center\">\n <Switch\n checked={config.enabled || false}\n onChange={setEnabled}\n label=\"Override Global Time\"\n />\n </div>\n\n <TimeRangePicker\n startTime={\n config.enabled\n ? fromTimeLike(config.timeRange?.start)\n : globalStartTime\n }\n endTime={\n config.enabled ? fromTimeLike(config.timeRange?.end) : globalEndTime\n }\n tz={config.enabled ? config.timeRange?.timezone || globalTz : globalTz}\n onChange={onTimeRangeChange}\n />\n </div>\n )\n}\n","import { useEffect, useRef, useState, useLayoutEffect } from 'react'\nimport { Select, classNames } from '@sentio/ui-core'\nimport LineIcon from '../charts/icons/LineIcon'\nimport BarIcon from '../charts/icons/BarIcon'\nimport AreaIcon from '../charts/icons/AreaIcon'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport { LuChevronRight, LuMountainSnow } from 'react-icons/lu'\nimport { cloneDeep } from 'lodash'\nimport { Disclosure } from '@headlessui/react'\nimport type { ChartConfigLike, SeriesConfigLike } from '../types/chart'\nimport type { ChartTypeLike } from '../types/enums'\n\ninterface Props {\n config?: ChartConfigLike\n chartType?: ChartTypeLike\n setSeriesConfig: (seriesConfig: SeriesConfigLike) => void\n // Series names computed by the app (worker parses the SQL response); injected\n // so this panel stays free of the web worker.\n series: string[]\n // Mixed-chart feature flag, injected by the app.\n enabled?: boolean\n}\n\n// Define the available chart types for individual series\nconst seriesChartTypes = [\n {\n value: 'default',\n label: (\n <div className=\"flex items-center\">\n <LuMountainSnow className=\"mr-2 h-4 w-4\" />\n Default\n </div>\n )\n },\n {\n value: 'LINE',\n label: (\n <div className=\"flex items-center\">\n <LineIcon className=\"mr-2 h-4 w-4\" />\n Line\n </div>\n )\n },\n {\n value: 'BAR',\n label: (\n <div className=\"flex items-center\">\n <BarIcon className=\"mr-2 h-4 w-4\" />\n Bar\n </div>\n )\n },\n {\n value: 'AREA',\n label: (\n <div className=\"flex items-center\">\n <AreaIcon className=\"mr-2 h-4 w-4\" />\n Area\n </div>\n )\n }\n]\n\nexport const SeriesControls = ({\n config,\n setSeriesConfig,\n series,\n enabled\n}: Props) => {\n const parentRef = useRef<HTMLDivElement>(null)\n const [isDisclosureOpen, setIsDisclosureOpen] = useState(true)\n\n // Only use virtualization when there are more than 10 series\n const shouldVirtualize = series.length > 10\n\n // Setup virtualizer only when disclosure is open and should virtualize\n const virtualizer = useVirtualizer({\n count: shouldVirtualize && isDisclosureOpen ? series.length : 0,\n getScrollElement: () => parentRef.current,\n estimateSize: () => 40,\n overscan: 5 // Render 5 extra items outside viewport for smooth scrolling\n })\n\n // Re-measure virtualizer when disclosure state changes\n useLayoutEffect(() => {\n if (isDisclosureOpen && shouldVirtualize && parentRef.current) {\n // Small delay to ensure DOM is updated\n const timeoutId = setTimeout(() => {\n virtualizer.measure()\n }, 10)\n return () => clearTimeout(timeoutId)\n }\n }, [isDisclosureOpen, shouldVirtualize, virtualizer])\n\n const handleSeriesTypeChange = (seriesName: string, selectedType: string) => {\n const currentSeriesConfig = config?.seriesConfig || { series: {} }\n\n if (selectedType === 'default') {\n // For 'default', we'll remove the series from config to use chart's default type\n const newSeriesConfig = cloneDeep(currentSeriesConfig)\n if (newSeriesConfig.series && newSeriesConfig.series[seriesName]) {\n delete newSeriesConfig.series[seriesName]\n }\n setSeriesConfig(newSeriesConfig)\n return\n }\n\n const newSeriesConfig: SeriesConfigLike = {\n ...currentSeriesConfig,\n series: {\n ...currentSeriesConfig.series,\n [seriesName]: { type: selectedType as ChartTypeLike }\n }\n }\n\n setSeriesConfig(newSeriesConfig)\n }\n\n const handleReset = () => {\n setSeriesConfig({ series: {} })\n }\n\n // Render single series item component\n const renderSeriesItem = (seriesName: string) => {\n const currentType =\n config?.seriesConfig?.series?.[seriesName]?.type || 'default'\n\n return (\n <div\n key={seriesName}\n className=\"text-icontent inline-flex h-8 w-full basis-0 px-2\"\n >\n <div className=\"sm:text-icontent bg-sentio-gray-100 dark:bg-sentio-gray-200 border-main inline-flex shrink items-center rounded-l-md border border-r-0 px-2 font-medium sm:min-w-[160px]\">\n <span className=\"truncate\" title={seriesName}>\n {seriesName}\n </span>\n </div>\n <span className=\"sm:text-icontent bg-sentio-gray-100 dark:bg-sentio-gray-200 border-main inline-flex items-center whitespace-nowrap border border-r-0 px-2\">\n Show as\n </span>\n <div className=\"w-40\">\n <Select\n options={seriesChartTypes}\n value={currentType}\n onChange={(selectedType) =>\n handleSeriesTypeChange(seriesName, selectedType as string)\n }\n className=\"focus:border-primary-500 sm:text-icontent border-main h-full rounded-r-md border\"\n buttonClassName=\"border-none! h-full!\"\n placeholder=\"Select chart type\"\n asLayer={true}\n />\n </div>\n </div>\n )\n }\n\n if (!enabled) {\n return null\n }\n\n const titleWithReset = (\n <div className=\"flex w-full items-center justify-between pr-2\">\n <span>{`Series (${series.length})`}</span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation() // Prevent disclosure toggle\n handleReset()\n }}\n className=\"rounded-sm bg-gray-200 px-2 py-1 text-xs transition-colors hover:bg-gray-300\"\n title=\"Reset all series to default\"\n >\n Reset\n </button>\n </div>\n )\n\n return (\n <Disclosure defaultOpen={true}>\n {({ open }) => {\n // Synchronize disclosure state with `open` using useEffect\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useEffect(() => {\n setIsDisclosureOpen(open)\n }, [open])\n\n return (\n <div className=\"bg-default-bg w-full rounded-sm\">\n <Disclosure.Button\n className={classNames(\n open ? 'rounded-t' : 'rounded-sm',\n 'focus-visible:ring-primary-500/75 text-ilabel font-ilabel text-text-foreground hover:bg-sentio-gray-100 dark:hover:bg-sentio-gray-400 focus:outline-hidden focus-visible:ring-3 flex w-full px-2 py-1.5 text-left'\n )}\n >\n <LuChevronRight\n className={classNames(\n open ? 'rotate-90 transform' : '',\n 'mr-1 h-5 w-5 self-center transition-all'\n )}\n />\n {titleWithReset}\n </Disclosure.Button>\n <Disclosure.Panel className=\"p-2\">\n {shouldVirtualize && open ? (\n // Virtualized rendering for large lists - only render when open\n <div\n ref={parentRef}\n className=\"text-icontent h-[200px] overflow-auto\"\n style={{\n contain: 'strict'\n }}\n >\n <div\n style={{\n height: `${virtualizer?.getTotalSize() ?? 0}px`,\n width: '100%',\n position: 'relative'\n }}\n >\n {virtualizer?.getVirtualItems().map((virtualItem) => {\n const seriesName = series[virtualItem.index]\n if (!seriesName) return null\n\n return (\n <div\n key={virtualItem.key}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`\n }}\n >\n {renderSeriesItem(seriesName)}\n </div>\n )\n })}\n </div>\n </div>\n ) : (\n // Normal rendering for small lists\n <div className=\"text-icontent flex max-h-[200px] flex-col gap-2 overflow-y-auto\">\n {series.map((seriesName) => renderSeriesItem(seriesName))}\n </div>\n )}\n </Disclosure.Panel>\n </div>\n )\n }}\n </Disclosure>\n )\n}\n","import { produce } from 'immer'\nimport { defaults } from 'lodash'\nimport { Checkbox, DisclosurePanel } from '@sentio/ui-core'\nimport type { ReactNode } from 'react'\nimport type { QueryValueConfigLike, ColorThemeLike } from '../types/chart'\nimport type { CalculationLike } from '../types/enums'\n\ninterface Props {\n config?: QueryValueConfigLike\n defaultOpen?: boolean\n onChange: (config: QueryValueConfigLike) => void\n // ColorSelect is bound to the app's query-value-theme (pulled into the chart\n // web worker), so it stays app-side and is injected as a slot.\n renderColorSelect: (\n value: ColorThemeLike | undefined,\n onChange: (picked: { value?: ColorThemeLike }) => void\n ) => ReactNode\n}\n\nexport const defaultConfig: QueryValueConfigLike = {\n calculation: 'LAST',\n colorTheme: {\n themeType: 'Gray'\n },\n showBackgroundChart: false\n}\n\nconst CalculationItems = [\n { label: 'Last', value: 'LAST' },\n { label: 'First', value: 'FIRST' },\n { label: 'Total', value: 'TOTAL' },\n { label: 'Mean', value: 'MEAN' },\n { label: 'Max', value: 'MAX' },\n { label: 'Min', value: 'MIN' }\n]\n\nexport function QueryValueControls({\n config,\n defaultOpen,\n onChange,\n renderColorSelect\n}: Props) {\n config = defaults(config, defaultConfig)\n\n function onCalculationChange(cal: CalculationLike) {\n config &&\n onChange(produce(config, (draft) => void (draft.calculation = cal)))\n }\n\n function onSeriesCalculationChange(cal: CalculationLike) {\n config &&\n onChange(produce(config, (draft) => void (draft.seriesCalculation = cal)))\n }\n\n function onSelectColor(c: { value?: ColorThemeLike }) {\n config &&\n onChange(\n produce(config, (draft) => {\n draft.colorTheme = c.value\n })\n )\n }\n\n function toggleShowBackgroundChart() {\n config &&\n onChange(\n produce(config, (draft) => {\n draft.showBackgroundChart = !draft.showBackgroundChart\n })\n )\n }\n\n return (\n <DisclosurePanel\n title=\"Query Value Options\"\n defaultOpen={defaultOpen}\n containerClassName=\"w-full bg-default-bg\"\n >\n <div className=\"flex flex-wrap items-center gap-4\">\n <div className=\"shadow-xs flex h-8 rounded-md\">\n <span className=\"sm:text-ilabel border-main text-text-foreground inline-flex items-center whitespace-nowrap rounded-l-md border border-r-0 bg-gray-50 px-3\">\n For each series, calculate the\n </span>\n <select\n value={config?.calculation}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 inline-flex items-center border py-0.5 pl-4 pr-7 focus:relative focus:z-10 focus:outline-none\"\n onChange={(e) =>\n onCalculationChange(e.target.value as CalculationLike)\n }\n >\n {CalculationItems.map((d) => (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n ))}\n </select>\n <span className=\"sm:text-ilabel border-main text-text-foreground inline-flex items-center whitespace-nowrap border border-x-0 bg-gray-50 px-3\">\n value, then show the\n </span>\n <select\n value={config?.seriesCalculation}\n className=\"sm:text-ilabel border-main text-text-foreground hover:border-primary-600 focus:border-primary-600 focus:ring-3 focus:ring-primary-600/30 inline-flex items-center border py-0.5 pl-4 pr-7 focus:relative focus:z-10 focus:outline-none\"\n onChange={(e) =>\n onSeriesCalculationChange(e.target.value as CalculationLike)\n }\n >\n {CalculationItems.map((d) => (\n <option key={d.value} value={d.value}>\n {d.label}\n </option>\n ))}\n </select>\n <span className=\"sm:text-ilabel border-main text-text-foreground inline-flex items-center whitespace-nowrap rounded-r-md border-b border-r border-t bg-gray-50 px-3\">\n value of multiple series\n </span>\n </div>\n\n <div className=\"focus-within:ring-primary-500 shadow-xs border-main flex h-8 divide-x divide-gray-300 rounded-md border focus-within:border-transparent focus-within:ring-2\">\n <span className=\"sm:text-ilabel text-text-foreground inline-flex items-center whitespace-nowrap rounded-l-md bg-gray-50 px-3\">\n Color Theme\n </span>\n {renderColorSelect(config?.colorTheme, onSelectColor)}\n </div>\n <Checkbox\n checked={config?.showBackgroundChart}\n onChange={toggleShowBackgroundChart}\n label=\"Show Background Chart\"\n />\n </div>\n </DisclosurePanel>\n )\n}\n","import { useCallback, useEffect, useMemo, useRef } from 'react'\nimport { debounce } from 'lodash'\nimport { SlideOver, Button, useBoolean, classNames } from '@sentio/ui-core'\nimport { PiBracketsCurlyBold } from 'react-icons/pi'\nimport type { PanelLike } from '../types/dashboard'\n\nconst panelExample = `Paste the panel configuration here.\nHere is an note type example:\n {\n \"name\": \"\",\n \"chart\": {\n \"type\": \"NOTE\",\n \"queries\": [],\n \"formulas\": [],\n \"config\": null,\n \"note\": {\n \"content\": \"* asdasda\",\n \"fontSize\": \"MD\",\n \"textAlign\": \"LEFT\"\n },\n \"datasourceType\": \"NOTES\",\n \"segmentationQueries\": [],\n \"insightsQueries\": [],\n \"eventLogsConfig\": null,\n \"retentionQuery\": null,\n \"sqlQuery\": \"\"\n }\n }\n`\n\nfunction isValidPanelData(data: string) {\n try {\n const parsed = JSON.parse(data)\n return parsed.name !== undefined || parsed.chart !== undefined\n } catch {\n return false\n }\n}\n\nexport const ImportPanelDialog = ({\n show,\n onClose: _onClose,\n onSubmit\n}: {\n show: boolean\n onClose: () => void\n onSubmit: (p: PanelLike) => Promise<void>\n}) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const {\n value: isInvalid,\n setTrue: setInvalid,\n setFalse: setValid\n } = useBoolean(false)\n\n useEffect(() => {\n if (show) {\n setTimeout(() => {\n textareaRef.current?.focus()\n }, 500)\n }\n }, [show])\n\n const debouncedValidate = useMemo(\n () =>\n debounce((value: string) => {\n if (isValidPanelData(value)) {\n setValid()\n } else {\n setInvalid()\n }\n }, 500),\n [setValid, setInvalid]\n )\n\n const handleSubmit = () => {\n if (isInvalid) return\n try {\n const parsed = JSON.parse(textareaRef.current?.value || '')\n onSubmit(parsed)\n } catch {\n setInvalid()\n }\n }\n\n const onClose = useCallback(() => {\n _onClose()\n setValid()\n if (textareaRef.current) {\n textareaRef.current.value = ''\n }\n }, [_onClose, setValid])\n\n return (\n <SlideOver\n title=\"Import Panel\"\n open={show}\n onClose={onClose}\n size=\"lg\"\n triggerClose=\"button\"\n >\n <div className=\"w-full space-y-6 p-4\">\n <textarea\n ref={textareaRef}\n className={classNames(\n 'text-icontent text-text-foreground h-[60vh] w-full rounded-sm border',\n isInvalid\n ? 'border-rose-600! ring-rose-600! focus:border-rose-600! focus:[box-shadow:0_0_0_1px_rgb(225_29_72)]!'\n : ''\n )}\n rows={10}\n onChange={(evt) => debouncedValidate(evt.target.value)}\n placeholder={panelExample}\n />\n <div className=\"flex w-full items-center justify-between\">\n <span>\n <Button status=\"danger\" size=\"lg\" onClick={onClose}>\n Cancel\n </Button>\n </span>\n <span className=\"inline-flex gap-2\">\n <Button\n size=\"lg\"\n onClick={() => {\n try {\n const parsed = JSON.parse(textareaRef.current?.value || '')\n textareaRef.current!.value = JSON.stringify(parsed, null, 2)\n } catch {\n setInvalid()\n }\n }}\n icon={<PiBracketsCurlyBold />}\n >\n Format\n </Button>\n <Button role=\"primary\" size=\"lg\" onClick={handleSubmit}>\n Submit\n </Button>\n </span>\n </div>\n </div>\n </SlideOver>\n )\n}\n","import { BaseDialog, Button, CopyButton, useDarkMode } from '@sentio/ui-core'\nimport MonacoEditor from '@monaco-editor/react'\nimport type { BeforeMount } from '@monaco-editor/react'\nimport { LuDownload } from 'react-icons/lu'\n\ninterface Props {\n open: boolean\n onClose: () => void\n dashboardId?: string\n json: string\n onBeforeMount?: BeforeMount\n}\n\nexport function ExportDashboardDialog({\n open,\n onClose,\n dashboardId,\n json,\n onBeforeMount\n}: Props) {\n const isDarkMode = useDarkMode()\n\n return (\n <BaseDialog\n title=\"Export dashboard JSON\"\n open={open}\n onClose={onClose}\n onCancel={onClose}\n cancelText=\"Close\"\n footerBorder={false}\n extraButtons={\n <div className=\"absolute left-4 inline-flex\">\n <a\n download={\n dashboardId ? `dashboard-${dashboardId}.json` : 'dashboard.json'\n }\n href={'data:text/json;charset=utf-8,' + encodeURIComponent(json)}\n >\n <Button role=\"text\" icon={<LuDownload />}>\n Save to a file\n </Button>\n </a>\n </div>\n }\n >\n <form className=\"relative\">\n <div className=\"px-[18px] py-4\">\n <div\n className=\"absolute right-10 top-8 z-10\"\n onClick={(evt) => evt.preventDefault()}\n >\n <CopyButton text={json} size={16} />\n </div>\n <div className=\"focus-within:border-primary-300 h-[324px] overflow-hidden rounded-sm border\">\n <MonacoEditor\n value={json}\n theme={isDarkMode ? 'sentio-dark' : 'sentio'}\n language=\"json\"\n beforeMount={onBeforeMount}\n options={{\n readOnly: true,\n minimap: { enabled: false },\n lineNumbers: 'off'\n }}\n />\n </div>\n </div>\n </form>\n </BaseDialog>\n )\n}\n"],"mappings":"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","names":["labels","selectedLabels","ArgumentType","jsx","produce","classNames","classNames","jsx","jsxs","classNames","Fragment","jsx","jsxs","produce","classNames","f","useMemo","useState","produce","isEqual","NewMultipleSelect","classNames","useState","jsx","Fragment","jsx","jsxs","useState","produce","useMemo","value","NewMultipleSelect","classNames","input","isEqual","useEffect","useCallback","useState","useRef","useMemo","useEffect","useRef","useState","useEffect","useFloating","jsx","jsx","jsxs","useRef","useState","useEffect","legend","legendSelected","chartHandle","useCallback","useEffect","useState","Fragment","jsx","jsxs","useState","useRef","useMemo","chart","s","useCallback","useEffect","createContext","useContext","jsx","useState","useResizeDetector","jsx","jsxs","jsx","jsxs","SvgIcon","jsx","jsxs","SvgIcon","jsx","jsxs","SvgIcon","jsx","SvgIcon","jsx","jsxs","SvgIcon","jsx","jsxs","SvgIcon","jsx","jsxs","SvgIcon","jsx","useState","useResizeDetector","Fragment","useMemo","sortBy","classNames","Fragment","jsx","jsxs","useMemo","sortBy","hasCompare","markers","compareMarkers","currentTime","compareTime","total","compareTotal","series","hasCurrent","classNames","Fragment","useMemo","dayjs","utc","timezone","isNumber","LuCircleUserRound","LuList","CopyButton","classNames","jsx","jsxs","forwardRef","useEffect","useState","useResizeDetector","jsx","PieChart","forwardRef","useState","isMobile","useResizeDetector","useEffect","options","forwardRef","useEffect","useMemo","useState","jsx","forwardRef","useState","useEffect","series","xAxis","yAxis","useMemo","forwardRef","useMemo","useResizeDetector","jsx","forwardRef","useResizeDetector","useMemo","forwardRef","useCallback","useEffect","useMemo","useRef","useState","dayjs","dayjs","utc","timezone","dayjs","TimeUnitShortNames","duration","TimeUnitShortNames","t","dayjs","toDayjs","classNames","classNames","jsx","Fragment","jsx","jsxs","Button","DisclosurePanel","jsx","jsxs","DisclosurePanel","Button","isEqual","isNumber","FloatingPortal","shift","useFloating","LuChevronDown","jsx","jsxs","initialConfig","min","max","forwardRef","useRef","useMemo","useState","useCallback","useEffect","options","yAxis","toDayjs","start","end","title","startTime","endTime","dayjs","classNames","produce","DisclosurePanel","ButtonGroup","Checkbox","jsx","jsxs","useEffect","useMemo","produce","NewButton","DisclosurePanel","HelpIcon","jsx","jsxs","initialConfig","produce","defaults","Checkbox","DisclosurePanel","ButtonGroup","jsx","jsxs","produce","defaults","DisclosurePanel","jsx","jsxs","defaultConfig","CalculationItems","sortByItems","orderItems","sortBy","produce","classNames","Button","classNames","produce","jsx","jsxs","Fragment","jsx","jsxs","defaultConfig","AddonLabel","classNames","produce","defaults","Checkbox","DisclosurePanel","produce","jsx","jsxs","defaultConfig","defaults","produce","DisclosurePanel","Checkbox","produce","LuPlus","Button","DisclosurePanel","jsx","jsxs","produce","defaults","DisclosurePanel","jsx","jsxs","defaultConfig","defaults","produce","DisclosurePanel","produce","defaults","useCallback","DisclosurePanel","jsx","jsxs","defaultConfig","defaults","useCallback","produce","DisclosurePanel","useMemo","produce","defaults","Checkbox","DisclosurePanel","jsx","jsxs","defaultConfig","CalculationItems","defaults","produce","useMemo","DisclosurePanel","Checkbox","useState","useRef","useCallback","useEffect","useMemo","jsx","jsxs","React","BarLoading","Button","useResizeDetector","jsx","jsxs","React","ErrorChart","useResizeDetector","Button","BarLoading","useEffect","useMemo","useRef","useState","BaseDialog","Select","classNames","LuCheck","Fragment","jsx","jsxs","classNames","LuCheck","useState","useRef","useEffect","useMemo","BaseDialog","Select","dayjs","classNames","useCallback","useEffect","useRef","useState","IoMdRefresh","jsx","jsxs","useRef","useState","useEffect","dayjs","useCallback","jsxs","classNames","jsx","IoMdRefresh","useMemo","useState","BaseDialog","CopyButton","Checkbox","dateTimeToString","jsx","jsxs","defaults","produce","jsx","jsxs","defaultConfig","defaults","produce","useEffect","useRef","useState","Select","classNames","jsx","jsxs","useRef","useState","newSeriesConfig","Select","useEffect","classNames","produce","defaults","Checkbox","DisclosurePanel","jsx","jsxs","defaultConfig","CalculationItems","useCallback","useEffect","useMemo","useRef","Button","useBoolean","classNames","jsx","jsxs","BaseDialog","Button","CopyButton","useDarkMode","jsx","jsxs"]}