- {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==}