enhance(frontend): Add an option to customize Lockdown duration (#16405)
* chore(locales): Add "setManually" and "_time.month" Add Japanese locales to auto-generate other languages. * feat(frontend): Add text fields to set lockdown duration manually Choose from presets or set it manually. * refactor(frontend): Make objects contains option's values and labels When adding a new option, it needed to write two times. * docs(changelog): Add a description about this change Users can notice what's changed by this PR. * refactor(frontend): Manage state by MkSelect The functions only initialize the values. * refactor(frontend): Make the custom input as writable computed Clean up the MkInput components. * chore(locales): Switch to "custom" A single word is better than sentence on this situation. * refactor(frontend): Insert the custom button to presets Users don't need to click multiple times to use prests.
This commit is contained in:
		
							parent
							
								
									ba40cb750b
								
							
						
					
					
						commit
						ff334fe9d7
					
				|  | @ -39,6 +39,7 @@ | |||
| - Enhance: 不必要な翻訳データを読み込まなくなり、パフォーマンスが向上しました | ||||
| - Enhance: 画像エフェクトのパラメータ名の多言語対応 | ||||
| - Enhance: 依存ソフトウェアの更新 | ||||
| - Enhance: ノートを非表示にする相対期間を1ヶ月単位で自由に指定できるように | ||||
| - Fix: 投稿フォームでファイルのアップロードが中止または失敗した際のハンドリングを修正 | ||||
| - Fix: 一部の設定検索結果が存在しないパスになる問題を修正   | ||||
|   (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1171) | ||||
|  |  | |||
|  | @ -4234,6 +4234,10 @@ export interface Locale extends ILocale { | |||
|      * プリセットから選択 | ||||
|      */ | ||||
|     "selectFromPresets": string; | ||||
|     /** | ||||
|      * カスタム | ||||
|      */ | ||||
|     "custom": string; | ||||
|     /** | ||||
|      * 実績 | ||||
|      */ | ||||
|  | @ -8836,6 +8840,10 @@ export interface Locale extends ILocale { | |||
|          * 日 | ||||
|          */ | ||||
|         "day": string; | ||||
|         /** | ||||
|          * ヶ月 | ||||
|          */ | ||||
|         "month": string; | ||||
|     }; | ||||
|     "_2fa": { | ||||
|         /** | ||||
|  |  | |||
|  | @ -1054,6 +1054,7 @@ permissionDeniedError: "操作が拒否されました" | |||
| permissionDeniedErrorDescription: "このアカウントにはこの操作を行うための権限がありません。" | ||||
| preset: "プリセット" | ||||
| selectFromPresets: "プリセットから選択" | ||||
| custom: "カスタム" | ||||
| achievements: "実績" | ||||
| gotInvalidResponseError: "サーバーの応答が無効です" | ||||
| gotInvalidResponseErrorDescription: "サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから再度お試しください。" | ||||
|  | @ -2321,6 +2322,7 @@ _time: | |||
|   minute: "分" | ||||
|   hour: "時間" | ||||
|   day: "日" | ||||
|   month: "ヶ月" | ||||
| 
 | ||||
| _2fa: | ||||
|   alreadyRegistered: "既に設定は完了しています。" | ||||
|  |  | |||
|  | @ -125,16 +125,20 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 									<option value="absolute">{{ i18n.ts._accountSettings.notesOlderThanSpecifiedDateAndTime }}</option> | ||||
| 								</MkSelect> | ||||
| 
 | ||||
| 								<MkSelect v-if="makeNotesFollowersOnlyBefore_type === 'relative'" v-model="makeNotesFollowersOnlyBefore"> | ||||
| 									<option :value="-3600">{{ i18n.ts.oneHour }}</option> | ||||
| 									<option :value="-86400">{{ i18n.ts.oneDay }}</option> | ||||
| 									<option :value="-259200">{{ i18n.ts.threeDays }}</option> | ||||
| 									<option :value="-604800">{{ i18n.ts.oneWeek }}</option> | ||||
| 									<option :value="-2592000">{{ i18n.ts.oneMonth }}</option> | ||||
| 									<option :value="-7776000">{{ i18n.ts.threeMonths }}</option> | ||||
| 									<option :value="-31104000">{{ i18n.ts.oneYear }}</option> | ||||
| 								<MkSelect v-if="makeNotesFollowersOnlyBefore_type === 'relative'" v-model="makeNotesFollowersOnlyBefore_selection"> | ||||
| 									<option v-for="preset in makeNotesFollowersOnlyBefore_presets" :value="preset.value">{{ preset.label }}</option> | ||||
| 									<option value="custom">{{ i18n.ts.custom }}</option> | ||||
| 								</MkSelect> | ||||
| 
 | ||||
| 								<MkInput | ||||
| 									v-if="makeNotesFollowersOnlyBefore_type === 'relative' && makeNotesFollowersOnlyBefore_isCustomMode" | ||||
| 									v-model="makeNotesFollowersOnlyBefore_customMonths" | ||||
| 									type="number" | ||||
| 									:min="1" | ||||
| 								> | ||||
| 									<template #suffix>{{ i18n.ts._time.month }}</template> | ||||
| 								</MkInput> | ||||
| 
 | ||||
| 								<MkInput | ||||
| 									v-if="makeNotesFollowersOnlyBefore_type === 'absolute'" | ||||
| 									:modelValue="formatDateTimeString(new Date(makeNotesFollowersOnlyBefore * 1000), 'yyyy-MM-dd')" | ||||
|  | @ -162,16 +166,20 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 									<option value="absolute">{{ i18n.ts._accountSettings.notesOlderThanSpecifiedDateAndTime }}</option> | ||||
| 								</MkSelect> | ||||
| 
 | ||||
| 								<MkSelect v-if="makeNotesHiddenBefore_type === 'relative'" v-model="makeNotesHiddenBefore"> | ||||
| 									<option :value="-3600">{{ i18n.ts.oneHour }}</option> | ||||
| 									<option :value="-86400">{{ i18n.ts.oneDay }}</option> | ||||
| 									<option :value="-259200">{{ i18n.ts.threeDays }}</option> | ||||
| 									<option :value="-604800">{{ i18n.ts.oneWeek }}</option> | ||||
| 									<option :value="-2592000">{{ i18n.ts.oneMonth }}</option> | ||||
| 									<option :value="-7776000">{{ i18n.ts.threeMonths }}</option> | ||||
| 									<option :value="-31104000">{{ i18n.ts.oneYear }}</option> | ||||
| 								<MkSelect v-if="makeNotesHiddenBefore_type === 'relative'" v-model="makeNotesHiddenBefore_selection"> | ||||
| 									<option v-for="preset in makeNotesHiddenBefore_presets" :value="preset.value">{{ preset.label }}</option> | ||||
| 									<option value="custom">{{ i18n.ts.custom }}</option> | ||||
| 								</MkSelect> | ||||
| 
 | ||||
| 								<MkInput | ||||
| 									v-if="makeNotesHiddenBefore_type === 'relative' && makeNotesHiddenBefore_isCustomMode" | ||||
| 									v-model="makeNotesHiddenBefore_customMonths" | ||||
| 									type="number" | ||||
| 									:min="1" | ||||
| 								> | ||||
| 									<template #suffix>{{ i18n.ts._time.month }}</template> | ||||
| 								</MkInput> | ||||
| 
 | ||||
| 								<MkInput | ||||
| 									v-if="makeNotesHiddenBefore_type === 'absolute'" | ||||
| 									:modelValue="formatDateTimeString(new Date(makeNotesHiddenBefore * 1000), 'yyyy-MM-dd')" | ||||
|  | @ -241,6 +249,37 @@ const makeNotesFollowersOnlyBefore_type = computed(() => { | |||
| 	} | ||||
| }); | ||||
| 
 | ||||
| const makeNotesFollowersOnlyBefore_presets = [ | ||||
| 	{ label: i18n.ts.oneHour, value: -3600 }, | ||||
| 	{ label: i18n.ts.oneDay, value: -86400 }, | ||||
| 	{ label: i18n.ts.threeDays, value: -259200 }, | ||||
| 	{ label: i18n.ts.oneWeek, value: -604800 }, | ||||
| 	{ label: i18n.ts.oneMonth, value: -2592000 }, | ||||
| 	{ label: i18n.ts.threeMonths, value: -7776000 }, | ||||
| 	{ label: i18n.ts.oneYear, value: -31104000 }, | ||||
| ]; | ||||
| 
 | ||||
| const makeNotesFollowersOnlyBefore_isCustomMode = ref( | ||||
| 	makeNotesFollowersOnlyBefore.value != null && | ||||
| 	makeNotesFollowersOnlyBefore.value < 0 && | ||||
| 	!makeNotesFollowersOnlyBefore_presets.some((preset) => preset.value === makeNotesFollowersOnlyBefore.value) | ||||
| ); | ||||
| 
 | ||||
| const makeNotesFollowersOnlyBefore_selection = computed({ | ||||
| 	get: () => makeNotesFollowersOnlyBefore_isCustomMode.value ? 'custom' : makeNotesFollowersOnlyBefore.value, | ||||
| 	set(value) { | ||||
| 		makeNotesFollowersOnlyBefore_isCustomMode.value = value === 'custom'; | ||||
| 		if (value !== 'custom') makeNotesFollowersOnlyBefore.value = value; | ||||
| 	} | ||||
| }); | ||||
| 
 | ||||
| const makeNotesFollowersOnlyBefore_customMonths = computed({ | ||||
| 	get: () => makeNotesFollowersOnlyBefore.value ? Math.abs(makeNotesFollowersOnlyBefore.value) / (30 * 24 * 60 * 60) : null, | ||||
| 	set(value) { | ||||
| 		if (value != null && value > 0) makeNotesFollowersOnlyBefore.value = -Math.abs(Math.floor(Number(value))) * 30 * 24 * 60 * 60; | ||||
| 	} | ||||
| }); | ||||
| 
 | ||||
| const makeNotesHiddenBefore_type = computed(() => { | ||||
| 	if (makeNotesHiddenBefore.value == null) { | ||||
| 		return null; | ||||
|  | @ -251,6 +290,37 @@ const makeNotesHiddenBefore_type = computed(() => { | |||
| 	} | ||||
| }); | ||||
| 
 | ||||
| const makeNotesHiddenBefore_presets = [ | ||||
| 	{ label: i18n.ts.oneHour, value: -3600 }, | ||||
| 	{ label: i18n.ts.oneDay, value: -86400 }, | ||||
| 	{ label: i18n.ts.threeDays, value: -259200 }, | ||||
| 	{ label: i18n.ts.oneWeek, value: -604800 }, | ||||
| 	{ label: i18n.ts.oneMonth, value: -2592000 }, | ||||
| 	{ label: i18n.ts.threeMonths, value: -7776000 }, | ||||
| 	{ label: i18n.ts.oneYear, value: -31104000 }, | ||||
| ]; | ||||
| 
 | ||||
| const makeNotesHiddenBefore_isCustomMode = ref( | ||||
| 	makeNotesHiddenBefore.value != null && | ||||
| 	makeNotesHiddenBefore.value < 0 && | ||||
| 	!makeNotesHiddenBefore_presets.some((preset) => preset.value === makeNotesHiddenBefore.value) | ||||
| ); | ||||
| 
 | ||||
| const makeNotesHiddenBefore_selection = computed({ | ||||
| 	get: () => makeNotesHiddenBefore_isCustomMode.value ? 'custom' : makeNotesHiddenBefore.value, | ||||
| 	set(value) { | ||||
| 		makeNotesHiddenBefore_isCustomMode.value = value === 'custom'; | ||||
| 		if (value !== 'custom') makeNotesHiddenBefore.value = value; | ||||
| 	} | ||||
| }); | ||||
| 
 | ||||
| const makeNotesHiddenBefore_customMonths = computed({ | ||||
| 	get: () => makeNotesHiddenBefore.value ? Math.abs(makeNotesHiddenBefore.value) / (30 * 24 * 60 * 60) : null, | ||||
| 	set(value) { | ||||
| 		if (value != null && value > 0) makeNotesHiddenBefore.value = -Math.abs(Math.floor(Number(value))) * 30 * 24 * 60 * 60; | ||||
| 	} | ||||
| }); | ||||
| 
 | ||||
| watch([makeNotesFollowersOnlyBefore, makeNotesHiddenBefore], () => { | ||||
| 	save(); | ||||
| }); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue