This commit is contained in:
syuilo 2018-02-28 05:43:14 +09:00
parent 0d43e095cb
commit dd232b996a
8 changed files with 103 additions and 111 deletions

View file

@ -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",

View file

@ -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 },
]); ]);

View file

@ -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

View file

@ -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">

View file

@ -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>
<hr>
<div class="apps"> <div class="apps">
<p v-if="fetching">読み込み中</p> <p v-if="fetching">読み込み中</p>
<template v-if="!fetching"> <template v-if="!fetching">
<p v-if="apps.length == 0">アプリなし</p> <b-alert v-if="apps.length == 0">アプリなし</b-alert>
<ul v-else> <b-list-group v-else>
<li v-for="app in apps" :key="app.id"> <b-list-group-item v-for="app in apps" :key="app.id" :to="`/app/${app.id}`">
<router-link :to="`/app/${app.id}`"> {{ app.name }}
<p class="name">{{ app.name }}</p> </b-list-group-item>
</router-link> </b-list-group>
</li>
</ul>
</template> </template>
</div> </div>
</div> </b-card>
</mk-ui>
</template> </template>
<script lang="ts"> <script lang="ts">

View file

@ -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">

View file

@ -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~zA~Z0~9-(ハイフン)が使えます</p> <p class="info" v-if="nidState == 'invalid-format'" style="color:#FF1161">%fa:fw exclamation-triangle%a~zA~Z0~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(() => {

View 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>