@burdenoff/microfe-tours 2026.624.1 → 2026.625.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tours/pages/AnalyticsDashboardPage.js +69 -63
- package/dist/tours/pages/AnalyticsDashboardPage.js.map +1 -1
- package/dist/tours/pages/MediaLibraryPage.js +49 -47
- package/dist/tours/pages/MediaLibraryPage.js.map +1 -1
- package/dist/tours/pages/MyToursPage.js +28 -26
- package/dist/tours/pages/MyToursPage.js.map +1 -1
- package/dist/tours/pages/MyToursProgressPage.js +50 -46
- package/dist/tours/pages/MyToursProgressPage.js.map +1 -1
- package/dist/tours/pages/SchedulerPage.js +91 -85
- package/dist/tours/pages/SchedulerPage.js.map +1 -1
- package/dist/tours/pages/StepEditorPage.js +217 -216
- package/dist/tours/pages/StepEditorPage.js.map +1 -1
- package/dist/tours/pages/SystemAnalyticsPage.js +47 -41
- package/dist/tours/pages/SystemAnalyticsPage.js.map +1 -1
- package/dist/tours/pages/TemplateLibraryPage.js +53 -51
- package/dist/tours/pages/TemplateLibraryPage.js.map +1 -1
- package/dist/tours/pages/TourBuilderPage.js +152 -165
- package/dist/tours/pages/TourBuilderPage.js.map +1 -1
- package/dist/tours/pages/TourPreviewPage.js +71 -68
- package/dist/tours/pages/TourPreviewPage.js.map +1 -1
- package/dist/tours/pages/ToursListPage.js +157 -201
- package/dist/tours/pages/ToursListPage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TourBuilderPage.js","names":[],"sources":["../../../src/tours/pages/TourBuilderPage.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n Save,\n ArrowLeft,\n Eye,\n ListOrdered,\n BarChart3,\n Calendar,\n LayoutTemplate,\n Sparkles,\n} from 'lucide-react';\nimport { gql } from '@apollo/client/core';\nimport { PermissionGate } from '@burdenoff/fe-libs/shared/components';\nimport { useEventBus } from '@burdenoff/fe-libs/shared/events';\nimport { useGatewayClient } from '@burdenoff/fe-libs/shared/graphql';\nimport { useTourBuilder } from '../hooks/useTourBuilder';\nimport { useTourLifecycle } from '../hooks/useTourLifecycle';\nimport { useToursPermissionAccess } from '../hooks/useToursPermissionAccess';\nimport { useToursContext } from '../providers/ToursProvider';\nimport { TOUR_PERMISSIONS } from '../../constants/permissions';\nimport type { Tour, TourTriggerType } from '../types';\nimport { useToursI18n } from '../i18n';\nimport { emitToursApiFailed } from '../telemetry';\nimport { useGetPlatformProductsForToursQuery } from '../../generated/global-operations';\n\n// Covers the current platform catalog with room for planned products; custom slug entry remains the fallback.\nconst PLATFORM_PRODUCTS_QUERY_LIMIT = 250;\n\nconst SEED_VIBECONTROLS_USER_TOURS = gql`\n mutation SeedVibeControlsUserTours {\n seedVibeControlsUserTours {\n productId\n workspaceId\n createdCount\n updatedCount\n totalCount\n tours {\n tourId\n slug\n name\n action\n stepCount\n }\n }\n }\n`;\n\ninterface SeededUserTourResult {\n tourId: string;\n slug: string;\n name: string;\n action: string;\n stepCount: number;\n}\n\ninterface SeedVibeControlsUserToursPayload {\n productId: string;\n workspaceId: string;\n createdCount: number;\n updatedCount: number;\n totalCount: number;\n tours: SeededUserTourResult[];\n}\n\ninterface SeedVibeControlsUserToursMutation {\n seedVibeControlsUserTours: SeedVibeControlsUserToursPayload;\n}\n\nfunction getMutationErrorMessage(result: unknown): string | null {\n if (!result || typeof result !== 'object') return null;\n\n const record = result as Record<string, unknown>;\n const singleError = record.error;\n if (singleError instanceof Error) return singleError.message;\n\n const errors = record.errors;\n if (!Array.isArray(errors) || errors.length === 0) return null;\n\n const messages = errors\n .map((error) => {\n if (error instanceof Error) return error.message;\n if (!error || typeof error !== 'object') return null;\n\n const message = (error as { message?: unknown }).message;\n return typeof message === 'string' ? message : null;\n })\n .filter((message): message is string => Boolean(message));\n\n return messages.length > 0 ? messages.join('; ') : 'Seed mutation returned errors.';\n}\n\ninterface TourRouteModuleOption {\n moduleId: string;\n label: string;\n path: string;\n}\n\ninterface TourRoutePageOption {\n pageId: string;\n label: string;\n path: string;\n}\n\ninterface TourRouteCatalogEntry {\n productId: string;\n moduleId: string;\n moduleLabel: string;\n pageId: string;\n pageLabel: string;\n path: string;\n isModuleHome?: boolean;\n}\n\nconst TOUR_ROUTE_CATALOG: readonly TourRouteCatalogEntry[] = [\n {\n productId: 'vibecontrols',\n moduleId: 'dashboard',\n moduleLabel: 'Dashboard',\n pageId: 'dashboard',\n pageLabel: 'Dashboard',\n path: '/dashboard',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'home',\n pageLabel: 'Overview',\n path: '/vibecontrols',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'agents',\n pageLabel: 'Targets & Agents',\n path: '/vibecontrols/agents',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'vibes',\n pageLabel: 'Vibes',\n path: '/vibecontrols/vibes',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'sessions',\n pageLabel: 'Sessions',\n path: '/vibecontrols/sessions',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'ai',\n pageLabel: 'AI',\n path: '/vibecontrols/ai',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'catalogs',\n pageLabel: 'Catalogs',\n path: '/vibecontrols/catalogs',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'components',\n pageLabel: 'Components',\n path: '/vibecontrols/components',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'templates',\n pageLabel: 'Templates',\n path: '/vibecontrols/templates',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'actions',\n pageLabel: 'Actions',\n path: '/vibecontrols/actions',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'vibedeck',\n pageLabel: 'Decks',\n path: '/vibecontrols/vibedeck',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'calendar',\n pageLabel: 'Calendar',\n path: '/vibecontrols/calendar',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'tunnels',\n pageLabel: 'Tunnels',\n path: '/vibecontrols/tunnels',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'analytics',\n pageLabel: 'Analytics',\n path: '/vibecontrols/analytics',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'audit',\n pageLabel: 'Audit Log',\n path: '/vibecontrols/audit',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'health',\n pageLabel: 'Health',\n path: '/vibecontrols/health',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'settings',\n pageLabel: 'Settings',\n path: '/vibecontrols/settings',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'scheduler',\n moduleLabel: 'Scheduler',\n pageId: 'scheduler',\n pageLabel: 'Scheduler',\n path: '/scheduler',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'sandbox',\n moduleLabel: 'Sandbox',\n pageId: 'sandbox',\n pageLabel: 'Sandbox',\n path: '/sandbox',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'support',\n moduleLabel: 'Support',\n pageId: 'tickets',\n pageLabel: 'Tickets',\n path: '/support/tickets',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'support',\n moduleLabel: 'Support',\n pageId: 'knowledge-base',\n pageLabel: 'Knowledge Base',\n path: '/support/kb',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'notifications',\n moduleLabel: 'Notifications',\n pageId: 'center',\n pageLabel: 'Notification Center',\n path: '/notifications/center',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'notifications',\n moduleLabel: 'Notifications',\n pageId: 'history',\n pageLabel: 'History',\n path: '/notifications/history',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'notifications',\n moduleLabel: 'Notifications',\n pageId: 'preferences',\n pageLabel: 'Preferences',\n path: '/notifications/preferences',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'home',\n pageLabel: 'All Conversations',\n path: '/conversations',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'list',\n pageLabel: 'Conversation List',\n path: '/conversations/list',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'new',\n pageLabel: 'New Conversation',\n path: '/conversations/new',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'settings',\n pageLabel: 'Settings',\n path: '/conversations/settings',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'auth',\n moduleLabel: 'Auth',\n pageId: 'home',\n pageLabel: 'Auth',\n path: '/auth/security',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'groups',\n moduleLabel: 'Groups and Teams',\n pageId: 'home',\n pageLabel: 'Groups and Teams',\n path: '/groups',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'tags',\n moduleLabel: 'Tags',\n pageId: 'home',\n pageLabel: 'Tags',\n path: '/tags',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'files',\n moduleLabel: 'Files',\n pageId: 'home',\n pageLabel: 'Files',\n path: '/files/browse',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'security',\n moduleLabel: 'Vault',\n pageId: 'home',\n pageLabel: 'Vault',\n path: '/security',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'integrations',\n moduleLabel: 'Integrations',\n pageId: 'home',\n pageLabel: 'Integrations',\n path: '/integrations',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'export',\n moduleLabel: 'Exports',\n pageId: 'home',\n pageLabel: 'Exports',\n path: '/export',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'organizations',\n moduleLabel: 'Organizations',\n pageId: 'home',\n pageLabel: 'Organizations',\n path: '/organizations',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'workspaces',\n moduleLabel: 'Workspaces',\n pageId: 'home',\n pageLabel: 'Workspaces',\n path: '/workspaces',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'billing',\n moduleLabel: 'Billing',\n pageId: 'home',\n pageLabel: 'Billing',\n path: '/billing/overview',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'store',\n moduleLabel: 'Marketplace',\n pageId: 'home',\n pageLabel: 'Marketplace',\n path: '/store/marketplace',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'channels',\n moduleLabel: 'Channels',\n pageId: 'home',\n pageLabel: 'Channels',\n path: '/channels',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'devportal',\n moduleLabel: 'Developer Portal',\n pageId: 'home',\n pageLabel: 'Developer Portal',\n path: '/devportal',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'feature-previews',\n moduleLabel: 'Feature Previews',\n pageId: 'home',\n pageLabel: 'Feature Previews',\n path: '/feature-previews',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'search',\n moduleLabel: 'Search',\n pageId: 'home',\n pageLabel: 'Search',\n path: '/search',\n isModuleHome: true,\n },\n] as const;\n\nfunction normalizeCatalogValue(value: string | null | undefined): string | undefined {\n const normalized = value?.trim();\n return normalized ? normalized : undefined;\n}\n\nfunction getRouteCatalog(productId: string | null | undefined): TourRouteCatalogEntry[] {\n const productKey = normalizeCatalogValue(productId);\n if (!productKey) return [];\n return TOUR_ROUTE_CATALOG.filter((entry) => entry.productId === productKey);\n}\n\nfunction getTourRouteModules(productId: string | null | undefined): TourRouteModuleOption[] {\n const modules = new Map<string, TourRouteModuleOption>();\n\n for (const entry of getRouteCatalog(productId)) {\n const existing = modules.get(entry.moduleId);\n if (!existing || entry.isModuleHome) {\n modules.set(entry.moduleId, {\n moduleId: entry.moduleId,\n label: entry.moduleLabel,\n path: entry.path,\n });\n }\n }\n\n return [...modules.values()];\n}\n\nfunction getTourRoutePages(\n productId: string | null | undefined,\n moduleId: string | null | undefined\n): TourRoutePageOption[] {\n const moduleKey = normalizeCatalogValue(moduleId);\n if (!moduleKey) return [];\n\n return getRouteCatalog(productId).flatMap((entry) =>\n entry.moduleId === moduleKey\n ? [{ pageId: entry.pageId, label: entry.pageLabel, path: entry.path }]\n : []\n );\n}\n\n/**\n * Tour builder page\n * Create or edit tour metadata\n */\nexport function TourBuilderPage() {\n const { tr } = useToursI18n();\n const { tourId } = useParams();\n const navigate = useNavigate();\n const toursContext = useToursContext();\n const { basePath = '/' } = toursContext;\n const eventBus = useEventBus();\n const globalClient = useGatewayClient('global');\n const { hasPermission, isLoading: permissionsLoading } = useToursPermissionAccess();\n const isNew = !tourId || tourId === 'new';\n const canCreate = hasPermission(TOUR_PERMISSIONS.TOUR_CREATE);\n const canUpdate = hasPermission(TOUR_PERMISSIONS.TOUR_UPDATE);\n const canCreateTemplate = hasPermission(TOUR_PERMISSIONS.TOUR_TEMPLATE_CREATE);\n const canSave = isNew ? canCreate : canUpdate;\n const canSeedVibeControlsUserTours = canCreate && canUpdate;\n\n const { tour, loadTour, createTour, updateTour, saving, validationErrors, error } =\n useTourBuilder(tourId);\n const { saveAsTemplate } = useTourLifecycle();\n const { data: productsData, loading: productsLoading } = useGetPlatformProductsForToursQuery({\n variables: { limit: PLATFORM_PRODUCTS_QUERY_LIMIT, offset: 0 },\n fetchPolicy: 'cache-and-network',\n skip: permissionsLoading || !canSave,\n });\n\n const defaultFormData = {\n name: '',\n description: '',\n productId: '',\n moduleId: '',\n pageId: '',\n isActive: true,\n status: 'DRAFT' as const,\n triggerType: 'MANUAL' as const,\n priority: 50,\n displayOrder: 1,\n startDate: '',\n endDate: '',\n };\n\n const [formData, setFormData] = useState<Partial<Tour>>(defaultFormData);\n const [customProductEntry, setCustomProductEntry] = useState(false);\n const [customModuleEntry, setCustomModuleEntry] = useState(false);\n const [customPageEntry, setCustomPageEntry] = useState(false);\n const [seedLoading, setSeedLoading] = useState(false);\n const [seedResult, setSeedResult] = useState<SeedVibeControlsUserToursPayload | null>(null);\n const [seedError, setSeedError] = useState<string | null>(null);\n\n const formInitializedRef = useRef(false);\n\n const productOptions = useMemo(() => {\n return [...(productsData?.platformProducts.items ?? [])].sort((a, b) =>\n a.name.localeCompare(b.name)\n );\n }, [productsData]);\n\n const productOptionSlugs = useMemo(\n () => new Set(productOptions.map((product) => product.slug)),\n [productOptions]\n );\n\n const moduleOptions = useMemo(\n () => getTourRouteModules(formData.productId),\n [formData.productId]\n );\n\n const moduleOptionIds = useMemo(\n () => new Set(moduleOptions.map((moduleOption) => moduleOption.moduleId)),\n [moduleOptions]\n );\n\n const pageOptions = useMemo(\n () => getTourRoutePages(formData.productId, formData.moduleId),\n [formData.moduleId, formData.productId]\n );\n\n const pageOptionIds = useMemo(\n () => new Set(pageOptions.map((pageOption) => pageOption.pageId)),\n [pageOptions]\n );\n\n useEffect(() => {\n if (formInitializedRef.current) return;\n if (!permissionsLoading && canSave && tourId && tourId !== 'new') {\n loadTour(tourId);\n }\n }, [canSave, loadTour, permissionsLoading, tourId]);\n\n useEffect(() => {\n if (tour && !formInitializedRef.current) {\n setFormData(tour);\n formInitializedRef.current = true;\n }\n }, [tour]);\n\n useEffect(() => {\n if (!formData.productId || productsLoading) {\n setCustomProductEntry(false);\n return;\n }\n setCustomProductEntry(productOptions.length > 0 && !productOptionSlugs.has(formData.productId));\n }, [formData.productId, productOptionSlugs, productOptions.length, productsLoading]);\n\n useEffect(() => {\n if (!formData.productId || !formData.moduleId) {\n setCustomModuleEntry(false);\n return;\n }\n setCustomModuleEntry(moduleOptions.length === 0 || !moduleOptionIds.has(formData.moduleId));\n }, [formData.moduleId, formData.productId, moduleOptionIds, moduleOptions.length]);\n\n useEffect(() => {\n if (!formData.productId || !formData.pageId) {\n setCustomPageEntry(false);\n return;\n }\n setCustomPageEntry(pageOptions.length === 0 || !pageOptionIds.has(formData.pageId));\n }, [formData.pageId, formData.productId, pageOptionIds, pageOptions.length]);\n\n const showCurrentProductOption = Boolean(\n formData.productId && !customProductEntry && !productOptionSlugs.has(formData.productId)\n );\n const showCurrentModuleOption = Boolean(\n formData.moduleId && !customModuleEntry && !moduleOptionIds.has(formData.moduleId)\n );\n const showCurrentPageOption = Boolean(\n formData.pageId && !customPageEntry && !pageOptionIds.has(formData.pageId)\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n try {\n if (tourId && tourId !== 'new') {\n await updateTour(tourId, formData);\n } else {\n await createTour(formData);\n }\n } catch {\n emitToursApiFailed(eventBus, 'tour.save', toursContext);\n }\n };\n\n const handleBack = () => {\n navigate(`${basePath}/list`);\n };\n\n const formatDateTimeLocal = (value?: string) => {\n if (!value) return '';\n\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n\n return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, 16);\n };\n\n const handleSaveTemplate = async () => {\n if (!tourId || tourId === 'new') return;\n\n const defaultName = `${formData.name || tour?.name || 'Tour'} Template`;\n const name = window.prompt('Template name', defaultName);\n if (!name) return;\n\n const category =\n window.prompt(\n 'Template category (ONBOARDING, FEATURE_ANNOUNCEMENT, HELP, CUSTOM)',\n 'ONBOARDING'\n ) || 'ONBOARDING';\n\n try {\n await saveAsTemplate(tourId, {\n name,\n description: formData.description,\n category,\n isPublic: false,\n });\n navigate(`${basePath}/templates`);\n } catch {\n emitToursApiFailed(eventBus, 'template.save', toursContext);\n }\n };\n\n const handleSeedVibeControlsUserTours = async () => {\n const confirmed = window.confirm(tr('tourBuilder.seedVibeControls.confirm'));\n if (!confirmed) return;\n\n setSeedLoading(true);\n setSeedResult(null);\n setSeedError(null);\n\n try {\n const result = await globalClient.mutate<SeedVibeControlsUserToursMutation>({\n mutation: SEED_VIBECONTROLS_USER_TOURS,\n });\n\n const mutationErrorMessage = getMutationErrorMessage(result);\n if (mutationErrorMessage) {\n throw new Error(mutationErrorMessage);\n }\n\n const payload = result.data?.seedVibeControlsUserTours;\n if (!payload) {\n throw new Error('Seed mutation returned no result.');\n }\n\n setSeedResult(payload);\n } catch (seedMutationError) {\n const errorMessage =\n seedMutationError instanceof Error\n ? seedMutationError.message\n : tr('tourBuilder.seedVibeControls.error');\n setSeedError(errorMessage);\n eventBus.emit(\n 'tours.api.failed',\n {\n route: '/tours',\n operation: 'tour.seed_vibecontrols_user_tours',\n errorMessage,\n productId: toursContext.productId,\n workspaceId: toursContext.workspaceId,\n },\n { component: 'microfe-tours' }\n );\n } finally {\n setSeedLoading(false);\n }\n };\n\n if (permissionsLoading) {\n return (\n <div className=\"flex h-full items-center justify-center p-3 sm:p-6\">\n <p className=\"text-sm text-text-secondary\">{tr('tourBuilder.loading')}</p>\n </div>\n );\n }\n\n if (!canSave) {\n return (\n <div className=\"flex h-full items-center justify-center p-3 sm:p-6\">\n <div className=\"text-center space-y-4\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary mb-2\">\n {tr('tourBuilder.accessDeniedTitle')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {isNew\n ? tr('tourBuilder.createAccessDeniedMessage')\n : tr('tourBuilder.updateAccessDeniedMessage')}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"inline-flex items-center justify-center rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent\"\n >\n {tr('tourBuilder.goBack')}\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6 max-w-4xl mx-auto\">\n {/* Header */}\n <div className=\"flex items-center gap-4\">\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"p-2 hover:bg-accent rounded-md\"\n aria-label={tr('tourBuilder.goBack')}\n >\n <ArrowLeft size={20} />\n </button>\n <div className=\"flex-1\">\n <h1 className=\"text-xl sm:text-2xl font-bold text-text-primary\">\n {tourId && tourId !== 'new'\n ? tr('tourBuilder.titleEdit')\n : tr('tourBuilder.titleCreate')}\n </h1>\n <p className=\"text-sm text-text-secondary\">{tr('tourBuilder.subtitle')}</p>\n </div>\n </div>\n\n {isNew ? (\n <div className=\"rounded-md border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"space-y-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr('tourBuilder.seedVibeControls.title')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {tr('tourBuilder.seedVibeControls.description')}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => void handleSeedVibeControlsUserTours()}\n disabled={seedLoading || !canSeedVibeControlsUserTours}\n className=\"inline-flex min-h-11 items-center justify-center gap-2 rounded-md border border-border-subtle bg-secondary px-4 py-2 text-sm font-medium text-secondary-foreground hover:bg-secondary/80 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <Sparkles size={18} />\n {seedLoading\n ? tr('tourBuilder.seedVibeControls.loading')\n : tr('tourBuilder.seedVibeControls.button')}\n </button>\n </div>\n {!canSeedVibeControlsUserTours ? (\n <p className=\"mt-3 text-sm text-text-secondary\">\n {tr('tourBuilder.seedVibeControls.permissionHint')}\n </p>\n ) : null}\n {seedError ? <p className=\"mt-3 text-sm text-status-error-text\">{seedError}</p> : null}\n {seedResult ? (\n <div className=\"mt-3 rounded-md border border-border-subtle bg-bg-surface p-3 text-sm text-text-secondary\">\n {tr('tourBuilder.seedVibeControls.result', {\n totalCount: seedResult.totalCount,\n productId: seedResult.productId,\n workspaceId: seedResult.workspaceId,\n createdCount: seedResult.createdCount,\n updatedCount: seedResult.updatedCount,\n })}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {/* Form */}\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n {/* Basic Info */}\n <div className=\"border border-border-subtle rounded-md p-4 sm:p-6 bg-bg-surface\">\n <h2 className=\"text-lg font-semibold mb-4\">{tr('tourBuilder.sectionBasicInfo')}</h2>\n\n <div className=\"space-y-4\">\n {/* Name */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-name\">\n {tr('tourBuilder.labelName')}\n </label>\n <input\n id=\"tour-name\"\n type=\"text\"\n value={formData.name || ''}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n required\n aria-label={tr('tourBuilder.labelName')}\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-description\">\n {tr('tourBuilder.labelDescription')}\n </label>\n <textarea\n id=\"tour-description\"\n value={formData.description || ''}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label={tr('tourBuilder.labelDescription')}\n />\n </div>\n\n {/* Product ID */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"product-id\">\n {tr('tourBuilder.labelProductId')}\n </label>\n <select\n id=\"product-id\"\n value={customProductEntry ? '__custom__' : formData.productId || ''}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setCustomProductEntry(true);\n setFormData({\n ...formData,\n productId: '',\n moduleId: undefined,\n pageId: undefined,\n });\n return;\n }\n\n setCustomProductEntry(false);\n setCustomModuleEntry(false);\n setCustomPageEntry(false);\n setFormData({\n ...formData,\n productId: e.target.value,\n moduleId: undefined,\n pageId: undefined,\n });\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n required\n aria-label={tr('tourBuilder.labelProductId')}\n >\n <option value=\"\">Select product</option>\n {productsLoading ? <option disabled>Loading products…</option> : null}\n {productOptions.map((product) => (\n <option key={product.id} value={product.slug}>\n {product.name} ({product.slug})\n </option>\n ))}\n {showCurrentProductOption ? (\n <option value={formData.productId}>Current: {formData.productId}</option>\n ) : null}\n <option value=\"__custom__\">Custom product slug</option>\n </select>\n {customProductEntry ? (\n <input\n id=\"product-id-custom\"\n aria-label=\"Custom product slug\"\n type=\"text\"\n value={formData.productId || ''}\n onChange={(e) =>\n setFormData({\n ...formData,\n productId: e.target.value,\n moduleId: undefined,\n pageId: undefined,\n })\n }\n className=\"mt-2 w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n placeholder=\"vibecontrols\"\n required\n />\n ) : null}\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"module-id\">\n Module ID\n </label>\n <select\n id=\"module-id\"\n value={customModuleEntry ? '__custom__' : formData.moduleId || ''}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setCustomModuleEntry(true);\n setFormData({ ...formData, moduleId: '', pageId: undefined });\n return;\n }\n\n setCustomModuleEntry(false);\n setCustomPageEntry(false);\n setFormData({\n ...formData,\n moduleId: e.target.value || undefined,\n pageId: undefined,\n });\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n disabled={!formData.productId}\n aria-label=\"Module ID\"\n >\n <option value=\"\">All modules</option>\n {moduleOptions.map((moduleOption) => (\n <option key={moduleOption.moduleId} value={moduleOption.moduleId}>\n {moduleOption.label} ({moduleOption.moduleId})\n </option>\n ))}\n {showCurrentModuleOption ? (\n <option value={formData.moduleId}>Current: {formData.moduleId}</option>\n ) : null}\n <option value=\"__custom__\">Custom module ID</option>\n </select>\n {customModuleEntry ? (\n <input\n id=\"module-id-custom\"\n aria-label=\"Custom module ID\"\n type=\"text\"\n value={formData.moduleId || ''}\n onChange={(e) =>\n setFormData({\n ...formData,\n moduleId: e.target.value || undefined,\n pageId: undefined,\n })\n }\n className=\"mt-2 w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n placeholder=\"vibecontrols\"\n />\n ) : null}\n </div>\n\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"page-id\">\n Page ID\n </label>\n <select\n id=\"page-id\"\n value={customPageEntry ? '__custom__' : formData.pageId || ''}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setCustomPageEntry(true);\n setFormData({ ...formData, pageId: '' });\n return;\n }\n\n setCustomPageEntry(false);\n setFormData({ ...formData, pageId: e.target.value || undefined });\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n disabled={!formData.productId}\n aria-label=\"Page ID\"\n >\n <option value=\"\">All pages</option>\n {pageOptions.map((pageOption) => (\n <option key={pageOption.pageId} value={pageOption.pageId}>\n {pageOption.label} ({pageOption.pageId})\n </option>\n ))}\n {showCurrentPageOption ? (\n <option value={formData.pageId}>Current: {formData.pageId}</option>\n ) : null}\n <option value=\"__custom__\">Custom page ID</option>\n </select>\n {customPageEntry ? (\n <input\n id=\"page-id-custom\"\n aria-label=\"Custom page ID\"\n type=\"text\"\n value={formData.pageId || ''}\n onChange={(e) =>\n setFormData({ ...formData, pageId: e.target.value || undefined })\n }\n className=\"mt-2 w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n placeholder=\"agents\"\n />\n ) : null}\n </div>\n </div>\n\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={formData.isActive ?? true}\n onChange={(e) => setFormData({ ...formData, isActive: e.target.checked })}\n className=\"size-4 rounded\"\n aria-label=\"Active\"\n />\n <span className=\"text-sm font-medium\">Active</span>\n </label>\n </div>\n </div>\n\n {/* Trigger Settings */}\n <div className=\"border border-border-subtle rounded-md p-4 sm:p-6 bg-bg-surface\">\n <h2 className=\"text-lg font-semibold mb-4\">{tr('tourBuilder.sectionTriggerSettings')}</h2>\n\n <div className=\"space-y-4\">\n {/* Trigger Type */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"trigger-type\">\n {tr('tourBuilder.labelTriggerType')}\n </label>\n <select\n id=\"trigger-type\"\n value={formData.triggerType || 'MANUAL'}\n onChange={(e) =>\n setFormData({ ...formData, triggerType: e.target.value as TourTriggerType })\n }\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label={tr('tourBuilder.labelTriggerType')}\n >\n <option value=\"MANUAL\">{tr('tourBuilder.triggerManual')}</option>\n <option value=\"AUTO_FIRST_VISIT\">{tr('tourBuilder.triggerAutoFirstVisit')}</option>\n <option value=\"AUTO_ALWAYS\">{tr('tourBuilder.triggerAutoAlways')}</option>\n <option value=\"ON_EVENT\">{tr('tourBuilder.triggerOnEvent')}</option>\n <option value=\"SCHEDULED\">{tr('tourBuilder.triggerScheduled')}</option>\n </select>\n </div>\n\n {/* Priority */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"priority\">\n {tr('tourBuilder.labelPriority')}\n </label>\n <input\n id=\"priority\"\n type=\"number\"\n min=\"1\"\n max=\"100\"\n value={formData.priority || 50}\n onChange={(e) => {\n const priority = Number.parseInt(e.target.value, 10) || 50;\n setFormData({ ...formData, priority });\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label={tr('tourBuilder.labelPriority')}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-start-date\">\n Start Date\n </label>\n <input\n id=\"tour-start-date\"\n type=\"datetime-local\"\n value={formatDateTimeLocal(formData.startDate)}\n onChange={(e) =>\n setFormData({\n ...formData,\n startDate: e.target.value\n ? new Date(e.target.value).toISOString()\n : undefined,\n })\n }\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label=\"Start Date\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-end-date\">\n End Date\n </label>\n <input\n id=\"tour-end-date\"\n type=\"datetime-local\"\n value={formatDateTimeLocal(formData.endDate)}\n onChange={(e) =>\n setFormData({\n ...formData,\n endDate: e.target.value ? new Date(e.target.value).toISOString() : undefined,\n })\n }\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label=\"End Date\"\n />\n </div>\n </div>\n </div>\n </div>\n\n {/* API Error */}\n {error && (\n <div className=\"border border-status-error-border rounded-md p-4 bg-status-error-bg/10\">\n <h3 className=\"font-semibold text-status-error-text mb-2\">{tr('tourBuilder.errorTitle')}</h3>\n <p className=\"text-sm text-status-error-text\">{error.message}</p>\n </div>\n )}\n\n {/* Validation Errors */}\n {validationErrors.length > 0 && (\n <div className=\"border border-status-error-border rounded-md p-4 bg-status-error-bg/10\">\n <h3 className=\"font-semibold text-status-error-text mb-2\">\n {tr('tourBuilder.validationErrorsTitle')}\n </h3>\n <ul className=\"list-disc list-inside space-y-1\">\n {validationErrors.map((err) => (\n <li key={err.message} className=\"text-sm text-status-error-text\">\n {err.message}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex flex-wrap gap-3\">\n <PermissionGate\n permission={isNew ? TOUR_PERMISSIONS.TOUR_CREATE : TOUR_PERMISSIONS.TOUR_UPDATE}\n >\n <button\n type=\"submit\"\n disabled={saving || !canSave}\n className=\"flex-1 min-w-[200px] px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg/90 disabled:opacity-50 flex items-center justify-center gap-2\"\n >\n <Save size={20} />\n {saving\n ? tr('tourBuilder.saving')\n : tourId && tourId !== 'new'\n ? tr('tourBuilder.updateTour')\n : tr('tourBuilder.createAndAddSteps')}\n </button>\n </PermissionGate>\n {tourId && tourId !== 'new' && (\n <>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${tourId}/steps`)}\n className=\"px-4 py-2 bg-secondary text-secondary-foreground rounded-md hover:bg-secondary/80 flex items-center gap-2\"\n >\n <ListOrdered size={20} />\n {tr('tourBuilder.editSteps')}\n {tour?.steps && tour.steps.length > 0 && (\n <span className=\"ml-1 px-2 py-0.5 text-xs bg-action-primary-bg/20 rounded-full\">\n {tour.steps.length}\n </span>\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${tourId}/preview`)}\n className=\"px-4 py-2 border border-border-subtle rounded-md hover:bg-accent flex items-center gap-2\"\n >\n <Eye size={20} />\n {tr('tourBuilder.preview')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${tourId}/analytics`)}\n className=\"px-4 py-2 border border-border-subtle rounded-md hover:bg-accent flex items-center gap-2\"\n >\n <BarChart3 size={20} />\n {tr('tourBuilder.analytics')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${tourId}/schedule`)}\n className=\"px-4 py-2 border border-border-subtle rounded-md hover:bg-accent flex items-center gap-2\"\n >\n <Calendar size={20} />\n Schedule\n </button>\n <PermissionGate permission={TOUR_PERMISSIONS.TOUR_TEMPLATE_CREATE}>\n <button\n type=\"button\"\n onClick={handleSaveTemplate}\n disabled={!canCreateTemplate}\n className=\"px-4 py-2 border border-border-subtle rounded-md hover:bg-accent flex items-center gap-2 disabled:opacity-50\"\n >\n <LayoutTemplate size={20} />\n Save as Template\n </button>\n </PermissionGate>\n </>\n )}\n </div>\n </form>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA2BA,IAAM,KAAgC,KAEhC,KAA+B,CAAG;;;;;;;;;;;;;;;;;;AAwCxC,SAAS,GAAwB,GAAgC;AAC/D,KAAI,CAAC,KAAU,OAAO,KAAW,SAAU,QAAO;CAElD,IAAM,IAAS,GACT,IAAc,EAAO;AAC3B,KAAI,aAAuB,MAAO,QAAO,EAAY;CAErD,IAAM,IAAS,EAAO;AACtB,KAAI,CAAC,MAAM,QAAQ,EAAO,IAAI,EAAO,WAAW,EAAG,QAAO;CAE1D,IAAM,IAAW,EACd,KAAK,MAAU;AACd,MAAI,aAAiB,MAAO,QAAO,EAAM;AACzC,MAAI,CAAC,KAAS,OAAO,KAAU,SAAU,QAAO;EAEhD,IAAM,IAAW,EAAgC;AACjD,SAAO,OAAO,KAAY,WAAW,IAAU;GAC/C,CACD,QAAQ,MAA+B,EAAQ,EAAS;AAE3D,QAAO,EAAS,SAAS,IAAI,EAAS,KAAK,KAAK,GAAG;;AAyBrD,IAAM,IAAuD;CAC3D;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CAC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"}
|
|
1
|
+
{"version":3,"file":"TourBuilderPage.js","names":[],"sources":["../../../src/tours/pages/TourBuilderPage.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n Save,\n ArrowLeft,\n Eye,\n ListOrdered,\n BarChart3,\n Calendar,\n LayoutTemplate,\n Sparkles,\n} from 'lucide-react';\nimport { gql } from '@apollo/client/core';\nimport { PermissionGate } from '@burdenoff/fe-libs/shared/components';\nimport {\n Button,\n GlassCard,\n EmphasisPanel,\n CTAOverflowMenu,\n type CTAAction,\n} from '@burdenoff/fe-libs/ui';\nimport { useEventBus } from '@burdenoff/fe-libs/shared/events';\nimport { useGatewayClient } from '@burdenoff/fe-libs/shared/graphql';\nimport { useTourBuilder } from '../hooks/useTourBuilder';\nimport { useTourLifecycle } from '../hooks/useTourLifecycle';\nimport { useToursPermissionAccess } from '../hooks/useToursPermissionAccess';\nimport { useToursContext } from '../providers/ToursProvider';\nimport { TOUR_PERMISSIONS } from '../../constants/permissions';\nimport type { Tour, TourTriggerType } from '../types';\nimport { useToursI18n } from '../i18n';\nimport { emitToursApiFailed } from '../telemetry';\nimport { useGetPlatformProductsForToursQuery } from '../../generated/global-operations';\n\n// Covers the current platform catalog with room for planned products; custom slug entry remains the fallback.\nconst PLATFORM_PRODUCTS_QUERY_LIMIT = 250;\n\nconst SEED_VIBECONTROLS_USER_TOURS = gql`\n mutation SeedVibeControlsUserTours {\n seedVibeControlsUserTours {\n productId\n workspaceId\n createdCount\n updatedCount\n totalCount\n tours {\n tourId\n slug\n name\n action\n stepCount\n }\n }\n }\n`;\n\ninterface SeededUserTourResult {\n tourId: string;\n slug: string;\n name: string;\n action: string;\n stepCount: number;\n}\n\ninterface SeedVibeControlsUserToursPayload {\n productId: string;\n workspaceId: string;\n createdCount: number;\n updatedCount: number;\n totalCount: number;\n tours: SeededUserTourResult[];\n}\n\ninterface SeedVibeControlsUserToursMutation {\n seedVibeControlsUserTours: SeedVibeControlsUserToursPayload;\n}\n\nfunction getMutationErrorMessage(result: unknown): string | null {\n if (!result || typeof result !== 'object') return null;\n\n const record = result as Record<string, unknown>;\n const singleError = record.error;\n if (singleError instanceof Error) return singleError.message;\n\n const errors = record.errors;\n if (!Array.isArray(errors) || errors.length === 0) return null;\n\n const messages = errors\n .map((error) => {\n if (error instanceof Error) return error.message;\n if (!error || typeof error !== 'object') return null;\n\n const message = (error as { message?: unknown }).message;\n return typeof message === 'string' ? message : null;\n })\n .filter((message): message is string => Boolean(message));\n\n return messages.length > 0 ? messages.join('; ') : 'Seed mutation returned errors.';\n}\n\ninterface TourRouteModuleOption {\n moduleId: string;\n label: string;\n path: string;\n}\n\ninterface TourRoutePageOption {\n pageId: string;\n label: string;\n path: string;\n}\n\ninterface TourRouteCatalogEntry {\n productId: string;\n moduleId: string;\n moduleLabel: string;\n pageId: string;\n pageLabel: string;\n path: string;\n isModuleHome?: boolean;\n}\n\nconst TOUR_ROUTE_CATALOG: readonly TourRouteCatalogEntry[] = [\n {\n productId: 'vibecontrols',\n moduleId: 'dashboard',\n moduleLabel: 'Dashboard',\n pageId: 'dashboard',\n pageLabel: 'Dashboard',\n path: '/dashboard',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'home',\n pageLabel: 'Overview',\n path: '/vibecontrols',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'agents',\n pageLabel: 'Targets & Agents',\n path: '/vibecontrols/agents',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'vibes',\n pageLabel: 'Vibes',\n path: '/vibecontrols/vibes',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'sessions',\n pageLabel: 'Sessions',\n path: '/vibecontrols/sessions',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'ai',\n pageLabel: 'AI',\n path: '/vibecontrols/ai',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'catalogs',\n pageLabel: 'Catalogs',\n path: '/vibecontrols/catalogs',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'components',\n pageLabel: 'Components',\n path: '/vibecontrols/components',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'templates',\n pageLabel: 'Templates',\n path: '/vibecontrols/templates',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'actions',\n pageLabel: 'Actions',\n path: '/vibecontrols/actions',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'vibedeck',\n pageLabel: 'Decks',\n path: '/vibecontrols/vibedeck',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'calendar',\n pageLabel: 'Calendar',\n path: '/vibecontrols/calendar',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'tunnels',\n pageLabel: 'Tunnels',\n path: '/vibecontrols/tunnels',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'analytics',\n pageLabel: 'Analytics',\n path: '/vibecontrols/analytics',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'audit',\n pageLabel: 'Audit Log',\n path: '/vibecontrols/audit',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'health',\n pageLabel: 'Health',\n path: '/vibecontrols/health',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'settings',\n pageLabel: 'Settings',\n path: '/vibecontrols/settings',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'scheduler',\n moduleLabel: 'Scheduler',\n pageId: 'scheduler',\n pageLabel: 'Scheduler',\n path: '/scheduler',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'sandbox',\n moduleLabel: 'Sandbox',\n pageId: 'sandbox',\n pageLabel: 'Sandbox',\n path: '/sandbox',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'support',\n moduleLabel: 'Support',\n pageId: 'tickets',\n pageLabel: 'Tickets',\n path: '/support/tickets',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'support',\n moduleLabel: 'Support',\n pageId: 'knowledge-base',\n pageLabel: 'Knowledge Base',\n path: '/support/kb',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'notifications',\n moduleLabel: 'Notifications',\n pageId: 'center',\n pageLabel: 'Notification Center',\n path: '/notifications/center',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'notifications',\n moduleLabel: 'Notifications',\n pageId: 'history',\n pageLabel: 'History',\n path: '/notifications/history',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'notifications',\n moduleLabel: 'Notifications',\n pageId: 'preferences',\n pageLabel: 'Preferences',\n path: '/notifications/preferences',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'home',\n pageLabel: 'All Conversations',\n path: '/conversations',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'list',\n pageLabel: 'Conversation List',\n path: '/conversations/list',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'new',\n pageLabel: 'New Conversation',\n path: '/conversations/new',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'settings',\n pageLabel: 'Settings',\n path: '/conversations/settings',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'auth',\n moduleLabel: 'Auth',\n pageId: 'home',\n pageLabel: 'Auth',\n path: '/auth/security',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'groups',\n moduleLabel: 'Groups and Teams',\n pageId: 'home',\n pageLabel: 'Groups and Teams',\n path: '/groups',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'tags',\n moduleLabel: 'Tags',\n pageId: 'home',\n pageLabel: 'Tags',\n path: '/tags',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'files',\n moduleLabel: 'Files',\n pageId: 'home',\n pageLabel: 'Files',\n path: '/files/browse',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'security',\n moduleLabel: 'Vault',\n pageId: 'home',\n pageLabel: 'Vault',\n path: '/security',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'integrations',\n moduleLabel: 'Integrations',\n pageId: 'home',\n pageLabel: 'Integrations',\n path: '/integrations',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'export',\n moduleLabel: 'Exports',\n pageId: 'home',\n pageLabel: 'Exports',\n path: '/export',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'organizations',\n moduleLabel: 'Organizations',\n pageId: 'home',\n pageLabel: 'Organizations',\n path: '/organizations',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'workspaces',\n moduleLabel: 'Workspaces',\n pageId: 'home',\n pageLabel: 'Workspaces',\n path: '/workspaces',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'billing',\n moduleLabel: 'Billing',\n pageId: 'home',\n pageLabel: 'Billing',\n path: '/billing/overview',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'store',\n moduleLabel: 'Marketplace',\n pageId: 'home',\n pageLabel: 'Marketplace',\n path: '/store/marketplace',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'channels',\n moduleLabel: 'Channels',\n pageId: 'home',\n pageLabel: 'Channels',\n path: '/channels',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'devportal',\n moduleLabel: 'Developer Portal',\n pageId: 'home',\n pageLabel: 'Developer Portal',\n path: '/devportal',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'feature-previews',\n moduleLabel: 'Feature Previews',\n pageId: 'home',\n pageLabel: 'Feature Previews',\n path: '/feature-previews',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'search',\n moduleLabel: 'Search',\n pageId: 'home',\n pageLabel: 'Search',\n path: '/search',\n isModuleHome: true,\n },\n] as const;\n\nfunction normalizeCatalogValue(value: string | null | undefined): string | undefined {\n const normalized = value?.trim();\n return normalized ? normalized : undefined;\n}\n\nfunction getRouteCatalog(productId: string | null | undefined): TourRouteCatalogEntry[] {\n const productKey = normalizeCatalogValue(productId);\n if (!productKey) return [];\n return TOUR_ROUTE_CATALOG.filter((entry) => entry.productId === productKey);\n}\n\nfunction getTourRouteModules(productId: string | null | undefined): TourRouteModuleOption[] {\n const modules = new Map<string, TourRouteModuleOption>();\n\n for (const entry of getRouteCatalog(productId)) {\n const existing = modules.get(entry.moduleId);\n if (!existing || entry.isModuleHome) {\n modules.set(entry.moduleId, {\n moduleId: entry.moduleId,\n label: entry.moduleLabel,\n path: entry.path,\n });\n }\n }\n\n return [...modules.values()];\n}\n\nfunction getTourRoutePages(\n productId: string | null | undefined,\n moduleId: string | null | undefined\n): TourRoutePageOption[] {\n const moduleKey = normalizeCatalogValue(moduleId);\n if (!moduleKey) return [];\n\n return getRouteCatalog(productId).flatMap((entry) =>\n entry.moduleId === moduleKey\n ? [{ pageId: entry.pageId, label: entry.pageLabel, path: entry.path }]\n : []\n );\n}\n\n/**\n * Tour builder page\n * Create or edit tour metadata\n */\nexport function TourBuilderPage() {\n const { tr } = useToursI18n();\n const { tourId } = useParams();\n const navigate = useNavigate();\n const toursContext = useToursContext();\n const { basePath = '/' } = toursContext;\n const eventBus = useEventBus();\n const globalClient = useGatewayClient('global');\n const { hasPermission, isLoading: permissionsLoading } = useToursPermissionAccess();\n const isNew = !tourId || tourId === 'new';\n const canCreate = hasPermission(TOUR_PERMISSIONS.TOUR_CREATE);\n const canUpdate = hasPermission(TOUR_PERMISSIONS.TOUR_UPDATE);\n const canCreateTemplate = hasPermission(TOUR_PERMISSIONS.TOUR_TEMPLATE_CREATE);\n const canSave = isNew ? canCreate : canUpdate;\n const canSeedVibeControlsUserTours = canCreate && canUpdate;\n\n const { tour, loadTour, createTour, updateTour, saving, validationErrors, error } =\n useTourBuilder(tourId);\n const { saveAsTemplate } = useTourLifecycle();\n const { data: productsData, loading: productsLoading } = useGetPlatformProductsForToursQuery({\n variables: { limit: PLATFORM_PRODUCTS_QUERY_LIMIT, offset: 0 },\n fetchPolicy: 'cache-and-network',\n skip: permissionsLoading || !canSave,\n });\n\n const defaultFormData = {\n name: '',\n description: '',\n productId: '',\n moduleId: '',\n pageId: '',\n isActive: true,\n status: 'DRAFT' as const,\n triggerType: 'MANUAL' as const,\n priority: 50,\n displayOrder: 1,\n startDate: '',\n endDate: '',\n };\n\n const [formData, setFormData] = useState<Partial<Tour>>(defaultFormData);\n const [customProductEntry, setCustomProductEntry] = useState(false);\n const [customModuleEntry, setCustomModuleEntry] = useState(false);\n const [customPageEntry, setCustomPageEntry] = useState(false);\n const [seedLoading, setSeedLoading] = useState(false);\n const [seedResult, setSeedResult] = useState<SeedVibeControlsUserToursPayload | null>(null);\n const [seedError, setSeedError] = useState<string | null>(null);\n\n const formInitializedRef = useRef(false);\n\n const productOptions = useMemo(() => {\n return [...(productsData?.platformProducts.items ?? [])].sort((a, b) =>\n a.name.localeCompare(b.name)\n );\n }, [productsData]);\n\n const productOptionSlugs = useMemo(\n () => new Set(productOptions.map((product) => product.slug)),\n [productOptions]\n );\n\n const moduleOptions = useMemo(\n () => getTourRouteModules(formData.productId),\n [formData.productId]\n );\n\n const moduleOptionIds = useMemo(\n () => new Set(moduleOptions.map((moduleOption) => moduleOption.moduleId)),\n [moduleOptions]\n );\n\n const pageOptions = useMemo(\n () => getTourRoutePages(formData.productId, formData.moduleId),\n [formData.moduleId, formData.productId]\n );\n\n const pageOptionIds = useMemo(\n () => new Set(pageOptions.map((pageOption) => pageOption.pageId)),\n [pageOptions]\n );\n\n useEffect(() => {\n if (formInitializedRef.current) return;\n if (!permissionsLoading && canSave && tourId && tourId !== 'new') {\n loadTour(tourId);\n }\n }, [canSave, loadTour, permissionsLoading, tourId]);\n\n useEffect(() => {\n if (tour && !formInitializedRef.current) {\n setFormData(tour);\n formInitializedRef.current = true;\n }\n }, [tour]);\n\n useEffect(() => {\n if (!formData.productId || productsLoading) {\n setCustomProductEntry(false);\n return;\n }\n setCustomProductEntry(productOptions.length > 0 && !productOptionSlugs.has(formData.productId));\n }, [formData.productId, productOptionSlugs, productOptions.length, productsLoading]);\n\n useEffect(() => {\n if (!formData.productId || !formData.moduleId) {\n setCustomModuleEntry(false);\n return;\n }\n setCustomModuleEntry(moduleOptions.length === 0 || !moduleOptionIds.has(formData.moduleId));\n }, [formData.moduleId, formData.productId, moduleOptionIds, moduleOptions.length]);\n\n useEffect(() => {\n if (!formData.productId || !formData.pageId) {\n setCustomPageEntry(false);\n return;\n }\n setCustomPageEntry(pageOptions.length === 0 || !pageOptionIds.has(formData.pageId));\n }, [formData.pageId, formData.productId, pageOptionIds, pageOptions.length]);\n\n const showCurrentProductOption = Boolean(\n formData.productId && !customProductEntry && !productOptionSlugs.has(formData.productId)\n );\n const showCurrentModuleOption = Boolean(\n formData.moduleId && !customModuleEntry && !moduleOptionIds.has(formData.moduleId)\n );\n const showCurrentPageOption = Boolean(\n formData.pageId && !customPageEntry && !pageOptionIds.has(formData.pageId)\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n try {\n if (tourId && tourId !== 'new') {\n await updateTour(tourId, formData);\n } else {\n await createTour(formData);\n }\n } catch {\n emitToursApiFailed(eventBus, 'tour.save', toursContext);\n }\n };\n\n const handleBack = () => {\n navigate(`${basePath}/list`);\n };\n\n const formatDateTimeLocal = (value?: string) => {\n if (!value) return '';\n\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n\n return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, 16);\n };\n\n const handleSaveTemplate = async () => {\n if (!tourId || tourId === 'new') return;\n\n const defaultName = `${formData.name || tour?.name || 'Tour'} Template`;\n const name = window.prompt('Template name', defaultName);\n if (!name) return;\n\n const category =\n window.prompt(\n 'Template category (ONBOARDING, FEATURE_ANNOUNCEMENT, HELP, CUSTOM)',\n 'ONBOARDING'\n ) || 'ONBOARDING';\n\n try {\n await saveAsTemplate(tourId, {\n name,\n description: formData.description,\n category,\n isPublic: false,\n });\n navigate(`${basePath}/templates`);\n } catch {\n emitToursApiFailed(eventBus, 'template.save', toursContext);\n }\n };\n\n const handleSeedVibeControlsUserTours = async () => {\n const confirmed = window.confirm(tr('tourBuilder.seedVibeControls.confirm'));\n if (!confirmed) return;\n\n setSeedLoading(true);\n setSeedResult(null);\n setSeedError(null);\n\n try {\n const result = await globalClient.mutate<SeedVibeControlsUserToursMutation>({\n mutation: SEED_VIBECONTROLS_USER_TOURS,\n });\n\n const mutationErrorMessage = getMutationErrorMessage(result);\n if (mutationErrorMessage) {\n throw new Error(mutationErrorMessage);\n }\n\n const payload = result.data?.seedVibeControlsUserTours;\n if (!payload) {\n throw new Error('Seed mutation returned no result.');\n }\n\n setSeedResult(payload);\n } catch (seedMutationError) {\n const errorMessage =\n seedMutationError instanceof Error\n ? seedMutationError.message\n : tr('tourBuilder.seedVibeControls.error');\n setSeedError(errorMessage);\n eventBus.emit(\n 'tours.api.failed',\n {\n route: '/tours',\n operation: 'tour.seed_vibecontrols_user_tours',\n errorMessage,\n productId: toursContext.productId,\n workspaceId: toursContext.workspaceId,\n },\n { component: 'microfe-tours' }\n );\n } finally {\n setSeedLoading(false);\n }\n };\n\n const secondaryActions: CTAAction[] =\n tourId && tourId !== 'new'\n ? [\n {\n label:\n tour?.steps && tour.steps.length > 0\n ? `${tr('tourBuilder.editSteps')} (${tour.steps.length})`\n : tr('tourBuilder.editSteps'),\n onSelect: () => navigate(`${basePath}/${tourId}/steps`),\n icon: <ListOrdered size={16} />,\n },\n {\n label: tr('tourBuilder.preview'),\n onSelect: () => navigate(`${basePath}/${tourId}/preview`),\n icon: <Eye size={16} />,\n },\n {\n label: tr('tourBuilder.analytics'),\n onSelect: () => navigate(`${basePath}/${tourId}/analytics`),\n icon: <BarChart3 size={16} />,\n },\n {\n label: 'Schedule',\n onSelect: () => navigate(`${basePath}/${tourId}/schedule`),\n icon: <Calendar size={16} />,\n },\n ...(canCreateTemplate\n ? [\n {\n label: 'Save as Template',\n onSelect: () => void handleSaveTemplate(),\n icon: <LayoutTemplate size={16} />,\n } satisfies CTAAction,\n ]\n : []),\n ]\n : [];\n\n if (permissionsLoading) {\n return (\n <div className=\"flex h-full items-center justify-center p-3 sm:p-6\">\n <p className=\"text-sm text-text-secondary\">{tr('tourBuilder.loading')}</p>\n </div>\n );\n }\n\n if (!canSave) {\n return (\n <div className=\"flex h-full items-center justify-center p-3 sm:p-6\">\n <div className=\"text-center space-y-4\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary mb-2\">\n {tr('tourBuilder.accessDeniedTitle')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {isNew\n ? tr('tourBuilder.createAccessDeniedMessage')\n : tr('tourBuilder.updateAccessDeniedMessage')}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"inline-flex items-center justify-center rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent\"\n >\n {tr('tourBuilder.goBack')}\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6 max-w-4xl mx-auto\">\n {/* Header */}\n <div className=\"flex items-center gap-4\">\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"p-2 hover:bg-accent rounded-md\"\n aria-label={tr('tourBuilder.goBack')}\n >\n <ArrowLeft size={20} />\n </button>\n <div className=\"flex-1\">\n <h1 className=\"text-xl sm:text-2xl font-bold text-text-primary\">\n {tourId && tourId !== 'new'\n ? tr('tourBuilder.titleEdit')\n : tr('tourBuilder.titleCreate')}\n </h1>\n <p className=\"text-sm text-text-secondary\">{tr('tourBuilder.subtitle')}</p>\n </div>\n </div>\n\n {isNew ? (\n <EmphasisPanel className=\"p-4 sm:p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"space-y-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr('tourBuilder.seedVibeControls.title')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {tr('tourBuilder.seedVibeControls.description')}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => void handleSeedVibeControlsUserTours()}\n disabled={seedLoading || !canSeedVibeControlsUserTours}\n className=\"inline-flex min-h-11 items-center justify-center gap-2 rounded-md border border-border-subtle bg-secondary px-4 py-2 text-sm font-medium text-secondary-foreground hover:bg-secondary/80 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <Sparkles size={18} />\n {seedLoading\n ? tr('tourBuilder.seedVibeControls.loading')\n : tr('tourBuilder.seedVibeControls.button')}\n </button>\n </div>\n {!canSeedVibeControlsUserTours ? (\n <p className=\"mt-3 text-sm text-text-secondary\">\n {tr('tourBuilder.seedVibeControls.permissionHint')}\n </p>\n ) : null}\n {seedError ? <p className=\"mt-3 text-sm text-status-error-text\">{seedError}</p> : null}\n {seedResult ? (\n <div className=\"mt-3 rounded-md border border-border-seam bg-bg-surface p-3 text-sm text-text-secondary\">\n {tr('tourBuilder.seedVibeControls.result', {\n totalCount: seedResult.totalCount,\n productId: seedResult.productId,\n workspaceId: seedResult.workspaceId,\n createdCount: seedResult.createdCount,\n updatedCount: seedResult.updatedCount,\n })}\n </div>\n ) : null}\n </EmphasisPanel>\n ) : null}\n\n {/* Form */}\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n {/* Basic Info */}\n <GlassCard treatment=\"plain\" className=\"p-4 sm:p-6 border-border-seam\">\n <h2 className=\"text-lg font-semibold mb-4\">{tr('tourBuilder.sectionBasicInfo')}</h2>\n\n <div className=\"space-y-4\">\n {/* Name */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-name\">\n {tr('tourBuilder.labelName')}\n </label>\n <input\n id=\"tour-name\"\n type=\"text\"\n value={formData.name || ''}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n required\n aria-label={tr('tourBuilder.labelName')}\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-description\">\n {tr('tourBuilder.labelDescription')}\n </label>\n <textarea\n id=\"tour-description\"\n value={formData.description || ''}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label={tr('tourBuilder.labelDescription')}\n />\n </div>\n\n {/* Product ID */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"product-id\">\n {tr('tourBuilder.labelProductId')}\n </label>\n <select\n id=\"product-id\"\n value={customProductEntry ? '__custom__' : formData.productId || ''}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setCustomProductEntry(true);\n setFormData({\n ...formData,\n productId: '',\n moduleId: undefined,\n pageId: undefined,\n });\n return;\n }\n\n setCustomProductEntry(false);\n setCustomModuleEntry(false);\n setCustomPageEntry(false);\n setFormData({\n ...formData,\n productId: e.target.value,\n moduleId: undefined,\n pageId: undefined,\n });\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n required\n aria-label={tr('tourBuilder.labelProductId')}\n >\n <option value=\"\">Select product</option>\n {productsLoading ? <option disabled>Loading products…</option> : null}\n {productOptions.map((product) => (\n <option key={product.id} value={product.slug}>\n {product.name} ({product.slug})\n </option>\n ))}\n {showCurrentProductOption ? (\n <option value={formData.productId}>Current: {formData.productId}</option>\n ) : null}\n <option value=\"__custom__\">Custom product slug</option>\n </select>\n {customProductEntry ? (\n <input\n id=\"product-id-custom\"\n aria-label=\"Custom product slug\"\n type=\"text\"\n value={formData.productId || ''}\n onChange={(e) =>\n setFormData({\n ...formData,\n productId: e.target.value,\n moduleId: undefined,\n pageId: undefined,\n })\n }\n className=\"mt-2 w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n placeholder=\"vibecontrols\"\n required\n />\n ) : null}\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"module-id\">\n Module ID\n </label>\n <select\n id=\"module-id\"\n value={customModuleEntry ? '__custom__' : formData.moduleId || ''}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setCustomModuleEntry(true);\n setFormData({ ...formData, moduleId: '', pageId: undefined });\n return;\n }\n\n setCustomModuleEntry(false);\n setCustomPageEntry(false);\n setFormData({\n ...formData,\n moduleId: e.target.value || undefined,\n pageId: undefined,\n });\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n disabled={!formData.productId}\n aria-label=\"Module ID\"\n >\n <option value=\"\">All modules</option>\n {moduleOptions.map((moduleOption) => (\n <option key={moduleOption.moduleId} value={moduleOption.moduleId}>\n {moduleOption.label} ({moduleOption.moduleId})\n </option>\n ))}\n {showCurrentModuleOption ? (\n <option value={formData.moduleId}>Current: {formData.moduleId}</option>\n ) : null}\n <option value=\"__custom__\">Custom module ID</option>\n </select>\n {customModuleEntry ? (\n <input\n id=\"module-id-custom\"\n aria-label=\"Custom module ID\"\n type=\"text\"\n value={formData.moduleId || ''}\n onChange={(e) =>\n setFormData({\n ...formData,\n moduleId: e.target.value || undefined,\n pageId: undefined,\n })\n }\n className=\"mt-2 w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n placeholder=\"vibecontrols\"\n />\n ) : null}\n </div>\n\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"page-id\">\n Page ID\n </label>\n <select\n id=\"page-id\"\n value={customPageEntry ? '__custom__' : formData.pageId || ''}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setCustomPageEntry(true);\n setFormData({ ...formData, pageId: '' });\n return;\n }\n\n setCustomPageEntry(false);\n setFormData({ ...formData, pageId: e.target.value || undefined });\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n disabled={!formData.productId}\n aria-label=\"Page ID\"\n >\n <option value=\"\">All pages</option>\n {pageOptions.map((pageOption) => (\n <option key={pageOption.pageId} value={pageOption.pageId}>\n {pageOption.label} ({pageOption.pageId})\n </option>\n ))}\n {showCurrentPageOption ? (\n <option value={formData.pageId}>Current: {formData.pageId}</option>\n ) : null}\n <option value=\"__custom__\">Custom page ID</option>\n </select>\n {customPageEntry ? (\n <input\n id=\"page-id-custom\"\n aria-label=\"Custom page ID\"\n type=\"text\"\n value={formData.pageId || ''}\n onChange={(e) =>\n setFormData({ ...formData, pageId: e.target.value || undefined })\n }\n className=\"mt-2 w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n placeholder=\"agents\"\n />\n ) : null}\n </div>\n </div>\n\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={formData.isActive ?? true}\n onChange={(e) => setFormData({ ...formData, isActive: e.target.checked })}\n className=\"size-4 rounded\"\n aria-label=\"Active\"\n />\n <span className=\"text-sm font-medium\">Active</span>\n </label>\n </div>\n </GlassCard>\n\n {/* Trigger Settings */}\n <GlassCard treatment=\"plain\" className=\"p-4 sm:p-6 border-border-seam\">\n <h2 className=\"text-lg font-semibold mb-4\">{tr('tourBuilder.sectionTriggerSettings')}</h2>\n\n <div className=\"space-y-4\">\n {/* Trigger Type */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"trigger-type\">\n {tr('tourBuilder.labelTriggerType')}\n </label>\n <select\n id=\"trigger-type\"\n value={formData.triggerType || 'MANUAL'}\n onChange={(e) =>\n setFormData({ ...formData, triggerType: e.target.value as TourTriggerType })\n }\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label={tr('tourBuilder.labelTriggerType')}\n >\n <option value=\"MANUAL\">{tr('tourBuilder.triggerManual')}</option>\n <option value=\"AUTO_FIRST_VISIT\">{tr('tourBuilder.triggerAutoFirstVisit')}</option>\n <option value=\"AUTO_ALWAYS\">{tr('tourBuilder.triggerAutoAlways')}</option>\n <option value=\"ON_EVENT\">{tr('tourBuilder.triggerOnEvent')}</option>\n <option value=\"SCHEDULED\">{tr('tourBuilder.triggerScheduled')}</option>\n </select>\n </div>\n\n {/* Priority */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"priority\">\n {tr('tourBuilder.labelPriority')}\n </label>\n <input\n id=\"priority\"\n type=\"number\"\n min=\"1\"\n max=\"100\"\n value={formData.priority || 50}\n onChange={(e) => {\n const priority = Number.parseInt(e.target.value, 10) || 50;\n setFormData({ ...formData, priority });\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label={tr('tourBuilder.labelPriority')}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-start-date\">\n Start Date\n </label>\n <input\n id=\"tour-start-date\"\n type=\"datetime-local\"\n value={formatDateTimeLocal(formData.startDate)}\n onChange={(e) =>\n setFormData({\n ...formData,\n startDate: e.target.value\n ? new Date(e.target.value).toISOString()\n : undefined,\n })\n }\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label=\"Start Date\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-end-date\">\n End Date\n </label>\n <input\n id=\"tour-end-date\"\n type=\"datetime-local\"\n value={formatDateTimeLocal(formData.endDate)}\n onChange={(e) =>\n setFormData({\n ...formData,\n endDate: e.target.value ? new Date(e.target.value).toISOString() : undefined,\n })\n }\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label=\"End Date\"\n />\n </div>\n </div>\n </div>\n </GlassCard>\n\n {/* API Error */}\n {error && (\n <div className=\"border border-status-error-border rounded-md p-4 bg-status-error-bg/10\">\n <h3 className=\"font-semibold text-status-error-text mb-2\">{tr('tourBuilder.errorTitle')}</h3>\n <p className=\"text-sm text-status-error-text\">{error.message}</p>\n </div>\n )}\n\n {/* Validation Errors */}\n {validationErrors.length > 0 && (\n <div className=\"border border-status-error-border rounded-md p-4 bg-status-error-bg/10\">\n <h3 className=\"font-semibold text-status-error-text mb-2\">\n {tr('tourBuilder.validationErrorsTitle')}\n </h3>\n <ul className=\"list-disc list-inside space-y-1\">\n {validationErrors.map((err) => (\n <li key={err.message} className=\"text-sm text-status-error-text\">\n {err.message}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {/* Actions — one primary submit CTA, related navigation collapsed into the overflow menu */}\n <div className=\"flex flex-wrap items-center gap-3\">\n <PermissionGate\n permission={isNew ? TOUR_PERMISSIONS.TOUR_CREATE : TOUR_PERMISSIONS.TOUR_UPDATE}\n >\n <Button\n type=\"submit\"\n disabled={saving || !canSave}\n className=\"flex-1 min-w-[200px] min-h-[44px]\"\n >\n <Save size={20} />\n {saving\n ? tr('tourBuilder.saving')\n : tourId && tourId !== 'new'\n ? tr('tourBuilder.updateTour')\n : tr('tourBuilder.createAndAddSteps')}\n </Button>\n </PermissionGate>\n {tourId && tourId !== 'new' && secondaryActions.length > 0 && (\n <CTAOverflowMenu actions={secondaryActions} />\n )}\n </div>\n </form>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkCA,IAAM,KAAgC,KAEhC,KAA+B,CAAG;;;;;;;;;;;;;;;;;;AAwCxC,SAAS,GAAwB,GAAgC;AAC/D,KAAI,CAAC,KAAU,OAAO,KAAW,SAAU,QAAO;CAElD,IAAM,IAAS,GACT,IAAc,EAAO;AAC3B,KAAI,aAAuB,MAAO,QAAO,EAAY;CAErD,IAAM,IAAS,EAAO;AACtB,KAAI,CAAC,MAAM,QAAQ,EAAO,IAAI,EAAO,WAAW,EAAG,QAAO;CAE1D,IAAM,IAAW,EACd,KAAK,MAAU;AACd,MAAI,aAAiB,MAAO,QAAO,EAAM;AACzC,MAAI,CAAC,KAAS,OAAO,KAAU,SAAU,QAAO;EAEhD,IAAM,IAAW,EAAgC;AACjD,SAAO,OAAO,KAAY,WAAW,IAAU;GAC/C,CACD,QAAQ,MAA+B,EAAQ,EAAS;AAE3D,QAAO,EAAS,SAAS,IAAI,EAAS,KAAK,KAAK,GAAG;;AAyBrD,IAAM,IAAuD;CAC3D;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CA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"}
|
|
@@ -9,40 +9,41 @@ import { useEffect as s } from "react";
|
|
|
9
9
|
import { AlertCircle as c, ArrowLeft as l, CheckCircle as u, ChevronLeft as d, ChevronRight as f, Monitor as p, Smartphone as m, Tablet as h, X as g } from "lucide-react";
|
|
10
10
|
import { jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
11
11
|
import { useNavigate as y, useParams as b } from "react-router-dom";
|
|
12
|
+
import { Button as x, GlassCard as S } from "@burdenoff/fe-libs/ui";
|
|
12
13
|
//#region src/tours/pages/TourPreviewPage.tsx
|
|
13
|
-
function
|
|
14
|
-
let { tr:
|
|
14
|
+
function C() {
|
|
15
|
+
let { tr: C } = i(), { tourId: w } = b(), T = y(), { basePath: E = "/" } = e(), { hasPermission: D } = n(), O = D(r.TOUR_READ), { tour: k, loadTour: A } = a(w), { devicePreview: j } = t(), { isPreviewActive: M, currentStepIndex: N, currentStep: P, totalSteps: F, canGoNext: I, canGoPrevious: L, validationResults: R, startPreview: z, stopPreview: B, nextStep: V, previousStep: H, changeDevice: U, validateForPreview: W } = o(k || void 0);
|
|
15
16
|
if (s(() => {
|
|
16
|
-
|
|
17
|
-
}, [
|
|
18
|
-
|
|
17
|
+
w && A(w);
|
|
18
|
+
}, [w, A]), s(() => {
|
|
19
|
+
k && W();
|
|
19
20
|
}, [
|
|
20
|
-
D,
|
|
21
21
|
k,
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
j,
|
|
23
|
+
W
|
|
24
|
+
]), !O) return /* @__PURE__ */ _("div", {
|
|
24
25
|
className: "flex items-center justify-center h-screen bg-bg-sunken",
|
|
25
26
|
children: /* @__PURE__ */ v("div", {
|
|
26
27
|
className: "text-center",
|
|
27
28
|
children: [/* @__PURE__ */ _("h2", {
|
|
28
29
|
className: "text-lg font-semibold text-text-primary mb-2",
|
|
29
|
-
children:
|
|
30
|
+
children: C("tourPreview.accessDeniedTitle")
|
|
30
31
|
}), /* @__PURE__ */ _("p", {
|
|
31
32
|
className: "text-sm text-text-secondary",
|
|
32
|
-
children:
|
|
33
|
+
children: C("tourPreview.accessDeniedMessage")
|
|
33
34
|
})]
|
|
34
35
|
})
|
|
35
36
|
});
|
|
36
|
-
if (!
|
|
37
|
+
if (!k) return /* @__PURE__ */ _("div", {
|
|
37
38
|
className: "flex items-center justify-center h-screen bg-bg-sunken",
|
|
38
39
|
children: /* @__PURE__ */ _("p", {
|
|
39
40
|
className: "text-text-secondary",
|
|
40
|
-
children:
|
|
41
|
+
children: C("tourPreview.loading")
|
|
41
42
|
})
|
|
42
43
|
});
|
|
43
|
-
let
|
|
44
|
-
|
|
45
|
-
},
|
|
44
|
+
let G = () => {
|
|
45
|
+
T(`${E}/${w}/edit`);
|
|
46
|
+
}, K = {
|
|
46
47
|
mobile: /* @__PURE__ */ _(m, { size: 20 }),
|
|
47
48
|
tablet: /* @__PURE__ */ _(h, { size: 20 }),
|
|
48
49
|
desktop: /* @__PURE__ */ _(p, { size: 20 })
|
|
@@ -55,9 +56,9 @@ function x() {
|
|
|
55
56
|
children: [
|
|
56
57
|
/* @__PURE__ */ _("button", {
|
|
57
58
|
type: "button",
|
|
58
|
-
onClick:
|
|
59
|
+
onClick: G,
|
|
59
60
|
className: "p-2 min-h-[44px] min-w-[44px] hover:bg-accent rounded-md",
|
|
60
|
-
"aria-label":
|
|
61
|
+
"aria-label": C("tourBuilder.goBack"),
|
|
61
62
|
children: /* @__PURE__ */ _(l, { size: 20 })
|
|
62
63
|
}),
|
|
63
64
|
/* @__PURE__ */ v("div", {
|
|
@@ -65,20 +66,20 @@ function x() {
|
|
|
65
66
|
children: [/* @__PURE__ */ v("h1", {
|
|
66
67
|
className: "text-base sm:text-lg font-semibold truncate",
|
|
67
68
|
children: [
|
|
68
|
-
|
|
69
|
+
k?.name,
|
|
69
70
|
" - ",
|
|
70
|
-
|
|
71
|
+
C("tourPreview.previewSuffix")
|
|
71
72
|
]
|
|
72
|
-
}),
|
|
73
|
+
}), M && /* @__PURE__ */ v("p", {
|
|
73
74
|
className: "text-sm text-text-secondary",
|
|
74
75
|
children: [
|
|
75
|
-
|
|
76
|
+
C("tourPreview.stepOf"),
|
|
76
77
|
" ",
|
|
77
|
-
|
|
78
|
+
N + 1,
|
|
78
79
|
" ",
|
|
79
|
-
|
|
80
|
+
C("tourPreview.stepOfConnector"),
|
|
80
81
|
" ",
|
|
81
|
-
|
|
82
|
+
F
|
|
82
83
|
]
|
|
83
84
|
})]
|
|
84
85
|
}),
|
|
@@ -90,28 +91,29 @@ function x() {
|
|
|
90
91
|
"desktop"
|
|
91
92
|
].map((e) => /* @__PURE__ */ _("button", {
|
|
92
93
|
type: "button",
|
|
93
|
-
onClick: () =>
|
|
94
|
-
className: `px-3 py-2 min-h-[44px] min-w-[44px] ${
|
|
95
|
-
title:
|
|
96
|
-
"aria-label":
|
|
97
|
-
children:
|
|
94
|
+
onClick: () => U(e),
|
|
95
|
+
className: `px-3 py-2 min-h-[44px] min-w-[44px] ${j === e ? "bg-action-primary-bg text-action-primary-text" : "bg-bg-surface hover:bg-accent"}`,
|
|
96
|
+
title: C(e === "mobile" ? "tourPreview.deviceMobile" : e === "tablet" ? "tourPreview.deviceTablet" : "tourPreview.deviceDesktop"),
|
|
97
|
+
"aria-label": C(e === "mobile" ? "tourPreview.deviceMobile" : e === "tablet" ? "tourPreview.deviceTablet" : "tourPreview.deviceDesktop"),
|
|
98
|
+
children: K[e]
|
|
98
99
|
}, e))
|
|
99
100
|
}),
|
|
100
|
-
|
|
101
|
+
M ? /* @__PURE__ */ v(x, {
|
|
101
102
|
type: "button",
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
variant: "outline",
|
|
104
|
+
onClick: B,
|
|
105
|
+
className: "min-h-[44px]",
|
|
106
|
+
children: [/* @__PURE__ */ _(g, { size: 20 }), C("tourPreview.stopPreview")]
|
|
107
|
+
}) : /* @__PURE__ */ _(x, {
|
|
106
108
|
type: "button",
|
|
107
|
-
onClick:
|
|
108
|
-
disabled: !
|
|
109
|
-
className: "
|
|
110
|
-
children:
|
|
109
|
+
onClick: z,
|
|
110
|
+
disabled: !R?.valid,
|
|
111
|
+
className: "min-h-[44px]",
|
|
112
|
+
children: C("tourPreview.startPreview")
|
|
111
113
|
})
|
|
112
114
|
]
|
|
113
115
|
}),
|
|
114
|
-
|
|
116
|
+
R && !R.valid && /* @__PURE__ */ _("div", {
|
|
115
117
|
className: "bg-status-error-bg/10 border-b border-status-error-border px-3 sm:px-6 py-3",
|
|
116
118
|
children: /* @__PURE__ */ v("div", {
|
|
117
119
|
className: "flex items-start gap-3",
|
|
@@ -122,10 +124,10 @@ function x() {
|
|
|
122
124
|
className: "flex-1",
|
|
123
125
|
children: [/* @__PURE__ */ _("h3", {
|
|
124
126
|
className: "font-semibold text-status-error-text mb-1",
|
|
125
|
-
children:
|
|
127
|
+
children: C("tourPreview.validationErrorsTitle")
|
|
126
128
|
}), /* @__PURE__ */ _("ul", {
|
|
127
129
|
className: "list-disc list-inside space-y-1",
|
|
128
|
-
children:
|
|
130
|
+
children: R.errors.map((e) => /* @__PURE__ */ _("li", {
|
|
129
131
|
className: "text-sm text-status-error-text",
|
|
130
132
|
children: e
|
|
131
133
|
}, e))
|
|
@@ -133,7 +135,7 @@ function x() {
|
|
|
133
135
|
})]
|
|
134
136
|
})
|
|
135
137
|
}),
|
|
136
|
-
|
|
138
|
+
R && R.warnings.length > 0 && /* @__PURE__ */ _("div", {
|
|
137
139
|
className: "bg-warning/10 border-b border-warning px-3 sm:px-6 py-3",
|
|
138
140
|
children: /* @__PURE__ */ v("div", {
|
|
139
141
|
className: "flex items-start gap-3",
|
|
@@ -144,10 +146,10 @@ function x() {
|
|
|
144
146
|
className: "flex-1",
|
|
145
147
|
children: [/* @__PURE__ */ _("h3", {
|
|
146
148
|
className: "font-semibold text-warning mb-1",
|
|
147
|
-
children:
|
|
149
|
+
children: C("tourPreview.warningsTitle")
|
|
148
150
|
}), /* @__PURE__ */ _("ul", {
|
|
149
151
|
className: "list-disc list-inside space-y-1",
|
|
150
|
-
children:
|
|
152
|
+
children: R.warnings.map((e) => /* @__PURE__ */ _("li", {
|
|
151
153
|
className: "text-sm text-warning",
|
|
152
154
|
children: e
|
|
153
155
|
}, e))
|
|
@@ -158,35 +160,36 @@ function x() {
|
|
|
158
160
|
/* @__PURE__ */ _("div", {
|
|
159
161
|
className: "flex-1 flex items-center justify-center p-3 sm:p-6 overflow-auto",
|
|
160
162
|
children: /* @__PURE__ */ _("div", {
|
|
161
|
-
className: `bg-bg-surface border-2 rounded-lg shadow-xl overflow-hidden ${
|
|
162
|
-
children:
|
|
163
|
+
className: `bg-bg-surface border-2 rounded-lg shadow-xl overflow-hidden ${j === "mobile" ? "w-[min(375px,calc(100vw-1.5rem))] h-[667px] max-h-full" : j === "tablet" ? "w-[min(768px,calc(100vw-1.5rem))] h-[1024px] max-h-full" : "w-full max-w-[1920px] h-full max-h-[1080px]"}`,
|
|
164
|
+
children: M && P ? /* @__PURE__ */ _("div", {
|
|
163
165
|
className: "h-full flex flex-col items-center justify-center p-4 sm:p-8",
|
|
164
|
-
children: /* @__PURE__ */ v(
|
|
165
|
-
|
|
166
|
+
children: /* @__PURE__ */ v(S, {
|
|
167
|
+
treatment: "glass",
|
|
168
|
+
className: "max-w-md border-border-seam p-4 sm:p-6 shadow-[var(--shadow-pop)]",
|
|
166
169
|
children: [
|
|
167
170
|
/* @__PURE__ */ _("h3", {
|
|
168
171
|
className: "text-lg font-semibold mb-3",
|
|
169
|
-
children:
|
|
172
|
+
children: P.title
|
|
170
173
|
}),
|
|
171
174
|
/* @__PURE__ */ _("p", {
|
|
172
175
|
className: "text-sm text-text-secondary mb-4 whitespace-pre-wrap",
|
|
173
|
-
children:
|
|
176
|
+
children: P.content
|
|
174
177
|
}),
|
|
175
178
|
/* @__PURE__ */ v("div", {
|
|
176
179
|
className: "flex gap-2",
|
|
177
180
|
children: [/* @__PURE__ */ _("button", {
|
|
178
181
|
type: "button",
|
|
179
|
-
onClick:
|
|
180
|
-
disabled: !
|
|
182
|
+
onClick: H,
|
|
183
|
+
disabled: !L,
|
|
181
184
|
className: "px-3 py-2 min-h-[44px] min-w-[44px] border border-border-subtle rounded-md hover:bg-accent disabled:opacity-50 disabled:cursor-not-allowed",
|
|
182
|
-
"aria-label":
|
|
185
|
+
"aria-label": C("tourPreview.previous"),
|
|
183
186
|
children: /* @__PURE__ */ _(d, { size: 16 })
|
|
184
187
|
}), /* @__PURE__ */ _("button", {
|
|
185
188
|
type: "button",
|
|
186
|
-
onClick:
|
|
187
|
-
disabled: !
|
|
189
|
+
onClick: V,
|
|
190
|
+
disabled: !I,
|
|
188
191
|
className: "flex-1 px-3 py-2 min-h-[44px] bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg/90 disabled:opacity-50 disabled:cursor-not-allowed",
|
|
189
|
-
children:
|
|
192
|
+
children: C(I ? "tourPreview.next" : "tourPreview.finish")
|
|
190
193
|
})]
|
|
191
194
|
})
|
|
192
195
|
]
|
|
@@ -202,41 +205,41 @@ function x() {
|
|
|
202
205
|
}),
|
|
203
206
|
/* @__PURE__ */ _("p", {
|
|
204
207
|
className: "mb-2",
|
|
205
|
-
children:
|
|
208
|
+
children: C("tourPreview.readyTitle")
|
|
206
209
|
}),
|
|
207
210
|
/* @__PURE__ */ _("p", {
|
|
208
211
|
className: "text-sm",
|
|
209
|
-
children:
|
|
212
|
+
children: C("tourPreview.readyHint")
|
|
210
213
|
})
|
|
211
214
|
]
|
|
212
215
|
})
|
|
213
216
|
})
|
|
214
217
|
})
|
|
215
218
|
}),
|
|
216
|
-
|
|
219
|
+
M && /* @__PURE__ */ v("div", {
|
|
217
220
|
className: "border-t border-border-subtle bg-bg-surface p-3 sm:p-4 flex items-center justify-center gap-3 sm:gap-4",
|
|
218
221
|
children: [
|
|
219
222
|
/* @__PURE__ */ v("button", {
|
|
220
223
|
type: "button",
|
|
221
|
-
onClick:
|
|
222
|
-
disabled: !
|
|
224
|
+
onClick: H,
|
|
225
|
+
disabled: !L,
|
|
223
226
|
className: "px-4 py-2 min-h-[44px] border border-border-subtle rounded-md hover:bg-accent disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2",
|
|
224
|
-
children: [/* @__PURE__ */ _(d, { size: 20 }),
|
|
227
|
+
children: [/* @__PURE__ */ _(d, { size: 20 }), C("tourPreview.previous")]
|
|
225
228
|
}),
|
|
226
229
|
/* @__PURE__ */ v("div", {
|
|
227
230
|
className: "text-sm text-text-secondary",
|
|
228
231
|
children: [
|
|
229
|
-
|
|
232
|
+
N + 1,
|
|
230
233
|
" / ",
|
|
231
|
-
|
|
234
|
+
F
|
|
232
235
|
]
|
|
233
236
|
}),
|
|
234
237
|
/* @__PURE__ */ v("button", {
|
|
235
238
|
type: "button",
|
|
236
|
-
onClick:
|
|
237
|
-
disabled: !
|
|
239
|
+
onClick: V,
|
|
240
|
+
disabled: !I,
|
|
238
241
|
className: "px-4 py-2 min-h-[44px] border border-border-subtle rounded-md hover:bg-accent disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2",
|
|
239
|
-
children: [
|
|
242
|
+
children: [C("tourPreview.nextFooter"), /* @__PURE__ */ _(f, { size: 20 })]
|
|
240
243
|
})
|
|
241
244
|
]
|
|
242
245
|
})
|
|
@@ -244,6 +247,6 @@ function x() {
|
|
|
244
247
|
});
|
|
245
248
|
}
|
|
246
249
|
//#endregion
|
|
247
|
-
export {
|
|
250
|
+
export { C as TourPreviewPage };
|
|
248
251
|
|
|
249
252
|
//# sourceMappingURL=TourPreviewPage.js.map
|