From bc78bb9b8e63ed173741f59895e8e562236162ef Mon Sep 17 00:00:00 2001 From: kami8 <55905116+kamiya-s-max@users.noreply.github.com> Date: Fri, 26 Dec 2025 09:19:32 +0900 Subject: Fix(frontend): ドライブクリーナーから画像を削除した際、リロードしなくても画面に反映されるよう修正 (#16888) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ドライブクリーナーでファイル削除後、リロードなしで画面に反映されるように修正 * CHANGELOG.mdを修正 * CHANGELOGがおかしかったので修正 --- packages/frontend/src/pages/settings/drive-cleaner.vue | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'packages/frontend/src') diff --git a/packages/frontend/src/pages/settings/drive-cleaner.vue b/packages/frontend/src/pages/settings/drive-cleaner.vue index 57192c0fb7..3aeb356bd3 100644 --- a/packages/frontend/src/pages/settings/drive-cleaner.vue +++ b/packages/frontend/src/pages/settings/drive-cleaner.vue @@ -60,6 +60,7 @@ import bytes from '@/filters/bytes.js'; import { definePage } from '@/page.js'; import MkSelect from '@/components/MkSelect.vue'; import { useMkSelect } from '@/composables/use-mkselect.js'; +import { useGlobalEvent } from '@/events.js'; import { getDriveFileMenu } from '@/utility/get-drive-file-menu.js'; import { Paginator } from '@/utility/paginator.js'; @@ -123,6 +124,12 @@ function onContextMenu(ev: MouseEvent, file): void { os.contextMenu(getDriveFileMenu(file), ev); } +useGlobalEvent('driveFilesDeleted', (files) => { + for (const f of files) { + paginator.removeItem(f.id); + } +}); + definePage(() => ({ title: i18n.ts.drivecleaner, icon: 'ti ti-trash', -- cgit v1.2.3-freya From 7a5430199fdc03131b8f25db99a45a49a8351da2 Mon Sep 17 00:00:00 2001 From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sun, 28 Dec 2025 19:53:08 +0900 Subject: enhance(frontend): MkDriveで自動でもっと見るを有効化 (#17037) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enhance(frontend): MkDriveで自動でもっと見るを有効化 * Update Changelog --- CHANGELOG.md | 1 + packages/frontend/src/components/MkDrive.vue | 15 ++++++++++++++- packages/frontend/src/directives/appear.ts | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) (limited to 'packages/frontend/src') diff --git a/CHANGELOG.md b/CHANGELOG.md index 47b07419f4..c478c83005 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - ### Client +- Enhance: ドライブのファイル一覧で自動でもっと見るを利用可能に - Fix: ドライブクリーナーでファイルを削除しても画面に反映されない問題を修正 #16061 ### Server diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue index d8c949d8eb..b67a382748 100644 --- a/packages/frontend/src/components/MkDrive.vue +++ b/packages/frontend/src/components/MkDrive.vue @@ -135,7 +135,14 @@ SPDX-License-Identifier: AGPL-3.0-only /> - {{ i18n.ts.loadMore }} + {{ i18n.ts.loadMore }}
{{ i18n.ts.dropHereToUpload }}
@@ -182,10 +189,12 @@ const props = withDefaults(defineProps<{ type?: string; multiple?: boolean; select?: 'file' | 'folder' | null; + forceDisableInfiniteScroll?: boolean; }>(), { initialFolder: null, multiple: false, select: null, + forceDisableInfiniteScroll: false, }); const emit = defineEmits<{ @@ -194,6 +203,10 @@ const emit = defineEmits<{ (ev: 'cd', v: Misskey.entities.DriveFolder | null): void; }>(); +const shouldEnableInfiniteScroll = computed(() => { + return prefer.r.enableInfiniteScroll.value && !props.forceDisableInfiniteScroll; +}); + const folder = ref(null); const hierarchyFolders = ref([]); diff --git a/packages/frontend/src/directives/appear.ts b/packages/frontend/src/directives/appear.ts index 117dc397da..599f2378d1 100644 --- a/packages/frontend/src/directives/appear.ts +++ b/packages/frontend/src/directives/appear.ts @@ -16,7 +16,7 @@ export const appearDirective = { const fn = binding.value; if (fn == null) return; - const check = throttle(1000, (entries) => { + const check = throttle(500, (entries) => { if (entries.some(entry => entry.isIntersecting)) { fn(); } -- cgit v1.2.3-freya From 14f58255ee6a98837df680f50293e3ef1a26d2dc Mon Sep 17 00:00:00 2001 From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sun, 28 Dec 2025 20:50:11 +0900 Subject: enhance(frontend): ウィジェットの設定画面を改良 (#17033) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enhance(frontend): ウィジェットの設定画面を改良 * Update Changelog * fix lint --- CHANGELOG.md | 1 + locales/ja-JP.yml | 2 +- .../src/components/MkEmbedCodeGenDialog.vue | 85 ++---- packages/frontend/src/components/MkForm.file.vue | 74 +++++ packages/frontend/src/components/MkForm.vue | 84 ++++++ .../frontend/src/components/MkFormDialog.file.vue | 74 ----- packages/frontend/src/components/MkFormDialog.vue | 87 +----- .../src/components/MkImageEffectorDialog.vue | 108 ++------ .../src/components/MkImageEffectorFxForm.vue | 2 +- .../src/components/MkImageFrameEditorDialog.vue | 303 +++++++++------------ .../src/components/MkPreviewWithControls.vue | 93 +++++++ .../src/components/MkWatermarkEditorDialog.vue | 128 +++------ .../src/components/MkWidgetSettingsDialog.vue | 172 ++++++++++++ packages/frontend/src/widgets/widget.ts | 35 ++- packages/i18n/src/autogen/locale.ts | 8 +- 15 files changed, 697 insertions(+), 559 deletions(-) create mode 100644 packages/frontend/src/components/MkForm.file.vue create mode 100644 packages/frontend/src/components/MkForm.vue delete mode 100644 packages/frontend/src/components/MkFormDialog.file.vue create mode 100644 packages/frontend/src/components/MkPreviewWithControls.vue create mode 100644 packages/frontend/src/components/MkWidgetSettingsDialog.vue (limited to 'packages/frontend/src') diff --git a/CHANGELOG.md b/CHANGELOG.md index c478c83005..fc89b3d727 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Client - Enhance: ドライブのファイル一覧で自動でもっと見るを利用可能に +- Enhance: ウィジェットの表示設定をプレビューを見ながら行えるように - Fix: ドライブクリーナーでファイルを削除しても画面に反映されない問題を修正 #16061 ### Server diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 1eea745e0c..01e5101255 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1406,6 +1406,7 @@ youAreAdmin: "あなたは管理者です" frame: "フレーム" presets: "プリセット" zeroPadding: "ゼロ埋め" +nothingToConfigure: "設定項目はありません" _imageEditing: _vars: @@ -3418,7 +3419,6 @@ _imageEffector: title: "エフェクト" addEffect: "エフェクトを追加" discardChangesConfirm: "変更を破棄して終了しますか?" - nothingToConfigure: "設定項目はありません" failedToLoadImage: "画像の読み込みに失敗しました" _fxs: diff --git a/packages/frontend/src/components/MkEmbedCodeGenDialog.vue b/packages/frontend/src/components/MkEmbedCodeGenDialog.vue index 4f16149caa..9002669378 100644 --- a/packages/frontend/src/components/MkEmbedCodeGenDialog.vue +++ b/packages/frontend/src/components/MkEmbedCodeGenDialog.vue @@ -23,9 +23,8 @@ SPDX-License-Identifier: AGPL-3.0-only :enterFromClass="$style.transition_x_enterFrom" :leaveToClass="$style.transition_x_leaveTo" > -
-
- + + + +
@@ -89,18 +90,17 @@ import { url } from '@@/js/config.js'; import { embedRouteWithScrollbar } from '@@/js/embed-page.js'; import type { EmbeddableEntity, EmbedParams } from '@@/js/embed-page.js'; import MkModalWindow from '@/components/MkModalWindow.vue'; +import MkPreviewWithControls from '@/components/MkPreviewWithControls.vue'; import MkInput from '@/components/MkInput.vue'; import MkSelect from '@/components/MkSelect.vue'; import MkSwitch from '@/components/MkSwitch.vue'; import MkButton from '@/components/MkButton.vue'; import MkCode from '@/components/MkCode.vue'; import MkInfo from '@/components/MkInfo.vue'; -import * as os from '@/os.js'; import { i18n } from '@/i18n.js'; import { useMkSelect } from '@/composables/use-mkselect.js'; import { copyToClipboard } from '@/utility/copy-to-clipboard.js'; import { normalizeEmbedParams, getEmbedCode } from '@/utility/get-embed-code.js'; -import { prefer } from '@/preferences.js'; const emit = defineEmits<{ (ev: 'ok'): void; @@ -302,29 +302,6 @@ onUnmounted(() => { height: 100%; } -.embedCodeGenInputRoot { - height: 100%; - display: grid; - grid-template-columns: 1fr 400px; -} - -.embedCodeGenPreviewRoot { - position: relative; - cursor: not-allowed; - background-color: var(--MI_THEME-bg); - background-image: linear-gradient(135deg, transparent 30%, var(--MI_THEME-panel) 30%, var(--MI_THEME-panel) 50%, transparent 50%, transparent 80%, var(--MI_THEME-panel) 80%, var(--MI_THEME-panel) 100%); - background-size: 20px 20px; -} - -.animatedBg { - animation: bg 1.2s linear infinite; -} - -@keyframes bg { - 0% { background-position: 0 0; } - 100% { background-position: -20px -20px; } -} - .embedCodeGenPreviewWrapper { display: flex; flex-direction: column; @@ -372,11 +349,6 @@ onUnmounted(() => { color-scheme: light dark; } -.embedCodeGenSettings { - padding: 24px; - overflow-y: scroll; -} - .embedCodeGenResultRoot { box-sizing: border-box; padding: 24px; @@ -417,11 +389,4 @@ onUnmounted(() => { .embedCodeGenResultButtons { margin: 0 auto; } - -@container (max-width: 800px) { - .embedCodeGenInputRoot { - grid-template-columns: 1fr; - grid-template-rows: 1fr 1fr; - } -} diff --git a/packages/frontend/src/components/MkForm.file.vue b/packages/frontend/src/components/MkForm.file.vue new file mode 100644 index 0000000000..182ff3ccf5 --- /dev/null +++ b/packages/frontend/src/components/MkForm.file.vue @@ -0,0 +1,74 @@ + + + + + + + diff --git a/packages/frontend/src/components/MkForm.vue b/packages/frontend/src/components/MkForm.vue new file mode 100644 index 0000000000..750ffa77df --- /dev/null +++ b/packages/frontend/src/components/MkForm.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/packages/frontend/src/components/MkFormDialog.file.vue b/packages/frontend/src/components/MkFormDialog.file.vue deleted file mode 100644 index 182ff3ccf5..0000000000 --- a/packages/frontend/src/components/MkFormDialog.file.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - diff --git a/packages/frontend/src/components/MkFormDialog.vue b/packages/frontend/src/components/MkFormDialog.vue index 142ccb12a3..e598394ec4 100644 --- a/packages/frontend/src/components/MkFormDialog.vue +++ b/packages/frontend/src/components/MkFormDialog.vue @@ -20,66 +20,16 @@ SPDX-License-Identifier: AGPL-3.0-only
-
- -
- +
diff --git a/packages/frontend/src/components/MkImageEffectorDialog.vue b/packages/frontend/src/components/MkImageEffectorDialog.vue index 3d7801f925..01df7d7496 100644 --- a/packages/frontend/src/components/MkImageEffectorDialog.vue +++ b/packages/frontend/src/components/MkImageEffectorDialog.vue @@ -16,37 +16,36 @@ SPDX-License-Identifier: AGPL-3.0-only > -
-
-
- -
-
{{ i18n.ts.preview }}
-
- -
-
- - -
+ + + + + @@ -56,15 +55,12 @@ import type { ImageEffectorLayer } from '@/utility/image-effector/ImageEffector. import { i18n } from '@/i18n.js'; import { ImageEffector } from '@/utility/image-effector/ImageEffector.js'; import MkModalWindow from '@/components/MkModalWindow.vue'; -import MkSelect from '@/components/MkSelect.vue'; +import MkPreviewWithControls from '@/components/MkPreviewWithControls.vue'; import MkButton from '@/components/MkButton.vue'; -import MkInput from '@/components/MkInput.vue'; import XLayer from '@/components/MkImageEffectorDialog.Layer.vue'; import * as os from '@/os.js'; -import { deepClone } from '@/utility/clone.js'; import { FXS } from '@/utility/image-effector/fxs.js'; import { genId } from '@/utility/id.js'; -import { prefer } from '@/preferences.js'; const props = defineProps<{ image: File; @@ -367,33 +363,6 @@ function onImagePointerdown(ev: PointerEvent) { diff --git a/packages/frontend/src/components/MkImageEffectorFxForm.vue b/packages/frontend/src/components/MkImageEffectorFxForm.vue index e581b1f743..51485977a9 100644 --- a/packages/frontend/src/components/MkImageEffectorFxForm.vue +++ b/packages/frontend/src/components/MkImageEffectorFxForm.vue @@ -48,7 +48,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ i18n.ts._imageEffector.nothingToConfigure }} + {{ i18n.ts.nothingToConfigure }}
diff --git a/packages/frontend/src/components/MkImageFrameEditorDialog.vue b/packages/frontend/src/components/MkImageFrameEditorDialog.vue index 2a91c85952..0badda3db7 100644 --- a/packages/frontend/src/components/MkImageFrameEditorDialog.vue +++ b/packages/frontend/src/components/MkImageFrameEditorDialog.vue @@ -16,140 +16,139 @@ SPDX-License-Identifier: AGPL-3.0-only > -
-
-
- -
-
{{ i18n.ts.preview }}
-
- - - -
+ + + + + @@ -161,8 +160,8 @@ import type { ImageFrameParams, ImageFramePreset } from '@/utility/image-frame-r import { ImageFrameRenderer } from '@/utility/image-frame-renderer/ImageFrameRenderer.js'; import { i18n } from '@/i18n.js'; import MkModalWindow from '@/components/MkModalWindow.vue'; +import MkPreviewWithControls from './MkPreviewWithControls.vue'; import MkSelect from '@/components/MkSelect.vue'; -import MkButton from '@/components/MkButton.vue'; import MkFolder from '@/components/MkFolder.vue'; import MkSwitch from '@/components/MkSwitch.vue'; import MkRange from '@/components/MkRange.vue'; @@ -173,8 +172,6 @@ import * as os from '@/os.js'; import { deepClone } from '@/utility/clone.js'; import { ensureSignin } from '@/i.js'; import { genId } from '@/utility/id.js'; -import { useMkSelect } from '@/composables/use-mkselect.js'; -import { prefer } from '@/preferences.js'; const $i = ensureSignin(); @@ -412,33 +409,6 @@ function getRgb(hex: string | number): [number, number, number] | null { diff --git a/packages/frontend/src/components/MkPreviewWithControls.vue b/packages/frontend/src/components/MkPreviewWithControls.vue new file mode 100644 index 0000000000..85cfa2d7e9 --- /dev/null +++ b/packages/frontend/src/components/MkPreviewWithControls.vue @@ -0,0 +1,93 @@ + + + + + + + diff --git a/packages/frontend/src/components/MkWatermarkEditorDialog.vue b/packages/frontend/src/components/MkWatermarkEditorDialog.vue index 6cd2111598..7fe497e455 100644 --- a/packages/frontend/src/components/MkWatermarkEditorDialog.vue +++ b/packages/frontend/src/components/MkWatermarkEditorDialog.vue @@ -16,50 +16,49 @@ SPDX-License-Identifier: AGPL-3.0-only > -
-
-
- -
-
{{ i18n.ts.preview }}
-
- - - -
+ + + + + @@ -69,6 +68,7 @@ import type { WatermarkLayers, WatermarkPreset } from '@/utility/watermark/Water import { WatermarkRenderer } from '@/utility/watermark/WatermarkRenderer.js'; import { i18n } from '@/i18n.js'; import MkModalWindow from '@/components/MkModalWindow.vue'; +import MkPreviewWithControls from '@/components/MkPreviewWithControls.vue'; import MkSelect from '@/components/MkSelect.vue'; import MkButton from '@/components/MkButton.vue'; import MkFolder from '@/components/MkFolder.vue'; @@ -411,33 +411,6 @@ function removeLayer(layer: WatermarkPreset['layers'][number]) { diff --git a/packages/frontend/src/components/MkWidgetSettingsDialog.vue b/packages/frontend/src/components/MkWidgetSettingsDialog.vue new file mode 100644 index 0000000000..cebbe93986 --- /dev/null +++ b/packages/frontend/src/components/MkWidgetSettingsDialog.vue @@ -0,0 +1,172 @@ + + + + + + + diff --git a/packages/frontend/src/widgets/widget.ts b/packages/frontend/src/widgets/widget.ts index c5ca7ac26c..6c5ff36b16 100644 --- a/packages/frontend/src/widgets/widget.ts +++ b/packages/frontend/src/widgets/widget.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import { reactive, watch } from 'vue'; +import { defineAsyncComponent, reactive, watch } from 'vue'; import type { Reactive } from 'vue'; import { throttle } from 'throttle-debounce'; import type { FormWithDefault, GetFormResultType } from '@/utility/form.js'; @@ -62,11 +62,36 @@ export const useWidgetPropsManager = ( for (const item of Object.keys(form)) { form[item].default = widgetProps[item]; } - const { canceled, result } = await os.form(name, form); - if (canceled) return; - for (const key of Object.keys(result)) { - widgetProps[key] = result[key]; + const res = await new Promise<{ + canceled: false; + result: GetFormResultType; + } | { + canceled: true; + }>((resolve) => { + const { dispose } = os.popup(defineAsyncComponent(() => import('@/components/MkWidgetSettingsDialog.vue')), { + widgetName: name, + form: form, + currentSettings: widgetProps, + }, { + saved: (newProps: GetFormResultType) => { + resolve({ canceled: false, result: newProps }); + }, + canceled: () => { + resolve({ canceled: true }); + }, + closed: () => { + dispose(); + }, + }); + }); + + if (res.canceled) { + return; + } + + for (const key of Object.keys(res.result)) { + widgetProps[key] = res.result[key]; } save(); diff --git a/packages/i18n/src/autogen/locale.ts b/packages/i18n/src/autogen/locale.ts index 96a728da63..d8571483aa 100644 --- a/packages/i18n/src/autogen/locale.ts +++ b/packages/i18n/src/autogen/locale.ts @@ -5639,6 +5639,10 @@ export interface Locale extends ILocale { * ゼロ埋め */ "zeroPadding": string; + /** + * 設定項目はありません + */ + "nothingToConfigure": string; "_imageEditing": { "_vars": { /** @@ -12763,10 +12767,6 @@ export interface Locale extends ILocale { * 変更を破棄して終了しますか? */ "discardChangesConfirm": string; - /** - * 設定項目はありません - */ - "nothingToConfigure": string; /** * 画像の読み込みに失敗しました */ -- cgit v1.2.3-freya From 4285303c8155dd91be7dcbb865d5e8f7cb0e1c71 Mon Sep 17 00:00:00 2001 From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Tue, 30 Dec 2025 14:32:40 +0900 Subject: fix(frontend): follow-up of #17033 (#17047) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * wip * fix * ref -> reactive * tweak throttle threshold * tweak throttle threshold * rss設定にはmanualSaveを使用するように * Update MkWidgetSettingsDialog.vue --------- Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> --- packages/frontend/src/components/MkForm.vue | 6 ++--- .../src/components/MkWidgetSettingsDialog.vue | 11 ++------- packages/frontend/src/utility/form.ts | 10 ++++++++ packages/frontend/src/widgets/WidgetRss.vue | 6 ++--- packages/frontend/src/widgets/WidgetRssTicker.vue | 3 ++- packages/frontend/src/widgets/widget.ts | 27 +++++++++++++--------- 6 files changed, 36 insertions(+), 27 deletions(-) (limited to 'packages/frontend/src') diff --git a/packages/frontend/src/components/MkForm.vue b/packages/frontend/src/components/MkForm.vue index 750ffa77df..711aa611c3 100644 --- a/packages/frontend/src/components/MkForm.vue +++ b/packages/frontend/src/components/MkForm.vue @@ -7,15 +7,15 @@ SPDX-License-Identifier: AGPL-3.0-only