Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions config/default_settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@
<play_port>default</play_port>

<!-- Learn MIDI -->
<sort_by>dateDesc</sort_by>
<songs_per_page>50</songs_per_page>
<practice>0</practice>
<hands>0</hands>
<mute_hand>0</mute_hand>
Expand Down
2 changes: 2 additions & 0 deletions lib/learnmidi.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ def __init__(self, usersettings, ledsettings, midiports, ledstrip):
self.ledstrip = ledstrip

self.loading = 0
self.songs_per_page = int(usersettings.get_setting_value("songs_per_page"))
self.sort_by = usersettings.get_setting_value("sort_by")
self.practice = int(usersettings.get_setting_value("practice"))
self.hands = int(usersettings.get_setting_value("hands"))
self.mute_hand = int(usersettings.get_setting_value("mute_hand"))
Expand Down
152 changes: 81 additions & 71 deletions webinterface/static/js/ui.js
Original file line number Diff line number Diff line change
Expand Up @@ -1213,87 +1213,97 @@ function get_learning_status(loop_call = false) {
xhttp.send();
}


function get_songs() {
let page;
let max_page;
if (document.getElementById("songs_page")) {
page = parseInt(document.getElementById("songs_page").value);
let max_page = parseInt(document.getElementById("songs_page").max);
} else {
page = 1;
max_page = 1;
}
if (max_page === 0) {
max_page = 1;
}
if (page > max_page) {
document.getElementById("songs_page").value = max_page;
return false;
}
if (page < 1) {
document.getElementById("songs_page").value = 1;
return false;
}
document.getElementById("songs_list_table").classList.add("animate-pulse", "pointer-events-none");

let sortby = document.getElementById("sort_by").value;
if (document.getElementById("songs_per_page")) {
length = document.getElementById("songs_per_page").value;
} else {
length = 10;
}

let search = document.getElementById("song_search").value;

const xhttp = new XMLHttpRequest();
xhttp.timeout = 5000;
xhttp.onreadystatechange = function () {
const xhttp_spp = new XMLHttpRequest();
xhttp_spp.timeout = 5000;
xhttp_spp.onreadystatechange = function () {
let response;
if (this.readyState === 4 && this.status === 200) {
document.getElementById("songs_list_table").innerHTML = this.responseText;
const dates = document.getElementsByClassName("song_date");
for (let i = 0; i < dates.length; i++) {
dates.item(i).innerHTML = new Date(dates.item(i).innerHTML * 1000).toISOString().slice(0, 19).replace('T', ' ');
}
const names = document.getElementsByClassName("song_name");
for (let i = 0; i < names.length; i++) {
names.item(i).value = names.item(i).value.replace('.mid', '');
response = JSON.parse(this.responseText);
length = response["songs_per_page"];
let sortby = response["sort_by"];
document.getElementById("sort_by").value = sortby;
if (document.getElementById("songs_page")) {
page = parseInt(document.getElementById("songs_page").value);
let max_page = parseInt(document.getElementById("songs_page").max);
} else {
page = 1;
max_page = 1;
}
document.getElementById("songs_list_table").classList.remove("animate-pulse", "pointer-events-none");

document.getElementById("songs_per_page").value = length;

if (sortby === "nameAsc") {
document.getElementById("sort_icon_nameAsc").classList.remove("hidden");
document.getElementById("sort_icon_nameDesc").classList.add("hidden");
document.getElementById("sort_by_name").classList.add("text-gray-800", "dark:text-gray-200");
document.getElementById("sort_by_date").classList.remove("text-gray-800", "dark:text-gray-200");
if (max_page === 0) {
max_page = 1;
}
if (sortby === "nameDesc") {
document.getElementById("sort_icon_nameDesc").classList.remove("hidden");
document.getElementById("sort_icon_nameAsc").classList.add("hidden");
document.getElementById("sort_by_name").classList.add("text-gray-800", "dark:text-gray-200");
document.getElementById("sort_by_date").classList.remove("text-gray-800", "dark:text-gray-200");
if (page > max_page) {
document.getElementById("songs_page").value = max_page;
return false;
}

if (sortby === "dateAsc") {
document.getElementById("sort_icon_dateAsc").classList.remove("hidden");
document.getElementById("sort_icon_dateDesc").classList.add("hidden");
document.getElementById("sort_by_date").classList.add("text-gray-800", "dark:text-gray-200");
document.getElementById("sort_by_name").classList.remove("text-gray-800", "dark:text-gray-200");
if (page < 1) {
document.getElementById("songs_page").value = 1;
return false;
}
if (sortby === "dateDesc") {
document.getElementById("sort_icon_dateDesc").classList.remove("hidden");
document.getElementById("sort_icon_dateAsc").classList.add("hidden");
document.getElementById("sort_by_date").classList.add("text-gray-800", "dark:text-gray-200");
document.getElementById("sort_by_name").classList.remove("text-gray-800", "dark:text-gray-200");
document.getElementById("songs_list_table").classList.add("animate-pulse", "pointer-events-none");

if (document.getElementById("songs_per_page")) {
length = document.getElementById("songs_per_page").value;
change_setting("songs_per_page", length)
}


let search = document.getElementById("song_search").value;

const xhttp = new XMLHttpRequest();
xhttp.timeout = 5000;
xhttp.onreadystatechange = function () {
if (this.readyState === 4 && this.status === 200) {
document.getElementById("songs_list_table").innerHTML = this.responseText;
const dates = document.getElementsByClassName("song_date");
for (let i = 0; i < dates.length; i++) {
dates.item(i).innerHTML = new Date(dates.item(i).innerHTML * 1000).toISOString().slice(0, 19).replace('T', ' ');
}
const names = document.getElementsByClassName("song_name");
for (let i = 0; i < names.length; i++) {
names.item(i).value = names.item(i).value.replace('.mid', '');
}
document.getElementById("songs_list_table").classList.remove("animate-pulse", "pointer-events-none");

document.getElementById("songs_per_page").value = length;

if (sortby === "nameAsc") {
document.getElementById("sort_icon_nameAsc").classList.remove("hidden");
document.getElementById("sort_icon_nameDesc").classList.add("hidden");
document.getElementById("sort_by_name").classList.add("text-gray-800", "dark:text-gray-200");
document.getElementById("sort_by_date").classList.remove("text-gray-800", "dark:text-gray-200");
}
if (sortby === "nameDesc") {
document.getElementById("sort_icon_nameDesc").classList.remove("hidden");
document.getElementById("sort_icon_nameAsc").classList.add("hidden");
document.getElementById("sort_by_name").classList.add("text-gray-800", "dark:text-gray-200");
document.getElementById("sort_by_date").classList.remove("text-gray-800", "dark:text-gray-200");
}

if (sortby === "dateAsc") {
document.getElementById("sort_icon_dateAsc").classList.remove("hidden");
document.getElementById("sort_icon_dateDesc").classList.add("hidden");
document.getElementById("sort_by_date").classList.add("text-gray-800", "dark:text-gray-200");
document.getElementById("sort_by_name").classList.remove("text-gray-800", "dark:text-gray-200");
}
if (sortby === "dateDesc") {
document.getElementById("sort_icon_dateDesc").classList.remove("hidden");
document.getElementById("sort_icon_dateAsc").classList.add("hidden");
document.getElementById("sort_by_date").classList.add("text-gray-800", "dark:text-gray-200");
document.getElementById("sort_by_name").classList.remove("text-gray-800", "dark:text-gray-200");
}

}
translateStaticContent();
};
xhttp.open("GET", "/api/get_songs?page=" + page + "&length=" + length + "&sortby=" + sortby + "&search=" + search, true);
xhttp.send();
}
translateStaticContent();
};
xhttp.open("GET", "/api/get_songs?page=" + page + "&length=" + length + "&sortby=" + sortby + "&search=" + search, true);
xhttp.send();
xhttp_spp.open("GET", "/api/get_song_list_setting", true);
xhttp_spp.send();
}


Expand Down Expand Up @@ -1522,4 +1532,4 @@ function handle_confirmation_button(element, delay = 1000) {
setTimeout(() => {
element.classList.remove('pointer-events-none', "animate-pulse");
}, delay);
}
}
16 changes: 8 additions & 8 deletions webinterface/templates/songs_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
<thead class="bg-gray-100 dark:bg-gray-600 hidden md:table-header-group">
<tr>
<th class="p-3 text-left">
<div class="flex" id="sort_by_name" data-translate="name">
Name
<div class="flex" id="sort_by_name">
<div data-translate="name">Name</div>
<svg onclick="this.nextElementSibling.classList.remove('hidden');
this.classList.add('hidden');
document.getElementById('sort_by').value = 'nameDesc';
change_setting('sort_by', 'nameDesc');
get_songs();"
id="sort_icon_nameAsc" xmlns="http://www.w3.org/2000/svg"
class="ml-2 h-6 w-6 cursor-pointer" fill="none" viewBox="0 0 24 24" stroke="currentColor">
Expand All @@ -15,7 +15,7 @@
</svg>
<svg onclick="this.previousElementSibling.classList.remove('hidden');
this.classList.add('hidden');
document.getElementById('sort_by').value = 'nameAsc';
change_setting('sort_by', 'nameAsc');
get_songs();"
id="sort_icon_nameDesc" xmlns="http://www.w3.org/2000/svg"
class="ml-2 h-6 w-6 cursor-pointer hidden" fill="none" viewBox="0 0 24 24" stroke="currentColor">
Expand All @@ -25,11 +25,11 @@
</div>
</th>
<th class="p-3 text-left">
<div class="flex" id="sort_by_date" data-translate="date">
Date
<div class="flex" id="sort_by_date">
<div data-translate="date">Date</div>
<svg onclick="this.nextElementSibling.classList.remove('hidden');
this.classList.add('hidden');
document.getElementById('sort_by').value = 'dateDesc';
change_setting('sort_by', 'dateDesc');
get_songs();"
id="sort_icon_dateAsc" xmlns="http://www.w3.org/2000/svg"
class="ml-2 h-6 w-6 cursor-pointer" fill="none" viewBox="0 0 24 24" stroke="currentColor">
Expand All @@ -38,7 +38,7 @@
</svg>
<svg onclick="this.previousElementSibling.classList.remove('hidden');
this.classList.add('hidden');
document.getElementById('sort_by').value = 'dateAsc';
change_setting('sort_by', 'dateAsc');
get_songs();"
id="sort_icon_dateDesc" xmlns="http://www.w3.org/2000/svg"
class="ml-2 h-6 w-6 cursor-pointer hidden" fill="none" viewBox="0 0 24 24" stroke="currentColor">
Expand Down
18 changes: 18 additions & 0 deletions webinterface/views_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1007,6 +1007,18 @@ def change_setting():
app_state.saving.save(current_date)
return jsonify(success=True, reload_songs=True)

if setting_name == "songs_per_page":
value = int(value)
app_state.usersettings.change_setting_value("songs_per_page", value)
app_state.learning.songs_per_page = value
return jsonify(success=True)

if setting_name == "sort_by":
new_sort = str(value)
app_state.usersettings.change_setting_value("sort_by", new_sort)
app_state.learning.sort_by = new_sort
return jsonify(success=True)

if setting_name == "change_song_name":
if os.path.exists("Songs/" + second_value):
return jsonify(success=False, reload_songs=True, error=second_value + " already exists")
Expand Down Expand Up @@ -1554,6 +1566,12 @@ def get_learning_status():

return jsonify(response)

@webinterface.route('/api/get_song_list_setting', methods=['GET'])
def get_song_list_setting():
response = {"songs_per_page": app_state.usersettings.get_setting_value("songs_per_page"),
"sort_by": app_state.usersettings.get_setting_value("sort_by")
}
return jsonify(response)

@webinterface.route('/api/get_songs', methods=['GET'])
def get_songs():
Expand Down