diff --git a/maloja/web/jinja/abstracts/base.jinja b/maloja/web/jinja/abstracts/base.jinja
index 59268d5..91806e6 100644
--- a/maloja/web/jinja/abstracts/base.jinja
+++ b/maloja/web/jinja/abstracts/base.jinja
@@ -23,6 +23,7 @@
+
-
{% endblock %}
{% set album = filterkeys.album %}
@@ -20,13 +19,21 @@
{% block icon_bar %}
{% if adminmode %}
{% include 'icons/edit.jinja' %}
+
+
{% include 'icons/merge.jinja' %}
{% include 'icons/merge_mark.jinja' %}
+ {% include 'icons/merge_unmark.jinja' %}
{% include 'icons/merge_cancel.jinja' %}
+
+
+
{% include 'icons/add_album.jinja' %}
{% include 'icons/association_mark.jinja' %}
+ {% include 'icons/association_unmark.jinja' %}
{% include 'icons/association_cancel.jinja' %}
-
+
+
{% endif %}
{% endblock %}
diff --git a/maloja/web/jinja/artist.jinja b/maloja/web/jinja/artist.jinja
index 149d1c0..168994f 100644
--- a/maloja/web/jinja/artist.jinja
+++ b/maloja/web/jinja/artist.jinja
@@ -6,7 +6,6 @@
{% block scripts %}
-
{% endblock %}
{% set artist = filterkeys.artist %}
@@ -30,11 +29,19 @@
{% block icon_bar %}
{% if adminmode %}
{% include 'icons/edit.jinja' %}
+
+
{% include 'icons/merge.jinja' %}
{% include 'icons/merge_mark.jinja' %}
+ {% include 'icons/merge_unmark.jinja' %}
{% include 'icons/merge_cancel.jinja' %}
+
+
+
{% include 'icons/add_artist.jinja' %}
-
+ {% include 'icons/association_cancel.jinja' %}
+
+
{% endif %}
{% endblock %}
diff --git a/maloja/web/jinja/icons/add_album.jinja b/maloja/web/jinja/icons/add_album.jinja
index 11d2d67..928fb8f 100644
--- a/maloja/web/jinja/icons/add_album.jinja
+++ b/maloja/web/jinja/icons/add_album.jinja
@@ -1,4 +1,4 @@
-
+
diff --git a/maloja/web/jinja/icons/add_artist.jinja b/maloja/web/jinja/icons/add_artist.jinja
index 07a958f..9ce9ff7 100644
--- a/maloja/web/jinja/icons/add_artist.jinja
+++ b/maloja/web/jinja/icons/add_artist.jinja
@@ -1,4 +1,4 @@
-
+
diff --git a/maloja/web/jinja/icons/association_cancel.jinja b/maloja/web/jinja/icons/association_cancel.jinja
index 9729378..24a8b7b 100644
--- a/maloja/web/jinja/icons/association_cancel.jinja
+++ b/maloja/web/jinja/icons/association_cancel.jinja
@@ -1,7 +1,6 @@
-
+
diff --git a/maloja/web/jinja/icons/association_mark.jinja b/maloja/web/jinja/icons/association_mark.jinja
index 7e27ca5..563d2c5 100644
--- a/maloja/web/jinja/icons/association_mark.jinja
+++ b/maloja/web/jinja/icons/association_mark.jinja
@@ -1,4 +1,4 @@
-
+
diff --git a/maloja/web/jinja/icons/association_unmark.jinja b/maloja/web/jinja/icons/association_unmark.jinja
new file mode 100644
index 0000000..341ce08
--- /dev/null
+++ b/maloja/web/jinja/icons/association_unmark.jinja
@@ -0,0 +1,7 @@
+
diff --git a/maloja/web/jinja/icons/merge.jinja b/maloja/web/jinja/icons/merge.jinja
index dfe2dd9..97a8846 100644
--- a/maloja/web/jinja/icons/merge.jinja
+++ b/maloja/web/jinja/icons/merge.jinja
@@ -1,4 +1,4 @@
-
+
diff --git a/maloja/web/jinja/icons/merge_cancel.jinja b/maloja/web/jinja/icons/merge_cancel.jinja
index 64c1d57..6462906 100644
--- a/maloja/web/jinja/icons/merge_cancel.jinja
+++ b/maloja/web/jinja/icons/merge_cancel.jinja
@@ -1,5 +1,6 @@
-
-
-
+
diff --git a/maloja/web/jinja/icons/merge_mark.jinja b/maloja/web/jinja/icons/merge_mark.jinja
index 8623dbc..c8298d9 100644
--- a/maloja/web/jinja/icons/merge_mark.jinja
+++ b/maloja/web/jinja/icons/merge_mark.jinja
@@ -1,4 +1,4 @@
-
+
diff --git a/maloja/web/jinja/icons/merge_unmark.jinja b/maloja/web/jinja/icons/merge_unmark.jinja
new file mode 100644
index 0000000..244fa31
--- /dev/null
+++ b/maloja/web/jinja/icons/merge_unmark.jinja
@@ -0,0 +1,5 @@
+
diff --git a/maloja/web/jinja/partials/charts_albums.jinja b/maloja/web/jinja/partials/charts_albums.jinja
index a779e62..7b2caf2 100644
--- a/maloja/web/jinja/partials/charts_albums.jinja
+++ b/maloja/web/jinja/partials/charts_albums.jinja
@@ -28,11 +28,12 @@
{% set firstindex = amountkeys.page * amountkeys.perpage %}
{% set lastindex = firstindex + amountkeys.perpage %}
+
{% set maxbar = charts[0]['scrobbles'] if charts != [] else 0 %}
{% for e in charts %}
{% if loop.index0 >= firstindex and loop.index0 < lastindex %}
-
+
{%if loop.changed(e.scrobbles) %}#{{ e.rank }}{% endif %}
@@ -45,7 +46,7 @@
{% endif %}
- {{ entityrow.row(e['album']) }}
+ {{ entityrow.row(e['album'],adminmode=True) }}
{{ links.link_scrobbles([{'album':e.album,'timerange':limitkeys.timerange}],amount=e['scrobbles']) }}
diff --git a/maloja/web/jinja/partials/charts_artists.jinja b/maloja/web/jinja/partials/charts_artists.jinja
index f3496fb..19413f9 100644
--- a/maloja/web/jinja/partials/charts_artists.jinja
+++ b/maloja/web/jinja/partials/charts_artists.jinja
@@ -30,12 +30,13 @@
{% set lastindex = firstindex + amountkeys.perpage %}
+
{% set maxbar = charts[0]['scrobbles'] if charts != [] else 0 %}
{% for e in charts %}
{% if loop.index0 >= firstindex and loop.index0 < lastindex %}
-
+
{%if loop.changed(e.scrobbles) %}#{{ e.rank }}{% endif %}
@@ -48,7 +49,7 @@
{% endif %}
- {{ entityrow.row(e['artist']) }}
+ {{ entityrow.row(e['artist'],adminmode=True) }}
{{ links.link_scrobbles([{'artist':e['artist'],'associated':True,'timerange':limitkeys.timerange}],amount=e['scrobbles']) }}
diff --git a/maloja/web/jinja/partials/charts_tracks.jinja b/maloja/web/jinja/partials/charts_tracks.jinja
index f9f3d70..5bd2c09 100644
--- a/maloja/web/jinja/partials/charts_tracks.jinja
+++ b/maloja/web/jinja/partials/charts_tracks.jinja
@@ -28,11 +28,12 @@
{% set firstindex = amountkeys.page * amountkeys.perpage %}
{% set lastindex = firstindex + amountkeys.perpage %}
+
{% set maxbar = charts[0]['scrobbles'] if charts != [] else 0 %}
{% for e in charts %}
{% if loop.index0 >= firstindex and loop.index0 < lastindex %}
-
+
{%if loop.changed(e.scrobbles) %}#{{ e.rank }}{% endif %}
@@ -45,7 +46,7 @@
{% endif %}
- {{ entityrow.row(e['track']) }}
+ {{ entityrow.row(e['track'],adminmode=True) }}
{{ links.link_scrobbles([{'track':e.track,'timerange':limitkeys.timerange}],amount=e['scrobbles']) }}
diff --git a/maloja/web/jinja/partials/list_tracks.jinja b/maloja/web/jinja/partials/list_tracks.jinja
index 0150bc8..2ac3ef1 100644
--- a/maloja/web/jinja/partials/list_tracks.jinja
+++ b/maloja/web/jinja/partials/list_tracks.jinja
@@ -6,22 +6,14 @@
{% set firstindex = amountkeys.page * amountkeys.perpage %}
{% set lastindex = firstindex + amountkeys.perpage %}
-
{% for e in list %}
{% if loop.index0 >= firstindex and loop.index0 < lastindex %}
-
+
- {{ entityrow.row(e['track']) }}
-
- {% with inlineicons = True %}
-
- {% include 'icons/association_mark.jinja' %}
- {% include 'icons/association_cancel.jinja' %}
-
- {% endwith %}
+ {{ entityrow.row(e['track'],adminmode=adminmode) }}
{% endif %}
@@ -30,9 +22,6 @@
diff --git a/maloja/web/jinja/partials/scrobbles.jinja b/maloja/web/jinja/partials/scrobbles.jinja
index dc487c3..32d839b 100644
--- a/maloja/web/jinja/partials/scrobbles.jinja
+++ b/maloja/web/jinja/partials/scrobbles.jinja
@@ -6,9 +6,6 @@
{% import 'snippets/entityrow.jinja' as entityrow %}
-
-
-
{% for s in scrobbles -%}
{%- if loop.index0 >= firstindex and loop.index0 < lastindex -%}
diff --git a/maloja/web/jinja/snippets/entityrow.jinja b/maloja/web/jinja/snippets/entityrow.jinja
index 2721f0c..843fe20 100644
--- a/maloja/web/jinja/snippets/entityrow.jinja
+++ b/maloja/web/jinja/snippets/entityrow.jinja
@@ -1,4 +1,4 @@
-{% macro row(entity,counting=[]) %}
+{% macro row(entity,counting=[],adminmode=False) %}
{% import 'snippets/links.jinja' as links %}
@@ -35,4 +35,11 @@
{% endif %}
+{% if adminmode and (entity is mapping) %}
+
+{% include 'icons/association_mark.jinja' %}
+{% include 'icons/association_unmark.jinja' %}
+
+{% endif %}
+
{% endmacro %}
diff --git a/maloja/web/jinja/track.jinja b/maloja/web/jinja/track.jinja
index 0402fce..f446c71 100644
--- a/maloja/web/jinja/track.jinja
+++ b/maloja/web/jinja/track.jinja
@@ -5,7 +5,6 @@
{% block scripts %}
-
+
{% endif %}
{% endblock %}
diff --git a/maloja/web/static/css/maloja.css b/maloja/web/static/css/maloja.css
index 9d1ac30..6d40ad4 100644
--- a/maloja/web/static/css/maloja.css
+++ b/maloja/web/static/css/maloja.css
@@ -67,6 +67,10 @@ div#icon_bar {
right:30px;
top:30px;
}
+.iconsubset {
+ display: inline-block;
+ padding-left:20px;
+}
div#icon_bar div.clickable_icon {
display: inline-block;
@@ -94,14 +98,75 @@ div.clickable_icon.danger:hover svg {
display: inline-block;
}
-.list tr.marked {
- background-color: rgba(50,20,0,0.5);
+.list {
+ --color_bg_merge: rgba(0,0,90,0.7);
+ --color_fg_merge: lightblue;
+ --color_bg_associate: rgba(50,20,0,0.7);
+ --color_fg_associate: orange;
}
-.list tr.marked #associationmarkicon {
- display:none;
+
+.list tr.marked_for_associate {
+ background-color: var(--color_bg_associate);
+ color: var(--color_fg_associate);
}
-.list tr:not(.marked) #associationcancelicon {
- display:none;
+.list tr.marked_for_merge {
+ background-color: var(--color_bg_merge);
+ color: var(--color_fg_merge);;
+}
+
+@keyframes slideBackground {
+ 0% {
+ background-position: 100% 0;
+ }
+ 50% {
+ background-position: 0 0;
+ }
+ 100% {
+ background-position: 100% 0;
+ }
+}
+@keyframes colorChange {
+ 0% {
+ color: var(--color_fg_associate);
+ }
+ 50% {
+ color: var(--color_fg_merge);
+ }
+ 100% {
+ color: var(--color_fg_associate);
+ }
+}
+
+.list tr.marked_for_associate.marked_for_merge {
+ background: linear-gradient(to left, var(--color_bg_associate), var(--color_bg_merge));
+ background-size: 100% 100%;
+ animation: colorChange 4s infinite ease-in-out;
+}
+
+
+/* this is just to 'factor out' that big selector down there.
+we want icons to not be displayed in list rows, but show them with reduced opacity in the top bar */
+.list {
+ --display_inactive_icons: none;
+}
+#icon_bar {
+ --display_inactive_icons: inline-block;
+}
+
+.associateicons.marked_for_associate .associationmarkicon, /* already marked, cant mark again */
+.associateicons:not(.marked_for_associate) .associationunmarkicon, /* not marked, cant unmark */
+.associateicons:not(.somethingmarked_for_associate) .associatecancelicon, /* cant cancel when nothing is marked */
+.mergeicons.marked_for_merge #mergemarkicon, /* already marked, cant mark again */
+.mergeicons:not(.marked_for_merge) #mergeunmarkicon, /* not marked, cant unmark */
+.mergeicons:not(.somethingmarked_for_merge) #mergecancelicon, /* cant cancel when nothing is marked */
+.mergeicons:not(.somethingmarked_for_merge) #mergeicon, /* can't merge when nothing is selected */
+.mergeicons.marked_for_merge #mergeicon, /* cant merge into one of the things we have selected */
+.associateicons:not(.sources_marked_for_associate) #associatealbumicon,
+.associateicons:not(.sources_marked_for_associate) #associateartisticon /* nothing marked yet, can't associate with this */
+ {
+ pointer-events: none;
+ opacity:0.5;
+ display: var(--display_inactive_icons);
}
/**
diff --git a/maloja/web/static/js/edit.js b/maloja/web/static/js/edit.js
index 2fb6d9c..6caf52b 100644
--- a/maloja/web/static/js/edit.js
+++ b/maloja/web/static/js/edit.js
@@ -187,186 +187,117 @@ function doneEditing() {
}
}
-// MERGING
+// MERGING AND ASSOCIATION
-function showValidMergeIcons() {
+const associate_targets = {
+ album: ['artist'],
+ track: ['album','artist'],
+ artist: []
+};
- // merge
+const associate_sources = {
+ artist: ['album','track'],
+ album: ['track'],
+ track: []
+};
+
+
+function getStoredList(key) {
const lcst = window.sessionStorage;
- var key = "marked_for_merge_" + entity_type;
var current_stored = (lcst.getItem(key) || '').split(",");
current_stored = current_stored.filter((x)=>x).map((x)=>parseInt(x));
-
- var mergeicon = document.getElementById('mergeicon');
- var mergemarkicon = document.getElementById('mergemarkicon');
- var mergecancelicon = document.getElementById('mergecancelicon');
-
- mergeicon.classList.add('hide');
- mergemarkicon.classList.add('hide');
- mergecancelicon.classList.add('hide');
-
- if (current_stored.length == 0) {
- mergemarkicon.classList.remove('hide');
- }
- else {
- mergecancelicon.classList.remove('hide');
-
- if (current_stored.includes(entity_id)) {
-
- }
- else {
- mergemarkicon.classList.remove('hide');
- mergeicon.classList.remove('hide');
- }
- }
-
- // mark for association
- if ((entity_type == 'track') || (entity_type == 'album')) {
- const lcst = window.sessionStorage;
- var key = "marked_for_associate_" + entity_type;
- var current_stored = (lcst.getItem(key) || '').split(",");
- current_stored = current_stored.filter((x)=>x).map((x)=>parseInt(x));
-
- var associationmarkicon = document.getElementById('associationmarkicon');
- var associationcancelicon = document.getElementById('associationcancelicon');
-
- associationmarkicon.classList.add('hide');
- associationcancelicon.classList.add('hide');
-
-
- if (current_stored.length == 0) {
- associationmarkicon.classList.remove('hide');
- }
- else {
- associationcancelicon.classList.remove('hide');
-
- if (current_stored.includes(entity_id)) {
-
- }
- else {
- associationmarkicon.classList.remove('hide');
- }
- }
-
- if (entity_type == 'track') {
- associationmarkicon.title = "Mark this track to add to album or add artist";
- }
- else {
- associationmarkicon.title = "Mark this album to add artist";
- }
- }
-
-
-
- // association confirm
- if ((entity_type == 'artist') || (entity_type == 'album')) {
- var target_entity_types = {artist:['album','track'], album:['track']};
- var to_associate = {};
- var to_associate_all = [];
- for (var target_entity_type of target_entity_types[entity_type]) {
- const lcst = window.sessionStorage;
- var key = "marked_for_associate_" + target_entity_type;
- var current_stored = (lcst.getItem(key) || '').split(",");
- to_associate[target_entity_type] = current_stored.filter((x)=>x).map((x)=>parseInt(x));
- to_associate_all = to_associate_all.concat(to_associate[target_entity_type]);
- }
-
- var associateicon = document.getElementById('associate' + entity_type + 'icon');
-
- associateicon.classList.add('hide');
-
-
- if (to_associate_all.length == 0) {
-
- }
- else {
- associateicon.classList.remove('hide');
- if (entity_type == 'artist') {
- associateicon.title = "Add this artist to " + to_associate['album'].length + " albums and " + to_associate['track'].length + " tracks";
- }
- else {
- associateicon.title = "Add " + to_associate['track'].length + " tracks to this album";
- }
-
- }
- }
-
-
-
-
-
+ return current_stored;
+}
+function storeList(key,list) {
+ const lcst = window.sessionStorage;
+ list = [...new Set(list)];
+ lcst.setItem(key,list); //this already formats it correctly
}
-function markForMerge() {
- const lcst = window.sessionStorage;
- var key = "marked_for_merge_" + entity_type;
- var current_stored = (lcst.getItem(key) || '').split(",");
- current_stored = current_stored.filter((x)=>x).map((x)=>parseInt(x));
+
+function markForMerge(element) {
+ const parentElement = element.closest('[data-entity_id]');
+
+ var entity_type = parentElement.dataset.entity_type;
+ var entity_id = parentElement.dataset.entity_id;
+ var entity_name = parentElement.dataset.entity_name;
+ entity_id = parseInt(entity_id);
+
+ key = "marked_for_merge_" + entity_type;
+ var current_stored = getStoredList(key);
current_stored.push(entity_id);
- current_stored = [...new Set(current_stored)];
- lcst.setItem(key,current_stored); //this already formats it correctly
+ storeList(key,current_stored)
+
notify("Marked " + entity_name + " for merge","Currently " + current_stored.length + " marked!")
- showValidMergeIcons();
+
+ toggleMergeIcons(parentElement);
+}
+
+function unmarkForMerge(element) {
+ const parentElement = element.closest('[data-entity_id]');
+
+ var entity_type = parentElement.dataset.entity_type;
+ var entity_id = parentElement.dataset.entity_id;
+ var entity_name = parentElement.dataset.entity_name;
+ entity_id = parseInt(entity_id);
+
+ var key = "marked_for_merge_" + entity_type;
+ var current_stored = getStoredList(key);
+
+ if (current_stored.indexOf(entity_id) > -1) {
+ current_stored.splice(current_stored.indexOf(entity_id),1);
+ storeList(key,current_stored);
+ notify("Unmarked " + entity_name + " from merge","Currently " + current_stored.length + " marked!")
+
+ toggleMergeIcons(parentElement);
+ }
+ else {
+ //notify(entity_name + " was not marked!","")
+ }
}
function markForAssociate(element) {
- console.log(element);
const parentElement = element.closest('[data-entity_id]');
- console.log(parentElement);
- // use local element for entity data, otherwise use from global scope (on entity info page)
- var l_entity_type = parentElement ? parentElement.dataset.entity_type : entity_type;
- var l_entity_id = parentElement ? parentElement.dataset.entity_id : entity_id;
- var l_entity_name = parentElement ? parentElement.dataset.entity_name : entity_name;
- l_entity_id = parseInt(l_entity_id);
+
+ var entity_type = parentElement.dataset.entity_type;
+ var entity_id = parentElement.dataset.entity_id;
+ var entity_name = parentElement.dataset.entity_name;
+ entity_id = parseInt(entity_id);
- const lcst = window.sessionStorage;
- var key = "marked_for_associate_" + l_entity_type;
- var current_stored = (lcst.getItem(key) || '').split(",");
- current_stored = current_stored.filter((x)=>x).map((x)=>parseInt(x));
- current_stored.push(l_entity_id);
- current_stored = [...new Set(current_stored)];
- lcst.setItem(key,current_stored); //this already formats it correctly
- var whattoadd = ((l_entity_type == 'track') ? "Artists or Album" : "Artists")
- notify("Marked " + l_entity_name + " to add " + whattoadd,"Currently " + current_stored.length + " marked!")
- if (!parentElement) {
- showValidMergeIcons();
- }
- else {
- toggleAssociationIcons(parentElement);
- }
+ var key = "marked_for_associate_" + entity_type;
+ var current_stored = getStoredList(key);
+ current_stored.push(entity_id);
+ storeList(key,current_stored);
+
+ notify("Marked " + entity_name + " to add to " + associate_targets[entity_type].join(" or "),"Currently " + current_stored.length + " marked!")
+
+ toggleAssociationIcons(parentElement);
}
function umarkForAssociate(element) {
const parentElement = element.closest('[data-entity_id]');
- // use local element for entity data, otherwise use from global scope (on entity info page)
- var l_entity_type = parentElement ? parentElement.dataset.entity_type : entity_type;
- var l_entity_id = parentElement ? parentElement.dataset.entity_id : entity_id;
- var l_entity_name = parentElement ? parentElement.dataset.entity_name : entity_name;
- l_entity_id = parseInt(l_entity_id);
- const lcst = window.sessionStorage;
- var key = "marked_for_associate_" + l_entity_type;
- var current_stored = (lcst.getItem(key) || '').split(",");
- current_stored = current_stored.filter((x)=>x).map((x)=>parseInt(x));
+ var entity_type = parentElement.dataset.entity_type;
+ var entity_id = parentElement.dataset.entity_id;
+ var entity_name = parentElement.dataset.entity_name;
+ entity_id = parseInt(entity_id);
- if (current_stored.indexOf(l_entity_id) > -1) {
- current_stored.splice(current_stored.indexOf(l_entity_id),1);
- current_stored = [...new Set(current_stored)];
- lcst.setItem(key,current_stored); //this already formats it correctly
- var whattoadd = ((l_entity_type == 'track') ? "Artists or Album" : "Artists")
- notify("Unmarked " + l_entity_name + " to add " + whattoadd,"Currently " + current_stored.length + " marked!")
- if (!parentElement) {
- showValidMergeIcons();
- }
- else {
- toggleAssociationIcons(parentElement);
- }
+ var key = "marked_for_associate_" + entity_type;
+ var current_stored = getStoredList(key);
+
+ if (current_stored.indexOf(entity_id) > -1) {
+ current_stored.splice(current_stored.indexOf(entity_id),1);
+ storeList(key,current_stored);
+
+ notify("Unmarked " + entity_name + " from association with " + associate_targets[entity_type].join(" or "),"Currently " + current_stored.length + " marked!")
+
+ toggleAssociationIcons(parentElement);
}
else {
- notify(entity_name + " was not marked!","")
+ //notify(entity_name + " was not marked!","")
}
}
@@ -376,23 +307,78 @@ function toggleAssociationIcons(element) {
var entity_id = element.dataset.entity_id;
entity_id = parseInt(entity_id);
- const lcst = window.sessionStorage;
var key = "marked_for_associate_" + entity_type;
- var current_stored = (lcst.getItem(key) || '').split(",");
- current_stored = current_stored.filter((x)=>x).map((x)=>parseInt(x));
+ var current_stored = getStoredList(key);
if (current_stored.indexOf(entity_id) > -1) {
- element.classList.add('marked');
+ element.classList.add('marked_for_associate');
} else {
- element.classList.remove('marked');
+ element.classList.remove('marked_for_associate');
+ }
+
+ if (current_stored.length > 0) {
+ element.classList.add('somethingmarked_for_associate');
+ }
+ else {
+ element.classList.remove('somethingmarked_for_associate');
+ }
+
+ var sourcetypes = associate_sources[entity_type];
+ var sourcelist = [];
+ for (var src of sourcetypes) {
+ var key = "marked_for_associate_" + src;
+ sourcelist = sourcelist.concat(getStoredList(key));
+ }
+ if (sourcelist.length > 0) {
+ element.classList.add('sources_marked_for_associate');
+ }
+ else {
+ element.classList.remove('sources_marked_for_associate');
+ }
+
+}
+
+function toggleMergeIcons(element) {
+ var entity_type = element.dataset.entity_type;
+ var entity_id = element.dataset.entity_id;
+ entity_id = parseInt(entity_id);
+
+ var key = "marked_for_merge_" + entity_type;
+ var current_stored = getStoredList(key);
+
+ if (current_stored.indexOf(entity_id) > -1) {
+ element.classList.add('marked_for_merge');
+ } else {
+ element.classList.remove('marked_for_merge');
+ }
+
+
+ if (current_stored.length > 0) {
+ element.classList.add('somethingmarked_for_merge');
+ }
+ else {
+ element.classList.remove('somethingmarked_for_merge');
}
}
+document.addEventListener('DOMContentLoaded',function(){
+ var listrows = document.getElementsByClassName('listrow');
+ for (var row of listrows) {
+ toggleAssociationIcons(row);
+ toggleMergeIcons(row); //just for the coloring, no icons
+ }
+ var topbars = document.getElementsByClassName('iconsubset');
+ for (var bar of topbars) {
+ toggleAssociationIcons(bar);
+ toggleMergeIcons(bar);
+ }
+})
+
+
+
function merge() {
- const lcst = window.sessionStorage;
var key = "marked_for_merge_" + entity_type;
- var current_stored = lcst.getItem(key).split(",");
- current_stored = current_stored.filter((x)=>x).map((x)=>parseInt(x));
+ var current_stored = getStoredList(key);
callback_func = function(req){
if (req.status == 200) {
@@ -415,26 +401,28 @@ function merge() {
json=true
);
- lcst.removeItem(key);
+ storeList(key,[]);
}
-function associate() {
- const lcst = window.sessionStorage;
- var target_entity_types = {artist:['album','track'], album:['track']};
+function associate(element) {
+ const parentElement = element.closest('[data-entity_id]');
+ var entity_type = parentElement.dataset.entity_type;
+ var entity_id = parentElement.dataset.entity_id;
+ entity_id = parseInt(entity_id);
+
var requests_todo = 0;
- for (var target_entity_type of target_entity_types[entity_type]) {
+ for (var target_entity_type of associate_sources[entity_type]) {
var key = "marked_for_associate_" + target_entity_type;
- var current_stored = (lcst.getItem(key) || '').split(",");
- current_stored = current_stored.filter((x)=>x).map((x)=>parseInt(x));
+ var current_stored = getStoredList(key);
if (current_stored.length != 0) {
requests_todo += 1;
callback_func = function(req){
if (req.status == 200) {
- showValidMergeIcons();
+ toggleAssociationIcons(parentElement);
notifyCallback(req);
requests_todo -= 1;
if (requests_todo == 0) {
@@ -458,24 +446,30 @@ function associate() {
json=true
);
- lcst.removeItem(key);
+ storeList(key,[]);
}
}
}
-function cancelMerge() {
- const lcst = window.sessionStorage;
+function cancelMerge(element) {
+ const parentElement = element.closest('[data-entity_id]');
+
+ var entity_type = parentElement.dataset.entity_type;
+
var key = "marked_for_merge_" + entity_type;
- lcst.setItem(key,[]);
- showValidMergeIcons();
- notify("Cancelled merge!","")
+ storeList(key,[])
+ toggleMergeIcons(parentElement);
+ notify("Cancelled " + entity_type + " merge!","")
}
-function cancelAssociate() {
- const lcst = window.sessionStorage;
+function cancelAssociate(element) {
+ const parentElement = element.closest('[data-entity_id]');
+
+ var entity_type = parentElement.dataset.entity_type;
+
var key = "marked_for_associate_" + entity_type;
- lcst.setItem(key,[]);
- showValidMergeIcons();
- notify("Cancelled association!","")
+ storeList(key,[])
+ toggleAssociationIcons(parentElement);
+ notify("Cancelled " + entity_type + " association!","")
}