From b2e59464a4a899c04ee489312a6ddb68bcbbc76f Mon Sep 17 00:00:00 2001 From: safavimohadeseh78 Date: Sun, 12 Jul 2026 17:51:48 +0200 Subject: [PATCH] add reygiri page --- components.d.ts | 4 - src/api/consts.ts | 9 +- src/model/captureSite.ts | 5 + src/pages/menuPages/captureSites/index.vue | 338 +++++++++++++++++++++ src/router/routes/setting.ts | 11 + src/utils/reygiriSites.ts | 48 +++ 6 files changed, 410 insertions(+), 5 deletions(-) create mode 100644 src/model/captureSite.ts create mode 100644 src/pages/menuPages/captureSites/index.vue create mode 100644 src/utils/reygiriSites.ts diff --git a/components.d.ts b/components.d.ts index 3d0dca9..748a68c 100644 --- a/components.d.ts +++ b/components.d.ts @@ -10,7 +10,6 @@ export {} declare module '@vue/runtime-core' { export interface GlobalComponents { _index: typeof import('./src/core/components/_sample/_index.vue')['default'] - AAlert: typeof import('ant-design-vue/es')['Alert'] AAvatar: typeof import('ant-design-vue/es')['Avatar'] ABadge: typeof import('ant-design-vue/es')['Badge'] AButton: typeof import('ant-design-vue/es')['Button'] @@ -43,7 +42,6 @@ declare module '@vue/runtime-core' { APagination: typeof import('ant-design-vue/es')['Pagination'] APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] APopover: typeof import('ant-design-vue/es')['Popover'] - ARadio: typeof import('ant-design-vue/es')['Radio'] ARadioButton: typeof import('ant-design-vue/es')['RadioButton'] ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup'] ARow: typeof import('ant-design-vue/es')['Row'] @@ -55,11 +53,9 @@ declare module '@vue/runtime-core' { ATable: typeof import('ant-design-vue/es')['Table'] ATabPane: typeof import('ant-design-vue/es')['TabPane'] ATabs: typeof import('ant-design-vue/es')['Tabs'] - ATag: typeof import('ant-design-vue/es')['Tag'] ATextarea: typeof import('ant-design-vue/es')['Textarea'] ATimePicker: typeof import('ant-design-vue/es')['TimePicker'] ATooltip: typeof import('ant-design-vue/es')['Tooltip'] - AUpload: typeof import('ant-design-vue/es')['Upload'] BaseButton: typeof import('./src/core/components/BaseButton/index.ts')['default'] BaseCard: typeof import('./src/core/components/BaseCard/index.ts')['default'] BaseCollapse: typeof import('./src/components/BaseCollapse.vue')['default'] diff --git a/src/api/consts.ts b/src/api/consts.ts index 4f718d5..3c4d891 100644 --- a/src/api/consts.ts +++ b/src/api/consts.ts @@ -24,4 +24,11 @@ export const updateBannerConst = async (obj: Const) => await useAxios.put(`/admin/const/${obj.id}`, obj) export const getHeaderBannerConst = async () => - await useAxios.get('/api/const/key/header_banner') \ No newline at end of file + await useAxios.get('/api/const/key/header_banner') + +/** GET /api/const/key/reygiri_sites */ +export const getReygiriSitesConst = async () => + await useAxios.get>('/api/const/key/reygiri_sites') + +export const updateReygiriSitesConst = async (obj: Const) => + await useAxios.put(`/admin/const/${obj.id}`, obj) \ No newline at end of file diff --git a/src/model/captureSite.ts b/src/model/captureSite.ts new file mode 100644 index 0000000..7541a87 --- /dev/null +++ b/src/model/captureSite.ts @@ -0,0 +1,5 @@ +export interface CaptureSite { + id: string + name: string + url: string +} diff --git a/src/pages/menuPages/captureSites/index.vue b/src/pages/menuPages/captureSites/index.vue new file mode 100644 index 0000000..de53d23 --- /dev/null +++ b/src/pages/menuPages/captureSites/index.vue @@ -0,0 +1,338 @@ + + + + + diff --git a/src/router/routes/setting.ts b/src/router/routes/setting.ts index dbb45b3..e33b9fb 100644 --- a/src/router/routes/setting.ts +++ b/src/router/routes/setting.ts @@ -54,6 +54,17 @@ const Setting: RouteRecordRaw = { order: 2 } }, + { + name: 'captureSitesMain', + path: 'capture-sites', + component: () => import('@/pages/menuPages/captureSites/index.vue'), + meta: { + permissionsKey: 'pricing', + icon: 'vuesax-linear:global', + title: 'سایت‌های ری‌گیری', + order: 2.5 + } + }, { name: 'advancedConfiguration', path: 'advanced-configuration', diff --git a/src/utils/reygiriSites.ts b/src/utils/reygiriSites.ts new file mode 100644 index 0000000..6c1f1b9 --- /dev/null +++ b/src/utils/reygiriSites.ts @@ -0,0 +1,48 @@ +import type { Const } from '@/model/const' +import type { CaptureSite } from '@/model/captureSite' + +export const REYGIri_SITES_KEY = 'reygiri_sites' + +export function normalizeReygiriSitesConst(response: Const | Const[] | null | undefined): { + constId: number | null + sites: CaptureSite[] +} { + const record = Array.isArray(response) ? response[0] : response + if (!record) { + return { constId: null, sites: [] } + } + + return { + constId: record.id ?? record.const_id ?? null, + sites: parseReygiriSitesValue(record.value), + } +} + +export function parseReygiriSitesValue(value: string | null | undefined): CaptureSite[] { + if (!value) return [] + + try { + const parsed = JSON.parse(value) + if (!Array.isArray(parsed)) return [] + + return parsed + .map((item, index) => ({ + id: String(item?.id ?? `site-${index + 1}`), + name: String(item?.name ?? item?.title ?? item?.title_fa ?? item?.caption ?? '').trim(), + url: String(item?.url ?? item?.link ?? item?.value ?? '').trim(), + })) + .filter((item) => item.name && item.url) + } catch { + return [] + } +} + +export function serializeReygiriSites(sites: CaptureSite[]): string { + return JSON.stringify( + sites.map(({ id, name, url }) => ({ + id, + name, + url, + })) + ) +}