diff options
| author | こぴなたみぽ <syuilotan@yahoo.co.jp> | 2018-02-14 13:26:08 +0900 |
|---|---|---|
| committer | こぴなたみぽ <syuilotan@yahoo.co.jp> | 2018-02-14 13:26:08 +0900 |
| commit | aafc5847560d56dd4fa0997d65f779aece04c643 (patch) | |
| tree | 872febd2f0347c7892d3c0bdbadfb4ae953a2690 /src/web | |
| parent | wip (diff) | |
| download | misskey-aafc5847560d56dd4fa0997d65f779aece04c643.tar.gz misskey-aafc5847560d56dd4fa0997d65f779aece04c643.tar.bz2 misskey-aafc5847560d56dd4fa0997d65f779aece04c643.zip | |
wip
Diffstat (limited to 'src/web')
| -rw-r--r-- | src/web/app/mobile/tags/post-form.tag | 275 | ||||
| -rw-r--r-- | src/web/app/mobile/views/post-form.vue | 204 |
2 files changed, 204 insertions, 275 deletions
diff --git a/src/web/app/mobile/tags/post-form.tag b/src/web/app/mobile/tags/post-form.tag deleted file mode 100644 index a37e2bf388..0000000000 --- a/src/web/app/mobile/tags/post-form.tag +++ /dev/null @@ -1,275 +0,0 @@ -<mk-post-form> - <header> - <button class="cancel" @click="cancel">%fa:times%</button> - <div> - <span v-if="refs.text" class="text-count { over: refs.text.value.length > 1000 }">{ 1000 - refs.text.value.length }</span> - <button class="submit" @click="post">%i18n:mobile.tags.mk-post-form.submit%</button> - </div> - </header> - <div class="form"> - <mk-post-preview v-if="opts.reply" post={ opts.reply }/> - <textarea ref="text" disabled={ wait } oninput={ update } onkeydown={ onkeydown } onpaste={ onpaste } placeholder={ opts.reply ? '%i18n:mobile.tags.mk-post-form.reply-placeholder%' : '%i18n:mobile.tags.mk-post-form.post-placeholder%' }></textarea> - <div class="attaches" show={ files.length != 0 }> - <ul class="files" ref="attaches"> - <li class="file" each={ files } data-id={ id }> - <div class="img" style="background-image: url({ url + '?thumbnail&size=128' })" @click="removeFile"></div> - </li> - </ul> - </div> - <mk-poll-editor v-if="poll" ref="poll" ondestroy={ onPollDestroyed }/> - <mk-uploader ref="uploader"/> - <button ref="upload" @click="selectFile">%fa:upload%</button> - <button ref="drive" @click="selectFileFromDrive">%fa:cloud%</button> - <button class="kao" @click="kao">%fa:R smile%</button> - <button class="poll" @click="addPoll">%fa:chart-pie%</button> - <input ref="file" type="file" accept="image/*" multiple="multiple" onchange={ changeFile }/> - </div> - <style lang="stylus" scoped> - :scope - display block - max-width 500px - width calc(100% - 16px) - margin 8px auto - background #fff - border-radius 8px - box-shadow 0 0 0 1px rgba(0, 0, 0, 0.2) - - @media (min-width 500px) - margin 16px auto - width calc(100% - 32px) - - > header - z-index 1 - height 50px - box-shadow 0 1px 0 0 rgba(0, 0, 0, 0.1) - - > .cancel - width 50px - line-height 50px - font-size 24px - color #555 - - > div - position absolute - top 0 - right 0 - - > .text-count - line-height 50px - color #657786 - - > .submit - margin 8px - padding 0 16px - line-height 34px - color $theme-color-foreground - background $theme-color - border-radius 4px - - &:disabled - opacity 0.7 - - > .form - max-width 500px - margin 0 auto - - > mk-post-preview - padding 16px - - > .attaches - - > .files - display block - margin 0 - padding 4px - list-style none - - &:after - content "" - display block - clear both - - > .file - display block - float left - margin 0 - padding 0 - border solid 4px transparent - - > .img - width 64px - height 64px - background-size cover - background-position center center - - > mk-uploader - margin 8px 0 0 0 - padding 8px - - > [ref='file'] - display none - - > [ref='text'] - display block - padding 12px - margin 0 - width 100% - max-width 100% - min-width 100% - min-height 80px - font-size 16px - color #333 - border none - border-bottom solid 1px #ddd - border-radius 0 - - &:disabled - opacity 0.5 - - > [ref='upload'] - > [ref='drive'] - .kao - .poll - display inline-block - padding 0 - margin 0 - width 48px - height 48px - font-size 20px - color #657786 - background transparent - outline none - border none - border-radius 0 - box-shadow none - - </style> - <script lang="typescript"> - import Sortable from 'sortablejs'; - import getKao from '../../common/scripts/get-kao'; - - this.mixin('api'); - - this.wait = false; - this.uploadings = []; - this.files = []; - this.poll = false; - - this.on('mount', () => { - this.$refs.uploader.on('uploaded', file => { - this.addFile(file); - }); - - this.$refs.uploader.on('change-uploads', uploads => { - this.$emit('change-uploading-files', uploads); - }); - - this.$refs.text.focus(); - - new Sortable(this.$refs.attaches, { - animation: 150 - }); - }); - - this.onkeydown = e => { - if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey)) this.post(); - }; - - this.onpaste = e => { - Array.from(e.clipboardData.items).forEach(item => { - if (item.kind == 'file') { - this.upload(item.getAsFile()); - } - }); - }; - - this.selectFile = () => { - this.$refs.file.click(); - }; - - this.selectFileFromDrive = () => { - const i = riot.mount(document.body.appendChild(document.createElement('mk-drive-selector')), { - multiple: true - })[0]; - i.one('selected', files => { - files.forEach(this.addFile); - }); - }; - - this.changeFile = () => { - Array.from(this.$refs.file.files).forEach(this.upload); - }; - - this.upload = file => { - this.$refs.uploader.upload(file); - }; - - this.addFile = file => { - file._remove = () => { - this.files = this.files.filter(x => x.id != file.id); - this.$emit('change-files', this.files); - this.update(); - }; - - this.files.push(file); - this.$emit('change-files', this.files); - this.update(); - }; - - this.removeFile = e => { - const file = e.item; - this.files = this.files.filter(x => x.id != file.id); - this.$emit('change-files', this.files); - this.update(); - }; - - this.addPoll = () => { - this.poll = true; - }; - - this.onPollDestroyed = () => { - this.update({ - poll: false - }); - }; - - this.post = () => { - this.update({ - wait: true - }); - - const files = []; - - if (this.files.length > 0) { - Array.from(this.$refs.attaches.children).forEach(el => { - const id = el.getAttribute('data-id'); - const file = this.files.find(f => f.id == id); - files.push(file); - }); - } - - this.api('posts/create', { - text: this.$refs.text.value == '' ? undefined : this.$refs.text.value, - media_ids: this.files.length > 0 ? files.map(f => f.id) : undefined, - reply_id: opts.reply ? opts.reply.id : undefined, - poll: this.poll ? this.$refs.poll.get() : undefined - }).then(data => { - this.$emit('post'); - this.$destroy(); - }).catch(err => { - this.update({ - wait: false - }); - }); - }; - - this.cancel = () => { - this.$emit('cancel'); - this.$destroy(); - }; - - this.kao = () => { - this.$refs.text.value += getKao(); - }; - </script> -</mk-post-form> diff --git a/src/web/app/mobile/views/post-form.vue b/src/web/app/mobile/views/post-form.vue new file mode 100644 index 0000000000..49f6a94d8e --- /dev/null +++ b/src/web/app/mobile/views/post-form.vue @@ -0,0 +1,204 @@ +<template> +<div class="mk-post-form"> + <header> + <button class="cancel" @click="cancel">%fa:times%</button> + <div> + <span v-if="refs.text" class="text-count { over: refs.text.value.length > 1000 }">{ 1000 - refs.text.value.length }</span> + <button class="submit" @click="post">%i18n:mobile.tags.mk-post-form.submit%</button> + </div> + </header> + <div class="form"> + <mk-post-preview v-if="opts.reply" post={ opts.reply }/> + <textarea ref="text" disabled={ wait } oninput={ update } onkeydown={ onkeydown } onpaste={ onpaste } placeholder={ opts.reply ? '%i18n:mobile.tags.mk-post-form.reply-placeholder%' : '%i18n:mobile.tags.mk-post-form.post-placeholder%' }></textarea> + <div class="attaches" show={ files.length != 0 }> + <ul class="files" ref="attaches"> + <li class="file" each={ files } data-id={ id }> + <div class="img" style="background-image: url({ url + '?thumbnail&size=128' })" @click="removeFile"></div> + </li> + </ul> + </div> + <mk-poll-editor v-if="poll" ref="poll" ondestroy={ onPollDestroyed }/> + <mk-uploader @uploaded="attachMedia" @change="onChangeUploadings"/> + <button ref="upload" @click="selectFile">%fa:upload%</button> + <button ref="drive" @click="selectFileFromDrive">%fa:cloud%</button> + <button class="kao" @click="kao">%fa:R smile%</button> + <button class="poll" @click="addPoll">%fa:chart-pie%</button> + <input ref="file" type="file" accept="image/*" multiple="multiple" onchange={ changeFile }/> + </div> +</div +</template> + +<script lang="ts"> +import Vue from 'vue'; +import Sortable from 'sortablejs'; +import getKao from '../../common/scripts/get-kao'; + +export default Vue.extend({ + data() { + return { + posting: false, + text: '', + uploadings: [], + files: [], + poll: false + }; + }, + mounted() { + (this.$refs.text as any).focus(); + + new Sortable(this.$refs.attaches, { + animation: 150 + }); + }, + methods: { + attachMedia(driveFile) { + this.files.push(driveFile); + this.$emit('change-attached-media', this.files); + }, + detachMedia(id) { + this.files = this.files.filter(x => x.id != id); + this.$emit('change-attached-media', this.files); + }, + onChangeFile() { + Array.from((this.$refs.file as any).files).forEach(this.upload); + }, + upload(file) { + (this.$refs.uploader as any).upload(file); + }, + onChangeUploadings(uploads) { + this.$emit('change-uploadings', uploads); + }, + clear() { + this.text = ''; + this.files = []; + this.poll = false; + this.$emit('change-attached-media'); + }, + cancel() { + this.$emit('cancel'); + this.$destroy(); + } + } +}); +</script> + +<style lang="stylus" scoped> +.mk-post-form + max-width 500px + width calc(100% - 16px) + margin 8px auto + background #fff + border-radius 8px + box-shadow 0 0 0 1px rgba(0, 0, 0, 0.2) + + @media (min-width 500px) + margin 16px auto + width calc(100% - 32px) + + > header + z-index 1 + height 50px + box-shadow 0 1px 0 0 rgba(0, 0, 0, 0.1) + + > .cancel + width 50px + line-height 50px + font-size 24px + color #555 + + > div + position absolute + top 0 + right 0 + + > .text-count + line-height 50px + color #657786 + + > .submit + margin 8px + padding 0 16px + line-height 34px + color $theme-color-foreground + background $theme-color + border-radius 4px + + &:disabled + opacity 0.7 + + > .form + max-width 500px + margin 0 auto + + > mk-post-preview + padding 16px + + > .attaches + + > .files + display block + margin 0 + padding 4px + list-style none + + &:after + content "" + display block + clear both + + > .file + display block + float left + margin 0 + padding 0 + border solid 4px transparent + + > .img + width 64px + height 64px + background-size cover + background-position center center + + > mk-uploader + margin 8px 0 0 0 + padding 8px + + > [ref='file'] + display none + + > [ref='text'] + display block + padding 12px + margin 0 + width 100% + max-width 100% + min-width 100% + min-height 80px + font-size 16px + color #333 + border none + border-bottom solid 1px #ddd + border-radius 0 + + &:disabled + opacity 0.5 + + > [ref='upload'] + > [ref='drive'] + .kao + .poll + display inline-block + padding 0 + margin 0 + width 48px + height 48px + font-size 20px + color #657786 + background transparent + outline none + border none + border-radius 0 + box-shadow none + +</style> + |