{"version":3,"file":"SSOConnectionsScreen.mjs","sources":["../../../../../../../../web/src/adminPortal/sso/SSOConnectionsScreen.tsx"],"sourcesContent":["import { Add, DeleteOutlined, EditOutlined, Tune, VisibilityOutlined } from '@mui/icons-material';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { Action, useActionMenu } from '../components/ActionMenu';\nimport { Alert } from '../components/Alert';\nimport { Button } from '../components/Button';\nimport { DeleteConfirmModal, useDeleteConnection } from '../components/DeleteConnection';\nimport { FlexBox } from '../components/FlexBox';\nimport { PaginatedTable } from '../components/PaginatedTable';\nimport { SearchBar } from '../components/SearchBar';\nimport { SetDefaultConfirmModal, useSetDefaultConnection } from '../components/SetDefaultConnection';\nimport { Tag } from '../components/Tag';\nimport { Typography } from '../components/Typography';\nimport { TableItemRenderer } from '../shared/components/types';\nimport { Connection } from '../utils/Connection';\nimport { getDisplayStatus } from '../utils/getDisplay';\nimport { NO_VALUE } from '../utils/noValue';\nimport { useAdminPortalConfig } from '../utils/useAdminPortalConfig';\nimport { useConnections } from '../utils/useConnections';\nimport { useDisplayPagination } from '../utils/useDisplayPagination';\nimport { useRbac } from '../utils/useRbac';\nimport { getIdpInfo } from './IdpInfo';\nimport { useSsoRouterController } from './SSORouter';\n\nconst itemRenderer: TableItemRenderer<Connection>[] = [\n  {\n    title: 'Display Name',\n    getValue: ({ displayName, isDefault }) => {\n      return isDefault ? (\n        <Typography variant=\"body2\">\n          {displayName} <Tag size=\"small\">Default</Tag>\n        </Typography>\n      ) : (\n        displayName\n      );\n    },\n  },\n  {\n    title: 'IdP',\n    getValue: ({ idp, connectionType }) => {\n      return idp ? getIdpInfo(idp, connectionType).idp.displayName : NO_VALUE;\n    },\n    width: 200,\n  },\n  {\n    title: 'Status',\n    getValue: ({ status }) => getDisplayStatus(status),\n    width: 150,\n  },\n];\n\nconst useSearchFilter = <T,>({ data, searchKeys }: { data: T[]; searchKeys: (keyof T)[] }) => {\n  const [filterText, setFilterText] = useState('');\n\n  const filteredData = useMemo(() => {\n    if (!filterText) {\n      return data;\n    }\n    const filterTextLower = filterText.toLowerCase();\n    return data.filter((item) => {\n      return searchKeys.some((key) => {\n        return String(item[key]).toLowerCase().includes(filterTextLower);\n      });\n    });\n  }, [data, filterText, searchKeys]);\n\n  return {\n    filteredData,\n    filterText,\n    setFilterText,\n  };\n};\n\nconst useCanProjectCreateSsoConnection = () => {\n  const { data } = useAdminPortalConfig({ shouldFetch: true });\n  return data?.sso_config.can_create_oidc_connection && data.sso_config.can_create_saml_connection;\n};\n\nconst getConnectionId = (connection: Connection) => connection.id;\n\nexport const SSOConnectionsScreen = () => {\n  const { navigate } = useSsoRouterController();\n\n  const canProjectCreateSsoConnection = useCanProjectCreateSsoConnection();\n  const { data: canGetConnection } = useRbac('stytch.sso', 'get');\n  const { data: canCreatePermission } = useRbac('stytch.sso', 'create');\n  const { data: canDeleteConnection } = useRbac('stytch.sso', 'delete');\n  const { data: canUpdateConnection } = useRbac('stytch.sso', 'update');\n  const { data: canSetDefaultConnection } = useRbac('stytch.organization', 'update.settings.default-sso-connection');\n  const canCreateConnection = canCreatePermission && canProjectCreateSsoConnection;\n\n  const { connections, isLoading } = useConnections(!!canGetConnection);\n\n  const { filterText, setFilterText, filteredData } = useSearchFilter({\n    data: connections,\n    searchKeys: ['displayName'],\n  });\n  const pagination = useDisplayPagination({\n    items: filteredData,\n    viewId: 'adminPortalSsoConnections',\n  });\n\n  const tableProps = {\n    ...pagination,\n    onRowClick: (id: string) => navigate({ screen: 'connectionDetails', params: { connectionId: id } }),\n  };\n\n  const defaultConnectionName = useMemo(\n    () => connections.find((connection) => connection.isDefault)?.displayName,\n    [connections],\n  );\n\n  const { modalProps: setDefaultModalProps, handleRequestSetDefault: handleSetDefault } = useSetDefaultConnection({\n    defaultConnectionName,\n  });\n\n  const { modalProps: deleteModalProps, handleRequestDelete: handleDelete } = useDeleteConnection();\n\n  const handleEdit = useCallback(\n    (connection: Connection) => {\n      navigate({ screen: 'connectionDetails', params: { connectionId: connection.id } });\n    },\n    [navigate],\n  );\n\n  const handleNewConnectionClick = useCallback(() => {\n    navigate({ screen: 'newConnection' });\n  }, [navigate]);\n\n  const hasExactlyOneConnection = connections.length === 1;\n\n  const actions = useMemo(\n    () =>\n      [\n        {\n          key: 'view',\n          label: 'View connection',\n          icon: <VisibilityOutlined />,\n          onClick: handleEdit,\n          isVisible: !canUpdateConnection,\n        },\n        {\n          key: 'edit',\n          label: 'Edit connection',\n          icon: <EditOutlined />,\n          onClick: handleEdit,\n          isVisible: !!canUpdateConnection,\n        },\n        {\n          key: 'set-default',\n          label: 'Set as default',\n          icon: <Tune />,\n          onClick: handleSetDefault,\n          isVisible: (connection) => !connection.isDefault && !!canSetDefaultConnection,\n        },\n        {\n          key: 'delete',\n          label: 'Delete',\n          icon: <DeleteOutlined />,\n          onClick: handleDelete,\n          isDangerous: true,\n          isVisible: (connection) => (!connection.isDefault || hasExactlyOneConnection) && !!canDeleteConnection,\n        },\n      ] satisfies Action<Connection>[],\n    [\n      canDeleteConnection,\n      canSetDefaultConnection,\n      canUpdateConnection,\n      handleDelete,\n      handleEdit,\n      handleSetDefault,\n      hasExactlyOneConnection,\n    ],\n  );\n\n  const { getItemActionProps } = useActionMenu<Connection>({\n    actions,\n    idPrefix: 'connection',\n    getId: getConnectionId,\n  });\n\n  return (\n    <>\n      <FlexBox flexDirection=\"column\" gap={3}>\n        {canCreatePermission && !canCreateConnection && (\n          <Alert>\n            You’ve reached the maximum number of allowed connections. Delete an existing connection in order to add a\n            new one.\n          </Alert>\n        )}\n        <FlexBox alignItems=\"center\" justifyContent=\"space-between\">\n          <Typography variant=\"h1\">SSO Connections</Typography>\n          {canCreateConnection && (\n            <Button compact variant=\"primary\" startIcon={<Add />} onClick={handleNewConnectionClick}>\n              New connection\n            </Button>\n          )}\n        </FlexBox>\n        <SearchBar placeholder=\"Search\" value={filterText} onChange={setFilterText} />\n        <PaginatedTable<Connection>\n          {...tableProps}\n          itemRenderer={itemRenderer}\n          isLoading={isLoading}\n          titleVariant=\"h4\"\n          getItemActionProps={getItemActionProps}\n        />\n      </FlexBox>\n      <SetDefaultConfirmModal {...setDefaultModalProps} />\n      <DeleteConfirmModal {...deleteModalProps} />\n    </>\n  );\n};\n"],"names":["itemRenderer","title","getValue","displayName","isDefault","React","Typography","variant","Tag","size","idp","connectionType","getIdpInfo","NO_VALUE","width","status","getDisplayStatus","useSearchFilter","data","searchKeys","filterText","setFilterText","useState","filteredData","useMemo","filterTextLower","toLowerCase","filter","item","some","key","String","includes","useCanProjectCreateSsoConnection","useAdminPortalConfig","shouldFetch","sso_config","can_create_oidc_connection","can_create_saml_connection","getConnectionId","connection","id","SSOConnectionsScreen","navigate","useSsoRouterController","canProjectCreateSsoConnection","canGetConnection","useRbac","canCreatePermission","canDeleteConnection","canUpdateConnection","canSetDefaultConnection","canCreateConnection","connections","isLoading","useConnections","pagination","useDisplayPagination","items","viewId","tableProps","onRowClick","screen","params","connectionId","defaultConnectionName","find","modalProps","setDefaultModalProps","handleRequestSetDefault","handleSetDefault","useSetDefaultConnection","deleteModalProps","handleRequestDelete","handleDelete","useDeleteConnection","handleEdit","useCallback","handleNewConnectionClick","hasExactlyOneConnection","length","actions","label","icon","VisibilityOutlined","onClick","isVisible","EditOutlined","Tune","DeleteOutlined","isDangerous","getItemActionProps","useActionMenu","idPrefix","getId","FlexBox","flexDirection","gap","Alert","alignItems","justifyContent","Button","compact","startIcon","Add","SearchBar","placeholder","value","onChange","PaginatedTable","titleVariant","SetDefaultConfirmModal","DeleteConfirmModal"],"mappings":"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"}