Improve drive information

This commit is contained in:
syuilo 2018-10-25 11:30:30 +09:00
parent 0206a4ac83
commit 7dde3465e2
No known key found for this signature in database
GPG Key ID: BDC4C49D06AB9D69
13 changed files with 192 additions and 61 deletions

View File

@ -64,6 +64,7 @@ common:
month-and-day: "{month}月 {day}日" month-and-day: "{month}月 {day}日"
trash: "ゴミ箱" trash: "ゴミ箱"
drive: "ドライブ"
weekday-short: weekday-short:
sunday: "日" sunday: "日"
@ -642,7 +643,6 @@ desktop/views/components/crop-window.vue:
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "使用中"
drive: "ドライブ"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "アイコン"
@ -675,9 +675,6 @@ desktop/views/components/drive.folder.vue:
rename-folder: "フォルダ名の変更" rename-folder: "フォルダ名の変更"
input-new-folder-name: "新しいフォルダ名を入力してください" input-new-folder-name: "新しいフォルダ名を入力してください"
desktop/views/components/drive.nav-folder.vue:
drive: "ドライブ"
desktop/views/components/drive.vue: desktop/views/components/drive.vue:
search: "検索" search: "検索"
load-more: "もっと読み込む" load-more: "もっと読み込む"
@ -836,7 +833,6 @@ desktop/views/components/settings.vue:
notification: "通知" notification: "通知"
apps: "アプリ" apps: "アプリ"
mute: "ミュート" mute: "ミュート"
drive: "ドライブ"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
@ -965,9 +961,10 @@ desktop/views/components/settings.api.vue:
desktop/views/components/settings.apps.vue: desktop/views/components/settings.apps.vue:
no-apps: "連携しているアプリケーションはありません" no-apps: "連携しているアプリケーションはありません"
desktop/views/components/settings.drive.vue: common/views/components/drive-settings.vue:
max: "中" max: "中"
in-use: "使用中" in-use: "使用中"
stats: "統計"
desktop/views/components/settings.mute.vue: desktop/views/components/settings.mute.vue:
no-users: "ミュートしているユーザーはいません" no-users: "ミュートしているユーザーはいません"
@ -1008,7 +1005,6 @@ desktop/views/components/ui.header.vue:
desktop/views/components/ui.header.account.vue: desktop/views/components/ui.header.account.vue:
profile: "プロフィール" profile: "プロフィール"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
lists: "リスト" lists: "リスト"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
@ -1063,7 +1059,6 @@ desktop/views/components/window.vue:
desktop/views/pages/admin/admin.vue: desktop/views/pages/admin/admin.vue:
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
drive: "ドライブ"
users: "ユーザー" users: "ユーザー"
update: "更新" update: "更新"
announcements: "お知らせ" announcements: "お知らせ"
@ -1251,7 +1246,6 @@ desktop/views/widgets/users.vue:
no-one: "いません!" no-one: "いません!"
mobile/views/components/drive.vue: mobile/views/components/drive.vue:
drive: "ドライブ"
used: "使用中" used: "使用中"
folder-count: "フォルダ" folder-count: "フォルダ"
count-separator: "、" count-separator: "、"
@ -1375,7 +1369,6 @@ mobile/views/components/ui.nav.vue:
messaging: "メッセージ" messaging: "メッセージ"
follow-requests: "フォロー申請" follow-requests: "フォロー申請"
search: "検索" search: "検索"
drive: "ドライブ"
favorites: "お気に入り" favorites: "お気に入り"
user-lists: "リスト" user-lists: "リスト"
widgets: "ウィジェット" widgets: "ウィジェット"
@ -1403,7 +1396,6 @@ mobile/views/pages/user-lists.vue:
enter-list-name: "リスト名を入力してください" enter-list-name: "リスト名を入力してください"
mobile/views/pages/drive.vue: mobile/views/pages/drive.vue:
drive: "ドライブ"
more: "もっと見る" more: "もっと見る"
mobile/views/pages/signup.vue: mobile/views/pages/signup.vue:

View File

@ -0,0 +1,174 @@
<template>
<ui-card>
<div slot="title">%fa:cloud% %i18n:common.drive%</div>
<section v-if="!fetching" class="juakhbxthdewydyreaphkepoxgxvfogn">
<div class="meter"><div :style="meterStyle"></div></div>
<p><b>{{ capacity | bytes }}</b>%i18n:@max%<b>{{ usage | bytes }}</b>%i18n:@in-use%</p>
</section>
<section>
<header>%i18n:@stats%</header>
<div ref="chart" style="margin-bottom: -16px; color: #000;"></div>
</section>
</ui-card>
</template>
<script lang="ts">
import Vue from 'vue';
import * as tinycolor from 'tinycolor2';
import * as ApexCharts from 'apexcharts';
export default Vue.extend({
data() {
return {
fetching: true,
usage: null,
capacity: null
};
},
computed: {
meterStyle(): any {
return {
width: `${this.usage / this.capacity * 100}%`,
background: tinycolor({
h: 180 - (this.usage / this.capacity * 180),
s: 0.7,
l: 0.5
})
};
}
},
mounted() {
(this as any).api('drive').then(info => {
this.capacity = info.capacity;
this.usage = info.usage;
this.fetching = false;
this.$nextTick(() => {
this.renderChart();
});
});
},
methods: {
renderChart() {
(this as any).api('charts/user/drive', {
userId: this.$store.state.i.id,
span: 'day',
limit: 21
}).then(stats => {
const addition = [];
const deletion = [];
const now = new Date();
const y = now.getFullYear();
const m = now.getMonth();
const d = now.getDate();
for (let i = 0; i < 21; i++) {
const x = new Date(y, m, d - i);
addition.push([
x,
stats.incSize[i]
]);
deletion.push([
x,
-stats.decSize[i]
]);
}
const chart = new ApexCharts(this.$refs.chart, {
chart: {
type: 'bar',
stacked: true,
height: 150,
zoom: {
enabled: false
}
},
plotOptions: {
bar: {
columnWidth: '90%',
endingShape: 'rounded'
}
},
grid: {
clipMarkers: false,
borderColor: 'rgba(0, 0, 0, 0.1)'
},
tooltip: {
shared: true,
intersect: false
},
dataLabels: {
enabled: false
},
legend: {
show: false
},
series: [{
name: 'Additions',
data: addition
}, {
name: 'Deletions',
data: deletion
}],
xaxis: {
type: 'datetime',
labels: {
style: {
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
}
},
axisBorder: {
color: 'rgba(0, 0, 0, 0.1)'
},
axisTicks: {
color: 'rgba(0, 0, 0, 0.1)'
},
crosshairs: {
width: 1,
opacity: 1
}
},
yaxis: {
labels: {
formatter: v => Vue.filter('bytes')(v, 0),
style: {
color: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
}
}
}
});
chart.render();
});
}
}
});
</script>
<style lang="stylus" scoped>
.juakhbxthdewydyreaphkepoxgxvfogn
> .meter
$size = 12px
margin-bottom 16px
background rgba(0, 0, 0, 0.1)
border-radius ($size / 2)
overflow hidden
> div
height $size
border-radius ($size / 2)
> p
margin 0
> b
margin 0 8px
</style>

View File

@ -1,5 +1,6 @@
import Vue from 'vue'; import Vue from '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';
import theme from './theme.vue'; import theme from './theme.vue';
@ -46,6 +47,7 @@ import uiSelect from './ui/select.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-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);
Vue.component('mk-theme', theme); Vue.component('mk-theme', theme);

View File

@ -2,7 +2,7 @@
<mk-window ref="window" @closed="destroyDom" width="800px" height="500px" :popout-url="popout"> <mk-window ref="window" @closed="destroyDom" width="800px" height="500px" :popout-url="popout">
<template slot="header"> <template slot="header">
<p v-if="usage" :class="$style.info"><b>{{ usage.toFixed(1) }}%</b> %i18n:@used%</p> <p v-if="usage" :class="$style.info"><b>{{ usage.toFixed(1) }}%</b> %i18n:@used%</p>
<span :class="$style.title">%fa:cloud%%i18n:@drive%</span> <span :class="$style.title">%fa:cloud%%i18n:common.drive%</span>
</template> </template>
<mk-drive :class="$style.browser" multiple :init-folder="folder" ref="browser"/> <mk-drive :class="$style.browser" multiple :init-folder="folder" ref="browser"/>
</mk-window> </mk-window>

View File

@ -8,7 +8,7 @@
@drop.stop="onDrop" @drop.stop="onDrop"
> >
<template v-if="folder == null">%fa:cloud%</template> <template v-if="folder == null">%fa:cloud%</template>
<span>{{ folder == null ? '%i18n:@drive%' : folder.name }}</span> <span>{{ folder == null ? '%i18n:common.drive%' : folder.name }}</span>
</div> </div>
</template> </template>

View File

@ -1,34 +0,0 @@
<template>
<div class="root">
<template v-if="!fetching">
<p><b>{{ capacity | bytes }}</b>%i18n:@max%<b>{{ usage | bytes }}</b>%i18n:@in-use%</p>
</template>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
data() {
return {
fetching: true,
usage: null,
capacity: null
};
},
mounted() {
(this as any).api('drive').then(info => {
this.capacity = info.capacity;
this.usage = info.usage;
this.fetching = false;
});
}
});
</script>
<style lang="stylus" scoped>
.root
> p
> b
margin 0 8px
</style>

View File

@ -5,7 +5,7 @@
<p :class="{ active: page == 'theme' }" @mousedown="page = 'theme'">%fa:palette .fw%%i18n:@theme%</p> <p :class="{ active: page == 'theme' }" @mousedown="page = 'theme'">%fa:palette .fw%%i18n:@theme%</p>
<p :class="{ active: page == 'web' }" @mousedown="page = 'web'">%fa:desktop .fw%Web</p> <p :class="{ active: page == 'web' }" @mousedown="page = 'web'">%fa:desktop .fw%Web</p>
<p :class="{ active: page == 'notification' }" @mousedown="page = 'notification'">%fa:R bell .fw%%i18n:@notification%</p> <p :class="{ active: page == 'notification' }" @mousedown="page = 'notification'">%fa:R bell .fw%%i18n:@notification%</p>
<p :class="{ active: page == 'drive' }" @mousedown="page = 'drive'">%fa:cloud .fw%%i18n:@drive%</p> <p :class="{ active: page == 'drive' }" @mousedown="page = 'drive'">%fa:cloud .fw%%i18n:common.drive%</p>
<p :class="{ active: page == 'hashtags' }" @mousedown="page = 'hashtags'">%fa:hashtag .fw%%i18n:@tags%</p> <p :class="{ active: page == 'hashtags' }" @mousedown="page = 'hashtags'">%fa:hashtag .fw%%i18n:@tags%</p>
<p :class="{ active: page == 'mute' }" @mousedown="page = 'mute'">%fa:ban .fw%%i18n:@mute%</p> <p :class="{ active: page == 'mute' }" @mousedown="page = 'mute'">%fa:ban .fw%%i18n:@mute%</p>
<p :class="{ active: page == 'apps' }" @mousedown="page = 'apps'">%fa:puzzle-piece .fw%%i18n:@apps%</p> <p :class="{ active: page == 'apps' }" @mousedown="page = 'apps'">%fa:puzzle-piece .fw%%i18n:@apps%</p>
@ -189,12 +189,9 @@
</section> </section>
</ui-card> </ui-card>
<ui-card class="drive" v-show="page == 'drive'"> <div class="drive" v-if="page == 'drive'">
<div slot="title">%fa:cloud% %i18n:@drive%</div> <mk-drive-settings/>
<section> </div>
<x-drive/>
</section>
</ui-card>
<ui-card class="hashtags" v-show="page == 'hashtags'"> <ui-card class="hashtags" v-show="page == 'hashtags'">
<div slot="title">%fa:hashtag% %i18n:@tags%</div> <div slot="title">%fa:hashtag% %i18n:@tags%</div>
@ -301,7 +298,6 @@ import X2fa from './settings.2fa.vue';
import XApi from './settings.api.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 XDrive from './settings.drive.vue';
import XTags from './settings.tags.vue'; import XTags from './settings.tags.vue';
import { url, langs, version } from '../../../config'; import { url, langs, version } from '../../../config';
import checkForUpdate from '../../../common/scripts/check-for-update'; import checkForUpdate from '../../../common/scripts/check-for-update';
@ -314,7 +310,6 @@ export default Vue.extend({
XApi, XApi,
XApps, XApps,
XSignins, XSignins,
XDrive,
XTags XTags
}, },
props: { props: {

View File

@ -11,7 +11,7 @@
<router-link :to="`/@${ $store.state.i.username }`">%fa:user%<span>%i18n:@profile%</span>%fa:angle-right%</router-link> <router-link :to="`/@${ $store.state.i.username }`">%fa:user%<span>%i18n:@profile%</span>%fa:angle-right%</router-link>
</li> </li>
<li @click="drive"> <li @click="drive">
<p>%fa:cloud%<span>%i18n:@drive%</span>%fa:angle-right%</p> <p>%fa:cloud%<span>%i18n:common.drive%</span>%fa:angle-right%</p>
</li> </li>
<li> <li>
<router-link to="/i/favorites">%fa:star%<span>%i18n:@favorites%</span>%fa:angle-right%</router-link> <router-link to="/i/favorites">%fa:star%<span>%i18n:@favorites%</span>%fa:angle-right%</router-link>

View File

@ -13,7 +13,7 @@
<li v-if="this.$store.state.i && this.$store.state.i.isAdmin" <li v-if="this.$store.state.i && this.$store.state.i.isAdmin"
@click="nav('hashtags')" :class="{ active: page == 'hashtags' }">%fa:hashtag .fw%%i18n:@hashtags%</li> @click="nav('hashtags')" :class="{ active: page == 'hashtags' }">%fa:hashtag .fw%%i18n:@hashtags%</li>
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:@drive%</li> --> <!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:common.drive%</li> -->
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> --> <!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
</ul> </ul>
</nav> </nav>

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="kmmwchoexgckptowjmjgfsygeltxfeqs"> <div class="kmmwchoexgckptowjmjgfsygeltxfeqs">
<nav ref="nav"> <nav ref="nav">
<a @click.prevent="goRoot()" href="/i/drive">%fa:cloud%%i18n:@drive%</a> <a @click.prevent="goRoot()" href="/i/drive">%fa:cloud%%i18n:common.drive%</a>
<template v-for="folder in hierarchyFolders"> <template v-for="folder in hierarchyFolders">
<span :key="folder.id + '>'">%fa:angle-right%</span> <span :key="folder.id + '>'">%fa:angle-right%</span>
<a :key="folder.id" @click.prevent="cd(folder)" :href="`/i/drive/folder/${folder.id}`">{{ folder.name }}</a> <a :key="folder.id" @click.prevent="cd(folder)" :href="`/i/drive/folder/${folder.id}`">{{ folder.name }}</a>

View File

@ -25,7 +25,7 @@
<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:R calendar-alt%%i18n:@widgets%%fa:angle-right%</router-link></li> <li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:R calendar-alt%%i18n:@widgets%%fa:angle-right%</router-link></li>
<li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'">%fa:star%%i18n:@favorites%%fa:angle-right%</router-link></li> <li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'">%fa:star%%i18n:@favorites%%fa:angle-right%</router-link></li>
<li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'">%fa:list%%i18n:@user-lists%%fa:angle-right%</router-link></li> <li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'">%fa:list%%i18n:@user-lists%%fa:angle-right%</router-link></li>
<li><router-link to="/i/drive" :data-active="$route.name == 'drive'">%fa:cloud%%i18n:@drive%%fa:angle-right%</router-link></li> <li><router-link to="/i/drive" :data-active="$route.name == 'drive'">%fa:cloud%%i18n:common.drive%%fa:angle-right%</router-link></li>
</ul> </ul>
<ul> <ul>
<li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li> <li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li>

View File

@ -3,7 +3,7 @@
<span slot="header"> <span slot="header">
<template v-if="folder"><span style="margin-right:4px;">%fa:R folder-open%</span>{{ folder.name }}</template> <template v-if="folder"><span style="margin-right:4px;">%fa:R folder-open%</span>{{ folder.name }}</template>
<template v-if="file"><mk-file-type-icon data-icon :type="file.type" style="margin-right:4px;"/>{{ file.name }}</template> <template v-if="file"><mk-file-type-icon data-icon :type="file.type" style="margin-right:4px;"/>{{ file.name }}</template>
<template v-if="!folder && !file"><span style="margin-right:4px;">%fa:cloud%</span>%i18n:@drive%</template> <template v-if="!folder && !file"><span style="margin-right:4px;">%fa:cloud%</span>%i18n:common.drive%</template>
</span> </span>
<template slot="func"><button @click="fn">%fa:ellipsis-h%</button></template> <template slot="func"><button @click="fn">%fa:ellipsis-h%</button></template>
<mk-drive <mk-drive

View File

@ -80,6 +80,8 @@
</section> </section>
</ui-card> </ui-card>
<mk-drive-settings/>
<ui-card> <ui-card>
<div slot="title">%fa:volume-up% %i18n:@sound%</div> <div slot="title">%fa:volume-up% %i18n:@sound%</div>