From d607f343809fc98ad66627f1f5f8408929c32fed Mon Sep 17 00:00:00 2001 From: tar_bin Date: Fri, 19 May 2023 01:43:42 +0900 Subject: [PATCH] =?UTF-8?q?=E7=B5=B5=E6=96=87=E5=AD=97=E3=83=80=E3=82=A4?= =?UTF-8?q?=E3=82=A2=E3=83=AD=E3=82=B0=E3=81=AE=E4=B8=8D=E5=85=B7=E5=90=88?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit c9d6c17353a663bf68cdea9bcef100f5de5edb68) --- locales/ja-JP.yml | 2 + .../api/endpoints/admin/emoji/add-draft.ts | 5 ++ packages/frontend/src/pages/about.emojis.vue | 8 --- .../frontend/src/pages/emoji-edit-dialog.vue | 58 ++++++++++++++----- 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index db2420c40d..367233c13c 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -653,6 +653,8 @@ other: "その他" regenerateLoginToken: "ログイントークンを再生成" regenerateLoginTokenDescription: "ログインに使用される内部トークンを再生成します。通常この操作を行う必要はありません。再生成すると、全てのデバイスでログアウトされます。" setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。" +emojiNameValidation: "名前には英数字と_が利用できます。" +isSensitive: "センシティブ" fileIdOrUrl: "ファイルIDまたはURL" behavior: "動作" sample: "サンプル" diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add-draft.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add-draft.ts index ac5082091e..40b7a12e87 100644 --- a/packages/backend/src/server/api/endpoints/admin/emoji/add-draft.ts +++ b/packages/backend/src/server/api/endpoints/admin/emoji/add-draft.ts @@ -36,6 +36,8 @@ export const paramDef = { } }, license: { type: 'string', nullable: true }, fileId: { type: 'string', format: 'misskey:id' }, + isSensitive: { type: 'boolean' }, + localOnly: { type: 'boolean' }, }, required: ['name', 'fileId'], } as const; @@ -66,6 +68,9 @@ export default class extends Endpoint { license: ps.license ?? null, host: null, draft: true, + isSensitive: ps.isSensitive ?? false, + localOnly: ps.localOnly ?? false, + roleIdsThatCanBeUsedThisEmojiAsReaction: [], }); this.moderationLogService.insertModerationLog(me, 'addEmoji', { diff --git a/packages/frontend/src/pages/about.emojis.vue b/packages/frontend/src/pages/about.emojis.vue index 6fb691bc5e..a00d2e3219 100644 --- a/packages/frontend/src/pages/about.emojis.vue +++ b/packages/frontend/src/pages/about.emojis.vue @@ -84,14 +84,6 @@ function toggleTag(tag) { const edit = () => { os.popup(defineAsyncComponent(() => import('./emoji-edit-dialog.vue')), { - emoji: { - name: '', - category: null, - aliases: [], - license: '', - url: '', - draft: true, - }, isRequest: true, }, { done: result => { diff --git a/packages/frontend/src/pages/emoji-edit-dialog.vue b/packages/frontend/src/pages/emoji-edit-dialog.vue index b241b6ed13..64be684db3 100644 --- a/packages/frontend/src/pages/emoji-edit-dialog.vue +++ b/packages/frontend/src/pages/emoji-edit-dialog.vue @@ -12,6 +12,7 @@ SPDX-License-Identifier: AGPL-3.0-only @closed="$emit('closed')" > +
@@ -34,6 +35,7 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.selectFile }} + @@ -45,7 +47,7 @@ SPDX-License-Identifier: AGPL-3.0-only - + @@ -62,13 +64,20 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn }}
- isSensitive + {{ i18n.ts.isSensitive }} {{ i18n.ts.localOnly }} + + {{ i18n.ts.draft }} + {{ i18n.ts.delete }}
- {{ props.emoji ? i18n.ts.update : i18n.ts.create }} +
+ {{ i18n.ts.delete }} + {{ props.emoji ? i18n.ts.update : i18n.ts.create }} + {{ props.emoji ? i18n.ts.update : i18n.ts.create }} +
{{ i18n.ts.draft }} @@ -110,7 +119,7 @@ let roleIdsThatCanBeUsedThisEmojiAsReaction = $ref(props.emoji ? props.emoji.rol let rolesThatCanBeUsedThisEmojiAsReaction = $ref([]); let file = $ref(); let chooseFile: DriveFile|null = $ref(null); -let draft = $ref(props.emoji.draft); +let draft = $ref(props.emoji ? props.emoji.draft : false); let isRequest = $ref(props.isRequest); watch($$(roleIdsThatCanBeUsedThisEmojiAsReaction), async () => { @@ -120,7 +129,9 @@ watch($$(roleIdsThatCanBeUsedThisEmojiAsReaction), async () => { const imgUrl = computed(() => file ? file.url : props.emoji ? `/emoji/${props.emoji.name}.webp` : null); let draft = $ref(props.emoji.draft); let isRequest = $ref(props.isRequest); - +const validation = computed(() => { + return name.match(/^[a-zA-Z0-9_]+$/) && imgUrl.value != null; +}) const emit = defineEmits<{ (ev: 'done', v: { deleted?: boolean; updated?: any; created?: any }): void, (ev: 'closed'): void @@ -207,15 +218,16 @@ async function update() { } async function done() { - const params = { - name, - category: category === '' ? null : category, - aliases: aliases.split(' ').filter(x => x !== ''), - license: license === '' ? null : license, - isSensitive, - localOnly, - roleIdsThatCanBeUsedThisEmojiAsReaction: rolesThatCanBeUsedThisEmojiAsReaction.map(x => x.id), - }; + const params = { + name, + category: category === '' ? null : category, + aliases: aliases.replace(' ', ' ').split(' ').filter(x => x !== ''), + license: license === '' ? null : license, + draft: draft, + isSensitive, + localOnly, + roleIdsThatCanBeUsedThisEmojiAsReaction: rolesThatCanBeUsedThisEmojiAsReaction.map(x => x.id), + }; if (file) { params.fileId = file.id; @@ -236,7 +248,9 @@ async function done() { dialog.close(); } else { - const created = await os.apiWithDialog('admin/emoji/add', params); + const created = isRequest + ? await os.apiWithDialog('admin/emoji/add-draft', params) + : await os.apiWithDialog('admin/emoji/add', params); emit('done', { created: created, @@ -246,6 +260,13 @@ async function done() { } } +function chooseFileFrom(ev) { + selectFiles(ev.currentTarget ?? ev.target, i18n.ts.attachFile).then(files_ => { + chooseFile = files_[0]; + url = chooseFile.url; + }); +} + async function del() { const { canceled } = await os.confirm({ type: 'warning', @@ -308,4 +329,11 @@ async function del() { -webkit-backdrop-filter: var(--blur, blur(15px)); backdrop-filter: var(--blur, blur(15px)); } + +.footerButtons { + display: flex; + gap: 8px; + flex-wrap: wrap; + justify-content: center; +}