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",