diff --git a/src/Jackett.Common/Content/custom.js b/src/Jackett.Common/Content/custom.js index 753a23f0c..cac1d53f5 100644 --- a/src/Jackett.Common/Content/custom.js +++ b/src/Jackett.Common/Content/custom.js @@ -1238,6 +1238,59 @@ function clearSearchResultTable(element) { element.find("#jackett-search-results-datatable_paginate").empty(); } +function getSavedPresets() { + var lsKey = "jackett_saved_presets"; + if (JSON !== undefined && localStorage !== undefined) { + var lsSavedPresets = localStorage.getItem(lsKey); + var presets = lsSavedPresets !== null ? JSON.parse(lsSavedPresets) : []; + return presets; + } else { + return []; + } +} + +function setSavedPresets(presets) { + var lsKey = "jackett_saved_presets"; + if (JSON !== undefined && localStorage !== undefined) { + localStorage.setItem(lsKey, JSON.stringify(presets)); + } +} + +function setSavePresetsButtonState(table, element, state = false) { + var button = element.find("button[id=jackett-search-results-datatable_savepreset_button]") + if (state) { + button.attr("class", "btn btn-danger btn-sm"); + button.on("click", function () { + var inputSearch = element.find("input[type=search]"); + var preset = inputSearch.val().trim(); + if (preset !== "") { + var presets = getSavedPresets(); + if (presets.includes(preset)) { + presets = presets.filter(item => item != preset); + setSavedPresets(presets); + var datalist = element.find("datalist[id=jackett-search-saved-presets]") + datalist.empty(); + table.api().draw(); + } + } + }); + } else { + button.attr("class", "btn btn-success btn-sm"); + button.on("click", function () { + var inputSearch = element.find("input[type=search]"); + var preset = inputSearch.val().trim(); + if (preset !== "") { + var presets = getSavedPresets(); + if (!presets.includes(preset)) { + presets.push(preset); + setSavedPresets(presets); + table.api().draw(); + } + } + }); + } +} + // dataTable dead torrent filter $.fn.dataTable.ext.search = [ function (settings, data, dataIndex) { @@ -1313,16 +1366,34 @@ function updateSearchResultTable(element, results) { ], fnPreDrawCallback: function () { var table = this; + var datalist = element.find("datalist[id=jackett-search-saved-presets]") + + var presets = getSavedPresets(); + if (presets.length > 0) { + datalist.empty(); + presets.forEach(preset => { + var option = $(''); + option.attr("value", preset); + datalist.append(option); + }) + } var inputSearch = element.find("input[type=search]"); + setSavePresetsButtonState(table, element, presets.includes(inputSearch.val().trim())); + if (!inputSearch.attr("custom")) { var newInputSearch = inputSearch.clone(); newInputSearch.attr("custom", "true"); newInputSearch.attr("data-toggle", "tooltip"); newInputSearch.attr("title", "Search query consists of several keywords.\nKeyword starting with \"-\" is considered a negative match.\nKeywords separated by \"|\" are considered as OR filters."); + newInputSearch.attr("list", "jackett-search-saved-presets"); newInputSearch.on("input", function () { var newKeywords = []; - var filterTextKeywords = $(this).val().split(" "); + var filterText = $(this).val().trim(); + var presets = getSavedPresets(); + setSavePresetsButtonState(table, element, presets.includes(filterText)); + + var filterTextKeywords = filterText.split(" "); $.each(filterTextKeywords, function (index, keyword) { if (keyword === "" || keyword === "+" || keyword === "-") return; @@ -1352,6 +1423,10 @@ function updateSearchResultTable(element, results) { table.api().draw(); }); deadfiltercheckbox.prop('checked', settings.deadfilter); + + savepresetlabel = $(''); + var searchfilterdiv = element.find("#jackett-search-results-datatable_filter"); + searchfilterdiv.append(savepresetlabel); } }, initComplete: function () { diff --git a/src/Jackett.Common/Content/index.html b/src/Jackett.Common/Content/index.html index 81d9a28da..cabd769af 100644 --- a/src/Jackett.Common/Content/index.html +++ b/src/Jackett.Common/Content/index.html @@ -565,6 +565,7 @@ {{/if}} , {{/each}}

+ @@ -754,6 +755,6 @@ - +