Compare commits
3 Commits
8cc64dc544
...
a6bc5ef0fa
Author | SHA1 | Date |
---|---|---|
|
a6bc5ef0fa | |
|
a48dbcb188 | |
|
b20229945a |
|
@ -166,10 +166,6 @@ export interface Locale extends ILocale {
|
||||||
* 保存
|
* 保存
|
||||||
*/
|
*/
|
||||||
"save": string;
|
"save": string;
|
||||||
/**
|
|
||||||
* 保存しない
|
|
||||||
*/
|
|
||||||
"dontSave": string;
|
|
||||||
/**
|
/**
|
||||||
* ユーザー
|
* ユーザー
|
||||||
*/
|
*/
|
||||||
|
@ -12252,9 +12248,9 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"cannotCreateDraftAnymore": string;
|
"cannotCreateDraftAnymore": string;
|
||||||
/**
|
/**
|
||||||
* サーバーに下書きを保存するには、下書きを削除する必要があります。ここで「保存しない」を選択しても、下書きは端末内に保存されます。
|
* リノートの下書きは作成できません。
|
||||||
*/
|
*/
|
||||||
"cannotCreateDraftAnymoreDescription": string;
|
"cannotCreateDraftOfRenote": string;
|
||||||
/**
|
/**
|
||||||
* 下書きを削除
|
* 下書きを削除
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -37,7 +37,6 @@ logout: "ログアウト"
|
||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
uploading: "アップロード中"
|
uploading: "アップロード中"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
dontSave: "保存しない"
|
|
||||||
users: "ユーザー"
|
users: "ユーザー"
|
||||||
addUser: "ユーザーを追加"
|
addUser: "ユーザーを追加"
|
||||||
favorite: "お気に入り"
|
favorite: "お気に入り"
|
||||||
|
@ -3282,7 +3281,7 @@ _imageEffector:
|
||||||
_drafts:
|
_drafts:
|
||||||
select: "下書きを選択"
|
select: "下書きを選択"
|
||||||
cannotCreateDraftAnymore: "下書きの作成可能数を超えています。"
|
cannotCreateDraftAnymore: "下書きの作成可能数を超えています。"
|
||||||
cannotCreateDraftAnymoreDescription: "サーバーに下書きを保存するには、下書きを削除する必要があります。ここで「保存しない」を選択しても、下書きは端末内に保存されます。"
|
cannotCreateDraftOfRenote: "リノートの下書きは作成できません。"
|
||||||
delete: "下書きを削除"
|
delete: "下書きを削除"
|
||||||
deleteAreYouSure: "下書きを削除しますか?"
|
deleteAreYouSure: "下書きを削除しますか?"
|
||||||
noDrafts: "下書きはありません"
|
noDrafts: "下書きはありません"
|
||||||
|
|
|
@ -90,7 +90,7 @@ const emit = defineEmits<{
|
||||||
(ev: 'opening'): void;
|
(ev: 'opening'): void;
|
||||||
(ev: 'opened'): void;
|
(ev: 'opened'): void;
|
||||||
(ev: 'click'): void;
|
(ev: 'click'): void;
|
||||||
(ev: 'esc', event: KeyboardEvent): void;
|
(ev: 'esc'): void;
|
||||||
(ev: 'close'): void;
|
(ev: 'close'): void;
|
||||||
(ev: 'closed'): void;
|
(ev: 'closed'): void;
|
||||||
}>();
|
}>();
|
||||||
|
@ -166,7 +166,7 @@ if (type.value === 'drawer') {
|
||||||
const keymap = {
|
const keymap = {
|
||||||
'esc': {
|
'esc': {
|
||||||
allowRepeat: true,
|
allowRepeat: true,
|
||||||
callback: (ev) => emit('esc', ev),
|
callback: () => emit('esc'),
|
||||||
},
|
},
|
||||||
} as const satisfies Keymap;
|
} as const satisfies Keymap;
|
||||||
|
|
||||||
|
|
|
@ -14,10 +14,12 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
@close="cancel()"
|
@close="cancel()"
|
||||||
@ok="ok()"
|
@ok="ok()"
|
||||||
@closed="emit('closed')"
|
@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">
|
<div :class="$style.drafts" class="_gaps">
|
||||||
<!-- TODO: 下書きの保存可能数の残り表示 -->
|
|
||||||
<MkPagination ref="pagingEl" :pagination="paging">
|
<MkPagination ref="pagingEl" :pagination="paging">
|
||||||
<template #empty>
|
<template #empty>
|
||||||
<MkResult type="empty" :text="i18n.ts._drafts.noDrafts"/>
|
<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 { getNoteSummary } from '@/utility/get-note-summary.js';
|
||||||
import { i18n } from '@/i18n.js';
|
import { i18n } from '@/i18n.js';
|
||||||
import * as os from '@/os.js';
|
import * as os from '@/os.js';
|
||||||
|
import { $i } from '@/i.js';
|
||||||
|
import { misskeyApi } from '@/utility/misskey-api';
|
||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
(ev: 'ok', selected: Misskey.entities.NoteDraft): void;
|
(ev: 'ok', selected: Misskey.entities.NoteDraft): void;
|
||||||
|
@ -112,6 +116,11 @@ const paging = {
|
||||||
|
|
||||||
const pagingComponent = useTemplateRef('pagingEl');
|
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 selected = ref<Misskey.entities.NoteDraft | null>(null);
|
||||||
const dialogEl = shallowRef<InstanceType<typeof MkModalWindow>>();
|
const dialogEl = shallowRef<InstanceType<typeof MkModalWindow>>();
|
||||||
|
|
||||||
|
|
|
@ -213,6 +213,7 @@ const targetChannel = shallowRef(props.channel);
|
||||||
|
|
||||||
const serverDraftId = ref<string | null>(null);
|
const serverDraftId = ref<string | null>(null);
|
||||||
const postFormActions = getPluginHandlers('post_form_action');
|
const postFormActions = getPluginHandlers('post_form_action');
|
||||||
|
const draftSelectorOpening = ref(false);
|
||||||
|
|
||||||
const uploader = useUploader({
|
const uploader = useUploader({
|
||||||
multiple: true,
|
multiple: true,
|
||||||
|
@ -301,6 +302,7 @@ const canPost = computed((): boolean => {
|
||||||
(!poll.value || poll.value.choices.length >= 2);
|
(!poll.value || poll.value.choices.length >= 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// cannot save pure renote as draft
|
||||||
const canSaveAsServerDraft = computed((): boolean => {
|
const canSaveAsServerDraft = computed((): boolean => {
|
||||||
return canPost.value && (textLength.value > 0 || files.value.length > 0 || poll.value != null);
|
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.
|
// justEndedComposition.value is for Safari, which keyDown occurs after compositionend.
|
||||||
// ev.isComposing is for another browsers.
|
// 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) {
|
function onKeyup(ev: KeyboardEvent) {
|
||||||
|
@ -824,7 +826,7 @@ function deleteDraft() {
|
||||||
miLocalStorage.setItem('drafts', JSON.stringify(draftData));
|
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', {
|
return await os.apiWithDialog(serverDraftId.value == null ? 'notes/drafts/create' : 'notes/drafts/update', {
|
||||||
...(serverDraftId.value == null ? {} : { draftId: serverDraftId.value }),
|
...(serverDraftId.value == null ? {} : { draftId: serverDraftId.value }),
|
||||||
text: text.value,
|
text: text.value,
|
||||||
|
@ -846,9 +848,7 @@ async function saveServerDraft(clearLocal = false): Promise<{ canClosePostForm:
|
||||||
clear();
|
clear();
|
||||||
deleteDraft();
|
deleteDraft();
|
||||||
}
|
}
|
||||||
return { canClosePostForm: true };
|
|
||||||
}).catch((err) => {
|
}).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() {
|
function cancel() {
|
||||||
emit('cancel');
|
emit('cancel');
|
||||||
}
|
}
|
||||||
|
@ -1182,6 +1151,7 @@ function getNoteDraftDialog(): Promise<Misskey.entities.NoteDraft | null> {
|
||||||
|
|
||||||
function showDraftMenu(ev: MouseEvent) {
|
function showDraftMenu(ev: MouseEvent) {
|
||||||
function showDraftSelectDialog() {
|
function showDraftSelectDialog() {
|
||||||
|
draftSelectorOpening.value = true;
|
||||||
getNoteDraftDialog().then(draft => {
|
getNoteDraftDialog().then(draft => {
|
||||||
if (draft == null) return;
|
if (draft == null) return;
|
||||||
|
|
||||||
|
@ -1226,6 +1196,8 @@ function showDraftMenu(ev: MouseEvent) {
|
||||||
});
|
});
|
||||||
|
|
||||||
serverDraftId.value = draft.id;
|
serverDraftId.value = draft.id;
|
||||||
|
}).then(() => {
|
||||||
|
draftSelectorOpening.value = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1234,6 +1206,12 @@ function showDraftMenu(ev: MouseEvent) {
|
||||||
text: i18n.ts._drafts.save,
|
text: i18n.ts._drafts.save,
|
||||||
icon: 'ti ti-cloud-upload',
|
icon: 'ti ti-cloud-upload',
|
||||||
action: async () => {
|
action: async () => {
|
||||||
|
if (!canSaveAsServerDraft.value) {
|
||||||
|
return os.alert({
|
||||||
|
type: 'error',
|
||||||
|
text: i18n.ts._drafts.cannotCreateDraftOfRenote,
|
||||||
|
});
|
||||||
|
}
|
||||||
saveServerDraft();
|
saveServerDraft();
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
|
@ -1324,6 +1302,9 @@ async function canClose() {
|
||||||
});
|
});
|
||||||
if (canceled) return false;
|
if (canceled) return false;
|
||||||
}
|
}
|
||||||
|
if (draftSelectorOpening.value) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue