### 🥞 Stack (review/merge bottom-up) 1. #48164 — Activity types (FE+BE) 2. #48165 — Backend (cron + directory sync) 3. #48166 — Usage statistics 4. #48167 — fleetctl generate-gitops 5. **#48168 — Settings UI ⬅ this PR** 📄 Documentation is tracked separately in #48169 (targets `docs-v4.89.0`). --- ## Summary **PR 5 of 6.** **Settings UI**: the Google Workspace section in the IdP providers card (`GoogleWorkspaceSection/`), interfaces, config mock, and mutual-exclusion messaging with SCIM. Uses the new `notify` toast API. > 🥞 **Stacked PR.** Base: `42915-gw-idp-vitals-4-gitops` (PR 4). **Related issue:** Resolves #42915 # Checklist for submitter - [ ] Changes file added for user-visible changes in `changes/`, `orbit/changes/` or `ee/fleetd-chrome/changes`. - [ ] Input data is properly validated, `SELECT *` is avoided, SQL injection is prevented (using placeholders for values in statements). - [ ] Timeouts are implemented and retries are limited to avoid infinite loops. ## Testing - [ ] Added/updated automated tests - [ ] QA'd all new/changed functionality manually <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a Google Workspace identity provider configuration section in the Integrations area (domain, admin impersonation email, and API key JSON). * Added premium-tier gating so non-premium users see the upgrade message and do not see the Google Workspace section. * **Bug Fixes** * Improved Google Workspace form validation and submission, including safe masking of the saved API key JSON and proper disconnect when clearing all fields. * **Tests** * Added tests covering premium visibility, Google Workspace rendering, pre-filled configuration, and masked API key behavior. * **Style** * Updated Identity Providers and Google Workspace section layout styling for consistent spacing and sizing. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
106 lines
3.1 KiB
TypeScript
106 lines
3.1 KiB
TypeScript
export type IIntegrationType = "jira" | "zendesk";
|
||
|
||
export interface IJiraIntegration {
|
||
url: string;
|
||
username: string;
|
||
api_token: string;
|
||
project_key: string;
|
||
enable_failing_policies?: boolean;
|
||
enable_software_vulnerabilities?: boolean;
|
||
}
|
||
|
||
export interface IZendeskIntegration {
|
||
url: string;
|
||
email: string;
|
||
api_token: string;
|
||
group_id: number;
|
||
enable_failing_policies?: boolean;
|
||
enable_software_vulnerabilities?: boolean;
|
||
}
|
||
|
||
export interface IIntegration {
|
||
url: string;
|
||
username?: string;
|
||
email?: string;
|
||
api_token: string;
|
||
project_key?: string;
|
||
group_id?: number;
|
||
enable_failing_policies?: boolean;
|
||
enable_software_vulnerabilities?: boolean;
|
||
originalIndex?: number;
|
||
type?: IIntegrationType;
|
||
tableIndex?: number;
|
||
dropdownIndex?: number;
|
||
name?: string;
|
||
}
|
||
|
||
export interface IIntegrationFormData {
|
||
url: string;
|
||
username?: string;
|
||
email?: string;
|
||
apiToken: string;
|
||
projectKey?: string;
|
||
groupId?: number;
|
||
enableSoftwareVulnerabilities?: boolean;
|
||
}
|
||
|
||
export interface IIntegrationTableData extends IIntegrationFormData {
|
||
originalIndex: number;
|
||
type: IIntegrationType;
|
||
tableIndex?: number;
|
||
name: string;
|
||
}
|
||
|
||
export interface IIntegrationFormErrors {
|
||
url?: string | null;
|
||
email?: string | null;
|
||
username?: string | null;
|
||
apiToken?: string | null;
|
||
groupId?: number | null;
|
||
projectKey?: string | null;
|
||
enableSoftwareVulnerabilities?: boolean;
|
||
}
|
||
|
||
export interface IGlobalCalendarIntegration {
|
||
domain: string;
|
||
api_key_json: Record<string, string>;
|
||
}
|
||
|
||
interface ITeamCalendarSettings {
|
||
enable_calendar_events: boolean;
|
||
webhook_url: string;
|
||
}
|
||
|
||
// zendesk and jira fields are coupled – if one is present, the other needs to be present. If
|
||
// one is present and the other is null/missing, the other will be nullified. google_calendar is
|
||
// separated – it can be present without the other 2 without nullifying them.
|
||
// TODO: Update these types to reflect this.
|
||
export interface IZendeskJiraIntegrations {
|
||
zendesk: IZendeskIntegration[];
|
||
jira: IJiraIntegration[];
|
||
}
|
||
|
||
// Google Workspace IdP integration: syncs IdP host vitals (users, groups,
|
||
// departments) from Google Workspace via the Admin SDK Directory API using a
|
||
// service account with domain-wide delegation. Mutually exclusive with SCIM.
|
||
export interface IGlobalGoogleWorkspaceIntegration {
|
||
domain: string;
|
||
impersonated_user_email: string;
|
||
api_key_json: Record<string, string>;
|
||
}
|
||
|
||
// reality is that IZendeskJiraIntegrations are optional – should be something like `extends
|
||
// Partial<IZendeskJiraIntegrations>`, but that leads to a mess of types to resolve.
|
||
export interface IGlobalIntegrations extends IZendeskJiraIntegrations {
|
||
google_calendar?: IGlobalCalendarIntegration[] | null;
|
||
google_workspace?: IGlobalGoogleWorkspaceIntegration[];
|
||
// whether or not conditional access is enabled for "No team"
|
||
conditional_access_enabled?: boolean;
|
||
}
|
||
|
||
export interface ITeamIntegrations extends IZendeskJiraIntegrations {
|
||
google_calendar?: ITeamCalendarSettings | null;
|
||
// whether or not conditional access is enabled for each team other than "No team" (see `IGlobalIntegrations.conditional_access_enabled`)
|
||
conditional_access_enabled?: boolean;
|
||
}
|