Make max allowed text length configurable (#2992)
* Make max allowed text length configurable * Fix canPost
This commit is contained in:
		
							parent
							
								
									f24d202024
								
							
						
					
					
						commit
						daa22d68fa
					
				
					 7 changed files with 30 additions and 7 deletions
				
			
		| 
						 | 
					@ -164,3 +164,6 @@ drive:
 | 
				
			||||||
#  external: true
 | 
					#  external: true
 | 
				
			||||||
#  engine: http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}
 | 
					#  engine: http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}
 | 
				
			||||||
#  timeout: 300000
 | 
					#  timeout: 300000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Max allowed note text length in charactors
 | 
				
			||||||
 | 
					maxNoteTextLength: 1000
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,7 +45,7 @@
 | 
				
			||||||
		<span v-if="visibility === 'specified'">%fa:envelope%</span>
 | 
							<span v-if="visibility === 'specified'">%fa:envelope%</span>
 | 
				
			||||||
		<span v-if="visibility === 'private'">%fa:lock%</span>
 | 
							<span v-if="visibility === 'private'">%fa:lock%</span>
 | 
				
			||||||
	</button>
 | 
						</button>
 | 
				
			||||||
	<p class="text-count" :class="{ over: this.trimmedLength(text) > 1000 }">{{ 1000 - this.trimmedLength(text) }}</p>
 | 
						<p class="text-count" :class="{ over: this.trimmedLength(text) > this.maxNoteTextLength }">{{ this.maxNoteTextLength - this.trimmedLength(text) }}</p>
 | 
				
			||||||
	<button :class="{ posting }" class="submit" :disabled="!canPost" @click="post">
 | 
						<button :class="{ posting }" class="submit" :disabled="!canPost" @click="post">
 | 
				
			||||||
		{{ posting ? '%i18n:@posting%' : submitText }}<mk-ellipsis v-if="posting"/>
 | 
							{{ posting ? '%i18n:@posting%' : submitText }}<mk-ellipsis v-if="posting"/>
 | 
				
			||||||
	</button>
 | 
						</button>
 | 
				
			||||||
| 
						 | 
					@ -107,10 +107,17 @@ export default Vue.extend({
 | 
				
			||||||
			visibleUsers: [],
 | 
								visibleUsers: [],
 | 
				
			||||||
			autocomplete: null,
 | 
								autocomplete: null,
 | 
				
			||||||
			draghover: false,
 | 
								draghover: false,
 | 
				
			||||||
			recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]')
 | 
								recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'),
 | 
				
			||||||
 | 
								maxNoteTextLength: 1000
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						created() {
 | 
				
			||||||
 | 
							(this as any).os.getMeta().then(meta => {
 | 
				
			||||||
 | 
								this.maxNoteTextLength = meta.maxNoteTextLength;
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	computed: {
 | 
						computed: {
 | 
				
			||||||
		draftId(): string {
 | 
							draftId(): string {
 | 
				
			||||||
			return this.renote
 | 
								return this.renote
 | 
				
			||||||
| 
						 | 
					@ -149,7 +156,7 @@ export default Vue.extend({
 | 
				
			||||||
		canPost(): boolean {
 | 
							canPost(): boolean {
 | 
				
			||||||
			return !this.posting &&
 | 
								return !this.posting &&
 | 
				
			||||||
				(1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) &&
 | 
									(1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) &&
 | 
				
			||||||
				(length(this.text.trim()) <= 1000);
 | 
									(length(this.text.trim()) <= this.maxNoteTextLength);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@
 | 
				
			||||||
		<header>
 | 
							<header>
 | 
				
			||||||
			<button class="cancel" @click="cancel">%fa:times%</button>
 | 
								<button class="cancel" @click="cancel">%fa:times%</button>
 | 
				
			||||||
			<div>
 | 
								<div>
 | 
				
			||||||
				<span class="text-count" :class="{ over: trimmedLength(text) > 1000 }">{{ 1000 - trimmedLength(text) }}</span>
 | 
									<span class="text-count" :class="{ over: trimmedLength(text) > this.maxNoteTextLength }">{{ this.maxNoteTextLength - trimmedLength(text) }}</span>
 | 
				
			||||||
				<span class="geo" v-if="geo">%fa:map-marker-alt%</span>
 | 
									<span class="geo" v-if="geo">%fa:map-marker-alt%</span>
 | 
				
			||||||
				<button class="submit" :disabled="!canPost" @click="post">{{ submitText }}</button>
 | 
									<button class="submit" :disabled="!canPost" @click="post">{{ submitText }}</button>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
| 
						 | 
					@ -102,10 +102,17 @@ export default Vue.extend({
 | 
				
			||||||
			visibleUsers: [],
 | 
								visibleUsers: [],
 | 
				
			||||||
			useCw: false,
 | 
								useCw: false,
 | 
				
			||||||
			cw: null,
 | 
								cw: null,
 | 
				
			||||||
			recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]')
 | 
								recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'),
 | 
				
			||||||
 | 
								maxNoteTextLength: 1000
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						created() {
 | 
				
			||||||
 | 
							(this as any).os.getMeta().then(meta => {
 | 
				
			||||||
 | 
								this.maxNoteTextLength = meta.maxNoteTextLength;
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	computed: {
 | 
						computed: {
 | 
				
			||||||
		draftId(): string {
 | 
							draftId(): string {
 | 
				
			||||||
			return this.renote
 | 
								return this.renote
 | 
				
			||||||
| 
						 | 
					@ -144,7 +151,7 @@ export default Vue.extend({
 | 
				
			||||||
		canPost(): boolean {
 | 
							canPost(): boolean {
 | 
				
			||||||
			return !this.posting &&
 | 
								return !this.posting &&
 | 
				
			||||||
				(1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) &&
 | 
									(1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) &&
 | 
				
			||||||
				(this.text.trim().length <= 1000);
 | 
									(this.text.trim().length <= this.maxNoteTextLength);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,6 +49,8 @@ export default function load() {
 | 
				
			||||||
	if (config.localDriveCapacityMb == null) config.localDriveCapacityMb = 256;
 | 
						if (config.localDriveCapacityMb == null) config.localDriveCapacityMb = 256;
 | 
				
			||||||
	if (config.remoteDriveCapacityMb == null) config.remoteDriveCapacityMb = 8;
 | 
						if (config.remoteDriveCapacityMb == null) config.remoteDriveCapacityMb = 8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (config.maxNoteTextLength == null) config.maxNoteTextLength = 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (config.name == null) config.name = 'Misskey';
 | 
						if (config.name == null) config.name = 'Misskey';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return Object.assign(config, mixin);
 | 
						return Object.assign(config, mixin);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,6 +103,8 @@ export type Source = {
 | 
				
			||||||
		engine: string;
 | 
							engine: string;
 | 
				
			||||||
		timeout: number;
 | 
							timeout: number;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						maxNoteTextLength?: number;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,6 +14,7 @@ import NoteReaction from './note-reaction';
 | 
				
			||||||
import Favorite, { deleteFavorite } from './favorite';
 | 
					import Favorite, { deleteFavorite } from './favorite';
 | 
				
			||||||
import Notification, { deleteNotification } from './notification';
 | 
					import Notification, { deleteNotification } from './notification';
 | 
				
			||||||
import Following from './following';
 | 
					import Following from './following';
 | 
				
			||||||
 | 
					import config from '../config';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const Note = db.get<INote>('notes');
 | 
					const Note = db.get<INote>('notes');
 | 
				
			||||||
Note.createIndex('uri', { sparse: true, unique: true });
 | 
					Note.createIndex('uri', { sparse: true, unique: true });
 | 
				
			||||||
| 
						 | 
					@ -29,7 +30,7 @@ Note.createIndex({
 | 
				
			||||||
export default Note;
 | 
					export default Note;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function isValidText(text: string): boolean {
 | 
					export function isValidText(text: string): boolean {
 | 
				
			||||||
	return length(text.trim()) <= 1000 && text.trim() != '';
 | 
						return length(text.trim()) <= config.maxNoteTextLength && text.trim() != '';
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function isValidCw(text: string): boolean {
 | 
					export function isValidCw(text: string): boolean {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,6 +49,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
 | 
				
			||||||
		swPublickey: config.sw ? config.sw.public_key : null,
 | 
							swPublickey: config.sw ? config.sw.public_key : null,
 | 
				
			||||||
		hidedTags: (me && me.isAdmin) ? meta.hidedTags : undefined,
 | 
							hidedTags: (me && me.isAdmin) ? meta.hidedTags : undefined,
 | 
				
			||||||
		bannerUrl: meta.bannerUrl,
 | 
							bannerUrl: meta.bannerUrl,
 | 
				
			||||||
 | 
							maxNoteTextLength: config.maxNoteTextLength,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		features: {
 | 
							features: {
 | 
				
			||||||
			registration: !meta.disableRegistration,
 | 
								registration: !meta.disableRegistration,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue