summaryrefslogtreecommitdiff
path: root/packages/client/src/pages/settings
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-01-27 00:17:13 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2022-01-27 00:17:13 +0900
commit5f5f68cdcd31653cef2ae6bd29ce8bfcf60113ff (patch)
tree51e9e6179f6d1bda3013d1412f6e43f9f8f70e86 /packages/client/src/pages/settings
parentMerge branch 'develop' (diff)
parent12.102.0 (diff)
downloadmisskey-5f5f68cdcd31653cef2ae6bd29ce8bfcf60113ff.tar.gz
misskey-5f5f68cdcd31653cef2ae6bd29ce8bfcf60113ff.tar.bz2
misskey-5f5f68cdcd31653cef2ae6bd29ce8bfcf60113ff.zip
Merge branch 'develop'
Diffstat (limited to 'packages/client/src/pages/settings')
-rw-r--r--packages/client/src/pages/settings/2fa.vue3
-rw-r--r--packages/client/src/pages/settings/account-info.vue152
-rw-r--r--packages/client/src/pages/settings/accounts.vue36
-rw-r--r--packages/client/src/pages/settings/api.vue23
-rw-r--r--packages/client/src/pages/settings/apps.vue20
-rw-r--r--packages/client/src/pages/settings/custom-css.vue27
-rw-r--r--packages/client/src/pages/settings/deck.vue36
-rw-r--r--packages/client/src/pages/settings/delete-account.vue24
-rw-r--r--packages/client/src/pages/settings/drive.vue10
-rw-r--r--packages/client/src/pages/settings/email.vue6
-rw-r--r--packages/client/src/pages/settings/experimental-features.vue52
-rw-r--r--packages/client/src/pages/settings/general.vue4
-rw-r--r--packages/client/src/pages/settings/import-export.vue4
-rw-r--r--packages/client/src/pages/settings/index.vue30
-rw-r--r--packages/client/src/pages/settings/instance-mute.vue5
-rw-r--r--packages/client/src/pages/settings/integration.vue52
-rw-r--r--packages/client/src/pages/settings/menu.vue6
-rw-r--r--packages/client/src/pages/settings/mute-block.vue79
-rw-r--r--packages/client/src/pages/settings/notifications.vue6
-rw-r--r--packages/client/src/pages/settings/other.vue37
-rw-r--r--packages/client/src/pages/settings/plugin.install.vue36
-rw-r--r--packages/client/src/pages/settings/plugin.manage.vue116
-rw-r--r--packages/client/src/pages/settings/plugin.vue86
-rw-r--r--packages/client/src/pages/settings/privacy.vue90
-rw-r--r--packages/client/src/pages/settings/profile.vue349
-rw-r--r--packages/client/src/pages/settings/reaction.vue4
-rw-r--r--packages/client/src/pages/settings/registry.keys.vue114
-rw-r--r--packages/client/src/pages/settings/registry.value.vue147
-rw-r--r--packages/client/src/pages/settings/registry.vue90
-rw-r--r--packages/client/src/pages/settings/security.vue16
-rw-r--r--packages/client/src/pages/settings/sounds.vue6
-rw-r--r--packages/client/src/pages/settings/theme.install.vue146
-rw-r--r--packages/client/src/pages/settings/theme.manage.vue10
-rw-r--r--packages/client/src/pages/settings/theme.vue4
-rw-r--r--packages/client/src/pages/settings/update.vue95
-rw-r--r--packages/client/src/pages/settings/word-mute.vue6
36 files changed, 515 insertions, 1412 deletions
diff --git a/packages/client/src/pages/settings/2fa.vue b/packages/client/src/pages/settings/2fa.vue
index cffd10a0ee..10599d99ff 100644
--- a/packages/client/src/pages/settings/2fa.vue
+++ b/packages/client/src/pages/settings/2fa.vue
@@ -71,9 +71,6 @@ import MkButton from '@/components/ui/button.vue';
import MkInfo from '@/components/ui/info.vue';
import MkInput from '@/components/form/input.vue';
import MkSwitch from '@/components/form/switch.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormButton from '@/components/debobigego/button.vue';
import * as os from '@/os';
import * as symbols from '@/symbols';
diff --git a/packages/client/src/pages/settings/account-info.vue b/packages/client/src/pages/settings/account-info.vue
index f3d5e2f2c3..c98ad056f6 100644
--- a/packages/client/src/pages/settings/account-info.vue
+++ b/packages/client/src/pages/settings/account-info.vue
@@ -1,144 +1,135 @@
<template>
-<FormBase>
- <FormKeyValueView>
+<div class="_formRoot">
+ <MkKeyValue>
<template #key>ID</template>
<template #value><span class="_monospace">{{ $i.id }}</span></template>
- </FormKeyValueView>
+ </MkKeyValue>
- <FormGroup>
- <FormKeyValueView>
+ <FormSection>
+ <MkKeyValue>
<template #key>{{ $ts.registeredDate }}</template>
<template #value><MkTime :time="$i.createdAt" mode="detail"/></template>
- </FormKeyValueView>
- </FormGroup>
+ </MkKeyValue>
+ </FormSection>
- <FormGroup v-if="stats">
+ <FormSection v-if="stats">
<template #label>{{ $ts.statistics }}</template>
- <FormKeyValueView>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.notesCount }}</template>
<template #value>{{ number(stats.notesCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.repliesCount }}</template>
<template #value>{{ number(stats.repliesCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.renotesCount }}</template>
<template #value>{{ number(stats.renotesCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.repliedCount }}</template>
<template #value>{{ number(stats.repliedCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.renotedCount }}</template>
<template #value>{{ number(stats.renotedCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.pollVotesCount }}</template>
<template #value>{{ number(stats.pollVotesCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.pollVotedCount }}</template>
<template #value>{{ number(stats.pollVotedCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.sentReactionsCount }}</template>
<template #value>{{ number(stats.sentReactionsCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.receivedReactionsCount }}</template>
<template #value>{{ number(stats.receivedReactionsCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.noteFavoritesCount }}</template>
<template #value>{{ number(stats.noteFavoritesCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.followingCount }}</template>
<template #value>{{ number(stats.followingCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.followingCount }} ({{ $ts.local }})</template>
<template #value>{{ number(stats.localFollowingCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.followingCount }} ({{ $ts.remote }})</template>
<template #value>{{ number(stats.remoteFollowingCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.followersCount }}</template>
<template #value>{{ number(stats.followersCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.followersCount }} ({{ $ts.local }})</template>
<template #value>{{ number(stats.localFollowersCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.followersCount }} ({{ $ts.remote }})</template>
<template #value>{{ number(stats.remoteFollowersCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.pageLikesCount }}</template>
<template #value>{{ number(stats.pageLikesCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.pageLikedCount }}</template>
<template #value>{{ number(stats.pageLikedCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.driveFilesCount }}</template>
<template #value>{{ number(stats.driveFilesCount) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>{{ $ts.driveUsage }}</template>
<template #value>{{ bytes(stats.driveUsage) }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
- <template #key>{{ $ts.reversiCount }}</template>
- <template #value>{{ number(stats.reversiCount) }}</template>
- </FormKeyValueView>
- </FormGroup>
+ </MkKeyValue>
+ </FormSection>
- <FormGroup>
+ <FormSection>
<template #label>{{ $ts.other }}</template>
- <FormKeyValueView>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>emailVerified</template>
<template #value>{{ $i.emailVerified ? $ts.yes : $ts.no }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>twoFactorEnabled</template>
<template #value>{{ $i.twoFactorEnabled ? $ts.yes : $ts.no }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>securityKeys</template>
<template #value>{{ $i.securityKeys ? $ts.yes : $ts.no }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>usePasswordLessLogin</template>
<template #value>{{ $i.usePasswordLessLogin ? $ts.yes : $ts.no }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>isModerator</template>
<template #value>{{ $i.isModerator ? $ts.yes : $ts.no }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
+ </MkKeyValue>
+ <MkKeyValue oneline style="margin: 1em 0;">
<template #key>isAdmin</template>
<template #value>{{ $i.isAdmin ? $ts.yes : $ts.no }}</template>
- </FormKeyValueView>
- </FormGroup>
-</FormBase>
+ </MkKeyValue>
+ </FormSection>
+</div>
</template>
<script lang="ts">
import { defineAsyncComponent, defineComponent } from 'vue';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormButton from '@/components/debobigego/button.vue';
-import FormKeyValueView from '@/components/debobigego/key-value-view.vue';
+import FormSection from '@/components/form/section.vue';
+import MkKeyValue from '@/components/key-value.vue';
import * as os from '@/os';
import number from '@/filters/number';
import bytes from '@/filters/bytes';
@@ -146,13 +137,8 @@ import * as symbols from '@/symbols';
export default defineComponent({
components: {
- FormBase,
- FormSelect,
- FormSwitch,
- FormButton,
- FormLink,
- FormGroup,
- FormKeyValueView,
+ FormSection,
+ MkKeyValue,
},
emits: ['info'],
@@ -168,8 +154,6 @@ export default defineComponent({
},
mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
-
os.api('users/stats', {
userId: this.$i.id
}).then(stats => {
diff --git a/packages/client/src/pages/settings/accounts.vue b/packages/client/src/pages/settings/accounts.vue
index 2d1e0eff4e..c795ede8ac 100644
--- a/packages/client/src/pages/settings/accounts.vue
+++ b/packages/client/src/pages/settings/accounts.vue
@@ -1,41 +1,35 @@
<template>
-<FormBase>
+<div class="_formRoot">
<FormSuspense :p="init">
<FormButton primary @click="addAccount"><i class="fas fa-plus"></i> {{ $ts.addAccount }}</FormButton>
- <div v-for="account in accounts" :key="account.id" class="_debobigegoItem _button" @click="menu(account, $event)">
- <div class="_debobigegoPanel lcjjdxlm">
- <div class="avatar">
- <MkAvatar :user="account" class="avatar"/>
+ <div v-for="account in accounts" :key="account.id" class="_panel _button lcjjdxlm" @click="menu(account, $event)">
+ <div class="avatar">
+ <MkAvatar :user="account" class="avatar"/>
+ </div>
+ <div class="body">
+ <div class="name">
+ <MkUserName :user="account"/>
</div>
- <div class="body">
- <div class="name">
- <MkUserName :user="account"/>
- </div>
- <div class="acct">
- <MkAcct :user="account"/>
- </div>
+ <div class="acct">
+ <MkAcct :user="account"/>
</div>
</div>
</div>
</FormSuspense>
-</FormBase>
+</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
-import FormSuspense from '@/components/debobigego/suspense.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormButton from '@/components/debobigego/button.vue';
+import FormSuspense from '@/components/form/suspense.vue';
+import FormButton from '@/components/ui/button.vue';
import * as os from '@/os';
import * as symbols from '@/symbols';
import { getAccounts, addAccount, login } from '@/account';
export default defineComponent({
components: {
- FormBase,
FormSuspense,
FormButton,
},
@@ -59,10 +53,6 @@ export default defineComponent({
};
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
menu(account, ev) {
os.popupMenu([{
diff --git a/packages/client/src/pages/settings/api.vue b/packages/client/src/pages/settings/api.vue
index 30a4902a15..20ff2a8d96 100644
--- a/packages/client/src/pages/settings/api.vue
+++ b/packages/client/src/pages/settings/api.vue
@@ -1,25 +1,20 @@
<template>
-<FormBase>
- <FormButton primary @click="generateToken">{{ $ts.generateAccessToken }}</FormButton>
- <FormLink to="/settings/apps">{{ $ts.manageAccessTokens }}</FormLink>
- <FormLink to="/api-console" :behavior="isDesktop ? 'window' : null">API console</FormLink>
-</FormBase>
+<div class="_formRoot">
+ <FormButton primary class="_formBlock" @click="generateToken">{{ $ts.generateAccessToken }}</FormButton>
+ <FormLink to="/settings/apps" class="_formBlock">{{ $ts.manageAccessTokens }}</FormLink>
+ <FormLink to="/api-console" :behavior="isDesktop ? 'window' : null" class="_formBlock">API console</FormLink>
+</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormButton from '@/components/debobigego/button.vue';
+import FormLink from '@/components/form/link.vue';
+import FormButton from '@/components/ui/button.vue';
import * as os from '@/os';
import * as symbols from '@/symbols';
export default defineComponent({
components: {
- FormBase,
FormButton,
FormLink,
},
@@ -37,10 +32,6 @@ export default defineComponent({
};
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
generateToken() {
os.popup(import('@/components/token-generate-window.vue'), {}, {
diff --git a/packages/client/src/pages/settings/apps.vue b/packages/client/src/pages/settings/apps.vue
index b5fe4e0aed..9c0fa8a54d 100644
--- a/packages/client/src/pages/settings/apps.vue
+++ b/packages/client/src/pages/settings/apps.vue
@@ -1,5 +1,5 @@
<template>
-<FormBase>
+<div class="_formRoot">
<FormPagination ref="list" :pagination="pagination">
<template #empty>
<div class="_fullinfo">
@@ -8,7 +8,7 @@
</div>
</template>
<template v-slot="{items}">
- <div v-for="token in items" :key="token.id" class="_debobigegoPanel bfomjevm">
+ <div v-for="token in items" :key="token.id" class="_panel bfomjevm">
<img v-if="token.iconUrl" class="icon" :src="token.iconUrl" alt=""/>
<div class="body">
<div class="name">{{ token.name }}</div>
@@ -34,23 +34,17 @@
</div>
</template>
</FormPagination>
-</FormBase>
+</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
-import FormPagination from '@/components/debobigego/pagination.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormButton from '@/components/debobigego/button.vue';
+import FormPagination from '@/components/ui/pagination.vue';
import * as os from '@/os';
import * as symbols from '@/symbols';
export default defineComponent({
components: {
- FormBase,
FormPagination,
},
@@ -64,7 +58,7 @@ export default defineComponent({
bg: 'var(--bg)',
},
pagination: {
- endpoint: 'i/apps',
+ endpoint: 'i/apps' as const,
limit: 100,
params: {
sort: '+lastUsedAt'
@@ -73,10 +67,6 @@ export default defineComponent({
};
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
revoke(token) {
os.api('i/revoke-token', { tokenId: token.id }).then(() => {
diff --git a/packages/client/src/pages/settings/custom-css.vue b/packages/client/src/pages/settings/custom-css.vue
index 155956923c..556ee30c1d 100644
--- a/packages/client/src/pages/settings/custom-css.vue
+++ b/packages/client/src/pages/settings/custom-css.vue
@@ -1,25 +1,18 @@
<template>
-<FormBase>
- <FormInfo warn>{{ $ts.customCssWarn }}</FormInfo>
+<div class="_formRoot">
+ <FormInfo warn class="_formBlock">{{ $ts.customCssWarn }}</FormInfo>
- <FormTextarea v-model="localCustomCss" manual-save tall class="_monospace" style="tab-size: 2;">
- <span>{{ $ts.local }}</span>
+ <FormTextarea v-model="localCustomCss" manual-save tall class="_monospace _formBlock" style="tab-size: 2;">
+ <template #label>CSS</template>
</FormTextarea>
-</FormBase>
+</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import FormTextarea from '@/components/form/textarea.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormRadios from '@/components/form/radios.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormButton from '@/components/debobigego/button.vue';
-import FormInfo from '@/components/debobigego/info.vue';
+import FormInfo from '@/components/ui/info.vue';
import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
import { unisonReload } from '@/scripts/unison-reload';
import * as symbols from '@/symbols';
import { defaultStore } from '@/store';
@@ -27,12 +20,6 @@ import { defaultStore } from '@/store';
export default defineComponent({
components: {
FormTextarea,
- FormSelect,
- FormRadios,
- FormBase,
- FormGroup,
- FormLink,
- FormButton,
FormInfo,
},
@@ -50,8 +37,6 @@ export default defineComponent({
},
mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
-
this.$watch('localCustomCss', this.apply);
},
diff --git a/packages/client/src/pages/settings/deck.vue b/packages/client/src/pages/settings/deck.vue
index bc82b0ca84..46b90d3d1a 100644
--- a/packages/client/src/pages/settings/deck.vue
+++ b/packages/client/src/pages/settings/deck.vue
@@ -1,42 +1,41 @@
<template>
-<FormBase>
+<div class="_formRoot">
<FormGroup>
<template #label>{{ $ts.defaultNavigationBehaviour }}</template>
<FormSwitch v-model="navWindow">{{ $ts.openInWindow }}</FormSwitch>
</FormGroup>
- <FormSwitch v-model="alwaysShowMainColumn">{{ $ts._deck.alwaysShowMainColumn }}</FormSwitch>
+ <FormSwitch v-model="alwaysShowMainColumn" class="_formBlock">{{ $ts._deck.alwaysShowMainColumn }}</FormSwitch>
- <FormRadios v-model="columnAlign">
- <template #desc>{{ $ts._deck.columnAlign }}</template>
+ <FormRadios v-model="columnAlign" class="_formBlock">
+ <template #label>{{ $ts._deck.columnAlign }}</template>
<option value="left">{{ $ts.left }}</option>
<option value="center">{{ $ts.center }}</option>
</FormRadios>
- <FormRadios v-model="columnHeaderHeight">
- <template #desc>{{ $ts._deck.columnHeaderHeight }}</template>
+ <FormRadios v-model="columnHeaderHeight" class="_formBlock">
+ <template #label>{{ $ts._deck.columnHeaderHeight }}</template>
<option :value="42">{{ $ts.narrow }}</option>
<option :value="45">{{ $ts.medium }}</option>
<option :value="48">{{ $ts.wide }}</option>
</FormRadios>
- <FormInput v-model="columnMargin" type="number">
- <span>{{ $ts._deck.columnMargin }}</span>
+ <FormInput v-model="columnMargin" type="number" class="_formBlock">
+ <template #label>{{ $ts._deck.columnMargin }}</template>
<template #suffix>px</template>
</FormInput>
- <FormLink @click="setProfile">{{ $ts._deck.profile }}<template #suffix>{{ profile }}</template></FormLink>
-</FormBase>
+ <FormLink class="_formBlock" @click="setProfile">{{ $ts._deck.profile }}<template #suffix>{{ profile }}</template></FormLink>
+</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
-import FormSwitch from '@/components/debobigego/switch.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormRadios from '@/components/debobigego/radios.vue';
-import FormInput from '@/components/debobigego/input.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
+import FormSwitch from '@/components/form/switch.vue';
+import FormLink from '@/components/form/link.vue';
+import FormRadios from '@/components/form/radios.vue';
+import FormInput from '@/components/form/input.vue';
+import FormGroup from '@/components/form/group.vue';
import { deckStore } from '@/ui/deck/deck-store';
import * as os from '@/os';
import { unisonReload } from '@/scripts/unison-reload';
@@ -48,7 +47,6 @@ export default defineComponent({
FormLink,
FormInput,
FormRadios,
- FormBase,
FormGroup,
},
@@ -85,10 +83,6 @@ export default defineComponent({
}
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
async setProfile() {
const { canceled, result: name } = await os.inputText({
diff --git a/packages/client/src/pages/settings/delete-account.vue b/packages/client/src/pages/settings/delete-account.vue
index 6ce8d6509c..7edc81a309 100644
--- a/packages/client/src/pages/settings/delete-account.vue
+++ b/packages/client/src/pages/settings/delete-account.vue
@@ -1,28 +1,23 @@
<template>
-<FormBase>
- <FormInfo warn>{{ $ts._accountDelete.mayTakeTime }}</FormInfo>
- <FormInfo>{{ $ts._accountDelete.sendEmail }}</FormInfo>
- <FormButton v-if="!$i.isDeleted" danger @click="deleteAccount">{{ $ts._accountDelete.requestAccountDelete }}</FormButton>
+<div class="_formRoot">
+ <FormInfo warn class="_formBlock">{{ $ts._accountDelete.mayTakeTime }}</FormInfo>
+ <FormInfo class="_formBlock">{{ $ts._accountDelete.sendEmail }}</FormInfo>
+ <FormButton v-if="!$i.isDeleted" danger class="_formBlock" @click="deleteAccount">{{ $ts._accountDelete.requestAccountDelete }}</FormButton>
<FormButton v-else disabled>{{ $ts._accountDelete.inProgress }}</FormButton>
-</FormBase>
+</div>
</template>
<script lang="ts">
import { defineAsyncComponent, defineComponent } from 'vue';
-import FormInfo from '@/components/debobigego/info.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormButton from '@/components/debobigego/button.vue';
+import FormInfo from '@/components/ui/info.vue';
+import FormButton from '@/components/ui/button.vue';
import * as os from '@/os';
-import { debug } from '@/config';
import { signout } from '@/account';
import * as symbols from '@/symbols';
export default defineComponent({
components: {
- FormBase,
FormButton,
- FormGroup,
FormInfo,
},
@@ -35,14 +30,9 @@ export default defineComponent({
icon: 'fas fa-exclamation-triangle',
bg: 'var(--bg)',
},
- debug,
}
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
async deleteAccount() {
{
diff --git a/packages/client/src/pages/settings/drive.vue b/packages/client/src/pages/settings/drive.vue
index 9ab99c6efe..f1016ebd84 100644
--- a/packages/client/src/pages/settings/drive.vue
+++ b/packages/client/src/pages/settings/drive.vue
@@ -5,7 +5,7 @@
<div class="_formBlock uawsfosz">
<div class="meter"><div :style="meterStyle"></div></div>
</div>
- <div class="_inputSplit _formBlock">
+ <FormSplit>
<MkKeyValue class="_formBlock">
<template #key>{{ $ts.capacity }}</template>
<template #value>{{ bytes(capacity, 1) }}</template>
@@ -14,7 +14,7 @@
<template #key>{{ $ts.inUse }}</template>
<template #value>{{ bytes(usage, 1) }}</template>
</MkKeyValue>
- </div>
+ </FormSplit>
</FormSection>
<FormSection>
@@ -38,6 +38,7 @@ import * as tinycolor from 'tinycolor2';
import FormLink from '@/components/form/link.vue';
import FormSection from '@/components/form/section.vue';
import MkKeyValue from '@/components/key-value.vue';
+import FormSplit from '@/components/form/split.vue';
import * as os from '@/os';
import bytes from '@/filters/bytes';
import * as symbols from '@/symbols';
@@ -49,6 +50,7 @@ export default defineComponent({
FormLink,
FormSection,
MkKeyValue,
+ FormSplit,
},
emits: ['info'],
@@ -97,10 +99,6 @@ export default defineComponent({
}
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
chooseUploadFolder() {
os.selectDriveFolder(false).then(async folder => {
diff --git a/packages/client/src/pages/settings/email.vue b/packages/client/src/pages/settings/email.vue
index b04295cce0..54557f8773 100644
--- a/packages/client/src/pages/settings/email.vue
+++ b/packages/client/src/pages/settings/email.vue
@@ -41,8 +41,6 @@
<script lang="ts">
import { defineComponent, onMounted, ref, watch } from 'vue';
-import FormButton from '@/components/debobigego/button.vue';
-import FormLink from '@/components/debobigego/link.vue';
import FormSection from '@/components/form/section.vue';
import FormInput from '@/components/form/input.vue';
import FormSwitch from '@/components/form/switch.vue';
@@ -54,8 +52,6 @@ import { i18n } from '@/i18n';
export default defineComponent({
components: {
FormSection,
- FormLink,
- FormButton,
FormSwitch,
FormInput,
},
@@ -115,8 +111,6 @@ export default defineComponent({
});
onMounted(() => {
- context.emit('info', INFO);
-
watch(emailAddress, () => {
saveEmailAddress();
});
diff --git a/packages/client/src/pages/settings/experimental-features.vue b/packages/client/src/pages/settings/experimental-features.vue
deleted file mode 100644
index 5a7bcb3b41..0000000000
--- a/packages/client/src/pages/settings/experimental-features.vue
+++ /dev/null
@@ -1,52 +0,0 @@
-<template>
-<FormBase>
- <FormButton @click="error()">error test</FormButton>
-</FormBase>
-</template>
-
-<script lang="ts">
-import { defineAsyncComponent, defineComponent } from 'vue';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormButton from '@/components/debobigego/button.vue';
-import FormKeyValueView from '@/components/debobigego/key-value-view.vue';
-import * as os from '@/os';
-import * as symbols from '@/symbols';
-
-export default defineComponent({
- components: {
- FormBase,
- FormSelect,
- FormSwitch,
- FormButton,
- FormLink,
- FormGroup,
- FormKeyValueView,
- },
-
- emits: ['info'],
-
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: this.$ts.experimentalFeatures,
- icon: 'fas fa-flask'
- },
- stats: null
- }
- },
-
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
- methods: {
- error() {
- throw new Error('Test error');
- }
- }
-});
-</script>
diff --git a/packages/client/src/pages/settings/general.vue b/packages/client/src/pages/settings/general.vue
index 734bc78442..2e159e56a9 100644
--- a/packages/client/src/pages/settings/general.vue
+++ b/packages/client/src/pages/settings/general.vue
@@ -195,10 +195,6 @@ export default defineComponent({
},
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
async reloadAsk() {
const { canceled } = await os.confirm({
diff --git a/packages/client/src/pages/settings/import-export.vue b/packages/client/src/pages/settings/import-export.vue
index a1dd6a1539..21031c559e 100644
--- a/packages/client/src/pages/settings/import-export.vue
+++ b/packages/client/src/pages/settings/import-export.vue
@@ -133,10 +133,6 @@ export default defineComponent({
os.api('i/import-blocking', { fileId: file.id }).then(onImportSuccess).catch(onError);
};
- onMounted(() => {
- context.emit('info', INFO);
- });
-
return {
[symbols.PAGE_INFO]: INFO,
excludeMutingUsers,
diff --git a/packages/client/src/pages/settings/index.vue b/packages/client/src/pages/settings/index.vue
index 8ffff86705..66c8b147bb 100644
--- a/packages/client/src/pages/settings/index.vue
+++ b/packages/client/src/pages/settings/index.vue
@@ -14,7 +14,7 @@
</div>
<div class="main">
<div class="bkzroven">
- <component :is="component" :key="page" v-bind="pageProps" @info="onInfo"/>
+ <component :is="component" :ref="el => pageChanged(el)" :key="page" v-bind="pageProps"/>
</div>
</div>
</div>
@@ -215,19 +215,9 @@ export default defineComponent({
case 'deck': return defineAsyncComponent(() => import('./deck.vue'));
case 'plugin': return defineAsyncComponent(() => import('./plugin.vue'));
case 'plugin/install': return defineAsyncComponent(() => import('./plugin.install.vue'));
- case 'plugin/manage': return defineAsyncComponent(() => import('./plugin.manage.vue'));
case 'import-export': return defineAsyncComponent(() => import('./import-export.vue'));
case 'account-info': return defineAsyncComponent(() => import('./account-info.vue'));
- case 'update': return defineAsyncComponent(() => import('./update.vue'));
- case 'registry': return defineAsyncComponent(() => import('./registry.vue'));
case 'delete-account': return defineAsyncComponent(() => import('./delete-account.vue'));
- case 'experimental-features': return defineAsyncComponent(() => import('./experimental-features.vue'));
- }
- if (page.value.startsWith('registry/keys/system/')) {
- return defineAsyncComponent(() => import('./registry.keys.vue'));
- }
- if (page.value.startsWith('registry/value/system/')) {
- return defineAsyncComponent(() => import('./registry.value.vue'));
}
return null;
});
@@ -235,17 +225,6 @@ export default defineComponent({
watch(component, () => {
pageProps.value = {};
- if (page.value) {
- if (page.value.startsWith('registry/keys/system/')) {
- pageProps.value.scope = page.value.replace('registry/keys/system/', '').split('/');
- }
- if (page.value.startsWith('registry/value/system/')) {
- const path = page.value.replace('registry/value/system/', '').split('/');
- pageProps.value.xKey = path.pop();
- pageProps.value.scope = path;
- }
- }
-
nextTick(() => {
scroll(el.value, { top: 0 });
});
@@ -271,8 +250,9 @@ export default defineComponent({
const emailNotConfigured = computed(() => instance.enableEmail && ($i.email == null || !$i.emailVerified));
- const onInfo = (info) => {
- childInfo.value = info;
+ const pageChanged = (page) => {
+ if (page == null) return;
+ childInfo.value = page[symbols.PAGE_INFO];
};
return {
@@ -285,7 +265,7 @@ export default defineComponent({
pageProps,
component,
emailNotConfigured,
- onInfo,
+ pageChanged,
childInfo,
};
},
diff --git a/packages/client/src/pages/settings/instance-mute.vue b/packages/client/src/pages/settings/instance-mute.vue
index 584a21e4bd..f84a209b60 100644
--- a/packages/client/src/pages/settings/instance-mute.vue
+++ b/packages/client/src/pages/settings/instance-mute.vue
@@ -47,11 +47,6 @@ export default defineComponent({
},
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
-
async created() {
this.instanceMutes = this.$i.mutedInstances.join('\n');
},
diff --git a/packages/client/src/pages/settings/integration.vue b/packages/client/src/pages/settings/integration.vue
index 3d8aaf8a6f..ca36c91665 100644
--- a/packages/client/src/pages/settings/integration.vue
+++ b/packages/client/src/pages/settings/integration.vue
@@ -1,45 +1,39 @@
<template>
-<FormBase>
- <div v-if="enableTwitterIntegration" class="_debobigegoItem">
- <div class="_debobigegoLabel"><i class="fab fa-twitter"></i> Twitter</div>
- <div class="_debobigegoPanel" style="padding: 16px;">
- <p v-if="integrations.twitter">{{ $ts.connectedTo }}: <a :href="`https://twitter.com/${integrations.twitter.screenName}`" rel="nofollow noopener" target="_blank">@{{ integrations.twitter.screenName }}</a></p>
- <MkButton v-if="integrations.twitter" danger @click="disconnectTwitter">{{ $ts.disconnectService }}</MkButton>
- <MkButton v-else primary @click="connectTwitter">{{ $ts.connectService }}</MkButton>
- </div>
- </div>
+<div class="_formRoot">
+ <FormSection v-if="enableTwitterIntegration">
+ <template #label><i class="fab fa-twitter"></i> Twitter</template>
+ <p v-if="integrations.twitter">{{ $ts.connectedTo }}: <a :href="`https://twitter.com/${integrations.twitter.screenName}`" rel="nofollow noopener" target="_blank">@{{ integrations.twitter.screenName }}</a></p>
+ <MkButton v-if="integrations.twitter" danger @click="disconnectTwitter">{{ $ts.disconnectService }}</MkButton>
+ <MkButton v-else primary @click="connectTwitter">{{ $ts.connectService }}</MkButton>
+ </FormSection>
- <div v-if="enableDiscordIntegration" class="_debobigegoItem">
- <div class="_debobigegoLabel"><i class="fab fa-discord"></i> Discord</div>
- <div class="_debobigegoPanel" style="padding: 16px;">
- <p v-if="integrations.discord">{{ $ts.connectedTo }}: <a :href="`https://discord.com/users/${integrations.discord.id}`" rel="nofollow noopener" target="_blank">@{{ integrations.discord.username }}#{{ integrations.discord.discriminator }}</a></p>
- <MkButton v-if="integrations.discord" danger @click="disconnectDiscord">{{ $ts.disconnectService }}</MkButton>
- <MkButton v-else primary @click="connectDiscord">{{ $ts.connectService }}</MkButton>
- </div>
- </div>
+ <FormSection v-if="enableDiscordIntegration">
+ <template #label><i class="fab fa-discord"></i> Discord</template>
+ <p v-if="integrations.discord">{{ $ts.connectedTo }}: <a :href="`https://discord.com/users/${integrations.discord.id}`" rel="nofollow noopener" target="_blank">@{{ integrations.discord.username }}#{{ integrations.discord.discriminator }}</a></p>
+ <MkButton v-if="integrations.discord" danger @click="disconnectDiscord">{{ $ts.disconnectService }}</MkButton>
+ <MkButton v-else primary @click="connectDiscord">{{ $ts.connectService }}</MkButton>
+ </FormSection>
- <div v-if="enableGithubIntegration" class="_debobigegoItem">
- <div class="_debobigegoLabel"><i class="fab fa-github"></i> GitHub</div>
- <div class="_debobigegoPanel" style="padding: 16px;">
- <p v-if="integrations.github">{{ $ts.connectedTo }}: <a :href="`https://github.com/${integrations.github.login}`" rel="nofollow noopener" target="_blank">@{{ integrations.github.login }}</a></p>
- <MkButton v-if="integrations.github" danger @click="disconnectGithub">{{ $ts.disconnectService }}</MkButton>
- <MkButton v-else primary @click="connectGithub">{{ $ts.connectService }}</MkButton>
- </div>
- </div>
-</FormBase>
+ <FormSection v-if="enableGithubIntegration">
+ <template #label><i class="fab fa-github"></i> GitHub</template>
+ <p v-if="integrations.github">{{ $ts.connectedTo }}: <a :href="`https://github.com/${integrations.github.login}`" rel="nofollow noopener" target="_blank">@{{ integrations.github.login }}</a></p>
+ <MkButton v-if="integrations.github" danger @click="disconnectGithub">{{ $ts.disconnectService }}</MkButton>
+ <MkButton v-else primary @click="connectGithub">{{ $ts.connectService }}</MkButton>
+ </FormSection>
+</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { apiUrl } from '@/config';
-import FormBase from '@/components/debobigego/base.vue';
+import FormSection from '@/components/form/section.vue';
import MkButton from '@/components/ui/button.vue';
import * as os from '@/os';
import * as symbols from '@/symbols';
export default defineComponent({
components: {
- FormBase,
+ FormSection,
MkButton
},
@@ -79,8 +73,6 @@ export default defineComponent({
},
mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
-
document.cookie = `igi=${this.$i.token}; path=/;` +
` max-age=31536000;` +
(document.location.protocol.startsWith('https') ? ' secure' : '');
diff --git a/packages/client/src/pages/settings/menu.vue b/packages/client/src/pages/settings/menu.vue
index 19d26be89a..6e38cd5dfe 100644
--- a/packages/client/src/pages/settings/menu.vue
+++ b/packages/client/src/pages/settings/menu.vue
@@ -21,7 +21,6 @@
import { defineComponent } from 'vue';
import FormTextarea from '@/components/form/textarea.vue';
import FormRadios from '@/components/form/radios.vue';
-import FormBase from '@/components/debobigego/base.vue';
import FormButton from '@/components/ui/button.vue';
import * as os from '@/os';
import { menuDef } from '@/menu';
@@ -31,7 +30,6 @@ import { unisonReload } from '@/scripts/unison-reload';
export default defineComponent({
components: {
- FormBase,
FormButton,
FormTextarea,
FormRadios,
@@ -69,10 +67,6 @@ export default defineComponent({
},
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
async addItem() {
const menu = Object.keys(this.menuDef).filter(k => !this.$store.state.menu.includes(k));
diff --git a/packages/client/src/pages/settings/mute-block.vue b/packages/client/src/pages/settings/mute-block.vue
index 4f42d5e429..f4f9ebf8dd 100644
--- a/packages/client/src/pages/settings/mute-block.vue
+++ b/packages/client/src/pages/settings/mute-block.vue
@@ -1,5 +1,5 @@
<template>
-<FormBase>
+<div class="_formRoot">
<MkTab v-model="tab" style="margin-bottom: var(--margin);">
<option value="mute">{{ $ts.mutedUsers }}</option>
<option value="block">{{ $ts.blockedUsers }}</option>
@@ -8,11 +8,9 @@
<MkPagination :pagination="mutingPagination" class="muting">
<template #empty><FormInfo>{{ $ts.noUsers }}</FormInfo></template>
<template v-slot="{items}">
- <FormGroup>
- <FormLink v-for="mute in items" :key="mute.id" :to="userPage(mute.mutee)">
- <MkAcct :user="mute.mutee"/>
- </FormLink>
- </FormGroup>
+ <FormLink v-for="mute in items" :key="mute.id" :to="userPage(mute.mutee)">
+ <MkAcct :user="mute.mutee"/>
+ </FormLink>
</template>
</MkPagination>
</div>
@@ -20,66 +18,43 @@
<MkPagination :pagination="blockingPagination" class="blocking">
<template #empty><FormInfo>{{ $ts.noUsers }}</FormInfo></template>
<template v-slot="{items}">
- <FormGroup>
- <FormLink v-for="block in items" :key="block.id" :to="userPage(block.blockee)">
- <MkAcct :user="block.blockee"/>
- </FormLink>
- </FormGroup>
+ <FormLink v-for="block in items" :key="block.id" :to="userPage(block.blockee)">
+ <MkAcct :user="block.blockee"/>
+ </FormLink>
</template>
</MkPagination>
</div>
-</FormBase>
+</div>
</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
+<script lang="ts" setup>
+import { } from 'vue';
import MkPagination from '@/components/ui/pagination.vue';
import MkTab from '@/components/tab.vue';
-import FormInfo from '@/components/debobigego/info.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
+import FormInfo from '@/components/ui/info.vue';
+import FormLink from '@/components/form/link.vue';
import { userPage } from '@/filters/user';
import * as os from '@/os';
import * as symbols from '@/symbols';
+import { i18n } from '@/i18n';
-export default defineComponent({
- components: {
- MkPagination,
- MkTab,
- FormInfo,
- FormBase,
- FormGroup,
- FormLink,
- },
+let tab = $ref('mute');
- emits: ['info'],
+const mutingPagination = {
+ endpoint: 'mute/list' as const,
+ limit: 10,
+};
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: this.$ts.muteAndBlock,
- icon: 'fas fa-ban',
- bg: 'var(--bg)',
- },
- tab: 'mute',
- mutingPagination: {
- endpoint: 'mute/list',
- limit: 10,
- },
- blockingPagination: {
- endpoint: 'blocking/list',
- limit: 10,
- },
- }
- },
+const blockingPagination = {
+ endpoint: 'blocking/list' as const,
+ limit: 10,
+};
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
+defineExpose({
+ [symbols.PAGE_INFO]: {
+ title: i18n.locale.muteAndBlock,
+ icon: 'fas fa-ban',
+ bg: 'var(--bg)',
},
-
- methods: {
- userPage
- }
});
</script>
diff --git a/packages/client/src/pages/settings/notifications.vue b/packages/client/src/pages/settings/notifications.vue
index d3ada0d7ef..12171530bb 100644
--- a/packages/client/src/pages/settings/notifications.vue
+++ b/packages/client/src/pages/settings/notifications.vue
@@ -13,7 +13,6 @@
import { defineComponent } from 'vue';
import FormButton from '@/components/ui/button.vue';
import FormLink from '@/components/form/link.vue';
-import FormBase from '@/components/debobigego/base.vue';
import FormSection from '@/components/form/section.vue';
import { notificationTypes } from 'misskey-js';
import * as os from '@/os';
@@ -21,7 +20,6 @@ import * as symbols from '@/symbols';
export default defineComponent({
components: {
- FormBase,
FormLink,
FormButton,
FormSection,
@@ -39,10 +37,6 @@ export default defineComponent({
}
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
readAllUnreadNotes() {
os.api('i/read-all-unread-notes');
diff --git a/packages/client/src/pages/settings/other.vue b/packages/client/src/pages/settings/other.vue
index 0d9e60e21d..6e48cb58a6 100644
--- a/packages/client/src/pages/settings/other.vue
+++ b/packages/client/src/pages/settings/other.vue
@@ -1,30 +1,12 @@
<template>
<div class="_formRoot">
- <FormLink to="/settings/update" class="_formBlock">Misskey Update</FormLink>
-
- <FormSwitch :value="$i.injectFeaturedNote" @update:modelValue="onChangeInjectFeaturedNote" class="_formBlock">
+ <FormSwitch :value="$i.injectFeaturedNote" class="_formBlock" @update:modelValue="onChangeInjectFeaturedNote">
{{ $ts.showFeaturedNotesInTimeline }}
</FormSwitch>
- <FormSwitch v-model="reportError" class="_formBlock">{{ $ts.sendErrorReports }}<template #desc>{{ $ts.sendErrorReportsDescription }}</template></FormSwitch>
+ <FormSwitch v-model="reportError" class="_formBlock">{{ $ts.sendErrorReports }}<template #caption>{{ $ts.sendErrorReportsDescription }}</template></FormSwitch>
<FormLink to="/settings/account-info" class="_formBlock">{{ $ts.accountInfo }}</FormLink>
- <FormLink to="/settings/experimental-features" class="_formBlock">{{ $ts.experimentalFeatures }}</FormLink>
-
- <FormSection>
- <template #label>{{ $ts.developer }}</template>
- <FormSwitch v-model="debug" @update:modelValue="changeDebug" class="_formBlock">
- DEBUG MODE
- </FormSwitch>
- <template v-if="debug">
- <FormButton @click="taskmanager">Task Manager</FormButton>
- </template>
- </FormSection>
-
- <FormLink to="/settings/registry" class="_formBlock"><template #icon><i class="fas fa-cogs"></i></template>{{ $ts.registry }}</FormLink>
-
- <FormLink to="/bios" behavior="browser" class="_formBlock"><template #icon><i class="fas fa-door-open"></i></template>BIOS</FormLink>
- <FormLink to="/cli" behavior="browser" class="_formBlock"><template #icon><i class="fas fa-door-open"></i></template>CLI</FormLink>
<FormLink to="/settings/delete-account" class="_formBlock"><template #icon><i class="fas fa-exclamation-triangle"></i></template>{{ $ts.closeAccount }}</FormLink>
</div>
@@ -33,10 +15,8 @@
<script lang="ts">
import { defineAsyncComponent, defineComponent } from 'vue';
import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
import FormSection from '@/components/form/section.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormButton from '@/components/debobigego/button.vue';
+import FormLink from '@/components/form/link.vue';
import * as os from '@/os';
import { debug } from '@/config';
import { defaultStore } from '@/store';
@@ -45,10 +25,8 @@ import * as symbols from '@/symbols';
export default defineComponent({
components: {
- FormSelect,
FormSection,
FormSwitch,
- FormButton,
FormLink,
},
@@ -69,10 +47,6 @@ export default defineComponent({
reportError: defaultStore.makeGetterSetter('reportError'),
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
changeDebug(v) {
console.log(v);
@@ -85,11 +59,6 @@ export default defineComponent({
injectFeaturedNote: v
});
},
-
- taskmanager() {
- os.popup(import('@/components/taskmanager.vue'), {
- }, {}, 'closed');
- },
}
});
</script>
diff --git a/packages/client/src/pages/settings/plugin.install.vue b/packages/client/src/pages/settings/plugin.install.vue
index af93ef2930..d35d20d17a 100644
--- a/packages/client/src/pages/settings/plugin.install.vue
+++ b/packages/client/src/pages/settings/plugin.install.vue
@@ -1,15 +1,15 @@
<template>
-<FormBase>
- <FormInfo warn>{{ $ts._plugin.installWarn }}</FormInfo>
+<div class="_formRoot">
+ <FormInfo warn class="_formBlock">{{ $ts._plugin.installWarn }}</FormInfo>
- <FormGroup>
- <FormTextarea v-model="code" tall>
- <span>{{ $ts.code }}</span>
- </FormTextarea>
- </FormGroup>
+ <FormTextarea v-model="code" tall class="_formBlock">
+ <template #label>{{ $ts.code }}</template>
+ </FormTextarea>
- <FormButton :disabled="code == null" primary inline @click="install"><i class="fas fa-check"></i> {{ $ts.install }}</FormButton>
-</FormBase>
+ <div class="_formBlock">
+ <FormButton :disabled="code == null" primary inline @click="install"><i class="fas fa-check"></i> {{ $ts.install }}</FormButton>
+ </div>
+</div>
</template>
<script lang="ts">
@@ -18,13 +18,8 @@ import { AiScript, parse } from '@syuilo/aiscript';
import { serialize } from '@syuilo/aiscript/built/serializer';
import { v4 as uuid } from 'uuid';
import FormTextarea from '@/components/form/textarea.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormRadios from '@/components/form/radios.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormButton from '@/components/debobigego/button.vue';
-import FormInfo from '@/components/debobigego/info.vue';
+import FormButton from '@/components/ui/button.vue';
+import FormInfo from '@/components/ui/info.vue';
import * as os from '@/os';
import { ColdDeviceStorage } from '@/store';
import { unisonReload } from '@/scripts/unison-reload';
@@ -33,11 +28,6 @@ import * as symbols from '@/symbols';
export default defineComponent({
components: {
FormTextarea,
- FormSelect,
- FormRadios,
- FormBase,
- FormGroup,
- FormLink,
FormButton,
FormInfo,
},
@@ -55,10 +45,6 @@ export default defineComponent({
}
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
installPlugin({ id, meta, ast, token }) {
ColdDeviceStorage.set('plugins', ColdDeviceStorage.get('plugins').concat({
diff --git a/packages/client/src/pages/settings/plugin.manage.vue b/packages/client/src/pages/settings/plugin.manage.vue
deleted file mode 100644
index 8b9021dc3d..0000000000
--- a/packages/client/src/pages/settings/plugin.manage.vue
+++ /dev/null
@@ -1,116 +0,0 @@
-<template>
-<FormBase>
- <FormGroup v-for="plugin in plugins" :key="plugin.id">
- <template #label><span style="display: flex;"><b>{{ plugin.name }}</b><span style="margin-left: auto;">v{{ plugin.version }}</span></span></template>
-
- <FormSwitch :modelValue="plugin.active" @update:modelValue="changeActive(plugin, $event)">{{ $ts.makeActive }}</FormSwitch>
- <div class="_debobigegoItem">
- <div class="_debobigegoPanel" style="padding: 16px;">
- <div class="_keyValue">
- <div>{{ $ts.author }}:</div>
- <div>{{ plugin.author }}</div>
- </div>
- <div class="_keyValue">
- <div>{{ $ts.description }}:</div>
- <div>{{ plugin.description }}</div>
- </div>
- <div class="_keyValue">
- <div>{{ $ts.permission }}:</div>
- <div>{{ plugin.permissions }}</div>
- </div>
- </div>
- </div>
- <div class="_debobigegoItem">
- <div class="_debobigegoPanel" style="padding: 16px;">
- <MkButton v-if="plugin.config" inline @click="config(plugin)"><i class="fas fa-cog"></i> {{ $ts.settings }}</MkButton>
- <MkButton inline danger @click="uninstall(plugin)"><i class="fas fa-trash-alt"></i> {{ $ts.uninstall }}</MkButton>
- </div>
- </div>
- </FormGroup>
-</FormBase>
-</template>
-
-<script lang="ts">
-import { defineComponent } from 'vue';
-import MkButton from '@/components/ui/button.vue';
-import MkTextarea from '@/components/form/textarea.vue';
-import MkSelect from '@/components/form/select.vue';
-import FormSwitch from '@/components/form/switch.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
-import * as symbols from '@/symbols';
-import { unisonReload } from '@/scripts/unison-reload';
-
-export default defineComponent({
- components: {
- MkButton,
- MkTextarea,
- MkSelect,
- FormSwitch,
- FormBase,
- FormGroup,
- },
-
- emits: ['info'],
-
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: this.$ts._plugin.manage,
- icon: 'fas fa-plug',
- bg: 'var(--bg)',
- },
- plugins: ColdDeviceStorage.get('plugins'),
- }
- },
-
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
- methods: {
- uninstall(plugin) {
- ColdDeviceStorage.set('plugins', this.plugins.filter(x => x.id !== plugin.id));
- os.success();
- this.$nextTick(() => {
- unisonReload();
- });
- },
-
- // TODO: この処理をstore側にactionとして移動し、設定画面を開くAiScriptAPIを実装できるようにする
- async config(plugin) {
- const config = plugin.config;
- for (const key in plugin.configData) {
- config[key].default = plugin.configData[key];
- }
-
- const { canceled, result } = await os.form(plugin.name, config);
- if (canceled) return;
-
- const plugins = ColdDeviceStorage.get('plugins');
- plugins.find(p => p.id === plugin.id).configData = result;
- ColdDeviceStorage.set('plugins', plugins);
-
- this.$nextTick(() => {
- location.reload();
- });
- },
-
- changeActive(plugin, active) {
- const plugins = ColdDeviceStorage.get('plugins');
- plugins.find(p => p.id === plugin.id).active = active;
- ColdDeviceStorage.set('plugins', plugins);
-
- this.$nextTick(() => {
- location.reload();
- });
- }
- },
-});
-</script>
-
-<style lang="scss" scoped>
-
-</style>
diff --git a/packages/client/src/pages/settings/plugin.vue b/packages/client/src/pages/settings/plugin.vue
index 50e53f459f..7a3ab9d152 100644
--- a/packages/client/src/pages/settings/plugin.vue
+++ b/packages/client/src/pages/settings/plugin.vue
@@ -1,23 +1,54 @@
<template>
-<FormBase>
+<div class="_formRoot">
<FormLink to="/settings/plugin/install"><template #icon><i class="fas fa-download"></i></template>{{ $ts._plugin.install }}</FormLink>
- <FormLink to="/settings/plugin/manage"><template #icon><i class="fas fa-folder-open"></i></template>{{ $ts._plugin.manage }}<template #suffix>{{ plugins }}</template></FormLink>
-</FormBase>
+
+ <FormSection>
+ <template #label>{{ $ts.manage }}</template>
+ <div v-for="plugin in plugins" :key="plugin.id" class="_formBlock _panel" style="padding: 20px;">
+ <span style="display: flex;"><b>{{ plugin.name }}</b><span style="margin-left: auto;">v{{ plugin.version }}</span></span>
+
+ <FormSwitch class="_formBlock" :modelValue="plugin.active" @update:modelValue="changeActive(plugin, $event)">{{ $ts.makeActive }}</FormSwitch>
+
+ <MkKeyValue class="_formBlock">
+ <template #key>{{ $ts.author }}</template>
+ <template #value>{{ plugin.author }}</template>
+ </MkKeyValue>
+ <MkKeyValue class="_formBlock">
+ <template #key>{{ $ts.description }}</template>
+ <template #value>{{ plugin.description }}</template>
+ </MkKeyValue>
+ <MkKeyValue class="_formBlock">
+ <template #key>{{ $ts.permission }}</template>
+ <template #value>{{ plugin.permission }}</template>
+ </MkKeyValue>
+
+ <div style="display: flex; gap: var(--margin); flex-wrap: wrap;">
+ <MkButton v-if="plugin.config" inline @click="config(plugin)"><i class="fas fa-cog"></i> {{ $ts.settings }}</MkButton>
+ <MkButton inline danger @click="uninstall(plugin)"><i class="fas fa-trash-alt"></i> {{ $ts.uninstall }}</MkButton>
+ </div>
+ </div>
+ </FormSection>
+</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormLink from '@/components/debobigego/link.vue';
+import FormLink from '@/components/form/link.vue';
+import FormSwitch from '@/components/form/switch.vue';
+import FormSection from '@/components/form/section.vue';
+import MkButton from '@/components/ui/button.vue';
+import MkKeyValue from '@/components/key-value.vue';
import * as os from '@/os';
import { ColdDeviceStorage } from '@/store';
import * as symbols from '@/symbols';
export default defineComponent({
components: {
- FormBase,
FormLink,
+ FormSwitch,
+ FormSection,
+ MkButton,
+ MkKeyValue,
},
emits: ['info'],
@@ -29,12 +60,47 @@ export default defineComponent({
icon: 'fas fa-plug',
bg: 'var(--bg)',
},
- plugins: ColdDeviceStorage.get('plugins').length,
+ plugins: ColdDeviceStorage.get('plugins'),
}
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
+ methods: {
+ uninstall(plugin) {
+ ColdDeviceStorage.set('plugins', this.plugins.filter(x => x.id !== plugin.id));
+ os.success();
+ this.$nextTick(() => {
+ unisonReload();
+ });
+ },
+
+ // TODO: この処理をstore側にactionとして移動し、設定画面を開くAiScriptAPIを実装できるようにする
+ async config(plugin) {
+ const config = plugin.config;
+ for (const key in plugin.configData) {
+ config[key].default = plugin.configData[key];
+ }
+
+ const { canceled, result } = await os.form(plugin.name, config);
+ if (canceled) return;
+
+ const plugins = ColdDeviceStorage.get('plugins');
+ plugins.find(p => p.id === plugin.id).configData = result;
+ ColdDeviceStorage.set('plugins', plugins);
+
+ this.$nextTick(() => {
+ location.reload();
+ });
+ },
+
+ changeActive(plugin, active) {
+ const plugins = ColdDeviceStorage.get('plugins');
+ plugins.find(p => p.id === plugin.id).active = active;
+ ColdDeviceStorage.set('plugins', plugins);
+
+ this.$nextTick(() => {
+ location.reload();
+ });
+ }
},
});
</script>
diff --git a/packages/client/src/pages/settings/privacy.vue b/packages/client/src/pages/settings/privacy.vue
index 78a0ea8b8d..dd13ba4bd0 100644
--- a/packages/client/src/pages/settings/privacy.vue
+++ b/packages/client/src/pages/settings/privacy.vue
@@ -47,8 +47,8 @@
</div>
</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
+<script lang="ts" setup>
+import { } from 'vue';
import FormSwitch from '@/components/form/switch.vue';
import FormSelect from '@/components/form/select.vue';
import FormSection from '@/components/form/section.vue';
@@ -56,67 +56,39 @@ import FormGroup from '@/components/form/group.vue';
import * as os from '@/os';
import { defaultStore } from '@/store';
import * as symbols from '@/symbols';
+import { i18n } from '@/i18n';
+import { $i } from '@/account';
-export default defineComponent({
- components: {
- FormSelect,
- FormSection,
- FormGroup,
- FormSwitch,
- },
-
- emits: ['info'],
-
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: this.$ts.privacy,
- icon: 'fas fa-lock-open',
- bg: 'var(--bg)',
- },
- isLocked: false,
- autoAcceptFollowed: false,
- noCrawle: false,
- isExplorable: false,
- hideOnlineStatus: false,
- publicReactions: false,
- ffVisibility: 'public',
- }
- },
+let isLocked = $ref($i.isLocked);
+let autoAcceptFollowed = $ref($i.autoAcceptFollowed);
+let noCrawle = $ref($i.noCrawle);
+let isExplorable = $ref($i.isExplorable);
+let hideOnlineStatus = $ref($i.hideOnlineStatus);
+let publicReactions = $ref($i.publicReactions);
+let ffVisibility = $ref($i.ffVisibility);
- computed: {
- defaultNoteVisibility: defaultStore.makeGetterSetter('defaultNoteVisibility'),
- defaultNoteLocalOnly: defaultStore.makeGetterSetter('defaultNoteLocalOnly'),
- rememberNoteVisibility: defaultStore.makeGetterSetter('rememberNoteVisibility'),
- keepCw: defaultStore.makeGetterSetter('keepCw'),
- },
+let defaultNoteVisibility = $computed(defaultStore.makeGetterSetter('defaultNoteVisibility'));
+let defaultNoteLocalOnly = $computed(defaultStore.makeGetterSetter('defaultNoteLocalOnly'));
+let rememberNoteVisibility = $computed(defaultStore.makeGetterSetter('rememberNoteVisibility'));
+let keepCw = $computed(defaultStore.makeGetterSetter('keepCw'));
- created() {
- this.isLocked = this.$i.isLocked;
- this.autoAcceptFollowed = this.$i.autoAcceptFollowed;
- this.noCrawle = this.$i.noCrawle;
- this.isExplorable = this.$i.isExplorable;
- this.hideOnlineStatus = this.$i.hideOnlineStatus;
- this.publicReactions = this.$i.publicReactions;
- this.ffVisibility = this.$i.ffVisibility;
- },
+function save() {
+ os.api('i/update', {
+ isLocked: !!isLocked,
+ autoAcceptFollowed: !!autoAcceptFollowed,
+ noCrawle: !!noCrawle,
+ isExplorable: !!isExplorable,
+ hideOnlineStatus: !!hideOnlineStatus,
+ publicReactions: !!publicReactions,
+ ffVisibility: ffVisibility,
+ });
+}
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
+defineExpose({
+ [symbols.PAGE_INFO]: {
+ title: i18n.locale.privacy,
+ icon: 'fas fa-lock-open',
+ bg: 'var(--bg)',
},
-
- methods: {
- save() {
- os.api('i/update', {
- isLocked: !!this.isLocked,
- autoAcceptFollowed: !!this.autoAcceptFollowed,
- noCrawle: !!this.noCrawle,
- isExplorable: !!this.isExplorable,
- hideOnlineStatus: !!this.hideOnlineStatus,
- publicReactions: !!this.publicReactions,
- ffVisibility: this.ffVisibility,
- });
- }
- }
});
</script>
diff --git a/packages/client/src/pages/settings/profile.vue b/packages/client/src/pages/settings/profile.vue
index 2eaf9a9f83..f875146a2c 100644
--- a/packages/client/src/pages/settings/profile.vue
+++ b/packages/client/src/pages/settings/profile.vue
@@ -3,50 +3,50 @@
<div class="llvierxe" :style="{ backgroundImage: $i.bannerUrl ? `url(${ $i.bannerUrl })` : null }">
<div class="avatar _acrylic">
<MkAvatar class="avatar" :user="$i" :disable-link="true" @click="changeAvatar"/>
- <MkButton primary class="avatarEdit" @click="changeAvatar">{{ $ts._profile.changeAvatar }}</MkButton>
+ <MkButton primary class="avatarEdit" @click="changeAvatar">{{ i18n.locale._profile.changeAvatar }}</MkButton>
</div>
- <MkButton primary class="bannerEdit" @click="changeBanner">{{ $ts._profile.changeBanner }}</MkButton>
+ <MkButton primary class="bannerEdit" @click="changeBanner">{{ i18n.locale._profile.changeBanner }}</MkButton>
</div>
- <FormInput v-model="name" :max="30" manual-save class="_formBlock">
- <template #label>{{ $ts._profile.name }}</template>
+ <FormInput v-model="profile.name" :max="30" manual-save class="_formBlock">
+ <template #label>{{ i18n.locale._profile.name }}</template>
</FormInput>
- <FormTextarea v-model="description" :max="500" tall manual-save class="_formBlock">
- <template #label>{{ $ts._profile.description }}</template>
- <template #caption>{{ $ts._profile.youCanIncludeHashtags }}</template>
+ <FormTextarea v-model="profile.description" :max="500" tall manual-save class="_formBlock">
+ <template #label>{{ i18n.locale._profile.description }}</template>
+ <template #caption>{{ i18n.locale._profile.youCanIncludeHashtags }}</template>
</FormTextarea>
- <FormInput v-model="location" manual-save class="_formBlock">
- <template #label>{{ $ts.location }}</template>
+ <FormInput v-model="profile.location" manual-save class="_formBlock">
+ <template #label>{{ i18n.locale.location }}</template>
<template #prefix><i class="fas fa-map-marker-alt"></i></template>
</FormInput>
- <FormInput v-model="birthday" type="date" manual-save class="_formBlock">
- <template #label>{{ $ts.birthday }}</template>
+ <FormInput v-model="profile.birthday" type="date" manual-save class="_formBlock">
+ <template #label>{{ i18n.locale.birthday }}</template>
<template #prefix><i class="fas fa-birthday-cake"></i></template>
</FormInput>
- <FormSelect v-model="lang" class="_formBlock">
- <template #label>{{ $ts.language }}</template>
+ <FormSelect v-model="profile.lang" class="_formBlock">
+ <template #label>{{ i18n.locale.language }}</template>
<option v-for="x in langs" :key="x[0]" :value="x[0]">{{ x[1] }}</option>
</FormSelect>
<FormSlot>
- <MkButton @click="editMetadata">{{ $ts._profile.metadataEdit }}</MkButton>
- <template #caption>{{ $ts._profile.metadataDescription }}</template>
+ <MkButton @click="editMetadata">{{ i18n.locale._profile.metadataEdit }}</MkButton>
+ <template #caption>{{ i18n.locale._profile.metadataDescription }}</template>
</FormSlot>
- <FormSwitch v-model="isCat" class="_formBlock">{{ $ts.flagAsCat }}<template #caption>{{ $ts.flagAsCatDescription }}</template></FormSwitch>
+ <FormSwitch v-model="profile.isCat" class="_formBlock">{{ i18n.locale.flagAsCat }}<template #caption>{{ i18n.locale.flagAsCatDescription }}</template></FormSwitch>
- <FormSwitch v-model="isBot" class="_formBlock">{{ $ts.flagAsBot }}<template #caption>{{ $ts.flagAsBotDescription }}</template></FormSwitch>
+ <FormSwitch v-model="profile.isBot" class="_formBlock">{{ i18n.locale.flagAsBot }}<template #caption>{{ i18n.locale.flagAsBotDescription }}</template></FormSwitch>
- <FormSwitch v-model="alwaysMarkNsfw" class="_formBlock">{{ $ts.alwaysMarkSensitive }}</FormSwitch>
+ <FormSwitch v-model="profile.alwaysMarkNsfw" class="_formBlock">{{ i18n.locale.alwaysMarkSensitive }}</FormSwitch>
</div>
</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
+<script lang="ts" setup>
+import { defineComponent, reactive, watch } from 'vue';
import MkButton from '@/components/ui/button.vue';
import FormInput from '@/components/form/input.vue';
import FormTextarea from '@/components/form/textarea.vue';
@@ -57,198 +57,149 @@ import { host, langs } from '@/config';
import { selectFile } from '@/scripts/select-file';
import * as os from '@/os';
import * as symbols from '@/symbols';
+import { i18n } from '@/i18n';
+import { $i } from '@/account';
-export default defineComponent({
- components: {
- MkButton,
- FormInput,
- FormTextarea,
- FormSwitch,
- FormSelect,
- FormSlot,
- },
-
- emits: ['info'],
+const profile = reactive({
+ name: $i.name,
+ description: $i.description,
+ location: $i.location,
+ birthday: $i.birthday,
+ lang: $i.lang,
+ isBot: $i.isBot,
+ isCat: $i.isCat,
+ alwaysMarkNsfw: $i.alwaysMarkNsfw,
+});
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: this.$ts.profile,
- icon: 'fas fa-user',
- bg: 'var(--bg)',
- },
- host,
- langs,
- name: null,
- description: null,
- birthday: null,
- lang: null,
- location: null,
- fieldName0: null,
- fieldValue0: null,
- fieldName1: null,
- fieldValue1: null,
- fieldName2: null,
- fieldValue2: null,
- fieldName3: null,
- fieldValue3: null,
- avatarId: null,
- bannerId: null,
- isBot: false,
- isCat: false,
- alwaysMarkNsfw: false,
- saving: false,
- }
- },
+const additionalFields = reactive({
+ fieldName0: $i.fields[0] ? $i.fields[0].name : null,
+ fieldValue0: $i.fields[0] ? $i.fields[0].value : null,
+ fieldName1: $i.fields[1] ? $i.fields[1].name : null,
+ fieldValue1: $i.fields[1] ? $i.fields[1].value : null,
+ fieldName2: $i.fields[2] ? $i.fields[2].name : null,
+ fieldValue2: $i.fields[2] ? $i.fields[2].value : null,
+ fieldName3: $i.fields[3] ? $i.fields[3].name : null,
+ fieldValue3: $i.fields[3] ? $i.fields[3].value : null,
+});
- created() {
- this.name = this.$i.name;
- this.description = this.$i.description;
- this.location = this.$i.location;
- this.birthday = this.$i.birthday;
- this.lang = this.$i.lang;
- this.avatarId = this.$i.avatarId;
- this.bannerId = this.$i.bannerId;
- this.isBot = this.$i.isBot;
- this.isCat = this.$i.isCat;
- this.alwaysMarkNsfw = this.$i.alwaysMarkNsfw;
+watch(() => profile, () => {
+ save();
+}, {
+ deep: true,
+});
- this.fieldName0 = this.$i.fields[0] ? this.$i.fields[0].name : null;
- this.fieldValue0 = this.$i.fields[0] ? this.$i.fields[0].value : null;
- this.fieldName1 = this.$i.fields[1] ? this.$i.fields[1].name : null;
- this.fieldValue1 = this.$i.fields[1] ? this.$i.fields[1].value : null;
- this.fieldName2 = this.$i.fields[2] ? this.$i.fields[2].name : null;
- this.fieldValue2 = this.$i.fields[2] ? this.$i.fields[2].value : null;
- this.fieldName3 = this.$i.fields[3] ? this.$i.fields[3].name : null;
- this.fieldValue3 = this.$i.fields[3] ? this.$i.fields[3].value : null;
+function save() {
+ os.apiWithDialog('i/update', {
+ name: profile.name || null,
+ description: profile.description || null,
+ location: profile.location || null,
+ birthday: profile.birthday || null,
+ lang: profile.lang || null,
+ isBot: !!profile.isBot,
+ isCat: !!profile.isCat,
+ alwaysMarkNsfw: !!profile.alwaysMarkNsfw,
+ });
+}
- this.$watch('name', this.save);
- this.$watch('description', this.save);
- this.$watch('location', this.save);
- this.$watch('birthday', this.save);
- this.$watch('lang', this.save);
- this.$watch('isBot', this.save);
- this.$watch('isCat', this.save);
- this.$watch('alwaysMarkNsfw', this.save);
- },
+function changeAvatar(ev) {
+ selectFile(ev.currentTarget || ev.target, i18n.locale.avatar).then(async (file) => {
+ const i = await os.apiWithDialog('i/update', {
+ avatarId: file.id,
+ });
+ $i.avatarId = i.avatarId;
+ $i.avatarUrl = i.avatarUrl;
+ });
+}
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
+function changeBanner(ev) {
+ selectFile(ev.currentTarget || ev.target, i18n.locale.banner).then(async (file) => {
+ const i = await os.apiWithDialog('i/update', {
+ bannerId: file.id,
+ });
+ $i.bannerId = i.bannerId;
+ $i.bannerUrl = i.bannerUrl;
+ });
+}
- methods: {
- changeAvatar(e) {
- selectFile(e.currentTarget || e.target, this.$ts.avatar).then(file => {
- os.api('i/update', {
- avatarId: file.id,
- });
- });
+async function editMetadata() {
+ const { canceled, result } = await os.form(i18n.locale._profile.metadata, {
+ fieldName0: {
+ type: 'string',
+ label: i18n.locale._profile.metadataLabel + ' 1',
+ default: additionalFields.fieldName0,
},
-
- changeBanner(e) {
- selectFile(e.currentTarget || e.target, this.$ts.banner).then(file => {
- os.api('i/update', {
- bannerId: file.id,
- });
- });
+ fieldValue0: {
+ type: 'string',
+ label: i18n.locale._profile.metadataContent + ' 1',
+ default: additionalFields.fieldValue0,
},
+ fieldName1: {
+ type: 'string',
+ label: i18n.locale._profile.metadataLabel + ' 2',
+ default: additionalFields.fieldName1,
+ },
+ fieldValue1: {
+ type: 'string',
+ label: i18n.locale._profile.metadataContent + ' 2',
+ default: additionalFields.fieldValue1,
+ },
+ fieldName2: {
+ type: 'string',
+ label: i18n.locale._profile.metadataLabel + ' 3',
+ default: additionalFields.fieldName2,
+ },
+ fieldValue2: {
+ type: 'string',
+ label: i18n.locale._profile.metadataContent + ' 3',
+ default: additionalFields.fieldValue2,
+ },
+ fieldName3: {
+ type: 'string',
+ label: i18n.locale._profile.metadataLabel + ' 4',
+ default: additionalFields.fieldName3,
+ },
+ fieldValue3: {
+ type: 'string',
+ label: i18n.locale._profile.metadataContent + ' 4',
+ default: additionalFields.fieldValue3,
+ },
+ });
+ if (canceled) return;
- async editMetadata() {
- const { canceled, result } = await os.form(this.$ts._profile.metadata, {
- fieldName0: {
- type: 'string',
- label: this.$ts._profile.metadataLabel + ' 1',
- default: this.fieldName0,
- },
- fieldValue0: {
- type: 'string',
- label: this.$ts._profile.metadataContent + ' 1',
- default: this.fieldValue0,
- },
- fieldName1: {
- type: 'string',
- label: this.$ts._profile.metadataLabel + ' 2',
- default: this.fieldName1,
- },
- fieldValue1: {
- type: 'string',
- label: this.$ts._profile.metadataContent + ' 2',
- default: this.fieldValue1,
- },
- fieldName2: {
- type: 'string',
- label: this.$ts._profile.metadataLabel + ' 3',
- default: this.fieldName2,
- },
- fieldValue2: {
- type: 'string',
- label: this.$ts._profile.metadataContent + ' 3',
- default: this.fieldValue2,
- },
- fieldName3: {
- type: 'string',
- label: this.$ts._profile.metadataLabel + ' 4',
- default: this.fieldName3,
- },
- fieldValue3: {
- type: 'string',
- label: this.$ts._profile.metadataContent + ' 4',
- default: this.fieldValue3,
- },
- });
- if (canceled) return;
-
- this.fieldName0 = result.fieldName0;
- this.fieldValue0 = result.fieldValue0;
- this.fieldName1 = result.fieldName1;
- this.fieldValue1 = result.fieldValue1;
- this.fieldName2 = result.fieldName2;
- this.fieldValue2 = result.fieldValue2;
- this.fieldName3 = result.fieldName3;
- this.fieldValue3 = result.fieldValue3;
-
- const fields = [
- { name: this.fieldName0, value: this.fieldValue0 },
- { name: this.fieldName1, value: this.fieldValue1 },
- { name: this.fieldName2, value: this.fieldValue2 },
- { name: this.fieldName3, value: this.fieldValue3 },
- ];
+ additionalFields.fieldName0 = result.fieldName0;
+ additionalFields.fieldValue0 = result.fieldValue0;
+ additionalFields.fieldName1 = result.fieldName1;
+ additionalFields.fieldValue1 = result.fieldValue1;
+ additionalFields.fieldName2 = result.fieldName2;
+ additionalFields.fieldValue2 = result.fieldValue2;
+ additionalFields.fieldName3 = result.fieldName3;
+ additionalFields.fieldValue3 = result.fieldValue3;
- os.api('i/update', {
- fields,
- }).then(i => {
- os.success();
- }).catch(err => {
- os.alert({
- type: 'error',
- text: err.id
- });
- });
- },
+ const fields = [
+ { name: additionalFields.fieldName0, value: additionalFields.fieldValue0 },
+ { name: additionalFields.fieldName1, value: additionalFields.fieldValue1 },
+ { name: additionalFields.fieldName2, value: additionalFields.fieldValue2 },
+ { name: additionalFields.fieldName3, value: additionalFields.fieldValue3 },
+ ];
- save() {
- this.saving = true;
+ os.api('i/update', {
+ fields,
+ }).then(i => {
+ os.success();
+ }).catch(err => {
+ os.alert({
+ type: 'error',
+ text: err.id
+ });
+ });
+}
- os.apiWithDialog('i/update', {
- name: this.name || null,
- description: this.description || null,
- location: this.location || null,
- birthday: this.birthday || null,
- lang: this.lang || null,
- isBot: !!this.isBot,
- isCat: !!this.isCat,
- alwaysMarkNsfw: !!this.alwaysMarkNsfw,
- }).then(i => {
- this.saving = false;
- this.$i.avatarId = i.avatarId;
- this.$i.avatarUrl = i.avatarUrl;
- this.$i.bannerId = i.bannerId;
- this.$i.bannerUrl = i.bannerUrl;
- }).catch(err => {
- this.saving = false;
- });
- },
- }
+defineExpose({
+ [symbols.PAGE_INFO]: {
+ title: i18n.locale.profile,
+ icon: 'fas fa-user',
+ bg: 'var(--bg)',
+ },
});
</script>
diff --git a/packages/client/src/pages/settings/reaction.vue b/packages/client/src/pages/settings/reaction.vue
index 0d4db46936..e5b1189947 100644
--- a/packages/client/src/pages/settings/reaction.vue
+++ b/packages/client/src/pages/settings/reaction.vue
@@ -100,10 +100,6 @@ export default defineComponent({
}
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
save() {
this.$store.set('reactions', this.reactions);
diff --git a/packages/client/src/pages/settings/registry.keys.vue b/packages/client/src/pages/settings/registry.keys.vue
deleted file mode 100644
index 89953ebea1..0000000000
--- a/packages/client/src/pages/settings/registry.keys.vue
+++ /dev/null
@@ -1,114 +0,0 @@
-<template>
-<FormBase>
- <FormGroup>
- <FormKeyValueView>
- <template #key>{{ $ts._registry.domain }}</template>
- <template #value>{{ $ts.system }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
- <template #key>{{ $ts._registry.scope }}</template>
- <template #value>{{ scope.join('/') }}</template>
- </FormKeyValueView>
- </FormGroup>
-
- <FormGroup v-if="keys">
- <template #label>{{ $ts._registry.keys }}</template>
- <FormLink v-for="key in keys" :to="`/settings/registry/value/system/${scope.join('/')}/${key[0]}`" class="_monospace">{{ key[0] }}<template #suffix>{{ key[1].toUpperCase() }}</template></FormLink>
- </FormGroup>
-
- <FormButton primary @click="createKey">{{ $ts._registry.createKey }}</FormButton>
-</FormBase>
-</template>
-
-<script lang="ts">
-import { defineAsyncComponent, defineComponent } from 'vue';
-import * as JSON5 from 'json5';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormButton from '@/components/debobigego/button.vue';
-import FormKeyValueView from '@/components/debobigego/key-value-view.vue';
-import * as os from '@/os';
-import * as symbols from '@/symbols';
-
-export default defineComponent({
- components: {
- FormBase,
- FormSelect,
- FormSwitch,
- FormButton,
- FormLink,
- FormGroup,
- FormKeyValueView,
- },
-
- props: {
- scope: {
- required: true
- }
- },
-
- emits: ['info'],
-
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: this.$ts.registry,
- icon: 'fas fa-cogs',
- bg: 'var(--bg)',
- },
- keys: null,
- }
- },
-
- watch: {
- scope() {
- this.fetch();
- }
- },
-
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- this.fetch();
- },
-
- methods: {
- fetch() {
- os.api('i/registry/keys-with-type', {
- scope: this.scope
- }).then(keys => {
- this.keys = Object.entries(keys).sort((a, b) => a[0].localeCompare(b[0]));
- });
- },
-
- async createKey() {
- const { canceled, result } = await os.form(this.$ts._registry.createKey, {
- key: {
- type: 'string',
- label: this.$ts._registry.key,
- },
- value: {
- type: 'string',
- multiline: true,
- label: this.$ts.value,
- },
- scope: {
- type: 'string',
- label: this.$ts._registry.scope,
- default: this.scope.join('/')
- }
- });
- if (canceled) return;
- os.apiWithDialog('i/registry/set', {
- scope: result.scope.split('/'),
- key: result.key,
- value: JSON5.parse(result.value),
- }).then(() => {
- this.fetch();
- });
- }
- }
-});
-</script>
diff --git a/packages/client/src/pages/settings/registry.value.vue b/packages/client/src/pages/settings/registry.value.vue
deleted file mode 100644
index 6acd3f6048..0000000000
--- a/packages/client/src/pages/settings/registry.value.vue
+++ /dev/null
@@ -1,147 +0,0 @@
-<template>
-<FormBase>
- <FormInfo warn>{{ $ts.editTheseSettingsMayBreakAccount }}</FormInfo>
-
- <template v-if="value">
- <FormGroup>
- <FormKeyValueView>
- <template #key>{{ $ts._registry.domain }}</template>
- <template #value>{{ $ts.system }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
- <template #key>{{ $ts._registry.scope }}</template>
- <template #value>{{ scope.join('/') }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
- <template #key>{{ $ts._registry.key }}</template>
- <template #value>{{ xKey }}</template>
- </FormKeyValueView>
- </FormGroup>
-
- <FormGroup>
- <FormTextarea v-model="valueForEditor" tall class="_monospace" style="tab-size: 2;">
- <span>{{ $ts.value }} (JSON)</span>
- </FormTextarea>
- <FormButton primary @click="save"><i class="fas fa-save"></i> {{ $ts.save }}</FormButton>
- </FormGroup>
-
- <FormKeyValueView>
- <template #key>{{ $ts.updatedAt }}</template>
- <template #value><MkTime :time="value.updatedAt" mode="detail"/></template>
- </FormKeyValueView>
-
- <FormButton danger @click="del"><i class="fas fa-trash"></i> {{ $ts.delete }}</FormButton>
- </template>
-</FormBase>
-</template>
-
-<script lang="ts">
-import { defineAsyncComponent, defineComponent } from 'vue';
-import * as JSON5 from 'json5';
-import FormInfo from '@/components/debobigego/info.vue';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormTextarea from '@/components/form/textarea.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormButton from '@/components/debobigego/button.vue';
-import FormKeyValueView from '@/components/debobigego/key-value-view.vue';
-import * as os from '@/os';
-import * as symbols from '@/symbols';
-
-export default defineComponent({
- components: {
- FormInfo,
- FormBase,
- FormSelect,
- FormSwitch,
- FormButton,
- FormTextarea,
- FormGroup,
- FormKeyValueView,
- },
-
- props: {
- scope: {
- required: true
- },
- xKey: {
- required: true
- },
- },
-
- emits: ['info'],
-
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: this.$ts.registry,
- icon: 'fas fa-cogs',
- bg: 'var(--bg)',
- },
- value: null,
- valueForEditor: null,
- }
- },
-
- watch: {
- key() {
- this.fetch();
- },
- },
-
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- this.fetch();
- },
-
- methods: {
- fetch() {
- os.api('i/registry/get-detail', {
- scope: this.scope,
- key: this.xKey
- }).then(value => {
- this.value = value;
- this.valueForEditor = JSON5.stringify(this.value.value, null, '\t');
- });
- },
-
- save() {
- try {
- JSON5.parse(this.valueForEditor);
- } catch (e) {
- os.alert({
- type: 'error',
- text: this.$ts.invalidValue
- });
- return;
- }
-
- os.confirm({
- type: 'warning',
- text: this.$ts.saveConfirm,
- }).then(({ canceled }) => {
- if (canceled) return;
- os.apiWithDialog('i/registry/set', {
- scope: this.scope,
- key: this.xKey,
- value: JSON5.parse(this.valueForEditor)
- });
- });
- },
-
- del() {
- os.confirm({
- type: 'warning',
- text: this.$ts.deleteConfirm,
- }).then(({ canceled }) => {
- if (canceled) return;
- os.apiWithDialog('i/registry/remove', {
- scope: this.scope,
- key: this.xKey
- });
- });
- }
- }
-});
-</script>
diff --git a/packages/client/src/pages/settings/registry.vue b/packages/client/src/pages/settings/registry.vue
deleted file mode 100644
index 6faff5d2a4..0000000000
--- a/packages/client/src/pages/settings/registry.vue
+++ /dev/null
@@ -1,90 +0,0 @@
-<template>
-<FormBase>
- <FormGroup v-if="scopes">
- <template #label>{{ $ts.system }}</template>
- <FormLink v-for="scope in scopes" :to="`/settings/registry/keys/system/${scope.join('/')}`" class="_monospace">{{ scope.join('/') }}</FormLink>
- </FormGroup>
- <FormButton primary @click="createKey">{{ $ts._registry.createKey }}</FormButton>
-</FormBase>
-</template>
-
-<script lang="ts">
-import { defineAsyncComponent, defineComponent } from 'vue';
-import * as JSON5 from 'json5';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormButton from '@/components/debobigego/button.vue';
-import FormKeyValueView from '@/components/debobigego/key-value-view.vue';
-import * as os from '@/os';
-import * as symbols from '@/symbols';
-
-export default defineComponent({
- components: {
- FormBase,
- FormSelect,
- FormSwitch,
- FormButton,
- FormLink,
- FormGroup,
- FormKeyValueView,
- },
-
- emits: ['info'],
-
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: this.$ts.registry,
- icon: 'fas fa-cogs',
- bg: 'var(--bg)',
- },
- scopes: null,
- }
- },
-
- created() {
- this.fetch();
- },
-
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
- methods: {
- fetch() {
- os.api('i/registry/scopes').then(scopes => {
- this.scopes = scopes.slice().sort((a, b) => a.join('/').localeCompare(b.join('/')));
- });
- },
-
- async createKey() {
- const { canceled, result } = await os.form(this.$ts._registry.createKey, {
- key: {
- type: 'string',
- label: this.$ts._registry.key,
- },
- value: {
- type: 'string',
- multiline: true,
- label: this.$ts.value,
- },
- scope: {
- type: 'string',
- label: this.$ts._registry.scope,
- }
- });
- if (canceled) return;
- os.apiWithDialog('i/registry/set', {
- scope: result.scope.split('/'),
- key: result.key,
- value: JSON5.parse(result.value),
- }).then(() => {
- this.fetch();
- });
- }
- }
-});
-</script>
diff --git a/packages/client/src/pages/settings/security.vue b/packages/client/src/pages/settings/security.vue
index 069f9d964d..6fb3f1c413 100644
--- a/packages/client/src/pages/settings/security.vue
+++ b/packages/client/src/pages/settings/security.vue
@@ -12,7 +12,7 @@
<FormSection>
<template #label>{{ $ts.signinHistory }}</template>
- <FormPagination :pagination="pagination">
+ <MkPagination :pagination="pagination">
<template v-slot="{items}">
<div>
<div v-for="item in items" :key="item.id" v-panel class="timnmucd">
@@ -25,7 +25,7 @@
</div>
</div>
</template>
- </FormPagination>
+ </MkPagination>
</FormSection>
<FormSection>
@@ -40,10 +40,9 @@
<script lang="ts">
import { defineComponent } from 'vue';
import FormSection from '@/components/form/section.vue';
-import FormLink from '@/components/debobigego/link.vue';
import FormSlot from '@/components/form/slot.vue';
import FormButton from '@/components/ui/button.vue';
-import FormPagination from '@/components/form/pagination.vue';
+import MkPagination from '@/components/ui/pagination.vue';
import X2fa from './2fa.vue';
import * as os from '@/os';
import * as symbols from '@/symbols';
@@ -51,9 +50,8 @@ import * as symbols from '@/symbols';
export default defineComponent({
components: {
FormSection,
- FormLink,
FormButton,
- FormPagination,
+ MkPagination,
FormSlot,
X2fa,
},
@@ -68,16 +66,12 @@ export default defineComponent({
bg: 'var(--bg)',
},
pagination: {
- endpoint: 'i/signin-history',
+ endpoint: 'i/signin-history' as const,
limit: 5,
},
}
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
async change() {
const { canceled: canceled1, result: currentPassword } = await os.inputText({
diff --git a/packages/client/src/pages/settings/sounds.vue b/packages/client/src/pages/settings/sounds.vue
index 0977dd8322..490a1b5514 100644
--- a/packages/client/src/pages/settings/sounds.vue
+++ b/packages/client/src/pages/settings/sounds.vue
@@ -94,12 +94,6 @@ export default defineComponent({
this.sounds.chatBg = ColdDeviceStorage.get('sound_chatBg');
this.sounds.antenna = ColdDeviceStorage.get('sound_antenna');
this.sounds.channel = ColdDeviceStorage.get('sound_channel');
- this.sounds.reversiPutBlack = ColdDeviceStorage.get('sound_reversiPutBlack');
- this.sounds.reversiPutWhite = ColdDeviceStorage.get('sound_reversiPutWhite');
- },
-
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
},
methods: {
diff --git a/packages/client/src/pages/settings/theme.install.vue b/packages/client/src/pages/settings/theme.install.vue
index c3e531afb2..e2a3f042b9 100644
--- a/packages/client/src/pages/settings/theme.install.vue
+++ b/packages/client/src/pages/settings/theme.install.vue
@@ -1,105 +1,79 @@
<template>
-<FormBase>
- <FormGroup>
- <FormTextarea v-model="installThemeCode">
- <span>{{ $ts._theme.code }}</span>
- </FormTextarea>
- <FormButton :disabled="installThemeCode == null" inline @click="() => preview(installThemeCode)"><i class="fas fa-eye"></i> {{ $ts.preview }}</FormButton>
- </FormGroup>
+<div class="_formRoot">
+ <FormTextarea v-model="installThemeCode" class="_formBlock">
+ <template #label>{{ i18n.locale._theme.code }}</template>
+ </FormTextarea>
- <FormButton :disabled="installThemeCode == null" primary inline @click="() => install(installThemeCode)"><i class="fas fa-check"></i> {{ $ts.install }}</FormButton>
-</FormBase>
+ <div class="_formBlock" style="display: flex; gap: var(--margin); flex-wrap: wrap;">
+ <FormButton :disabled="installThemeCode == null" inline @click="() => preview(installThemeCode)"><i class="fas fa-eye"></i> {{ i18n.locale.preview }}</FormButton>
+ <FormButton :disabled="installThemeCode == null" primary inline @click="() => install(installThemeCode)"><i class="fas fa-check"></i> {{ i18n.locale.install }}</FormButton>
+ </div>
+</div>
</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
+<script lang="ts" setup>
+import { } from 'vue';
import * as JSON5 from 'json5';
import FormTextarea from '@/components/form/textarea.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormRadios from '@/components/form/radios.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormButton from '@/components/debobigego/button.vue';
+import FormButton from '@/components/ui/button.vue';
import { applyTheme, validateTheme } from '@/scripts/theme';
import * as os from '@/os';
-import { ColdDeviceStorage } from '@/store';
import { addTheme, getThemes } from '@/theme-store';
import * as symbols from '@/symbols';
+import { i18n } from '@/i18n';
-export default defineComponent({
- components: {
- FormTextarea,
- FormSelect,
- FormRadios,
- FormBase,
- FormGroup,
- FormLink,
- FormButton,
- },
-
- emits: ['info'],
+let installThemeCode = $ref(null);
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: this.$ts._theme.install,
- icon: 'fas fa-download',
- bg: 'var(--bg)',
- },
- installThemeCode: null,
- }
- },
-
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
+function parseThemeCode(code: string) {
+ let theme;
- methods: {
- parseThemeCode(code) {
- let theme;
+ try {
+ theme = JSON5.parse(code);
+ } catch (e) {
+ os.alert({
+ type: 'error',
+ text: i18n.locale._theme.invalid
+ });
+ return false;
+ }
+ if (!validateTheme(theme)) {
+ os.alert({
+ type: 'error',
+ text: i18n.locale._theme.invalid
+ });
+ return false;
+ }
+ if (getThemes().some(t => t.id === theme.id)) {
+ os.alert({
+ type: 'info',
+ text: i18n.locale._theme.alreadyInstalled
+ });
+ return false;
+ }
- try {
- theme = JSON5.parse(code);
- } catch (e) {
- os.alert({
- type: 'error',
- text: this.$ts._theme.invalid
- });
- return false;
- }
- if (!validateTheme(theme)) {
- os.alert({
- type: 'error',
- text: this.$ts._theme.invalid
- });
- return false;
- }
- if (getThemes().some(t => t.id === theme.id)) {
- os.alert({
- type: 'info',
- text: this.$ts._theme.alreadyInstalled
- });
- return false;
- }
+ return theme;
+}
- return theme;
- },
+function preview(code: string): void {
+ const theme = parseThemeCode(code);
+ if (theme) applyTheme(theme, false);
+}
- preview(code) {
- const theme = this.parseThemeCode(code);
- if (theme) applyTheme(theme, false);
- },
+async function install(code: string): Promise<void> {
+ const theme = parseThemeCode(code);
+ if (!theme) return;
+ await addTheme(theme);
+ os.alert({
+ type: 'success',
+ text: i18n.t('_theme.installed', { name: theme.name })
+ });
+}
- async install(code) {
- const theme = this.parseThemeCode(code);
- if (!theme) return;
- await addTheme(theme);
- os.alert({
- type: 'success',
- text: this.$t('_theme.installed', { name: theme.name })
- });
- },
- }
+defineExpose({
+ [symbols.PAGE_INFO]: {
+ title: i18n.locale._theme.install,
+ icon: 'fas fa-download',
+ bg: 'var(--bg)',
+ },
});
</script>
diff --git a/packages/client/src/pages/settings/theme.manage.vue b/packages/client/src/pages/settings/theme.manage.vue
index c605b1eb64..a1e849b540 100644
--- a/packages/client/src/pages/settings/theme.manage.vue
+++ b/packages/client/src/pages/settings/theme.manage.vue
@@ -30,9 +30,6 @@ import { defineComponent } from 'vue';
import * as JSON5 from 'json5';
import FormTextarea from '@/components/form/textarea.vue';
import FormSelect from '@/components/form/select.vue';
-import FormRadios from '@/components/form/radios.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
import FormInput from '@/components/form/input.vue';
import FormButton from '@/components/ui/button.vue';
import { Theme, builtinThemes } from '@/scripts/theme';
@@ -46,9 +43,6 @@ export default defineComponent({
components: {
FormTextarea,
FormSelect,
- FormRadios,
- FormBase,
- FormGroup,
FormInput,
FormButton,
},
@@ -84,10 +78,6 @@ export default defineComponent({
},
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
copyThemeCode() {
copyToClipboard(this.selectedThemeCode);
diff --git a/packages/client/src/pages/settings/theme.vue b/packages/client/src/pages/settings/theme.vue
index 6c88b65699..658e36ec05 100644
--- a/packages/client/src/pages/settings/theme.vue
+++ b/packages/client/src/pages/settings/theme.vue
@@ -163,10 +163,6 @@ export default defineComponent({
location.reload();
});
- onMounted(() => {
- emit('info', INFO);
- });
-
onActivated(() => {
fetchThemes().then(() => {
installedThemes.value = getThemes();
diff --git a/packages/client/src/pages/settings/update.vue b/packages/client/src/pages/settings/update.vue
deleted file mode 100644
index e0d8f6d15c..0000000000
--- a/packages/client/src/pages/settings/update.vue
+++ /dev/null
@@ -1,95 +0,0 @@
-<template>
-<FormBase>
- <template v-if="meta">
- <FormInfo v-if="version === meta.version">{{ $ts.youAreRunningUpToDateClient }}</FormInfo>
- <FormInfo v-else warn>{{ $ts.newVersionOfClientAvailable }}</FormInfo>
- </template>
- <FormGroup>
- <template #label>{{ instanceName }}</template>
- <FormKeyValueView>
- <template #key>{{ $ts.currentVersion }}</template>
- <template #value>{{ version }}</template>
- </FormKeyValueView>
- <FormKeyValueView>
- <template #key>{{ $ts.latestVersion }}</template>
- <template v-if="meta" #value>{{ meta.version }}</template>
- <template v-else #value><MkEllipsis/></template>
- </FormKeyValueView>
- </FormGroup>
- <FormGroup>
- <template #label>Misskey</template>
- <FormKeyValueView>
- <template #key>{{ $ts.latestVersion }}</template>
- <template v-if="releases" #value>{{ releases[0].tag_name }}</template>
- <template v-else #value><MkEllipsis/></template>
- </FormKeyValueView>
- <template v-if="releases" #caption><MkTime :time="releases[0].published_at" mode="detail"/></template>
- </FormGroup>
-</FormBase>
-</template>
-
-<script lang="ts">
-import { defineAsyncComponent, defineComponent } from 'vue';
-import FormSwitch from '@/components/form/switch.vue';
-import FormSelect from '@/components/form/select.vue';
-import FormLink from '@/components/debobigego/link.vue';
-import FormBase from '@/components/debobigego/base.vue';
-import FormGroup from '@/components/debobigego/group.vue';
-import FormButton from '@/components/debobigego/button.vue';
-import FormKeyValueView from '@/components/debobigego/key-value-view.vue';
-import FormInfo from '@/components/debobigego/info.vue';
-import * as os from '@/os';
-import { version, instanceName } from '@/config';
-import * as symbols from '@/symbols';
-
-export default defineComponent({
- components: {
- FormBase,
- FormSelect,
- FormSwitch,
- FormButton,
- FormLink,
- FormGroup,
- FormKeyValueView,
- FormInfo,
- },
-
- emits: ['info'],
-
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: 'Misskey Update',
- icon: 'fas fa-sync-alt',
- bg: 'var(--bg)',
- },
- version,
- instanceName,
- releases: null,
- meta: null
- }
- },
-
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
-
- os.api('meta', {
- detail: false
- }).then(meta => {
- this.meta = meta;
- localStorage.setItem('v', meta.version);
- });
-
- fetch('https://api.github.com/repos/misskey-dev/misskey/releases', {
- method: 'GET',
- })
- .then(res => res.json())
- .then(res => {
- this.releases = res;
- });
- },
-
- methods: {
- }
-});
-</script>
diff --git a/packages/client/src/pages/settings/word-mute.vue b/packages/client/src/pages/settings/word-mute.vue
index 068f88740a..19980dea14 100644
--- a/packages/client/src/pages/settings/word-mute.vue
+++ b/packages/client/src/pages/settings/word-mute.vue
@@ -31,7 +31,6 @@
<script lang="ts">
import { defineComponent } from 'vue';
import FormTextarea from '@/components/form/textarea.vue';
-import FormBase from '@/components/debobigego/base.vue';
import MkKeyValue from '@/components/key-value.vue';
import MkButton from '@/components/ui/button.vue';
import MkInfo from '@/components/ui/info.vue';
@@ -42,7 +41,6 @@ import * as symbols from '@/symbols';
export default defineComponent({
components: {
- FormBase,
MkButton,
FormTextarea,
MkKeyValue,
@@ -89,10 +87,6 @@ export default defineComponent({
this.hardWordMutedNotesCount = (await os.api('i/get-word-muted-notes-count', {})).count;
},
- mounted() {
- this.$emit('info', this[symbols.PAGE_INFO]);
- },
-
methods: {
async save() {
this.$store.set('mutedWords', this.softMutedWords.trim().split('\n').map(x => x.trim().split(' ')));