diff --git a/packages/frontend/src/components/MkFolder.vue b/packages/frontend/src/components/MkFolder.vue
index f805be7b57..79676e8354 100644
--- a/packages/frontend/src/components/MkFolder.vue
+++ b/packages/frontend/src/components/MkFolder.vue
@@ -41,6 +41,9 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+
+
@@ -56,9 +59,11 @@ import { defaultStore } from '@/store.js';
const props = withDefaults(defineProps<{
defaultOpen?: boolean;
maxHeight?: number | null;
+ withFooter?: boolean;
}>(), {
defaultOpen: false,
maxHeight: null,
+ withFooter: false
});
const getBgColor = (el: HTMLElement) => {
@@ -224,4 +229,17 @@ onMounted(() => {
background: var(--bg);
}
}
+
+.footer {
+ position: sticky !important;
+ z-index: 1;
+ bottom: var(--stickyBottom, 0px);
+ left: 0;
+ padding: 9px 12px;
+ border-top: solid 0.5px var(--divider);
+ background: var(--acrylicBg);
+ -webkit-backdrop-filter: var(--blur, blur(15px));
+ backdrop-filter: var(--blur, blur(15px));
+ border-radius: 0 0 6px 6px;
+}
diff --git a/packages/frontend/src/pages/admin/settings.vue b/packages/frontend/src/pages/admin/settings.vue
index 6eaafed6df..1e9682775a 100644
--- a/packages/frontend/src/pages/admin/settings.vue
+++ b/packages/frontend/src/pages/admin/settings.vue
@@ -10,71 +10,93 @@ SPDX-License-Identifier: AGPL-3.0-only
-
- {{ i18n.ts.instanceName }}
-
+
+
+ {{ i18n.ts.info }}
+
+ {{ i18n.ts.save }}
+
-
- {{ i18n.ts._serverSettings.shortName }} ({{ i18n.ts.optional }})
- {{ i18n.ts._serverSettings.shortNameDescription }}
-
+
+
+ {{ i18n.ts.instanceName }}
+
-
- {{ i18n.ts.instanceDescription }}
-
+
+ {{ i18n.ts._serverSettings.shortName }} ({{ i18n.ts.optional }})
+ {{ i18n.ts._serverSettings.shortNameDescription }}
+
-
-
- {{ i18n.ts.maintainerName }}
-
+
+ {{ i18n.ts.instanceDescription }}
+
-
-
- {{ i18n.ts.maintainerEmail }}
-
-
+
+
+ {{ i18n.ts.maintainerName }}
+
-
-
- {{ i18n.ts.tosUrl }}
-
+
+
+ {{ i18n.ts.maintainerEmail }}
+
+
-
-
- {{ i18n.ts.privacyPolicyUrl }}
-
+
+
+ {{ i18n.ts.tosUrl }}
+
-
-
- {{ i18n.ts._serverSettings.inquiryUrl }}
- {{ i18n.ts._serverSettings.inquiryUrlDescription }}
-
+
+
+ {{ i18n.ts.privacyPolicyUrl }}
+
-
- {{ i18n.ts.repositoryUrl }}
-
- {{ i18n.ts.repositoryUrlDescription }}
-
+
+
+ {{ i18n.ts._serverSettings.inquiryUrl }}
+ {{ i18n.ts._serverSettings.inquiryUrlDescription }}
+
-
- {{ i18n.ts.repositoryUrlOrTarballRequired }}
-
+
+ {{ i18n.ts.repositoryUrl }}
+
+ {{ i18n.ts.repositoryUrlDescription }}
+
-
- {{ i18n.ts.impressumUrl }}
-
- {{ i18n.ts.impressumDescription }}
-
+
+ {{ i18n.ts.repositoryUrlOrTarballRequired }}
+
-
+
+ {{ i18n.ts.impressumUrl }}
+
+ {{ i18n.ts.impressumDescription }}
+
+
+
+
+
+
{{ i18n.ts.pinnedUsers }}
- {{ i18n.ts.pinnedUsersDescription }}
-
+
+ {{ i18n.ts.save }}
+
-
+
+ {{ i18n.ts.pinnedUsers }}
+ {{ i18n.ts.pinnedUsersDescription }}
+
+
+
+
+
{{ i18n.ts.files }}
+
+ {{ i18n.ts.save }}
+
-
+
{{ i18n.ts.cacheRemoteFiles }}
{{ i18n.ts.cacheRemoteFilesDescription }}{{ i18n.ts.youCanCleanRemoteFilesCache }}
@@ -87,12 +109,16 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
-
+
+
ServiceWorker
+
+ {{ i18n.ts.save }}
+
-
+
{{ i18n.ts.enableServiceworker }}
{{ i18n.ts.serviceworkerInfo }}
@@ -110,12 +136,16 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
-
+
+
{{ i18n.ts._ad.adsSettings }}
+
+ {{ i18n.ts.save }}
+
-
+
{{ i18n.ts._ad.notesPerOneAd }}
@@ -126,12 +156,16 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
-
+
+
{{ i18n.ts._urlPreviewSetting.title }}
+
+ {{ i18n.ts.save }}
+
-
+
{{ i18n.ts._urlPreviewSetting.enable }}
@@ -173,17 +207,10 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
-
-
-
- {{ i18n.ts.save }}
-
-
-
@@ -195,7 +222,6 @@ import MkSwitch from '@/components/MkSwitch.vue';
import MkInput from '@/components/MkInput.vue';
import MkTextarea from '@/components/MkTextarea.vue';
import MkInfo from '@/components/MkInfo.vue';
-import FormSection from '@/components/form/section.vue';
import FormSplit from '@/components/form/split.vue';
import FormSuspense from '@/components/form/suspense.vue';
import * as os from '@/os.js';
@@ -258,8 +284,8 @@ async function init(): Promise {
urlPreviewSummaryProxyUrl.value = meta.urlPreviewSummaryProxyUrl;
}
-async function save() {
- await os.apiWithDialog('admin/update-meta', {
+function saveInfo() {
+ os.apiWithDialog('admin/update-meta', {
name: name.value,
shortName: shortName.value === '' ? null : shortName.value,
description: description.value,
@@ -270,22 +296,57 @@ async function save() {
inquiryUrl: inquiryUrl.value,
repositoryUrl: repositoryUrl.value,
impressumUrl: impressumUrl.value,
+ }).then(() => {
+ fetchInstance(true);
+ });
+}
+
+function save_pinnedUsers() {
+ os.apiWithDialog('admin/update-meta', {
pinnedUsers: pinnedUsers.value.split('\n'),
+ }).then(() => {
+ fetchInstance(true);
+ });
+}
+
+function saveFiles() {
+ os.apiWithDialog('admin/update-meta', {
cacheRemoteFiles: cacheRemoteFiles.value,
cacheRemoteSensitiveFiles: cacheRemoteSensitiveFiles.value,
+ }).then(() => {
+ fetchInstance(true);
+ });
+}
+
+function saveServiceWorker() {
+ os.apiWithDialog('admin/update-meta', {
enableServiceWorker: enableServiceWorker.value,
swPublicKey: swPublicKey.value,
swPrivateKey: swPrivateKey.value,
+ }).then(() => {
+ fetchInstance(true);
+ });
+}
+
+function saveAd() {
+ os.apiWithDialog('admin/update-meta', {
notesPerOneAd: notesPerOneAd.value,
+ }).then(() => {
+ fetchInstance(true);
+ });
+}
+
+function saveUrlPreview() {
+ os.apiWithDialog('admin/update-meta', {
urlPreviewEnabled: urlPreviewEnabled.value,
urlPreviewTimeout: urlPreviewTimeout.value,
urlPreviewMaximumContentLength: urlPreviewMaximumContentLength.value,
urlPreviewRequireContentLength: urlPreviewRequireContentLength.value,
urlPreviewUserAgent: urlPreviewUserAgent.value,
urlPreviewSummaryProxyUrl: urlPreviewSummaryProxyUrl.value,
+ }).then(() => {
+ fetchInstance(true);
});
-
- fetchInstance(true);
}
const headerTabs = computed(() => []);
@@ -297,11 +358,6 @@ definePageMetadata(() => ({