diff --git a/db/procedures/delete_session_track.sql b/db/procedures/delete_session_track.sql new file mode 100644 index 0000000..e4f467d --- /dev/null +++ b/db/procedures/delete_session_track.sql @@ -0,0 +1,17 @@ +create or replace procedure delete_session_track ( + in in_user_name varchar(32), + in in_num int +) +language plpgsql +as $$ +begin + delete from "session_track" + where "user_name" = in_user_name + and "num" = in_num; + + update "session_track" + set "num" = "num" - 1 + where "user_name" = in_user_name + and "num" > in_num; +end; +$$; diff --git a/html/main.js b/html/main.js index c6da0b4..0e0c194 100644 --- a/html/main.js +++ b/html/main.js @@ -414,7 +414,19 @@ document.addEventListener('click', event => { }); document.addEventListener('keyup', event => { + const Del = 46; const A = 65; + let playlist = document.querySelector('#playlist ul'); + if (event.which === Del && !playlist.classList.contains('is-deleting-track')) { + let hovered = playlist.querySelector('li:hover'); + if (hovered !== null) { + playlist.classList.add('is-deleting-track'); + ajaxPost('/form/delete-session-track', { + num: Array.from(playlist.children).indexOf(hovered) + 1 + }, () => playlist.classList.remove('is-deleting-track')); + hovered.remove(); + } + } if (event.ctrlKey && event.altKey && event.which == A) { ajaxPost('/form/toggle-edit-mode', {}, () => location.reload()); } diff --git a/src/route.h b/src/route.h index 905c53f..099e972 100644 --- a/src/route.h +++ b/src/route.h @@ -48,6 +48,7 @@ void route_form_import(struct http_data* data); void route_form_upload(struct http_data* data); void route_form_add_group(struct http_data* data); void route_form_add_session_track(struct route_parameters* parameters); +void route_form_delete_session_track(struct route_parameters* parameters); void route_form_add_group_tag(struct route_result* result, struct http_data* data); void route_form_delete_group_tag(struct route_result* result, struct http_data* data); diff --git a/src/route_form.c b/src/route_form.c index fc7c7d2..de41ff2 100644 --- a/src/route_form.c +++ b/src/route_form.c @@ -44,6 +44,8 @@ void route_form_with_session(const char* form, struct route_parameters* paramete } } else if (!strcmp(form, "add-session-track")) { route_form_add_session_track(parameters); + } else if (!strcmp(form, "delete-session-track")) { + route_form_delete_session_track(parameters); } else if (!strcmp(form, "download-remote")) { if (has_privilege(parameters->session, PRIVILEGE_UPLOAD_ALBUM)) { route_form_download_remote(¶meters->data); diff --git a/src/route_form_add_session_track.c b/src/route_form_add_session_track.c index a576b3c..1ea9b65 100644 --- a/src/route_form_add_session_track.c +++ b/src/route_form_add_session_track.c @@ -51,3 +51,13 @@ void route_form_add_session_track(struct route_parameters* parameters) { parameters->resource = resource; route_render(parameters); } + +void route_form_delete_session_track(struct route_parameters* parameters) { + const char* num = http_data_string(¶meters->data, "num"); + if (*num) { + const char* params[] = { parameters->session->name, num }; + PQclear(call_procedure("call delete_session_track", params, 2)); + } else { + print_error("Index must be specified when deleting a session track"); + } +}