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:
parent
048c5cdb09
commit
d2f7c94167
37 changed files with 446 additions and 3 deletions
|
@ -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}
|
||||
>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
|
@ -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>
|
||||
</>
|
||||
);
|
||||
|
|
|
@ -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'>;
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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}}'のテナントが正常に作成されました。",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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}}'가(이) 성공적으로 만들어졌습니다.",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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}}' успешно создан.",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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}}'创建成功。",
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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}}」。',
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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}}' 成功建立。",
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue