常にサーバー下書きに保存し、上限を超えた場合のみ尋ねるように
This commit is contained in:
parent
6bd0d89ef9
commit
2f7cfde739
|
@ -11916,13 +11916,13 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"select": string;
|
"select": string;
|
||||||
/**
|
/**
|
||||||
* サーバーに下書きを保存しますか?
|
* 下書きの作成可能数を超えています。
|
||||||
*/
|
*/
|
||||||
"saveConfirm": string;
|
"cannotCreateDraftAnymore": string;
|
||||||
/**
|
/**
|
||||||
* ここで「保存しない」を選択しても、下書きは端末内に保存されます。
|
* サーバーに下書きを保存するには、下書きを削除する必要があります。ここで「保存しない」を選択しても、下書きは端末内に保存されます。
|
||||||
*/
|
*/
|
||||||
"saveConfirmDescription": string;
|
"cannotCreateDraftAnymoreDescription": string;
|
||||||
/**
|
/**
|
||||||
* 下書きを削除
|
* 下書きを削除
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -3187,8 +3187,8 @@ _serverSetupWizard:
|
||||||
|
|
||||||
_drafts:
|
_drafts:
|
||||||
select: "下書きを選択"
|
select: "下書きを選択"
|
||||||
saveConfirm: "サーバーに下書きを保存しますか?"
|
cannotCreateDraftAnymore: "下書きの作成可能数を超えています。"
|
||||||
saveConfirmDescription: "ここで「保存しない」を選択しても、下書きは端末内に保存されます。"
|
cannotCreateDraftAnymoreDescription: "サーバーに下書きを保存するには、下書きを削除する必要があります。ここで「保存しない」を選択しても、下書きは端末内に保存されます。"
|
||||||
delete: "下書きを削除"
|
delete: "下書きを削除"
|
||||||
deleteAreYouSure: "下書きを削除しますか?"
|
deleteAreYouSure: "下書きを削除しますか?"
|
||||||
noDrafts: "下書きはありません"
|
noDrafts: "下書きはありません"
|
||||||
|
|
|
@ -310,6 +310,7 @@ export * as 'notes/drafts' from './endpoints/notes/drafts/list.js';
|
||||||
export * as 'notes/drafts/create' from './endpoints/notes/drafts/create.js';
|
export * as 'notes/drafts/create' from './endpoints/notes/drafts/create.js';
|
||||||
export * as 'notes/drafts/delete' from './endpoints/notes/drafts/delete.js';
|
export * as 'notes/drafts/delete' from './endpoints/notes/drafts/delete.js';
|
||||||
export * as 'notes/drafts/update' from './endpoints/notes/drafts/update.js';
|
export * as 'notes/drafts/update' from './endpoints/notes/drafts/update.js';
|
||||||
|
export * as 'notes/drafts/count' from './endpoints/notes/drafts/count.js';
|
||||||
export * as 'notes/favorites/create' from './endpoints/notes/favorites/create.js';
|
export * as 'notes/favorites/create' from './endpoints/notes/favorites/create.js';
|
||||||
export * as 'notes/favorites/delete' from './endpoints/notes/favorites/delete.js';
|
export * as 'notes/favorites/delete' from './endpoints/notes/favorites/delete.js';
|
||||||
export * as 'notes/featured' from './endpoints/notes/featured.js';
|
export * as 'notes/featured' from './endpoints/notes/featured.js';
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
|
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||||
|
import type { NoteDraftsRepository } from '@/models/_.js';
|
||||||
|
import { DI } from '@/di-symbols.js';
|
||||||
|
|
||||||
|
export const meta = {
|
||||||
|
tags: ['notes', 'drafts'],
|
||||||
|
|
||||||
|
requireCredential: true,
|
||||||
|
|
||||||
|
prohibitMoved: true,
|
||||||
|
|
||||||
|
kind: 'read:account',
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'number',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
description: 'The number of drafts',
|
||||||
|
},
|
||||||
|
|
||||||
|
errors: {
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export const paramDef = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
},
|
||||||
|
required: [],
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
|
||||||
|
constructor(
|
||||||
|
@Inject(DI.noteDraftsRepository)
|
||||||
|
private noteDraftsRepository: NoteDraftsRepository,
|
||||||
|
) {
|
||||||
|
super(meta, paramDef, async (ps, me) => {
|
||||||
|
const count = await this.noteDraftsRepository.createQueryBuilder('drafts')
|
||||||
|
.where('drafts.userId = :meId', { meId: me.id })
|
||||||
|
.getCount();
|
||||||
|
|
||||||
|
return count;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -996,19 +996,19 @@ async function post(ev?: MouseEvent) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function confirmSavingServerDraft(ev?: Event) {
|
async function handleSavingServerDraft(ev?: Event) {
|
||||||
if (canSaveAsServerDraft.value) {
|
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();
|
ev?.stopPropagation();
|
||||||
|
|
||||||
const { canceled, result } = await os.actions({
|
const { canceled, result } = await os.actions({
|
||||||
type: 'question',
|
type: 'question',
|
||||||
title: i18n.ts._drafts.saveConfirm,
|
title: i18n.ts._drafts.cannotCreateDraftAnymore,
|
||||||
text: i18n.ts._drafts.saveConfirmDescription,
|
text: i18n.ts._drafts.cannotCreateDraftAnymoreDescription,
|
||||||
actions: [{
|
actions: [{
|
||||||
value: 'save' as const,
|
|
||||||
text: i18n.ts.save,
|
|
||||||
primary: true,
|
|
||||||
}, {
|
|
||||||
value: 'discard' as const,
|
value: 'discard' as const,
|
||||||
text: i18n.ts.dontSave,
|
text: i18n.ts.dontSave,
|
||||||
}, {
|
}, {
|
||||||
|
@ -1019,8 +1019,6 @@ async function confirmSavingServerDraft(ev?: Event) {
|
||||||
|
|
||||||
if (canceled || result === 'cancel') {
|
if (canceled || result === 'cancel') {
|
||||||
return { canClosePostForm: false };
|
return { canClosePostForm: false };
|
||||||
} else if (result === 'save') {
|
|
||||||
return await saveServerDraft(true);
|
|
||||||
} else {
|
} else {
|
||||||
return { canClosePostForm: true };
|
return { canClosePostForm: true };
|
||||||
}
|
}
|
||||||
|
@ -1030,14 +1028,14 @@ async function confirmSavingServerDraft(ev?: Event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function esc(ev: Event) {
|
async function esc(ev: Event) {
|
||||||
const { canClosePostForm } = await confirmSavingServerDraft(ev);
|
const { canClosePostForm } = await handleSavingServerDraft(ev);
|
||||||
if (canClosePostForm) {
|
if (canClosePostForm) {
|
||||||
emit('esc');
|
emit('esc');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cancel() {
|
async function cancel() {
|
||||||
const { canClosePostForm } = await confirmSavingServerDraft();
|
const { canClosePostForm } = await handleSavingServerDraft();
|
||||||
if (canClosePostForm) {
|
if (canClosePostForm) {
|
||||||
emit('cancel');
|
emit('cancel');
|
||||||
}
|
}
|
||||||
|
|
|
@ -1935,6 +1935,7 @@ declare namespace entities {
|
||||||
NotesDeleteRequest,
|
NotesDeleteRequest,
|
||||||
NotesDraftsRequest,
|
NotesDraftsRequest,
|
||||||
NotesDraftsResponse,
|
NotesDraftsResponse,
|
||||||
|
NotesDraftsCountResponse,
|
||||||
NotesDraftsCreateRequest,
|
NotesDraftsCreateRequest,
|
||||||
NotesDraftsCreateResponse,
|
NotesDraftsCreateResponse,
|
||||||
NotesDraftsDeleteRequest,
|
NotesDraftsDeleteRequest,
|
||||||
|
@ -2984,6 +2985,9 @@ type NotesCreateResponse = operations['notes___create']['responses']['200']['con
|
||||||
// @public (undocumented)
|
// @public (undocumented)
|
||||||
type NotesDeleteRequest = operations['notes___delete']['requestBody']['content']['application/json'];
|
type NotesDeleteRequest = operations['notes___delete']['requestBody']['content']['application/json'];
|
||||||
|
|
||||||
|
// @public (undocumented)
|
||||||
|
type NotesDraftsCountResponse = operations['notes___drafts___count']['responses']['200']['content']['application/json'];
|
||||||
|
|
||||||
// @public (undocumented)
|
// @public (undocumented)
|
||||||
type NotesDraftsCreateRequest = operations['notes___drafts___create']['requestBody']['content']['application/json'];
|
type NotesDraftsCreateRequest = operations['notes___drafts___create']['requestBody']['content']['application/json'];
|
||||||
|
|
||||||
|
|
|
@ -3582,6 +3582,17 @@ declare module '../api.js' {
|
||||||
credential?: string | null,
|
credential?: string | null,
|
||||||
): Promise<SwitchCaseResponseType<E, P>>;
|
): Promise<SwitchCaseResponseType<E, P>>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No description provided.
|
||||||
|
*
|
||||||
|
* **Credential required**: *Yes* / **Permission**: *read:account*
|
||||||
|
*/
|
||||||
|
request<E extends 'notes/drafts/count', P extends Endpoints[E]['req']>(
|
||||||
|
endpoint: E,
|
||||||
|
params: P,
|
||||||
|
credential?: string | null,
|
||||||
|
): Promise<SwitchCaseResponseType<E, P>>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* No description provided.
|
* No description provided.
|
||||||
*
|
*
|
||||||
|
|
|
@ -485,6 +485,7 @@ import type {
|
||||||
NotesDeleteRequest,
|
NotesDeleteRequest,
|
||||||
NotesDraftsRequest,
|
NotesDraftsRequest,
|
||||||
NotesDraftsResponse,
|
NotesDraftsResponse,
|
||||||
|
NotesDraftsCountResponse,
|
||||||
NotesDraftsCreateRequest,
|
NotesDraftsCreateRequest,
|
||||||
NotesDraftsCreateResponse,
|
NotesDraftsCreateResponse,
|
||||||
NotesDraftsDeleteRequest,
|
NotesDraftsDeleteRequest,
|
||||||
|
@ -964,6 +965,7 @@ export type Endpoints = {
|
||||||
'notes/create': { req: NotesCreateRequest; res: NotesCreateResponse };
|
'notes/create': { req: NotesCreateRequest; res: NotesCreateResponse };
|
||||||
'notes/delete': { req: NotesDeleteRequest; res: EmptyResponse };
|
'notes/delete': { req: NotesDeleteRequest; res: EmptyResponse };
|
||||||
'notes/drafts': { req: NotesDraftsRequest; res: NotesDraftsResponse };
|
'notes/drafts': { req: NotesDraftsRequest; res: NotesDraftsResponse };
|
||||||
|
'notes/drafts/count': { req: EmptyRequest; res: NotesDraftsCountResponse };
|
||||||
'notes/drafts/create': { req: NotesDraftsCreateRequest; res: NotesDraftsCreateResponse };
|
'notes/drafts/create': { req: NotesDraftsCreateRequest; res: NotesDraftsCreateResponse };
|
||||||
'notes/drafts/delete': { req: NotesDraftsDeleteRequest; res: EmptyResponse };
|
'notes/drafts/delete': { req: NotesDraftsDeleteRequest; res: EmptyResponse };
|
||||||
'notes/drafts/update': { req: NotesDraftsUpdateRequest; res: NotesDraftsUpdateResponse };
|
'notes/drafts/update': { req: NotesDraftsUpdateRequest; res: NotesDraftsUpdateResponse };
|
||||||
|
|
|
@ -488,6 +488,7 @@ export type NotesCreateResponse = operations['notes___create']['responses']['200
|
||||||
export type NotesDeleteRequest = operations['notes___delete']['requestBody']['content']['application/json'];
|
export type NotesDeleteRequest = operations['notes___delete']['requestBody']['content']['application/json'];
|
||||||
export type NotesDraftsRequest = operations['notes___drafts']['requestBody']['content']['application/json'];
|
export type NotesDraftsRequest = operations['notes___drafts']['requestBody']['content']['application/json'];
|
||||||
export type NotesDraftsResponse = operations['notes___drafts']['responses']['200']['content']['application/json'];
|
export type NotesDraftsResponse = operations['notes___drafts']['responses']['200']['content']['application/json'];
|
||||||
|
export type NotesDraftsCountResponse = operations['notes___drafts___count']['responses']['200']['content']['application/json'];
|
||||||
export type NotesDraftsCreateRequest = operations['notes___drafts___create']['requestBody']['content']['application/json'];
|
export type NotesDraftsCreateRequest = operations['notes___drafts___create']['requestBody']['content']['application/json'];
|
||||||
export type NotesDraftsCreateResponse = operations['notes___drafts___create']['responses']['200']['content']['application/json'];
|
export type NotesDraftsCreateResponse = operations['notes___drafts___create']['responses']['200']['content']['application/json'];
|
||||||
export type NotesDraftsDeleteRequest = operations['notes___drafts___delete']['requestBody']['content']['application/json'];
|
export type NotesDraftsDeleteRequest = operations['notes___drafts___delete']['requestBody']['content']['application/json'];
|
||||||
|
|
|
@ -3089,6 +3089,15 @@ export type paths = {
|
||||||
*/
|
*/
|
||||||
post: operations['notes___drafts'];
|
post: operations['notes___drafts'];
|
||||||
};
|
};
|
||||||
|
'/notes/drafts/count': {
|
||||||
|
/**
|
||||||
|
* notes/drafts/count
|
||||||
|
* @description No description provided.
|
||||||
|
*
|
||||||
|
* **Credential required**: *Yes* / **Permission**: *read:account*
|
||||||
|
*/
|
||||||
|
post: operations['notes___drafts___count'];
|
||||||
|
};
|
||||||
'/notes/drafts/create': {
|
'/notes/drafts/create': {
|
||||||
/**
|
/**
|
||||||
* notes/drafts/create
|
* notes/drafts/create
|
||||||
|
@ -24874,6 +24883,52 @@ export type operations = {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* notes/drafts/count
|
||||||
|
* @description No description provided.
|
||||||
|
*
|
||||||
|
* **Credential required**: *Yes* / **Permission**: *read:account*
|
||||||
|
*/
|
||||||
|
notes___drafts___count: {
|
||||||
|
responses: {
|
||||||
|
/** @description OK (with results) */
|
||||||
|
200: {
|
||||||
|
content: {
|
||||||
|
'application/json': number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/** @description Client error */
|
||||||
|
400: {
|
||||||
|
content: {
|
||||||
|
'application/json': components['schemas']['Error'];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/** @description Authentication error */
|
||||||
|
401: {
|
||||||
|
content: {
|
||||||
|
'application/json': components['schemas']['Error'];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/** @description Forbidden error */
|
||||||
|
403: {
|
||||||
|
content: {
|
||||||
|
'application/json': components['schemas']['Error'];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/** @description I'm Ai */
|
||||||
|
418: {
|
||||||
|
content: {
|
||||||
|
'application/json': components['schemas']['Error'];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/** @description Internal server error */
|
||||||
|
500: {
|
||||||
|
content: {
|
||||||
|
'application/json': components['schemas']['Error'];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
/**
|
/**
|
||||||
* notes/drafts/create
|
* notes/drafts/create
|
||||||
* @description No description provided.
|
* @description No description provided.
|
||||||
|
|
Loading…
Reference in New Issue