mirror of https://github.com/Kylart/KawAnime.git
275 lines
7.7 KiB
Vue
275 lines
7.7 KiB
Vue
<template lang="pug">
|
|
v-container#watch-list.pa-0.mt-0(fluid, fill-height)
|
|
v-tabs#tabs(grow, icons-and-text, slider-color='primary')
|
|
template(v-for='i in 5')
|
|
v-tab.mablue(:href="'#tabs-' + i") {{ actionsList[i - 1].name }}
|
|
v-icon {{ actionsList[i - 1].icon }}
|
|
v-tab-item(v-for='i in 5', :key='i', lazy, v-bind:id="'tabs-' + i")
|
|
v-layout.list-container.pb-2(row, wrap)
|
|
v-flex(xs12)
|
|
v-layout.top-form(row, wrap, align-center, justify-center)
|
|
v-flex(md3, sm4, xs9)
|
|
v-tooltip(bottom)
|
|
v-btn(
|
|
icon, flat,
|
|
@click='selectAll(i)',
|
|
slot='activator'
|
|
)
|
|
v-icon select_all
|
|
span {{ selectLabel(i) }}
|
|
v-menu(open-on-hover, transition='slide-x-transition')
|
|
v-btn(color='secondary', slot='activator') Move to
|
|
v-list.dark
|
|
v-list-tile(
|
|
@click='moveTo(action.list, i)',
|
|
v-for='action in actions(i)',
|
|
:key='action.name'
|
|
)
|
|
v-list-tile-action
|
|
v-icon {{ action.icon }}
|
|
v-list-tile-title {{ action.name }}
|
|
v-tooltip(bottom)
|
|
v-btn.red--text(
|
|
@click='deleteSelected(i)',
|
|
slot='activator',
|
|
icon
|
|
)
|
|
v-icon delete_sweep
|
|
span Delete all selected items from this list
|
|
v-flex(md2, sm2, xs3)
|
|
p.elem-number
|
|
| {{ lists[i - 1].length }} {{ lists[i - 1].length === 1 ? 'entry' : 'entries' }}
|
|
v-flex(md3, sm1, hidden-xs-only)
|
|
v-flex(md2, sm3, xs4, @keyup.enter='addEntry(i)')
|
|
v-text-field.entry-text(type='text', label='Add entry', v-model='entries[i]', dark)
|
|
v-flex(hidden-sm-and-up, xs1)
|
|
v-flex.add-button-container(md2, sm2, xs4)
|
|
v-btn.add-button(dark, color='secondary', @click='addEntry(i)')
|
|
| Add
|
|
transition-group(name='list')
|
|
template(v-for='item in lists[i - 1]')
|
|
list-entry(
|
|
:item='item',
|
|
:deleteEntry='deleteEntry',
|
|
:key='item',
|
|
:index='i',
|
|
:select='select',
|
|
:selected='selected'
|
|
)
|
|
</template>
|
|
|
|
<script>
|
|
const removeSelectedClasses = () => {
|
|
const elems = document.getElementsByClassName('elem')
|
|
|
|
// Remove all selected class
|
|
for (let j = 0, l = elems.length; j < l; ++j) elems[j].children[0].classList.remove('selected')
|
|
}
|
|
|
|
export default {
|
|
components: {
|
|
'list-entry': () => import('components/listEntry.vue')
|
|
},
|
|
data () {
|
|
return {
|
|
selected: {
|
|
1: [],
|
|
2: [],
|
|
3: [],
|
|
4: [],
|
|
5: []
|
|
},
|
|
entries: {
|
|
1: '',
|
|
2: '',
|
|
3: '',
|
|
4: '',
|
|
5: ''
|
|
},
|
|
actionsList: [{
|
|
name: 'Watch list',
|
|
list: 'watchList',
|
|
icon: 'watch_later'
|
|
}, {
|
|
name: 'Watching',
|
|
list: 'watching',
|
|
icon: 'tv'
|
|
}, {
|
|
name: 'Seen',
|
|
list: 'seen',
|
|
icon: 'done_all'
|
|
}, {
|
|
name: 'On hold',
|
|
list: 'onHold',
|
|
icon: 'av_timer'
|
|
}, {
|
|
name: 'Dropped',
|
|
list: 'dropped',
|
|
icon: 'visibility_off'
|
|
}],
|
|
allSelected: {
|
|
1: false,
|
|
2: false,
|
|
3: false,
|
|
4: false,
|
|
5: false
|
|
},
|
|
listNames: {
|
|
1: 'watchList',
|
|
2: 'watching',
|
|
3: 'seen',
|
|
4: 'onHold',
|
|
5: 'dropped'
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
watchList () {
|
|
return this.$store.state.watchLists.lists.watchList
|
|
},
|
|
seen () {
|
|
return this.$store.state.watchLists.lists.seen
|
|
},
|
|
watching () {
|
|
return this.$store.state.watchLists.lists.watching
|
|
},
|
|
onHold () {
|
|
return this.$store.state.watchLists.lists.onHold
|
|
},
|
|
dropped () {
|
|
return this.$store.state.watchLists.lists.dropped
|
|
},
|
|
lists () {
|
|
return [
|
|
this.watchList,
|
|
this.watching,
|
|
this.seen,
|
|
this.onHold,
|
|
this.dropped
|
|
]
|
|
}
|
|
},
|
|
methods: {
|
|
actions (i) {
|
|
return this.actionsList.filter((x) => { return x !== this.actionsList[i - 1] })
|
|
},
|
|
addEntry (i) {
|
|
if (this.entries[i] !== '') {
|
|
console.log(`[${(new Date()).toLocaleTimeString()}]: Adding ${this.entries[i]} to list.`)
|
|
this.$store.dispatch('watchLists/updateList', {
|
|
entry: this.entries[i],
|
|
listName: this.listNames[i]
|
|
})
|
|
}
|
|
this.entries[i] = ''
|
|
},
|
|
deleteEntry (name, i) {
|
|
removeSelectedClasses()
|
|
|
|
this.$store.dispatch('watchLists/removeFromList', {
|
|
listName: this.actionsList[i - 1].list,
|
|
entry: name
|
|
})
|
|
},
|
|
select (item, i) {
|
|
const elem = document.getElementsByClassName(item.split(' ').join('-'))[0].children[0]
|
|
|
|
if (elem.classList.contains('selected') === true) {
|
|
elem.classList.remove('selected')
|
|
this.selected[i] = this.selected[i].filter((x) => { return !(x === item) })
|
|
|
|
this.allSelected[i] = false
|
|
} else {
|
|
elem.className += ' selected'
|
|
this.selected[i].push(item)
|
|
|
|
if (this.selected[i].length === this.lists[[i - 1]]) this.allSelected[i] = true
|
|
}
|
|
},
|
|
selectAll (i) {
|
|
const list = this.lists[i - 1]
|
|
|
|
if (this.selected[i].length === list.length) {
|
|
const elems = document.getElementsByClassName('elem')
|
|
|
|
this.selected[i] = []
|
|
|
|
for (let j = 0, l = elems.length; j < l; ++j) { elems[j].children[0].classList.remove('selected') }
|
|
|
|
this.allSelected[i] = false
|
|
} else {
|
|
list.forEach((elem) => {
|
|
// Color element
|
|
const tmpElem = document.getElementsByClassName(elem.split(' ').join('-'))[0].children[0]
|
|
if (!tmpElem.classList.contains('selected') === true) tmpElem.className += ' selected'
|
|
})
|
|
// Add all elements to selected
|
|
this.selected[i] = [...list]
|
|
|
|
this.allSelected[i] = true
|
|
}
|
|
},
|
|
selectLabel (i) {
|
|
return this.allSelected[i] ? 'Unselect all' : 'Select all'
|
|
},
|
|
moveTo (name, i) {
|
|
this.selected[i].forEach((anime) => {
|
|
this.$store.dispatch('watchLists/updateList', {
|
|
listName: name,
|
|
entry: anime
|
|
})
|
|
|
|
this.$store.dispatch('watchLists/removeFromList', {
|
|
listName: this.actionsList[i - 1].list,
|
|
entry: anime
|
|
})
|
|
})
|
|
|
|
removeSelectedClasses()
|
|
},
|
|
deleteSelected (i) {
|
|
this.selected[i].forEach((anime) => {
|
|
this.$store.dispatch('watchLists/removeFromList', {
|
|
listName: this.actionsList[i - 1].list,
|
|
entry: anime
|
|
})
|
|
})
|
|
|
|
removeSelectedClasses()
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="stylus" scoped>
|
|
#watch-list
|
|
display inline-block
|
|
|
|
h6
|
|
margin 0
|
|
|
|
span
|
|
width 100%
|
|
|
|
list-container
|
|
background-color #303030
|
|
|
|
.elem-number
|
|
margin 10px 0 0 0
|
|
font-size 18px
|
|
font-weight 400
|
|
font-style italic
|
|
letter-spacing 1px
|
|
|
|
.top-form
|
|
padding-left 15px
|
|
|
|
.entry-text
|
|
margin-top 5px
|
|
|
|
.add-button-container
|
|
padding-right 2%
|
|
display flex
|
|
align-items center
|
|
</style>
|