Skip to content

Commit ff48339

Browse files
committed
Better alert message on subscription deletion/extraction
1 parent 1947a66 commit ff48339

File tree

3 files changed

+121
-35
lines changed

3 files changed

+121
-35
lines changed

daikoku/javascript/src/components/backoffice/apikeys/TeamApiKeysForApi.tsx

Lines changed: 93 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -210,27 +210,56 @@ export const ApiKeysListForApi = (props: ApiKeysListForApiProps) => {
210210
);
211211
};
212212

213-
const makeUniqueApiKey = (subscription: ISubscription) => {
214-
confirm({
215-
message: translate('team_apikey_for_api.ask_for_make_unique'),
216-
}).then((ok) => {
217-
if (ok)
218-
Services.makeUniqueApiKey(props.team._id, subscription._id).then(
219-
() => {
220-
queryClient.invalidateQueries({
221-
queryKey: ['data', 'subscriptions'],
222-
});
223-
toast.success(
224-
translate(
225-
'team_apikey_for_api.ask_for_make_unique.success_message'
226-
)
227-
);
213+
const makeUniqueApiKey = (subscription: ISubscription, details: IApiSubscriptionDetails) => {
214+
215+
openFormModal(
216+
{
217+
title: translate("apikeys.delete.confirm.modal.title"),
218+
description: <div className="alert alert-danger" role="alert">
219+
<h4 className="alert-heading">{translate('Warning')}</h4>
220+
<p>{translate('team_apikey_for_api.ask_for_make_unique')}</p>
221+
<ul>
222+
<li dangerouslySetInnerHTML={{ __html: translate({ key: 'team_apikey_for_api.ask_for_make_unique.2', replacements: [
223+
`<strong>${details.parentSubscription?.api.name}/${details.parentSubscription?.plan.customName}</strong>`
224+
]})}}></li>
225+
<li dangerouslySetInnerHTML={{
226+
__html: translate({
227+
key: 'team_apikey_for_api.ask_for_make_unique.3', replacements: [
228+
`<strong>${details.apiSubscription.api.name}/${details.apiSubscription.plan.customName}</strong>`
229+
]
230+
})}}></li>
231+
</ul>
232+
</div>,
233+
schema: {
234+
validation: {
235+
type: type.string,
236+
label: translate({ key: "apikeys.delete.confirm.label", replacements: [`${details.apiSubscription.api.name}/${subscription.customName ?? details.apiSubscription.plan.customName}`] }),
237+
constraints: [
238+
constraints.required(translate('constraints.required.value')),
239+
constraints.matches(new RegExp(`${escapeRegExp(details.apiSubscription.api.name)}/${escapeRegExp(subscription.customName) ?? escapeRegExp(details.apiSubscription.plan.customName)}`), translate('constraints.match.subscription'))
240+
],
241+
defaultValue: ""
228242
}
229-
);
230-
});
243+
},
244+
actionLabel: translate('Confirm'),
245+
onSubmit: () => Services.makeUniqueApiKey(props.team._id, subscription._id)
246+
.then(
247+
() => {
248+
queryClient.invalidateQueries({
249+
queryKey: ['data', 'subscriptions'],
250+
});
251+
toast.success(
252+
translate(
253+
'team_apikey_for_api.ask_for_make_unique.success_message'
254+
)
255+
);
256+
}
257+
)
258+
}
259+
)
231260
};
232261

233-
const deleteApiKey = (subscription: ISubscriptionWithChildren) => {
262+
const deleteApiKey = (subscription: ISubscriptionWithChildren, details: IApiSubscriptionDetails) => {
234263
const afterDeletionFunction = () => {
235264
queryClient.invalidateQueries({
236265
queryKey: ["data", "subscriptions"],
@@ -277,9 +306,32 @@ export const ApiKeysListForApi = (props: ApiKeysListForApiProps) => {
277306
description: <div className="alert alert-danger" role="alert">
278307
<h4 className="alert-heading">{translate('Warning')}</h4>
279308
<p>{translate("delete.subscription.confirm.modal.description.1")}</p>
280-
<ul>
281-
<li>{translate("delete.subscription.confirm.modal.description.2")}</li>
282-
</ul>
309+
{!details.parentSubscription && choice === 'delete' && <>
310+
<p>{translate("delete.subscription.confirm.modal.description.parent.deleteAll")}</p>
311+
<p>{translate("delete.subscription.confirm.modal.description.parent.deleteAll.list")}</p>
312+
<ul>
313+
{details.accessibleResources.map(resource => (<li>{resource.apiSubscription.api.name}/{resource.apiSubscription.plan.customName}</li>))}
314+
</ul>
315+
</>}
316+
317+
{!details.parentSubscription && choice === 'extraction' && <>
318+
<p>{translate("delete.subscription.confirm.modal.description.parent.splitChildren")}</p>
319+
<p>{translate("delete.subscription.confirm.modal.description.parent.splitChildren.list")}</p>
320+
<ul>
321+
{details.accessibleResources.map(resource => (<li>{resource.apiSubscription.api.name}/{resource.apiSubscription.plan.customName}</li>))}
322+
</ul>
323+
</>}
324+
325+
{!details.parentSubscription && choice === 'promotion' &&
326+
<p dangerouslySetInnerHTML={{
327+
__html: translate({
328+
key: "delete.subscription.confirm.modal.description.parent.promoteChild",
329+
replacements: [
330+
`<strong>${details.accessibleResources.find(r => r.apiSubscription._id === childId)?.apiSubscription.api.name}/${details.accessibleResources.find(r => r.apiSubscription._id === childId)?.apiSubscription.plan.customName}</strong>`,
331+
`<strong>${details.apiSubscription.api.name}/${details.apiSubscription.plan.customName}</strong>`
332+
]
333+
})
334+
}}></p>}
283335
</div>,
284336
schema: {
285337
validation: {
@@ -308,7 +360,19 @@ export const ApiKeysListForApi = (props: ApiKeysListForApiProps) => {
308360
<h4 className="alert-heading">{translate('Warning')}</h4>
309361
<p>{translate("delete.subscription.confirm.modal.description.1")}</p>
310362
<ul>
311-
<li>{translate("delete.subscription.confirm.modal.description.2")}</li>
363+
{!details.parentSubscription && <p>{translate("delete.subscription.confirm.modal.description.single")}</p>}
364+
{!!details.parentSubscription &&
365+
<li dangerouslySetInnerHTML={{
366+
__html:
367+
translate({
368+
key: "delete.subscription.confirm.modal.description.child",
369+
replacements: [
370+
`<strong>${details.parentSubscription.api.name
371+
} / ${details.parentSubscription.plan.customName}</strong>`,
372+
`<strong>${details.apiSubscription.api.name}/${details.apiSubscription.plan.customName}</strong>`,
373+
]
374+
})
375+
}}></li>}
312376
</ul>
313377
</div>,
314378
schema: {
@@ -475,8 +539,8 @@ export const ApiKeysListForApi = (props: ApiKeysListForApiProps) => {
475539
updateCustomName(subscription, name)
476540
}
477541
toggle={() => toggleApiKey(subscription)}
478-
makeUniqueApiKey={() => makeUniqueApiKey(subscription)}
479-
deleteApiKey={() => deleteApiKey(subscription)}
542+
makeUniqueApiKey={(details: IApiSubscriptionDetails) => makeUniqueApiKey(subscription, details)}
543+
deleteApiKey={(detail: IApiSubscriptionDetails) => deleteApiKey(subscription, detail)}
480544
toggleRotation={(
481545
plan,
482546
enabled,
@@ -516,8 +580,8 @@ type ApiKeyCardProps = {
516580
statsLink: string;
517581
apiLink: string;
518582
toggle: () => void;
519-
makeUniqueApiKey: () => void;
520-
deleteApiKey: () => void;
583+
makeUniqueApiKey: (details: IApiSubscriptionDetails) => void;
584+
deleteApiKey: (details: IApiSubscriptionDetails) => void;
521585
toggleRotation: (
522586
plan: IUsagePlan,
523587
enabled: boolean,
@@ -632,7 +696,7 @@ export const ApiKeyCard = ({
632696
}
633697
`;
634698

635-
console.debug({team: currentTeam?._id, subscription})
699+
console.debug({ team: currentTeam?._id, subscription })
636700
const detailQuery = useQuery({
637701
queryKey: ['parent', subscription._id, currentTeam?._id ?? 'no-team'],
638702
queryFn: () => customGraphQLClient.request<{ apiSubscriptionDetails: IApiSubscriptionDetails }>(API_SUBSCRIPTION_DETAIL_QUERY, {
@@ -914,13 +978,13 @@ export const ApiKeyCard = ({
914978
</span>}
915979
{subscription.parent && <span
916980
className="dropdown-item cursor-pointer danger"
917-
onClick={makeUniqueApiKey}
981+
onClick={() => makeUniqueApiKey(detailQuery.data)}
918982
>
919983
{translate("subscription.extract.button.label")}
920984
</span>}
921985
<span
922986
className="dropdown-item cursor-pointer danger"
923-
onClick={deleteApiKey}
987+
onClick={() => deleteApiKey(detailQuery.data)}
924988
>
925989
{translate("subscription.delete.button.label")}
926990
</span>

daikoku/javascript/src/locales/en/translation.json

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -955,7 +955,9 @@
955955
"disabled.due.to.aggregation.security": "disabled due to enabling of aggregation security",
956956
"I understood": "I understood",
957957
"team_apikey_for_api.make_unique": "Make unique",
958-
"team_apikey_for_api.ask_for_make_unique": "Are you sure to make this API key unique and separate from his parent plan?",
958+
"team_apikey_for_api.ask_for_make_unique": "Are you sure you want to separate this API key from the parent key and create a new one? This action is irreversible. It will result in:",
959+
"team_apikey_for_api.ask_for_make_unique.2": "Updating the parent subscription associated with the API %s.",
960+
"team_apikey_for_api.ask_for_make_unique.3": "Creating a new subscription for the API %s.",
959961
"team_apikey_for_api.ask_for_make_unique.success_message": "The API key has been successfully separated from his parent",
960962
"team_api_info.isDefault": "Use as latest version",
961963
"request_api_access": "You need to be authorized to view this API.",
@@ -1436,8 +1438,14 @@
14361438
"delete.user.confirm.modal.description.2": "All subscriptions and API keys associated with this user.",
14371439
"delete.user.confirm.modal.description.3": "All APIs managed by this user.",
14381440
"delete.user.confirm.modal.description.4": "All subscriptions to the APIs managed by this user.",
1439-
"delete.subscription.confirm.modal.description.1": "Are you sure you want to delete this subscription? This action is irreversible and will result in the deletion of:",
1440-
"delete.subscription.confirm.modal.description.2": "The API key associated with this subscription.",
1441+
"delete.subscription.confirm.modal.description.1": "Are you sure you want to delete this subscription? This action is irreversible.",
1442+
"delete.subscription.confirm.modal.description.single": "This action will permanently delete the associated API key.",
1443+
"delete.subscription.confirm.modal.description.child": "The parent API key associated with the API %s will be updated and will no longer provide access to the API %s.",
1444+
"delete.subscription.confirm.modal.description.parent.deleteAll": "All associated subscriptions and API keys will also be permanently deleted.",
1445+
"delete.subscription.confirm.modal.description.parent.deleteAll.list": "Affected subscriptions:",
1446+
"delete.subscription.confirm.modal.description.parent.promoteChild": "The subscription to %s has been designated as the new parent. Associated resources will remain unchanged except for access to %s.",
1447+
"delete.subscription.confirm.modal.description.parent.splitChildren": "Child subscriptions will become independent, and new individual API keys will be generated.",
1448+
"delete.subscription.confirm.modal.description.parent.splitChildren.list": "Newly generated subscriptions for the following resources:",
14411449
"delete.plan.confirm.modal.description.1": "Are you sure you want to delete this Plan? This action is irreversible and will result in the deletion of:",
14421450
"delete.plan.confirm.modal.description.2": "All API keys associated with this plan.",
14431451
"delete.environment.confirm.modal.description.1": "Are you sure you want to delete this environment? This action is irreversible and will result in the deletion of:",

daikoku/javascript/src/locales/fr/translation.json

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -955,7 +955,9 @@
955955
"disabled.due.to.aggregation.security": "désactivé en raison de l'activation de l'aggégation des clés",
956956
"I understood": "J'ai compris",
957957
"team_apikey_for_api.make_unique": "Rendre unique",
958-
"team_apikey_for_api.ask_for_make_unique": "Êtes-vous sûr de vouloir séparer cette clé d'API de la clé parente et d'en créer une nouvelle ?",
958+
"team_apikey_for_api.ask_for_make_unique": "Êtes-vous sûr de vouloir séparer cette clé d'API de la clé parente et d'en créer une nouvelle ? cette action est irréversible. Elle aura pour effet :",
959+
"team_apikey_for_api.ask_for_make_unique.2": "La mise à jour de la souscription parent associée à l'API %s.",
960+
"team_apikey_for_api.ask_for_make_unique.3": "La création d'une nouvelle souscription pour l'API %s.",
959961
"team_apikey_for_api.ask_for_make_unique.success_message": "La clé d'API a correctement été séparée de la clé parent.",
960962
"team_api_info.isDefault": "Utiliser comme dernière version",
961963
"request_api_access": "Vous devez être autorisé pour visualiser cette API.",
@@ -1435,8 +1437,20 @@
14351437
"delete.user.confirm.modal.description.2": "Toutes les souscriptions et clés API associées à cet utilisateur.",
14361438
"delete.user.confirm.modal.description.3": "Toutes les API gérées par cet utilisateur.",
14371439
"delete.user.confirm.modal.description.4": "Toutes les souscriptions aux API gérées par cet utilisateur.",
1438-
"delete.subscription.confirm.modal.description.1": "Êtes-vous sûr de vouloir supprimer cette souscription ? Cette action est irréversible et entraînera la suppression de :",
1439-
"delete.subscription.confirm.modal.description.2": "La clé API associée à cette souscription.",
1440+
"delete.subscription.confirm.modal.description.1": "Êtes-vous sûr de vouloir supprimer cette souscription ? Cette action est irréversible.",
1441+
1442+
"delete.subscription.confirm.modal.description.single": "Cette action entraînera la suppression définitve de la clé d'API associée.",
1443+
1444+
"delete.subscription.confirm.modal.description.child": "La clé d'API parent associé à l'API %s sera mise à jour et ne permettra plus l'accès à l'APi %s.",
1445+
1446+
"delete.subscription.confirm.modal.description.parent.deleteAll": "Toutes les souscriptions et clés API associées seront également supprimées de manière irréversible.",
1447+
"delete.subscription.confirm.modal.description.parent.deleteAll.list": "Souscriptions concernées :",
1448+
1449+
"delete.subscription.confirm.modal.description.parent.promoteChild": "La souscription à %s a été désignée comme nouveau parent. Les ressources associées resteront inchangées sauf l'access à %s.",
1450+
1451+
"delete.subscription.confirm.modal.description.parent.splitChildren": "Les souscriptions enfants deviendront autonomes et de nouvelles clés d'API individuelles seront générées.",
1452+
"delete.subscription.confirm.modal.description.parent.splitChildren.list": "Nouvelles souscriptions générées pour les ressources :",
1453+
14401454
"delete.plan.confirm.modal.description.1": "Êtes-vous sûr de vouloir supprimer ce plan ? Cette action est irréversible et entraînera la suppression de :",
14411455
"delete.plan.confirm.modal.description.2": "Toutes les clés d'API associées à ce plan.",
14421456
"delete.environment.confirm.modal.description.1": "Êtes-vous sûr de vouloir supprimer cet environnement ? Cette action est irréversible et entraînera la suppression de :",

0 commit comments

Comments
 (0)