更新ダイアログをHTMLで描画
This commit is contained in:
parent
46d7cee639
commit
50bd1d9a5d
6 changed files with 199 additions and 7 deletions
|
@ -50,6 +50,7 @@ common:
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
ok: "わかった"
|
ok: "わかった"
|
||||||
|
update-available-title: "更新があります"
|
||||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||||
|
|
|
@ -23,11 +23,18 @@ export default async function(mios: MiOS, force = false, silent = false) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
alert('%i18n:common.update-available%'.replace('{newer}', newer).replace('{current}', current));
|
mios.apis.dialog({
|
||||||
|
title: '%i18n:common.update-available-title%',
|
||||||
|
text: '%i18n:common.update-available%'.replace('{newer}', newer).replace('{current}', current)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return newer;
|
return newer;
|
||||||
} else {
|
} else {
|
||||||
|
mios.apis.dialog({
|
||||||
|
title: '%i18n:common.update-available-title%',
|
||||||
|
text: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
|
||||||
|
});
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<template>
|
<template>
|
||||||
<mk-ui>
|
<mk-ui>
|
||||||
<div class="zwwan0di1v4356rmdbjmwnn32tptpdp2" v-if="!fetching" :data-darkmode="$store.state.device.darkmode">
|
<div class="zwwan0di1v4356rmdbjmwnn32tptpdp2" v-if="!fetching" :data-darkmode="$store.state.device.darkmode">
|
||||||
<div class="is-suspended" v-if="user.isSuspended || true">%fa:exclamation-triangle% %i18n:@is-suspended%</div>
|
<div class="is-suspended" v-if="user.isSuspended">%fa:exclamation-triangle% %i18n:@is-suspended%</div>
|
||||||
<div class="is-remote" v-if="user.host != null || true">%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></div>
|
<div class="is-remote" v-if="user.host != null">%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></div>
|
||||||
<main>
|
<main>
|
||||||
<div class="main">
|
<div class="main">
|
||||||
<x-header :user="user"/>
|
<x-header :user="user"/>
|
||||||
|
|
|
@ -1,5 +1,18 @@
|
||||||
export default function(opts) {
|
import OS from '../../mios';
|
||||||
|
import Dialog from '../views/components/dialog.vue';
|
||||||
|
|
||||||
|
export default (os: OS) => opts => {
|
||||||
return new Promise<string>((res, rej) => {
|
return new Promise<string>((res, rej) => {
|
||||||
alert('dialog not implemented yet');
|
const o = opts || {};
|
||||||
|
const d = os.new(Dialog, {
|
||||||
|
title: o.title,
|
||||||
|
text: o.text,
|
||||||
|
modal: o.modal,
|
||||||
|
buttons: o.actions
|
||||||
|
});
|
||||||
|
d.$once('clicked', id => {
|
||||||
|
res(id);
|
||||||
|
});
|
||||||
|
document.body.appendChild(d.$el);
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
|
@ -88,7 +88,7 @@ init((launch) => {
|
||||||
launch(router, os => ({
|
launch(router, os => ({
|
||||||
chooseDriveFolder,
|
chooseDriveFolder,
|
||||||
chooseDriveFile,
|
chooseDriveFile,
|
||||||
dialog,
|
dialog: dialog(os),
|
||||||
input,
|
input,
|
||||||
post: post(os),
|
post: post(os),
|
||||||
notify
|
notify
|
||||||
|
|
171
src/client/app/mobile/views/components/dialog.vue
Normal file
171
src/client/app/mobile/views/components/dialog.vue
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
<template>
|
||||||
|
<div class="mk-dialog">
|
||||||
|
<div class="bg" ref="bg" @click="onBgClick"></div>
|
||||||
|
<div class="main" ref="main">
|
||||||
|
<header v-html="title" :class="$style.header"></header>
|
||||||
|
<div class="body" v-html="text"></div>
|
||||||
|
<div class="buttons">
|
||||||
|
<button v-for="button in buttons" @click="click(button)">{{ button.text }}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import * as anime from 'animejs';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
buttons: {
|
||||||
|
type: Array,
|
||||||
|
default: () => {
|
||||||
|
return [{
|
||||||
|
text: 'OK'
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
(this.$refs.bg as any).style.pointerEvents = 'auto';
|
||||||
|
anime({
|
||||||
|
targets: this.$refs.bg,
|
||||||
|
opacity: 1,
|
||||||
|
duration: 100,
|
||||||
|
easing: 'linear'
|
||||||
|
});
|
||||||
|
|
||||||
|
anime({
|
||||||
|
targets: this.$refs.main,
|
||||||
|
opacity: 1,
|
||||||
|
scale: [1.2, 1],
|
||||||
|
duration: 300,
|
||||||
|
easing: [0, 0.5, 0.5, 1]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
click(button) {
|
||||||
|
this.$emit('clicked', button.id);
|
||||||
|
this.close();
|
||||||
|
},
|
||||||
|
close() {
|
||||||
|
(this.$refs.bg as any).style.pointerEvents = 'none';
|
||||||
|
anime({
|
||||||
|
targets: this.$refs.bg,
|
||||||
|
opacity: 0,
|
||||||
|
duration: 300,
|
||||||
|
easing: 'linear'
|
||||||
|
});
|
||||||
|
|
||||||
|
(this.$refs.main as any).style.pointerEvents = 'none';
|
||||||
|
anime({
|
||||||
|
targets: this.$refs.main,
|
||||||
|
opacity: 0,
|
||||||
|
scale: 0.8,
|
||||||
|
duration: 300,
|
||||||
|
easing: [ 0.5, -0.5, 1, 0.5 ],
|
||||||
|
complete: () => this.$destroy()
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onBgClick() {
|
||||||
|
if (!this.modal) {
|
||||||
|
this.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
.mk-dialog
|
||||||
|
> .bg
|
||||||
|
display block
|
||||||
|
position fixed
|
||||||
|
z-index 8192
|
||||||
|
top 0
|
||||||
|
left 0
|
||||||
|
width 100%
|
||||||
|
height 100%
|
||||||
|
background rgba(#000, 0.7)
|
||||||
|
opacity 0
|
||||||
|
pointer-events none
|
||||||
|
|
||||||
|
> .main
|
||||||
|
display block
|
||||||
|
position fixed
|
||||||
|
z-index 8192
|
||||||
|
top 20%
|
||||||
|
left 0
|
||||||
|
right 0
|
||||||
|
margin 0 auto 0 auto
|
||||||
|
padding 16px
|
||||||
|
width calc(100% - 32px)
|
||||||
|
max-width 300px
|
||||||
|
background #fff
|
||||||
|
opacity 0
|
||||||
|
|
||||||
|
> .body
|
||||||
|
margin 1em 0
|
||||||
|
color #888
|
||||||
|
|
||||||
|
> .buttons
|
||||||
|
> button
|
||||||
|
display inline-block
|
||||||
|
float right
|
||||||
|
margin 0
|
||||||
|
padding 0 10px
|
||||||
|
font-size 1.1em
|
||||||
|
font-weight normal
|
||||||
|
text-decoration none
|
||||||
|
color #888
|
||||||
|
background transparent
|
||||||
|
outline none
|
||||||
|
border none
|
||||||
|
border-radius 0
|
||||||
|
cursor pointer
|
||||||
|
transition color 0.1s ease
|
||||||
|
|
||||||
|
i
|
||||||
|
margin 0 0.375em
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
color $theme-color
|
||||||
|
|
||||||
|
&:active
|
||||||
|
color darken($theme-color, 10%)
|
||||||
|
transition color 0s ease
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style lang="stylus" module>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
.header
|
||||||
|
margin 0 0 1em 0
|
||||||
|
color $theme-color
|
||||||
|
// color #43A4EC
|
||||||
|
font-weight bold
|
||||||
|
|
||||||
|
&:empty
|
||||||
|
display none
|
||||||
|
|
||||||
|
> i
|
||||||
|
margin-right 0.5em
|
||||||
|
|
||||||
|
</style>
|
Loading…
Reference in a new issue