Commit 0e4e2d96 authored by Phil Hughes's avatar Phil Hughes

Merge branch 'ee-move-board-list-vue-component' into 'master'

Move BoardList vue component to vue file

See merge request gitlab-org/gitlab-ee!4406
parents b6fed0ba 27aa4094
...@@ -3,7 +3,7 @@ import Sortable from 'vendor/Sortable'; ...@@ -3,7 +3,7 @@ import Sortable from 'vendor/Sortable';
import Vue from 'vue'; import Vue from 'vue';
import boardPromotionState from 'ee/boards/components/board_promotion_state'; import boardPromotionState from 'ee/boards/components/board_promotion_state';
import AccessorUtilities from '../../lib/utils/accessor'; import AccessorUtilities from '../../lib/utils/accessor';
import boardList from './board_list'; import boardList from './board_list.vue';
import boardBlankState from './board_blank_state'; import boardBlankState from './board_blank_state';
import './board_delete'; import './board_delete';
......
<script>
import Sortable from 'vendor/Sortable'; import Sortable from 'vendor/Sortable';
import boardNewIssue from './board_new_issue'; import boardNewIssue from './board_new_issue';
import boardCard from './board_card.vue'; import boardCard from './board_card.vue';
...@@ -8,6 +9,11 @@ const Store = gl.issueBoards.BoardsStore; ...@@ -8,6 +9,11 @@ const Store = gl.issueBoards.BoardsStore;
export default { export default {
name: 'BoardList', name: 'BoardList',
components: {
boardCard,
boardNewIssue,
loadingIcon,
},
props: { props: {
groupId: { groupId: {
type: Number, type: Number,
...@@ -47,46 +53,6 @@ export default { ...@@ -47,46 +53,6 @@ export default {
showIssueForm: false, showIssueForm: false,
}; };
}, },
components: {
boardCard,
boardNewIssue,
loadingIcon,
},
methods: {
listHeight() {
return this.$refs.list.getBoundingClientRect().height;
},
scrollHeight() {
return this.$refs.list.scrollHeight;
},
scrollTop() {
return this.$refs.list.scrollTop + this.listHeight();
},
scrollToTop() {
this.$refs.list.scrollTop = 0;
},
loadNextPage() {
const getIssues = this.list.nextPage();
const loadingDone = () => {
this.list.loadingMore = false;
};
if (getIssues) {
this.list.loadingMore = true;
getIssues
.then(loadingDone)
.catch(loadingDone);
}
},
toggleForm() {
this.showIssueForm = !this.showIssueForm;
},
onScroll() {
if (!this.list.loadingMore && (this.scrollTop() > this.scrollHeight() - this.scrollOffset)) {
this.loadNextPage();
}
},
},
watch: { watch: {
filters: { filters: {
handler() { handler() {
...@@ -143,7 +109,8 @@ export default { ...@@ -143,7 +109,8 @@ export default {
}); });
}, },
onUpdate: (e) => { onUpdate: (e) => {
const sortedArray = this.sortable.toArray().filter(id => id !== '-1'); const sortedArray = this.sortable.toArray()
.filter(id => id !== '-1');
gl.issueBoards.BoardsStore gl.issueBoards.BoardsStore
.moveIssueInList(this.list, Store.moving.issue, e.oldIndex, e.newIndex, sortedArray); .moveIssueInList(this.list, Store.moving.issue, e.oldIndex, e.newIndex, sortedArray);
}, },
...@@ -162,56 +129,90 @@ export default { ...@@ -162,56 +129,90 @@ export default {
eventHub.$off(`scroll-board-list-${this.list.id}`, this.scrollToTop); eventHub.$off(`scroll-board-list-${this.list.id}`, this.scrollToTop);
this.$refs.list.removeEventListener('scroll', this.onScroll); this.$refs.list.removeEventListener('scroll', this.onScroll);
}, },
template: ` methods: {
<div class="board-list-component"> listHeight() {
<div return this.$refs.list.getBoundingClientRect().height;
key="loading" },
class="board-list-loading text-center" scrollHeight() {
aria-label="Loading issues" return this.$refs.list.scrollHeight;
v-if="loading"> },
<loading-icon /> scrollTop() {
</div> return this.$refs.list.scrollTop + this.listHeight();
<board-new-issue },
key="newIssue" scrollToTop() {
:group-id="groupId" this.$refs.list.scrollTop = 0;
:list="list" },
v-if="list.type !== 'closed' && showIssueForm"/> loadNextPage() {
<ul const getIssues = this.list.nextPage();
key="list" const loadingDone = () => {
class="board-list" this.list.loadingMore = false;
v-show="!loading" };
ref="list"
:data-board="list.id"
:class="{ 'is-smaller': showIssueForm }">
<board-card
v-for="(issue, index) in issues"
ref="issue"
:index="index"
:list="list"
:issue="issue"
:issue-link-base="issueLinkBase"
:group-id="groupId"
:root-path="rootPath"
:disabled="disabled"
:key="issue.id" />
<li
class="board-list-count text-center"
v-if="showCount"
data-issue-id="-1">
<loading-icon if (getIssues) {
v-show="list.loadingMore" this.list.loadingMore = true;
label="Loading more issues" getIssues
/> .then(loadingDone)
.catch(loadingDone);
}
},
toggleForm() {
this.showIssueForm = !this.showIssueForm;
},
onScroll() {
if (!this.list.loadingMore && (this.scrollTop() > this.scrollHeight() - this.scrollOffset)) {
this.loadNextPage();
}
},
},
};
</script>
<span v-if="list.issues.length === list.issuesSize"> <template>
Showing all issues <div class="board-list-component">
</span> <div
<span v-else> class="board-list-loading text-center"
Showing {{ list.issues.length }} of {{ list.issuesSize }} issues aria-label="Loading issues"
</span> v-if="loading">
</li> <loading-icon />
</ul>
</div> </div>
`, <board-new-issue
}; :list="list"
v-if="list.type !== 'closed' && showIssueForm"/>
<ul
class="board-list"
v-show="!loading"
ref="list"
:data-board="list.id"
:class="{ 'is-smaller': showIssueForm }">
<board-card
v-for="(issue, index) in issues"
ref="issue"
:index="index"
:list="list"
:issue="issue"
:issue-link-base="issueLinkBase"
:root-path="rootPath"
:disabled="disabled"
:key="issue.id" />
<li
class="board-list-count text-center"
v-if="showCount"
data-issue-id="-1">
<loading-icon
v-show="list.loadingMore"
label="Loading more issues"
/>
<span
v-if="list.issues.length === list.issuesSize"
>
Showing all issues
</span>
<span
v-else
>
Showing {{ list.issues.length }} of {{ list.issuesSize }} issues
</span>
</li>
</ul>
</div>
</template>
---
title: Move BoardList vue component to vue file
merge_request: 16888
author: George Tsiolis
type: performance
...@@ -5,7 +5,7 @@ import Vue from 'vue'; ...@@ -5,7 +5,7 @@ import Vue from 'vue';
import MockAdapter from 'axios-mock-adapter'; import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
import Sortable from 'vendor/Sortable'; import Sortable from 'vendor/Sortable';
import BoardList from '~/boards/components/board_list'; import BoardList from '~/boards/components/board_list.vue';
import eventHub from '~/boards/eventhub'; import eventHub from '~/boards/eventhub';
import '~/boards/mixins/sortable_default_options'; import '~/boards/mixins/sortable_default_options';
import '~/boards/models/issue'; import '~/boards/models/issue';
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment