mirror of
https://github.com/open-webui/open-webui
synced 2025-05-01 11:26:00 +00:00
refac: general admin settings
This commit is contained in:
parent
b99f296494
commit
ff60754091
@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { getBackendConfig, getWebhookUrl, updateWebhookUrl } from '$lib/apis';
|
import { getBackendConfig, getVersionUpdates, getWebhookUrl, updateWebhookUrl } from '$lib/apis';
|
||||||
import {
|
import {
|
||||||
getAdminConfig,
|
getAdminConfig,
|
||||||
getLdapConfig,
|
getLdapConfig,
|
||||||
@ -11,7 +11,9 @@
|
|||||||
import SensitiveInput from '$lib/components/common/SensitiveInput.svelte';
|
import SensitiveInput from '$lib/components/common/SensitiveInput.svelte';
|
||||||
import Switch from '$lib/components/common/Switch.svelte';
|
import Switch from '$lib/components/common/Switch.svelte';
|
||||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||||
import { config } from '$lib/stores';
|
import { WEBUI_BUILD_HASH, WEBUI_VERSION } from '$lib/constants';
|
||||||
|
import { config, showChangelog } from '$lib/stores';
|
||||||
|
import { compareVersion } from '$lib/utils';
|
||||||
import { onMount, getContext } from 'svelte';
|
import { onMount, getContext } from 'svelte';
|
||||||
import { toast } from 'svelte-sonner';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
@ -19,6 +21,12 @@
|
|||||||
|
|
||||||
export let saveHandler: Function;
|
export let saveHandler: Function;
|
||||||
|
|
||||||
|
let updateAvailable = null;
|
||||||
|
let version = {
|
||||||
|
current: '',
|
||||||
|
latest: ''
|
||||||
|
};
|
||||||
|
|
||||||
let adminConfig = null;
|
let adminConfig = null;
|
||||||
let webhookUrl = '';
|
let webhookUrl = '';
|
||||||
|
|
||||||
@ -39,6 +47,21 @@
|
|||||||
ciphers: ''
|
ciphers: ''
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const checkForVersionUpdates = async () => {
|
||||||
|
updateAvailable = null;
|
||||||
|
version = await getVersionUpdates(localStorage.token).catch((error) => {
|
||||||
|
return {
|
||||||
|
current: WEBUI_VERSION,
|
||||||
|
latest: WEBUI_VERSION
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(version);
|
||||||
|
|
||||||
|
updateAvailable = compareVersion(version.latest, version.current);
|
||||||
|
console.log(updateAvailable);
|
||||||
|
};
|
||||||
|
|
||||||
const updateLdapServerHandler = async () => {
|
const updateLdapServerHandler = async () => {
|
||||||
if (!ENABLE_LDAP) return;
|
if (!ENABLE_LDAP) return;
|
||||||
const res = await updateLdapServer(localStorage.token, LDAP_SERVER).catch((error) => {
|
const res = await updateLdapServer(localStorage.token, LDAP_SERVER).catch((error) => {
|
||||||
@ -63,6 +86,8 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
|
checkForVersionUpdates();
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
(async () => {
|
(async () => {
|
||||||
adminConfig = await getAdminConfig(localStorage.token);
|
adminConfig = await getAdminConfig(localStorage.token);
|
||||||
@ -87,18 +112,68 @@
|
|||||||
updateHandler();
|
updateHandler();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div class=" space-y-3 overflow-y-scroll scrollbar-hidden h-full">
|
<div class="mt-0.5 space-y-3 overflow-y-scroll scrollbar-hidden h-full">
|
||||||
{#if adminConfig !== null}
|
{#if adminConfig !== null}
|
||||||
|
<div class="">
|
||||||
|
<div class="mb-3.5">
|
||||||
|
<div class=" mb-2 text-base font-medium">{$i18n.t('General')}</div>
|
||||||
|
|
||||||
|
<hr class=" border-gray-50 dark:border-gray-850 my-2" />
|
||||||
|
|
||||||
|
<div class="">
|
||||||
|
<div class=" mb-1 text-xs font-medium flex space-x-2 items-center">
|
||||||
<div>
|
<div>
|
||||||
<div class=" mb-3 text-sm font-medium">{$i18n.t('General Settings')}</div>
|
{$i18n.t('Version')}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex w-full justify-between items-center">
|
||||||
|
<div class="flex flex-col text-xs text-gray-700 dark:text-gray-200">
|
||||||
|
<div class="flex gap-1">
|
||||||
|
<Tooltip content={WEBUI_BUILD_HASH}>
|
||||||
|
v{WEBUI_VERSION}
|
||||||
|
</Tooltip>
|
||||||
|
|
||||||
<div class=" flex w-full justify-between pr-2">
|
<a
|
||||||
<div class=" self-center text-xs font-medium">{$i18n.t('Enable New Sign Ups')}</div>
|
href="https://github.com/open-webui/open-webui/releases/tag/v{version.latest}"
|
||||||
|
target="_blank"
|
||||||
<Switch bind:state={adminConfig.ENABLE_SIGNUP} />
|
>
|
||||||
|
{updateAvailable === null
|
||||||
|
? $i18n.t('Checking for updates...')
|
||||||
|
: updateAvailable
|
||||||
|
? `(v${version.latest} ${$i18n.t('available!')})`
|
||||||
|
: $i18n.t('(latest)')}
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class=" my-3 flex w-full justify-between">
|
<button
|
||||||
|
class=" underline flex items-center space-x-1 text-xs text-gray-500 dark:text-gray-500"
|
||||||
|
type="button"
|
||||||
|
on:click={() => {
|
||||||
|
showChangelog.set(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div>{$i18n.t("See what's new")}</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button
|
||||||
|
class=" text-xs px-3 py-1.5 bg-gray-100 hover:bg-gray-200 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-lg font-medium"
|
||||||
|
on:click={() => {
|
||||||
|
checkForVersionUpdates();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{$i18n.t('Check for updates')}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<div class=" mb-2 text-base font-medium">{$i18n.t('Authentication')}</div>
|
||||||
|
|
||||||
|
<hr class=" border-gray-50 dark:border-gray-850 my-2" />
|
||||||
|
|
||||||
|
<div class=" mb-2 flex w-full justify-between">
|
||||||
<div class=" self-center text-xs font-medium">{$i18n.t('Default User Role')}</div>
|
<div class=" self-center text-xs font-medium">{$i18n.t('Default User Role')}</div>
|
||||||
<div class="flex items-center relative">
|
<div class="flex items-center relative">
|
||||||
<select
|
<select
|
||||||
@ -113,14 +188,28 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class=" flex w-full justify-between pr-2 my-3">
|
<div class=" mb-2 flex w-full justify-between pr-2">
|
||||||
|
<div class=" self-center text-xs font-medium">{$i18n.t('Enable New Sign Ups')}</div>
|
||||||
|
|
||||||
|
<Switch bind:state={adminConfig.ENABLE_SIGNUP} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-2 flex w-full items-center justify-between pr-2">
|
||||||
|
<div class=" self-center text-xs font-medium">
|
||||||
|
{$i18n.t('Show Admin Details in Account Pending Overlay')}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Switch bind:state={adminConfig.SHOW_ADMIN_DETAILS} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-2 flex w-full justify-between pr-2">
|
||||||
<div class=" self-center text-xs font-medium">{$i18n.t('Enable API Key')}</div>
|
<div class=" self-center text-xs font-medium">{$i18n.t('Enable API Key')}</div>
|
||||||
|
|
||||||
<Switch bind:state={adminConfig.ENABLE_API_KEY} />
|
<Switch bind:state={adminConfig.ENABLE_API_KEY} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#if adminConfig?.ENABLE_API_KEY}
|
{#if adminConfig?.ENABLE_API_KEY}
|
||||||
<div class=" flex w-full justify-between pr-2 my-3">
|
<div class="mb-2 flex w-full justify-between pr-2">
|
||||||
<div class=" self-center text-xs font-medium">
|
<div class=" self-center text-xs font-medium">
|
||||||
{$i18n.t('API Key Endpoint Restrictions')}
|
{$i18n.t('API Key Endpoint Restrictions')}
|
||||||
</div>
|
</div>
|
||||||
@ -155,54 +244,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<hr class=" border-gray-50 dark:border-gray-850 my-2" />
|
<div class=" mb-2 w-full justify-between">
|
||||||
|
|
||||||
<div class="my-3 flex w-full items-center justify-between pr-2">
|
|
||||||
<div class=" self-center text-xs font-medium">
|
|
||||||
{$i18n.t('Show Admin Details in Account Pending Overlay')}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<Switch bind:state={adminConfig.SHOW_ADMIN_DETAILS} />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="my-3 flex w-full items-center justify-between pr-2">
|
|
||||||
<div class=" self-center text-xs font-medium">{$i18n.t('Enable Community Sharing')}</div>
|
|
||||||
|
|
||||||
<Switch bind:state={adminConfig.ENABLE_COMMUNITY_SHARING} />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="my-3 flex w-full items-center justify-between pr-2">
|
|
||||||
<div class=" self-center text-xs font-medium">{$i18n.t('Enable Message Rating')}</div>
|
|
||||||
|
|
||||||
<Switch bind:state={adminConfig.ENABLE_MESSAGE_RATING} />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr class=" border-gray-50 dark:border-gray-850 my-2" />
|
|
||||||
|
|
||||||
<div class=" w-full justify-between">
|
|
||||||
<div class="flex w-full justify-between">
|
|
||||||
<div class=" self-center text-xs font-medium">{$i18n.t('WebUI URL')}</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex mt-2 space-x-2">
|
|
||||||
<input
|
|
||||||
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
|
||||||
type="text"
|
|
||||||
placeholder={`e.g.) "http://localhost:3000"`}
|
|
||||||
bind:value={adminConfig.WEBUI_URL}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
|
|
||||||
{$i18n.t(
|
|
||||||
'Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.'
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr class=" border-gray-50 dark:border-gray-850 my-2" />
|
|
||||||
|
|
||||||
<div class=" w-full justify-between">
|
|
||||||
<div class="flex w-full justify-between">
|
<div class="flex w-full justify-between">
|
||||||
<div class=" self-center text-xs font-medium">{$i18n.t('JWT Expiration')}</div>
|
<div class=" self-center text-xs font-medium">{$i18n.t('JWT Expiration')}</div>
|
||||||
</div>
|
</div>
|
||||||
@ -224,37 +266,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class=" border-gray-50 dark:border-gray-850 my-2" />
|
|
||||||
|
|
||||||
<div class=" w-full justify-between">
|
|
||||||
<div class="flex w-full justify-between">
|
|
||||||
<div class=" self-center text-xs font-medium">{$i18n.t('Webhook URL')}</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex mt-2 space-x-2">
|
|
||||||
<input
|
|
||||||
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
|
||||||
type="text"
|
|
||||||
placeholder={`https://example.com/webhook`}
|
|
||||||
bind:value={webhookUrl}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr class=" border-gray-50 dark:border-gray-850 my-2" />
|
|
||||||
|
|
||||||
<div class="pt-1 flex w-full justify-between pr-2">
|
|
||||||
<div class=" self-center text-sm font-medium">
|
|
||||||
{$i18n.t('Channels')} ({$i18n.t('Beta')})
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<Switch bind:state={adminConfig.ENABLE_CHANNELS} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
<hr class=" border-gray-50 dark:border-gray-850" />
|
|
||||||
|
|
||||||
<div class=" space-y-3">
|
<div class=" space-y-3">
|
||||||
<div class="mt-2 space-y-2 pr-1.5">
|
<div class="mt-2 space-y-2 pr-1.5">
|
||||||
<div class="flex justify-between items-center text-sm">
|
<div class="flex justify-between items-center text-sm">
|
||||||
@ -377,7 +388,9 @@
|
|||||||
<input
|
<input
|
||||||
class="w-full bg-transparent outline-none py-0.5"
|
class="w-full bg-transparent outline-none py-0.5"
|
||||||
required
|
required
|
||||||
placeholder={$i18n.t('Example: sAMAccountName or uid or userPrincipalName')}
|
placeholder={$i18n.t(
|
||||||
|
'Example: sAMAccountName or uid or userPrincipalName'
|
||||||
|
)}
|
||||||
bind:value={LDAP_SERVER.attribute_for_username}
|
bind:value={LDAP_SERVER.attribute_for_username}
|
||||||
/>
|
/>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
@ -388,7 +401,10 @@
|
|||||||
<div class=" self-center text-xs font-medium min-w-fit mb-1">
|
<div class=" self-center text-xs font-medium min-w-fit mb-1">
|
||||||
{$i18n.t('Search Base')}
|
{$i18n.t('Search Base')}
|
||||||
</div>
|
</div>
|
||||||
<Tooltip content={$i18n.t('The base to search for users')} placement="top-start">
|
<Tooltip
|
||||||
|
content={$i18n.t('The base to search for users')}
|
||||||
|
placement="top-start"
|
||||||
|
>
|
||||||
<input
|
<input
|
||||||
class="w-full bg-transparent outline-none py-0.5"
|
class="w-full bg-transparent outline-none py-0.5"
|
||||||
required
|
required
|
||||||
@ -464,6 +480,73 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<div class=" mb-2 text-base font-medium">{$i18n.t('Features')}</div>
|
||||||
|
|
||||||
|
<hr class=" border-gray-50 dark:border-gray-850 my-2" />
|
||||||
|
|
||||||
|
<div class="mb-2 flex w-full items-center justify-between pr-2">
|
||||||
|
<div class=" self-center text-xs font-medium">
|
||||||
|
{$i18n.t('Enable Community Sharing')}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Switch bind:state={adminConfig.ENABLE_COMMUNITY_SHARING} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-2 flex w-full items-center justify-between pr-2">
|
||||||
|
<div class=" self-center text-xs font-medium">{$i18n.t('Enable Message Rating')}</div>
|
||||||
|
|
||||||
|
<Switch bind:state={adminConfig.ENABLE_MESSAGE_RATING} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-2 flex w-full items-center justify-between pr-2">
|
||||||
|
<div class=" self-center text-xs font-medium">
|
||||||
|
{$i18n.t('Channels')} ({$i18n.t('Beta')})
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Switch bind:state={adminConfig.ENABLE_CHANNELS} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-2 w-full justify-between">
|
||||||
|
<div class="flex w-full justify-between">
|
||||||
|
<div class=" self-center text-xs font-medium">{$i18n.t('WebUI URL')}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex mt-2 space-x-2">
|
||||||
|
<input
|
||||||
|
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||||
|
type="text"
|
||||||
|
placeholder={`e.g.) "http://localhost:3000"`}
|
||||||
|
bind:value={adminConfig.WEBUI_URL}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
|
||||||
|
{$i18n.t(
|
||||||
|
'Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.'
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class=" w-full justify-between">
|
||||||
|
<div class="flex w-full justify-between">
|
||||||
|
<div class=" self-center text-xs font-medium">{$i18n.t('Webhook URL')}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex mt-2 space-x-2">
|
||||||
|
<input
|
||||||
|
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||||
|
type="text"
|
||||||
|
placeholder={`https://example.com/webhook`}
|
||||||
|
bind:value={webhookUrl}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="flex justify-end pt-3 text-sm font-medium">
|
<div class="flex justify-end pt-3 text-sm font-medium">
|
||||||
<button
|
<button
|
||||||
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full"
|
class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full"
|
||||||
|
Loading…
Reference in New Issue
Block a user