Compare commits

...

10 Commits

Author SHA1 Message Date
Copilot ae8861cca6
Merge 7805a7bd35 into fe38115883 2025-10-06 17:59:32 +00:00
syuilo fe38115883 lint 2025-10-06 20:01:19 +09:00
syuilo 6fba73ca13 Update pnpm-lock.yaml 2025-10-06 19:21:21 +09:00
syuilo 0d33e1f839 fix notes\drafts\create param defs 2025-10-06 19:21:17 +09:00
syuilo 74f33157a3
New Crowdin updates (#16601)
* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Turkish)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (French)

* New translations ja-jp.yml (Arabic)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Czech)

* New translations ja-jp.yml (German)

* New translations ja-jp.yml (Greek)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Polish)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Slovak)

* New translations ja-jp.yml (Ukrainian)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Vietnamese)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Bengali)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Japanese, Kansai)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Catalan)
2025-10-06 15:39:18 +09:00
copilot-swe-agent[bot] 7805a7bd35 Add variable extraction for folder hash consistency
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-09-16 23:29:32 +00:00
copilot-swe-agent[bot] 5393045dfd Fix function declaration style for popstateHandler
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-09-16 23:27:29 +00:00
copilot-swe-agent[bot] fb864ecd6c Refine browser back button implementation using hash-based approach
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-09-16 03:46:10 +00:00
copilot-swe-agent[bot] a1c93d9b25 Implement browser back button support for FolderPageView
Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com>
2025-09-16 03:43:53 +00:00
copilot-swe-agent[bot] 384eebf3d1 Initial plan 2025-09-16 03:39:00 +00:00
28 changed files with 303 additions and 680 deletions

View File

@ -1010,6 +1010,7 @@ postForm: "أنشئ ملاحظة"
information: "عن"
inMinutes: "د"
inDays: "ي"
widgets: "التطبيقات المُصغّرة"
_chat:
invitations: "دعوة"
noHistory: "السجل فارغ"

View File

@ -850,6 +850,7 @@ postForm: "নোট লিখুন"
information: "আপনার সম্পর্কে"
inMinutes: "মিনিট"
inDays: "দিন"
widgets: "উইজেটগুলি"
_chat:
invitations: "আমন্ত্রণ"
noHistory: "কোনো ইতিহাস নেই"

View File

@ -334,6 +334,7 @@ fileName: "Nom del Fitxer"
selectFile: "Selecciona un fitxer"
selectFiles: "Selecciona fitxers"
selectFolder: "Selecció de carpeta"
unselectFolder: "Deixa de seleccionar la carpeta"
selectFolders: "Selecció de carpetes"
fileNotSelected: "Cap fitxer seleccionat"
renameFile: "Canvia el nom del fitxer"
@ -346,6 +347,7 @@ addFile: "Afegeix un fitxer"
showFile: "Mostrar fitxer"
emptyDrive: "El teu Disc és buit"
emptyFolder: "La carpeta està buida"
dropHereToUpload: "Arrossega els arxius fins aquí per pujar-los al servidor"
unableToDelete: "No es pot eliminar"
inputNewFileName: "Introduïu el nom de fitxer nou"
inputNewDescription: "Escriu el peu de foto."
@ -1389,6 +1391,9 @@ scheduleToPostOnX: "Programar una nota per {x}"
scheduledToPostOnX: "S'ha programat la nota per {x}"
schedule: "Programa"
scheduled: "Programat"
widgets: "Ginys"
deviceInfo: "Informació del dispositiu"
deviceInfoDescription: "En fer consultes tècniques influir la següent informació pot ajudar a resoldre'l més ràpidament."
_compression:
_quality:
high: "Qualitat alta"
@ -2431,6 +2436,7 @@ _auth:
scopeUser: "Opera com si fossis aquest usuari"
pleaseLogin: "Si us plau, identificat per autoritzar l'aplicació."
byClickingYouWillBeRedirectedToThisUrl: "Si es garanteix l'accés, seràs redirigit automàticament a la següent adreça URL"
alreadyAuthorized: "Aquesta aplicació ja té accés."
_antennaSources:
all: "Totes les publicacions"
homeTimeline: "Publicacions dels usuaris seguits"
@ -2697,6 +2703,8 @@ _notification:
quote: "Citar"
reaction: "Reaccions"
pollEnded: "Enquesta terminada"
scheduledNotePosted: "Nota programada amb èxit "
scheduledNotePostFailed: "Ha fallat la programació de la nota"
receiveFollowRequest: "Rebuda una petició de seguiment"
followRequestAccepted: "Petició de seguiment acceptada"
roleAssigned: "Rol donat"

View File

@ -1109,6 +1109,7 @@ postForm: "Formulář pro odeslání"
information: "Informace"
inMinutes: "Minut"
inDays: "Dnů"
widgets: "Widgety"
_chat:
invitations: "Pozvat"
noHistory: "Žádná historie"

View File

@ -1370,6 +1370,7 @@ defaultImageCompressionLevel: "Standard-Bildkomprimierungsstufe"
defaultImageCompressionLevel_description: "Ein niedrigerer Wert erhält die Bildqualität, erhöht aber die Dateigröße. <br>Höhere Werte reduzieren die Dateigröße, verringern aber die Bildqualität."
inMinutes: "Minute(n)"
inDays: "Tag(en)"
widgets: "Widgets"
_order:
newest: "Neueste zuerst"
oldest: "Älteste zuerst"

View File

@ -288,6 +288,7 @@ replies: "Απάντηση"
renotes: "Κοινοποίηση σημειώματος"
postForm: "Φόρμα δημοσίευσης"
information: "Πληροφορίες"
widgets: "Μαραφέτια"
_chat:
members: "Μέλη"
home: "Κεντρικό"

View File

@ -1389,6 +1389,7 @@ scheduleToPostOnX: "Scheduled to note on {x}"
scheduledToPostOnX: "Note is scheduled for {x}"
schedule: "Schedule"
scheduled: "Scheduled"
widgets: "Widgets"
_compression:
_quality:
high: "High quality"

View File

@ -1389,6 +1389,7 @@ scheduleToPostOnX: "Programar una nota para {x}"
scheduledToPostOnX: "La nota está programada para {x}."
schedule: "Programado"
scheduled: "Programado"
widgets: "Widgets"
_compression:
_quality:
high: "Calidad alta"

View File

@ -1273,6 +1273,7 @@ postForm: "Formulaire de publication"
information: "Informations"
inMinutes: "min"
inDays: "j"
widgets: "Widgets"
_chat:
invitations: "Inviter"
noHistory: "Pas d'historique"

View File

@ -1264,6 +1264,7 @@ postForm: "Buat catatan"
information: "Informasi"
inMinutes: "menit"
inDays: "hari"
widgets: "Widget"
_chat:
invitations: "Undang"
noHistory: "Tidak ada riwayat"

View File

@ -1389,6 +1389,7 @@ scheduleToPostOnX: "Pianificare la pubblicazione {x}"
scheduledToPostOnX: "Pubblicazione pianificata {x}"
schedule: "Pianificare"
scheduled: "Pianificata"
widgets: "Riquadri"
_compression:
_quality:
high: "Alta qualità"

View File

@ -1337,6 +1337,7 @@ safeModeEnabled: "セーフモードがオンになってるで"
pluginsAreDisabledBecauseSafeMode: "セーフモードがオンやから、プラグインは全部無効化されてるで。"
customCssIsDisabledBecauseSafeMode: "セーフモードがオンやから、カスタムCSSは適用されてへんで。"
themeIsDefaultBecauseSafeMode: "セーフモードがオンの間はデフォルトのテーマを使うで。セーフモードをオフにれば元に戻るで。"
widgets: "ウィジェット"
_chat:
noMessagesYet: "まだメッセージはあらへんで"
individualChat_description: "特定のユーザーと一対一でチャットができるで。"

View File

@ -1389,6 +1389,7 @@ scheduleToPostOnX: "{x}에 게시를 예약합니다."
scheduledToPostOnX: "{x}에 게시가 예약돼있습니다."
schedule: "예약"
scheduled: "예약"
widgets: "위젯"
_compression:
_quality:
high: "고품질"

View File

@ -1042,6 +1042,7 @@ postForm: "Formularz tworzenia wpisu"
information: "Informacje"
inMinutes: "minuta"
inDays: "dzień"
widgets: "Widżety"
_chat:
invitations: "Zaproś"
noHistory: "Brak historii"

View File

@ -1389,6 +1389,7 @@ scheduleToPostOnX: "Agendar nota para {x}"
scheduledToPostOnX: "A nota está agendada para {x}"
schedule: "Agendar"
scheduled: "Agendado"
widgets: "Widgets"
_compression:
_quality:
high: "Qualidade alta"

View File

@ -1277,6 +1277,7 @@ textCount: "Количество символов"
information: "Описание"
inMinutes: "мин"
inDays: "сут"
widgets: "Виджеты"
_chat:
invitations: "Пригласить"
noHistory: "История пока пуста"

View File

@ -915,6 +915,7 @@ postForm: "Napísať poznámku"
information: "Informácie"
inMinutes: "min"
inDays: "dní"
widgets: "Widgety"
_chat:
invitations: "Pozvať"
noHistory: "Žiadna história"

View File

@ -1389,6 +1389,7 @@ scheduleToPostOnX: "กำหนดเวลาให้โพสต์ไว้
scheduledToPostOnX: "มีการกำหนดเวลาให้โพสต์ไว้ที่ {x}"
schedule: "กำหนดเวลา"
scheduled: "กำหนดเวลา"
widgets: "วิดเจ็ต"
_compression:
_quality:
high: "คุณภาพสูง"

View File

@ -1378,6 +1378,7 @@ pluginsAreDisabledBecauseSafeMode: "Güvenli mod etkinleştirildiği için tüm
customCssIsDisabledBecauseSafeMode: "Güvenli mod etkin olduğu için özel CSS uygulanmıyor."
themeIsDefaultBecauseSafeMode: "Güvenli mod etkinken, varsayılan tema kullanılır. Güvenli modu devre dışı bırakmak bu değişiklikleri geri alır."
thankYouForTestingBeta: "Beta sürümünü test ettiğin için teşekkür ederiz!"
widgets: "Widget'lar"
_order:
newest: "Önce yeni"
oldest: "Önce eski"

View File

@ -921,6 +921,7 @@ postForm: "Створення нотатки"
information: "Інформація"
inMinutes: "х"
inDays: "д"
widgets: "Віджети"
_chat:
invitations: "Запросити"
noHistory: "Історія порожня"

View File

@ -1222,6 +1222,7 @@ migrateOldSettings: "Di chuyển cài đặt cũ"
migrateOldSettings_description: "Thông thường, quá trình này diễn ra tự động, nhưng nếu vì lý do nào đó mà quá trình di chuyển không thành công, bạn có thể kích hoạt thủ công quy trình di chuyển, quá trình này sẽ ghi đè lên thông tin cấu hình hiện tại của bạn."
inMinutes: "phút"
inDays: "ngày"
widgets: "Tiện ích"
_chat:
invitations: "Mời"
noHistory: "Không có dữ liệu"

View File

@ -56,7 +56,7 @@ deleteAndEdit: "删除并编辑"
deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回应、转发和回复也将被删除。"
addToList: "添加至列表"
addToAntenna: "添加到天线"
sendMessage: "发送"
sendMessage: "发送消息"
copyRSS: "复制RSS"
copyUsername: "复制用户名"
copyUserId: "复制用户 ID"
@ -334,6 +334,7 @@ fileName: "文件名称"
selectFile: "选择文件"
selectFiles: "选择文件"
selectFolder: "选择文件夹"
unselectFolder: "取消全选文件夹"
selectFolders: "选择多个文件夹"
fileNotSelected: "未选择文件"
renameFile: "重命名文件"
@ -346,6 +347,7 @@ addFile: "添加文件"
showFile: "显示文件"
emptyDrive: "网盘中无文件"
emptyFolder: "此文件夹中无文件"
dropHereToUpload: "将文件拖动到这里来上传"
unableToDelete: "无法删除"
inputNewFileName: "请输入新文件名"
inputNewDescription: "请输入新标题"
@ -1389,6 +1391,9 @@ scheduleToPostOnX: "预定在 {x} 发出"
scheduledToPostOnX: "已预定在 {x} 发出"
schedule: "定时"
scheduled: "定时"
widgets: "小工具"
deviceInfo: "设备信息"
deviceInfoDescription: "咨询技术问题时,将以下信息一并发送有助于解决问题。"
_compression:
_quality:
high: "高质量"
@ -2431,6 +2436,7 @@ _auth:
scopeUser: "以下面的用户进行操作"
pleaseLogin: "在对应用进行授权许可之前,请先登录"
byClickingYouWillBeRedirectedToThisUrl: "允许访问后将会自动重定向到以下 URL"
alreadyAuthorized: "此应用已有访问许可。"
_antennaSources:
all: "所有帖子"
homeTimeline: "已关注用户的帖子"
@ -2697,6 +2703,8 @@ _notification:
quote: "引用"
reaction: "回应"
pollEnded: "问卷调查结束"
scheduledNotePosted: "定时发送成功"
scheduledNotePostFailed: "定时发送失败"
receiveFollowRequest: "收到关注请求"
followRequestAccepted: "关注请求已通过"
roleAssigned: "授予的角色"

View File

@ -1389,6 +1389,7 @@ scheduleToPostOnX: "排定在 {x} 發布"
scheduledToPostOnX: "已排定在 {x} 發布貼文"
schedule: "排定"
scheduled: "排定"
widgets: "小工具"
_compression:
_quality:
high: "高品質"

View File

@ -192,7 +192,7 @@ export const paramDef = {
scheduledAt: { type: 'integer', nullable: true },
isActuallyScheduled: { type: 'boolean', default: false },
},
required: ['visibility', 'visibleUserIds', 'cw', 'hashtag', 'localOnly', 'reactionAcceptance', 'replyId', 'renoteId', 'channelId', 'text', 'fileIds', 'poll', 'scheduledAt', 'isActuallyScheduled'],
required: [],
} as const;
@Injectable()
@ -203,22 +203,22 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
) {
super(meta, paramDef, async (ps, me) => {
const draft = await this.noteDraftService.create(me, {
fileIds: ps.fileIds,
fileIds: ps.fileIds ?? [],
pollChoices: ps.poll?.choices ?? [],
pollMultiple: ps.poll?.multiple ?? false,
pollExpiresAt: ps.poll?.expiresAt ? new Date(ps.poll.expiresAt) : null,
pollExpiredAfter: ps.poll?.expiredAfter ?? null,
hasPoll: ps.poll != null,
text: ps.text,
replyId: ps.replyId,
renoteId: ps.renoteId,
cw: ps.cw,
hashtag: ps.hashtag,
text: ps.text ?? null,
replyId: ps.replyId ?? null,
renoteId: ps.renoteId ?? null,
cw: ps.cw ?? null,
hashtag: ps.hashtag ?? null,
localOnly: ps.localOnly,
reactionAcceptance: ps.reactionAcceptance,
visibility: ps.visibility,
visibleUserIds: ps.visibleUserIds,
channelId: ps.channelId,
visibleUserIds: ps.visibleUserIds ?? [],
channelId: ps.channelId ?? null,
scheduledAt: ps.scheduledAt ? new Date(ps.scheduledAt) : null,
isActuallyScheduled: ps.isActuallyScheduled,
}).catch((err) => {

View File

@ -106,6 +106,11 @@ export async function common(createVue: () => Promise<App<Element>>) {
window.history.replaceState(null, '', window.location.href.replace('#pswp', ''));
}
// URLに#folder-を含む場合は取り除くFolderPageView用
if (window.location.hash.startsWith('#folder-')) {
window.history.replaceState(null, '', window.location.href.replace(window.location.hash, ''));
}
// 一斉リロード
reloadChannel.addEventListener('message', path => {
if (path !== null) window.location.href = path;

View File

@ -27,7 +27,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { onMounted, ref } from 'vue';
import { onMounted, onUnmounted, ref } from 'vue';
import { claimZIndex } from '@/os.js';
import { prefer } from '@/preferences.js';
@ -49,9 +49,34 @@ function closePage() {
}
function onClosed() {
// When closing, remove our history entry if we're still on our hash
if (window.location.hash === `#folder-${props.pageId}`) {
window.history.back();
}
emit('closed');
}
function popstateHandler(): void {
// If the hash is no longer our folder hash, close the page
if (window.location.hash !== `#folder-${props.pageId}`) {
closePage();
}
}
onMounted(() => {
// Push a new history state with a unique hash when the folder page opens
const folderHash = `#folder-${props.pageId}`;
window.history.pushState(null, '', folderHash);
// Listen for popstate events (browser back button)
window.addEventListener('popstate', popstateHandler);
});
onUnmounted(() => {
// Clean up the event listener
window.removeEventListener('popstate', popstateHandler);
});
</script>
<style lang="scss" module>

View File

@ -29205,34 +29205,34 @@ export interface operations {
* @default public
* @enum {string}
*/
visibility: 'public' | 'home' | 'followers' | 'specified';
visibleUserIds: string[];
cw: string | null;
hashtag: string | null;
visibility?: 'public' | 'home' | 'followers' | 'specified';
visibleUserIds?: string[];
cw?: string | null;
hashtag?: string | null;
/** @default false */
localOnly: boolean;
localOnly?: boolean;
/**
* @default null
* @enum {string|null}
*/
reactionAcceptance: null | 'likeOnly' | 'likeOnlyForRemote' | 'nonSensitiveOnly' | 'nonSensitiveOnlyForLocalLikeOnlyForRemote';
reactionAcceptance?: null | 'likeOnly' | 'likeOnlyForRemote' | 'nonSensitiveOnly' | 'nonSensitiveOnlyForLocalLikeOnlyForRemote';
/** Format: misskey:id */
replyId: string | null;
replyId?: string | null;
/** Format: misskey:id */
renoteId: string | null;
renoteId?: string | null;
/** Format: misskey:id */
channelId: string | null;
text: string | null;
fileIds: string[];
poll: {
channelId?: string | null;
text?: string | null;
fileIds?: string[];
poll?: {
choices: string[];
multiple?: boolean;
expiresAt?: number | null;
expiredAfter?: number | null;
} | null;
scheduledAt: number | null;
scheduledAt?: number | null;
/** @default false */
isActuallyScheduled: boolean;
isActuallyScheduled?: boolean;
};
};
};

File diff suppressed because it is too large Load Diff