diff --git a/src/api/types.ts b/src/api/types.ts index fbbe686..a47a5db 100644 --- a/src/api/types.ts +++ b/src/api/types.ts @@ -50,7 +50,7 @@ export type Business = { export type CreateBusinessPayload = { title: string; - slug: string; + slug?: string; categoryId: string; description?: string; contactPhone?: string; @@ -71,7 +71,7 @@ export type UpdateBusinessPayload = Partial & { export type CreateCategoryPayload = { title: string; - slug: string; + slug?: string; isActive?: boolean; }; @@ -92,7 +92,7 @@ export type ServiceTemplate = { export type CreateServiceTemplatePayload = { title: string; - slug: string; + slug?: string; categoryId: string; description?: string; defaultDurationMinutes?: number; diff --git a/src/utils/slug.ts b/src/utils/slug.ts index 395e805..73d0ac0 100644 --- a/src/utils/slug.ts +++ b/src/utils/slug.ts @@ -14,3 +14,8 @@ export const SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/; export function isValidSlug(slug: string): boolean { return SLUG_PATTERN.test(slug); } + +export function optionalSlug(value: string): string | undefined { + const trimmed = value.trim(); + return trimmed || undefined; +} diff --git a/src/views/BusinessesView.vue b/src/views/BusinessesView.vue index 5eafbb3..ac5dd76 100644 --- a/src/views/BusinessesView.vue +++ b/src/views/BusinessesView.vue @@ -69,7 +69,13 @@ >
- + ([]); const searchQuery = ref(''); @@ -404,7 +410,8 @@ async function openAssign(biz: Business) { } async function onSaveBusiness() { - if (!isValidSlug(form.value.slug)) { + const slug = optionalSlug(form.value.slug); + if (slug && !isValidSlug(slug)) { error.value = 'اسلاگ نامعتبر است.'; return; } @@ -420,29 +427,30 @@ async function onSaveBusiness() { try { let businessId = editingId.value; + const basePayload = { + title: form.value.title.trim(), + categoryId: form.value.categoryId, + description: form.value.description.trim() || null, + contactPhone: form.value.contactPhone.trim() || null, + address: form.value.address.trim() || null, + latitude: lat ?? null, + longitude: lng ?? null, + isActive: form.value.isActive, + }; if (businessId) { await updateBusiness(businessId, { - title: form.value.title.trim(), - slug: form.value.slug.trim(), - categoryId: form.value.categoryId, - description: form.value.description.trim() || null, - contactPhone: form.value.contactPhone.trim() || null, - address: form.value.address.trim() || null, - latitude: lat ?? null, - longitude: lng ?? null, - isActive: form.value.isActive, + ...basePayload, + ...(slug ? { slug } : {}), }); } else { const created = await createBusiness({ - title: form.value.title.trim(), - slug: form.value.slug.trim(), - categoryId: form.value.categoryId, + ...basePayload, description: form.value.description.trim() || undefined, contactPhone: form.value.contactPhone.trim() || undefined, address: form.value.address.trim() || undefined, latitude: lat, longitude: lng, - isActive: form.value.isActive, + ...(slug ? { slug } : {}), }); businessId = created.id; } diff --git a/src/views/CategoriesView.vue b/src/views/CategoriesView.vue index d5b4469..3519626 100644 --- a/src/views/CategoriesView.vue +++ b/src/views/CategoriesView.vue @@ -68,8 +68,7 @@ v-model="form.slug" label="اسلاگ (انگلیسی)" ltr - placeholder="car-wash" - required + placeholder="اختیاری — از عنوان ساخته می‌شود" />