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 %} - + @@ -45,7 +46,7 @@ {% endif %} - {{ entityrow.row(e['album']) }} + {{ entityrow.row(e['album'],adminmode=True) }} 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 %}
{%if loop.changed(e.scrobbles) %}#{{ e.rank }}{% endif %} {{ links.link_scrobbles([{'album':e.album,'timerange':limitkeys.timerange}],amount=e['scrobbles']) }}
{% for e in charts %} {% if loop.index0 >= firstindex and loop.index0 < lastindex %} - + @@ -48,7 +49,7 @@ {% endif %} - {{ entityrow.row(e['artist']) }} + {{ entityrow.row(e['artist'],adminmode=True) }} 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 %}
{%if loop.changed(e.scrobbles) %}#{{ e.rank }}{% endif %} {{ links.link_scrobbles([{'artist':e['artist'],'associated':True,'timerange':limitkeys.timerange}],amount=e['scrobbles']) }}
{% for e in charts %} {% if loop.index0 >= firstindex and loop.index0 < lastindex %} - + @@ -45,7 +46,7 @@ {% endif %} - {{ entityrow.row(e['track']) }} + {{ entityrow.row(e['track'],adminmode=True) }} 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 %} -
{%if loop.changed(e.scrobbles) %}#{{ e.rank }}{% endif %} {{ links.link_scrobbles([{'track':e.track,'timerange':limitkeys.timerange}],amount=e['scrobbles']) }}
{% for e in list %} {% if loop.index0 >= firstindex and loop.index0 < lastindex %} - + - {{ entityrow.row(e['track']) }} - - {% with inlineicons = True %} - - {% 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 %} - - -
- {% include 'icons/association_mark.jinja' %} - {% include 'icons/association_cancel.jinja' %} -
{% 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) %} + +{% 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!","") }
+{% include 'icons/association_mark.jinja' %} +{% include 'icons/association_unmark.jinja' %} +