diff --git a/apps/web/src/pages/AdminHomePage.stories.js b/apps/web/src/pages/AdminHomePage.stories.js index 11b72a1..4a0dff9 100644 --- a/apps/web/src/pages/AdminHomePage.stories.js +++ b/apps/web/src/pages/AdminHomePage.stories.js @@ -2,3 +2,13 @@ import AdminHomePage from './AdminHomePage.vue'; export default { title: 'Pages/AdminHomePage', component: AdminHomePage }; export const Overview = {}; + +export const ProviderMappingWorkflow = { + parameters: { + docs: { + description: { + story: 'The admin workspace includes Product-level provider mapping controls alongside inventory, acquisition, pricing, listing, and sales workflows.', + }, + }, + }, +}; diff --git a/apps/web/src/pages/AdminHomePage.vue b/apps/web/src/pages/AdminHomePage.vue index 336ab30..9431961 100644 --- a/apps/web/src/pages/AdminHomePage.vue +++ b/apps/web/src/pages/AdminHomePage.vue @@ -10,6 +10,7 @@ import { createAdminSale, listAdminSales, voidAdminSale } from '@/services/admin import { createAdminAcquisition, listAdminAcquisitions } from '@/services/admin-acquisition-service.js'; import { getAdminDashboard } from '@/services/admin-dashboard-service.js'; import { addAdminPricingObservation, calculateAdminValuation, overrideAdminValuation } from '@/services/admin-pricing-service.js'; +import { createAdminProviderMapping, listAdminProviderMappings } from '@/services/admin-provider-mapping-service.js'; const { principal } = useAuth(); const products = ref([]); @@ -48,6 +49,12 @@ const pricingPrice = ref(''); const overridePrice = ref(''); const overrideReason = ref(''); const voidReasons = ref({}); +const mappingProductId = ref(''); +const mappingProviderId = ref(''); +const mappingType = ref('PRODUCT'); +const mappingExternalIdentifier = ref(''); +const mappingSearchQuery = ref(''); +const providerMappings = ref([]); function csrfToken() { return document.cookie.split('; ').find((value) => value.startsWith('pokemon_inventory_csrf='))?.split('=')[1] ?? ''; @@ -71,6 +78,28 @@ async function createProduct() { finally { isSaving.value = false; } } +async function loadProviderMappings(productId = mappingProductId.value) { + if (!productId) { providerMappings.value = []; return; } + providerMappings.value = await listAdminProviderMappings(productId); +} + +async function createProviderMapping() { + isSaving.value = true; + try { + const mapping = await createAdminProviderMapping(mappingProductId.value, { + providerId: mappingProviderId.value, + mappingType: mappingType.value, + externalIdentifier: mappingExternalIdentifier.value || undefined, + searchQuery: mappingSearchQuery.value || undefined, + }, csrfToken()); + providerMappings.value.push(mapping); + mappingProviderId.value = ''; + mappingExternalIdentifier.value = ''; + mappingSearchQuery.value = ''; + } catch (requestError) { error.value = requestError; } + finally { isSaving.value = false; } +} + async function createInventory() { isSaving.value = true; try { @@ -218,6 +247,23 @@ onMounted(load); +