diff --git a/CHANGELOG.md b/CHANGELOG.md
index b072de50b9..9cceb6e432 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -67,6 +67,7 @@
- Fix: `notes/mentions` で場合によっては並び順が正しく返されない問題を修正
- Fix: SystemWebhook設定でsecretを空に出来ない問題を修正
- Fix: 削除されたユーザーがチャットメッセージにリアクションしている場合`chat/history`などでエラーになる問題を修正
+- Fix: Pageのアイキャッチ画像をドライブから消してもPageごと消えないように
## 2025.7.0
diff --git a/locales/index.d.ts b/locales/index.d.ts
index 20735c9e66..cefe4df0bd 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -6633,7 +6633,7 @@ export interface Locale extends ILocale {
/**
* アクティビティを表示する
*/
- "showActivityiesForVisitor": string;
+ "showActivitiesForVisitor": string;
"_userGeneratedContentsVisibilityForVisitor": {
/**
* 全て公開
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 6b591227f0..31859cb2fa 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1685,7 +1685,7 @@ _serverSettings:
restartServerSetupWizardConfirm_text: "現在の一部の設定はリセットされます。"
entrancePageStyle: "エントランスページのスタイル"
showTimelineForVisitor: "タイムラインを表示する"
- showActivityiesForVisitor: "アクティビティを表示する"
+ showActivitiesForVisitor: "アクティビティを表示する"
_userGeneratedContentsVisibilityForVisitor:
all: "全て公開"
diff --git a/packages/backend/migration/1756062689648-NonCascadingPageEyeCatching.js b/packages/backend/migration/1756062689648-NonCascadingPageEyeCatching.js
new file mode 100644
index 0000000000..8554cc4304
--- /dev/null
+++ b/packages/backend/migration/1756062689648-NonCascadingPageEyeCatching.js
@@ -0,0 +1,18 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+export class NonCascadingPageEyeCatching1756062689648 {
+ name = 'NonCascadingPageEyeCatching1756062689648'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "page" DROP CONSTRAINT "FK_a9ca79ad939bf06066b81c9d3aa"`);
+ await queryRunner.query(`ALTER TABLE "page" ADD CONSTRAINT "FK_a9ca79ad939bf06066b81c9d3aa" FOREIGN KEY ("eyeCatchingImageId") REFERENCES "drive_file"("id") ON DELETE SET NULL ON UPDATE NO ACTION`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "page" DROP CONSTRAINT "FK_a9ca79ad939bf06066b81c9d3aa"`);
+ await queryRunner.query(`ALTER TABLE "page" ADD CONSTRAINT "FK_a9ca79ad939bf06066b81c9d3aa" FOREIGN KEY ("eyeCatchingImageId") REFERENCES "drive_file"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
+ }
+}
diff --git a/packages/backend/src/models/Page.ts b/packages/backend/src/models/Page.ts
index 0b59e7a92c..d112a66c04 100644
--- a/packages/backend/src/models/Page.ts
+++ b/packages/backend/src/models/Page.ts
@@ -69,7 +69,7 @@ export class MiPage {
public eyeCatchingImageId: MiDriveFile['id'] | null;
@ManyToOne(type => MiDriveFile, {
- onDelete: 'CASCADE',
+ onDelete: 'SET NULL',
})
@JoinColumn()
public eyeCatchingImage: MiDriveFile | null;
diff --git a/packages/frontend/src/components/MkAnimBg.vue b/packages/frontend/src/components/MkAnimBg.vue
index e57fbcdee3..82606c9aa4 100644
--- a/packages/frontend/src/components/MkAnimBg.vue
+++ b/packages/frontend/src/components/MkAnimBg.vue
@@ -44,7 +44,7 @@ function initShaderProgram(gl: WebGLRenderingContext, vsSource: string, fsSource
const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource);
const shaderProgram = gl.createProgram();
- if (shaderProgram == null || vertexShader == null || fragmentShader == null) return null;
+ if (vertexShader == null || fragmentShader == null) return null;
gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
@@ -71,8 +71,10 @@ onMounted(() => {
canvas.width = width;
canvas.height = height;
- const gl = canvas.getContext('webgl', { premultipliedAlpha: true });
- if (gl == null) return;
+ const maybeGl = canvas.getContext('webgl', { premultipliedAlpha: true });
+ if (maybeGl == null) return;
+
+ const gl = maybeGl;
gl.clearColor(0.0, 0.0, 0.0, 0.0);
gl.clear(gl.COLOR_BUFFER_BIT);
@@ -229,8 +231,8 @@ onMounted(() => {
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.DYNAMIC_DRAW);
if (isChromatic()) {
- gl!.uniform1f(u_time, 0);
- gl!.drawArrays(gl!.TRIANGLE_STRIP, 0, 4);
+ gl.uniform1f(u_time, 0);
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
} else {
function render(timeStamp: number) {
let sizeChanged = false;
@@ -249,8 +251,8 @@ onMounted(() => {
gl.viewport(0, 0, width, height);
}
- gl!.uniform1f(u_time, timeStamp);
- gl!.drawArrays(gl!.TRIANGLE_STRIP, 0, 4);
+ gl.uniform1f(u_time, timeStamp);
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
handle = window.requestAnimationFrame(render);
}
diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue
index 8a33dfb842..25c10a65cf 100644
--- a/packages/frontend/src/components/MkDrive.vue
+++ b/packages/frontend/src/components/MkDrive.vue
@@ -363,7 +363,7 @@ function onDrop(ev: DragEvent) {
//#endregion
}
-function onUploadRequested(files: File[], folder: Misskey.entities.DriveFolder | null) {
+function onUploadRequested(files: File[], folder?: Misskey.entities.DriveFolder | null) {
os.launchUploader(files, {
folderId: folder?.id ?? null,
});
diff --git a/packages/frontend/src/components/MkDriveFileThumbnail.vue b/packages/frontend/src/components/MkDriveFileThumbnail.vue
index 88afdef114..3933421fc0 100644
--- a/packages/frontend/src/components/MkDriveFileThumbnail.vue
+++ b/packages/frontend/src/components/MkDriveFileThumbnail.vue
@@ -22,7 +22,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:forceBlurhash="forceBlurhash"
/>