@@ -13,7 +13,7 @@ import {
1313import { ReactComponent as UserIcon } from "@surfnet/sds/icons/functional-icons/id-2.svg" ;
1414import { ReactComponent as UpIcon } from "@surfnet/sds/icons/functional-icons/arrow-up-2.svg" ;
1515import { ReactComponent as DownIcon } from "@surfnet/sds/icons/functional-icons/arrow-down-2.svg" ;
16- import { newInvitation , rolesByApplication } from "../api" ;
16+ import { newInvitation , organizationGUIDValidation , rolesByApplication } from "../api" ;
1717import { Button , ButtonType , Loader , Tooltip } from "@surfnet/sds" ;
1818import "./InvitationForm.scss" ;
1919import { UnitHeader } from "../components/UnitHeader" ;
@@ -50,6 +50,10 @@ export const InvitationForm = () => {
5050 invites : [ ] ,
5151 intendedAuthority : AUTHORITIES . GUEST
5252 } ) ;
53+
54+ const [ validOrganizationGUID , setValidOrganizationGUID ] = useState ( true ) ;
55+ const [ organizationGUIDIdentityProvider , setOrganizationGUIDIdentityProvider ] = useState ( null ) ;
56+
5357 const [ displayAdvancedSettings , setDisplayAdvancedSettings ] = useState ( false ) ;
5458 const [ loading , setLoading ] = useState ( true ) ;
5559 const [ customExpiryDate , setCustomExpiryDate ] = useState ( false ) ;
@@ -152,7 +156,8 @@ export const InvitationForm = () => {
152156
153157 const isValid = ( ) => {
154158 return required . every ( attr => ! isEmpty ( invitation [ attr ] ) ) &&
155- ( ! isEmpty ( selectedRoles ) || [ AUTHORITIES . SUPER_USER , AUTHORITIES . INSTITUTION_ADMIN ] . includes ( invitation . intendedAuthority ) ) ;
159+ ( ! isEmpty ( selectedRoles ) || [ AUTHORITIES . SUPER_USER , AUTHORITIES . INSTITUTION_ADMIN ] . includes ( invitation . intendedAuthority ) )
160+ && ( invitation . intendedAuthority !== AUTHORITIES . INSTITUTION_ADMIN || ! user . superUser || validOrganizationGUID ) ;
156161 }
157162
158163 const addEmails = emails => {
@@ -175,6 +180,21 @@ export const InvitationForm = () => {
175180 return invitation . roleExpiryDate ;
176181 }
177182
183+ const validateOrganizationGUID = e => {
184+ const organizationGUID = e . target . value ;
185+ if ( ! isEmpty ( organizationGUID ) ) {
186+ organizationGUIDValidation ( organizationGUID )
187+ . then ( idp => {
188+ setOrganizationGUIDIdentityProvider ( idp ) ;
189+ setValidOrganizationGUID ( true ) ;
190+ } )
191+ . catch ( ( ) => {
192+ setOrganizationGUIDIdentityProvider ( null ) ;
193+ setValidOrganizationGUID ( false ) ;
194+ } )
195+ }
196+ }
197+
178198 const rolesChanged = selectedOptions => {
179199 if ( selectedOptions === null ) {
180200 setSelectedRoles ( [ ] )
@@ -199,7 +219,6 @@ export const InvitationForm = () => {
199219 intendedAuthority : option . value ,
200220 roleExpiryDate : defaultRoleExpiryDate ( selectedRoles )
201221 } ) ;
202-
203222 }
204223
205224 const renderUserRole = ( role , index , invitationSelected , invitationSelectCallback ) => {
@@ -216,6 +235,7 @@ export const InvitationForm = () => {
216235 }
217236
218237 const renderFormElements = authorityOptions => {
238+ const skipRoles = [ AUTHORITIES . SUPER_USER , AUTHORITIES . INSTITUTION_ADMIN ] . includes ( invitation . intendedAuthority ) ;
219239 return (
220240 < >
221241 < EmailField
@@ -242,7 +262,34 @@ export const InvitationForm = () => {
242262 toolTip = { I18n . t ( "tooltips.intendedAuthorityTooltip" ) }
243263 clearable = { false }
244264 /> }
245- { ! isInviter && < >
265+
266+ { ( user . superUser && AUTHORITIES . INSTITUTION_ADMIN === invitation . intendedAuthority ) &&
267+ < InputField
268+ name = { I18n . t ( "roles.organizationGUID" ) }
269+ value = { invitation . organizationGUID }
270+ onChange = { e => {
271+ setInvitation ( {
272+ ...invitation ,
273+ organizationGUID : e . target . value
274+ } ) ;
275+ setValidOrganizationGUID ( true ) ;
276+ setOrganizationGUIDIdentityProvider ( null ) ;
277+ } }
278+ onBlur = { validateOrganizationGUID }
279+ toolTip = { I18n . t ( "tooltips.organizationGUID" ) }
280+ /> }
281+ { ! validOrganizationGUID &&
282+ < ErrorIndicator msg = { I18n . t ( "forms.invalid" , {
283+ value : invitation . organizationGUID ,
284+ attribute : I18n . t ( "roles.organizationGUID" ) . toLowerCase ( )
285+ } ) } /> }
286+ { ! isEmpty ( organizationGUIDIdentityProvider ) &&
287+ < p className = "info" > { I18n . t ( "roles.identityProvider" , { name : organizationGUIDIdentityProvider [ "name:en" ] } ) } </ p > }
288+ { ( ! initial && isEmpty ( invitation . organizationGUID ) &&
289+ invitation . intendedAuthority === AUTHORITIES . INSTITUTION_ADMIN && user . superUser ) &&
290+ < ErrorIndicator msg = { I18n . t ( "invitations.requiredOrganizationGUID" ) } /> }
291+
292+ { ( ! isInviter && ! skipRoles ) && < >
246293 < SelectField value = { selectedRoles }
247294 options = { roles . filter ( role => ! selectedRoles . find ( r => r . value === role . value ) ) }
248295 name = { I18n . t ( "invitations.roles" ) }
@@ -254,7 +301,7 @@ export const InvitationForm = () => {
254301 placeholder = { I18n . t ( "invitations.rolesPlaceHolder" ) }
255302 onChange = { rolesChanged } />
256303 { ( ! initial && isEmpty ( selectedRoles ) &&
257- ! [ AUTHORITIES . SUPER_USER , AUTHORITIES . INSTITUTION_ADMIN ] . includes ( invitation . intendedAuthority ) ) &&
304+ ! skipRoles ) &&
258305 < ErrorIndicator msg = { I18n . t ( "invitations.requiredRole" ) } /> }
259306 </ > }
260307
@@ -285,6 +332,7 @@ export const InvitationForm = () => {
285332 const authorityOptions = allowedAuthoritiesForInvitation ( user , selectedRoles )
286333 . map ( authority => ( { value : authority , label : I18n . t ( `access.${ authority } ` ) } ) ) ;
287334 const overrideSettingsAllowed = selectedRoles . every ( role => role . overrideSettingsAllowed ) ;
335+ const skipRoles = [ AUTHORITIES . SUPER_USER , AUTHORITIES . INSTITUTION_ADMIN ] . includes ( invitation . intendedAuthority )
288336 return (
289337 < >
290338 { isInviter &&
@@ -342,15 +390,16 @@ export const InvitationForm = () => {
342390 info = { I18n . t ( "tooltips.eduIDOnlyTooltip" ) }
343391 /> }
344392
345- { ( invitation . intendedAuthority !== AUTHORITIES . GUEST && ! isInviter ) &&
393+ { ( invitation . intendedAuthority !== AUTHORITIES . GUEST && ! isInviter &&
394+ ! skipRoles ) &&
346395 < SwitchField name = { "guestRoleIncluded" }
347396 value = { invitation . guestRoleIncluded || false }
348397 onChange = { val => setInvitation ( { ...invitation , guestRoleIncluded : val } ) }
349398 label = { I18n . t ( "invitations.guestRoleIncluded" ) }
350399 info = { I18n . t ( "tooltips.guestRoleIncludedTooltip" ) }
351400 />
352401 }
353- { overrideSettingsAllowed &&
402+ { ( overrideSettingsAllowed && ! skipRoles ) &&
354403 < SwitchField name = { "roleExpiryDate" }
355404 value = { customRoleExpiryDate }
356405 onChange = { ( ) => {
0 commit comments