diff --git a/locales/index.d.ts b/locales/index.d.ts
index 63bcb16e41..23eb3ec419 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -595,7 +595,6 @@ export interface Locale {
"poll": string;
"schedulePost": string;
"useCw": string;
- "schedulePostList": string;
"enablePlayer": string;
"disablePlayer": string;
"expandTweet": string;
@@ -2469,6 +2468,13 @@ export interface Locale {
};
};
};
+ "_schedulePost": {
+ "list": string;
+ "postDate": string;
+ "postTime": string;
+ "localTime": string;
+ "addSchedule": string;
+ };
}
declare const locales: {
[lang: string]: Locale;
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index be378180dc..69c834d11d 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -592,7 +592,6 @@ visibility: "公開範囲"
poll: "アンケート"
schedulePost: "予約投稿"
useCw: "内容を隠す"
-schedulePostList: "予約投稿一覧"
enablePlayer: "プレイヤーを開く"
disablePlayer: "プレイヤーを閉じる"
expandTweet: "ポストを展開する"
@@ -2356,3 +2355,10 @@ _externalResourceInstaller:
_themeInstallFailed:
title: "テーマのインストールに失敗しました"
description: "テーマのインストール中に問題が発生しました。もう一度お試しください。エラーの詳細はJavascriptコンソールをご覧ください。"
+
+_schedulePost:
+ list: "予約投稿一覧"
+ postDate: "日付"
+ postTime: "時刻"
+ localTime: "端末に設定されているタイムゾーンの時刻で投稿されます。"
+ addSchedule: "予約設定"
diff --git a/packages/frontend/src/components/MkMenu.vue b/packages/frontend/src/components/MkMenu.vue
index 9457bf385f..6ed2fa6d25 100644
--- a/packages/frontend/src/components/MkMenu.vue
+++ b/packages/frontend/src/components/MkMenu.vue
@@ -421,9 +421,9 @@ onBeforeUnmount(() => {
.indicator {
position: absolute;
top: 5px;
- left: 13px;
+ right: 18px;
color: var(--indicator);
- font-size: 12px;
+ font-size: 8px;
animation: blink 1s infinite;
}
diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue
index 4fa145c924..bebaf36a17 100644
--- a/packages/frontend/src/components/MkPostForm.vue
+++ b/packages/frontend/src/components/MkPostForm.vue
@@ -19,8 +19,6 @@ SPDX-License-Identifier: AGPL-3.0-only
-
-
-
+
@@ -242,7 +236,9 @@ const submitText = $computed((): string => {
? i18n.ts.quote
: props.reply
? i18n.ts.reply
- : i18n.ts.note;
+ : schedule
+ ? i18n.ts._schedulePost.addSchedule
+ : i18n.ts.note;
});
const textLength = $computed((): number => {
@@ -753,7 +749,7 @@ async function post(ev?: MouseEvent) {
replyId: props.reply ? props.reply.id : undefined,
renoteId: props.renote ? props.renote.id : quoteId ? quoteId : undefined,
channelId: props.channel ? props.channel.id : undefined,
- schedule: schedule,
+ schedule,
poll: poll,
cw: useCw ? cw ?? '' : null,
localOnly: localOnly,
@@ -778,6 +774,10 @@ async function post(ev?: MouseEvent) {
}
}
+ if (postData.schedule?.expiresAt && typeof postData.schedule.expiresAt === 'string') {
+ postData.schedule.expiresAt = parseInt(postData.schedule.expiresAt);
+ }
+
let token = undefined;
if (postAccount) {
@@ -902,6 +902,45 @@ function openAccountMenu(ev: MouseEvent) {
}, ev);
}
+function openOtherSettingsMenu(ev: MouseEvent) {
+ let reactionAcceptanceIcon: string;
+ switch (reactionAcceptance) {
+ case 'likeOnly':
+ reactionAcceptanceIcon = 'ti ti-heart';
+ break;
+ case 'likeOnlyForRemote':
+ reactionAcceptanceIcon = 'ti ti-heart-plus';
+ break;
+ default:
+ reactionAcceptanceIcon = 'ti ti-icons';
+ break;
+ }
+
+ os.popupMenu([{
+ type: 'button',
+ text: i18n.ts.reactionAcceptance,
+ icon: reactionAcceptanceIcon,
+ action: toggleReactionAcceptance,
+ }, {
+ type: 'button',
+ text: i18n.ts.schedulePost,
+ icon: 'ti ti-calendar-time',
+ indicate: (schedule != null),
+ action: toggleSchedule,
+ }, null, {
+ type: 'button',
+ text: i18n.ts._schedulePost.list,
+ icon: 'ti ti-calendar-event',
+ action: () => {
+ // 投稿フォームが二重に出ないようにとじておく
+ emit('cancel');
+ listSchedulePost();
+ },
+ }], ev.currentTarget ?? ev.target, {
+ align: 'right',
+ });
+}
+
onMounted(() => {
if (props.autofocus) {
focus();
diff --git a/packages/frontend/src/components/MkScheduleEditor.vue b/packages/frontend/src/components/MkScheduleEditor.vue
index f6c1bdde46..d53451f5bb 100644
--- a/packages/frontend/src/components/MkScheduleEditor.vue
+++ b/packages/frontend/src/components/MkScheduleEditor.vue
@@ -5,12 +5,13 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
- {{ i18n.ts._poll.deadlineDate }}
+ {{ i18n.ts._schedulePost.postDate }}
- {{ i18n.ts._poll.deadlineTime }}
+ {{ i18n.ts._schedulePost.postTime }}
+ {{ i18n.ts._schedulePost.localTime }}
@@ -53,6 +54,6 @@ function get() {
}
watch([atDate, atTime], () => emit('update:modelValue', get()), {
- deep: true,
+ immediate: true,
});
diff --git a/packages/frontend/src/components/MkSchedulePostListDialog.vue b/packages/frontend/src/components/MkSchedulePostListDialog.vue
index caa84d862f..cf5a4f4d31 100644
--- a/packages/frontend/src/components/MkSchedulePostListDialog.vue
+++ b/packages/frontend/src/components/MkSchedulePostListDialog.vue
@@ -11,7 +11,7 @@ SPDX-License-Identifier: AGPL-3.0-only
@close="cancel()"
@closed="$emit('closed')"
>
- 予約投稿一覧
+ {{ i18n.ts._schedulePost.list }}
@@ -26,7 +26,8 @@ import * as Misskey from 'misskey-js';
import MkModalWindow from '@/components/MkModalWindow.vue';
import * as os from '@/os.js';
import MkNoteSimple from '@/components/MkNoteSimple.vue';
-import MkSignin from '@/components/MkSignin.vue';
+import { i18n } from '@/i18n.js';
+
const emit = defineEmits<{
(ev: 'ok', selected: Misskey.entities.UserDetailed): void;
(ev: 'cancel'): void;