diff --git a/packages/console/src/App.tsx b/packages/console/src/App.tsx index e58d797d9..e5fa00f8a 100644 --- a/packages/console/src/App.tsx +++ b/packages/console/src/App.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from 'react'; -import { BrowserRouter, Route, Routes, useLocation, useNavigate } from 'react-router-dom'; +import { BrowserRouter, Navigate, Route, Routes, useLocation, useNavigate } from 'react-router-dom'; import { SWRConfig } from 'swr'; import './scss/normalized.scss'; @@ -44,7 +44,11 @@ const Main = () => { } /> - } /> + + } /> + } /> + } /> + } /> diff --git a/packages/console/src/components/CopyToClipboard/index.module.scss b/packages/console/src/components/CopyToClipboard/index.module.scss index 8dc478d86..a84cf12a4 100644 --- a/packages/console/src/components/CopyToClipboard/index.module.scss +++ b/packages/console/src/components/CopyToClipboard/index.module.scss @@ -12,6 +12,7 @@ .row { display: flex; align-items: center; + justify-content: space-between; cursor: text; > svg { diff --git a/packages/console/src/pages/ApplicationDetails/index.module.scss b/packages/console/src/pages/ApplicationDetails/index.module.scss index 454ce5f07..78f62ca6d 100644 --- a/packages/console/src/pages/ApplicationDetails/index.module.scss +++ b/packages/console/src/pages/ApplicationDetails/index.module.scss @@ -59,3 +59,34 @@ } } } + +.container .body { + > :not(:first-child) { + margin-top: _.unit(6); + } + + .tabContent { + form { + >:not(:first-child) { + margin-top: _.unit(6); + } + + .fields { + border-bottom: 1px solid var(--color-border); + padding-bottom: _.unit(6); + + > div { + @include _.form-text-field; + } + + .copy { + @include _.form-text-field; + } + } + + .submit { + text-align: right; + } + } + } +} diff --git a/packages/console/src/pages/ApplicationDetails/index.tsx b/packages/console/src/pages/ApplicationDetails/index.tsx index c78101230..d06b45304 100644 --- a/packages/console/src/pages/ApplicationDetails/index.tsx +++ b/packages/console/src/pages/ApplicationDetails/index.tsx @@ -1,46 +1,140 @@ import { Application } from '@logto/schemas'; -import React from 'react'; +import React, { useEffect } from 'react'; +import { useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; -import { useParams } from 'react-router-dom'; +import { useLocation, useParams } from 'react-router-dom'; import useSWR from 'swr'; import BackLink from '@/components/BackLink'; import Button from '@/components/Button'; import Card from '@/components/Card'; import CopyToClipboard from '@/components/CopyToClipboard'; +import FormField from '@/components/FormField'; import ImagePlaceholder from '@/components/ImagePlaceholder'; +import TabNav, { TabNavLink } from '@/components/TabNav'; +import TextInput from '@/components/TextInput'; import { RequestError } from '@/swr'; import { applicationTypeI18nKey } from '@/types/applications'; import * as styles from './index.module.scss'; +type OidcConfig = { + authorization_endpoint: string; + userinfo_endpoint: string; + token_endpoint: string; +}; + const ApplicationDetails = () => { const { id } = useParams(); + const location = useLocation(); + const { data, error } = useSWR(id && `/api/applications/${id}`); + const { data: oidcConfig, error: fetchOidcConfigError } = useSWR( + '/oidc/.well-known/openid-configuration' + ); + const isLoading = !data && !error && !fetchOidcConfigError; + const dataFetched = data && oidcConfig; + + const { handleSubmit, register, reset } = useForm({ + defaultValues: data, + }); + const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' }); - const isLoading = !data && !error; + + const isAdvancedSettings = location.pathname.includes('advanced-settings'); + + useEffect(() => { + if (!data) { + return; + } + reset(data); + }, [data, reset]); + + const onSubmit = handleSubmit((formData) => { + console.log(formData); + }); return (
{t('application_details.back_to_applications')} {isLoading &&
loading
} {error &&
{`error occurred: ${error.metadata.code}`}
} - {data && ( - - -
-
{data.name}
-
-
{t(`${applicationTypeI18nKey[data.type]}.title`)}
-
-
App ID
- + {dataFetched && ( + <> + + +
+
{data.name}
+
+
{t(`${applicationTypeI18nKey[data.type]}.title`)}
+
+
App ID
+ +
-
-
-
-
+
+
+ + + + + {t('application_details.settings')} + + + {t('application_details.advanced_settings')} + + +
+
+
+ {!isAdvancedSettings && ( + <> + + + + + + + + + + + )} + {isAdvancedSettings && ( + <> + + + + + + + + )} +
+
+
+
+
+
+ )}
); diff --git a/packages/phrases/src/locales/en.ts b/packages/phrases/src/locales/en.ts index ada5055ee..4d3bb86a1 100644 --- a/packages/phrases/src/locales/en.ts +++ b/packages/phrases/src/locales/en.ts @@ -80,6 +80,19 @@ const translation = { application_details: { back_to_applications: 'Back to Applications', check_help_guide: 'Check Help Guide', + settings: 'Settings', + advanced_settings: 'Advanced Settings', + application_name: 'Application Name', + description: 'Description', + authorization_endpoint: 'Authorization Endpiont', + redirect_uri: 'Redirect URI', + post_sign_out_redirect_uri: 'Post Sign Out Redirect URI', + add_another: 'Add another', + id_token_expiration: 'ID Token Expiration', + refresh_token_expiration: 'Refresh Token Expiration', + token_endpoint: 'Token Endpoint', + user_info_endpoint: 'User Info Endpoint', + save_changes: 'Save Changes', }, api_resources: { title: 'API Resources', diff --git a/packages/phrases/src/locales/zh-cn.ts b/packages/phrases/src/locales/zh-cn.ts index 1c74bbd33..1fd309fd9 100644 --- a/packages/phrases/src/locales/zh-cn.ts +++ b/packages/phrases/src/locales/zh-cn.ts @@ -82,6 +82,19 @@ const translation = { application_details: { back_to_applications: '返回应用集', check_help_guide: 'Check Help Guide', + settings: 'Settings', + advanced_settings: 'Advanced Settings', + application_name: 'Application Name', + description: 'Description', + authorization_endpoint: 'Authorization Endpiont', + redirect_uri: 'Redirect URI', + post_sign_out_redirect_uri: 'Post Sign Out Redirect URI', + add_another: 'Add another', + id_token_expiration: 'ID Token Expiration', + refresh_token_expiration: 'Refresh Token Expiration', + token_endpoint: 'Token Endpoint', + user_info_endpoint: 'User Info Endpoint', + save_changes: 'Save Changes', }, api_resources: { title: 'API Resources',