diff --git a/apps/ui/src/routes/databases/[id]/__layout.svelte b/apps/ui/src/routes/databases/[id]/__layout.svelte
index fd4a81817..90cbe3e99 100644
--- a/apps/ui/src/routes/databases/[id]/__layout.svelte
+++ b/apps/ui/src/routes/databases/[id]/__layout.svelte
@@ -60,11 +60,9 @@
import { errorNotification, handlerNotFoundLoad } from '$lib/common';
import { appSession, status, disabledButton } from '$lib/store';
import DeleteIcon from '$lib/components/DeleteIcon.svelte';
- import Loading from '$lib/components/Loading.svelte';
import { onDestroy, onMount } from 'svelte';
const { id } = $page.params;
- let loading = false;
let statusInterval: any = false;
$disabledButton = !$appSession.isAdmin;
@@ -72,36 +70,41 @@
async function deleteDatabase() {
const sure = confirm(`Are you sure you would like to delete '${database.name}'?`);
if (sure) {
- loading = true;
+ $status.database.initialLoading = true;
try {
await del(`/databases/${database.id}`, { id: database.id });
return await goto('/databases');
} catch (error) {
return errorNotification(error);
} finally {
- loading = false;
+ $status.database.initialLoading = false;
}
}
}
async function stopDatabase() {
const sure = confirm($t('database.confirm_stop', { name: database.name }));
if (sure) {
- loading = true;
+ $status.database.initialLoading = true;
try {
await post(`/databases/${database.id}/stop`, {});
- return window.location.reload();
} catch (error) {
return errorNotification(error);
+ } finally {
+ $status.database.initialLoading = false;
}
}
}
async function startDatabase() {
- loading = true;
+ $status.database.initialLoading = true;
+ $status.database.loading = true;
try {
await post(`/databases/${database.id}/start`, {});
- return window.location.reload();
} catch (error) {
return errorNotification(error);
+ } finally {
+ $status.database.initialLoading = false;
+ $status.database.loading = false;
+ await getStatus();
}
}
async function getStatus() {
@@ -137,120 +140,36 @@
{#if id !== 'new'}
{/if}
diff --git a/apps/ui/src/routes/services/[id]/_Secret.svelte b/apps/ui/src/routes/services/[id]/_Secret.svelte
index c347dcabc..fa1f95318 100644
--- a/apps/ui/src/routes/services/[id]/_Secret.svelte
+++ b/apps/ui/src/routes/services/[id]/_Secret.svelte
@@ -1,4 +1,4 @@
-
diff --git a/apps/ui/src/routes/services/[id]/secrets.svelte b/apps/ui/src/routes/services/[id]/secrets.svelte
index 78271ca7d..a0929bf2c 100644
--- a/apps/ui/src/routes/services/[id]/secrets.svelte
+++ b/apps/ui/src/routes/services/[id]/secrets.svelte
@@ -25,14 +25,47 @@
import { page } from '$app/stores';
import { get } from '$lib/api';
import { t } from '$lib/translations';
+ import pLimit from 'p-limit';
import ServiceLinks from './_ServiceLinks.svelte';
+ import { addToast } from '$lib/store';
+ import { saveSecret } from './utils';
+ const limit = pLimit(1);
const { id } = $page.params;
+ let batchSecrets = '';
async function refreshSecrets() {
const data = await get(`/services/${id}/secrets`);
secrets = [...data.secrets];
}
+ async function getValues(e: any) {
+ e.preventDefault();
+ const eachValuePair = batchSecrets.split('\n');
+ const batchSecretsPairs = eachValuePair
+ .filter((secret) => !secret.startsWith('#') && secret)
+ .map((secret) => {
+ const [name, ...rest] = secret.split('=');
+ const value = rest.join('=');
+ const cleanValue = value?.replaceAll('"', '') || '';
+ return {
+ name,
+ value: cleanValue,
+ isNew: !secrets.find((secret: any) => name === secret.name)
+ };
+ });
+
+ await Promise.all(
+ batchSecretsPairs.map(({ name, value, isNew }) =>
+ limit(() => saveSecret({ name, value, serviceId: id, isNew }))
+ )
+ );
+ batchSecrets = '';
+ await refreshSecrets();
+ addToast({
+ message: 'Secrets saved.',
+ type: 'success'
+ });
+ }
+
Paste .env file
+
diff --git a/apps/ui/src/routes/services/[id]/utils.ts b/apps/ui/src/routes/services/[id]/utils.ts
new file mode 100644
index 000000000..bda896ed3
--- /dev/null
+++ b/apps/ui/src/routes/services/[id]/utils.ts
@@ -0,0 +1,42 @@
+import { post } from '$lib/api';
+import { t } from '$lib/translations';
+import { errorNotification } from '$lib/common';
+
+type Props = {
+ isNew: boolean;
+ name: string;
+ value: string;
+ isBuildSecret?: boolean;
+ isPRMRSecret?: boolean;
+ isNewSecret?: boolean;
+ serviceId: string;
+};
+
+export async function saveSecret({
+ isNew,
+ name,
+ value,
+ isBuildSecret,
+ isPRMRSecret,
+ isNewSecret,
+ serviceId
+}: Props): Promise {
+ if (!name) return errorNotification(`${t.get('forms.name')} ${t.get('forms.is_required')}`);
+ if (!value) return errorNotification(`${t.get('forms.value')} ${t.get('forms.is_required')}`);
+ try {
+ await post(`/services/${serviceId}/secrets`, {
+ name,
+ value,
+ isBuildSecret,
+ isPRMRSecret,
+ isNew: isNew || false
+ });
+ if (isNewSecret) {
+ name = '';
+ value = '';
+ isBuildSecret = false;
+ }
+ } catch (error) {
+ throw error
+ }
+}