Add website schema settings, SEO meta overrides, and resilient bulk SMS.

Business admins can configure site-wide Schema.org and optional per-item SEO title/description; mass SMS continues on failures with an end report.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-09-09 23:30:23 +03:30
co-authored by Cursor
parent 15aad9f9d8
commit c2ede07e73
37 changed files with 1217 additions and 89 deletions
@@ -19,6 +19,8 @@ export interface PortfolioApi {
categoryId: string | null
categoryName: string
tags: string[]
seoMetaTitle?: string | null
seoMetaDescription?: string | null
titleImageUrl: string | null
featuredMediaId: string | null
gallery: PortfolioGalleryItem[]
@@ -66,6 +68,8 @@ export interface CreatePortfolioPayload {
featuredMediaId?: string
galleryMediaIds?: string[]
tags?: string[]
seoMetaTitle?: string | null
seoMetaDescription?: string | null
sortOrder?: number
}
@@ -82,6 +86,8 @@ export interface UpdatePortfolioPayload {
featuredMediaId?: string | null
galleryMediaIds?: string[]
tags?: string[]
seoMetaTitle?: string | null
seoMetaDescription?: string | null
sortOrder?: number
/** Pin to absolute top of the business portfolio list. */
moveToTop?: boolean
@@ -171,6 +177,8 @@ export function mapPortfolioApiToFormState(portfolio: PortfolioApi) {
projectUrl: portfolio.projectUrl?.trim() || '',
categoryId: portfolio.categoryId ?? '',
tags: portfolio.tags,
seoMetaTitle: portfolio.seoMetaTitle ?? '',
seoMetaDescription: portfolio.seoMetaDescription ?? '',
titleImage: resolvePortfolioTitleImageUrl(portfolio),
featuredMediaId: portfolio.featuredMediaId,
images: portfolio.gallery.map((item) => item.url),