diff --git a/apps/dashboard/src/components/report/funnel/Funnel.tsx b/apps/dashboard/src/components/report/funnel/Funnel.tsx index e5011646..65f3ed5b 100644 --- a/apps/dashboard/src/components/report/funnel/Funnel.tsx +++ b/apps/dashboard/src/components/report/funnel/Funnel.tsx @@ -4,7 +4,6 @@ import { ColorSquare } from '@/components/color-square'; import { AutoSizer } from '@/components/react-virtualized-auto-sizer'; import { Progress } from '@/components/ui/progress'; import { Widget, WidgetBody } from '@/components/widget'; -import { pushModal } from '@/modals'; import type { RouterOutputs } from '@/trpc/client'; import { cn } from '@/utils/cn'; import { round } from '@/utils/math'; @@ -13,6 +12,7 @@ import { AlertCircleIcon } from 'lucide-react'; import { last } from 'ramda'; import { Cell, Pie, PieChart } from 'recharts'; +import { alphabetIds } from '@openpanel/constants'; import type { IChartInput } from '@openpanel/validation'; import { useChartContext } from '../chart/ChartProvider'; @@ -109,7 +109,7 @@ export function FunnelSteps({
- {step.event.id} + {alphabetIds[index]}
{step.event.displayName.replace(/_/g, ' ')} diff --git a/apps/dashboard/src/components/report/reportSlice.ts b/apps/dashboard/src/components/report/reportSlice.ts index 979668ee..4ecf2a58 100644 --- a/apps/dashboard/src/components/report/reportSlice.ts +++ b/apps/dashboard/src/components/report/reportSlice.ts @@ -8,6 +8,7 @@ import { startOfDay, } from 'date-fns'; +import { shortId } from '@openpanel/common'; import { alphabetIds, getDefaultIntervalByDates, @@ -91,7 +92,7 @@ export const reportSlice = createSlice({ addEvent: (state, action: PayloadAction>) => { state.dirty = true; state.events.push({ - id: alphabetIds[state.events.length]!, + id: shortId(), ...action.payload, }); }, @@ -129,7 +130,7 @@ export const reportSlice = createSlice({ ) => { state.dirty = true; state.breakdowns.push({ - id: alphabetIds[state.breakdowns.length]!, + id: shortId(), ...action.payload, }); }, diff --git a/apps/dashboard/src/components/report/sidebar/ReportEvents.tsx b/apps/dashboard/src/components/report/sidebar/ReportEvents.tsx index d0efe0e9..ce1989e7 100644 --- a/apps/dashboard/src/components/report/sidebar/ReportEvents.tsx +++ b/apps/dashboard/src/components/report/sidebar/ReportEvents.tsx @@ -11,6 +11,7 @@ import { useEventNames } from '@/hooks/useEventNames'; import { useDispatch, useSelector } from '@/redux'; import { GanttChart, GanttChartIcon, Users } from 'lucide-react'; +import { alphabetIds } from '@openpanel/constants'; import type { IChartEvent } from '@openpanel/validation'; import { @@ -57,11 +58,11 @@ export function ReportEvents() {

Events

- {selectedEvents.map((event) => { + {selectedEvents.map((event, index) => { return (
- {event.id} + {alphabetIds[index]} { diff --git a/apps/dashboard/src/components/report/sidebar/filters/FiltersCombobox.tsx b/apps/dashboard/src/components/report/sidebar/filters/FiltersCombobox.tsx index 3479bb9d..0cdbc742 100644 --- a/apps/dashboard/src/components/report/sidebar/filters/FiltersCombobox.tsx +++ b/apps/dashboard/src/components/report/sidebar/filters/FiltersCombobox.tsx @@ -4,6 +4,7 @@ import { useDispatch, useSelector } from '@/redux'; import { api } from '@/trpc/client'; import { FilterIcon } from 'lucide-react'; +import { shortId } from '@openpanel/common'; import type { IChartEvent } from '@openpanel/validation'; import { changeEvent } from '../../reportSlice'; @@ -48,7 +49,7 @@ export function FiltersCombobox({ event }: FiltersComboboxProps) { filters: [ ...event.filters, { - id: Math.random().toString(36).substring(7), + id: shortId(), name: value, operator: 'is', value: [], diff --git a/packages/common/index.ts b/packages/common/index.ts index 7eda2c40..5a898e92 100644 --- a/packages/common/index.ts +++ b/packages/common/index.ts @@ -8,3 +8,4 @@ export * from './src/math'; export * from './src/slug'; export * from './src/fill-series'; export * from './src/url'; +export * from './src/id'; diff --git a/packages/common/package.json b/packages/common/package.json index 2e11fe2c..e2dda80a 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -11,16 +11,17 @@ "@openpanel/constants": "workspace:*", "date-fns": "^3.3.1", "mathjs": "^12.3.2", + "nanoid": "^5.0.7", "ramda": "^0.29.1", "slugify": "^1.6.6", "superjson": "^1.13.3", "unique-names-generator": "^4.7.1" }, "devDependencies": { - "@openpanel/validation": "workspace:*", "@openpanel/eslint-config": "workspace:*", "@openpanel/prettier-config": "workspace:*", "@openpanel/tsconfig": "workspace:*", + "@openpanel/validation": "workspace:*", "@types/node": "^18.16.0", "@types/ramda": "^0.29.6", "eslint": "^8.48.0", diff --git a/packages/common/src/id.ts b/packages/common/src/id.ts new file mode 100644 index 00000000..ca8e8844 --- /dev/null +++ b/packages/common/src/id.ts @@ -0,0 +1,5 @@ +import { nanoid } from 'nanoid/non-secure'; + +export function shortId() { + return nanoid(4); +} diff --git a/packages/constants/index.ts b/packages/constants/index.ts index b1520f6e..604f7800 100644 --- a/packages/constants/index.ts +++ b/packages/constants/index.ts @@ -115,6 +115,22 @@ export const alphabetIds = [ 'H', 'I', 'J', + 'K', + 'L', + 'M', + 'N', + 'O', + 'P', + 'Q', + 'R', + 'S', + 'T', + 'U', + 'V', + 'W', + 'X', + 'Y', + 'Z', ] as const; export const deprecated_timeRanges = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b9dca07..37fcb036 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -895,6 +895,9 @@ importers: mathjs: specifier: ^12.3.2 version: 12.3.2 + nanoid: + specifier: ^5.0.7 + version: 5.0.7 ramda: specifier: ^0.29.1 version: 0.29.1 @@ -14642,6 +14645,12 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /nanoid@5.0.7: + resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} + engines: {node: ^18 || >=20} + hasBin: true + dev: false + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}