diff --git a/package.json b/package.json index ee84a95ad7bf..bba74b63d2e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cipp", - "version": "10.4.3", + "version": "10.4.4", "author": "CIPP Contributors", "homepage": "https://cipp.app/", "bugs": { diff --git a/public/version.json b/public/version.json index 521d35e0af9b..0ac81ba1b0ba 100644 --- a/public/version.json +++ b/public/version.json @@ -1,3 +1,3 @@ { - "version": "10.4.3" + "version": "10.4.4" } diff --git a/src/components/CippWizard/CippAddTenantTypeSelection.jsx b/src/components/CippWizard/CippAddTenantTypeSelection.jsx index 57e0b2ebac87..520d1b978936 100644 --- a/src/components/CippWizard/CippAddTenantTypeSelection.jsx +++ b/src/components/CippWizard/CippAddTenantTypeSelection.jsx @@ -71,7 +71,7 @@ export const CippAddTenantTypeSelection = (props) => { }, { value: 'IndirectReseller', - label: 'Get Indirect Reseller Invite Link', + label: 'Get Reseller Invite Link', description: 'Generate a reseller relationship invite link to send to a customer. This does not add the tenant to CIPP, but may be used by other vendors to populate their customer list.', icon: , diff --git a/src/components/CippWizard/CippIndirectResellerLink.jsx b/src/components/CippWizard/CippIndirectResellerLink.jsx index 82a83dcae989..991e18683f34 100644 --- a/src/components/CippWizard/CippIndirectResellerLink.jsx +++ b/src/components/CippWizard/CippIndirectResellerLink.jsx @@ -1,12 +1,13 @@ -import { useEffect, useMemo, useState } from 'react' -import { Alert, Autocomplete, Box, Skeleton, Stack, TextField, Typography } from '@mui/material' +import { useEffect, useMemo } from 'react' +import { Alert, Box, Skeleton, Stack, TextField, Typography } from '@mui/material' import { ApiGetCall } from '../../api/ApiCall' import { CippWizardStepButtons } from './CippWizardStepButtons' import { CippCopyToClipBoard } from '../CippComponents/CippCopyToClipboard' +import CippFormComponent from '../CippComponents/CippFormComponent' +import { useWatch } from 'react-hook-form' export const CippIndirectResellerLink = (props) => { const { formControl, currentStep, onPreviousStep, onNextStep } = props - const [selectedProvider, setSelectedProvider] = useState(null) const linkData = ApiGetCall({ url: '/api/ListResellerRelationshipLink', @@ -17,27 +18,36 @@ export const CippIndirectResellerLink = (props) => { const indirectProviders = linkData.data?.indirectProviders ?? [] const inviteUrlError = linkData.data?.inviteUrlError ?? null + const noneOption = { label: 'None (no indirect provider)', value: null } + + const providerOptions = useMemo(() => { + const providers = indirectProviders.map((p) => ({ + label: `${p.name} — MPN: ${p.mpnId} (${p.location})`, + value: p.id, + })) + return [noneOption, ...providers] + }, [indirectProviders]) + + useEffect(() => { + if (!linkData.isFetching && providerOptions.length > 0) { + const current = formControl.getValues('indirectProviderId') + if (!current) { + formControl.setValue('indirectProviderId', noneOption) + } + } + }, [linkData.isFetching, providerOptions]) + + const selectedProvider = useWatch({ control: formControl.control, name: 'indirectProviderId' }) + const finalUrl = useMemo(() => { if (!inviteUrl) return null - if (!selectedProvider) return inviteUrl - // Append the indirect provider ID before the # fragment + if (!selectedProvider?.value) return inviteUrl const hashIndex = inviteUrl.indexOf('#') const base = hashIndex !== -1 ? inviteUrl.slice(0, hashIndex) : inviteUrl const hash = hashIndex !== -1 ? inviteUrl.slice(hashIndex) : '' - return `${base}&indirectCSPId=${selectedProvider.id}${hash}` + return `${base}&indirectCSPId=${selectedProvider.value}${hash}` }, [inviteUrl, selectedProvider]) - const providerOptions = useMemo( - () => - indirectProviders.map((p) => ({ - label: p.name, - id: p.id, - mpnId: p.mpnId, - location: p.location, - })), - [indirectProviders] - ) - return ( @@ -53,9 +63,7 @@ export const CippIndirectResellerLink = (props) => { {linkData.isFetching && ( - {/* Indirect provider dropdown skeleton */} - {/* Link field skeleton */} @@ -75,32 +83,17 @@ export const CippIndirectResellerLink = (props) => { {!linkData.isFetching && !linkData.isError && inviteUrl && ( <> - {indirectProviders.length > 0 && ( - setSelectedProvider(value)} - getOptionLabel={(option) => option.label} - renderOption={(renderProps, option) => ( -
  • - - {option.label} - - MPN ID: {option.mpnId} · {option.location} - - -
  • - )} - renderInput={(params) => ( - - )} - /> - )} + @@ -110,9 +103,8 @@ export const CippIndirectResellerLink = (props) => {
    diff --git a/src/data/portals.json b/src/data/portals.json index 58f49e3ae2c3..a4402305faca 100644 --- a/src/data/portals.json +++ b/src/data/portals.json @@ -97,7 +97,7 @@ "target": "_blank", "external": true, "icon": "PrecisionManufacturing" - } + }, { "label": "Power BI", "name": "Power_BI_Portal",