Merge branch 'develop' into enh-14810
This commit is contained in:
		
						commit
						f2d2b33c12
					
				|  | @ -54,7 +54,7 @@ body: | |||
|           * Model and OS of the device(s): MacBook Pro (14inch, 2021), macOS Ventura 13.4 | ||||
|           * Browser: Chrome 113.0.5672.126 | ||||
|           * Server URL: misskey.example.com | ||||
|           * Misskey: 2024.x.x | ||||
|           * Misskey: 2025.x.x | ||||
|       value: | | ||||
|         * Model and OS of the device(s): | ||||
|         * Browser: | ||||
|  | @ -74,7 +74,7 @@ body: | |||
| 
 | ||||
|         Examples: | ||||
|           * Installation Method or Hosting Service: docker compose, k8s/docker, systemd, "Misskey install shell script", development environment | ||||
|           * Misskey: 2024.x.x | ||||
|           * Misskey: 2025.x.x | ||||
|           * Node: 20.x.x | ||||
|           * PostgreSQL: 15.x.x | ||||
|           * Redis: 7.x.x | ||||
|  |  | |||
|  | @ -13,12 +13,17 @@ | |||
| - Fix: 公開範囲がホームのノートの埋め込みウィジェットが読み込まれない問題を修正   | ||||
|   (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/803) | ||||
| - Fix: 絵文字管理画面で一部の絵文字が表示されない問題を修正 | ||||
| - Fix: ノート検索が使用できない場合でもチャンネルのノート検索欄がでていた問題を修正 | ||||
| - Fix: `Ui:C:select`で値の変更が画面に反映されない問題を修正 | ||||
| - Fix: MiAuth認可画面で、認可処理に失敗した場合でもコールバックURLに遷移してしまう問題を修正   | ||||
|   (Cherry-picked from https://github.com/TeamNijimiss/misskey/commit/800359623e41a662551d774de15b0437b6849bb4) | ||||
| - Fix: デッキでリンクをダブルクリックすると、ウィンドウが2枚開いてしまう問題を修正 | ||||
| 
 | ||||
| ### Server | ||||
| - Fix: ユーザーのプロフィール画面をアドレス入力などで直接表示した際に概要タブの描画に失敗する問題の修正( #15032 ) | ||||
| - Fix: 起動前の疎通チェックが機能しなくなっていた問題を修正   | ||||
|   (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/737) | ||||
| - Enhance: pg_bigmが利用できるよう、ノートの検索をILIKE演算子でなくLIKE演算子でLOWER()をかけたテキストに対して行うように | ||||
| 
 | ||||
| 
 | ||||
| ## 2024.11.0 | ||||
|  |  | |||
							
								
								
									
										2
									
								
								COPYING
								
								
								
								
							
							
						
						
									
										2
									
								
								COPYING
								
								
								
								
							|  | @ -1,5 +1,5 @@ | |||
| Unless otherwise stated this repository is | ||||
| Copyright © 2014-2024 syuilo and contributors | ||||
| Copyright © 2014-2025 syuilo and contributors | ||||
| 
 | ||||
| And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE. | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| # syntax = docker/dockerfile:1.4 | ||||
| 
 | ||||
| ARG NODE_VERSION=22.11.0-bullseye | ||||
| ARG NODE_VERSION=22.11.0-bookworm | ||||
| 
 | ||||
| # build assets & compile TypeScript | ||||
| 
 | ||||
|  |  | |||
|  | @ -2754,10 +2754,18 @@ export interface Locale extends ILocale { | |||
|      * ワードミュート | ||||
|      */ | ||||
|     "wordMute": string; | ||||
|     /** | ||||
|      * 指定した語句を含むノートを最小化します。最小化されたノートをクリックすることで表示することができます。 | ||||
|      */ | ||||
|     "wordMuteDescription": string; | ||||
|     /** | ||||
|      * ハードワードミュート | ||||
|      */ | ||||
|     "hardWordMute": string; | ||||
|     /** | ||||
|      * 指定した語句を含むノートを隠します。ワードミュートとは異なり、ノートは完全に表示されなくなります。 | ||||
|      */ | ||||
|     "hardWordMuteDescription": string; | ||||
|     /** | ||||
|      * 正規表現エラー | ||||
|      */ | ||||
|  |  | |||
|  | @ -684,7 +684,9 @@ smtpSecure: "SMTP 接続に暗黙的なSSL/TLSを使用する" | |||
| smtpSecureInfo: "STARTTLS使用時はオフにします。" | ||||
| testEmail: "配信テスト" | ||||
| wordMute: "ワードミュート" | ||||
| wordMuteDescription: "指定した語句を含むノートを最小化します。最小化されたノートをクリックすることで表示することができます。" | ||||
| hardWordMute: "ハードワードミュート" | ||||
| hardWordMuteDescription: "指定した語句を含むノートを隠します。ワードミュートとは異なり、ノートは完全に表示されなくなります。" | ||||
| regexpError: "正規表現エラー" | ||||
| regexpErrorDescription: "{tab}ワードミュートの{line}行目の正規表現にエラーが発生しました:" | ||||
| instanceMute: "サーバーミュート" | ||||
|  |  | |||
|  | @ -215,7 +215,7 @@ export class SearchService { | |||
| 			} | ||||
| 
 | ||||
| 			query | ||||
| 				.andWhere('note.text ILIKE :q', { q: `%${ sqlLikeEscape(q) }%` }) | ||||
| 				.andWhere('LOWER(note.text) LIKE :q', { q: `%${ sqlLikeEscape(q.toLowerCase()) }%` }) | ||||
| 				.innerJoinAndSelect('note.user', 'user') | ||||
| 				.leftJoinAndSelect('note.reply', 'reply') | ||||
| 				.leftJoinAndSelect('note.renote', 'renote') | ||||
|  |  | |||
|  | @ -87,7 +87,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint- | |||
| 				name: token.name ?? token.app?.name, | ||||
| 				createdAt: this.idService.parse(token.id).date.toISOString(), | ||||
| 				lastUsedAt: token.lastUsedAt?.toISOString(), | ||||
| 				permission: token.permission, | ||||
| 				permission: token.app ? token.app.permission : token.permission, | ||||
| 			}))); | ||||
| 		}); | ||||
| 	} | ||||
|  |  | |||
|  | @ -32,7 +32,7 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 		<template v-if="c.label" #label>{{ c.label }}</template> | ||||
| 		<template v-if="c.caption" #caption>{{ c.caption }}</template> | ||||
| 	</MkInput> | ||||
| 	<MkSelect v-else-if="c.type === 'select'" :small="size === 'small'" :modelValue="c.default ?? null" @update:modelValue="c.onChange"> | ||||
| 	<MkSelect v-else-if="c.type === 'select'" :small="size === 'small'" :modelValue="valueForSelect" @update:modelValue="onSelectUpdate"> | ||||
| 		<template v-if="c.label" #label>{{ c.label }}</template> | ||||
| 		<template v-if="c.caption" #caption>{{ c.caption }}</template> | ||||
| 		<option v-for="item in c.items" :key="item.value" :value="item.value">{{ item.text }}</option> | ||||
|  | @ -77,8 +77,8 @@ import MkPostForm from '@/components/MkPostForm.vue'; | |||
| const props = withDefaults(defineProps<{ | ||||
| 	component: AsUiComponent; | ||||
| 	components: Ref<AsUiComponent>[]; | ||||
| 	size: 'small' | 'medium' | 'large'; | ||||
| 	align: 'left' | 'center' | 'right'; | ||||
| 	size?: 'small' | 'medium' | 'large'; | ||||
| 	align?: 'left' | 'center' | 'right'; | ||||
| }>(), { | ||||
| 	size: 'medium', | ||||
| 	align: 'left', | ||||
|  | @ -86,7 +86,7 @@ const props = withDefaults(defineProps<{ | |||
| 
 | ||||
| const c = props.component; | ||||
| 
 | ||||
| function g(id) { | ||||
| function g(id: string) { | ||||
| 	const v = props.components.find(x => x.value.id === id)?.value; | ||||
| 	if (v) return v; | ||||
| 
 | ||||
|  | @ -122,13 +122,22 @@ const containerStyle = computed(() => { | |||
| 
 | ||||
| const valueForSwitch = ref('default' in c && typeof c.default === 'boolean' ? c.default : false); | ||||
| 
 | ||||
| function onSwitchUpdate(v) { | ||||
| function onSwitchUpdate(v: boolean) { | ||||
| 	valueForSwitch.value = v; | ||||
| 	if ('onChange' in c && c.onChange) { | ||||
| 		c.onChange(v as never); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| const valueForSelect = ref('default' in c && typeof c.default !== 'boolean' ? c.default ?? null : null); | ||||
| 
 | ||||
| function onSelectUpdate(v) { | ||||
| 	valueForSelect.value = v; | ||||
| 	if ('onChange' in c && c.onChange) { | ||||
| 		c.onChange(v as never); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| function openPostForm() { | ||||
| 	const form = (c as AsUiPostFormButton).form; | ||||
| 	if (!form) return; | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 				<MkNotes :pagination="featuredPagination"/> | ||||
| 			</div> | ||||
| 			<div v-else-if="tab === 'search'" key="search"> | ||||
| 				<div class="_gaps"> | ||||
| 				<div v-if="notesSearchAvailable" class="_gaps"> | ||||
| 					<div> | ||||
| 						<MkInput v-model="searchQuery" @enter="search()"> | ||||
| 							<template #prefix><i class="ti ti-search"></i></template> | ||||
|  | @ -54,6 +54,9 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 					</div> | ||||
| 					<MkNotes v-if="searchPagination" :key="searchKey" :pagination="searchPagination"/> | ||||
| 				</div> | ||||
| 				<div v-else> | ||||
| 					<MkInfo warn>{{ i18n.ts.notesSearchNotAvailable }}</MkInfo> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 		</MkHorizontalSwipe> | ||||
| 	</MkSpacer> | ||||
|  | @ -94,6 +97,7 @@ import MkHorizontalSwipe from '@/components/MkHorizontalSwipe.vue'; | |||
| import { PageHeaderItem } from '@/types/page-header.js'; | ||||
| import { isSupportShare } from '@/scripts/navigator.js'; | ||||
| import { copyToClipboard } from '@/scripts/copy-to-clipboard.js'; | ||||
| import { notesSearchAvailable } from '@/scripts/check-permissions.js'; | ||||
| import { miLocalStorage } from '@/local-storage.js'; | ||||
| import { useRouter } from '@/router/supplier.js'; | ||||
| 
 | ||||
|  |  | |||
|  | @ -49,7 +49,7 @@ import { genEmbedCode } from '@/scripts/get-embed-code.js'; | |||
| import { assertServerContext, serverContext } from '@/server-context.js'; | ||||
| 
 | ||||
| // contextは非ログイン状態の情報しかないためログイン時は利用できない | ||||
| const CTX_CLIP = $i && assertServerContext(serverContext, 'clip') ? serverContext.clip : null; | ||||
| const CTX_CLIP = !$i && assertServerContext(serverContext, 'clip') ? serverContext.clip : null; | ||||
| 
 | ||||
| const props = defineProps<{ | ||||
| 	clipId: string, | ||||
|  |  | |||
|  | @ -59,18 +59,18 @@ async function onAccept(token: string) { | |||
| 		name: props.name, | ||||
| 		iconUrl: props.icon, | ||||
| 		permission: _permissions.value, | ||||
| 	}, token).catch(() => { | ||||
| 	}, token).then(() => { | ||||
| 		if (props.callback && props.callback !== '') { | ||||
| 			const cbUrl = new URL(props.callback); | ||||
| 			if (['javascript:', 'file:', 'data:', 'mailto:', 'tel:', 'vbscript:'].includes(cbUrl.protocol)) throw new Error('invalid url'); | ||||
| 			cbUrl.searchParams.set('session', props.session); | ||||
| 			location.href = cbUrl.toString(); | ||||
| 		} else { | ||||
| 			authRoot.value?.showUI('success'); | ||||
| 		} | ||||
| 	}).catch(() => { | ||||
| 		authRoot.value?.showUI('failed'); | ||||
| 	}); | ||||
| 
 | ||||
| 	if (props.callback && props.callback !== '') { | ||||
| 		const cbUrl = new URL(props.callback); | ||||
| 		if (['javascript:', 'file:', 'data:', 'mailto:', 'tel:', 'vbscript:'].includes(cbUrl.protocol)) throw new Error('invalid url'); | ||||
| 		cbUrl.searchParams.set('session', props.session); | ||||
| 		location.href = cbUrl.toString(); | ||||
| 	} else { | ||||
| 		authRoot.value?.showUI('success'); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| function onDeny() { | ||||
|  |  | |||
|  | @ -67,7 +67,7 @@ import { serverContext, assertServerContext } from '@/server-context.js'; | |||
| import { $i } from '@/account.js'; | ||||
| 
 | ||||
| // contextは非ログイン状態の情報しかないためログイン時は利用できない | ||||
| const CTX_NOTE = $i && assertServerContext(serverContext, 'note') ? serverContext.note : null; | ||||
| const CTX_NOTE = !$i && assertServerContext(serverContext, 'note') ? serverContext.note : null; | ||||
| 
 | ||||
| const props = defineProps<{ | ||||
| 	noteId: string; | ||||
|  |  | |||
|  | @ -9,14 +9,20 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 		<template #icon><i class="ti ti-message-off"></i></template> | ||||
| 		<template #label>{{ i18n.ts.wordMute }}</template> | ||||
| 
 | ||||
| 		<XWordMute :muted="$i.mutedWords" @save="saveMutedWords"/> | ||||
| 		<div class="_gaps_m"> | ||||
| 			<MkInfo>{{ i18n.ts.wordMuteDescription }}</MkInfo> | ||||
| 			<XWordMute :muted="$i.mutedWords" @save="saveMutedWords"/> | ||||
| 		</div> | ||||
| 	</MkFolder> | ||||
| 
 | ||||
| 	<MkFolder> | ||||
| 		<template #icon><i class="ti ti-message-off"></i></template> | ||||
| 		<template #label>{{ i18n.ts.hardWordMute }}</template> | ||||
| 
 | ||||
| 		<XWordMute :muted="$i.hardMutedWords" @save="saveHardMutedWords"/> | ||||
| 		<div class="_gaps_m"> | ||||
| 			<MkInfo>{{ i18n.ts.hardWordMuteDescription }}</MkInfo> | ||||
| 			<XWordMute :muted="$i.hardMutedWords" @save="saveHardMutedWords"/> | ||||
| 		</div> | ||||
| 	</MkFolder> | ||||
| 
 | ||||
| 	<MkFolder> | ||||
|  |  | |||
|  | @ -54,7 +54,7 @@ const XGallery = defineAsyncComponent(() => import('./gallery.vue')); | |||
| const XRaw = defineAsyncComponent(() => import('./raw.vue')); | ||||
| 
 | ||||
| // contextは非ログイン状態の情報しかないためログイン時は利用できない | ||||
| const CTX_USER = $i && assertServerContext(serverContext, 'user') ? serverContext.user : null; | ||||
| const CTX_USER = !$i && assertServerContext(serverContext, 'user') ? serverContext.user : null; | ||||
| 
 | ||||
| const props = withDefaults(defineProps<{ | ||||
| 	acct: string; | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| MIT License | ||||
| 
 | ||||
| Copyright (c) 2021-2024 syuilo and other contributors | ||||
| Copyright (c) 2021-2025 syuilo and other contributors | ||||
| 
 | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue