diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2023-04-19 21:24:31 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-19 21:24:31 +0900 |
| commit | e1f9ab77f86f5a12091c864cdb502970715cd46e (patch) | |
| tree | 46990eae87d352e6674e43a64c3bdcd74c13119e /packages/frontend/src/pages/admin/server-rules.vue | |
| parent | Update test-frontend.yml (diff) | |
| download | sharkey-e1f9ab77f86f5a12091c864cdb502970715cd46e.tar.gz sharkey-e1f9ab77f86f5a12091c864cdb502970715cd46e.tar.bz2 sharkey-e1f9ab77f86f5a12091c864cdb502970715cd46e.zip | |
feat: Server rules (#10660)
* enhance(frontend): サーバールールのデザイン調整
* enhance(frontend): i18n
* enhance(frontend): 利用規約URLの設定を「モデレーション」ページへ移動
* enhance(frontend): サーバールールのデザイン調整
* Update CHANGELOG.md
* 不要な差分を削除
* fix(frontend): lint
* ui tweak
* test: add stories
* tweak
* test: bind args
* test: add interaction tests
* fix bug
* Update packages/frontend/src/pages/admin/server-rules.vue
Co-authored-by: Ebise Lutica <7106976+EbiseLutica@users.noreply.github.com>
* Update misskey-js.api.md
* chore: windowを明示
* :art:
* refactor
* :art:
* :art:
* fix e2e test
* :art:
* :art:
* fix icon
* fix e2e
---------
Co-authored-by: Ebise Lutica <7106976+EbiseLutica@users.noreply.github.com>
Co-authored-by: Acid Chicken (硫酸鶏) <root@acid-chicken.com>
Diffstat (limited to 'packages/frontend/src/pages/admin/server-rules.vue')
| -rw-r--r-- | packages/frontend/src/pages/admin/server-rules.vue | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/packages/frontend/src/pages/admin/server-rules.vue b/packages/frontend/src/pages/admin/server-rules.vue new file mode 100644 index 0000000000..85781c0bd0 --- /dev/null +++ b/packages/frontend/src/pages/admin/server-rules.vue @@ -0,0 +1,128 @@ +<template> +<div> + <MkStickyContainer> + <template #header><XHeader :tabs="headerTabs"/></template> + <MkSpacer :content-max="700" :margin-min="16" :margin-max="32"> + <div class="_gaps_m"> + <div>{{ i18n.ts._serverRules.description }}</div> + <Sortable + v-model="serverRules" + class="_gaps_m" + :item-key="(_, i) => i" + :animation="150" + :handle="'.' + $style.itemHandle" + @start="e => e.item.classList.add('active')" + @end="e => e.item.classList.remove('active')" + > + <template #item="{element,index}"> + <div :class="$style.item"> + <div :class="$style.itemHeader"> + <div :class="$style.itemNumber" v-text="String(index + 1)"/> + <span :class="$style.itemHandle"><i class="ti ti-menu"/></span> + <button class="_button" :class="$style.itemRemove" @click="remove(index)"><i class="ti ti-x"></i></button> + </div> + <MkInput v-model="serverRules[index]"/> + </div> + </template> + </Sortable> + <div :class="$style.commands"> + <MkButton rounded @click="serverRules.push('')"><i class="ti ti-plus"></i> {{ i18n.ts.add }}</MkButton> + <MkButton primary rounded :class="$style.buttonSave" @click="save"><i class="ti ti-check"></i> {{ i18n.ts.save }}</MkButton> + </div> + </div> + </MkSpacer> + </MkStickyContainer> +</div> +</template> + +<script lang="ts" setup> +import { defineAsyncComponent } from 'vue'; +import XHeader from './_header_.vue'; +import * as os from '@/os'; +import { fetchInstance, instance } from '@/instance'; +import { i18n } from '@/i18n'; +import { definePageMetadata } from '@/scripts/page-metadata'; +import MkButton from '@/components/MkButton.vue'; +import MkInput from '@/components/MkInput.vue'; + +const Sortable = defineAsyncComponent(() => import('vuedraggable').then(x => x.default)); + +let serverRules: string[] = $ref(instance.serverRules); + +const save = async () => { + await os.apiWithDialog('admin/update-meta', { + serverRules, + }); + fetchInstance(); +}; + +const remove = (index: number): void => { + serverRules.splice(index, 1); +}; + +const headerTabs = $computed(() => []); + +definePageMetadata({ + title: i18n.ts.serverRules, + icon: 'ti ti-checkbox', +}); +</script> + +<style lang="scss" module> +.item { + display: block; + color: var(--navFg); +} + +.itemHeader { + display: flex; + margin-bottom: 8px; + align-items: center; +} + +.itemHandle { + display: flex; + width: 40px; + height: 40px; + align-items: center; + justify-content: center; + cursor: move; +} + +.itemNumber { + display: flex; + background-color: var(--accentedBg); + color: var(--accent); + font-size: 14px; + font-weight: bold; + width: 28px; + height: 28px; + align-items: center; + justify-content: center; + border-radius: 999px; + margin-right: 8px; +} + +.itemEdit { + width: 100%; + max-width: 100%; + min-width: 100%; +} + +.itemRemove { + width: 40px; + height: 40px; + color: var(--error); + margin-left: auto; + border-radius: 6px; + + &:hover { + background: var(--X5); + } +} + +.commands { + display: flex; + gap: 16px; +} +</style> |