2020-11-25 13:31:34 +01:00
|
|
|
<template>
|
2023-04-08 02:01:42 +02:00
|
|
|
<div class="_formRoot">
|
|
|
|
<FormSelect v-model="selectedThemeId" class="_formBlock">
|
|
|
|
<template #label>{{ i18n.ts.theme }}</template>
|
|
|
|
<optgroup :label="i18n.ts._theme.installedThemes">
|
|
|
|
<option v-for="x in installedThemes" :key="x.id" :value="x.id">
|
|
|
|
{{ x.name }}
|
|
|
|
</option>
|
|
|
|
</optgroup>
|
|
|
|
<optgroup :label="i18n.ts._theme.builtinThemes">
|
|
|
|
<option v-for="x in builtinThemes" :key="x.id" :value="x.id">
|
|
|
|
{{ x.name }}
|
|
|
|
</option>
|
|
|
|
</optgroup>
|
|
|
|
</FormSelect>
|
|
|
|
<template v-if="selectedTheme">
|
|
|
|
<FormInput
|
|
|
|
readonly
|
|
|
|
:model-value="selectedTheme.author"
|
|
|
|
class="_formBlock"
|
|
|
|
>
|
|
|
|
<template #label>{{ i18n.ts.author }}</template>
|
|
|
|
</FormInput>
|
|
|
|
<FormTextarea
|
|
|
|
v-if="selectedTheme.desc"
|
|
|
|
readonly
|
|
|
|
:model-value="selectedTheme.desc"
|
|
|
|
class="_formBlock"
|
|
|
|
>
|
|
|
|
<template #label>{{ i18n.ts._theme.description }}</template>
|
|
|
|
</FormTextarea>
|
|
|
|
<FormTextarea
|
|
|
|
readonly
|
|
|
|
tall
|
|
|
|
:model-value="selectedThemeCode"
|
|
|
|
class="_formBlock"
|
|
|
|
>
|
|
|
|
<template #label>{{ i18n.ts._theme.code }}</template>
|
|
|
|
<template #caption
|
|
|
|
><button class="_textButton" @click="copyThemeCode()">
|
|
|
|
{{ i18n.ts.copy }}
|
|
|
|
</button></template
|
|
|
|
>
|
|
|
|
</FormTextarea>
|
|
|
|
<FormButton
|
|
|
|
v-if="!builtinThemes.some((t) => t.id == selectedTheme.id)"
|
|
|
|
class="_formBlock"
|
|
|
|
danger
|
|
|
|
@click="uninstall()"
|
|
|
|
><i class="ph-trash ph-bold ph-lg"></i>
|
|
|
|
{{ i18n.ts.uninstall }}</FormButton
|
|
|
|
>
|
|
|
|
</template>
|
|
|
|
</div>
|
2020-11-25 13:31:34 +01:00
|
|
|
</template>
|
|
|
|
|
2022-05-05 15:53:08 +02:00
|
|
|
<script lang="ts" setup>
|
2023-04-08 02:01:42 +02:00
|
|
|
import { computed, ref } from "vue";
|
|
|
|
import JSON5 from "json5";
|
|
|
|
import FormTextarea from "@/components/form/textarea.vue";
|
|
|
|
import FormSelect from "@/components/form/select.vue";
|
|
|
|
import FormInput from "@/components/form/input.vue";
|
|
|
|
import FormButton from "@/components/MkButton.vue";
|
|
|
|
import { Theme, getBuiltinThemesRef } from "@/scripts/theme";
|
|
|
|
import copyToClipboard from "@/scripts/copy-to-clipboard";
|
|
|
|
import * as os from "@/os";
|
|
|
|
import { getThemes, removeTheme } from "@/theme-store";
|
|
|
|
import { i18n } from "@/i18n";
|
|
|
|
import { definePageMetadata } from "@/scripts/page-metadata";
|
2020-11-25 13:31:34 +01:00
|
|
|
|
2022-05-05 15:53:08 +02:00
|
|
|
const installedThemes = ref(getThemes());
|
2022-05-28 14:59:23 +02:00
|
|
|
const builtinThemes = getBuiltinThemesRef();
|
2022-05-05 15:53:08 +02:00
|
|
|
const selectedThemeId = ref(null);
|
2020-11-25 13:31:34 +01:00
|
|
|
|
2023-04-08 02:01:42 +02:00
|
|
|
const themes = computed(() => [
|
|
|
|
...installedThemes.value,
|
|
|
|
...builtinThemes.value,
|
|
|
|
]);
|
2020-11-25 13:31:34 +01:00
|
|
|
|
2022-05-05 15:53:08 +02:00
|
|
|
const selectedTheme = computed(() => {
|
|
|
|
if (selectedThemeId.value == null) return null;
|
2023-04-08 02:01:42 +02:00
|
|
|
return themes.value.find((x) => x.id === selectedThemeId.value);
|
2022-05-05 15:53:08 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
const selectedThemeCode = computed(() => {
|
|
|
|
if (selectedTheme.value == null) return null;
|
2023-04-08 02:01:42 +02:00
|
|
|
return JSON5.stringify(selectedTheme.value, null, "\t");
|
2022-05-05 15:53:08 +02:00
|
|
|
});
|
2020-11-25 13:31:34 +01:00
|
|
|
|
2022-05-05 15:53:08 +02:00
|
|
|
function copyThemeCode() {
|
|
|
|
copyToClipboard(selectedThemeCode.value);
|
|
|
|
os.success();
|
|
|
|
}
|
2020-11-25 13:31:34 +01:00
|
|
|
|
2022-05-05 15:53:08 +02:00
|
|
|
function uninstall() {
|
|
|
|
removeTheme(selectedTheme.value as Theme);
|
2023-04-08 02:01:42 +02:00
|
|
|
installedThemes.value = installedThemes.value.filter(
|
|
|
|
(t) => t.id !== selectedThemeId.value
|
|
|
|
);
|
2022-05-05 15:53:08 +02:00
|
|
|
selectedThemeId.value = null;
|
|
|
|
os.success();
|
|
|
|
}
|
2020-11-25 13:31:34 +01:00
|
|
|
|
2022-06-20 10:38:49 +02:00
|
|
|
const headerActions = $computed(() => []);
|
|
|
|
|
|
|
|
const headerTabs = $computed(() => []);
|
|
|
|
|
|
|
|
definePageMetadata({
|
|
|
|
title: i18n.ts._theme.manage,
|
2023-04-08 02:01:42 +02:00
|
|
|
icon: "ph-folder-notch-open ph-bold ph-lg",
|
2020-11-25 13:31:34 +01:00
|
|
|
});
|
|
|
|
</script>
|