✌️
This commit is contained in:
		
							parent
							
								
									0d43e095cb
								
							
						
					
					
						commit
						dd232b996a
					
				
					 8 changed files with 103 additions and 111 deletions
				
			
		| 
						 | 
					@ -82,6 +82,7 @@
 | 
				
			||||||
		"autwh": "0.0.1",
 | 
							"autwh": "0.0.1",
 | 
				
			||||||
		"bcryptjs": "2.4.3",
 | 
							"bcryptjs": "2.4.3",
 | 
				
			||||||
		"body-parser": "1.18.2",
 | 
							"body-parser": "1.18.2",
 | 
				
			||||||
 | 
							"bootstrap-vue": "^2.0.0-rc.1",
 | 
				
			||||||
		"cache-loader": "1.2.0",
 | 
							"cache-loader": "1.2.0",
 | 
				
			||||||
		"cafy": "3.2.1",
 | 
							"cafy": "3.2.1",
 | 
				
			||||||
		"chai": "4.1.2",
 | 
							"chai": "4.1.2",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,11 @@
 | 
				
			||||||
 * Developer Center
 | 
					 * Developer Center
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					import BootstrapVue from 'bootstrap-vue';
 | 
				
			||||||
 | 
					import 'bootstrap/dist/css/bootstrap.css';
 | 
				
			||||||
 | 
					import 'bootstrap-vue/dist/bootstrap-vue.css';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Style
 | 
					// Style
 | 
				
			||||||
import './style.styl';
 | 
					import './style.styl';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,6 +16,11 @@ import Index from './views/index.vue';
 | 
				
			||||||
import Apps from './views/apps.vue';
 | 
					import Apps from './views/apps.vue';
 | 
				
			||||||
import AppNew from './views/new-app.vue';
 | 
					import AppNew from './views/new-app.vue';
 | 
				
			||||||
import App from './views/app.vue';
 | 
					import App from './views/app.vue';
 | 
				
			||||||
 | 
					import ui from './views/ui.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Vue.use(BootstrapVue);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Vue.component('mk-ui', ui);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * init
 | 
					 * init
 | 
				
			||||||
| 
						 | 
					@ -22,7 +32,7 @@ init(launch => {
 | 
				
			||||||
	// Routing
 | 
						// Routing
 | 
				
			||||||
	app.$router.addRoutes([
 | 
						app.$router.addRoutes([
 | 
				
			||||||
		{ path: '/', component: Index },
 | 
							{ path: '/', component: Index },
 | 
				
			||||||
		{ path: '/app', component: Apps },
 | 
							{ path: '/apps', component: Apps },
 | 
				
			||||||
		{ path: '/app/new', component: AppNew },
 | 
							{ path: '/app/new', component: AppNew },
 | 
				
			||||||
		{ path: '/app/:id', component: App },
 | 
							{ path: '/app/:id', component: App },
 | 
				
			||||||
	]);
 | 
						]);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,10 @@
 | 
				
			||||||
@import "../app"
 | 
					@import "../app"
 | 
				
			||||||
@import "../reset"
 | 
					@import "../reset"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Bootstrapのデザインを崩すので:
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
						position initial
 | 
				
			||||||
 | 
						background-clip initial !important
 | 
				
			||||||
 | 
					
 | 
				
			||||||
html
 | 
					html
 | 
				
			||||||
	background-color #fff
 | 
						background-color #fff
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,16 +1,12 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div>
 | 
					<mk-ui>
 | 
				
			||||||
	<p v-if="fetching">読み込み中</p>
 | 
						<p v-if="fetching">読み込み中</p>
 | 
				
			||||||
	<main v-if="!fetching">
 | 
						<b-card v-if="!fetching" :header="app.name">
 | 
				
			||||||
		<header>
 | 
							<b-form-group label="App Secret">
 | 
				
			||||||
			<h1>{{ app.name }}</h1>
 | 
								<b-input :value="app.secret" readonly/>
 | 
				
			||||||
		</header>
 | 
							</b-form-group>
 | 
				
			||||||
		<div class="body">
 | 
						</b-card>
 | 
				
			||||||
			<p>App Secret</p>
 | 
					</mk-ui>
 | 
				
			||||||
			<input :value="app.secret" readonly/>
 | 
					 | 
				
			||||||
		</div>
 | 
					 | 
				
			||||||
	</main>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,21 +1,21 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div>
 | 
					<mk-ui>
 | 
				
			||||||
	<h1>アプリを管理</h1>
 | 
						<b-card header="アプリを管理">
 | 
				
			||||||
	<router-link to="/app/new">アプリ作成</router-link>
 | 
							<b-button to="/app/new" variant="primary">アプリ作成</b-button>
 | 
				
			||||||
	<div class="apps">
 | 
							<hr>
 | 
				
			||||||
		<p v-if="fetching">読み込み中</p>
 | 
							<div class="apps">
 | 
				
			||||||
		<template v-if="!fetching">
 | 
								<p v-if="fetching">読み込み中</p>
 | 
				
			||||||
			<p v-if="apps.length == 0">アプリなし</p>
 | 
								<template v-if="!fetching">
 | 
				
			||||||
			<ul v-else>
 | 
									<b-alert v-if="apps.length == 0">アプリなし</b-alert>
 | 
				
			||||||
				<li v-for="app in apps" :key="app.id">
 | 
									<b-list-group v-else>
 | 
				
			||||||
					<router-link :to="`/app/${app.id}`">
 | 
										<b-list-group-item v-for="app in apps" :key="app.id" :to="`/app/${app.id}`">
 | 
				
			||||||
						<p class="name">{{ app.name }}</p>
 | 
											{{ app.name }}
 | 
				
			||||||
					</router-link>
 | 
										</b-list-group-item>
 | 
				
			||||||
				</li>
 | 
									</b-list-group>
 | 
				
			||||||
			</ul>
 | 
								</template>
 | 
				
			||||||
		</template>
 | 
							</div>
 | 
				
			||||||
	</div>
 | 
						</b-card>
 | 
				
			||||||
</div>
 | 
					</mk-ui>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div>
 | 
					<mk-ui>
 | 
				
			||||||
	<router-link to="/app">アプリ</router-link>
 | 
						<b-button to="/apps" variant="primary">アプリの管理</b-button>
 | 
				
			||||||
</div>
 | 
					</mk-ui>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,16 +1,12 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div>
 | 
					<mk-ui>
 | 
				
			||||||
	<form @submit="onSubmit" autocomplete="off">
 | 
						<b-card header="アプリケーションの作成">
 | 
				
			||||||
		<section class="name">
 | 
							<b-form @submit.prevent="onSubmit" autocomplete="off">
 | 
				
			||||||
			<label>
 | 
								<b-form-group label="アプリケーション名" description="あなたのアプリの名称。">
 | 
				
			||||||
				<p class="caption">アプリケーション名</p>
 | 
									<b-form-input v-model="name" type="text" placeholder="ex) Misskey for iOS" autocomplete="off" required/>
 | 
				
			||||||
				<input v-model="name" type="text" placeholder="ex) Misskey for iOS" autocomplete="off" required/>
 | 
								</b-form-group>
 | 
				
			||||||
			</label>
 | 
								<b-form-group label="ID" description="あなたのアプリのID。">
 | 
				
			||||||
		</section>
 | 
									<b-input v-model="nid" type="text" pattern="^[a-zA-Z0-9-]{3,30}$" placeholder="ex) misskey-for-ios" autocomplete="off" required/>
 | 
				
			||||||
		<section class="nid">
 | 
					 | 
				
			||||||
			<label>
 | 
					 | 
				
			||||||
				<p class="caption">Named ID</p>
 | 
					 | 
				
			||||||
				<input v-model="nid" type="text" pattern="^[a-zA-Z0-9-]{3,30}$" placeholder="ex) misskey-for-ios" autocomplete="off" required/>
 | 
					 | 
				
			||||||
				<p class="info" v-if="nidState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%確認しています...</p>
 | 
									<p class="info" v-if="nidState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%確認しています...</p>
 | 
				
			||||||
				<p class="info" v-if="nidState == 'ok'" style="color:#3CB7B5">%fa:fw check%利用できます</p>
 | 
									<p class="info" v-if="nidState == 'ok'" style="color:#3CB7B5">%fa:fw check%利用できます</p>
 | 
				
			||||||
				<p class="info" v-if="nidState == 'unavailable'" style="color:#FF1161">%fa:fw exclamation-triangle%既に利用されています</p>
 | 
									<p class="info" v-if="nidState == 'unavailable'" style="color:#FF1161">%fa:fw exclamation-triangle%既に利用されています</p>
 | 
				
			||||||
| 
						 | 
					@ -18,65 +14,34 @@
 | 
				
			||||||
				<p class="info" v-if="nidState == 'invalid-format'" style="color:#FF1161">%fa:fw exclamation-triangle%a~z、A~Z、0~9、-(ハイフン)が使えます</p>
 | 
									<p class="info" v-if="nidState == 'invalid-format'" style="color:#FF1161">%fa:fw exclamation-triangle%a~z、A~Z、0~9、-(ハイフン)が使えます</p>
 | 
				
			||||||
				<p class="info" v-if="nidState == 'min-range'" style="color:#FF1161">%fa:fw exclamation-triangle%3文字以上でお願いします!</p>
 | 
									<p class="info" v-if="nidState == 'min-range'" style="color:#FF1161">%fa:fw exclamation-triangle%3文字以上でお願いします!</p>
 | 
				
			||||||
				<p class="info" v-if="nidState == 'max-range'" style="color:#FF1161">%fa:fw exclamation-triangle%30文字以内でお願いします</p>
 | 
									<p class="info" v-if="nidState == 'max-range'" style="color:#FF1161">%fa:fw exclamation-triangle%30文字以内でお願いします</p>
 | 
				
			||||||
			</label>
 | 
								</b-form-group>
 | 
				
			||||||
		</section>
 | 
								<b-form-group label="アプリの概要" description="あなたのアプリの簡単な説明や紹介。">
 | 
				
			||||||
		<section class="description">
 | 
									<b-textarea v-model="description" placeholder="ex) Misskey iOSクライアント。" autocomplete="off" required></b-textarea>
 | 
				
			||||||
			<label>
 | 
								</b-form-group>
 | 
				
			||||||
				<p class="caption">アプリの概要</p>
 | 
								<b-form-group label="コールバックURL (オプション)" description="ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。">
 | 
				
			||||||
				<textarea v-model="description" placeholder="ex) Misskey iOSクライアント。" autocomplete="off" required></textarea>
 | 
									<b-input v-model="cb" type="url" placeholder="ex) https://your.app.example.com/callback.php" autocomplete="off"/>
 | 
				
			||||||
			</label>
 | 
								</b-form-group>
 | 
				
			||||||
		</section>
 | 
								<b-card header="権限">
 | 
				
			||||||
		<section class="callback">
 | 
									<b-form-group description="ここで要求した機能だけがAPIからアクセスできます。">
 | 
				
			||||||
			<label>
 | 
										<b-alert show variant="warning">%fa:exclamation-triangle%アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。</b-alert>
 | 
				
			||||||
				<p class="caption">コールバックURL (オプション)</p>
 | 
										<b-form-checkbox-group v-model="permission" stacked>
 | 
				
			||||||
				<input v-model="cb" type="url" placeholder="ex) https://your.app.example.com/callback.php" autocomplete="off"/>
 | 
											<b-form-checkbox value="account-read">アカウントの情報を見る。</b-form-checkbox>
 | 
				
			||||||
			</label>
 | 
											<b-form-checkbox value="account-write">アカウントの情報を操作する。</b-form-checkbox>
 | 
				
			||||||
		</section>
 | 
											<b-form-checkbox value="post-write">投稿する。</b-form-checkbox>
 | 
				
			||||||
		<section class="permission">
 | 
											<b-form-checkbox value="reaction-write">リアクションしたりリアクションをキャンセルする。</b-form-checkbox>
 | 
				
			||||||
			<p class="caption">権限</p>
 | 
											<b-form-checkbox value="following-write">フォローしたりフォロー解除する。</b-form-checkbox>
 | 
				
			||||||
			<div ref="permission">
 | 
											<b-form-checkbox value="drive-read">ドライブを見る。</b-form-checkbox>
 | 
				
			||||||
				<label>
 | 
											<b-form-checkbox value="drive-write">ドライブを操作する。</b-form-checkbox>
 | 
				
			||||||
					<input type="checkbox" value="account-read"/>
 | 
											<b-form-checkbox value="notification-read">通知を見る。</b-form-checkbox>
 | 
				
			||||||
					<p>アカウントの情報を見る。</p>
 | 
											<b-form-checkbox value="notification-write">通知を操作する。</b-form-checkbox>
 | 
				
			||||||
				</label>
 | 
										</b-form-checkbox-group>
 | 
				
			||||||
				<label>
 | 
									</b-form-group>
 | 
				
			||||||
					<input type="checkbox" value="account-write"/>
 | 
								</b-card>
 | 
				
			||||||
					<p>アカウントの情報を操作する。</p>
 | 
								<hr>
 | 
				
			||||||
				</label>
 | 
								<b-button type="submit" variant="primary">アプリ作成</b-button>
 | 
				
			||||||
				<label>
 | 
							</b-form>
 | 
				
			||||||
					<input type="checkbox" value="post-write"/>
 | 
						</b-card>
 | 
				
			||||||
					<p>投稿する。</p>
 | 
					</mk-ui>
 | 
				
			||||||
				</label>
 | 
					 | 
				
			||||||
				<label>
 | 
					 | 
				
			||||||
					<input type="checkbox" value="reaction-write"/>
 | 
					 | 
				
			||||||
					<p>リアクションしたりリアクションをキャンセルする。</p>
 | 
					 | 
				
			||||||
				</label>
 | 
					 | 
				
			||||||
				<label>
 | 
					 | 
				
			||||||
					<input type="checkbox" value="following-write"/>
 | 
					 | 
				
			||||||
					<p>フォローしたりフォロー解除する。</p>
 | 
					 | 
				
			||||||
				</label>
 | 
					 | 
				
			||||||
				<label>
 | 
					 | 
				
			||||||
					<input type="checkbox" value="drive-read"/>
 | 
					 | 
				
			||||||
					<p>ドライブを見る。</p>
 | 
					 | 
				
			||||||
				</label>
 | 
					 | 
				
			||||||
				<label>
 | 
					 | 
				
			||||||
					<input type="checkbox" value="drive-write"/>
 | 
					 | 
				
			||||||
					<p>ドライブを操作する。</p>
 | 
					 | 
				
			||||||
				</label>
 | 
					 | 
				
			||||||
				<label>
 | 
					 | 
				
			||||||
					<input type="checkbox" value="notification-read"/>
 | 
					 | 
				
			||||||
					<p>通知を見る。</p>
 | 
					 | 
				
			||||||
				</label>
 | 
					 | 
				
			||||||
				<label>
 | 
					 | 
				
			||||||
					<input type="checkbox" value="notification-write"/>
 | 
					 | 
				
			||||||
					<p>通知を操作する。</p>
 | 
					 | 
				
			||||||
				</label>
 | 
					 | 
				
			||||||
			</div>
 | 
					 | 
				
			||||||
			<p>%fa:exclamation-triangle%アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。</p>
 | 
					 | 
				
			||||||
		</section>
 | 
					 | 
				
			||||||
		<button type="submit">アプリ作成</button>
 | 
					 | 
				
			||||||
	</form>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
| 
						 | 
					@ -88,7 +53,8 @@ export default Vue.extend({
 | 
				
			||||||
			nid: '',
 | 
								nid: '',
 | 
				
			||||||
			description: '',
 | 
								description: '',
 | 
				
			||||||
			cb: '',
 | 
								cb: '',
 | 
				
			||||||
			nidState: null
 | 
								nidState: null,
 | 
				
			||||||
 | 
								permission: []
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	watch: {
 | 
						watch: {
 | 
				
			||||||
| 
						 | 
					@ -122,18 +88,12 @@ export default Vue.extend({
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	methods: {
 | 
						methods: {
 | 
				
			||||||
		onSubmit() {
 | 
							onSubmit() {
 | 
				
			||||||
			const permission = [];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			(this.$refs.permission as any).querySelectorAll('input').forEach(el => {
 | 
					 | 
				
			||||||
				if (el.checked) permission.push(el.value);
 | 
					 | 
				
			||||||
			});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			(this as any).api('app/create', {
 | 
								(this as any).api('app/create', {
 | 
				
			||||||
				name: this.name,
 | 
									name: this.name,
 | 
				
			||||||
				name_id: this.nid,
 | 
									name_id: this.nid,
 | 
				
			||||||
				description: this.description,
 | 
									description: this.description,
 | 
				
			||||||
				callback_url: this.cb,
 | 
									callback_url: this.cb,
 | 
				
			||||||
				permission: permission
 | 
									permission: this.permission
 | 
				
			||||||
			}).then(() => {
 | 
								}).then(() => {
 | 
				
			||||||
				location.href = '/apps';
 | 
									location.href = '/apps';
 | 
				
			||||||
			}).catch(() => {
 | 
								}).catch(() => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										20
									
								
								src/web/app/dev/views/ui.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/web/app/dev/views/ui.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<div>
 | 
				
			||||||
 | 
						<b-navbar toggleable="md" type="dark" variant="info">
 | 
				
			||||||
 | 
							<b-navbar-brand>Misskey Developers</b-navbar-brand>
 | 
				
			||||||
 | 
							<b-navbar-nav>
 | 
				
			||||||
 | 
								<b-nav-item to="/">Home</b-nav-item>
 | 
				
			||||||
 | 
								<b-nav-item to="/apps">Apps</b-nav-item>
 | 
				
			||||||
 | 
							</b-navbar-nav>
 | 
				
			||||||
 | 
						</b-navbar>
 | 
				
			||||||
 | 
						<main>
 | 
				
			||||||
 | 
							<slot></slot>
 | 
				
			||||||
 | 
						</main>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="stylus" scoped>
 | 
				
			||||||
 | 
					main
 | 
				
			||||||
 | 
						padding 32px
 | 
				
			||||||
 | 
						max-width 700px
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue