diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2021-10-16 19:55:44 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2021-10-16 19:55:44 +0900 |
| commit | 8a1f3a4c0b5732d0f08f0788d93c5934de8960c8 (patch) | |
| tree | be6fbcf3a1bbd78306d91e19ef6f3e7023f41561 /src/client/pages/instance | |
| parent | Merge branch 'develop' (diff) | |
| parent | 12.92.0 (diff) | |
| download | misskey-8a1f3a4c0b5732d0f08f0788d93c5934de8960c8.tar.gz misskey-8a1f3a4c0b5732d0f08f0788d93c5934de8960c8.tar.bz2 misskey-8a1f3a4c0b5732d0f08f0788d93c5934de8960c8.zip | |
Merge branch 'develop'
Diffstat (limited to 'src/client/pages/instance')
31 files changed, 625 insertions, 400 deletions
diff --git a/src/client/pages/instance/abuses.vue b/src/client/pages/instance/abuses.vue index ac20ebabe5..29da8cc2c5 100644 --- a/src/client/pages/instance/abuses.vue +++ b/src/client/pages/instance/abuses.vue @@ -24,10 +24,10 @@ </div> <!-- TODO <div class="inputs" style="display: flex; padding-top: 1.2em;"> - <MkInput v-model:value="searchUsername" style="margin: 0; flex: 1;" type="text" spellcheck="false" @update:value="$refs.reports.reload()"> + <MkInput v-model="searchUsername" style="margin: 0; flex: 1;" type="text" spellcheck="false" @update:modelValue="$refs.reports.reload()"> <span>{{ $ts.username }}</span> </MkInput> - <MkInput v-model:value="searchHost" style="margin: 0; flex: 1;" type="text" spellcheck="false" @update:value="$refs.reports.reload()" :disabled="pagination.params().origin === 'local'"> + <MkInput v-model="searchHost" style="margin: 0; flex: 1;" type="text" spellcheck="false" @update:modelValue="$refs.reports.reload()" :disabled="pagination.params().origin === 'local'"> <span>{{ $ts.host }}</span> </MkInput> </div> @@ -65,8 +65,8 @@ import { defineComponent } from 'vue'; import { parseAcct } from '@/misc/acct'; import MkButton from '@client/components/ui/button.vue'; -import MkInput from '@client/components/ui/input.vue'; -import MkSelect from '@client/components/ui/select.vue'; +import MkInput from '@client/components/form/input.vue'; +import MkSelect from '@client/components/form/select.vue'; import MkPagination from '@client/components/ui/pagination.vue'; import { acct } from '@client/filters/user'; import * as os from '@client/os'; @@ -86,7 +86,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.abuseReports, - icon: 'fas fa-exclamation-circle' + icon: 'fas fa-exclamation-circle', + bg: 'var(--bg)', }, searchUsername: '', searchHost: '', diff --git a/src/client/pages/instance/ads.vue b/src/client/pages/instance/ads.vue index 50c8c29cbf..e776f99a4c 100644 --- a/src/client/pages/instance/ads.vue +++ b/src/client/pages/instance/ads.vue @@ -1,52 +1,54 @@ <template> -<div class="uqshojas"> - <MkButton @click="add()" primary style="margin: 0 auto 16px auto;"><i class="fas fa-plus"></i> {{ $ts.add }}</MkButton> - <section class="_card _gap ads" v-for="ad in ads"> - <div class="_content ad"> - <MkAd v-if="ad.url" :specify="ad"/> - <MkInput v-model="ad.url" type="url"> - <template #label>URL</template> - </MkInput> - <MkInput v-model="ad.imageUrl"> - <template #label>{{ $ts.imageUrl }}</template> - </MkInput> - <div style="margin: 32px 0;"> - <MkRadio v-model="ad.place" value="square">square</MkRadio> - <MkRadio v-model="ad.place" value="horizontal">horizontal</MkRadio> - <MkRadio v-model="ad.place" value="horizontal-big">horizontal-big</MkRadio> +<div> + <MkHeader :info="header"/> + <div class="uqshojas"> + <section class="_card _gap ads" v-for="ad in ads"> + <div class="_content ad"> + <MkAd v-if="ad.url" :specify="ad"/> + <MkInput v-model="ad.url" type="url"> + <template #label>URL</template> + </MkInput> + <MkInput v-model="ad.imageUrl"> + <template #label>{{ $ts.imageUrl }}</template> + </MkInput> + <div style="margin: 32px 0;"> + <MkRadio v-model="ad.place" value="square">square</MkRadio> + <MkRadio v-model="ad.place" value="horizontal">horizontal</MkRadio> + <MkRadio v-model="ad.place" value="horizontal-big">horizontal-big</MkRadio> + </div> + <!-- + <div style="margin: 32px 0;"> + {{ $ts.priority }} + <MkRadio v-model="ad.priority" value="high">{{ $ts.high }}</MkRadio> + <MkRadio v-model="ad.priority" value="middle">{{ $ts.middle }}</MkRadio> + <MkRadio v-model="ad.priority" value="low">{{ $ts.low }}</MkRadio> + </div> + --> + <MkInput v-model="ad.ratio" type="number"> + <template #label>{{ $ts.ratio }}</template> + </MkInput> + <MkInput v-model="ad.expiresAt" type="date"> + <template #label>{{ $ts.expiration }}</template> + </MkInput> + <MkTextarea v-model="ad.memo"> + <template #label>{{ $ts.memo }}</template> + </MkTextarea> + <div class="buttons"> + <MkButton class="button" inline @click="save(ad)" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton> + <MkButton class="button" inline @click="remove(ad)" danger><i class="fas fa-trash-alt"></i> {{ $ts.remove }}</MkButton> + </div> </div> - <!-- - <div style="margin: 32px 0;"> - {{ $ts.priority }} - <MkRadio v-model="ad.priority" value="high">{{ $ts.high }}</MkRadio> - <MkRadio v-model="ad.priority" value="middle">{{ $ts.middle }}</MkRadio> - <MkRadio v-model="ad.priority" value="low">{{ $ts.low }}</MkRadio> - </div> - --> - <MkInput v-model="ad.ratio" type="number"> - <template #label>{{ $ts.ratio }}</template> - </MkInput> - <MkInput v-model="ad.expiresAt" type="date"> - <template #label>{{ $ts.expiration }}</template> - </MkInput> - <MkTextarea v-model="ad.memo"> - <template #label>{{ $ts.memo }}</template> - </MkTextarea> - <div class="buttons"> - <MkButton class="button" inline @click="save(ad)" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton> - <MkButton class="button" inline @click="remove(ad)" danger><i class="fas fa-trash-alt"></i> {{ $ts.remove }}</MkButton> - </div> - </div> - </section> + </section> + </div> </div> </template> <script lang="ts"> import { defineComponent } from 'vue'; import MkButton from '@client/components/ui/button.vue'; -import MkInput from '@client/components/ui/input.vue'; -import MkTextarea from '@client/components/ui/textarea.vue'; -import MkRadio from '@client/components/ui/radio.vue'; +import MkInput from '@client/components/form/input.vue'; +import MkTextarea from '@client/components/form/textarea.vue'; +import MkRadio from '@client/components/form/radio.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; @@ -64,7 +66,19 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.ads, - icon: 'fas fa-audio-description' + icon: 'fas fa-audio-description', + bg: 'var(--bg)', + }, + header: { + title: this.$ts.ads, + icon: 'fas fa-audio-description', + bg: 'var(--bg)', + actions: [{ + asFullButton: true, + icon: 'fas fa-plus', + text: this.$ts.add, + handler: this.add, + }], }, ads: [], } diff --git a/src/client/pages/instance/announcements.vue b/src/client/pages/instance/announcements.vue index d48e3737ad..78637c095a 100644 --- a/src/client/pages/instance/announcements.vue +++ b/src/client/pages/instance/announcements.vue @@ -1,32 +1,35 @@ <template> -<div class="ztgjmzrw"> - <MkButton @click="add()" primary style="margin: 0 auto 16px auto;"><i class="fas fa-plus"></i> {{ $ts.add }}</MkButton> - <section class="_card _gap announcements" v-for="announcement in announcements"> - <div class="_content announcement"> - <MkInput v-model="announcement.title"> - <template #label>{{ $ts.title }}</template> - </MkInput> - <MkTextarea v-model="announcement.text"> - <template #label>{{ $ts.text }}</template> - </MkTextarea> - <MkInput v-model="announcement.imageUrl"> - <template #label>{{ $ts.imageUrl }}</template> - </MkInput> - <p v-if="announcement.reads">{{ $t('nUsersRead', { n: announcement.reads }) }}</p> - <div class="buttons"> - <MkButton class="button" inline @click="save(announcement)" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton> - <MkButton class="button" inline @click="remove(announcement)"><i class="fas fa-trash-alt"></i> {{ $ts.remove }}</MkButton> +<div> + <MkHeader :info="header"/> + + <div class="ztgjmzrw"> + <section class="_card _gap announcements" v-for="announcement in announcements"> + <div class="_content announcement"> + <MkInput v-model="announcement.title"> + <template #label>{{ $ts.title }}</template> + </MkInput> + <MkTextarea v-model="announcement.text"> + <template #label>{{ $ts.text }}</template> + </MkTextarea> + <MkInput v-model="announcement.imageUrl"> + <template #label>{{ $ts.imageUrl }}</template> + </MkInput> + <p v-if="announcement.reads">{{ $t('nUsersRead', { n: announcement.reads }) }}</p> + <div class="buttons"> + <MkButton class="button" inline @click="save(announcement)" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton> + <MkButton class="button" inline @click="remove(announcement)"><i class="fas fa-trash-alt"></i> {{ $ts.remove }}</MkButton> + </div> </div> - </div> - </section> + </section> + </div> </div> </template> <script lang="ts"> import { defineComponent } from 'vue'; import MkButton from '@client/components/ui/button.vue'; -import MkInput from '@client/components/ui/input.vue'; -import MkTextarea from '@client/components/ui/textarea.vue'; +import MkInput from '@client/components/form/input.vue'; +import MkTextarea from '@client/components/form/textarea.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; @@ -43,7 +46,19 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.announcements, - icon: 'fas fa-broadcast-tower' + icon: 'fas fa-broadcast-tower', + bg: 'var(--bg)', + }, + header: { + title: this.$ts.announcements, + icon: 'fas fa-broadcast-tower', + bg: 'var(--bg)', + actions: [{ + asFullButton: true, + icon: 'fas fa-plus', + text: this.$ts.add, + handler: this.add, + }], }, announcements: [], } diff --git a/src/client/pages/instance/bot-protection.vue b/src/client/pages/instance/bot-protection.vue index 449b8a233d..731f114cc2 100644 --- a/src/client/pages/instance/bot-protection.vue +++ b/src/client/pages/instance/bot-protection.vue @@ -9,43 +9,43 @@ </FormRadios> <template v-if="provider === 'hcaptcha'"> - <div class="_formItem _formNoConcat" v-sticky-container> - <div class="_formLabel">hCaptcha</div> + <div class="_debobigegoItem _debobigegoNoConcat" v-sticky-container> + <div class="_debobigegoLabel">hCaptcha</div> <div class="main"> - <FormInput v-model:value="hcaptchaSiteKey"> + <FormInput v-model="hcaptchaSiteKey"> <template #prefix><i class="fas fa-key"></i></template> <span>{{ $ts.hcaptchaSiteKey }}</span> </FormInput> - <FormInput v-model:value="hcaptchaSecretKey"> + <FormInput v-model="hcaptchaSecretKey"> <template #prefix><i class="fas fa-key"></i></template> <span>{{ $ts.hcaptchaSecretKey }}</span> </FormInput> </div> </div> - <div class="_formItem _formNoConcat" v-sticky-container> - <div class="_formLabel">{{ $ts.preview }}</div> - <div class="_formPanel" style="padding: var(--formContentHMargin);"> + <div class="_debobigegoItem _debobigegoNoConcat" v-sticky-container> + <div class="_debobigegoLabel">{{ $ts.preview }}</div> + <div class="_debobigegoPanel" style="padding: var(--debobigegoContentHMargin);"> <MkCaptcha provider="hcaptcha" :sitekey="hcaptchaSiteKey || '10000000-ffff-ffff-ffff-000000000001'"/> </div> </div> </template> <template v-else-if="provider === 'recaptcha'"> - <div class="_formItem _formNoConcat" v-sticky-container> - <div class="_formLabel">reCAPTCHA</div> + <div class="_debobigegoItem _debobigegoNoConcat" v-sticky-container> + <div class="_debobigegoLabel">reCAPTCHA</div> <div class="main"> - <FormInput v-model:value="recaptchaSiteKey"> + <FormInput v-model="recaptchaSiteKey"> <template #prefix><i class="fas fa-key"></i></template> <span>{{ $ts.recaptchaSiteKey }}</span> </FormInput> - <FormInput v-model:value="recaptchaSecretKey"> + <FormInput v-model="recaptchaSecretKey"> <template #prefix><i class="fas fa-key"></i></template> <span>{{ $ts.recaptchaSecretKey }}</span> </FormInput> </div> </div> - <div v-if="recaptchaSiteKey" class="_formItem _formNoConcat" v-sticky-container> - <div class="_formLabel">{{ $ts.preview }}</div> - <div class="_formPanel" style="padding: var(--formContentHMargin);"> + <div v-if="recaptchaSiteKey" class="_debobigegoItem _debobigegoNoConcat" v-sticky-container> + <div class="_debobigegoLabel">{{ $ts.preview }}</div> + <div class="_debobigegoPanel" style="padding: var(--debobigegoContentHMargin);"> <MkCaptcha provider="recaptcha" :sitekey="recaptchaSiteKey"/> </div> </div> @@ -58,13 +58,13 @@ <script lang="ts"> import { defineAsyncComponent, defineComponent } from 'vue'; -import FormRadios from '@client/components/form/radios.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormInfo from '@client/components/form/info.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormRadios from '@client/components/debobigego/radios.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormInfo from '@client/components/debobigego/info.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; diff --git a/src/client/pages/instance/database.vue b/src/client/pages/instance/database.vue index a41d61ce2b..ffbeed8b30 100644 --- a/src/client/pages/instance/database.vue +++ b/src/client/pages/instance/database.vue @@ -18,11 +18,11 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormSuspense from '@client/components/form/suspense.vue'; -import FormKeyValueView from '@client/components/form/key-value-view.vue'; -import FormLink from '@client/components/form/link.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; +import FormKeyValueView from '@client/components/debobigego/key-value-view.vue'; +import FormLink from '@client/components/debobigego/link.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import bytes from '@client/filters/bytes'; @@ -43,7 +43,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.database, - icon: 'fas fa-database' + icon: 'fas fa-database', + bg: 'var(--bg)', }, databasePromiseFactory: () => os.api('admin/get-table-stats', {}).then(res => Object.entries(res).sort((a, b) => b[1].size - a[1].size)), } diff --git a/src/client/pages/instance/email-settings.vue b/src/client/pages/instance/email-settings.vue index 9965a1420f..ebf724fcdd 100644 --- a/src/client/pages/instance/email-settings.vue +++ b/src/client/pages/instance/email-settings.vue @@ -1,30 +1,30 @@ <template> <FormBase> <FormSuspense :p="init"> - <FormSwitch v-model:value="enableEmail">{{ $ts.enableEmail }}<template #desc>{{ $ts.emailConfigInfo }}</template></FormSwitch> + <FormSwitch v-model="enableEmail">{{ $ts.enableEmail }}<template #desc>{{ $ts.emailConfigInfo }}</template></FormSwitch> <template v-if="enableEmail"> - <FormInput v-model:value="email" type="email"> + <FormInput v-model="email" type="email"> <span>{{ $ts.emailAddress }}</span> </FormInput> - <div class="_formItem _formNoConcat" v-sticky-container> - <div class="_formLabel">{{ $ts.smtpConfig }}</div> + <div class="_debobigegoItem _debobigegoNoConcat" v-sticky-container> + <div class="_debobigegoLabel">{{ $ts.smtpConfig }}</div> <div class="main"> - <FormInput v-model:value="smtpHost"> + <FormInput v-model="smtpHost"> <span>{{ $ts.smtpHost }}</span> </FormInput> - <FormInput v-model:value="smtpPort" type="number"> + <FormInput v-model="smtpPort" type="number"> <span>{{ $ts.smtpPort }}</span> </FormInput> - <FormInput v-model:value="smtpUser"> + <FormInput v-model="smtpUser"> <span>{{ $ts.smtpUser }}</span> </FormInput> - <FormInput v-model:value="smtpPass" type="password"> + <FormInput v-model="smtpPass" type="password"> <span>{{ $ts.smtpPass }}</span> </FormInput> <FormInfo>{{ $ts.emptyToDisableSmtpAuth }}</FormInfo> - <FormSwitch v-model:value="smtpSecure">{{ $ts.smtpSecure }}<template #desc>{{ $ts.smtpSecureInfo }}</template></FormSwitch> + <FormSwitch v-model="smtpSecure">{{ $ts.smtpSecure }}<template #desc>{{ $ts.smtpSecureInfo }}</template></FormSwitch> </div> </div> @@ -38,13 +38,13 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormSwitch from '@client/components/form/switch.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormInfo from '@client/components/form/info.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormSwitch from '@client/components/debobigego/switch.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormInfo from '@client/components/debobigego/info.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; @@ -66,7 +66,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.emailServer, - icon: 'fas fa-envelope' + icon: 'fas fa-envelope', + bg: 'var(--bg)', }, enableEmail: false, email: null, diff --git a/src/client/pages/instance/emoji-edit-dialog.vue b/src/client/pages/instance/emoji-edit-dialog.vue index 7e9bdc80dd..4854c69884 100644 --- a/src/client/pages/instance/emoji-edit-dialog.vue +++ b/src/client/pages/instance/emoji-edit-dialog.vue @@ -11,13 +11,13 @@ <div class="_monolithic_"> <div class="yigymqpb _section"> <img :src="emoji.url" class="img"/> - <MkInput v-model="name"> + <MkInput class="_formBlock" v-model="name"> <template #label>{{ $ts.name }}</template> </MkInput> - <MkInput v-model="category" :datalist="categories"> + <MkInput class="_formBlock" v-model="category" :datalist="categories"> <template #label>{{ $ts.category }}</template> </MkInput> - <MkInput v-model="aliases"> + <MkInput class="_formBlock" v-model="aliases"> <template #label>{{ $ts.tags }}</template> <template #caption>{{ $ts.setMultipleBySeparatingWithSpace }}</template> </MkInput> @@ -31,7 +31,7 @@ import { defineComponent } from 'vue'; import XModalWindow from '@client/components/ui/modal-window.vue'; import MkButton from '@client/components/ui/button.vue'; -import MkInput from '@client/components/ui/input.vue'; +import MkInput from '@client/components/form/input.vue'; import * as os from '@client/os'; import { unique } from '../../../prelude/array'; diff --git a/src/client/pages/instance/emojis.vue b/src/client/pages/instance/emojis.vue index 7badc9da02..4cd34b046d 100644 --- a/src/client/pages/instance/emojis.vue +++ b/src/client/pages/instance/emojis.vue @@ -1,12 +1,8 @@ <template> <div class="ogwlenmc"> - <MkTab v-model:value="tab"> - <option value="local">{{ $ts.local }}</option> - <option value="remote">{{ $ts.remote }}</option> - </MkTab> + <MkHeader :info="header"/> <div class="local" v-if="tab === 'local'"> - <MkButton primary @click="add" style="margin: var(--margin) auto;"><i class="fas fa-plus"></i> {{ $ts.addEmoji }}</MkButton> <MkInput v-model="query" :debounce="true" type="search" style="margin: var(--margin);"> <template #prefix><i class="fas fa-search"></i></template> <template #label>{{ $ts.search }}</template> @@ -56,7 +52,7 @@ <script lang="ts"> import { computed, defineComponent } from 'vue'; import MkButton from '@client/components/ui/button.vue'; -import MkInput from '@client/components/ui/input.vue'; +import MkInput from '@client/components/form/input.vue'; import MkPagination from '@client/components/ui/pagination.vue'; import MkTab from '@client/components/tab.vue'; import { selectFile } from '@client/scripts/select-file'; @@ -78,11 +74,28 @@ export default defineComponent({ [symbols.PAGE_INFO]: { title: this.$ts.customEmojis, icon: 'fas fa-laugh', - action: { - icon: 'fas fa-plus', - handler: this.add - } + bg: 'var(--bg)', }, + header: computed(() => ({ + title: this.$ts.customEmojis, + icon: 'fas fa-laugh', + bg: 'var(--bg)', + actions: [{ + asFullButton: true, + icon: 'fas fa-plus', + text: this.$ts.addEmoji, + handler: this.add, + }], + tabs: [{ + active: this.tab === 'local', + title: this.$ts.local, + onClick: () => { this.tab = 'local'; }, + }, { + active: this.tab === 'remote', + title: this.$ts.remote, + onClick: () => { this.tab = 'remote'; }, + },] + })), tab: 'local', query: null, queryRemote: null, diff --git a/src/client/pages/instance/file-dialog.vue b/src/client/pages/instance/file-dialog.vue index 8a03a11de7..02d83e5022 100644 --- a/src/client/pages/instance/file-dialog.vue +++ b/src/client/pages/instance/file-dialog.vue @@ -37,7 +37,7 @@ <script lang="ts"> import { computed, defineComponent } from 'vue'; import MkButton from '@client/components/ui/button.vue'; -import MkSwitch from '@client/components/ui/switch.vue'; +import MkSwitch from '@client/components/form/switch.vue'; import XModalWindow from '@client/components/ui/modal-window.vue'; import MkDriveFileThumbnail from '@client/components/drive-file-thumbnail.vue'; import Progress from '@client/scripts/loading'; diff --git a/src/client/pages/instance/files-settings.vue b/src/client/pages/instance/files-settings.vue index 614c7d4dbb..8aefa9e90d 100644 --- a/src/client/pages/instance/files-settings.vue +++ b/src/client/pages/instance/files-settings.vue @@ -1,23 +1,23 @@ <template> <FormBase> <FormSuspense :p="init"> - <FormSwitch v-model:value="cacheRemoteFiles"> + <FormSwitch v-model="cacheRemoteFiles"> {{ $ts.cacheRemoteFiles }} <template #desc>{{ $ts.cacheRemoteFilesDescription }}</template> </FormSwitch> - <FormSwitch v-model:value="proxyRemoteFiles"> + <FormSwitch v-model="proxyRemoteFiles"> {{ $ts.proxyRemoteFiles }} <template #desc>{{ $ts.proxyRemoteFilesDescription }}</template> </FormSwitch> - <FormInput v-model:value="localDriveCapacityMb" type="number"> + <FormInput v-model="localDriveCapacityMb" type="number"> <span>{{ $ts.driveCapacityPerLocalAccount }}</span> <template #suffix>MB</template> <template #desc>{{ $ts.inMb }}</template> </FormInput> - <FormInput v-model:value="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles"> + <FormInput v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles"> <span>{{ $ts.driveCapacityPerRemoteAccount }}</span> <template #suffix>MB</template> <template #desc>{{ $ts.inMb }}</template> @@ -30,12 +30,12 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormSwitch from '@client/components/form/switch.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormSwitch from '@client/components/debobigego/switch.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; @@ -56,7 +56,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.files, - icon: 'fas fa-cloud' + icon: 'fas fa-cloud', + bg: 'var(--bg)', }, cacheRemoteFiles: false, proxyRemoteFiles: false, diff --git a/src/client/pages/instance/files.vue b/src/client/pages/instance/files.vue index b7f472b7c8..55189cfd84 100644 --- a/src/client/pages/instance/files.vue +++ b/src/client/pages/instance/files.vue @@ -1,20 +1,14 @@ <template> <div class="xrmjdkdw"> - <div class="_section"> - <div class="_content"> - <MkButton primary @click="clear()"><i class="fas fa-trash-alt"></i> {{ $ts.clearCachedFiles }}</MkButton> - </div> - </div> - - <div class="_section lookup"> - <div class="_title"><i class="fas fa-search"></i> {{ $ts.lookup }}</div> - <div class="_content"> - <MkInput class="target" v-model="q" type="text" @enter="find()"> + <MkContainer :foldable="true" class="lookup"> + <template #header><i class="fas fa-search"></i> {{ $ts.lookup }}</template> + <div class="xrmjdkdw-lookup"> + <MkInput class="item" v-model="q" type="text" @enter="find()"> <template #label>{{ $ts.fileIdOrUrl }}</template> </MkInput> <MkButton @click="find()" primary><i class="fas fa-search"></i> {{ $ts.lookup }}</MkButton> </div> - </div> + </MkContainer> <div class="_section"> <div class="_content"> @@ -31,7 +25,7 @@ </div> <div class="inputs" style="display: flex; padding-top: 1.2em;"> <MkInput v-model="type" :debounce="true" type="search" style="margin: 0; flex: 1;"> - <template #label>{{ $ts.type }}</template> + <template #label>MIME type</template> </MkInput> </div> <MkPagination :pagination="pagination" #default="{items}" class="urempief" ref="files"> @@ -63,9 +57,10 @@ <script lang="ts"> import { defineComponent } from 'vue'; import MkButton from '@client/components/ui/button.vue'; -import MkInput from '@client/components/ui/input.vue'; -import MkSelect from '@client/components/ui/select.vue'; +import MkInput from '@client/components/form/input.vue'; +import MkSelect from '@client/components/form/select.vue'; import MkPagination from '@client/components/ui/pagination.vue'; +import MkContainer from '@client/components/ui/container.vue'; import MkDriveFileThumbnail from '@client/components/drive-file-thumbnail.vue'; import bytes from '@client/filters/bytes'; import * as os from '@client/os'; @@ -77,6 +72,7 @@ export default defineComponent({ MkInput, MkSelect, MkPagination, + MkContainer, MkDriveFileThumbnail, }, @@ -86,7 +82,13 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.files, - icon: 'fas fa-cloud' + icon: 'fas fa-cloud', + bg: 'var(--bg)', + actions: [{ + text: this.$ts.clearCachedFiles, + icon: 'fas fa-trash-alt', + handler: this.clear + }] }, q: null, origin: 'local', @@ -161,6 +163,10 @@ export default defineComponent({ .xrmjdkdw { margin: var(--margin); + > .lookup { + margin-bottom: 16px; + } + .urempief { margin-top: var(--margin); @@ -192,4 +198,12 @@ export default defineComponent({ } } } + +.xrmjdkdw-lookup { + padding: 16px; + + > .item { + margin-bottom: 16px; + } +} </style> diff --git a/src/client/pages/instance/index.vue b/src/client/pages/instance/index.vue index 612bfa762a..7b07bf2dde 100644 --- a/src/client/pages/instance/index.vue +++ b/src/client/pages/instance/index.vue @@ -1,51 +1,16 @@ <template> <div class="hiyeyicy" :class="{ wide: !narrow }" ref="el"> <div class="nav" v-if="!narrow || page == null"> - <FormBase> - <FormGroup> - <div class="_formItem"> - <div class="_formPanel lxpfedzu"> - <img :src="$instance.iconUrl || '/favicon.ico'" alt="" class="icon"/> - </div> - </div> - <FormLink :active="page === 'overview'" replace to="/instance/overview"><template #icon><i class="fas fa-tachometer-alt"></i></template>{{ $ts.overview }}</FormLink> - </FormGroup> - <FormGroup> - <template #label>{{ $ts.quickAction }}</template> - <FormButton @click="lookup"><i class="fas fa-search"></i> {{ $ts.lookup }}</FormButton> - <FormButton v-if="$instance.disableRegistration" @click="invite"><i class="fas fa-user"></i> {{ $ts.invite }}</FormButton> - </FormGroup> - <FormGroup> - <template #label>{{ $ts.administration }}</template> - <FormLink :active="page === 'users'" replace to="/instance/users"><template #icon><i class="fas fa-users"></i></template>{{ $ts.users }}</FormLink> - <FormLink :active="page === 'emojis'" replace to="/instance/emojis"><template #icon><i class="fas fa-laugh"></i></template>{{ $ts.customEmojis }}</FormLink> - <FormLink :active="page === 'federation'" replace to="/instance/federation"><template #icon><i class="fas fa-globe"></i></template>{{ $ts.federation }}</FormLink> - <FormLink :active="page === 'queue'" replace to="/instance/queue"><template #icon><i class="fas fa-clipboard-list"></i></template>{{ $ts.jobQueue }}</FormLink> - <FormLink :active="page === 'files'" replace to="/instance/files"><template #icon><i class="fas fa-cloud"></i></template>{{ $ts.files }}</FormLink> - <FormLink :active="page === 'announcements'" replace to="/instance/announcements"><template #icon><i class="fas fa-broadcast-tower"></i></template>{{ $ts.announcements }}</FormLink> - <FormLink :active="page === 'ads'" replace to="/instance/ads"><template #icon><i class="fas fa-audio-description"></i></template>{{ $ts.ads }}</FormLink> - <FormLink :active="page === 'abuses'" replace to="/instance/abuses"><template #icon><i class="fas fa-exclamation-circle"></i></template>{{ $ts.abuseReports }}</FormLink> - </FormGroup> - <FormGroup> - <template #label>{{ $ts.settings }}</template> - <FormLink :active="page === 'settings'" replace to="/instance/settings"><template #icon><i class="fas fa-cog"></i></template>{{ $ts.general }}</FormLink> - <FormLink :active="page === 'files-settings'" replace to="/instance/files-settings"><template #icon><i class="fas fa-cloud"></i></template>{{ $ts.files }}</FormLink> - <FormLink :active="page === 'email-settings'" replace to="/instance/email-settings"><template #icon><i class="fas fa-envelope"></i></template>{{ $ts.emailServer }}</FormLink> - <FormLink :active="page === 'object-storage'" replace to="/instance/object-storage"><template #icon><i class="fas fa-cloud"></i></template>{{ $ts.objectStorage }}</FormLink> - <FormLink :active="page === 'security'" replace to="/instance/security"><template #icon><i class="fas fa-lock"></i></template>{{ $ts.security }}</FormLink> - <FormLink :active="page === 'service-worker'" replace to="/instance/service-worker"><template #icon><i class="fas fa-bolt"></i></template>ServiceWorker</FormLink> - <FormLink :active="page === 'relays'" replace to="/instance/relays"><template #icon><i class="fas fa-globe"></i></template>{{ $ts.relays }}</FormLink> - <FormLink :active="page === 'integrations'" replace to="/instance/integrations"><template #icon><i class="fas fa-share-alt"></i></template>{{ $ts.integration }}</FormLink> - <FormLink :active="page === 'instance-block'" replace to="/instance/instance-block"><template #icon><i class="fas fa-ban"></i></template>{{ $ts.instanceBlocking }}</FormLink> - <FormLink :active="page === 'proxy-account'" replace to="/instance/proxy-account"><template #icon><i class="fas fa-ghost"></i></template>{{ $ts.proxyAccount }}</FormLink> - <FormLink :active="page === 'other-settings'" replace to="/instance/other-settings"><template #icon><i class="fas fa-cogs"></i></template>{{ $ts.other }}</FormLink> - </FormGroup> - <FormGroup> - <template #label>{{ $ts.info }}</template> - <FormLink :active="page === 'database'" replace to="/instance/database"><template #icon><i class="fas fa-database"></i></template>{{ $ts.database }}</FormLink> - <FormLink :active="page === 'logs'" replace to="/instance/logs"><template #icon><i class="fas fa-stream"></i></template>{{ $ts.logs }}</FormLink> - </FormGroup> - </FormBase> + <MkHeader :info="header"></MkHeader> + + <div class="lxpfedzu"> + <img :src="$instance.iconUrl || '/favicon.ico'" alt="" class="icon"/> + </div> + + <MkInfo v-if="noMaintainerInformation" warn class="info">{{ $ts.noMaintainerInformationWarning }} <MkA to="/instance/settings" class="_link">{{ $ts.configure }}</MkA></MkInfo> + <MkInfo v-if="noBotProtection" warn class="info">{{ $ts.noBotProtectionWarning }} <MkA to="/instance/bot-protection" class="_link">{{ $ts.configure }}</MkA></MkInfo> + + <MkSuperMenu :def="menuDef" :grid="page == null"></MkSuperMenu> </div> <div class="main"> <component :is="component" :key="page" @info="onInfo" v-bind="pageProps"/> @@ -56,11 +21,13 @@ <script lang="ts"> import { computed, defineAsyncComponent, defineComponent, nextTick, onMounted, reactive, ref, watch } from 'vue'; import { i18n } from '@client/i18n'; -import FormLink from '@client/components/form/link.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormButton from '@client/components/form/button.vue'; +import MkSuperMenu from '@client/components/ui/super-menu.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import MkInfo from '@client/components/ui/info.vue'; import { scroll } from '@client/scripts/scroll'; +import { instance } from '@client/instance'; import * as symbols from '@client/symbols'; import * as os from '@client/os'; import { lookupUser } from '@client/scripts/lookup-user'; @@ -68,9 +35,10 @@ import { lookupUser } from '@client/scripts/lookup-user'; export default defineComponent({ components: { FormBase, - FormLink, + MkSuperMenu, FormGroup, FormButton, + MkInfo, }, props: { @@ -83,7 +51,8 @@ export default defineComponent({ setup(props, context) { const indexInfo = { title: i18n.locale.instance, - icon: 'fas fa-cog' + icon: 'fas fa-cog', + bg: 'var(--bg)', }; const INFO = ref(indexInfo); const page = ref(props.initialPage); @@ -94,6 +63,151 @@ export default defineComponent({ INFO.value = viewInfo; }; const pageProps = ref({}); + + const isEmpty = (x: any) => x == null || x == ''; + + const noMaintainerInformation = ref(false); + const noBotProtection = ref(false); + + os.api('meta', { detail: true }).then(meta => { + // TODO: 設定が完了しても残ったままになるので、ストリーミングでmeta更新イベントを受け取ってよしなに更新する + noMaintainerInformation.value = isEmpty(meta.maintainerName) || isEmpty(meta.maintainerEmail); + noBotProtection.value = !meta.enableHcaptcha && !meta.enableRecaptcha; + }); + + const menuDef = computed(() => [{ + title: i18n.locale.quickAction, + items: [{ + type: 'button', + icon: 'fas fa-search', + text: i18n.locale.lookup, + action: lookup, + }, ...(instance.disableRegistration ? [{ + type: 'button', + icon: 'fas fa-user', + text: i18n.locale.invite, + action: invite, + }] : [])], + }, { + title: i18n.locale.administration, + items: [{ + icon: 'fas fa-tachometer-alt', + text: i18n.locale.dashboard, + to: '/instance/overview', + active: page.value === 'overview', + }, { + icon: 'fas fa-users', + text: i18n.locale.users, + to: '/instance/users', + active: page.value === 'users', + }, { + icon: 'fas fa-laugh', + text: i18n.locale.customEmojis, + to: '/instance/emojis', + active: page.value === 'emojis', + }, { + icon: 'fas fa-globe', + text: i18n.locale.federation, + to: '/instance/federation', + active: page.value === 'federation', + }, { + icon: 'fas fa-clipboard-list', + text: i18n.locale.jobQueue, + to: '/instance/queue', + active: page.value === 'queue', + }, { + icon: 'fas fa-cloud', + text: i18n.locale.files, + to: '/instance/files', + active: page.value === 'files', + }, { + icon: 'fas fa-broadcast-tower', + text: i18n.locale.announcements, + to: '/instance/announcements', + active: page.value === 'announcements', + }, { + icon: 'fas fa-audio-description', + text: i18n.locale.ads, + to: '/instance/ads', + active: page.value === 'ads', + }, { + icon: 'fas fa-exclamation-circle', + text: i18n.locale.abuseReports, + to: '/instance/abuses', + active: page.value === 'abuses', + }], + }, { + title: i18n.locale.settings, + items: [{ + icon: 'fas fa-cog', + text: i18n.locale.general, + to: '/instance/settings', + active: page.value === 'settings', + }, { + icon: 'fas fa-cloud', + text: i18n.locale.files, + to: '/instance/files-settings', + active: page.value === 'files-settings', + }, { + icon: 'fas fa-envelope', + text: i18n.locale.emailServer, + to: '/instance/email-settings', + active: page.value === 'email-settings', + }, { + icon: 'fas fa-cloud', + text: i18n.locale.objectStorage, + to: '/instance/object-storage', + active: page.value === 'object-storage', + }, { + icon: 'fas fa-lock', + text: i18n.locale.security, + to: '/instance/security', + active: page.value === 'security', + }, { + icon: 'fas fa-bolt', + text: 'ServiceWorker', + to: '/instance/service-worker', + active: page.value === 'service-worker', + }, { + icon: 'fas fa-globe', + text: i18n.locale.relays, + to: '/instance/relays', + active: page.value === 'relays', + }, { + icon: 'fas fa-share-alt', + text: i18n.locale.integration, + to: '/instance/integrations', + active: page.value === 'integrations', + }, { + icon: 'fas fa-ban', + text: i18n.locale.instanceBlocking, + to: '/instance/instance-block', + active: page.value === 'instance-block', + }, { + icon: 'fas fa-ghost', + text: i18n.locale.proxyAccount, + to: '/instance/proxy-account', + active: page.value === 'proxy-account', + }, { + icon: 'fas fa-cogs', + text: i18n.locale.other, + to: '/instance/other-settings', + active: page.value === 'other-settings', + }], + }, { + title: i18n.locale.info, + items: [{ + icon: 'fas fa-database', + text: i18n.locale.database, + to: '/instance/database', + active: page.value === 'database', + }, { + icon: 'fas fa-stream', + text: i18n.locale.logs, + to: '/instance/logs', + active: page.value === 'logs', + }], + }]); const component = computed(() => { if (page.value == null) return null; switch (page.value) { @@ -130,7 +244,7 @@ export default defineComponent({ pageProps.value = {}; nextTick(() => { - scroll(el.value, 0); + scroll(el.value, { top: 0 }); }); }, { immediate: true }); @@ -196,6 +310,12 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: INFO, + menuDef, + header: { + title: i18n.locale.controllPanel, + }, + noMaintainerInformation, + noBotProtection, page, narrow, view, @@ -214,28 +334,34 @@ export default defineComponent({ .hiyeyicy { &.wide { display: flex; - max-width: 1100px; margin: 0 auto; height: 100%; > .nav { width: 32%; + max-width: 280px; box-sizing: border-box; border-right: solid 0.5px var(--divider); overflow: auto; + height: 100%; } > .main { flex: 1; min-width: 0; - overflow: auto; --baseContentWidth: 100%; } } + + > .nav { + > .info { + margin: 16px; + } + } } .lxpfedzu { - padding: 16px; + margin: 16px; > .icon { display: block; diff --git a/src/client/pages/instance/instance-block.vue b/src/client/pages/instance/instance-block.vue index ed5740f339..105cdb4941 100644 --- a/src/client/pages/instance/instance-block.vue +++ b/src/client/pages/instance/instance-block.vue @@ -1,7 +1,7 @@ <template> <FormBase> <FormSuspense :p="init"> - <FormTextarea v-model:value="blockedHosts"> + <FormTextarea v-model="blockedHosts"> <span>{{ $ts.blockedInstances }}</span> <template #desc>{{ $ts.blockedInstancesDescription }}</template> </FormTextarea> @@ -13,14 +13,14 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormSwitch from '@client/components/form/switch.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormTextarea from '@client/components/form/textarea.vue'; -import FormInfo from '@client/components/form/info.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormSwitch from '@client/components/debobigego/switch.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormTextarea from '@client/components/debobigego/textarea.vue'; +import FormInfo from '@client/components/debobigego/info.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; @@ -43,7 +43,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.instanceBlocking, - icon: 'fas fa-ban' + icon: 'fas fa-ban', + bg: 'var(--bg)', }, blockedHosts: '', } diff --git a/src/client/pages/instance/instance.vue b/src/client/pages/instance/instance.vue index c39f0d1ecb..6117f090de 100644 --- a/src/client/pages/instance/instance.vue +++ b/src/client/pages/instance/instance.vue @@ -127,9 +127,9 @@ import { defineComponent, markRaw } from 'vue'; import Chart from 'chart.js'; import XModalWindow from '@client/components/ui/modal-window.vue'; import MkUsersDialog from '@client/components/users-dialog.vue'; -import MkSelect from '@client/components/ui/select.vue'; +import MkSelect from '@client/components/form/select.vue'; import MkButton from '@client/components/ui/button.vue'; -import MkSwitch from '@client/components/ui/switch.vue'; +import MkSwitch from '@client/components/form/switch.vue'; import MkInfo from '@client/components/ui/info.vue'; import bytes from '@client/filters/bytes'; import number from '@client/filters/number'; diff --git a/src/client/pages/instance/integrations-discord.vue b/src/client/pages/instance/integrations-discord.vue index c7508918f8..c33b24f17f 100644 --- a/src/client/pages/instance/integrations-discord.vue +++ b/src/client/pages/instance/integrations-discord.vue @@ -1,19 +1,19 @@ <template> <FormBase> <FormSuspense :p="init"> - <FormSwitch v-model:value="enableDiscordIntegration"> + <FormSwitch v-model="enableDiscordIntegration"> {{ $ts.enable }} </FormSwitch> <template v-if="enableDiscordIntegration"> <FormInfo>Callback URL: {{ `${url}/api/dc/cb` }}</FormInfo> - <FormInput v-model:value="discordClientId"> + <FormInput v-model="discordClientId"> <template #prefix><i class="fas fa-key"></i></template> Client ID </FormInput> - <FormInput v-model:value="discordClientSecret"> + <FormInput v-model="discordClientSecret"> <template #prefix><i class="fas fa-key"></i></template> Client Secret </FormInput> @@ -26,12 +26,12 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormSwitch from '@client/components/form/switch.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormInfo from '@client/components/form/info.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormSwitch from '@client/components/debobigego/switch.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormInfo from '@client/components/debobigego/info.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; diff --git a/src/client/pages/instance/integrations-github.vue b/src/client/pages/instance/integrations-github.vue index 16586b15b4..cdf85868ff 100644 --- a/src/client/pages/instance/integrations-github.vue +++ b/src/client/pages/instance/integrations-github.vue @@ -1,19 +1,19 @@ <template> <FormBase> <FormSuspense :p="init"> - <FormSwitch v-model:value="enableGithubIntegration"> + <FormSwitch v-model="enableGithubIntegration"> {{ $ts.enable }} </FormSwitch> <template v-if="enableGithubIntegration"> <FormInfo>Callback URL: {{ `${url}/api/gh/cb` }}</FormInfo> - <FormInput v-model:value="githubClientId"> + <FormInput v-model="githubClientId"> <template #prefix><i class="fas fa-key"></i></template> Client ID </FormInput> - <FormInput v-model:value="githubClientSecret"> + <FormInput v-model="githubClientSecret"> <template #prefix><i class="fas fa-key"></i></template> Client Secret </FormInput> @@ -26,12 +26,12 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormSwitch from '@client/components/form/switch.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormInfo from '@client/components/form/info.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormSwitch from '@client/components/debobigego/switch.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormInfo from '@client/components/debobigego/info.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; diff --git a/src/client/pages/instance/integrations-twitter.vue b/src/client/pages/instance/integrations-twitter.vue index b08b7f40a5..ed7d097d0a 100644 --- a/src/client/pages/instance/integrations-twitter.vue +++ b/src/client/pages/instance/integrations-twitter.vue @@ -1,19 +1,19 @@ <template> <FormBase> <FormSuspense :p="init"> - <FormSwitch v-model:value="enableTwitterIntegration"> + <FormSwitch v-model="enableTwitterIntegration"> {{ $ts.enable }} </FormSwitch> <template v-if="enableTwitterIntegration"> <FormInfo>Callback URL: {{ `${url}/api/tw/cb` }}</FormInfo> - <FormInput v-model:value="twitterConsumerKey"> + <FormInput v-model="twitterConsumerKey"> <template #prefix><i class="fas fa-key"></i></template> Consumer Key </FormInput> - <FormInput v-model:value="twitterConsumerSecret"> + <FormInput v-model="twitterConsumerSecret"> <template #prefix><i class="fas fa-key"></i></template> Consumer Secret </FormInput> @@ -26,12 +26,12 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormSwitch from '@client/components/form/switch.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormInfo from '@client/components/form/info.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormSwitch from '@client/components/debobigego/switch.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormInfo from '@client/components/debobigego/info.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; diff --git a/src/client/pages/instance/integrations.vue b/src/client/pages/instance/integrations.vue index 7debedc367..6964ae5704 100644 --- a/src/client/pages/instance/integrations.vue +++ b/src/client/pages/instance/integrations.vue @@ -19,14 +19,14 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormLink from '@client/components/form/link.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormTextarea from '@client/components/form/textarea.vue'; -import FormInfo from '@client/components/form/info.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormLink from '@client/components/debobigego/link.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormTextarea from '@client/components/debobigego/textarea.vue'; +import FormInfo from '@client/components/debobigego/info.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; @@ -49,7 +49,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.integration, - icon: 'fas fa-share-alt' + icon: 'fas fa-share-alt', + bg: 'var(--bg)', }, enableTwitterIntegration: false, enableGithubIntegration: false, diff --git a/src/client/pages/instance/logs.vue b/src/client/pages/instance/logs.vue index 4eee816f96..74aea0fc45 100644 --- a/src/client/pages/instance/logs.vue +++ b/src/client/pages/instance/logs.vue @@ -31,9 +31,9 @@ <script lang="ts"> import { defineComponent } from 'vue'; import MkButton from '@client/components/ui/button.vue'; -import MkInput from '@client/components/ui/input.vue'; -import MkSelect from '@client/components/ui/select.vue'; -import MkTextarea from '@client/components/ui/textarea.vue'; +import MkInput from '@client/components/form/input.vue'; +import MkSelect from '@client/components/form/select.vue'; +import MkTextarea from '@client/components/form/textarea.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; diff --git a/src/client/pages/instance/metrics.vue b/src/client/pages/instance/metrics.vue index 283b5939f0..1606063aee 100644 --- a/src/client/pages/instance/metrics.vue +++ b/src/client/pages/instance/metrics.vue @@ -1,7 +1,7 @@ <template> -<div class="_formItem"> - <div class="_formLabel"><i class="fas fa-microchip"></i> {{ $ts.cpuAndMemory }}</div> - <div class="_formPanel xhexznfu"> +<div class="_debobigegoItem"> + <div class="_debobigegoLabel"><i class="fas fa-microchip"></i> {{ $ts.cpuAndMemory }}</div> + <div class="_debobigegoPanel xhexznfu"> <div> <canvas :ref="cpumem"></canvas> </div> @@ -16,9 +16,9 @@ </div> </div> </div> -<div class="_formItem"> - <div class="_formLabel"><i class="fas fa-hdd"></i> {{ $ts.disk }}</div> - <div class="_formPanel xhexznfu"> +<div class="_debobigegoItem"> + <div class="_debobigegoLabel"><i class="fas fa-hdd"></i> {{ $ts.disk }}</div> + <div class="_debobigegoPanel xhexznfu"> <div> <canvas :ref="disk"></canvas> </div> @@ -33,9 +33,9 @@ </div> </div> </div> -<div class="_formItem"> - <div class="_formLabel"><i class="fas fa-exchange-alt"></i> {{ $ts.network }}</div> - <div class="_formPanel xhexznfu"> +<div class="_debobigegoItem"> + <div class="_debobigegoLabel"><i class="fas fa-exchange-alt"></i> {{ $ts.network }}</div> + <div class="_debobigegoPanel xhexznfu"> <div> <canvas :ref="net"></canvas> </div> @@ -54,8 +54,8 @@ import { defineComponent, markRaw } from 'vue'; import Chart from 'chart.js'; import MkButton from '@client/components/ui/button.vue'; -import MkSelect from '@client/components/ui/select.vue'; -import MkInput from '@client/components/ui/input.vue'; +import MkSelect from '@client/components/form/select.vue'; +import MkInput from '@client/components/form/input.vue'; import MkContainer from '@client/components/ui/container.vue'; import MkFolder from '@client/components/ui/folder.vue'; import MkwFederation from '../../widgets/federation.vue'; diff --git a/src/client/pages/instance/object-storage.vue b/src/client/pages/instance/object-storage.vue index 814aeb6e48..2d765270e6 100644 --- a/src/client/pages/instance/object-storage.vue +++ b/src/client/pages/instance/object-storage.vue @@ -1,59 +1,59 @@ <template> <FormBase> <FormSuspense :p="init"> - <FormSwitch v-model:value="useObjectStorage">{{ $ts.useObjectStorage }}</FormSwitch> + <FormSwitch v-model="useObjectStorage">{{ $ts.useObjectStorage }}</FormSwitch> <template v-if="useObjectStorage"> - <FormInput v-model:value="objectStorageBaseUrl"> + <FormInput v-model="objectStorageBaseUrl"> <span>{{ $ts.objectStorageBaseUrl }}</span> <template #desc>{{ $ts.objectStorageBaseUrlDesc }}</template> </FormInput> - <FormInput v-model:value="objectStorageBucket"> + <FormInput v-model="objectStorageBucket"> <span>{{ $ts.objectStorageBucket }}</span> <template #desc>{{ $ts.objectStorageBucketDesc }}</template> </FormInput> - <FormInput v-model:value="objectStoragePrefix"> + <FormInput v-model="objectStoragePrefix"> <span>{{ $ts.objectStoragePrefix }}</span> <template #desc>{{ $ts.objectStoragePrefixDesc }}</template> </FormInput> - <FormInput v-model:value="objectStorageEndpoint"> + <FormInput v-model="objectStorageEndpoint"> <span>{{ $ts.objectStorageEndpoint }}</span> <template #desc>{{ $ts.objectStorageEndpointDesc }}</template> </FormInput> - <FormInput v-model:value="objectStorageRegion"> + <FormInput v-model="objectStorageRegion"> <span>{{ $ts.objectStorageRegion }}</span> <template #desc>{{ $ts.objectStorageRegionDesc }}</template> </FormInput> - <FormInput v-model:value="objectStorageAccessKey"> + <FormInput v-model="objectStorageAccessKey"> <template #prefix><i class="fas fa-key"></i></template> <span>Access key</span> </FormInput> - <FormInput v-model:value="objectStorageSecretKey"> + <FormInput v-model="objectStorageSecretKey"> <template #prefix><i class="fas fa-key"></i></template> <span>Secret key</span> </FormInput> - <FormSwitch v-model:value="objectStorageUseSSL"> + <FormSwitch v-model="objectStorageUseSSL"> {{ $ts.objectStorageUseSSL }} <template #desc>{{ $ts.objectStorageUseSSLDesc }}</template> </FormSwitch> - <FormSwitch v-model:value="objectStorageUseProxy"> + <FormSwitch v-model="objectStorageUseProxy"> {{ $ts.objectStorageUseProxy }} <template #desc>{{ $ts.objectStorageUseProxyDesc }}</template> </FormSwitch> - <FormSwitch v-model:value="objectStorageSetPublicRead"> + <FormSwitch v-model="objectStorageSetPublicRead"> {{ $ts.objectStorageSetPublicRead }} </FormSwitch> - <FormSwitch v-model:value="objectStorageS3ForcePathStyle"> + <FormSwitch v-model="objectStorageS3ForcePathStyle"> s3ForcePathStyle </FormSwitch> </template> @@ -65,12 +65,12 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormSwitch from '@client/components/form/switch.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormSwitch from '@client/components/debobigego/switch.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; @@ -91,7 +91,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.objectStorage, - icon: 'fas fa-cloud' + icon: 'fas fa-cloud', + bg: 'var(--bg)', }, useObjectStorage: false, objectStorageBaseUrl: null, diff --git a/src/client/pages/instance/other-settings.vue b/src/client/pages/instance/other-settings.vue index 4fa80b2b2c..4e55df41fb 100644 --- a/src/client/pages/instance/other-settings.vue +++ b/src/client/pages/instance/other-settings.vue @@ -2,17 +2,17 @@ <FormBase> <FormSuspense :p="init"> <FormGroup> - <FormInput v-model:value="summalyProxy"> + <FormInput v-model="summalyProxy"> <template #prefix><i class="fas fa-link"></i></template> Summaly Proxy URL </FormInput> </FormGroup> <FormGroup> - <FormInput v-model:value="deeplAuthKey"> + <FormInput v-model="deeplAuthKey"> <template #prefix><i class="fas fa-key"></i></template> DeepL Auth Key </FormInput> - <FormSwitch v-model:value="deeplIsPro"> + <FormSwitch v-model="deeplIsPro"> Pro account </FormSwitch> </FormGroup> @@ -23,12 +23,12 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormSwitch from '@client/components/form/switch.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormSwitch from '@client/components/debobigego/switch.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; @@ -49,7 +49,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.other, - icon: 'fas fa-cogs' + icon: 'fas fa-cogs', + bg: 'var(--bg)', }, summalyProxy: '', deeplAuthKey: '', diff --git a/src/client/pages/instance/overview.vue b/src/client/pages/instance/overview.vue index 0d7a5d1501..c6db9d0c04 100644 --- a/src/client/pages/instance/overview.vue +++ b/src/client/pages/instance/overview.vue @@ -1,9 +1,6 @@ <template> <FormBase> <FormSuspense :p="init"> - <FormInfo v-if="noMaintainerInformation" warn>{{ $ts.noMaintainerInformationWarning }} <MkA to="/instance/settings" class="_link">{{ $ts.configure }}</MkA></FormInfo> - <FormInfo v-if="noBotProtection" warn>{{ $ts.noBotProtectionWarning }} <MkA to="/instance/bot-protection" class="_link">{{ $ts.configure }}</MkA></FormInfo> - <FormSuspense :p="fetchStats" v-slot="{ result: stats }"> <FormGroup> <FormKeyValueView> @@ -17,8 +14,8 @@ </FormGroup> </FormSuspense> - <div class="_formItem"> - <div class="_formPanel"> + <div class="_debobigegoItem"> + <div class="_debobigegoPanel"> <MkInstanceStats :chart-limit="300" :detailed="true"/> </div> </div> @@ -47,18 +44,18 @@ <script lang="ts"> import { computed, defineComponent, markRaw } from 'vue'; -import FormKeyValueView from '@client/components/form/key-value-view.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormTextarea from '@client/components/form/textarea.vue'; -import FormInfo from '@client/components/form/info.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormKeyValueView from '@client/components/debobigego/key-value-view.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormTextarea from '@client/components/debobigego/textarea.vue'; +import FormInfo from '@client/components/debobigego/info.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import MkInstanceStats from '@client/components/instance-stats.vue'; import MkButton from '@client/components/ui/button.vue'; -import MkSelect from '@client/components/ui/select.vue'; -import MkInput from '@client/components/ui/input.vue'; +import MkSelect from '@client/components/form/select.vue'; +import MkInput from '@client/components/form/input.vue'; import MkContainer from '@client/components/ui/container.vue'; import MkFolder from '@client/components/ui/folder.vue'; import { version, url } from '@client/config'; @@ -86,7 +83,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.overview, - icon: 'fas fa-tachometer-alt' + icon: 'fas fa-tachometer-alt', + bg: 'var(--bg)', }, page: 'index', version, @@ -97,8 +95,6 @@ export default defineComponent({ fetchServerInfo: () => os.api('admin/server-info', {}), fetchJobs: () => os.api('admin/queue/deliver-delayed', {}), fetchModLogs: () => os.api('admin/show-moderation-logs', {}), - noMaintainerInformation: false, - noBotProtection: false, } }, @@ -109,11 +105,6 @@ export default defineComponent({ methods: { async init() { this.meta = await os.api('meta', { detail: true }); - - const isEmpty = (x: any) => x == null || x == ''; - - this.noMaintainerInformation = isEmpty(this.meta.maintainerName) || isEmpty(this.meta.maintainerEmail); - this.noBotProtection = !this.meta.enableHcaptcha && !this.meta.enableRecaptcha; }, async showInstanceInfo(q) { diff --git a/src/client/pages/instance/proxy-account.vue b/src/client/pages/instance/proxy-account.vue index 3e2df8dcb4..b1ece19710 100644 --- a/src/client/pages/instance/proxy-account.vue +++ b/src/client/pages/instance/proxy-account.vue @@ -16,14 +16,14 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormKeyValueView from '@client/components/form/key-value-view.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormTextarea from '@client/components/form/textarea.vue'; -import FormInfo from '@client/components/form/info.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormKeyValueView from '@client/components/debobigego/key-value-view.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormTextarea from '@client/components/debobigego/textarea.vue'; +import FormInfo from '@client/components/debobigego/info.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; @@ -46,7 +46,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.proxyAccount, - icon: 'fas fa-ghost' + icon: 'fas fa-ghost', + bg: 'var(--bg)', }, proxyAccount: null, proxyAccountId: null, diff --git a/src/client/pages/instance/queue.chart.vue b/src/client/pages/instance/queue.chart.vue index 53d790598a..887fe9a574 100644 --- a/src/client/pages/instance/queue.chart.vue +++ b/src/client/pages/instance/queue.chart.vue @@ -1,7 +1,7 @@ <template> -<div class="_formItem"> - <div class="_formLabel"><slot name="title"></slot></div> - <div class="_formPanel pumxzjhg"> +<div class="_debobigegoItem"> + <div class="_debobigegoLabel"><slot name="title"></slot></div> + <div class="_debobigegoPanel pumxzjhg"> <div class="_table status"> <div class="_row"> <div class="_cell"><div class="_label">Process</div>{{ number(activeSincePrevTick) }}</div> diff --git a/src/client/pages/instance/queue.vue b/src/client/pages/instance/queue.vue index e8ec0bc97d..f88825eb19 100644 --- a/src/client/pages/instance/queue.vue +++ b/src/client/pages/instance/queue.vue @@ -14,8 +14,8 @@ import { defineComponent, markRaw } from 'vue'; import MkButton from '@client/components/ui/button.vue'; import XQueue from './queue.chart.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormButton from '@client/components/form/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormButton from '@client/components/debobigego/button.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; @@ -34,6 +34,7 @@ export default defineComponent({ [symbols.PAGE_INFO]: { title: this.$ts.jobQueue, icon: 'fas fa-clipboard-list', + bg: 'var(--bg)', }, connection: markRaw(os.stream.useChannel('queueStats')), } diff --git a/src/client/pages/instance/relays.vue b/src/client/pages/instance/relays.vue index a3e4e7d1da..7d7888eaa8 100644 --- a/src/client/pages/instance/relays.vue +++ b/src/client/pages/instance/relays.vue @@ -2,8 +2,8 @@ <FormBase class="relaycxt"> <FormButton @click="addRelay" primary><i class="fas fa-plus"></i> {{ $ts.addRelay }}</FormButton> - <div class="_formItem" v-for="relay in relays" :key="relay.inbox"> - <div class="_formPanel" style="padding: 16px;"> + <div class="_debobigegoItem" v-for="relay in relays" :key="relay.inbox"> + <div class="_debobigegoPanel" style="padding: 16px;"> <div>{{ relay.inbox }}</div> <div>{{ $t(`_relayStatus.${relay.status}`) }}</div> <MkButton class="button" inline danger @click="remove(relay.inbox)"><i class="fas fa-trash-alt"></i> {{ $ts.remove }}</MkButton> @@ -15,9 +15,9 @@ <script lang="ts"> import { defineComponent } from 'vue'; import MkButton from '@client/components/ui/button.vue'; -import MkInput from '@client/components/ui/input.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormButton from '@client/components/form/button.vue'; +import MkInput from '@client/components/form/input.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormButton from '@client/components/debobigego/button.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; @@ -36,6 +36,7 @@ export default defineComponent({ [symbols.PAGE_INFO]: { title: this.$ts.relays, icon: 'fas fa-globe', + bg: 'var(--bg)', }, relays: [], inbox: '', diff --git a/src/client/pages/instance/security.vue b/src/client/pages/instance/security.vue index e3397a113b..a854b6dbd0 100644 --- a/src/client/pages/instance/security.vue +++ b/src/client/pages/instance/security.vue @@ -8,7 +8,9 @@ <template #suffix v-else>{{ $ts.none }} ({{ $ts.notRecommended }})</template> </FormLink> - <FormSwitch v-model:value="enableRegistration">{{ $ts.enableRegistration }}</FormSwitch> + <FormSwitch v-model="enableRegistration">{{ $ts.enableRegistration }}</FormSwitch> + + <FormSwitch v-model="emailRequiredForSignup">{{ $ts.emailRequiredForSignup }}</FormSwitch> <FormButton @click="save" primary><i class="fas fa-save"></i> {{ $ts.save }}</FormButton> </FormSuspense> @@ -17,13 +19,13 @@ <script lang="ts"> import { defineAsyncComponent, defineComponent } from 'vue'; -import FormLink from '@client/components/form/link.vue'; -import FormSwitch from '@client/components/form/switch.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormInfo from '@client/components/form/info.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormLink from '@client/components/debobigego/link.vue'; +import FormSwitch from '@client/components/debobigego/switch.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormInfo from '@client/components/debobigego/info.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; @@ -45,11 +47,13 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.security, - icon: 'fas fa-lock' + icon: 'fas fa-lock', + bg: 'var(--bg)', }, enableHcaptcha: false, enableRecaptcha: false, enableRegistration: false, + emailRequiredForSignup: false, } }, @@ -63,11 +67,13 @@ export default defineComponent({ this.enableHcaptcha = meta.enableHcaptcha; this.enableRecaptcha = meta.enableRecaptcha; this.enableRegistration = !meta.disableRegistration; + this.emailRequiredForSignup = meta.emailRequiredForSignup; }, save() { os.apiWithDialog('admin/update-meta', { disableRegistration: !this.enableRegistration, + emailRequiredForSignup: this.emailRequiredForSignup, }).then(() => { fetchInstance(); }); diff --git a/src/client/pages/instance/service-worker.vue b/src/client/pages/instance/service-worker.vue index a52932bb75..430e02ad2e 100644 --- a/src/client/pages/instance/service-worker.vue +++ b/src/client/pages/instance/service-worker.vue @@ -1,18 +1,18 @@ <template> <FormBase> <FormSuspense :p="init"> - <FormSwitch v-model:value="enableServiceWorker"> + <FormSwitch v-model="enableServiceWorker"> {{ $ts.enableServiceworker }} <template #desc>{{ $ts.serviceworkerInfo }}</template> </FormSwitch> <template v-if="enableServiceWorker"> - <FormInput v-model:value="swPublicKey"> + <FormInput v-model="swPublicKey"> <template #prefix><i class="fas fa-key"></i></template> Public key </FormInput> - <FormInput v-model:value="swPrivateKey"> + <FormInput v-model="swPrivateKey"> <template #prefix><i class="fas fa-key"></i></template> Private key </FormInput> @@ -25,12 +25,12 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormSwitch from '@client/components/form/switch.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormSwitch from '@client/components/debobigego/switch.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; @@ -51,7 +51,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: 'ServiceWorker', - icon: 'fas fa-bolt' + icon: 'fas fa-bolt', + bg: 'var(--bg)', }, enableServiceWorker: false, swPublicKey: null, diff --git a/src/client/pages/instance/settings.vue b/src/client/pages/instance/settings.vue index b68d784897..7bd363e5f3 100644 --- a/src/client/pages/instance/settings.vue +++ b/src/client/pages/instance/settings.vue @@ -1,50 +1,55 @@ <template> <FormBase> <FormSuspense :p="init"> - <FormInput v-model:value="name"> + <FormInput v-model="name"> <span>{{ $ts.instanceName }}</span> </FormInput> - <FormTextarea v-model:value="description"> + <FormTextarea v-model="description"> <span>{{ $ts.instanceDescription }}</span> </FormTextarea> - <FormInput v-model:value="iconUrl"> + <FormInput v-model="iconUrl"> <template #prefix><i class="fas fa-link"></i></template> <span>{{ $ts.iconUrl }}</span> </FormInput> - <FormInput v-model:value="bannerUrl"> + <FormInput v-model="bannerUrl"> <template #prefix><i class="fas fa-link"></i></template> <span>{{ $ts.bannerUrl }}</span> </FormInput> - <FormInput v-model:value="backgroundImageUrl"> + <FormInput v-model="backgroundImageUrl"> <template #prefix><i class="fas fa-link"></i></template> <span>{{ $ts.backgroundImageUrl }}</span> </FormInput> - <FormInput v-model:value="tosUrl"> + <FormInput v-model="tosUrl"> <template #prefix><i class="fas fa-link"></i></template> <span>{{ $ts.tosUrl }}</span> </FormInput> - <FormInput v-model:value="maintainerName"> + <FormInput v-model="maintainerName"> <span>{{ $ts.maintainerName }}</span> </FormInput> - <FormInput v-model:value="maintainerEmail" type="email"> + <FormInput v-model="maintainerEmail" type="email"> <template #prefix><i class="fas fa-envelope"></i></template> <span>{{ $ts.maintainerEmail }}</span> </FormInput> - <FormInput v-model:value="maxNoteTextLength" type="number"> + <FormTextarea v-model="pinnedUsers"> + <span>{{ $ts.pinnedUsers }}</span> + <template #desc>{{ $ts.pinnedUsersDescription }}</template> + </FormTextarea> + + <FormInput v-model="maxNoteTextLength" type="number"> <template #prefix><i class="fas fa-pencil-alt"></i></template> <span>{{ $ts.maxNoteTextLength }}</span> </FormInput> - <FormSwitch v-model:value="enableLocalTimeline">{{ $ts.enableLocalTimeline }}</FormSwitch> - <FormSwitch v-model:value="enableGlobalTimeline">{{ $ts.enableGlobalTimeline }}</FormSwitch> + <FormSwitch v-model="enableLocalTimeline">{{ $ts.enableLocalTimeline }}</FormSwitch> + <FormSwitch v-model="enableGlobalTimeline">{{ $ts.enableGlobalTimeline }}</FormSwitch> <FormInfo>{{ $ts.disablingTimelinesInfo }}</FormInfo> <FormButton @click="save" primary><i class="fas fa-save"></i> {{ $ts.save }}</FormButton> @@ -54,14 +59,14 @@ <script lang="ts"> import { defineComponent } from 'vue'; -import FormSwitch from '@client/components/form/switch.vue'; -import FormInput from '@client/components/form/input.vue'; -import FormButton from '@client/components/form/button.vue'; -import FormBase from '@client/components/form/base.vue'; -import FormGroup from '@client/components/form/group.vue'; -import FormTextarea from '@client/components/form/textarea.vue'; -import FormInfo from '@client/components/form/info.vue'; -import FormSuspense from '@client/components/form/suspense.vue'; +import FormSwitch from '@client/components/debobigego/switch.vue'; +import FormInput from '@client/components/debobigego/input.vue'; +import FormButton from '@client/components/debobigego/button.vue'; +import FormBase from '@client/components/debobigego/base.vue'; +import FormGroup from '@client/components/debobigego/group.vue'; +import FormTextarea from '@client/components/debobigego/textarea.vue'; +import FormInfo from '@client/components/debobigego/info.vue'; +import FormSuspense from '@client/components/debobigego/suspense.vue'; import * as os from '@client/os'; import * as symbols from '@client/symbols'; import { fetchInstance } from '@client/instance'; @@ -84,7 +89,8 @@ export default defineComponent({ return { [symbols.PAGE_INFO]: { title: this.$ts.general, - icon: 'fas fa-cog' + icon: 'fas fa-cog', + bg: 'var(--bg)', }, name: null, description: null, @@ -97,6 +103,7 @@ export default defineComponent({ maxNoteTextLength: 0, enableLocalTimeline: false, enableGlobalTimeline: false, + pinnedUsers: '', } }, @@ -118,6 +125,7 @@ export default defineComponent({ this.maxNoteTextLength = meta.maxNoteTextLength; this.enableLocalTimeline = !meta.disableLocalTimeline; this.enableGlobalTimeline = !meta.disableGlobalTimeline; + this.pinnedUsers = meta.pinnedUsers.join('\n'); }, save() { @@ -133,6 +141,7 @@ export default defineComponent({ maxNoteTextLength: this.maxNoteTextLength, disableLocalTimeline: !this.enableLocalTimeline, disableGlobalTimeline: !this.enableGlobalTimeline, + pinnedUsers: this.pinnedUsers.split('\n'), }).then(() => { fetchInstance(); }); diff --git a/src/client/pages/instance/users.vue b/src/client/pages/instance/users.vue index 8db62683ba..f7f9306b70 100644 --- a/src/client/pages/instance/users.vue +++ b/src/client/pages/instance/users.vue @@ -1,20 +1,17 @@ <template> <div class="lknzcolw"> - <div class="actions"> - <MkButton inline primary @click="addUser()"><i class="fas fa-plus"></i> {{ $ts.addUser }}</MkButton> - <MkButton inline primary @click="lookupUser()"><i class="fas fa-search"></i> {{ $ts.lookup }}</MkButton> - </div> + <MkHeader :info="header"/> <div class="users"> - <div class="inputs" style="display: flex;"> - <MkSelect v-model="sort" style="margin: 0; flex: 1;"> + <div class="inputs"> + <MkSelect v-model="sort" style="flex: 1;"> <template #label>{{ $ts.sort }}</template> <option value="-createdAt">{{ $ts.registeredDate }} ({{ $ts.ascendingOrder }})</option> <option value="+createdAt">{{ $ts.registeredDate }} ({{ $ts.descendingOrder }})</option> <option value="-updatedAt">{{ $ts.lastUsed }} ({{ $ts.ascendingOrder }})</option> <option value="+updatedAt">{{ $ts.lastUsed }} ({{ $ts.descendingOrder }})</option> </MkSelect> - <MkSelect v-model="state" style="margin: 0; flex: 1;"> + <MkSelect v-model="state" style="flex: 1;"> <template #label>{{ $ts.state }}</template> <option value="all">{{ $ts.all }}</option> <option value="available">{{ $ts.normal }}</option> @@ -23,18 +20,20 @@ <option value="silenced">{{ $ts.silence }}</option> <option value="suspended">{{ $ts.suspend }}</option> </MkSelect> - <MkSelect v-model="origin" style="margin: 0; flex: 1;"> + <MkSelect v-model="origin" style="flex: 1;"> <template #label>{{ $ts.instance }}</template> <option value="combined">{{ $ts.all }}</option> <option value="local">{{ $ts.local }}</option> <option value="remote">{{ $ts.remote }}</option> </MkSelect> </div> - <div class="inputs" style="display: flex; padding-top: 1.2em;"> - <MkInput v-model="searchUsername" style="margin: 0; flex: 1;" type="text" spellcheck="false" @update:modelValue="$refs.users.reload()"> + <div class="inputs"> + <MkInput v-model="searchUsername" style="flex: 1;" type="text" spellcheck="false" @update:modelValue="$refs.users.reload()"> + <template #prefix>@</template> <template #label>{{ $ts.username }}</template> </MkInput> - <MkInput v-model="searchHost" style="margin: 0; flex: 1;" type="text" spellcheck="false" @update:modelValue="$refs.users.reload()" :disabled="pagination.params().origin === 'local'"> + <MkInput v-model="searchHost" style="flex: 1;" type="text" spellcheck="false" @update:modelValue="$refs.users.reload()" :disabled="pagination.params().origin === 'local'"> + <template #prefix>@</template> <template #label>{{ $ts.host }}</template> </MkInput> </div> @@ -67,8 +66,8 @@ <script lang="ts"> import { defineComponent } from 'vue'; import MkButton from '@client/components/ui/button.vue'; -import MkInput from '@client/components/ui/input.vue'; -import MkSelect from '@client/components/ui/select.vue'; +import MkInput from '@client/components/form/input.vue'; +import MkSelect from '@client/components/form/select.vue'; import MkPagination from '@client/components/ui/pagination.vue'; import { acct } from '@client/filters/user'; import * as os from '@client/os'; @@ -90,10 +89,27 @@ export default defineComponent({ [symbols.PAGE_INFO]: { title: this.$ts.users, icon: 'fas fa-users', - action: { + bg: 'var(--bg)', + }, + header: { + title: this.$ts.users, + icon: 'fas fa-users', + bg: 'var(--bg)', + actions: [{ icon: 'fas fa-search', + text: this.$ts.search, handler: this.searchUser - } + }, { + asFullButton: true, + icon: 'fas fa-plus', + text: this.$ts.addUser, + handler: this.addUser + }, { + asFullButton: true, + icon: 'fas fa-search', + text: this.$ts.lookup, + handler: this.lookupUser + }] }, sort: '+createdAt', state: 'all', @@ -172,12 +188,21 @@ export default defineComponent({ <style lang="scss" scoped> .lknzcolw { - > .actions { - margin: var(--margin); - } - > .users { margin: var(--margin); + + > .inputs { + display: flex; + margin-bottom: 16px; + + > * { + margin-right: 16px; + + &:last-child { + margin-right: 0; + } + } + } > .users { margin-top: var(--margin); |