added sharing to playlist menu, making vue based context menu WIP
This commit is contained in:
parent
5f24bf0259
commit
a5a8a09d04
5 changed files with 192 additions and 0 deletions
|
@ -291,6 +291,13 @@ const app = new Vue({
|
||||||
socialBadges: {
|
socialBadges: {
|
||||||
badgeMap: {},
|
badgeMap: {},
|
||||||
version: ""
|
version: ""
|
||||||
|
},
|
||||||
|
menuPanel: {
|
||||||
|
visible: false,
|
||||||
|
content: {
|
||||||
|
name: "",
|
||||||
|
items: {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
@ -315,6 +322,11 @@ const app = new Vue({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
async showMenuPanel(data) {
|
||||||
|
app.menuPanel.visible = true;
|
||||||
|
app.menuPanel.content.name = data.name ?? "";
|
||||||
|
app.menuPanel.content.items = data.items ?? [];
|
||||||
|
},
|
||||||
async getSvgIcon(url) {
|
async getSvgIcon(url) {
|
||||||
let response = await fetch(url);
|
let response = await fetch(url);
|
||||||
let data = await response.text();
|
let data = await response.text();
|
||||||
|
@ -357,6 +369,7 @@ const app = new Vue({
|
||||||
document.querySelector("body").classList.add("notransparency")
|
document.querySelector("body").classList.add("notransparency")
|
||||||
},
|
},
|
||||||
resetState() {
|
resetState() {
|
||||||
|
this.menuPanel.visible = false;
|
||||||
app.selectedMediaItems = [];
|
app.selectedMediaItems = [];
|
||||||
for (let key in app.modals) {
|
for (let key in app.modals) {
|
||||||
app.modals[key] = false;
|
app.modals[key] = false;
|
||||||
|
|
|
@ -2479,6 +2479,25 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.playlist-more {
|
||||||
|
border-radius: 100%;
|
||||||
|
background: var(--keyColor);
|
||||||
|
box-shadow: var(--ciderShadow-Generic);
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
float:right;
|
||||||
|
border: 0px;
|
||||||
|
cursor: pointer;
|
||||||
|
z-index: 5;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: var(--keyColor-rollover);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: var(--keyColor-pressed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.playlist-time {
|
.playlist-time {
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
|
@ -2773,6 +2792,65 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.menu-panel {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
|
||||||
|
.menu-option {
|
||||||
|
text-align: left;
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
padding: 16px;
|
||||||
|
appearance: none;
|
||||||
|
border: 0px;
|
||||||
|
font: inherit;
|
||||||
|
background: transparent;
|
||||||
|
color: inherit;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: var(--selected);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: var(--selected-click);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-header-text {
|
||||||
|
margin: 18px 6px;
|
||||||
|
.close-btn {
|
||||||
|
width: 50px;
|
||||||
|
height: 42px;
|
||||||
|
background-image: var(--gfx-closeBtn);
|
||||||
|
background-position: center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
-webkit-app-region: no-drag;
|
||||||
|
appearance: none;
|
||||||
|
border: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: rgb(196, 43, 28)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-body {
|
||||||
|
overflow: overlay;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-footer {
|
||||||
|
width: 100%;
|
||||||
|
padding: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.queue-panel {
|
.queue-panel {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -3988,11 +4066,25 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
||||||
/* Cider */
|
/* Cider */
|
||||||
|
|
||||||
// sidebar icon
|
// sidebar icon
|
||||||
|
.svg-icon {
|
||||||
|
--color: #aaa;
|
||||||
|
--url: url("./assets/feather/share.svg");
|
||||||
|
-webkit-mask-image: var(--url);
|
||||||
|
-webkit-mask-size: cover;
|
||||||
|
height: 18px;
|
||||||
|
width: 18px;
|
||||||
|
background: var(--color);
|
||||||
|
}
|
||||||
.sidebar-icon {
|
.sidebar-icon {
|
||||||
width: 18px;
|
width: 18px;
|
||||||
height: 18px;
|
height: 18px;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
|
|
||||||
|
>.svg-icon {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
--color: #aaa;
|
||||||
|
}
|
||||||
>svg {
|
>svg {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
52
src/renderer/views/components/menu-panel.ejs
Normal file
52
src/renderer/views/components/menu-panel.ejs
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
<script type="text/x-template" id="cider-menu-panel">
|
||||||
|
<div class="menu-panel">
|
||||||
|
<div class="menu-header-text">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<h3 class="queue-header-text">{{ content.name }}</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button @click="menuPanel.visible = false" class="close-btn"></button>
|
||||||
|
</div>
|
||||||
|
<div class="menu-body">
|
||||||
|
<template v-for="item in content.items">
|
||||||
|
<button class="menu-option" @click="action(item)">
|
||||||
|
<div class="sidebar-icon" v-if="item.icon">
|
||||||
|
<div class="svg-icon" :style="{'--url': 'url(' + item.icon + ')'}"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{{ item.name }}
|
||||||
|
</button>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
Vue.component('cider-menu-panel', {
|
||||||
|
template: '#cider-menu-panel',
|
||||||
|
data: function () {
|
||||||
|
return {
|
||||||
|
app: this.$root,
|
||||||
|
menuPanel: this.$root.menuPanel,
|
||||||
|
content: this.$root.menuPanel.content,
|
||||||
|
getSvgIcon: this.$root.getSvgIcon,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async getActions() {
|
||||||
|
return this.content.items;
|
||||||
|
},
|
||||||
|
action(item) {
|
||||||
|
item.action()
|
||||||
|
if(!item["keepOpen"]) {
|
||||||
|
this.menuPanel.visible = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -538,6 +538,13 @@
|
||||||
<cider-queue ref="queue" v-if="drawer.panel == 'queue'"></cider-queue>
|
<cider-queue ref="queue" v-if="drawer.panel == 'queue'"></cider-queue>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
|
<transition name="drawertransition">
|
||||||
|
<div class="app-drawer" v-if="menuPanel.visible">
|
||||||
|
<cider-menu-panel>
|
||||||
|
</cider-menu-panel>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
|
@ -653,6 +660,8 @@
|
||||||
</button>
|
</button>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<!-- Menu Panel -->
|
||||||
|
<%- include('components/menu-panel') %>
|
||||||
<!-- Playlist Listing -->
|
<!-- Playlist Listing -->
|
||||||
<%- include('components/sidebar-playlist') %>
|
<%- include('components/sidebar-playlist') %>
|
||||||
<!-- Spatial Properties -->
|
<!-- Spatial Properties -->
|
||||||
|
|
|
@ -74,6 +74,14 @@
|
||||||
@click="(!inLibrary) ? addToLibrary(data.attributes.playParams.id.toString()) : removeFromLibrary(data.attributes.playParams.id.toString()) ">
|
@click="(!inLibrary) ? addToLibrary(data.attributes.playParams.id.toString()) : removeFromLibrary(data.attributes.playParams.id.toString()) ">
|
||||||
Confirm?
|
Confirm?
|
||||||
</button>
|
</button>
|
||||||
|
<button class="playlist-more" @click="menu">
|
||||||
|
<div style=" margin-top: -1px;
|
||||||
|
margin-left: -5px;
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;">
|
||||||
|
<%- include("../svg/more.svg") %>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -311,6 +319,24 @@
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
menu() {
|
||||||
|
app.showMenuPanel({
|
||||||
|
name: this.data.attributes ? (this.data.attributes.name ??
|
||||||
|
(this.data.attributes.title ?? '') ?? '') : '',
|
||||||
|
items: {
|
||||||
|
"share": {
|
||||||
|
name: "Share",
|
||||||
|
icon: "./assets/feather/share.svg",
|
||||||
|
action: () => {
|
||||||
|
app.mk.api.v3.music(`/v1/me/library/playlists/${this.data.id}/catalog`).then(res=>{
|
||||||
|
console.log(res.data.data[0].attributes.url)
|
||||||
|
app.copyToClipboard(res.data.data[0].attributes.url)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
getItemParent: function (data) {
|
getItemParent: function (data) {
|
||||||
kind = data.attributes.playParams.kind;
|
kind = data.attributes.playParams.kind;
|
||||||
id = data.attributes.playParams.id;
|
id = data.attributes.playParams.id;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue