0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-03-17 22:31:28 -05:00

feat(console): add tenant deletion card and delete modal (#4016)

This commit is contained in:
Darcy Ye 2023-06-12 11:48:07 +08:00 committed by GitHub
parent 048c5cdb09
commit d2f7c94167
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
37 changed files with 446 additions and 3 deletions

View file

@ -1,3 +1,4 @@
import type { AdminConsoleKey } from '@logto/phrases';
import type { ReactNode } from 'react';
import { useState } from 'react';
@ -13,6 +14,8 @@ type Props = {
className?: string;
onCancel: () => void;
onConfirm: () => void;
title?: AdminConsoleKey;
confirmButtonText?: AdminConsoleKey;
};
function DeleteConfirmModal({
@ -24,6 +27,8 @@ function DeleteConfirmModal({
className,
onCancel,
onConfirm,
title,
confirmButtonText,
}: Props) {
const [input, setInput] = useState('');
const isConfirmBlocked = Boolean(expectedInput) && input !== expectedInput;
@ -33,8 +38,9 @@ function DeleteConfirmModal({
isOpen={isOpen}
isLoading={isLoading}
isConfirmButtonDisabled={isConfirmBlocked}
confirmButtonText="general.delete"
confirmButtonText={confirmButtonText ?? 'general.delete'}
className={className}
title={title}
onCancel={onCancel}
onConfirm={onConfirm}
>

View file

@ -0,0 +1,15 @@
@use '@/scss/underscore' as _;
.deletionButtonContainer {
display: flex;
align-items: center;
border: 1px solid var(--color-divider);
border-radius: _.unit(2);
padding: _.unit(4);
.description {
flex: 1;
margin-right: _.unit(2);
font: var(--font-body-2);
}
}

View file

@ -0,0 +1,37 @@
import { adminTenantId, defaultTenantId } from '@logto/schemas';
import { useTranslation } from 'react-i18next';
import Button from '@/components/Button';
import FormCard from '@/components/FormCard';
import FormField from '@/components/FormField';
import * as styles from './index.module.scss';
type Props = {
currentTenantId: string;
onClick: () => void;
};
function DeleteCard({ currentTenantId, onClick }: Props) {
const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' });
return (
<FormCard title="tenant_settings.deletion_card.title">
<FormField title="tenant_settings.deletion_card.tenant_deletion">
<div className={styles.deletionButtonContainer}>
<div className={styles.description}>
{t('tenant_settings.deletion_card.tenant_deletion_description')}
</div>
<Button
type="default"
title="tenant_settings.deletion_card.tenant_deletion_button"
disabled={[adminTenantId, defaultTenantId].includes(currentTenantId)}
onClick={onClick}
/>
</div>
</FormField>
</FormCard>
);
}
export default DeleteCard;

View file

@ -0,0 +1,27 @@
@use '@/scss/underscore' as _;
.deleteConfirmModal {
> :not(:first-child) {
margin-top: _.unit(6);
}
.content {
> p {
margin-bottom: _.unit(5);
}
}
.description {
gap: _.unit(2);
font: var(--font-body-2);
}
.bold {
font: var(--font-title-3);
}
.highlight {
font: var(--font-label-2);
color: var(--color-primary-80);
}
}

View file

@ -0,0 +1,64 @@
import { type TenantInfo } from '@logto/schemas';
import classNames from 'classnames';
import { useTranslation, Trans } from 'react-i18next';
import DeleteConfirmModal from '@/components/DeleteConfirmModal';
import TextLink from '@/components/TextLink';
import { contactEmailLink } from '@/consts';
import * as styles from './index.module.scss';
type Props = {
isOpen: boolean;
isLoading: boolean;
onClose: () => void;
onDelete: () => void;
tenant: Pick<TenantInfo, 'name' | 'tag'>;
};
function DeleteModal({ isOpen, isLoading, onClose, onDelete, tenant }: Props) {
const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' });
const { name, tag } = tenant;
return (
<DeleteConfirmModal
isOpen={isOpen}
isLoading={isLoading}
expectedInput={name}
inputPlaceholder={name}
className={styles.deleteConfirmModal}
title="tenants.delete_modal.title"
confirmButtonText="tenants.delete_modal.delete_button"
onCancel={onClose}
onConfirm={onDelete}
>
<div className={classNames(styles.description, styles.content)}>
<p>
<Trans components={{ span: <span className={styles.bold} /> }}>
{t('tenants.delete_modal.description_line1', {
name,
tag,
})}
</Trans>
</p>
<p>
<Trans
components={{
span: <span className={styles.highlight} />,
a: <TextLink href={contactEmailLink} target="_blank" />,
}}
>
{t('tenants.delete_modal.description_line2')}
</Trans>
</p>
<p>
<Trans components={{ span: <span className={styles.bold} /> }}>
{t('tenants.delete_modal.description_line3', { name })}
</Trans>
</p>
</div>
</DeleteConfirmModal>
);
}
export default DeleteModal;

View file

@ -10,6 +10,8 @@ import SubmitFormChangesActionBar from '@/components/SubmitFormChangesActionBar'
import UnsavedChangesAlertModal from '@/components/UnsavedChangesAlertModal';
import useTenants from '@/hooks/use-tenants';
import DeleteCard from './DeleteCard';
import DeleteModal from './DeleteModal';
import ProfileForm from './ProfileForm';
import * as styles from './index.module.scss';
import { type TenantSettingsForm } from './types.js';
@ -22,8 +24,11 @@ function TenantBasicSettings() {
error: requestError,
mutate,
isLoading,
tenants,
} = useTenants();
const [error, setError] = useState<Error>();
const [isDeletionModalOpen, setIsDeletionModalOpen] = useState(false);
const [isDeleting, setIsDeleting] = useState(false);
useEffect(() => {
if (requestError) {
@ -33,6 +38,7 @@ function TenantBasicSettings() {
const methods = useForm<TenantSettingsForm>();
const {
watch,
reset,
handleSubmit,
formState: { isDirty, isSubmitting },
@ -72,6 +78,34 @@ function TenantBasicSettings() {
await saveData({ name, tag });
});
const onClickDeletionButton = () => {
setIsDeletionModalOpen(true);
};
const onDelete = async () => {
if (isDeleting) {
return;
}
setIsDeleting(true);
try {
await cloudApi.delete(`/api/tenants/${currentTenantId}`);
setIsDeletionModalOpen(false);
await mutate();
if (tenants?.[0]?.id) {
window.open(new URL(`/${tenants[0].id}`, window.location.origin).toString(), '_self');
}
} catch (error: unknown) {
setError(
error instanceof Error
? error
: new Error(JSON.stringify(error, Object.getOwnPropertyNames(error)))
);
} finally {
setIsDeleting(false);
}
};
if (isLoading) {
return <AppLoading />;
}
@ -87,6 +121,7 @@ function TenantBasicSettings() {
<FormProvider {...methods}>
<div className={styles.fields}>
<ProfileForm currentTenantId={currentTenantId} />
<DeleteCard currentTenantId={currentTenantId} onClick={onClickDeletionButton} />
</div>
</FormProvider>
<SubmitFormChangesActionBar
@ -96,6 +131,15 @@ function TenantBasicSettings() {
onSubmit={onSubmit}
/>
<UnsavedChangesAlertModal hasUnsavedChanges={isDirty} />
<DeleteModal
isOpen={isDeletionModalOpen}
isLoading={isDeleting}
tenant={watch('profile')}
onClose={() => {
setIsDeletionModalOpen(false);
}}
onDelete={onDelete}
/>
</form>
</>
);

View file

@ -1,5 +1,5 @@
import { type PatchTenant } from '@logto/schemas';
import { type TenantInfo } from '@logto/schemas';
export type TenantSettingsForm = {
profile: Required<PatchTenant>;
profile: Pick<TenantInfo, 'name' | 'tag'>;
};

View file

@ -17,6 +17,13 @@ const tenant_settings = {
environment_tag_staging: 'Inszenierung',
environment_tag_production: 'Produktion',
},
deletion_card: {
title: 'LÖSCHEN',
tenant_deletion: 'Mieter löschen',
tenant_deletion_description:
'Wenn Sie Ihr Konto löschen, werden alle persönlichen Informationen, Benutzerdaten und Konfigurationen entfernt. Dieser Vorgang kann nicht rückgängig gemacht werden.',
tenant_deletion_button: 'Mieter löschen',
},
};
export default tenant_settings;

View file

@ -12,6 +12,16 @@ const tenants = {
environment_tag_staging: 'Staging',
environment_tag_production: 'Produktion',
},
delete_modal: {
title: 'Mieter löschen',
description_line1:
'Möchten Sie Ihren Mieter "<span>{{name}}</span>" mit Umgebungssuffix-Tag "<span>{{tag}}</span>" wirklich löschen? Der Vorgang kann nicht rückgängig gemacht werden und führt zur dauerhaften Löschung aller Ihrer Daten und Kontoinformationen.',
description_line2:
'Bevor Sie Ihr Konto löschen, können wir Ihnen vielleicht helfen. <span><a>Kontaktieren Sie uns per E-Mail</a></span>',
description_line3:
'Wenn Sie fortfahren möchten, geben Sie bitte den Mieter-Namen "<span>{{name}}</span>" zur Bestätigung ein.',
delete_button: 'Dauerhaft löschen',
},
tenant_created: "Mieter '{{name}}' erfolgreich erstellt.",
};

View file

@ -17,6 +17,13 @@ const tenant_settings = {
environment_tag_staging: 'Staging',
environment_tag_production: 'Production',
},
deletion_card: {
title: 'DELETE',
tenant_deletion: 'Delete tenant',
tenant_deletion_description:
'Deleting your account will remove all of your personal information, user data, and configuration. This action cannot be undone.',
tenant_deletion_button: 'Delete tenant',
},
};
export default tenant_settings;

View file

@ -12,6 +12,16 @@ const tenants = {
environment_tag_staging: 'Staging',
environment_tag_production: 'Production',
},
delete_modal: {
title: 'Delete tenant',
description_line1:
'Are you sure you want to delete your tenant "<span>{{name}}</span>" with environment suffix tag "<span>{{tag}}</span>"? This action cannot be undo, and will result in the permanent deletion of all your data and account information.',
description_line2:
'Before deleting account, maybe we can help you. <span><a>Contact us via Email</a></span>',
description_line3:
'If you would like to proceed, please enter the tenant name "<span>{{name}}</span>" to confirm.',
delete_button: 'Permanently delete',
},
tenant_created: "Tenant '{{name}}' created successfully.",
};

View file

@ -17,6 +17,13 @@ const tenant_settings = {
environment_tag_staging: 'Puesta en escena',
environment_tag_production: 'Producción',
},
deletion_card: {
title: 'ELIMINAR',
tenant_deletion: 'Eliminar inquilino',
tenant_deletion_description:
'La eliminación de su cuenta eliminará toda su información personal, datos de usuario y configuración. Esta acción no se puede deshacer.',
tenant_deletion_button: 'Eliminar inquilino',
},
};
export default tenant_settings;

View file

@ -12,6 +12,16 @@ const tenants = {
environment_tag_staging: 'Puesta en escena',
environment_tag_production: 'Producción',
},
delete_modal: {
title: 'Eliminar inquilino',
description_line1:
'¿Está seguro de que desea eliminar su inquilino "<span>{{name}}</span>" con etiqueta de sufijo de entorno"<span>{{tag}}</span>"? Esta acción no se puede deshacer y resultará en la eliminación permanente de todos sus datos e información de cuenta.',
description_line2:
'Antes de eliminar la cuenta, quizás podamos ayudarlo. <span><a>Contáctenos por correo electrónico</a></span>',
description_line3:
'Si desea continuar, ingrese el nombre del inquilino "<span>{{name}}</span>" para confirmar.',
delete_button: 'Eliminar permanentemente',
},
tenant_created: "El inquilino '{{name}}' se ha creado correctamente.",
};

View file

@ -17,6 +17,13 @@ const tenant_settings = {
environment_tag_staging: 'Mise en scène',
environment_tag_production: 'Production',
},
deletion_card: {
title: 'SUPPRIMER',
tenant_deletion: 'Supprimer le locataire',
tenant_deletion_description:
"La suppression de votre compte entraînera la suppression de toutes vos informations personnelles, données d'utilisateur et configuration. Cette action est irréversible.",
tenant_deletion_button: 'Supprimer le locataire',
},
};
export default tenant_settings;

View file

@ -12,6 +12,16 @@ const tenants = {
environment_tag_staging: 'Mise en scène',
environment_tag_production: 'Production',
},
delete_modal: {
title: 'Supprimer le locataire',
description_line1:
'Voulez-vous vraiment supprimer votre locataire "<span>{{name}}</span>" avec le tag de suffixe d\'environnement "<span>{{tag}}</span>" ? Cette action est irréversible et entraînera la suppression permanente de toutes vos données et informations de compte.',
description_line2:
'Avant de supprimer le compte, peut-être pouvons-nous vous aider. <span><a>Contactez-nous par e-mail</a></span>',
description_line3:
'Si vous souhaitez continuer, veuillez entrer le nom du locataire "<span>{{name}}</span>" pour confirmer.',
delete_button: 'Supprimer définitivement',
},
tenant_created: "Locataire '{{name}}' créé avec succès.",
};

View file

@ -17,6 +17,13 @@ const tenant_settings = {
environment_tag_staging: 'Staging',
environment_tag_production: 'Produzione',
},
deletion_card: {
title: 'ELIMINA',
tenant_deletion: 'Elimina tenant',
tenant_deletion_description:
"L'eliminazione del tuo account rimuoverà tutte le tue informazioni personali, i dati dell'utente e la configurazione. Questa azione non può essere annullata.",
tenant_deletion_button: 'Elimina tenant',
},
};
export default tenant_settings;

View file

@ -12,6 +12,16 @@ const tenants = {
environment_tag_staging: 'Sperimentale',
environment_tag_production: 'Produzione',
},
delete_modal: {
title: 'Elimina tenant',
description_line1:
'Sei sicuro di voler eliminare il tuo tenant "<span>{{name}}</span>" con il tag di suffisso dell\'ambiente "<span>{{tag}}</span>"? Questa azione non può essere annullata e comporterà l\'eliminazione permanente di tutti i tuoi dati e le informazioni dell\'account.',
description_line2:
"Prima di eliminare l'account, forse possiamo aiutarti. <span><a>Contattaci via e-mail</a></span>",
description_line3:
'Se vuoi procedere, inserisci il nome del tenant "<span>{{name}}</span>" per confermare.',
delete_button: 'Elimina definitivamente',
},
tenant_created: "Tenant '{{name}}' creato con successo.",
};

View file

@ -17,6 +17,13 @@ const tenant_settings = {
environment_tag_staging: 'ステージング',
environment_tag_production: 'プロダクション',
},
deletion_card: {
title: '削除',
tenant_deletion: 'テナントの削除',
tenant_deletion_description:
'アカウントを削除すると、すべての個人情報、ユーザーデータ、および構成が削除されます。この操作は元に戻すことはできません。',
tenant_deletion_button: 'テナントを削除する',
},
};
export default tenant_settings;

View file

@ -12,6 +12,16 @@ const tenants = {
environment_tag_staging: 'ステージング',
environment_tag_production: 'プロダクション',
},
delete_modal: {
title: 'テナントを削除します',
description_line1:
'"<span>{{name}}</span>" というテナント ("<span>{{tag}}</span>" の環境タグを持つ) を削除してもよろしいですか? このアクションは元に戻せません。これにより、すべてのデータとアカウント情報が永久に削除されます。',
description_line2:
'アカウントの削除前に、お手伝いできるかもしれません。 <span><a>メールでお問い合わせください</a></span>。',
description_line3:
'続行する場合は、テナント名 "<span>{{name}}</span>" を入力して確認してください。',
delete_button: '完全に削除する',
},
tenant_created: "{{name}}'のテナントが正常に作成されました。",
};

View file

@ -16,6 +16,13 @@ const tenant_settings = {
environment_tag_staging: '스테이징',
environment_tag_production: '프로덕션',
},
deletion_card: {
title: '삭제',
tenant_deletion: '테넌트 삭제',
tenant_deletion_description:
'계정을 삭제하면 개인 정보, 사용자 데이터 및 구성이 모두 제거됩니다. 이 작업은 실행 취소할 수 없습니다.',
tenant_deletion_button: '테넌트 삭제',
},
};
export default tenant_settings;

View file

@ -12,6 +12,16 @@ const tenants = {
environment_tag_staging: '스테이징',
environment_tag_production: '프로덕션',
},
delete_modal: {
title: '테넌트 삭제',
description_line1:
'환경 접미사 "<span>{{tag}}</span>"이(가) 붙은 "<span>{{name}}</span>" 테넌트를 삭제하시겠습니까? 이 작업은 실행 취소할 수 없으며, 모든 데이터 및 계정 정보가 영구적으로 삭제됩니다.',
description_line2:
'계정을 삭제하기 전에 도움이 필요할 수 있습니다. <span><a>이메일로 연락</a></span>해주시면 도움을 드리겠습니다.',
description_line3:
'삭제하려는 테넌트 이름 "<span>{{name}}</span>"을(를) 입력하여 확인하십시오.',
delete_button: '영구 삭제',
},
tenant_created: "테넌트 '{{name}}'가(이) 성공적으로 만들어졌습니다.",
};

View file

@ -17,6 +17,13 @@ const tenant_settings = {
environment_tag_staging: 'Staging',
environment_tag_production: 'Produkcja',
},
deletion_card: {
title: 'USUWANIE',
tenant_deletion: 'Usuń najemcę',
tenant_deletion_description:
'Usunięcie twojego konta spowoduje usunięcie wszystkich twoich danych osobowych, danych użytkownika i konfiguracji. Ta operacja jest nieodwracalna.',
tenant_deletion_button: 'Usuń najemcę',
},
};
export default tenant_settings;

View file

@ -12,6 +12,16 @@ const tenants = {
environment_tag_staging: 'Staging',
environment_tag_production: 'Produkcja',
},
delete_modal: {
title: 'Usuń najemcę',
description_line1:
'Czy na pewno chcesz usunąć najemcę "<span>{{name}}</span>" z tagiem sufiksu środowiska "<span>{{tag}}</span>"? Ta operacja jest nieodwracalna i spowoduje trwałe usunięcie wszystkich twoich danych i informacji konta.',
description_line2:
'Przed usunięciem konta, może chcemy Ci pomóc. <span><a>Skontaktuj się z nami przez e-mail</a></span>',
description_line3:
'Jeśli chcesz kontynuować, wprowadź nazwę najemcy "<span>{{name}}</span>" w celu potwierdzenia.',
delete_button: 'Usuń na stałe',
},
tenant_created: "Najemca '{{name}}' utworzony pomyślnie.",
};

View file

@ -17,6 +17,13 @@ const tenant_settings = {
environment_tag_staging: 'Teste',
environment_tag_production: 'Produção',
},
deletion_card: {
title: 'EXCLUIR',
tenant_deletion: 'Excluir locatário',
tenant_deletion_description:
'A exclusão da sua conta removerá todas as suas informações pessoais, dados de usuário e configurações. Essa ação não pode ser desfeita.',
tenant_deletion_button: 'Excluir locatário',
},
};
export default tenant_settings;

View file

@ -12,6 +12,16 @@ const tenants = {
environment_tag_staging: 'Staging',
environment_tag_production: 'Produção',
},
delete_modal: {
title: 'Excluir locatário',
description_line1:
'Tem certeza que deseja excluir seu locatário "<span>{{name}}</span>" com a etiqueta de sufixo de ambiente "<span>{{tag}}</span>"? Esta ação não pode ser desfeita e resultará na exclusão permanente de todos os seus dados e informações de conta.',
description_line2:
'Antes de excluir a conta, podemos ajudá-lo. <span><a>Entre em contato conosco por e-mail</a></span>',
description_line3:
'Se você deseja continuar, digite o nome do locatário "<span>{{name}}</span>" para confirmar.',
delete_button: 'Excluir permanentemente',
},
tenant_created: "Inquilino '{{name}}' criado com sucesso.",
};

View file

@ -17,6 +17,13 @@ const tenant_settings = {
environment_tag_staging: 'Staging',
environment_tag_production: 'Produção',
},
deletion_card: {
title: 'ELIMINAR',
tenant_deletion: 'Eliminar inquilino',
tenant_deletion_description:
'A eliminação da sua conta removerá todas as suas informações pessoais, dados de utilizador e configuração. Esta ação não pode ser desfeita.',
tenant_deletion_button: 'Eliminar inquilino',
},
};
export default tenant_settings;

View file

@ -12,6 +12,16 @@ const tenants = {
environment_tag_staging: 'Staging',
environment_tag_production: 'Produção',
},
delete_modal: {
title: 'Eliminar inquilino',
description_line1:
'Tem a certeza de que pretende eliminar o seu inquilino "<span>{{name}}</span>" com a etiqueta de sufixo de ambiente "<span>{{tag}}</span>"? Esta ação não pode ser desfeita e resultará na eliminação permanente de todos os seus dados e informações da conta.',
description_line2:
'Antes de eliminar a conta, podemos ajudá-lo. <span><a>Contacte-nos por email</a></span>',
description_line3:
'Se desejar continuar, introduza o nome do inquilino "<span>{{name}}</span>" para confirmar.',
delete_button: 'Eliminar permanentemente',
},
tenant_created: "Inquilino '{{name}}' criado com sucesso.",
};

View file

@ -17,6 +17,13 @@ const tenant_settings = {
environment_tag_staging: 'Стадия',
environment_tag_production: 'Производство',
},
deletion_card: {
title: 'УДАЛИТЬ',
tenant_deletion: 'Удаление арендатора',
tenant_deletion_description:
'Удаление вашей учетной записи приведет к удалению всех ваших личных данных, данных пользователя и настроек. Это действие нельзя отменить.',
tenant_deletion_button: 'Удалить арендатора',
},
};
export default tenant_settings;

View file

@ -12,6 +12,16 @@ const tenants = {
environment_tag_staging: 'Стадия',
environment_tag_production: 'Производство',
},
delete_modal: {
title: 'Удалить арендатора',
description_line1:
'Вы уверены, что хотите удалить своего арендатора "<span>{{name}}</span>" с меткой суффикса окружения "<span>{{tag}}</span>"? Это действие нельзя отменить, и приведет к безвозвратному удалению всех ваших данных и информации об учетной записи.',
description_line2:
'Перед удалением учетной записи мы можем вам помочь. <span><a>Свяжитесь с нами по электронной почте</a></span>',
description_line3:
'Если вы хотите продолжить, введите название арендатора "<span>{{name}}</span>" для подтверждения.',
delete_button: 'Навсегда удалить',
},
tenant_created: "Арендатор '{{name}}' успешно создан.",
};

View file

@ -17,6 +17,13 @@ const tenant_settings = {
environment_tag_staging: 'Staging',
environment_tag_production: 'Üretim',
},
deletion_card: {
title: 'SİL',
tenant_deletion: 'Kiracıyı Sil',
tenant_deletion_description:
'Hesabınızı silmek, tüm kişisel bilgilerinizi, kullanıcı verilerinizi ve yapılandırmalarınızı kaldıracaktır. Bu işlem geri alınamaz.',
tenant_deletion_button: 'Kiracıyı Sil',
},
};
export default tenant_settings;

View file

@ -12,6 +12,16 @@ const tenants = {
environment_tag_staging: 'Daha Yüksek Birlik',
environment_tag_production: 'Üretim',
},
delete_modal: {
title: 'Kiracıyı Sil',
description_line1:
'Ortam etiketi "<span>{{tag}}</span>" olan "<span>{{name}}</span>" kiracınızı silmek istediğinizden emin misiniz? Bu işlem geri alınamaz ve tüm verilerinizin ve hesap bilgilerinizin kalıcı olarak silinmesine neden olur.',
description_line2:
'Hesabınızı silmeden önce size yardımcı olabiliriz. <span><a>E-posta yoluyla bize ulaşın</a></span>',
description_line3:
'Devam etmek isterseniz, "<span>{{name}}</span>" kiracı adını onaylamak için yazın.',
delete_button: 'Kalıcı olarak sil',
},
tenant_created: "Kiracı '{{name}}' başarıyla oluşturuldu.",
};

View file

@ -15,6 +15,12 @@ const tenant_settings = {
environment_tag_staging: '暂存',
environment_tag_production: '生产',
},
deletion_card: {
title: '删除',
tenant_deletion: '删除租户',
tenant_deletion_description: '删除帐户将删除所有个人信息,用户数据和配置。此操作无法撤消。',
tenant_deletion_button: '删除租户',
},
};
export default tenant_settings;

View file

@ -11,6 +11,15 @@ const tenants = {
environment_tag_staging: '暂存环境',
environment_tag_production: '生产环境',
},
delete_modal: {
title: '删除租户',
description_line1:
'您确定要删除 "<span>{{name}}</span>" 的环境标识符为"<span>{{tag}}</span>"的租户吗? 此操作无法撤消,并将导致永久删除所有数据和帐户信息。',
description_line2:
'在删除帐户之前,也许我们可以帮助您。<span><a>通过电子邮件联系我们</a></span>',
description_line3: '如果你想继续,请输入租户名 "<span>{{name}}</span>" 确认。',
delete_button: '永久删除',
},
tenant_created: "租户'{{name}}'创建成功。",
};

View file

@ -16,6 +16,12 @@ const tenant_settings = {
environment_tag_staging: '暂存',
environment_tag_production: '生产',
},
deletion_card: {
title: '刪除',
tenant_deletion: '刪除租戶',
tenant_deletion_description: '刪除您的帳戶將刪除所有個人信息、用戶數據和配置。此操作無法撤銷。',
tenant_deletion_button: '刪除租戶',
},
};
export default tenant_settings;

View file

@ -11,6 +11,15 @@ const tenants = {
environment_tag_staging: '測試',
environment_tag_production: '生產',
},
delete_modal: {
title: '刪除租戶',
description_line1:
'您確定要刪除帶有環境標記 "<span>{{tag}}</span>" 的 "<span>{{name}}</span>" 租戶嗎?此操作無法撤銷,且會永久刪除您的所有數據和帳戶信息。',
description_line2:
'在刪除帳戶之前,也許我們可以為您提供幫助。<span><a>通過電子郵件與我們聯繫</a></span>',
description_line3: '如果您確定要繼續,請輸入租戶名稱 "<span>{{name}}</span>" 以進行確認。',
delete_button: '永久刪除',
},
tenant_created: '成功創建租戶「{{name}}」。',
};

View file

@ -15,6 +15,13 @@ const tenant_settings = {
environment_tag_staging: '暫存',
environment_tag_production: '生產',
},
deletion_card: {
title: '刪除',
tenant_deletion: '刪除租戶',
tenant_deletion_description:
'刪除您的帳戶將刪除所有個人資訊、使用者資料和配置。這個動作是無法撤銷的。',
tenant_deletion_button: '刪除租戶',
},
};
export default tenant_settings;

View file

@ -11,6 +11,15 @@ const tenants = {
environment_tag_staging: '測試',
environment_tag_production: '生產',
},
delete_modal: {
title: '刪除租戶',
description_line1:
'您是否確定要刪除具有環境後綴標籤 "<span>{{tag}}</span>" 的租戶 "<span>{{name}}</span>"?這個動作是無法撤銷的,並會永久刪除您的所有資料和帳戶資訊。',
description_line2:
'在刪除帳戶之前,也許我們能提供幫助。<span><a>通過電子郵件與我們聯繫</a></span>',
description_line3: '如果您確定要繼續,請輸入租戶名稱 "<span>{{name}}</span>" 以確認。',
delete_button: '永久刪除',
},
tenant_created: "租戶 '{{name}}' 成功建立。",
};