diff options
Diffstat (limited to 'src/web/app')
| -rw-r--r-- | src/web/app/desktop/views/components/drive.file.vue (renamed from src/web/app/desktop/views/components/drive-file.vue) | 6 | ||||
| -rw-r--r-- | src/web/app/desktop/views/components/drive.folder.vue (renamed from src/web/app/desktop/views/components/drive-folder.vue) | 6 | ||||
| -rw-r--r-- | src/web/app/desktop/views/components/drive.nav-folder.vue (renamed from src/web/app/desktop/views/components/drive-nav-folder.vue) | 4 | ||||
| -rw-r--r-- | src/web/app/desktop/views/components/drive.vue | 16 | ||||
| -rw-r--r-- | src/web/app/desktop/views/components/index.ts | 6 | ||||
| -rw-r--r-- | src/web/app/init.ts | 34 | ||||
| -rw-r--r-- | src/web/app/mobile/views/components/index.ts | 2 | ||||
| -rw-r--r-- | src/web/app/mobile/views/components/timeline.vue | 24 | ||||
| -rw-r--r-- | src/web/app/mobile/views/components/user-timeline.vue | 40 | ||||
| -rw-r--r-- | src/web/app/mobile/views/pages/user.vue | 8 | ||||
| -rw-r--r-- | src/web/app/mobile/views/pages/user/home.vue | 2 |
11 files changed, 96 insertions, 52 deletions
diff --git a/src/web/app/desktop/views/components/drive-file.vue b/src/web/app/desktop/views/components/drive.file.vue index ffdf7ef57e..cc423477e9 100644 --- a/src/web/app/desktop/views/components/drive-file.vue +++ b/src/web/app/desktop/views/components/drive.file.vue @@ -1,5 +1,5 @@ <template> -<div class="mk-drive-file" +<div class="root file" :data-is-selected="isSelected" :data-is-contextmenu-showing="isContextmenuShowing" @click="onClick" @@ -51,7 +51,7 @@ export default Vue.extend({ }, background(): string { return this.file.properties.average_color - ? `rgb(${this.file.properties.average_color.join(',')})'` + ? `rgb(${this.file.properties.average_color.join(',')})` : 'transparent'; } }, @@ -188,7 +188,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -.mk-drive-file +.root.file padding 8px 0 0 0 height 180px border-radius 4px diff --git a/src/web/app/desktop/views/components/drive-folder.vue b/src/web/app/desktop/views/components/drive.folder.vue index efb9df30f8..4e57d1ca66 100644 --- a/src/web/app/desktop/views/components/drive-folder.vue +++ b/src/web/app/desktop/views/components/drive.folder.vue @@ -1,5 +1,5 @@ <template> -<div class="mk-drive-folder" +<div class="root folder" :data-is-contextmenu-showing="isContextmenuShowing" :data-draghover="draghover" @click="onClick" @@ -124,7 +124,7 @@ export default Vue.extend({ this.browser.upload(file, this.folder); }); return false; - }; + } // データ取得 const data = e.dataTransfer.getData('text'); @@ -220,7 +220,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -.mk-drive-folder +.root.folder padding 8px height 64px background lighten($theme-color, 95%) diff --git a/src/web/app/desktop/views/components/drive-nav-folder.vue b/src/web/app/desktop/views/components/drive.nav-folder.vue index 44821087af..4c51285881 100644 --- a/src/web/app/desktop/views/components/drive-nav-folder.vue +++ b/src/web/app/desktop/views/components/drive.nav-folder.vue @@ -1,5 +1,5 @@ <template> -<div class="mk-drive-nav-folder" +<div class="root nav-folder" :data-draghover="draghover" @click="onClick" @dragover.prevent.stop="onDragover" @@ -101,7 +101,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -.mk-drive-nav-folder +.root.nav-folder &[data-draghover] background #eee diff --git a/src/web/app/desktop/views/components/drive.vue b/src/web/app/desktop/views/components/drive.vue index 0dcf077017..ffe0c68dec 100644 --- a/src/web/app/desktop/views/components/drive.vue +++ b/src/web/app/desktop/views/components/drive.vue @@ -2,10 +2,10 @@ <div class="mk-drive"> <nav> <div class="path" @contextmenu.prevent.stop="() => {}"> - <mk-drive-nav-folder :class="{ current: folder == null }"/> + <x-nav-folder :class="{ current: folder == null }"/> <template v-for="folder in hierarchyFolders"> <span class="separator">%fa:angle-right%</span> - <mk-drive-nav-folder :folder="folder" :key="folder.id"/> + <x-nav-folder :folder="folder" :key="folder.id"/> </template> <span class="separator" v-if="folder != null">%fa:angle-right%</span> <span class="folder current" v-if="folder != null">{{ folder.name }}</span> @@ -24,13 +24,13 @@ <div class="selection" ref="selection"></div> <div class="contents" ref="contents"> <div class="folders" ref="foldersContainer" v-if="folders.length > 0"> - <mk-drive-folder v-for="folder in folders" :key="folder.id" class="folder" :folder="folder"/> + <x-folder v-for="folder in folders" :key="folder.id" class="folder" :folder="folder"/> <!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid --> <div class="padding" v-for="n in 16"></div> <button v-if="moreFolders">%i18n:desktop.tags.mk-drive-browser.load-more%</button> </div> <div class="files" ref="filesContainer" v-if="files.length > 0"> - <mk-drive-file v-for="file in files" :key="file.id" class="file" :file="file"/> + <x-file v-for="file in files" :key="file.id" class="file" :file="file"/> <!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid --> <div class="padding" v-for="n in 16"></div> <button v-if="moreFiles" @click="fetchMoreFiles">%i18n:desktop.tags.mk-drive-browser.load-more%</button> @@ -57,10 +57,18 @@ <script lang="ts"> import Vue from 'vue'; import MkDriveWindow from './drive-window.vue'; +import XNavFolder from './drive.nav-folder.vue'; +import XFolder from './drive.folder.vue'; +import XFile from './drive.file.vue'; import contains from '../../../common/scripts/contains'; import contextmenu from '../../api/contextmenu'; export default Vue.extend({ + components: { + XNavFolder, + XFolder, + XFile + }, props: { initFolder: { type: Object, diff --git a/src/web/app/desktop/views/components/index.ts b/src/web/app/desktop/views/components/index.ts index fc30bb729e..da59d9219e 100644 --- a/src/web/app/desktop/views/components/index.ts +++ b/src/web/app/desktop/views/components/index.ts @@ -19,9 +19,6 @@ import repostForm from './repost-form.vue'; import followButton from './follow-button.vue'; import postPreview from './post-preview.vue'; import drive from './drive.vue'; -import driveFile from './drive-file.vue'; -import driveFolder from './drive-folder.vue'; -import driveNavFolder from './drive-nav-folder.vue'; import postDetail from './post-detail.vue'; import settings from './settings.vue'; import calendar from './calendar.vue'; @@ -71,9 +68,6 @@ Vue.component('mk-repost-form', repostForm); Vue.component('mk-follow-button', followButton); Vue.component('mk-post-preview', postPreview); Vue.component('mk-drive', drive); -Vue.component('mk-drive-file', driveFile); -Vue.component('mk-drive-folder', driveFolder); -Vue.component('mk-drive-nav-folder', driveNavFolder); Vue.component('mk-post-detail', postDetail); Vue.component('mk-settings', settings); Vue.component('mk-calendar', calendar); diff --git a/src/web/app/init.ts b/src/web/app/init.ts index ac567c5023..aa2ec25c96 100644 --- a/src/web/app/init.ts +++ b/src/web/app/init.ts @@ -87,23 +87,6 @@ export default (callback: (launch: (api: (os: MiOS) => API) => [Vue, MiOS]) => v // アプリ基底要素マウント document.body.innerHTML = '<div id="app"></div>'; - const app = new Vue({ - router: new VueRouter({ - mode: 'history' - }), - created() { - this.$watch('os.i', i => { - // キャッシュ更新 - localStorage.setItem('me', JSON.stringify(i)); - }, { - deep: true - }); - }, - render: createEl => createEl(App) - }); - - os.app = app; - const launch = (api: (os: MiOS) => API) => { os.apis = api(os); @@ -117,6 +100,23 @@ export default (callback: (launch: (api: (os: MiOS) => API) => [Vue, MiOS]) => v } }); + const app = new Vue({ + router: new VueRouter({ + mode: 'history' + }), + created() { + this.$watch('os.i', i => { + // キャッシュ更新 + localStorage.setItem('me', JSON.stringify(i)); + }, { + deep: true + }); + }, + render: createEl => createEl(App) + }); + + os.app = app; + // マウント app.$mount('#app'); diff --git a/src/web/app/mobile/views/components/index.ts b/src/web/app/mobile/views/components/index.ts index 73cc1f9f3a..905baaf20d 100644 --- a/src/web/app/mobile/views/components/index.ts +++ b/src/web/app/mobile/views/components/index.ts @@ -18,6 +18,7 @@ import notifications from './notifications.vue'; import notificationPreview from './notification-preview.vue'; import usersList from './users-list.vue'; import userPreview from './user-preview.vue'; +import userTimeline from './user-timeline.vue'; Vue.component('mk-ui', ui); Vue.component('mk-home', home); @@ -37,3 +38,4 @@ Vue.component('mk-notifications', notifications); Vue.component('mk-notification-preview', notificationPreview); Vue.component('mk-users-list', usersList); Vue.component('mk-user-preview', userPreview); +Vue.component('mk-user-timeline', userTimeline); diff --git a/src/web/app/mobile/views/components/timeline.vue b/src/web/app/mobile/views/components/timeline.vue index e7a9f2df1a..c0e766523f 100644 --- a/src/web/app/mobile/views/components/timeline.vue +++ b/src/web/app/mobile/views/components/timeline.vue @@ -9,9 +9,9 @@ %fa:R comments% %i18n:mobile.tags.mk-home-timeline.empty-timeline% </div> - <button v-if="!fetching && posts.length != 0" @click="more" :disabled="fetching" slot="tail"> - <span v-if="!fetching">%i18n:mobile.tags.mk-timeline.load-more%</span> - <span v-if="fetching">%i18n:common.loading%<mk-ellipsis/></span> + <button v-if="!fetching && existMore" @click="more" :disabled="moreFetching" slot="tail"> + <span v-if="!moreFetching">%i18n:mobile.tags.mk-timeline.load-more%</span> + <span v-if="moreFetching">%i18n:common.loading%<mk-ellipsis/></span> </button> </mk-posts> </div> @@ -19,6 +19,9 @@ <script lang="ts"> import Vue from 'vue'; + +const limit = 10; + export default Vue.extend({ props: { date: { @@ -31,6 +34,7 @@ export default Vue.extend({ fetching: true, moreFetching: false, posts: [], + existMore: false, connection: null, connectionId: null }; @@ -59,10 +63,14 @@ export default Vue.extend({ methods: { fetch(cb?) { this.fetching = true; - (this as any).api('posts/timeline', { + limit: limit + 1, until_date: this.date ? (this.date as any).getTime() : undefined }).then(posts => { + if (posts.length == limit + 1) { + posts.pop(); + this.existMore = true; + } this.posts = posts; this.fetching = false; this.$emit('loaded'); @@ -70,11 +78,17 @@ export default Vue.extend({ }); }, more() { - if (this.moreFetching || this.fetching || this.posts.length == 0) return; this.moreFetching = true; (this as any).api('posts/timeline', { + limit: limit + 1, until_id: this.posts[this.posts.length - 1].id }).then(posts => { + if (posts.length == limit + 1) { + posts.pop(); + this.existMore = true; + } else { + this.existMore = false; + } this.posts = this.posts.concat(posts); this.moreFetching = false; }); diff --git a/src/web/app/mobile/views/components/user-timeline.vue b/src/web/app/mobile/views/components/user-timeline.vue index ffd6288381..39f959187c 100644 --- a/src/web/app/mobile/views/components/user-timeline.vue +++ b/src/web/app/mobile/views/components/user-timeline.vue @@ -8,9 +8,9 @@ %fa:R comments% {{ withMedia ? '%i18n:mobile.tags.mk-user-timeline.no-posts-with-media%' : '%i18n:mobile.tags.mk-user-timeline.no-posts%' }} </div> - <button v-if="canFetchMore" @click="more" :disabled="fetching" slot="tail"> - <span v-if="!fetching">%i18n:mobile.tags.mk-user-timeline.load-more%</span> - <span v-if="fetching">%i18n:common.loading%<mk-ellipsis/></span> + <button v-if="!fetching && existMore" @click="more" :disabled="moreFetching" slot="tail"> + <span v-if="!moreFetching">%i18n:mobile.tags.mk-user-timeline.load-more%</span> + <span v-if="moreFetching">%i18n:common.loading%<mk-ellipsis/></span> </button> </mk-posts> </div> @@ -18,23 +18,53 @@ <script lang="ts"> import Vue from 'vue'; + +const limit = 10; + export default Vue.extend({ props: ['user', 'withMedia'], data() { return { fetching: true, - posts: [] + posts: [], + existMore: false, + moreFetching: false }; }, mounted() { (this as any).api('users/posts', { user_id: this.user.id, - with_media: this.withMedia + with_media: this.withMedia, + limit: limit + 1 }).then(posts => { + if (posts.length == limit + 1) { + posts.pop(); + this.existMore = true; + } this.posts = posts; this.fetching = false; this.$emit('loaded'); }); + }, + methods: { + more() { + this.moreFetching = true; + (this as any).api('users/posts', { + user_id: this.user.id, + with_media: this.withMedia, + limit: limit + 1, + until_id: this.posts[this.posts.length - 1].id + }).then(posts => { + if (posts.length == limit + 1) { + posts.pop(); + this.existMore = true; + } else { + this.existMore = false; + } + this.posts = this.posts.concat(posts); + this.moreFetching = false; + }); + } } }); </script> diff --git a/src/web/app/mobile/views/pages/user.vue b/src/web/app/mobile/views/pages/user.vue index c9c1c6bfbd..27f65e623d 100644 --- a/src/web/app/mobile/views/pages/user.vue +++ b/src/web/app/mobile/views/pages/user.vue @@ -66,15 +66,11 @@ export default Vue.extend({ components: { XHome }, - props: { - page: { - default: 'home' - } - }, data() { return { fetching: true, - user: null + user: null, + page: 'home' }; }, computed: { diff --git a/src/web/app/mobile/views/pages/user/home.vue b/src/web/app/mobile/views/pages/user/home.vue index 040b916ca2..4c68317879 100644 --- a/src/web/app/mobile/views/pages/user/home.vue +++ b/src/web/app/mobile/views/pages/user/home.vue @@ -1,6 +1,6 @@ <template> <div class="root home"> - <mk-post-detail v-if="user.pinned_post" :post="user.pinned_post" compact/> + <mk-post-detail v-if="user.pinned_post" :post="user.pinned_post" :compact="true"/> <section class="recent-posts"> <h2>%fa:R comments%%i18n:mobile.tags.mk-user-overview.recent-posts%</h2> <div> |