Fix bug
This commit is contained in:
		@@ -2,7 +2,7 @@
 | 
			
		||||
<div class="mk-calendar" :data-melt="design == 4 || design == 5">
 | 
			
		||||
	<template v-if="design == 0 || design == 1">
 | 
			
		||||
		<button @click="prev" title="%i18n:@prev%">%fa:chevron-circle-left%</button>
 | 
			
		||||
		<p class="title">{{ '%i18n:@title%'.replace('{1}', year).replace('{2}', month) }}</p>
 | 
			
		||||
		<p class="title">{{ '%i18n:!@title%'.replace('{1}', year).replace('{2}', month) }}</p>
 | 
			
		||||
		<button @click="next" title="%i18n:@next%">%fa:chevron-circle-right%</button>
 | 
			
		||||
	</template>
 | 
			
		||||
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
			:data-is-out-of-range="isOutOfRange(i + 1)"
 | 
			
		||||
			:data-is-donichi="isDonichi(i + 1)"
 | 
			
		||||
			@click="go(i + 1)"
 | 
			
		||||
			:title="isOutOfRange(i + 1) ? null : '%i18n:@go%'"
 | 
			
		||||
			:title="isOutOfRange(i + 1) ? null : '%i18n:!@go%'"
 | 
			
		||||
		>
 | 
			
		||||
			<div>{{ i + 1 }}</div>
 | 
			
		||||
		</div>
 | 
			
		||||
@@ -58,13 +58,13 @@ export default Vue.extend({
 | 
			
		||||
			month: new Date().getMonth() + 1,
 | 
			
		||||
			selected: new Date(),
 | 
			
		||||
			weekdayText: [
 | 
			
		||||
				'%i18n:common.weekday-short.sunday%',
 | 
			
		||||
				'%i18n:common.weekday-short.monday%',
 | 
			
		||||
				'%i18n:common.weekday-short.tuesday%',
 | 
			
		||||
				'%i18n:common.weekday-short.wednesday%',
 | 
			
		||||
				'%i18n:common.weekday-short.thursday%',
 | 
			
		||||
				'%i18n:common.weekday-short.friday%',
 | 
			
		||||
				'%i18n:common.weekday-short.satruday%'
 | 
			
		||||
				'%i18n:!common.weekday-short.sunday%',
 | 
			
		||||
				'%i18n:!common.weekday-short.monday%',
 | 
			
		||||
				'%i18n:!common.weekday-short.tuesday%',
 | 
			
		||||
				'%i18n:!common.weekday-short.wednesday%',
 | 
			
		||||
				'%i18n:!common.weekday-short.thursday%',
 | 
			
		||||
				'%i18n:!common.weekday-short.friday%',
 | 
			
		||||
				'%i18n:!common.weekday-short.satruday%'
 | 
			
		||||
			]
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
 
 | 
			
		||||
@@ -64,46 +64,46 @@ export default Vue.extend({
 | 
			
		||||
			this.isContextmenuShowing = true;
 | 
			
		||||
			contextmenu(e, [{
 | 
			
		||||
				type: 'item',
 | 
			
		||||
				text: '%i18n:@contextmenu.rename%',
 | 
			
		||||
				text: '%i18n:!@contextmenu.rename%',
 | 
			
		||||
				icon: '%fa:i-cursor%',
 | 
			
		||||
				onClick: this.rename
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'item',
 | 
			
		||||
				text: '%i18n:@contextmenu.copy-url%',
 | 
			
		||||
				text: '%i18n:!@contextmenu.copy-url%',
 | 
			
		||||
				icon: '%fa:link%',
 | 
			
		||||
				onClick: this.copyUrl
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'link',
 | 
			
		||||
				href: `${this.file.url}?download`,
 | 
			
		||||
				text: '%i18n:@contextmenu.download%',
 | 
			
		||||
				text: '%i18n:!@contextmenu.download%',
 | 
			
		||||
				icon: '%fa:download%',
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'divider',
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'item',
 | 
			
		||||
				text: '%i18n:common.delete%',
 | 
			
		||||
				text: '%i18n:!common.delete%',
 | 
			
		||||
				icon: '%fa:R trash-alt%',
 | 
			
		||||
				onClick: this.deleteFile
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'divider',
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'nest',
 | 
			
		||||
				text: '%i18n:@contextmenu.else-files%',
 | 
			
		||||
				text: '%i18n:!@contextmenu.else-files%',
 | 
			
		||||
				menu: [{
 | 
			
		||||
					type: 'item',
 | 
			
		||||
					text: '%i18n:@contextmenu.set-as-avatar%',
 | 
			
		||||
					text: '%i18n:!@contextmenu.set-as-avatar%',
 | 
			
		||||
					onClick: this.setAsAvatar
 | 
			
		||||
				}, {
 | 
			
		||||
					type: 'item',
 | 
			
		||||
					text: '%i18n:@contextmenu.set-as-banner%',
 | 
			
		||||
					text: '%i18n:!@contextmenu.set-as-banner%',
 | 
			
		||||
					onClick: this.setAsBanner
 | 
			
		||||
				}]
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'nest',
 | 
			
		||||
				text: '%i18n:@contextmenu.open-in-app%',
 | 
			
		||||
				text: '%i18n:!@contextmenu.open-in-app%',
 | 
			
		||||
				menu: [{
 | 
			
		||||
					type: 'item',
 | 
			
		||||
					text: '%i18n:@contextmenu.add-app%...',
 | 
			
		||||
					text: '%i18n:!@contextmenu.add-app%...',
 | 
			
		||||
					onClick: this.addApp
 | 
			
		||||
				}]
 | 
			
		||||
			}], {
 | 
			
		||||
@@ -141,8 +141,8 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		rename() {
 | 
			
		||||
			(this as any).apis.input({
 | 
			
		||||
				title: '%i18n:@contextmenu.rename-file%',
 | 
			
		||||
				placeholder: '%i18n:@contextmenu.input-new-file-name%',
 | 
			
		||||
				title: '%i18n:!@contextmenu.rename-file%',
 | 
			
		||||
				placeholder: '%i18n:!@contextmenu.input-new-file-name%',
 | 
			
		||||
				default: this.file.name,
 | 
			
		||||
				allowEmpty: false
 | 
			
		||||
			}).then(name => {
 | 
			
		||||
@@ -157,9 +157,9 @@ export default Vue.extend({
 | 
			
		||||
			copyToClipboard(this.file.url);
 | 
			
		||||
			(this as any).apis.dialog({
 | 
			
		||||
				title: '%fa:check%%i18n:@contextmenu.copied%',
 | 
			
		||||
				text: '%i18n:@contextmenu.copied-url-to-clipboard%',
 | 
			
		||||
				text: '%i18n:!@contextmenu.copied-url-to-clipboard%',
 | 
			
		||||
				actions: [{
 | 
			
		||||
					text: '%i18n:common.ok%'
 | 
			
		||||
					text: '%i18n:!common.ok%'
 | 
			
		||||
				}]
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -54,26 +54,26 @@ export default Vue.extend({
 | 
			
		||||
			this.isContextmenuShowing = true;
 | 
			
		||||
			contextmenu(e, [{
 | 
			
		||||
				type: 'item',
 | 
			
		||||
				text: '%i18n:@contextmenu.move-to-this-folder%',
 | 
			
		||||
				text: '%i18n:!@contextmenu.move-to-this-folder%',
 | 
			
		||||
				icon: '%fa:arrow-right%',
 | 
			
		||||
				onClick: this.go
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'item',
 | 
			
		||||
				text: '%i18n:@contextmenu.show-in-new-window%',
 | 
			
		||||
				text: '%i18n:!@contextmenu.show-in-new-window%',
 | 
			
		||||
				icon: '%fa:R window-restore%',
 | 
			
		||||
				onClick: this.newWindow
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'divider',
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'item',
 | 
			
		||||
				text: '%i18n:@contextmenu.rename%',
 | 
			
		||||
				text: '%i18n:!@contextmenu.rename%',
 | 
			
		||||
				icon: '%fa:i-cursor%',
 | 
			
		||||
				onClick: this.rename
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'divider',
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'item',
 | 
			
		||||
				text: '%i18n:common.delete%',
 | 
			
		||||
				text: '%i18n:!common.delete%',
 | 
			
		||||
				icon: '%fa:R trash-alt%',
 | 
			
		||||
				onClick: this.deleteFolder
 | 
			
		||||
			}], {
 | 
			
		||||
@@ -159,15 +159,15 @@ export default Vue.extend({
 | 
			
		||||
					switch (err) {
 | 
			
		||||
						case 'detected-circular-definition':
 | 
			
		||||
							(this as any).apis.dialog({
 | 
			
		||||
								title: '%fa:exclamation-triangle%%i18n:@unable-to-process%',
 | 
			
		||||
								text: '%i18n:@circular-reference-detected%',
 | 
			
		||||
								title: '%fa:exclamation-triangle%%i18n:!@unable-to-process%',
 | 
			
		||||
								text: '%i18n:!@circular-reference-detected%',
 | 
			
		||||
								actions: [{
 | 
			
		||||
									text: '%i18n:common.ok%'
 | 
			
		||||
									text: '%i18n:!common.ok%'
 | 
			
		||||
								}]
 | 
			
		||||
							});
 | 
			
		||||
							break;
 | 
			
		||||
						default:
 | 
			
		||||
							alert('%i18n:@unhandled-error% ' + err);
 | 
			
		||||
							alert('%i18n:!@unhandled-error% ' + err);
 | 
			
		||||
					}
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
@@ -199,8 +199,8 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		rename() {
 | 
			
		||||
			(this as any).apis.input({
 | 
			
		||||
				title: '%i18n:@contextmenu.rename-folder%',
 | 
			
		||||
				placeholder: '%i18n:@contextmenu.input-new-folder-name%',
 | 
			
		||||
				title: '%i18n:!@contextmenu.rename-folder%',
 | 
			
		||||
				placeholder: '%i18n:!@contextmenu.input-new-folder-name%',
 | 
			
		||||
				default: this.folder.name
 | 
			
		||||
			}).then(name => {
 | 
			
		||||
				(this as any).api('drive/folders/update', {
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
	@drop.stop="onDrop"
 | 
			
		||||
>
 | 
			
		||||
	<template v-if="folder == null">%fa:cloud%</template>
 | 
			
		||||
	<span>{{ folder == null ? '%i18n:@drive%' : folder.name }}</span>
 | 
			
		||||
	<span>{{ folder == null ? '%i18n:!@drive%' : folder.name }}</span>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -138,17 +138,17 @@ export default Vue.extend({
 | 
			
		||||
		onContextmenu(e) {
 | 
			
		||||
			contextmenu(e, [{
 | 
			
		||||
				type: 'item',
 | 
			
		||||
				text: '%i18n:@contextmenu.create-folder%',
 | 
			
		||||
				text: '%i18n:!@contextmenu.create-folder%',
 | 
			
		||||
				icon: '%fa:R folder%',
 | 
			
		||||
				onClick: this.createFolder
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'item',
 | 
			
		||||
				text: '%i18n:@contextmenu.upload%',
 | 
			
		||||
				text: '%i18n:!@contextmenu.upload%',
 | 
			
		||||
				icon: '%fa:upload%',
 | 
			
		||||
				onClick: this.selectLocalFile
 | 
			
		||||
			}, {
 | 
			
		||||
				type: 'item',
 | 
			
		||||
				text: '%i18n:@contextmenu.url-upload%',
 | 
			
		||||
				text: '%i18n:!@contextmenu.url-upload%',
 | 
			
		||||
				icon: '%fa:cloud-upload-alt%',
 | 
			
		||||
				onClick: this.urlUpload
 | 
			
		||||
			}]);
 | 
			
		||||
@@ -306,15 +306,15 @@ export default Vue.extend({
 | 
			
		||||
					switch (err) {
 | 
			
		||||
						case 'detected-circular-definition':
 | 
			
		||||
							(this as any).apis.dialog({
 | 
			
		||||
								title: '%fa:exclamation-triangle%%i18n:@unable-to-process%',
 | 
			
		||||
								text: '%i18n:@circular-reference-detected%',
 | 
			
		||||
								title: '%fa:exclamation-triangle%%i18n:!@unable-to-process%',
 | 
			
		||||
								text: '%i18n:!@circular-reference-detected%',
 | 
			
		||||
								actions: [{
 | 
			
		||||
									text: '%i18n:common.ok%'
 | 
			
		||||
									text: '%i18n:!common.ok%'
 | 
			
		||||
								}]
 | 
			
		||||
							});
 | 
			
		||||
							break;
 | 
			
		||||
						default:
 | 
			
		||||
							alert('%i18n:@unhandled-error% ' + err);
 | 
			
		||||
							alert('%i18n:!@unhandled-error% ' + err);
 | 
			
		||||
					}
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
@@ -327,8 +327,8 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		urlUpload() {
 | 
			
		||||
			(this as any).apis.input({
 | 
			
		||||
				title: '%i18n:@url-upload%',
 | 
			
		||||
				placeholder: '%i18n:@url-of-file%'
 | 
			
		||||
				title: '%i18n:!@url-upload%',
 | 
			
		||||
				placeholder: '%i18n:!@url-of-file%'
 | 
			
		||||
			}).then(url => {
 | 
			
		||||
				(this as any).api('drive/files/upload_from_url', {
 | 
			
		||||
					url: url,
 | 
			
		||||
@@ -337,9 +337,9 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
				(this as any).apis.dialog({
 | 
			
		||||
					title: '%fa:check%%i18n:@url-upload-requested%',
 | 
			
		||||
					text: '%i18n:@may-take-time%',
 | 
			
		||||
					text: '%i18n:!@may-take-time%',
 | 
			
		||||
					actions: [{
 | 
			
		||||
						text: '%i18n:common.ok%'
 | 
			
		||||
						text: '%i18n:!common.ok%'
 | 
			
		||||
					}]
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
@@ -347,8 +347,8 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		createFolder() {
 | 
			
		||||
			(this as any).apis.input({
 | 
			
		||||
				title: '%i18n:@create-folder%',
 | 
			
		||||
				placeholder: '%i18n:@folder-name%'
 | 
			
		||||
				title: '%i18n:!@create-folder%',
 | 
			
		||||
				placeholder: '%i18n:!@folder-name%'
 | 
			
		||||
			}).then(name => {
 | 
			
		||||
				(this as any).api('drive/folders/create', {
 | 
			
		||||
					name: name,
 | 
			
		||||
 
 | 
			
		||||
@@ -9,9 +9,9 @@
 | 
			
		||||
				<img class="avatar" :src="`${note.user.avatarUrl}?thumbnail&size=32`" alt="avatar"/>
 | 
			
		||||
			</router-link>
 | 
			
		||||
			%fa:retweet%
 | 
			
		||||
			<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
 | 
			
		||||
			<span>{{ '%i18n:!@reposted-by%'.substr(0, '%i18n:!@reposted-by%'.indexOf('{')) }}</span>
 | 
			
		||||
			<a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a>
 | 
			
		||||
			<span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span>
 | 
			
		||||
			<span>{{ '%i18n:!@reposted-by%'.substr('%i18n:!@reposted-by%'.indexOf('}') + 1) }}</span>
 | 
			
		||||
		</p>
 | 
			
		||||
		<mk-time :time="note.createdAt"/>
 | 
			
		||||
	</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -93,7 +93,7 @@
 | 
			
		||||
		</template>
 | 
			
		||||
	</div>
 | 
			
		||||
	<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
 | 
			
		||||
		<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
 | 
			
		||||
		<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:!common.loading%' : '%i18n:!@more%' }}
 | 
			
		||||
	</button>
 | 
			
		||||
	<p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p>
 | 
			
		||||
	<p class="loading" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,8 @@
 | 
			
		||||
		<span :class="$style.icon" v-if="geo">%fa:map-marker-alt%</span>
 | 
			
		||||
		<span v-if="!reply">%i18n:@note%</span>
 | 
			
		||||
		<span v-if="reply">%i18n:@reply%</span>
 | 
			
		||||
		<span :class="$style.count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span>
 | 
			
		||||
		<span :class="$style.count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span>
 | 
			
		||||
		<span :class="$style.count" v-if="media.length != 0">{{ '%i18n:!@attaches%'.replace('{}', media.length) }}</span>
 | 
			
		||||
		<span :class="$style.count" v-if="uploadings.length != 0">{{ '%i18n:!@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span>
 | 
			
		||||
	</span>
 | 
			
		||||
 | 
			
		||||
	<mk-note-preview v-if="reply" :class="$style.notePreview" :note="reply"/>
 | 
			
		||||
 
 | 
			
		||||
@@ -28,9 +28,9 @@
 | 
			
		||||
	<button class="kao" title="%i18n:@insert-a-kao%" @click="kao">%fa:R smile%</button>
 | 
			
		||||
	<button class="poll" title="%i18n:@create-poll%" @click="poll = true">%fa:chart-pie%</button>
 | 
			
		||||
	<button class="geo" title="位置情報を添付する" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button>
 | 
			
		||||
	<p class="text-count" :class="{ over: text.length > 1000 }">{{ '%i18n:@text-remain%'.replace('{}', 1000 - text.length) }}</p>
 | 
			
		||||
	<p class="text-count" :class="{ over: text.length > 1000 }">{{ '%i18n:!@text-remain%'.replace('{}', 1000 - text.length) }}</p>
 | 
			
		||||
	<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>
 | 
			
		||||
	<input ref="file" type="file" accept="image/*" multiple="multiple" tabindex="-1" @change="onChangeFile"/>
 | 
			
		||||
	<div class="dropzone" v-if="draghover"></div>
 | 
			
		||||
@@ -69,17 +69,17 @@ export default Vue.extend({
 | 
			
		||||
		},
 | 
			
		||||
		placeholder(): string {
 | 
			
		||||
			return this.renote
 | 
			
		||||
				? '%i18n:@quote-placeholder%'
 | 
			
		||||
				? '%i18n:!@quote-placeholder%'
 | 
			
		||||
				: this.reply
 | 
			
		||||
					? '%i18n:@reply-placeholder%'
 | 
			
		||||
					: '%i18n:@note-placeholder%';
 | 
			
		||||
					? '%i18n:!@reply-placeholder%'
 | 
			
		||||
					: '%i18n:!@note-placeholder%';
 | 
			
		||||
		},
 | 
			
		||||
		submitText(): string {
 | 
			
		||||
			return this.renote
 | 
			
		||||
				? '%i18n:@renote%'
 | 
			
		||||
				? '%i18n:!@renote%'
 | 
			
		||||
				: this.reply
 | 
			
		||||
					? '%i18n:@reply%'
 | 
			
		||||
					: '%i18n:@note%';
 | 
			
		||||
					? '%i18n:!@reply%'
 | 
			
		||||
					: '%i18n:!@note%';
 | 
			
		||||
		},
 | 
			
		||||
		canPost(): boolean {
 | 
			
		||||
			return !this.posting && (this.text.length != 0 || this.files.length != 0 || this.poll || this.renote);
 | 
			
		||||
@@ -236,16 +236,16 @@ export default Vue.extend({
 | 
			
		||||
				this.deleteDraft();
 | 
			
		||||
				this.$emit('posted');
 | 
			
		||||
				(this as any).apis.notify(this.renote
 | 
			
		||||
					? '%i18n:@reposted%'
 | 
			
		||||
					? '%i18n:!@reposted%'
 | 
			
		||||
					: this.reply
 | 
			
		||||
						? '%i18n:@replied%'
 | 
			
		||||
						: '%i18n:@posted%');
 | 
			
		||||
						? '%i18n:!@replied%'
 | 
			
		||||
						: '%i18n:!@posted%');
 | 
			
		||||
			}).catch(err => {
 | 
			
		||||
				(this as any).apis.notify(this.renote
 | 
			
		||||
					? '%i18n:@renote-failed%'
 | 
			
		||||
					? '%i18n:!@renote-failed%'
 | 
			
		||||
					: this.reply
 | 
			
		||||
						? '%i18n:@reply-failed%'
 | 
			
		||||
						: '%i18n:@note-failed%');
 | 
			
		||||
						? '%i18n:!@reply-failed%'
 | 
			
		||||
						: '%i18n:!@note-failed%');
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				this.posting = false;
 | 
			
		||||
			});
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
		<footer>
 | 
			
		||||
			<a class="quote" v-if="!quote" @click="onQuote">%i18n:@quote%</a>
 | 
			
		||||
			<button class="cancel" @click="cancel">%i18n:@cancel%</button>
 | 
			
		||||
			<button class="ok" @click="ok" :disabled="wait">{{ wait ? '%i18n:@reposting%' : '%i18n:@renote%' }}</button>
 | 
			
		||||
			<button class="ok" @click="ok" :disabled="wait">{{ wait ? '%i18n:!@reposting%' : '%i18n:!@renote%' }}</button>
 | 
			
		||||
		</footer>
 | 
			
		||||
	</template>
 | 
			
		||||
	<template v-if="quote">
 | 
			
		||||
@@ -32,9 +32,9 @@ export default Vue.extend({
 | 
			
		||||
				renoteId: this.note.id
 | 
			
		||||
			}).then(data => {
 | 
			
		||||
				this.$emit('posted');
 | 
			
		||||
				(this as any).apis.notify('%i18n:@success%');
 | 
			
		||||
				(this as any).apis.notify('%i18n:!@success%');
 | 
			
		||||
			}).catch(err => {
 | 
			
		||||
				(this as any).apis.notify('%i18n:@failure%');
 | 
			
		||||
				(this as any).apis.notify('%i18n:!@failure%');
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				this.wait = false;
 | 
			
		||||
			});
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										131
									
								
								src/client/app/desktop/views/components/repost-form.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								src/client/app/desktop/views/components/repost-form.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,131 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="mk-renote-form">
 | 
			
		||||
	<mk-note-preview :note="note"/>
 | 
			
		||||
	<template v-if="!quote">
 | 
			
		||||
		<footer>
 | 
			
		||||
			<a class="quote" v-if="!quote" @click="onQuote">%i18n:desktop.tags.mk-renote-form.quote%</a>
 | 
			
		||||
			<button class="cancel" @click="cancel">%i18n:desktop.tags.mk-renote-form.cancel%</button>
 | 
			
		||||
			<button class="ok" @click="ok" :disabled="wait">{{ wait ? '%i18n:!desktop.tags.mk-renote-form.reposting%' : '%i18n:!desktop.tags.mk-renote-form.renote%' }}</button>
 | 
			
		||||
		</footer>
 | 
			
		||||
	</template>
 | 
			
		||||
	<template v-if="quote">
 | 
			
		||||
		<mk-post-form ref="form" :renote="note" @posted="onChildFormPosted"/>
 | 
			
		||||
	</template>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import Vue from 'vue';
 | 
			
		||||
 | 
			
		||||
export default Vue.extend({
 | 
			
		||||
	props: ['note'],
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			wait: false,
 | 
			
		||||
			quote: false
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
	methods: {
 | 
			
		||||
		ok() {
 | 
			
		||||
			this.wait = true;
 | 
			
		||||
			(this as any).api('notes/create', {
 | 
			
		||||
				renoteId: this.note.id
 | 
			
		||||
			}).then(data => {
 | 
			
		||||
				this.$emit('posted');
 | 
			
		||||
				(this as any).apis.notify('%i18n:!desktop.tags.mk-renote-form.success%');
 | 
			
		||||
			}).catch(err => {
 | 
			
		||||
				(this as any).apis.notify('%i18n:!desktop.tags.mk-renote-form.failure%');
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				this.wait = false;
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
		cancel() {
 | 
			
		||||
			this.$emit('canceled');
 | 
			
		||||
		},
 | 
			
		||||
		onQuote() {
 | 
			
		||||
			this.quote = true;
 | 
			
		||||
 | 
			
		||||
			this.$nextTick(() => {
 | 
			
		||||
				(this.$refs.form as any).focus();
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
		onChildFormPosted() {
 | 
			
		||||
			this.$emit('posted');
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="stylus" scoped>
 | 
			
		||||
@import '~const.styl'
 | 
			
		||||
 | 
			
		||||
.mk-renote-form
 | 
			
		||||
 | 
			
		||||
	> .mk-note-preview
 | 
			
		||||
		margin 16px 22px
 | 
			
		||||
 | 
			
		||||
	> footer
 | 
			
		||||
		height 72px
 | 
			
		||||
		background lighten($theme-color, 95%)
 | 
			
		||||
 | 
			
		||||
		> .quote
 | 
			
		||||
			position absolute
 | 
			
		||||
			bottom 16px
 | 
			
		||||
			left 28px
 | 
			
		||||
			line-height 40px
 | 
			
		||||
 | 
			
		||||
		button
 | 
			
		||||
			display block
 | 
			
		||||
			position absolute
 | 
			
		||||
			bottom 16px
 | 
			
		||||
			cursor pointer
 | 
			
		||||
			padding 0
 | 
			
		||||
			margin 0
 | 
			
		||||
			width 120px
 | 
			
		||||
			height 40px
 | 
			
		||||
			font-size 1em
 | 
			
		||||
			outline none
 | 
			
		||||
			border-radius 4px
 | 
			
		||||
 | 
			
		||||
			&:focus
 | 
			
		||||
				&:after
 | 
			
		||||
					content ""
 | 
			
		||||
					pointer-events none
 | 
			
		||||
					position absolute
 | 
			
		||||
					top -5px
 | 
			
		||||
					right -5px
 | 
			
		||||
					bottom -5px
 | 
			
		||||
					left -5px
 | 
			
		||||
					border 2px solid rgba($theme-color, 0.3)
 | 
			
		||||
					border-radius 8px
 | 
			
		||||
 | 
			
		||||
		> .cancel
 | 
			
		||||
			right 148px
 | 
			
		||||
			color #888
 | 
			
		||||
			background linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%)
 | 
			
		||||
			border solid 1px #e2e2e2
 | 
			
		||||
 | 
			
		||||
			&:hover
 | 
			
		||||
				background linear-gradient(to bottom, #f9f9f9 0%, #ececec 100%)
 | 
			
		||||
				border-color #dcdcdc
 | 
			
		||||
 | 
			
		||||
			&:active
 | 
			
		||||
				background #ececec
 | 
			
		||||
				border-color #dcdcdc
 | 
			
		||||
 | 
			
		||||
		> .ok
 | 
			
		||||
			right 16px
 | 
			
		||||
			font-weight bold
 | 
			
		||||
			color $theme-color-foreground
 | 
			
		||||
			background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%)
 | 
			
		||||
			border solid 1px lighten($theme-color, 15%)
 | 
			
		||||
 | 
			
		||||
			&:hover
 | 
			
		||||
				background linear-gradient(to bottom, lighten($theme-color, 8%) 0%, darken($theme-color, 8%) 100%)
 | 
			
		||||
				border-color $theme-color
 | 
			
		||||
 | 
			
		||||
			&:active
 | 
			
		||||
				background $theme-color
 | 
			
		||||
				border-color $theme-color
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
@@ -34,7 +34,7 @@ export default Vue.extend({
 | 
			
		||||
	methods: {
 | 
			
		||||
		register() {
 | 
			
		||||
			(this as any).apis.input({
 | 
			
		||||
				title: '%i18n:@enter-password%',
 | 
			
		||||
				title: '%i18n:!@enter-password%',
 | 
			
		||||
				type: 'password'
 | 
			
		||||
			}).then(password => {
 | 
			
		||||
				(this as any).api('i/2fa/register', {
 | 
			
		||||
@@ -47,13 +47,13 @@ export default Vue.extend({
 | 
			
		||||
 | 
			
		||||
		unregister() {
 | 
			
		||||
			(this as any).apis.input({
 | 
			
		||||
				title: '%i18n:@enter-password%',
 | 
			
		||||
				title: '%i18n:!@enter-password%',
 | 
			
		||||
				type: 'password'
 | 
			
		||||
			}).then(password => {
 | 
			
		||||
				(this as any).api('i/2fa/unregister', {
 | 
			
		||||
					password: password
 | 
			
		||||
				}).then(() => {
 | 
			
		||||
					(this as any).apis.notify('%i18n:@unregistered%');
 | 
			
		||||
					(this as any).apis.notify('%i18n:!@unregistered%');
 | 
			
		||||
					(this as any).os.i.twoFactorEnabled = false;
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
@@ -63,10 +63,10 @@ export default Vue.extend({
 | 
			
		||||
			(this as any).api('i/2fa/done', {
 | 
			
		||||
				token: this.token
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				(this as any).apis.notify('%i18n:@success%');
 | 
			
		||||
				(this as any).apis.notify('%i18n:!@success%');
 | 
			
		||||
				(this as any).os.i.twoFactorEnabled = true;
 | 
			
		||||
			}).catch(() => {
 | 
			
		||||
				(this as any).apis.notify('%i18n:@failed%');
 | 
			
		||||
				(this as any).apis.notify('%i18n:!@failed%');
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ export default Vue.extend({
 | 
			
		||||
	methods: {
 | 
			
		||||
		regenerateToken() {
 | 
			
		||||
			(this as any).apis.input({
 | 
			
		||||
				title: '%i18n:@enter-password%',
 | 
			
		||||
				title: '%i18n:!@enter-password%',
 | 
			
		||||
				type: 'password'
 | 
			
		||||
			}).then(password => {
 | 
			
		||||
				(this as any).api('i/regenerate_token', {
 | 
			
		||||
 
 | 
			
		||||
@@ -11,21 +11,21 @@ export default Vue.extend({
 | 
			
		||||
	methods: {
 | 
			
		||||
		reset() {
 | 
			
		||||
			(this as any).apis.input({
 | 
			
		||||
				title: '%i18n:@enter-current-password%',
 | 
			
		||||
				title: '%i18n:!@enter-current-password%',
 | 
			
		||||
				type: 'password'
 | 
			
		||||
			}).then(currentPassword => {
 | 
			
		||||
				(this as any).apis.input({
 | 
			
		||||
					title: '%i18n:@enter-new-password%',
 | 
			
		||||
					title: '%i18n:!@enter-new-password%',
 | 
			
		||||
					type: 'password'
 | 
			
		||||
				}).then(newPassword => {
 | 
			
		||||
					(this as any).apis.input({
 | 
			
		||||
						title: '%i18n:@enter-new-password-again%',
 | 
			
		||||
						title: '%i18n:!@enter-new-password-again%',
 | 
			
		||||
						type: 'password'
 | 
			
		||||
					}).then(newPassword2 => {
 | 
			
		||||
						if (newPassword !== newPassword2) {
 | 
			
		||||
							(this as any).apis.dialog({
 | 
			
		||||
								title: null,
 | 
			
		||||
								text: '%i18n:@not-match%',
 | 
			
		||||
								text: '%i18n:!@not-match%',
 | 
			
		||||
								actions: [{
 | 
			
		||||
									text: 'OK'
 | 
			
		||||
								}]
 | 
			
		||||
@@ -36,7 +36,7 @@ export default Vue.extend({
 | 
			
		||||
							currentPasword: currentPassword,
 | 
			
		||||
							newPassword: newPassword
 | 
			
		||||
						}).then(() => {
 | 
			
		||||
							(this as any).apis.notify('%i18n:@changed%');
 | 
			
		||||
							(this as any).apis.notify('%i18n:!@changed%');
 | 
			
		||||
						});
 | 
			
		||||
					});
 | 
			
		||||
				});
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ export default Vue.extend({
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	mounted() {
 | 
			
		||||
		document.title = '%i18n:@title%';
 | 
			
		||||
		document.title = '%i18n:!@title%';
 | 
			
		||||
	},
 | 
			
		||||
	methods: {
 | 
			
		||||
		onSelected(file) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<template>
 | 
			
		||||
<div class="mkw-channel">
 | 
			
		||||
	<template v-if="!props.compact">
 | 
			
		||||
		<p class="title">%fa:tv%{{ channel ? channel.title : '%i18n:@title%' }}</p>
 | 
			
		||||
		<p class="title">%fa:tv%{{ channel ? channel.title : '%i18n:!@title%' }}</p>
 | 
			
		||||
		<button @click="settings" title="%i18n:@settings%">%fa:cog%</button>
 | 
			
		||||
	</template>
 | 
			
		||||
	<p class="get-started" v-if="props.channel == null">%i18n:@get-started%</p>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user