summaryrefslogtreecommitdiff
path: root/packages/frontend/src/pages/admin/server-rules.vue
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-04-19 21:24:31 +0900
committerGitHub <noreply@github.com>2023-04-19 21:24:31 +0900
commite1f9ab77f86f5a12091c864cdb502970715cd46e (patch)
tree46990eae87d352e6674e43a64c3bdcd74c13119e /packages/frontend/src/pages/admin/server-rules.vue
parentUpdate test-frontend.yml (diff)
downloadsharkey-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.vue128
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>