なんかもうめっちゃやった
This commit is contained in:
parent
d94b3757be
commit
66f3a155e6
6 changed files with 199 additions and 169 deletions
|
@ -78,7 +78,7 @@ export default Vue.extend({
|
|||
cursor wait !important
|
||||
|
||||
> .avatar
|
||||
margin 16px auto 0 auto
|
||||
margin 0 auto 0 auto
|
||||
width 64px
|
||||
height 64px
|
||||
background #ddd
|
||||
|
|
|
@ -42,15 +42,7 @@ export default define({
|
|||
},
|
||||
mounted() {
|
||||
(this as any).os.getMeta().then(meta => {
|
||||
let broadcasts = [];
|
||||
if (meta.broadcasts) {
|
||||
meta.broadcasts.forEach(broadcast => {
|
||||
if (broadcast[lang]) {
|
||||
broadcasts.push(broadcast[lang]);
|
||||
}
|
||||
});
|
||||
}
|
||||
this.broadcasts = broadcasts;
|
||||
this.broadcasts = meta.broadcasts;
|
||||
this.fetching = false;
|
||||
});
|
||||
},
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
<template>
|
||||
<div class="qldxjjsrseehkusjuoooapmsprvfrxyl mk-admin-card">
|
||||
<header>%i18n:@announcements%</header>
|
||||
<textarea v-model="broadcasts"></textarea>
|
||||
<button class="ui" @click="save">%i18n:@save%</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from "vue";
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
broadcasts: '',
|
||||
};
|
||||
},
|
||||
created() {
|
||||
(this as any).os.getMeta().then(meta => {
|
||||
this.broadcasts = JSON.stringify(meta.broadcasts, null, ' ');
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
save() {
|
||||
(this as any).api('admin/update-meta', {
|
||||
broadcasts: JSON.parse(this.broadcasts)
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
@import '~const.styl'
|
||||
|
||||
.qldxjjsrseehkusjuoooapmsprvfrxyl
|
||||
textarea
|
||||
width 100%
|
||||
min-height 300px
|
||||
|
||||
</style>
|
|
@ -4,6 +4,7 @@
|
|||
<ul>
|
||||
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }">%fa:chalkboard .fw%%i18n:@dashboard%</li>
|
||||
<li @click="nav('users')" :class="{ active: page == 'users' }">%fa:users .fw%%i18n:@users%</li>
|
||||
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }">%fa:broadcast-tower .fw%%i18n:@announcements%</li>
|
||||
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:@drive%</li> -->
|
||||
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
|
||||
</ul>
|
||||
|
@ -13,6 +14,9 @@
|
|||
<x-dashboard/>
|
||||
<x-charts/>
|
||||
</div>
|
||||
<div v-show="page == 'announcements'">
|
||||
<x-announcements/>
|
||||
</div>
|
||||
<div v-if="page == 'users'">
|
||||
<x-suspend-user/>
|
||||
<x-unsuspend-user/>
|
||||
|
@ -28,6 +32,7 @@
|
|||
<script lang="ts">
|
||||
import Vue from "vue";
|
||||
import XDashboard from "./admin.dashboard.vue";
|
||||
import XAnnouncements from "./admin.announcements.vue";
|
||||
import XSuspendUser from "./admin.suspend-user.vue";
|
||||
import XUnsuspendUser from "./admin.unsuspend-user.vue";
|
||||
import XVerifyUser from "./admin.verify-user.vue";
|
||||
|
@ -37,6 +42,7 @@ import XCharts from "../../components/charts.vue";
|
|||
export default Vue.extend({
|
||||
components: {
|
||||
XDashboard,
|
||||
XAnnouncements,
|
||||
XSuspendUser,
|
||||
XUnsuspendUser,
|
||||
XVerifyUser,
|
||||
|
|
|
@ -1,46 +1,60 @@
|
|||
<template>
|
||||
<div class="mk-welcome">
|
||||
<img ref="pointer" class="pointer" src="/assets/pointer.png" alt="">
|
||||
<button @click="dark">
|
||||
<template v-if="$store.state.device.darkmode">%fa:moon%</template>
|
||||
<template v-else>%fa:R moon%</template>
|
||||
</button>
|
||||
|
||||
<mk-forkit class="forkit"/>
|
||||
|
||||
<div class="body">
|
||||
<div class="container">
|
||||
<div class="main">
|
||||
<h1 v-if="name != 'Misskey'">{{ name }}</h1>
|
||||
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1>
|
||||
|
||||
<div class="info">
|
||||
<span><b>{{ host }}</b></span>
|
||||
<span><b>{{ host }}</b> - <span v-html="'%i18n:@powered-by-misskey%'"></span></span>
|
||||
<span class="stats" v-if="stats">
|
||||
<span>%fa:user% {{ stats.originalUsersCount | number }}</span>
|
||||
<span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span>
|
||||
</span>
|
||||
</div>
|
||||
<main>
|
||||
<div class="about">
|
||||
<h1 v-if="name != 'Misskey'">{{ name }}</h1>
|
||||
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1>
|
||||
<p class="powerd-by" v-if="name != 'Misskey'" v-html="'%i18n:@powered-by-misskey%'"></p>
|
||||
|
||||
<p class="desc" v-html="description || '%i18n:common.about%'"></p>
|
||||
<a ref="signup" @click="signup">📦 %i18n:@signup%</a>
|
||||
</div>
|
||||
<div class="login">
|
||||
<mk-signin/>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<p class="sign">
|
||||
<span class="signup" @click="signup">%i18n:@signup%</span>
|
||||
<span class="divider">|</span>
|
||||
<span class="signin" @click="signin">%i18n:@signin%</span>
|
||||
</p>
|
||||
|
||||
<div class="hashtags">
|
||||
<router-link v-for="tag in tags" :key="tag" :to="`/tags/${ tag }`" :title="tag">#{{ tag }}</router-link>
|
||||
</div>
|
||||
<mk-nav class="nav"/>
|
||||
</div>
|
||||
<mk-forkit class="forkit"/>
|
||||
<img src="assets/title.dark.svg" :alt="name">
|
||||
</div>
|
||||
<div class="tl">
|
||||
<mk-welcome-timeline :max="20"/>
|
||||
</div>
|
||||
|
||||
<modal name="signup" width="500px" height="auto" scrollable>
|
||||
<header :class="$style.signupFormHeader">%i18n:@signup%</header>
|
||||
<mk-signup :class="$style.signupForm"/>
|
||||
<div class="broadcasts">
|
||||
<div v-for="broadcast in broadcasts">
|
||||
<h1 v-html="broadcast.title"></h1>
|
||||
<div v-html="broadcast.text"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="nav">
|
||||
<mk-nav class="nav"/>
|
||||
</div>
|
||||
|
||||
<mk-welcome-timeline class="tl" :max="20"/>
|
||||
</div>
|
||||
|
||||
<modal name="signup" :class="$store.state.device.darkmode ? 'modal-dark' : 'modal-light'" width="450px" height="auto" scrollable>
|
||||
<header class="formHeader">%i18n:@signup%</header>
|
||||
<mk-signup class="form"/>
|
||||
</modal>
|
||||
|
||||
<modal name="signin" :class="$store.state.device.darkmode ? 'modal-dark' : 'modal-light'" width="450px" height="auto" scrollable>
|
||||
<header class="formHeader">%i18n:@signin%</header>
|
||||
<mk-signin class="form"/>
|
||||
</modal>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -57,7 +71,7 @@ export default Vue.extend({
|
|||
host,
|
||||
name: 'Misskey',
|
||||
description: '',
|
||||
pointerInterval: null,
|
||||
broadcasts: [],
|
||||
tags: []
|
||||
};
|
||||
},
|
||||
|
@ -65,6 +79,7 @@ export default Vue.extend({
|
|||
(this as any).os.getMeta().then(meta => {
|
||||
this.name = meta.name;
|
||||
this.description = meta.description;
|
||||
this.broadcasts = meta.broadcasts;
|
||||
});
|
||||
|
||||
(this as any).api('stats').then(stats => {
|
||||
|
@ -75,19 +90,7 @@ export default Vue.extend({
|
|||
this.tags = stats.map(x => x.tag);
|
||||
});
|
||||
},
|
||||
mounted() {
|
||||
this.point();
|
||||
this.pointerInterval = setInterval(this.point, 100);
|
||||
},
|
||||
beforeDestroy() {
|
||||
clearInterval(this.pointerInterval);
|
||||
},
|
||||
methods: {
|
||||
point() {
|
||||
const x = this.$refs.signup.getBoundingClientRect();
|
||||
this.$refs.pointer.style.top = x.top + x.height + 'px';
|
||||
this.$refs.pointer.style.left = x.left + 'px';
|
||||
},
|
||||
signup() {
|
||||
this.$modal.show('signup');
|
||||
},
|
||||
|
@ -104,11 +107,40 @@ export default Vue.extend({
|
|||
});
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#wait {
|
||||
right: auto;
|
||||
left: 15px;
|
||||
}
|
||||
<style lang="stylus">
|
||||
#wait
|
||||
right auto
|
||||
left 15px
|
||||
|
||||
.v--modal-overlay
|
||||
background rgba(0, 0, 0, 0.4)
|
||||
|
||||
.modal-light
|
||||
.v--modal-box
|
||||
color #777
|
||||
|
||||
.formHeader
|
||||
border-bottom solid 1px #eee
|
||||
|
||||
.modal-dark
|
||||
.v--modal-box
|
||||
background #313543
|
||||
color #fff
|
||||
|
||||
.formHeader
|
||||
border-bottom solid 1px rgba(#000, 0.2)
|
||||
|
||||
.modal-light
|
||||
.modal-dark
|
||||
.form
|
||||
padding 24px 48px 48px 48px
|
||||
|
||||
.formHeader
|
||||
text-align center
|
||||
padding 48px 0 12px 0
|
||||
margin 0 48px
|
||||
font-size 1.5em
|
||||
|
||||
</style>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
|
@ -117,122 +149,85 @@ export default Vue.extend({
|
|||
root(isDark)
|
||||
display flex
|
||||
min-height 100vh
|
||||
|
||||
> .pointer
|
||||
display block
|
||||
position absolute
|
||||
z-index 1
|
||||
top 0
|
||||
right 0
|
||||
width 180px
|
||||
margin 0 0 0 -180px
|
||||
transform rotateY(180deg) translateX(-10px) translateY(-48px)
|
||||
pointer-events none
|
||||
|
||||
> button
|
||||
position fixed
|
||||
z-index 1
|
||||
top 0
|
||||
left 0
|
||||
padding 16px
|
||||
font-size 18px
|
||||
color #fff
|
||||
|
||||
display none // TODO
|
||||
|
||||
> .body
|
||||
flex 1
|
||||
padding 64px 0 0 0
|
||||
text-align center
|
||||
background #578394
|
||||
background-position center
|
||||
background-size cover
|
||||
|
||||
&:before
|
||||
content ''
|
||||
display block
|
||||
position absolute
|
||||
top 0
|
||||
left 0
|
||||
right 0
|
||||
bottom 0
|
||||
background rgba(#000, 0.5)
|
||||
//background-color #00070F
|
||||
//background-image url('/assets/bg.jpg')
|
||||
//background-position center
|
||||
//background-size cover
|
||||
|
||||
> .forkit
|
||||
position absolute
|
||||
top 0
|
||||
right 0
|
||||
|
||||
> img
|
||||
position absolute
|
||||
bottom 16px
|
||||
right 16px
|
||||
width 150px
|
||||
> button
|
||||
position fixed
|
||||
z-index 1
|
||||
bottom 64px
|
||||
left 64px
|
||||
padding 16px
|
||||
font-size 18px
|
||||
color isDark ? #fff : #444
|
||||
|
||||
> .container
|
||||
$aboutWidth = 380px
|
||||
$loginWidth = 340px
|
||||
$width = $aboutWidth + $loginWidth
|
||||
> .body
|
||||
display grid
|
||||
grid-template-rows 0.5fr 0.5fr 64px
|
||||
grid-template-columns 1fr 350px
|
||||
gap 16px
|
||||
width 100%
|
||||
max-width 1200px
|
||||
height 100vh
|
||||
margin 0 auto
|
||||
padding 64px
|
||||
|
||||
> *
|
||||
color isDark ? #fff : #444
|
||||
background isDark ? #313543 : #fff
|
||||
box-shadow 0 3px 8px rgba(0, 0, 0, 0.2)
|
||||
//border-radius 8px
|
||||
overflow auto
|
||||
|
||||
> .main
|
||||
grid-row 1
|
||||
grid-column 1
|
||||
padding 32px
|
||||
|
||||
> h1
|
||||
margin 0
|
||||
|
||||
> img
|
||||
margin -8px 0 0 -16px
|
||||
max-width 280px
|
||||
|
||||
> .info
|
||||
margin 0 auto 16px auto
|
||||
width $width
|
||||
font-size 14px
|
||||
color #fff
|
||||
|
||||
> .stats
|
||||
margin-left 16px
|
||||
padding-left 16px
|
||||
border-left solid 1px #fff
|
||||
border-left solid 1px isDark ? #fff : #444
|
||||
|
||||
> *
|
||||
margin-right 16px
|
||||
|
||||
> main
|
||||
display flex
|
||||
margin auto
|
||||
width $width
|
||||
border-radius 8px
|
||||
overflow hidden
|
||||
box-shadow 0 2px 8px rgba(#000, 0.3)
|
||||
> .sign
|
||||
font-size 120%
|
||||
|
||||
> .about
|
||||
width $aboutWidth
|
||||
color #444
|
||||
background #fff
|
||||
> .divider
|
||||
margin 0 16px
|
||||
|
||||
> h1
|
||||
margin 0 0 16px 0
|
||||
padding 32px 32px 0 32px
|
||||
color #444
|
||||
> .signin
|
||||
> .signup
|
||||
cursor pointer
|
||||
|
||||
> img
|
||||
width 170px
|
||||
vertical-align bottom
|
||||
|
||||
> .powerd-by
|
||||
margin 16px
|
||||
opacity 0.7
|
||||
|
||||
> .desc
|
||||
margin 0
|
||||
padding 0 32px 16px 32px
|
||||
|
||||
> a
|
||||
display inline-block
|
||||
margin 0 0 32px 0
|
||||
font-weight bold
|
||||
|
||||
> .login
|
||||
width $loginWidth
|
||||
padding 16px 32px 32px 32px
|
||||
background isDark ? #2e3440 : #f5f5f5
|
||||
&:hover
|
||||
color $theme-color
|
||||
|
||||
> .hashtags
|
||||
margin 16px auto
|
||||
width $width
|
||||
font-size 14px
|
||||
color #fff
|
||||
background rgba(#000, 0.3)
|
||||
border-radius 8px
|
||||
|
||||
|
@ -240,20 +235,32 @@ root(isDark)
|
|||
display inline-block
|
||||
margin 14px
|
||||
|
||||
> .broadcasts
|
||||
grid-row 2
|
||||
grid-column 1
|
||||
padding 32px
|
||||
|
||||
> div
|
||||
padding 0 0 16px 0
|
||||
margin 0 0 16px 0
|
||||
border-bottom 1px solid isDark ? rgba(#000, 0.2) : rgba(#000, 0.05)
|
||||
|
||||
> h1
|
||||
margin 0
|
||||
font-size 1.5em
|
||||
|
||||
> .nav
|
||||
display block
|
||||
margin 16px 0
|
||||
display flex
|
||||
justify-content center
|
||||
align-items center
|
||||
grid-row 3
|
||||
grid-column 1
|
||||
font-size 14px
|
||||
color #fff
|
||||
|
||||
> .tl
|
||||
margin 0
|
||||
width 410px
|
||||
height 100vh
|
||||
grid-row 1 / 4
|
||||
grid-column 2
|
||||
text-align left
|
||||
background isDark ? #313543 : #fff
|
||||
|
||||
> *
|
||||
max-height 100%
|
||||
overflow auto
|
||||
|
||||
|
@ -264,29 +271,3 @@ root(isDark)
|
|||
root(false)
|
||||
|
||||
</style>
|
||||
|
||||
<style lang="stylus" module>
|
||||
.signupForm
|
||||
padding 24px 48px 48px 48px
|
||||
|
||||
.signupFormHeader
|
||||
padding 48px 0 12px 0
|
||||
margin: 0 48px
|
||||
font-size 1.5em
|
||||
color #777
|
||||
border-bottom solid 1px #eee
|
||||
|
||||
.signinForm
|
||||
padding 24px 48px 48px 48px
|
||||
|
||||
.signinFormHeader
|
||||
padding 48px 0 12px 0
|
||||
margin: 0 48px
|
||||
font-size 1.5em
|
||||
color #777
|
||||
border-bottom solid 1px #eee
|
||||
|
||||
.nav
|
||||
a
|
||||
color #666
|
||||
</style>
|
||||
|
|
|
@ -11,11 +11,17 @@ export const meta = {
|
|||
requireAdmin: true,
|
||||
|
||||
params: {
|
||||
broadcasts: $.arr($.obj()).optional.nullable.note({
|
||||
desc: {
|
||||
'ja-JP': 'ブロードキャスト'
|
||||
}
|
||||
}),
|
||||
|
||||
disableRegistration: $.bool.optional.nullable.note({
|
||||
desc: {
|
||||
'ja-JP': '招待制か否か'
|
||||
}
|
||||
}),
|
||||
})
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -25,6 +31,10 @@ export default (params: any) => new Promise(async (res, rej) => {
|
|||
|
||||
const set = {} as any;
|
||||
|
||||
if (ps.broadcasts) {
|
||||
set.broadcasts = ps.broadcasts;
|
||||
}
|
||||
|
||||
if (typeof ps.disableRegistration === 'boolean') {
|
||||
set.disableRegistration = ps.disableRegistration;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue