Client: Improve API settings
This commit is contained in:
		
							parent
							
								
									5b1cd3bd3c
								
							
						
					
					
						commit
						e0bf522e7f
					
				
					 12 changed files with 200 additions and 301 deletions
				
			
		| 
						 | 
					@ -950,13 +950,20 @@ desktop/views/components/settings.2fa.vue:
 | 
				
			||||||
  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
					  failed: "設定に失敗しました。トークンに誤りがないかご確認ください。"
 | 
				
			||||||
  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
					  info: "次回サインインからは、同様にパスワードに加えてデバイスに表示されているトークンを入力します。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
desktop/views/components/settings.api.vue:
 | 
					common/views/components/api-settings.vue:
 | 
				
			||||||
  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
					  intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
 | 
				
			||||||
  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
					  caution: "アカウントを不正利用される可能性があるため、このトークンは第三者に教えないでください(アプリなどにも入力しないでください)。"
 | 
				
			||||||
  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
					  regeneration-of-token: "万が一このトークンが漏れたりその可能性がある場合はトークンを再生成できます。"
 | 
				
			||||||
  regenerate-token: "トークンを再生成"
 | 
					  regenerate-token: "トークンを再生成"
 | 
				
			||||||
  token: "Token:"
 | 
					  token: "Token:"
 | 
				
			||||||
  enter-password: "パスワードを入力してください"
 | 
					  enter-password: "パスワードを入力してください"
 | 
				
			||||||
 | 
					  console:
 | 
				
			||||||
 | 
					    title: 'APIコンソール'
 | 
				
			||||||
 | 
					    endpoint: 'エンドポイント'
 | 
				
			||||||
 | 
					    parameter: 'パラメータ'
 | 
				
			||||||
 | 
					    send: '送信'
 | 
				
			||||||
 | 
					    sending: '応答待ち'
 | 
				
			||||||
 | 
					    response: '結果'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
desktop/views/components/settings.apps.vue:
 | 
					desktop/views/components/settings.apps.vue:
 | 
				
			||||||
  no-apps: "連携しているアプリケーションはありません"
 | 
					  no-apps: "連携しているアプリケーションはありません"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										319
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										319
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										72
									
								
								src/client/app/common/views/components/api-settings.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								src/client/app/common/views/components/api-settings.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,72 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<ui-card>
 | 
				
			||||||
 | 
						<div slot="title">%fa:key% API</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<section class="fit-top">
 | 
				
			||||||
 | 
							<ui-input :value="$store.state.i.token" readonly>
 | 
				
			||||||
 | 
								<span>%i18n:@token%</span>
 | 
				
			||||||
 | 
							</ui-input>
 | 
				
			||||||
 | 
							<p>%i18n:@intro%</p>
 | 
				
			||||||
 | 
							<ui-info warn>%i18n:@caution%</ui-info>
 | 
				
			||||||
 | 
							<p>%i18n:@regeneration-of-token%</p>
 | 
				
			||||||
 | 
							<ui-button @click="regenerateToken">%fa:sync-alt% %i18n:@regenerate-token%</ui-button>
 | 
				
			||||||
 | 
						</section>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<section>
 | 
				
			||||||
 | 
							<header>%fa:terminal% %i18n:@console.title%</header>
 | 
				
			||||||
 | 
							<ui-input v-model="endpoint">
 | 
				
			||||||
 | 
								<span>%i18n:@console.endpoint%</span>
 | 
				
			||||||
 | 
							</ui-input>
 | 
				
			||||||
 | 
							<ui-textarea v-model="body">
 | 
				
			||||||
 | 
								<span>%i18n:@console.parameter% (JSON or JSON5)</span>
 | 
				
			||||||
 | 
							</ui-textarea>
 | 
				
			||||||
 | 
							<ui-button @click="send" :disabled="sending">
 | 
				
			||||||
 | 
								<template v-if="sending">%i18n:@console.sending%</template>
 | 
				
			||||||
 | 
								<template v-else>%fa:paper-plane% %i18n:@console.send%</template>
 | 
				
			||||||
 | 
							</ui-button>
 | 
				
			||||||
 | 
							<ui-textarea v-if="res" v-model="res">
 | 
				
			||||||
 | 
								<span>%i18n:@console.response%</span>
 | 
				
			||||||
 | 
							</ui-textarea>
 | 
				
			||||||
 | 
						</section>
 | 
				
			||||||
 | 
					</ui-card>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					import * as JSON5 from 'json5';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Vue.extend({
 | 
				
			||||||
 | 
						data() {
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								endpoint: '',
 | 
				
			||||||
 | 
								body: '{}',
 | 
				
			||||||
 | 
								res: null,
 | 
				
			||||||
 | 
								sending: false
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						methods: {
 | 
				
			||||||
 | 
							regenerateToken() {
 | 
				
			||||||
 | 
								(this as any).apis.input({
 | 
				
			||||||
 | 
									title: '%i18n:@enter-password%',
 | 
				
			||||||
 | 
									type: 'password'
 | 
				
			||||||
 | 
								}).then(password => {
 | 
				
			||||||
 | 
									(this as any).api('i/regenerate_token', {
 | 
				
			||||||
 | 
										password: password
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							send() {
 | 
				
			||||||
 | 
								this.sending = true;
 | 
				
			||||||
 | 
								(this as any).api(this.endpoint, JSON5.parse(this.body)).then(res => {
 | 
				
			||||||
 | 
									this.sending = false;
 | 
				
			||||||
 | 
									this.res = JSON5.stringify(res, null, 2);
 | 
				
			||||||
 | 
								}, err => {
 | 
				
			||||||
 | 
									this.sending = false;
 | 
				
			||||||
 | 
									this.res = JSON5.stringify(err, null, 2);
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import apiSettings from './api-settings.vue';
 | 
				
			||||||
import driveSettings from './drive-settings.vue';
 | 
					import driveSettings from './drive-settings.vue';
 | 
				
			||||||
import profileEditor from './profile-editor.vue';
 | 
					import profileEditor from './profile-editor.vue';
 | 
				
			||||||
import noteSkeleton from './note-skeleton.vue';
 | 
					import noteSkeleton from './note-skeleton.vue';
 | 
				
			||||||
| 
						 | 
					@ -44,9 +45,11 @@ import uiTextarea from './ui/textarea.vue';
 | 
				
			||||||
import uiSwitch from './ui/switch.vue';
 | 
					import uiSwitch from './ui/switch.vue';
 | 
				
			||||||
import uiRadio from './ui/radio.vue';
 | 
					import uiRadio from './ui/radio.vue';
 | 
				
			||||||
import uiSelect from './ui/select.vue';
 | 
					import uiSelect from './ui/select.vue';
 | 
				
			||||||
 | 
					import uiInfo from './ui/info.vue';
 | 
				
			||||||
import formButton from './ui/form/button.vue';
 | 
					import formButton from './ui/form/button.vue';
 | 
				
			||||||
import formRadio from './ui/form/radio.vue';
 | 
					import formRadio from './ui/form/radio.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Vue.component('mk-api-settings', apiSettings);
 | 
				
			||||||
Vue.component('mk-drive-settings', driveSettings);
 | 
					Vue.component('mk-drive-settings', driveSettings);
 | 
				
			||||||
Vue.component('mk-profile-editor', profileEditor);
 | 
					Vue.component('mk-profile-editor', profileEditor);
 | 
				
			||||||
Vue.component('mk-note-skeleton', noteSkeleton);
 | 
					Vue.component('mk-note-skeleton', noteSkeleton);
 | 
				
			||||||
| 
						 | 
					@ -91,5 +94,6 @@ Vue.component('ui-textarea', uiTextarea);
 | 
				
			||||||
Vue.component('ui-switch', uiSwitch);
 | 
					Vue.component('ui-switch', uiSwitch);
 | 
				
			||||||
Vue.component('ui-radio', uiRadio);
 | 
					Vue.component('ui-radio', uiRadio);
 | 
				
			||||||
Vue.component('ui-select', uiSelect);
 | 
					Vue.component('ui-select', uiSelect);
 | 
				
			||||||
 | 
					Vue.component('ui-info', uiInfo);
 | 
				
			||||||
Vue.component('form-button', formButton);
 | 
					Vue.component('form-button', formButton);
 | 
				
			||||||
Vue.component('form-radio', formRadio);
 | 
					Vue.component('form-radio', formRadio);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										33
									
								
								src/client/app/common/views/components/ui/info.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/client/app/common/views/components/ui/info.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,33 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<div class="ymxyweixqwsxauxldgpvecjepnwxbylu" :class="{ warn }">
 | 
				
			||||||
 | 
						<i v-if="warn">%fa:exclamation-triangle%</i>
 | 
				
			||||||
 | 
						<slot></slot>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					export default Vue.extend({
 | 
				
			||||||
 | 
						props: {
 | 
				
			||||||
 | 
							warn: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="stylus" scoped>
 | 
				
			||||||
 | 
					.ymxyweixqwsxauxldgpvecjepnwxbylu
 | 
				
			||||||
 | 
						margin 16px 0
 | 
				
			||||||
 | 
						padding 16px
 | 
				
			||||||
 | 
						font-size 90%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> i
 | 
				
			||||||
 | 
							margin-right 4px
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&.warn
 | 
				
			||||||
 | 
							background var(--infoWarnBg)
 | 
				
			||||||
 | 
							color var(--infoWarnFg)
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					@ -66,6 +66,9 @@ export default Vue.extend({
 | 
				
			||||||
root(fill)
 | 
					root(fill)
 | 
				
			||||||
	margin 42px 0 32px 0
 | 
						margin 42px 0 32px 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&:last-child
 | 
				
			||||||
 | 
							margin-bottom 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .input
 | 
						> .input
 | 
				
			||||||
		padding 12px
 | 
							padding 12px
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="2fa">
 | 
					<div class="2fa">
 | 
				
			||||||
	<p>%i18n:@intro%<a href="%i18n:@url%" target="_blank">%i18n:@detail%</a></p>
 | 
						<p>%i18n:@intro%<a href="%i18n:@url%" target="_blank">%i18n:@detail%</a></p>
 | 
				
			||||||
	<div class="ui info warn"><p>%fa:exclamation-triangle%%i18n:@caution%</p></div>
 | 
						<ui-info warn>%i18n:@caution%</ui-info>
 | 
				
			||||||
	<p v-if="!data && !$store.state.i.twoFactorEnabled"><ui-button @click="register">%i18n:@register%</ui-button></p>
 | 
						<p v-if="!data && !$store.state.i.twoFactorEnabled"><ui-button @click="register">%i18n:@register%</ui-button></p>
 | 
				
			||||||
	<template v-if="$store.state.i.twoFactorEnabled">
 | 
						<template v-if="$store.state.i.twoFactorEnabled">
 | 
				
			||||||
		<p>%i18n:@already-registered%</p>
 | 
							<p>%i18n:@already-registered%</p>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,40 +0,0 @@
 | 
				
			||||||
<template>
 | 
					 | 
				
			||||||
<div class="root api">
 | 
					 | 
				
			||||||
	<ui-input :value="$store.state.i.token" readonly>
 | 
					 | 
				
			||||||
		<span>%i18n:@token%</span>
 | 
					 | 
				
			||||||
	</ui-input>
 | 
					 | 
				
			||||||
	<p>%i18n:@intro%</p>
 | 
					 | 
				
			||||||
	<div class="ui info warn"><p>%fa:exclamation-triangle%%i18n:@caution%</p></div>
 | 
					 | 
				
			||||||
	<p>%i18n:@regeneration-of-token%</p>
 | 
					 | 
				
			||||||
	<ui-button @click="regenerateToken">%i18n:@regenerate-token%</ui-button>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
</template>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<script lang="ts">
 | 
					 | 
				
			||||||
import Vue from 'vue';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default Vue.extend({
 | 
					 | 
				
			||||||
	methods: {
 | 
					 | 
				
			||||||
		regenerateToken() {
 | 
					 | 
				
			||||||
			(this as any).apis.input({
 | 
					 | 
				
			||||||
				title: '%i18n:@enter-password%',
 | 
					 | 
				
			||||||
				type: 'password'
 | 
					 | 
				
			||||||
			}).then(password => {
 | 
					 | 
				
			||||||
				(this as any).api('i/regenerate_token', {
 | 
					 | 
				
			||||||
					password: password
 | 
					 | 
				
			||||||
				});
 | 
					 | 
				
			||||||
			});
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<style lang="stylus" scoped>
 | 
					 | 
				
			||||||
.root.api
 | 
					 | 
				
			||||||
	code
 | 
					 | 
				
			||||||
		display inline-block
 | 
					 | 
				
			||||||
		padding 4px 6px
 | 
					 | 
				
			||||||
		color #555
 | 
					 | 
				
			||||||
		background #eee
 | 
					 | 
				
			||||||
		border-radius 2px
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -235,12 +235,9 @@
 | 
				
			||||||
			</section>
 | 
								</section>
 | 
				
			||||||
		</ui-card>
 | 
							</ui-card>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		<ui-card class="api" v-show="page == 'api'">
 | 
							<div class="api" v-show="page == 'api'">
 | 
				
			||||||
			<div slot="title">%fa:key% API</div>
 | 
								<mk-api-settings/>
 | 
				
			||||||
			<section class="fit-top">
 | 
							</div>
 | 
				
			||||||
				<x-api/>
 | 
					 | 
				
			||||||
			</section>
 | 
					 | 
				
			||||||
		</ui-card>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		<ui-card class="other" v-show="page == 'other'">
 | 
							<ui-card class="other" v-show="page == 'other'">
 | 
				
			||||||
			<div slot="title">%fa:info-circle% %i18n:@about%</div>
 | 
								<div slot="title">%fa:info-circle% %i18n:@about%</div>
 | 
				
			||||||
| 
						 | 
					@ -295,7 +292,6 @@ import Vue from 'vue';
 | 
				
			||||||
import XMute from './settings.mute.vue';
 | 
					import XMute from './settings.mute.vue';
 | 
				
			||||||
import XPassword from './settings.password.vue';
 | 
					import XPassword from './settings.password.vue';
 | 
				
			||||||
import X2fa from './settings.2fa.vue';
 | 
					import X2fa from './settings.2fa.vue';
 | 
				
			||||||
import XApi from './settings.api.vue';
 | 
					 | 
				
			||||||
import XApps from './settings.apps.vue';
 | 
					import XApps from './settings.apps.vue';
 | 
				
			||||||
import XSignins from './settings.signins.vue';
 | 
					import XSignins from './settings.signins.vue';
 | 
				
			||||||
import XTags from './settings.tags.vue';
 | 
					import XTags from './settings.tags.vue';
 | 
				
			||||||
| 
						 | 
					@ -307,7 +303,6 @@ export default Vue.extend({
 | 
				
			||||||
		XMute,
 | 
							XMute,
 | 
				
			||||||
		XPassword,
 | 
							XPassword,
 | 
				
			||||||
		X2fa,
 | 
							X2fa,
 | 
				
			||||||
		XApi,
 | 
					 | 
				
			||||||
		XApps,
 | 
							XApps,
 | 
				
			||||||
		XSignins,
 | 
							XSignins,
 | 
				
			||||||
		XTags
 | 
							XTags
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -120,6 +120,8 @@
 | 
				
			||||||
				</section>
 | 
									</section>
 | 
				
			||||||
			</ui-card>
 | 
								</ui-card>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<mk-api-settings />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			<ui-card>
 | 
								<ui-card>
 | 
				
			||||||
				<div slot="title">%fa:sync-alt% %i18n:@update%</div>
 | 
									<div slot="title">%fa:sync-alt% %i18n:@update%</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -131,6 +131,9 @@
 | 
				
			||||||
		remoteInfoBg: '#42321c',
 | 
							remoteInfoBg: '#42321c',
 | 
				
			||||||
		remoteInfoFg: '#ffbd3e',
 | 
							remoteInfoFg: '#ffbd3e',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							infoWarnBg: '#42321c',
 | 
				
			||||||
 | 
							infoWarnFg: '#ffbd3e',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		messagingRoomBg: '@bg',
 | 
							messagingRoomBg: '@bg',
 | 
				
			||||||
		messagingRoomInfo: '#fff',
 | 
							messagingRoomInfo: '#fff',
 | 
				
			||||||
		messagingRoomDateDividerLine: 'rgba(255, 255, 255, 0.1)',
 | 
							messagingRoomDateDividerLine: 'rgba(255, 255, 255, 0.1)',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -131,6 +131,9 @@
 | 
				
			||||||
		remoteInfoBg: '#fff0db',
 | 
							remoteInfoBg: '#fff0db',
 | 
				
			||||||
		remoteInfoFg: '#573c08',
 | 
							remoteInfoFg: '#573c08',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							infoWarnBg: '#fff0db',
 | 
				
			||||||
 | 
							infoWarnFg: '#573c08',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		messagingRoomBg: '#fff',
 | 
							messagingRoomBg: '#fff',
 | 
				
			||||||
		messagingRoomInfo: '#000',
 | 
							messagingRoomInfo: '#000',
 | 
				
			||||||
		messagingRoomDateDividerLine: 'rgba(0, 0, 0, 0.1)',
 | 
							messagingRoomDateDividerLine: 'rgba(0, 0, 0, 0.1)',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue