@@ -21,6 +21,7 @@ import { ArrowLeft, ChevronDown, ChevronRight, Plus, Search } from '@sim/emcn/ic
2121import type { ConnectorData } from '@/lib/api/contracts/knowledge/connectors'
2222import { type ResourceScope , resourceScopeFields } from '@/lib/core/resource-scope'
2323import { getIntegrationsForCredentialProvider } from '@/lib/integrations/credential-display'
24+ import { initialConnectorAccessMode } from '@/lib/knowledge/connectors/access-modes'
2425import {
2526 getCanonicalScopesForProvider ,
2627 getProviderIdFromServiceId ,
@@ -62,6 +63,11 @@ import {
6263import { SettingsResourceRow } from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row'
6364import { withBrandIcon } from '@/blocks/brand-icon'
6465import { getConnectorApiKeyConfig , isConnectorCredentialTypeAllowed } from '@/connectors/auth'
66+ import {
67+ GitLabPermissionTabs ,
68+ GitLabPermissionUploads ,
69+ } from '@/connectors/gitlab/permission-config/fields'
70+ import { useGitLabPermissionForm } from '@/connectors/gitlab/permission-config/use-permission-form'
6571import { CONNECTOR_META_REGISTRY } from '@/connectors/registry'
6672import type { ConnectorConfigField , ConnectorMeta } from '@/connectors/types'
6773import { useCreateConnector } from '@/hooks/queries/kb/connectors'
@@ -134,14 +140,16 @@ export function AddConnectorModal({
134140 draft ?. contentCredentialId ?? null
135141 )
136142 const [ access , setAccess ] = useState < ConnectorAccessSelection > ( ( ) => ( {
137- accessMode :
143+ accessMode : initialConnectorAccessMode (
144+ initialType ? CONNECTOR_META_REGISTRY [ initialType ] : undefined ,
138145 lockedAccessMode ??
139- ( lockConnectorType ? initialAccessMode : draft ?. accessMode ) ??
140- ( isSearchIndex && initialAccessMode === 'workspace'
141- ? initialType && CONNECTOR_META_REGISTRY [ initialType ] ?. auth . mode === 'apiKey'
142- ? 'admin'
143- : 'members'
144- : initialAccessMode ) ,
146+ ( lockConnectorType ? initialAccessMode : draft ?. accessMode ) ??
147+ ( isSearchIndex && initialAccessMode === 'workspace'
148+ ? initialType && CONNECTOR_META_REGISTRY [ initialType ] ?. auth . mode === 'apiKey'
149+ ? 'admin'
150+ : 'members'
151+ : initialAccessMode )
152+ ) ,
145153 } ) )
146154 const [ disabledTagIds , setDisabledTagIds ] = useState < Set < string > > (
147155 ( ) => new Set ( draft ?. disabledTagIds )
@@ -154,6 +162,7 @@ export function AddConnectorModal({
154162 )
155163 const [ showGitHubInstallationModal , setShowGitHubInstallationModal ] = useState ( false )
156164
165+ const gitlabPermissions = useGitLabPermissionForm ( )
157166 const [ apiKeyValue , setApiKeyValue ] = useState ( '' )
158167 const [ useApiKey , setUseApiKey ] = useState ( ! isSearchIndex )
159168 const [ apiKeyFocused , setApiKeyFocused ] = useState ( false )
@@ -182,6 +191,7 @@ export function AddConnectorModal({
182191 ? getSearchConnectionLabels ( selectedType , access . accessMode )
183192 : undefined
184193 const modalTitle = searchLabels ?. title ?? `Configure ${ connectorConfig ?. name } `
194+ const showGitLabPermissions = selectedType === 'gitlab' && access . accessMode === 'admin'
185195 const isMembersMode = access . accessMode === 'members'
186196 const apiKeyConfig = connectorConfig ? getConnectorApiKeyConfig ( connectorConfig . auth ) : undefined
187197 const isApiKeyMode =
@@ -347,7 +357,7 @@ export function AddConnectorModal({
347357 }
348358
349359 const isOptionalSetupField = ( field : ConnectorConfigField ) =>
350- isSearchIndex &&
360+ ( isSearchIndex || connectorConfig ?. supportedAccessModes ?. length === 1 ) &&
351361 field . setupGroup === 'options' &&
352362 Boolean ( connectorConfig && ! isConnectorFieldRequired ( field , connectorConfig , access . accessMode ) )
353363 const hasOptionalSetupFields = connectorConfig ?. configFields . some (
@@ -433,24 +443,32 @@ export function AddConnectorModal({
433443
434444 const closeSetup = ( nextOpen : boolean ) => {
435445 if ( ! nextOpen && setupDraftKey ) useConnectorSetupStore . getState ( ) . clearDraft ( setupDraftKey )
446+ if ( ! nextOpen ) {
447+ gitlabPermissions . reset ( )
448+ setApiKeyValue ( '' )
449+ }
436450 onOpenChange ( nextOpen )
437451 }
438452
439453 const handleSelectType = ( type : string ) => {
440454 if ( setupDraftKey ) useConnectorSetupStore . getState ( ) . clearDraft ( setupDraftKey )
455+ gitlabPermissions . reset ( )
441456 setSelectedType ( type )
442457 setSourceConfig (
443458 isSearchIndex ? { ...CONNECTOR_META_REGISTRY [ type ] ?. searchDefaultSourceConfig } : { }
444459 )
445460 setSelectedCredentialId ( null )
446461 setContentCredentialId ( null )
447- setAccess (
448- isSearchIndex
449- ? {
450- accessMode : CONNECTOR_META_REGISTRY [ type ] ?. auth . mode === 'apiKey' ? 'admin' : 'members' ,
451- }
452- : WORKSPACE_ACCESS
453- )
462+ setAccess ( {
463+ accessMode : initialConnectorAccessMode (
464+ CONNECTOR_META_REGISTRY [ type ] ,
465+ isSearchIndex
466+ ? CONNECTOR_META_REGISTRY [ type ] ?. auth . mode === 'apiKey'
467+ ? 'admin'
468+ : 'members'
469+ : 'workspace'
470+ ) ,
471+ } )
454472 setApiKeyValue ( '' )
455473 setUseApiKey ( ! isSearchIndex )
456474 setApiKeyFocused ( false )
@@ -477,6 +495,7 @@ export function AddConnectorModal({
477495 const canSubmit = Boolean (
478496 connectorConfig &&
479497 hasRequiredCredential &&
498+ ( ! showGitLabPermissions || gitlabPermissions . complete ) &&
480499 hasSearchAccess &&
481500 ( access . accessMode !== 'admin' || allowAdmin ) &&
482501 ( ! isMembersMode || allowMembers ) &&
@@ -518,6 +537,7 @@ export function AddConnectorModal({
518537 {
519538 knowledgeBaseId,
520539 connectorType : selectedType ,
540+ ...( showGitLabPermissions ? { permissionConfig : gitlabPermissions . input } : { } ) ,
521541 accessMode : access . accessMode ,
522542 ...( isApiKeyMode
523543 ? apiKeyValue . trim ( )
@@ -625,6 +645,9 @@ export function AddConnectorModal({
625645 </ div >
626646 ) : connectorConfig ? (
627647 < >
648+ { showGitLabPermissions && (
649+ < GitLabPermissionTabs form = { gitlabPermissions } disabled = { isCreating } />
650+ ) }
628651 { integrationAvailabilityError && (
629652 < ChipModalField type = 'custom' title = 'Connection availability' >
630653 < SettingsQueryErrorState
@@ -774,6 +797,9 @@ export function AddConnectorModal({
774797 }
775798 />
776799 ) }
800+ { showGitLabPermissions && (
801+ < GitLabPermissionUploads form = { gitlabPermissions } disabled = { isCreating } />
802+ ) }
777803
778804 { ( hasOptionalSetupFields ||
779805 contentCredentialField ||
@@ -786,7 +812,9 @@ export function AddConnectorModal({
786812 aria-expanded = { showMetadata }
787813 onClick = { ( ) => setShowMetadata ( ( visible ) => ! visible ) }
788814 >
789- { isSearchIndex ? 'More options' : 'Document details (optional)' }
815+ { isSearchIndex || hasOptionalSetupFields
816+ ? 'More options'
817+ : 'Document details (optional)' }
790818 </ Chip >
791819 </ div >
792820 { showMetadata && (
@@ -841,15 +869,19 @@ export function AddConnectorModal({
841869 </ >
842870 ) }
843871
844- { ! isSearchIndex && (
872+ { ! isSearchIndex && ( ! hasOptionalSetupFields || showMetadata ) && (
845873 < ChipModalField
846874 type = 'custom'
847875 title = 'Sync Frequency'
848- hint = { connectorSyncFrequencyHint (
849- access . accessMode ,
850- syncInterval ,
851- Boolean ( contentCredentialId )
852- ) }
876+ hint = {
877+ showGitLabPermissions && gitlabPermissions . mode === 'csv'
878+ ? undefined
879+ : connectorSyncFrequencyHint (
880+ access . accessMode ,
881+ syncInterval ,
882+ Boolean ( contentCredentialId )
883+ )
884+ }
853885 >
854886 < ButtonGroup
855887 value = { String ( syncInterval ) }
0 commit comments