Compare commits

...

3 Commits

Author SHA1 Message Date
tai-cha a6bc5ef0fa cleanUp 2025-06-25 02:28:22 +09:00
tai-cha a48dbcb188 下書き選択時に下書き可能数と現在の量が分かるように 2025-06-25 01:59:08 +09:00
tai-cha b20229945a escキーまわりの挙動を改善 2025-06-25 01:33:48 +09:00
5 changed files with 32 additions and 47 deletions

8
locales/index.d.ts vendored
View File

@ -166,10 +166,6 @@ export interface Locale extends ILocale {
*
*/
"save": string;
/**
*
*/
"dontSave": string;
/**
*
*/
@ -12252,9 +12248,9 @@ export interface Locale extends ILocale {
*/
"cannotCreateDraftAnymore": string;
/**
*
*
*/
"cannotCreateDraftAnymoreDescription": string;
"cannotCreateDraftOfRenote": string;
/**
*
*/

View File

@ -37,7 +37,6 @@ logout: "ログアウト"
signup: "新規登録"
uploading: "アップロード中"
save: "保存"
dontSave: "保存しない"
users: "ユーザー"
addUser: "ユーザーを追加"
favorite: "お気に入り"
@ -3282,7 +3281,7 @@ _imageEffector:
_drafts:
select: "下書きを選択"
cannotCreateDraftAnymore: "下書きの作成可能数を超えています。"
cannotCreateDraftAnymoreDescription: "サーバーに下書きを保存するには、下書きを削除する必要があります。ここで「保存しない」を選択しても、下書きは端末内に保存されます。"
cannotCreateDraftOfRenote: "リノートの下書きは作成できません。"
delete: "下書きを削除"
deleteAreYouSure: "下書きを削除しますか?"
noDrafts: "下書きはありません"

View File

@ -90,7 +90,7 @@ const emit = defineEmits<{
(ev: 'opening'): void;
(ev: 'opened'): void;
(ev: 'click'): void;
(ev: 'esc', event: KeyboardEvent): void;
(ev: 'esc'): void;
(ev: 'close'): void;
(ev: 'closed'): void;
}>();
@ -166,7 +166,7 @@ if (type.value === 'drawer') {
const keymap = {
'esc': {
allowRepeat: true,
callback: (ev) => emit('esc', ev),
callback: () => emit('esc'),
},
} as const satisfies Keymap;

View File

@ -14,10 +14,12 @@ SPDX-License-Identifier: AGPL-3.0-only
@close="cancel()"
@ok="ok()"
@closed="emit('closed')"
@esc="cancel()"
>
<template #header>{{ i18n.ts._drafts.select }}</template>
<template #header>
{{ i18n.ts._drafts.select }} ({{ currentDraftsCount }}/{{ $i?.policies.noteDraftLimit }})
</template>
<div :class="$style.drafts" class="_gaps">
<!-- TODO: 下書きの保存可能数の残り表示 -->
<MkPagination ref="pagingEl" :pagination="paging">
<template #empty>
<MkResult type="empty" :text="i18n.ts._drafts.noDrafts"/>
@ -98,6 +100,8 @@ import MkModalWindow from '@/components/MkModalWindow.vue';
import { getNoteSummary } from '@/utility/get-note-summary.js';
import { i18n } from '@/i18n.js';
import * as os from '@/os.js';
import { $i } from '@/i.js';
import { misskeyApi } from '@/utility/misskey-api';
const emit = defineEmits<{
(ev: 'ok', selected: Misskey.entities.NoteDraft): void;
@ -112,6 +116,11 @@ const paging = {
const pagingComponent = useTemplateRef('pagingEl');
const currentDraftsCount = ref(0);
misskeyApi('notes/drafts/count').then((count) => {
currentDraftsCount.value = count;
});
const selected = ref<Misskey.entities.NoteDraft | null>(null);
const dialogEl = shallowRef<InstanceType<typeof MkModalWindow>>();

View File

@ -213,6 +213,7 @@ const targetChannel = shallowRef(props.channel);
const serverDraftId = ref<string | null>(null);
const postFormActions = getPluginHandlers('post_form_action');
const draftSelectorOpening = ref(false);
const uploader = useUploader({
multiple: true,
@ -301,6 +302,7 @@ const canPost = computed((): boolean => {
(!poll.value || poll.value.choices.length >= 2);
});
// cannot save pure renote as draft
const canSaveAsServerDraft = computed((): boolean => {
return canPost.value && (textLength.value > 0 || files.value.length > 0 || poll.value != null);
});
@ -656,7 +658,7 @@ function onKeydown(ev: KeyboardEvent) {
// justEndedComposition.value is for Safari, which keyDown occurs after compositionend.
// ev.isComposing is for another browsers.
if (ev.key === 'Escape' && !justEndedComposition.value && !ev.isComposing) esc(ev);
if (ev.key === 'Escape' && !justEndedComposition.value && !ev.isComposing) emit('esc');
}
function onKeyup(ev: KeyboardEvent) {
@ -824,7 +826,7 @@ function deleteDraft() {
miLocalStorage.setItem('drafts', JSON.stringify(draftData));
}
async function saveServerDraft(clearLocal = false): Promise<{ canClosePostForm: boolean }> {
async function saveServerDraft(clearLocal = false) {
return await os.apiWithDialog(serverDraftId.value == null ? 'notes/drafts/create' : 'notes/drafts/update', {
...(serverDraftId.value == null ? {} : { draftId: serverDraftId.value }),
text: text.value,
@ -846,9 +848,7 @@ async function saveServerDraft(clearLocal = false): Promise<{ canClosePostForm:
clear();
deleteDraft();
}
return { canClosePostForm: true };
}).catch((err) => {
return { canClosePostForm: false };
});
}
@ -1040,37 +1040,6 @@ async function post(ev?: MouseEvent) {
});
}
async function handleSavingServerDraft(ev?: Event) {
const draftCount = await misskeyApi('notes/drafts/count');
const isOver = draftCount >= $i.policies.noteDraftLimit;
if (canSaveAsServerDraft.value && !isOver) {
return await saveServerDraft(true);
} else if (canSaveAsServerDraft.value) {
ev?.stopPropagation();
const { canceled, result } = await os.actions({
type: 'question',
title: i18n.ts._drafts.cannotCreateDraftAnymore,
text: i18n.ts._drafts.cannotCreateDraftAnymoreDescription,
actions: [{
value: 'discard' as const,
text: i18n.ts.dontSave,
}, {
value: 'cancel' as const,
text: i18n.ts.cancel,
}],
});
if (canceled || result === 'cancel') {
return { canClosePostForm: false };
} else {
return { canClosePostForm: true };
}
} else {
return { canClosePostForm: true };
}
}
function cancel() {
emit('cancel');
}
@ -1182,6 +1151,7 @@ function getNoteDraftDialog(): Promise<Misskey.entities.NoteDraft | null> {
function showDraftMenu(ev: MouseEvent) {
function showDraftSelectDialog() {
draftSelectorOpening.value = true;
getNoteDraftDialog().then(draft => {
if (draft == null) return;
@ -1226,6 +1196,8 @@ function showDraftMenu(ev: MouseEvent) {
});
serverDraftId.value = draft.id;
}).then(() => {
draftSelectorOpening.value = false;
});
}
@ -1234,6 +1206,12 @@ function showDraftMenu(ev: MouseEvent) {
text: i18n.ts._drafts.save,
icon: 'ti ti-cloud-upload',
action: async () => {
if (!canSaveAsServerDraft.value) {
return os.alert({
type: 'error',
text: i18n.ts._drafts.cannotCreateDraftOfRenote,
});
}
saveServerDraft();
},
}, {
@ -1324,6 +1302,9 @@ async function canClose() {
});
if (canceled) return false;
}
if (draftSelectorOpening.value) {
return false;
}
return true;
}