From 26eec09d0e62811267242d8864aedce086c55ac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=93=E3=81=8B=E3=82=8A?= <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sun, 26 Jan 2025 20:10:22 +0900 Subject: [PATCH] =?UTF-8?q?enhance(frontend):=20=E7=B5=B5=E6=96=87?= =?UTF-8?q?=E5=AD=97=E7=AE=A1=E7=90=86=E7=94=BB=E9=9D=A2=CE=B2=EF=BC=88?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=82=AB=E3=83=AB=EF=BC=89=E3=81=AEUI?= =?UTF-8?q?=E3=83=BBUX=E6=94=B9=E5=96=84=20(#15349)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enhance(frontend): 絵文字管理画面β(ローカル)のUI・UX改善 * fix * :art: * 表示件数をメニューから変更するように * 確認ダイアログ * fix i18n * needWideArea: trueならwidgetの開閉ボタンを表示しないように * fix: 検索ウィンドウは一つしか開けないように --- locales/index.d.ts | 43 +- locales/ja-JP.yml | 13 +- .../src/components/MkSortOrderEditor.vue | 8 +- .../frontend/src/components/MkSuperMenu.vue | 2 +- .../frontend/src/components/MkTagItem.vue | 4 +- .../src/components/global/MkPageHeader.vue | 12 +- .../src/components/grid/MkDataCell.vue | 35 +- .../frontend/src/components/grid/MkGrid.vue | 56 ++- .../src/components/grid/MkHeaderCell.vue | 6 +- packages/frontend/src/components/grid/grid.ts | 5 + .../pages/admin/custom-emojis-manager.impl.ts | 3 +- .../custom-emojis-manager.local.list.logs.vue | 39 ++ ...ustom-emojis-manager.local.list.search.vue | 213 ++++++++ .../custom-emojis-manager.local.list.vue | 471 +++++++----------- .../custom-emojis-manager.local.register.vue | 16 +- .../admin/custom-emojis-manager.local.vue | 39 +- ...der.vue => custom-emojis-manager.logs.vue} | 56 +-- .../admin/custom-emojis-manager.remote.vue | 26 +- .../pages/admin/custom-emojis-manager2.vue | 13 +- packages/frontend/src/pages/admin/index.vue | 11 +- .../frontend/src/pages/settings/index.vue | 2 +- packages/frontend/src/ui/universal.vue | 2 +- 22 files changed, 659 insertions(+), 416 deletions(-) create mode 100644 packages/frontend/src/pages/admin/custom-emojis-manager.local.list.logs.vue create mode 100644 packages/frontend/src/pages/admin/custom-emojis-manager.local.list.search.vue rename packages/frontend/src/pages/admin/{custom-emojis-manager.logs-folder.vue => custom-emojis-manager.logs.vue} (62%) diff --git a/locales/index.d.ts b/locales/index.d.ts index 83159337a..a0540fd22 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -10588,7 +10588,7 @@ export interface Locale extends ILocale { */ "deleteSelectionRows": string; /** - * 選択範囲の行を削除 + * 選択範囲の値をクリア */ "deleteSelectionRanges": string; /** @@ -10599,6 +10599,10 @@ export interface Locale extends ILocale { * 検索条件を詳細に設定します。 */ "searchSettingCaption": string; + /** + * 表示件数 + */ + "searchLimit": string; /** * 並び順 */ @@ -10611,10 +10615,6 @@ export interface Locale extends ILocale { * 絵文字更新・削除時のログが表示されます。更新・削除操作を行ったり、ページを遷移・リロードすると消えます。 */ "registrationLogsCaption": string; - /** - * エラー - */ - "alertEmojisRegisterFailedTitle": string; /** * 絵文字の更新・削除に失敗しました。詳細は登録ログをご確認ください。 */ @@ -10691,21 +10691,30 @@ export interface Locale extends ILocale { */ "alertDeleteEmojisNothingDescription": string; /** - * 確認 + * ページを移動しますか? */ - "confirmUpdateEmojisTitle": string; + "confirmMovePage": string; + /** + * 表示を変更しますか? + */ + "confirmChangeView": string; /** * {count}個の絵文字を更新します。実行しますか? */ "confirmUpdateEmojisDescription": ParameterizedString<"count">; - /** - * 確認 - */ - "confirmDeleteEmojisTitle": string; /** * チェックがつけられた{count}個の絵文字を削除します。実行しますか? */ "confirmDeleteEmojisDescription": ParameterizedString<"count">; + /** + * 今までに加えた変更がすべてリセットされます。 + */ + "confirmResetDescription": string; + /** + * このページの絵文字に変更が加えられています。 + * 保存せずにこのままページを移動すると、このページで加えた変更はすべて破棄されます。 + */ + "confirmMovePageDesciption": string; /** * 絵文字に設定されたロールで検索 */ @@ -10744,26 +10753,14 @@ export interface Locale extends ILocale { * このリンクをクリックしてドライブから選択する */ "emojiInputAreaList3": string; - /** - * 確認 - */ - "confirmRegisterEmojisTitle": string; /** * リストに表示されている絵文字を新たなカスタム絵文字として登録します。よろしいですか?(負荷を避けるため、一度の操作で登録可能な絵文字は{count}件までです) */ "confirmRegisterEmojisDescription": ParameterizedString<"count">; - /** - * 確認 - */ - "confirmClearEmojisTitle": string; /** * 編集内容を破棄し、リストに表示されている絵文字をクリアします。よろしいですか? */ "confirmClearEmojisDescription": string; - /** - * 確認 - */ - "confirmUploadEmojisTitle": string; /** * ドラッグ&ドロップされた{count}個のファイルをドライブにアップロードします。実行しますか? */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 42c25a58a..a57870443 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -2824,13 +2824,13 @@ _customEmojisManager: copySelectionRows: "選択行をコピー" copySelectionRanges: "選択範囲をコピー" deleteSelectionRows: "選択行を削除" - deleteSelectionRanges: "選択範囲の行を削除" + deleteSelectionRanges: "選択範囲の値をクリア" searchSettings: "検索設定" searchSettingCaption: "検索条件を詳細に設定します。" + searchLimit: "表示件数" sortOrder: "並び順" registrationLogs: "登録ログ" registrationLogsCaption: "絵文字更新・削除時のログが表示されます。更新・削除操作を行ったり、ページを遷移・リロードすると消えます。" - alertEmojisRegisterFailedTitle: "エラー" alertEmojisRegisterFailedDescription: "絵文字の更新・削除に失敗しました。詳細は登録ログをご確認ください。" _logs: showSuccessLogSwitch: "成功ログを表示" @@ -2852,10 +2852,12 @@ _customEmojisManager: markAsDeleteTargetRanges: "選択範囲の行を削除対象にする" alertUpdateEmojisNothingDescription: "変更された絵文字はありません。" alertDeleteEmojisNothingDescription: "削除対象の絵文字はありません。" - confirmUpdateEmojisTitle: "確認" + confirmMovePage: "ページを移動しますか?" + confirmChangeView: "表示を変更しますか?" confirmUpdateEmojisDescription: "{count}個の絵文字を更新します。実行しますか?" - confirmDeleteEmojisTitle: "確認" confirmDeleteEmojisDescription: "チェックがつけられた{count}個の絵文字を削除します。実行しますか?" + confirmResetDescription: "今までに加えた変更がすべてリセットされます。" + confirmMovePageDesciption: "このページの絵文字に変更が加えられています。\n保存せずにこのままページを移動すると、このページで加えた変更はすべて破棄されます。" dialogSelectRoleTitle: "絵文字に設定されたロールで検索" _register: uploadSettingTitle: "アップロード設定" @@ -2866,11 +2868,8 @@ _customEmojisManager: emojiInputAreaList1: "この枠に画像ファイルまたはディレクトリをドラッグ&ドロップ" emojiInputAreaList2: "このリンクをクリックしてPCから選択する" emojiInputAreaList3: "このリンクをクリックしてドライブから選択する" - confirmRegisterEmojisTitle: "確認" confirmRegisterEmojisDescription: "リストに表示されている絵文字を新たなカスタム絵文字として登録します。よろしいですか?(負荷を避けるため、一度の操作で登録可能な絵文字は{count}件までです)" - confirmClearEmojisTitle: "確認" confirmClearEmojisDescription: "編集内容を破棄し、リストに表示されている絵文字をクリアします。よろしいですか?" - confirmUploadEmojisTitle: "確認" confirmUploadEmojisDescription: "ドラッグ&ドロップされた{count}個のファイルをドライブにアップロードします。実行しますか?" _embedCodeGen: diff --git a/packages/frontend/src/components/MkSortOrderEditor.vue b/packages/frontend/src/components/MkSortOrderEditor.vue index da08f1229..9decacc5f 100644 --- a/packages/frontend/src/components/MkSortOrderEditor.vue +++ b/packages/frontend/src/components/MkSortOrderEditor.vue @@ -12,12 +12,13 @@ SPDX-License-Identifier: AGPL-3.0-only :iconClass="order.direction === '+' ? 'ti ti-arrow-up' : 'ti ti-arrow-down'" :exButtonIconClass="'ti ti-x'" :content="order.key" + :class="$style.sortOrderTag" @click="onToggleSortOrderButtonClicked(order)" @exButtonClick="onRemoveSortOrderButtonClicked(order)" /> - + @@ -109,4 +110,9 @@ function emitOrder(sortOrders: SortOrder[]) { border-radius: 9999px; background-color: var(--MI_THEME-buttonBg); } + +.sortOrderTag { + user-select: none; + cursor: pointer; +} diff --git a/packages/frontend/src/components/MkSuperMenu.vue b/packages/frontend/src/components/MkSuperMenu.vue index 0caaed6f3..fa0e40d8f 100644 --- a/packages/frontend/src/components/MkSuperMenu.vue +++ b/packages/frontend/src/components/MkSuperMenu.vue @@ -47,7 +47,7 @@ export type SuperMenuDef = { active?: boolean; action: (ev: MouseEvent) => void; } | { - type: 'link'; + type?: 'link'; to: string; icon?: string; text: string; diff --git a/packages/frontend/src/components/MkTagItem.vue b/packages/frontend/src/components/MkTagItem.vue index 98f241139..8b7460f3a 100644 --- a/packages/frontend/src/components/MkTagItem.vue +++ b/packages/frontend/src/components/MkTagItem.vue @@ -5,10 +5,10 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/components/global/MkPageHeader.vue b/packages/frontend/src/components/global/MkPageHeader.vue index aa4be69b2..a2e70a5ca 100644 --- a/packages/frontend/src/components/global/MkPageHeader.vue +++ b/packages/frontend/src/components/global/MkPageHeader.vue @@ -48,13 +48,16 @@ import { scrollToTop } from '@@/js/scroll.js'; import { globalEvents } from '@/events.js'; import { injectReactiveMetadata } from '@/scripts/page-metadata.js'; import { $i, openAccountMenu as openAccountMenu_ } from '@/account.js'; -import { PageHeaderItem } from '@/types/page-header.js'; +import type { PageHeaderItem } from '@/types/page-header.js'; +import type { PageMetadata } from '@/scripts/page-metadata.js'; const props = withDefaults(defineProps<{ + overridePageMetadata?: PageMetadata; tabs?: Tab[]; tab?: string; actions?: PageHeaderItem[] | null; thin?: boolean; + hideTitle?: boolean; displayMyAvatar?: boolean; }>(), { tabs: () => ([] as Tab[]), @@ -64,9 +67,10 @@ const emit = defineEmits<{ (ev: 'update:tab', key: string); }>(); -const pageMetadata = injectReactiveMetadata(); +const injectedPageMetadata = injectReactiveMetadata(); +const pageMetadata = computed(() => props.overridePageMetadata ?? injectedPageMetadata.value); -const hideTitle = inject('shouldOmitHeaderTitle', false); +const hideTitle = computed(() => inject('shouldOmitHeaderTitle', false) || props.hideTitle); const thin_ = props.thin || inject('shouldHeaderThin', false); const el = shallowRef(undefined); @@ -75,7 +79,7 @@ const narrow = ref(false); const hasTabs = computed(() => props.tabs.length > 0); const hasActions = computed(() => props.actions && props.actions.length > 0); const show = computed(() => { - return !hideTitle || hasTabs.value || hasActions.value; + return !hideTitle.value || hasTabs.value || hasActions.value; }); const preventDrag = (ev: TouchEvent) => { diff --git a/packages/frontend/src/components/grid/MkDataCell.vue b/packages/frontend/src/components/grid/MkDataCell.vue index 0ffd42abd..e473b7c1a 100644 --- a/packages/frontend/src/components/grid/MkDataCell.vue +++ b/packages/frontend/src/components/grid/MkDataCell.vue @@ -39,13 +39,15 @@ SPDX-License-Identifier: AGPL-3.0-only {{ cell.value }}
- - +
@@ -375,6 +377,31 @@ $cellHeight: 28px; object-fit: cover; } +.bool { + position: relative; + width: 18px; + height: 18px; + background: var(--MI_THEME-panel); + border: solid 2px var(--MI_THEME-divider); + border-radius: 4px; + box-sizing: border-box; + + &.boolTrue { + border-color: var(--MI_THEME-accent); + background: var(--MI_THEME-accent); + + &::before { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: var(--MI_THEME-fgOnAccent); + font-size: 12px; + line-height: 18px; + } + } +} + .editingInput { padding: 0 8px; width: 100%; diff --git a/packages/frontend/src/components/grid/MkGrid.vue b/packages/frontend/src/components/grid/MkGrid.vue index 60738365f..4dbd4ebca 100644 --- a/packages/frontend/src/components/grid/MkGrid.vue +++ b/packages/frontend/src/components/grid/MkGrid.vue @@ -7,7 +7,11 @@ SPDX-License-Identifier: AGPL-3.0-only
(); const props = defineProps<{ - settings: GridSetting, - data: DataSource[] + settings: GridSetting; + data: DataSource[]; }>(); +const rootSetting: Required = { + noOverflowStyle: false, + rounded: true, + outerBorder: true, + ...props.settings.root, +}; + // non-reactive // eslint-disable-next-line vue/no-setup-props-reactivity-loss const rowSetting: Required = { @@ -1277,32 +1288,48 @@ onMounted(() => { overflow-x: scroll; // firefoxだとスクロールバーがセルに重なって見づらくなってしまうのでスペースを空けておく padding-bottom: 8px; + + &.noOverflowHandling { + overflow-x: revert; + padding-bottom: 0; + } } diff --git a/packages/frontend/src/pages/admin/custom-emojis-manager.local.list.vue b/packages/frontend/src/pages/admin/custom-emojis-manager.local.list.vue index 55f9632ce..c4ea3b93e 100644 --- a/packages/frontend/src/pages/admin/custom-emojis-manager.local.list.vue +++ b/packages/frontend/src/pages/admin/custom-emojis-manager.local.list.vue @@ -5,137 +5,11 @@ SPDX-License-Identifier: AGPL-3.0-only + + +const headerTabs = computed(() => [{ + key: 'list', + title: i18n.ts._customEmojisManager._local.tabTitleList, +}, { + key: 'register', + title: i18n.ts._customEmojisManager._local.tabTitleRegister, +}]); + diff --git a/packages/frontend/src/pages/admin/custom-emojis-manager.logs-folder.vue b/packages/frontend/src/pages/admin/custom-emojis-manager.logs.vue similarity index 62% rename from packages/frontend/src/pages/admin/custom-emojis-manager.logs-folder.vue rename to packages/frontend/src/pages/admin/custom-emojis-manager.logs.vue index f75f6c0da..eef55a9f7 100644 --- a/packages/frontend/src/pages/admin/custom-emojis-manager.logs-folder.vue +++ b/packages/frontend/src/pages/admin/custom-emojis-manager.logs.vue @@ -4,47 +4,38 @@ SPDX-License-Identifier: AGPL-3.0-only --> - - diff --git a/packages/frontend/src/pages/admin/custom-emojis-manager.remote.vue b/packages/frontend/src/pages/admin/custom-emojis-manager.remote.vue index 14a3b71e5..eecf8d739 100644 --- a/packages/frontend/src/pages/admin/custom-emojis-manager.remote.vue +++ b/packages/frontend/src/pages/admin/custom-emojis-manager.remote.vue @@ -64,6 +64,8 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+ @@ -74,6 +76,14 @@ SPDX-License-Identifier: AGPL-3.0-only /> + + + +
{{ i18n.ts.search }} @@ -85,7 +95,14 @@ SPDX-License-Identifier: AGPL-3.0-only
- + + + + + +