|
@@ -5,7 +5,7 @@
|
|
|
@savedSuccess="onSavedSuccess"
|
|
|
@savedError="onSavedError"
|
|
|
@saving="onSaving"
|
|
|
- @flagSong="flagSong"
|
|
|
+ @toggleFlag="toggleFlag"
|
|
|
@nextSong="editNextSong"
|
|
|
>
|
|
|
<template v-if="items.length > 1" #sidebar>
|
|
@@ -19,7 +19,9 @@
|
|
|
<section class="sidebar-body">
|
|
|
<div
|
|
|
class="item"
|
|
|
- v-for="{ status, flagged, song } in items"
|
|
|
+ v-for="(
|
|
|
+ { status, flagged, song }, index
|
|
|
+ ) in filteredItems"
|
|
|
:key="song._id"
|
|
|
>
|
|
|
<song-item
|
|
@@ -103,12 +105,37 @@
|
|
|
edit
|
|
|
</i>
|
|
|
</template>
|
|
|
+ <template #tippyActions>
|
|
|
+ <i
|
|
|
+ class="material-icons flag-icon"
|
|
|
+ :class="{ flagged }"
|
|
|
+ content="Toggle Flag"
|
|
|
+ v-tippy
|
|
|
+ @click="toggleFlag(index)"
|
|
|
+ >
|
|
|
+ flag_circle
|
|
|
+ </i>
|
|
|
+ </template>
|
|
|
</song-item>
|
|
|
</div>
|
|
|
+ <p v-if="filteredItems.length === 0" class="no-items">
|
|
|
+ {{
|
|
|
+ flagFilter
|
|
|
+ ? "No flagged songs queued"
|
|
|
+ : "No songs queued"
|
|
|
+ }}
|
|
|
+ </p>
|
|
|
</section>
|
|
|
<footer class="sidebar-foot">
|
|
|
- <button @click="closeEditSongs()" class="button is-primary">
|
|
|
- Close
|
|
|
+ <button
|
|
|
+ @click="toggleFlagFilter()"
|
|
|
+ class="button is-primary"
|
|
|
+ >
|
|
|
+ {{
|
|
|
+ flagFilter
|
|
|
+ ? "Show All Songs"
|
|
|
+ : "Show Only Flagged Songs"
|
|
|
+ }}
|
|
|
</button>
|
|
|
</footer>
|
|
|
</div>
|
|
@@ -135,7 +162,8 @@ export default {
|
|
|
return {
|
|
|
items: [],
|
|
|
currentSong: {},
|
|
|
- closed: false
|
|
|
+ closed: false,
|
|
|
+ flagFilter: false
|
|
|
};
|
|
|
},
|
|
|
computed: {
|
|
@@ -144,6 +172,24 @@ export default {
|
|
|
item => item.song._id === this.currentSong._id
|
|
|
);
|
|
|
},
|
|
|
+ filteredEditingItemIndex() {
|
|
|
+ return this.filteredItems.findIndex(
|
|
|
+ item => item.song._id === this.currentSong._id
|
|
|
+ );
|
|
|
+ },
|
|
|
+ filteredItems: {
|
|
|
+ get() {
|
|
|
+ return this.items.filter(item =>
|
|
|
+ this.flagFilter ? item.flagged : true
|
|
|
+ );
|
|
|
+ },
|
|
|
+ set(newItem) {
|
|
|
+ const index = this.items.findIndex(
|
|
|
+ item => item.song._id === newItem._id
|
|
|
+ );
|
|
|
+ this.item[index] = newItem;
|
|
|
+ }
|
|
|
+ },
|
|
|
...mapState("modals/editSongs", {
|
|
|
songIds: state => state.songIds,
|
|
|
songPrefillData: state => state.songPrefillData
|
|
@@ -203,27 +249,26 @@ export default {
|
|
|
this.closed = true;
|
|
|
},
|
|
|
editNextSong() {
|
|
|
- const currentlyEditingSongIndex = this.editingItemIndex;
|
|
|
+ const currentlyEditingSongIndex = this.filteredEditingItemIndex;
|
|
|
let newEditingSongIndex = -1;
|
|
|
-
|
|
|
- for (
|
|
|
- let i = currentlyEditingSongIndex + 1;
|
|
|
- i < this.items.length;
|
|
|
- i += 1
|
|
|
- ) {
|
|
|
- if (this.items[i].status !== "done") {
|
|
|
+ const index =
|
|
|
+ currentlyEditingSongIndex + 1 === this.filteredItems.length
|
|
|
+ ? 0
|
|
|
+ : currentlyEditingSongIndex + 1;
|
|
|
+ for (let i = index; i < this.filteredItems.length; i += 1) {
|
|
|
+ if (!this.flagFilter || this.filteredItems[i].flagged) {
|
|
|
newEditingSongIndex = i;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (newEditingSongIndex > -1)
|
|
|
- this.pickSong(this.items[newEditingSongIndex].song);
|
|
|
- // else edit no song
|
|
|
+ this.pickSong(this.filteredItems[newEditingSongIndex].song);
|
|
|
},
|
|
|
- flagSong() {
|
|
|
- if (this.editingItemIndex > -1)
|
|
|
- this.items[this.editingItemIndex].flagged = true;
|
|
|
+ toggleFlag(songIndex = null) {
|
|
|
+ const index = songIndex || this.editingItemIndex;
|
|
|
+ if (index > -1)
|
|
|
+ this.items[index].flagged = !this.items[index].flagged;
|
|
|
},
|
|
|
onSavedSuccess(songId) {
|
|
|
const itemIndex = this.items.findIndex(
|
|
@@ -243,6 +288,9 @@ export default {
|
|
|
);
|
|
|
if (itemIndex > -1) this.items[itemIndex].status = "saving";
|
|
|
},
|
|
|
+ toggleFlagFilter() {
|
|
|
+ this.flagFilter = !this.flagFilter;
|
|
|
+ },
|
|
|
...mapActions("modals/editSong", ["editSong"])
|
|
|
}
|
|
|
};
|
|
@@ -335,6 +383,10 @@ export default {
|
|
|
|
|
|
.flag-icon {
|
|
|
color: var(--orange);
|
|
|
+
|
|
|
+ &.flagged {
|
|
|
+ color: var(--grey);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
&.removed {
|
|
@@ -344,31 +396,20 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ .no-items {
|
|
|
+ text-align: center;
|
|
|
+ font-size: 18px;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.sidebar-foot {
|
|
|
border-top: 1px solid var(--light-grey-2);
|
|
|
border-radius: 0 0 5px 5px;
|
|
|
- overflow: initial;
|
|
|
- column-gap: 16px;
|
|
|
-
|
|
|
- // & > div {
|
|
|
- // display: flex;
|
|
|
- // flex-grow: 1;
|
|
|
- // column-gap: 16px;
|
|
|
- // }
|
|
|
|
|
|
- // .right {
|
|
|
- // display: flex;
|
|
|
- // margin-left: auto;
|
|
|
- // margin-right: 0;
|
|
|
- // justify-content: flex-end;
|
|
|
- // column-gap: 16px;
|
|
|
- // }
|
|
|
-
|
|
|
- // &.blank {
|
|
|
- // padding: 10px;
|
|
|
- // }
|
|
|
+ .button {
|
|
|
+ flex: 1;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
</style>
|