diff --git a/Makefile.am b/Makefile.am index b853f8f8a..d566c78a3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -365,8 +365,7 @@ webui_FILES = \ webui/lib/raphael.min.js \ webui/lib/elycharts.js \ webui/lib/elycharts.min.js \ - webui/img/house-16.ico \ - webui/img/download-16.ico \ + webui/lib/material-icons.woff2 \ webui/img/icons.png \ webui/img/icons-2x.png \ webui/img/transmit.gif \ diff --git a/daemon/postprocess/Unpack.cpp b/daemon/postprocess/Unpack.cpp index 48093f3c8..39d544a6c 100644 --- a/daemon/postprocess/Unpack.cpp +++ b/daemon/postprocess/Unpack.cpp @@ -2,7 +2,8 @@ * This file is part of nzbget. See . * * Copyright (C) 2013-2018 Andrey Prygunkov - * + * Copyright (C) 2023-2024 Denis + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -14,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ @@ -732,6 +733,10 @@ bool UnpackController::Cleanup() ok = false; } +#ifndef WIN32 + FileSystem::SetFilePermissionsWithUmask(dstFile.Str(), g_Options->GetUMask()); +#endif + extractedFiles.push_back(filename); } } diff --git a/daemon/util/FileSystem.cpp b/daemon/util/FileSystem.cpp index 38aed5dcc..2992ec359 100644 --- a/daemon/util/FileSystem.cpp +++ b/daemon/util/FileSystem.cpp @@ -2,6 +2,7 @@ * This file is part of nzbget. See . * * Copyright (C) 2007-2017 Andrey Prygunkov + * Copyright (C) 2024 Denis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -956,6 +957,16 @@ void FileSystem::FixExecPermission(const char* filename) chmod(filename, buffer.st_mode); } } + +void FileSystem::SetFilePermissionsWithUmask(const char* filename, mode_t umask) +{ + struct stat buffer; + if (!stat(filename, &buffer)) + { + mode_t permissions = buffer.st_mode & ~umask; + chmod(filename, permissions); + } +} #endif #ifdef WIN32 diff --git a/daemon/util/FileSystem.h b/daemon/util/FileSystem.h index fa21bb7ef..c9941e00a 100644 --- a/daemon/util/FileSystem.h +++ b/daemon/util/FileSystem.h @@ -2,6 +2,7 @@ * This file is part of nzbget. See . * * Copyright (C) 2007-2017 Andrey Prygunkov + * Copyright (C) 2024 Denis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ @@ -61,6 +62,7 @@ class FileSystem #ifndef WIN32 static CString ExpandHomePath(const char* filename); static void FixExecPermission(const char* filename); + static void SetFilePermissionsWithUmask(const char* filename, mode_t umask); #endif static CString ExpandFileName(const char* filename); static CString GetExeFileName(const char* argv0); diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index d10e521cc..a871f2e40 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -11,9 +11,22 @@ if [ -f /downloads/nzbget.lock ]; then rm /downloads/nzbget.lock fi +# change userid and groupid +PUID=${PUID:-1000} +PGID=${PGID:-1000} +groupmod -o -g "$PGID" users >/dev/null +usermod -o -u "$PUID" user >/dev/null + # create default config if not exist if [ ! -f /config/nzbget.conf ]; then cp /app/nzbget/share/nzbget/nzbget.conf /config/nzbget.conf + chown user:users /config/nzbget.conf +fi + +# create scripts dir +if [ ! -d /downloads/scripts ]; then + mkdir -p /downloads/scripts + chown user:users /downloads/scripts fi # parse env vars to options @@ -25,21 +38,12 @@ if [ ! -z "${NZBGET_PASS}" ]; then OPTIONS="${OPTIONS}-o ControlPassword=${NZBGET_PASS} " fi -# create scripts dir -mkdir -p /downloads/scripts - -# change userid and groupid -PUID=${PUID:-1000} -PGID=${PGID:-1000} -groupmod -o -g "$PGID" users >/dev/null -usermod -o -u "$PUID" user >/dev/null - -chown -R user:users /config || CONFIG_CHOWN_STATUS=$? +chown user:users /config || CONFIG_CHOWN_STATUS=$? if [ ! -z $CONFIG_CHOWN_STATUS ]; then echo "*** Could not set permissions on /config ; this container may not work as expected ***" fi -chown -R user:users /downloads || DOWNLOADS_CHOWN_STATUS=$? +chown user:users /downloads || DOWNLOADS_CHOWN_STATUS=$? if [ ! -z $DOWNLOADS_CHOWN_STATUS ]; then echo "*** Could not set permissions on /downloads ; this container may not work as expected ***" fi diff --git a/osx/Resources/Images/mainicon.icns b/osx/Resources/Images/mainicon.icns index 3e2ba50f0..cc5e1223e 100644 Binary files a/osx/Resources/Images/mainicon.icns and b/osx/Resources/Images/mainicon.icns differ diff --git a/tests/util/JsonTest.cpp b/tests/util/JsonTest.cpp index 12b41046d..cb9fe09c7 100644 --- a/tests/util/JsonTest.cpp +++ b/tests/util/JsonTest.cpp @@ -1,7 +1,7 @@ /* * This file is part of nzbget. See . * - * CCopyright (C) 2023 Denis + * Copyright (C) 2023 Denis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/webui/config.js b/webui/config.js index dec6e71d9..6a716e3b1 100644 --- a/webui/config.js +++ b/webui/config.js @@ -129,7 +129,7 @@ var Options = (new function($) name: getOptionName(extConf, rawOption), value: String(rawOption.Value), defvalue: String(rawOption.Value), - sectionId: extConf.Name + '_' + rawOption.Section, + sectionId: extConf.Name + '_' + rawOption.Section.toUpperCase(), select, description: arrToStr(rawOption.Description), nocontent: false, @@ -138,7 +138,7 @@ var Options = (new function($) multi: rawOption.Multi, prefix: rawOption.Prefix, template: rawOption.Multi, - section: rawOption.Section, + section: rawOption.Section.toUpperCase(), type, }; } @@ -150,7 +150,7 @@ var Options = (new function($) name: getOptionName(extConf, rawCommand), value: null, defvalue: rawCommand.Action, - sectionId: extConf.Name + '_' + rawCommand.Section, + sectionId: extConf.Name + '_' + rawCommand.Section.toUpperCase(), select: [], description: arrToStr(rawCommand.Description), nocontent: false, @@ -159,7 +159,7 @@ var Options = (new function($) multiid: 1, template: rawCommand.Multi, prefix: rawCommand.Prefix, - section: rawCommand.Section, + section: rawCommand.Section.toUpperCase(), multi: rawCommand.Multi, type: 'command', }; @@ -241,29 +241,29 @@ var Options = (new function($) scriptConfig['license'] = this.serverTemplateData[i].License; scriptConfig['version'] = this.serverTemplateData[i].Version; - for (var j = 0; j < this.serverTemplateData[i].Options.length; j++) + for (var j = 0; j < this.serverTemplateData[i].Commands.length; j++) { - var option = makeOption(this.serverTemplateData[i], this.serverTemplateData[i].Options[j]); - if (sections[option.section]) + var command = makeCommandOption(this.serverTemplateData[i], this.serverTemplateData[i].Commands[j]); + if (sections[command.section]) { - sections[option.section].options.push(option); + sections[command.section].options.push(command); } else { - sections[option.section] = makeSection(this.serverTemplateData[i], option); + sections[command.section] = makeSection(this.serverTemplateData[i], command); } } - for (var j = 0; j < this.serverTemplateData[i].Commands.length; j++) + for (var j = 0; j < this.serverTemplateData[i].Options.length; j++) { - var command = makeCommandOption(this.serverTemplateData[i], this.serverTemplateData[i].Commands[j]); - if (sections[command.section]) + var option = makeOption(this.serverTemplateData[i], this.serverTemplateData[i].Options[j]); + if (sections[option.section]) { - sections[command.section].options.push(command); + sections[option.section].options.push(option); } else { - sections[command.section] = makeSection(this.serverTemplateData[i], command); + sections[option.section] = makeSection(this.serverTemplateData[i], option); } } @@ -933,7 +933,7 @@ var Config = (new function($) } else { - html += ''; + html += ''; } } if (!valfound) @@ -977,14 +977,14 @@ var Config = (new function($) html += '
'; html += ''; html += ''; - html += ''; + html += ''; html += '
'; } else if (option.commandopts) { option.type = 'command'; html += ''; } else @@ -1028,13 +1028,13 @@ var Config = (new function($) if (htmldescr.indexOf('INFO FOR DEVELOPERS:') > -1) { - htmldescr = htmldescr.replace(/INFO FOR DEVELOPERS:
/g, ''); + htmldescr = htmldescr.replace(/INFO FOR DEVELOPERS:
/g, ''); htmldescr += ''; } if (htmldescr.indexOf('MORE INFO:') > -1) { - htmldescr = htmldescr.replace(/MORE INFO:
/g, ''); + htmldescr = htmldescr.replace(/MORE INFO:
/g, ''); htmldescr += ''; } @@ -1071,22 +1071,22 @@ var Config = (new function($) if (hasoptions) { html += '
'; - html += ''; - html += ' '; - html += ' '; if (setname.toLowerCase() === 'feed') { - html += ' '; } if (setname.toLowerCase() === 'server') { - html += ' '; - html += ' '; } html += '
'; @@ -1096,7 +1096,7 @@ var Config = (new function($) if (!hasmore) { html += '
'; - html += ''; html += '
'; } @@ -1211,7 +1211,7 @@ var Config = (new function($) var section = {}; section.name = conf.shortName.toUpperCase(); section.caption = conf.name.toUpperCase(); - section.id = conf.id + '_'; + section.id = conf.id + '_OPTIONS'; section.options = []; firstVisibleSection = section; conf.sections.push(section); @@ -1312,8 +1312,11 @@ var Config = (new function($) this.switchClick = function(control) { - $('.btn', $(control).parent()).removeClass('btn-primary'); + var btn = $('.btn', $(control).parent()); + btn.removeClass('btn-primary'); + btn.addClass('btn-default'); $(control).addClass('btn-primary'); + $(control).removeClass('btn-default'); // not for page Postprocess in download details if (config) @@ -1615,7 +1618,15 @@ var Config = (new function($) function setViewMode() { - $('#Config_ViewCompact i').toggleClass('icon-ok', compactMode).toggleClass('icon-empty', !compactMode); + if (!compactMode) + { + $('#Config_ViewCompact > .material-icon').text(''); + } + else + { + $('#Config_ViewCompact > .material-icon').text('done'); + } + $ConfigContent.toggleClass('hide-help-block', compactMode); } @@ -2370,7 +2381,12 @@ var ScriptListDialog = (new function($) function updateTable(selectedList) { - var reorderButtons = '
'; + var reorderButtons = '
' + + 'vertical_align_top' + + 'north' + + 'south' + + 'vertical_align_bottom' + + '
'; var data = []; for (var i=0; i < scriptList.length; i++) { @@ -3347,8 +3363,10 @@ var ExtensionManager = (new function($) this.tbody = 'ExtensionManagerTBody'; this.extensionsUrl = 'https://raw.githubusercontent.com/nzbgetcom/nzbget-extensions/main/extensions.json'; - var scriptOrderId = "ScriptOrder"; - var extensionsId = "Extensions"; + var scriptOrderId = 'ScriptOrder'; + var extensionsId = 'Extensions'; + + var defaultSectionName = 'OPTIONS'; var installedExtensions = []; var remoteExtensions = []; @@ -3365,7 +3383,7 @@ var ExtensionManager = (new function($) installedExtensions = exts.map(function(ext) { var extension = new Extension(); - extension.id = ext.Name + "_OPTIONS"; + extension.id = ext.Name + '_' + defaultSectionName; extension.entry = ext.Entry; extension.displayName = ext.DisplayName; extension.version = ext.Version; @@ -3391,7 +3409,7 @@ var ExtensionManager = (new function($) remoteExtensions = JSON.parse(data).map(function(ext) { var extension = new Extension(); - extension.id = ext.name + "_OPTIONS"; + extension.id = ext.Name + '_' + defaultSectionName; extension.displayName = ext.displayName; extension.version = ext.version; extension.author = ext.author; @@ -3727,27 +3745,38 @@ var ExtensionManager = (new function($) function disableDeleteBtn(ext, disabled) { - $('#DeleteBtn_' + ext.name).prop({ disabled }); + disableBtnToggle('#DeleteBtn_' + ext.name, disabled); } function disableDownloadBtn(ext, disabled) { - $('#DownloadBtn_' + ext.name).prop({ disabled }); + disableBtnToggle('#DownloadBtn_' + ext.name, disabled); } function disableUpdateBtn(ext, disabled) { - $('#UpdateBtn_' + ext.name).prop({ disabled }); + disableBtnToggle('#UpdateBtn_' + ext.name, disabled); } function disableConfigureBtn(ext, disabled) { - $('#ConfigureBtn_' + ext.name).prop({ disabled }); + disableBtnToggle('#ConfigureBtn_' + ext.name, disabled); } function disableActivateBtn(ext, disabled) { - $('#ActivateBtn_' + ext.name).prop({ disabled }); + disableBtnToggle('#ActivateBtn_' + ext.name, disabled); + } + + function disableBtnToggle(id, disabled) + { + if (disabled) + { + $(id).addClass('btn--disabled'); + return; + } + + $(id).removeClass('btn--disabled'); } function disableOrderingBtns(ext, disabled) @@ -3854,7 +3883,7 @@ var ExtensionManager = (new function($) { var btn = $('') + + '" title="Delete">delete') .off('click') .on('click', function() { showDeleteExtensionDropdown(ext); }); @@ -3865,7 +3894,7 @@ var ExtensionManager = (new function($) { var btn = $('') + + '" title="Download">download') .off('click') .on('click', function() { downloadExtension(ext); }); @@ -3876,7 +3905,7 @@ var ExtensionManager = (new function($) { var btn = $(''); + + '">update'); if (ext.outdated) { btn.attr({ title: "Update to new version" }); @@ -3894,9 +3923,9 @@ var ExtensionManager = (new function($) function getConfigureBtn(ext) { - var btn = $('') + + '" title="Configure">settings') .off('click') .on('click', function() { Config.showSection(ext.id, true); }); @@ -3905,26 +3934,26 @@ var ExtensionManager = (new function($) function getActivateBtn(ext) { - var btn = $('') .off('click') .on('click', function() { activateExt(ext); }); if (ext.isActive && !ext.testError) { - btn.append(''); - btn.attr({ title: "Deactivate (restart needed)" }); + btn.append('pause'); + btn.attr({ title: "Deactivate" }); btn.addClass('btn-warning'); } else if(!ext.isActive && !ext.testError) { - btn.append(''); - btn.attr({ title: "Activate for new downloads (restart needed)" }); + btn.append('play_arrow'); + btn.attr({ title: "Activate for new downloads" }); btn.addClass('btn-success'); } else { - btn.append(''); + btn.append('warning'); btn.attr({ title: ext.testError }); btn.addClass('btn-warning'); } @@ -3966,7 +3995,7 @@ var ExtensionManager = (new function($) if (ext.homepage) { var cell = $(''); - cell.append($('')); + cell.append($('home')); return cell; } @@ -4006,16 +4035,16 @@ var ExtensionManager = (new function($) var cell = $(''); var container = $('
'); var title = "Modify execution order (restart needed)"; - var mvTop = $('
') + var mvTop = $('vertical_align_top') .off('click') .on('click', function() { moveTop(ext); }); - var mvUp = $('
') + var mvUp = $('north') .off('click') .on('click', function() { moveUp(ext); }); - var mvDown = $('
') + var mvDown = $('south') .off('click') .on('click', function() { moveDown(ext); }); - var mvBottom = $('
') + var mvBottom = $('vertical_align_bottom') .off('click') .on('click', function() { moveBottom(ext); }); diff --git a/webui/dark-theme.css b/webui/dark-theme.css new file mode 100644 index 000000000..9b87f9dd5 --- /dev/null +++ b/webui/dark-theme.css @@ -0,0 +1,639 @@ +/*! + * This file is part of nzbget. See . + * + * Copyright (C) 2024 Denis + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +html { + scrollbar-color: #333 #626262; +} + +body { + background-color: #333; + color: #f5f5f5; +} + +.btn-default { + color: #f5f5f5; + background-color: #414141; + background-image: -ms-linear-gradient(top, #555555, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); + background-image: -webkit-linear-gradient(top, #555555, #222222); + background-image: -o-linear-gradient(top, #555555, #222222); + background-image: -moz-linear-gradient(top, #555555, #222222); + background-image: linear-gradient(top, #555555, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; +} + +.btn-active { + color: #333; + background-color: #bbb; + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #b3b3b3; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-active .caret { + border-top: 4px solid #333; + opacity: unset; +} + +textarea, +.btn-default:hover:not(.btn-active) { + color: inherit; + background-color: #212529; + background-origin: border-box; +} + +.back { + color: inherit; +} + +.pagination a:hover { + background-color: #212529; +} + +.modal .input-xlarge { + background-color: #212529; +} + +.btn-primary { + background-color: #0074CC; +} + +.btn-primary:hover { + background-color: #0055CC; +} + +.btn-danger { + background-color: #da4f49; +} + +.btn-danger:hover { + background-color: #bd362f; +} + +.btn-info { + background-color: #5bc0de; +} + +.btn-info:hover { + background-color: #2f96b4; +} + +#InfoBlock div:hover, +.close, +label, +.control-label, +.dropdown-menu li a, +#AddDialog_URLProp, +.help-block, +.table a:hover, +#StatDialog_Back, +.table a { + color: inherit; +} + +.close:hover, +a:hover { + color: #fff; +} + +.table td:hover { + background-color: #212529; +} + +.table tbody tr:hover td, .table-hover tbody tr:hover th { + background-color: #333; +} + +.table th, .table td { + border: 0.5px solid #626262; +} + +.table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th { + background-color: #212529; +} + +.progress-block { + color: #212529; +} + +.caret, +.dropup .caret { + border-top: 4px solid #f5f5f5; +} + +.input-prepend .add-on, .input-append .add-on, +.add-on { + background-color: #626262; + color: inherit; + text-shadow: none; + border: 1px solid #626262; +} + +input { + background-color: #212529; + color: inherit; + border: 1px solid #626262; +} + +table.table-cancheck tr.checked div.img-check { + background-position: -467px -19px; +} + +table.table-cancheck tr.checkremove div.img-check { + background-position: -466px -114px; +} + +.modal, +.modal-body, +.modal-footer { + background-color: #212529; + color: inherit; +} + +.modal-header { + border-bottom: 1px solid #626262; +} + +.modal-footer { + border-top: 1px solid #626262; +} + +.nav > li > a:hover { + background-color: #005580; +} + +.nav-list .divider { + background-color: #626262; + border: 1px solid #626262; +} + +.btn-group.open .btn.dropdown-toggle:not(.btn-active), +.config-header .btn, +.dropdown-menu, +select { + color: inherit; + background-color: #212529; +} + +.navbar-fixed-top .navbar-inner { + padding: 0; + min-height: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + color: #bbb; +} + +#PlayCaret { + margin-top: 3px; + margin-left: 9px; + opacity: 0.75; + filter: alpha(opacity=75); +} + +.dropup .caret, .navbar-fixed-bottom .dropdown .caret { + border-top: none; + border-bottom: 4px solid #f5f5f5; +} + +.navbar .nav .active > a, +.navbar .nav .active > a:hover { + outline: 0; + color: #000; + text-shadow: none; + background: rgb(255,255,255); /* Old browsers */ + background: -moz-linear-gradient(top, rgb(255,255,255) 0%, rgb(238,238,238) 45%, rgb(231,231,231) 55%, rgb(255,255,255) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(255,255,255)), color-stop(45%,rgb(238,238,238)), color-stop(55%,rgb(231,231,231)), color-stop(100%,rgb(255,255,255))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgb(255,255,255) 0%,rgb(238,238,238) 45%,rgb(231,231,231) 55%,rgb(255,255,255) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgb(255,255,255) 0%,rgb(238,238,238) 45%,rgb(231,231,231) 55%,rgb(255,255,255) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgb(255,255,255) 0%,rgb(238,238,238) 45%,rgb(231,231,231) 55%,rgb(255,255,255) 100%); /* IE10+ */ + background: linear-gradient(to bottom, rgb(255,255,255) 0%,rgb(238,238,238) 45%,rgb(231,231,231) 55%,rgb(255,255,255) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#f5f5f5',GradientType=0 ); /* IE6-9 */ +} + +/* headers in navbar menu */ +.menu-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #f5f5f5; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); + text-transform: uppercase; +} + +.search-caret-button .caret { + margin-top: 3px; + margin-left: 9px; + border-top-color: #f5f5f5; + border-bottom-color: #f5f5f5; + opacity: 0.75; + filter: alpha(opacity=75); +} + +.focused .search-caret-button .caret { + margin-left: 5px; + border-top-color: #f5f5f5; + border-bottom-color: #f5f5f5; +} + +.badge-active { + background-color: #3a87ad; + color: #fff; + text-shadow: none; +} + +.table-bordered { + border: 1px solid #626262; + border-collapse: collapse; +} + +.table tbody tr:hover { + background-color: #f5f5f5; +} + +hr { + border: 1px solid #626262; +} + +table > thead > tr > th.table-selector { + text-align: center; + background: repeating-linear-gradient(-45deg, #1a1a1a, #333 6px, #666 6px, #666 12px); + padding: 2px; + font-size: 12px; + line-height: 14px; +} + +div.check { + width: 12px; + height: 12px; + border: 1px solid #626262; + margin-top: 2px; + margin-bottom: 3px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} +div.check:hover { + border: 1px solid #0088cc; +} + +tr.checked, +tr.checked td, +tr.checked:nth-child(odd) { + background-color: #005580; +} + +.table-striped tbody tr.checked:nth-child(odd) td, +.checked .progress { + background-color: #005580; +} + +.table tbody tr.checked:hover, +.table tbody tr.checked:hover td { + background-color: #005580; +} + +.table.check-simple tbody tr.checked:hover, +.table.check-simple tbody tr.checked:hover td { + background-color: #005580; +} + +.checked .progress { + background-color: #f5f5f5; +} + +.progress { + margin-bottom: 0px; + background: #f0f0f0; +} + +/* style for queued downloads, based on ".progress-success.progress-striped .bar" from bootstrap.css */ +.progress-none.progress-striped .bar { + background-color: #c0c0c0; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#d0d0d0', endColorstr='#c0c0c0', GradientType=0); +} + +td.dropdown-cell > div:not(.dropdown-disabled):hover::after { + border-top: 4px solid #f5f5f5; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; + position: absolute; + margin-bottom: 8px; + margin-left: 2px; +} + +.dropdown-menu li:not(:hover) .empty-item { + color: #bbb; +} + +.dropdown-warning { + text-align: center; + background: repeating-linear-gradient(-45deg, #1a1a1a, #333 6px, #666 6px, #666 12px); + padding: 2px; + font-size: 12px; + line-height: 14px; + border-top: solid 1px #626262; + border-bottom: solid 1px #626262; + margin-bottom: 1px; +} + +td:hover span.none-category { + color: #aaa; +} + +.uneditable-mulitline-input { + display: inline-block; + width: 340px; + overflow: hidden; + cursor: not-allowed; + background-color: #f5f5f5; + border-color: #eee; + border: 1px solid #626262; + padding: 4px; + padding-right: 20px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.dragover, .dragover .table-striped tbody tr:nth-child(odd) td, .dragover .table-striped tbody tr:nth-child(odd) th { + background-color: #414141; +} + +.alert-inverse { + color: #f5f5f5; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #414141; + border-color: #222222; +} + +.confirm-help-block { + color: #f5f5f5; + font-size: 13px; + line-height: 16px; + margin-bottom: 0; +} + +.table .btn-success, +.table .btn-success:hover { + color: #f5f5f5; +} + +#StatDialog_Custom a, +#StatDialog_Custom a:hover, +#AddDialog_Files a, +#AddDialog_Files a:hover { + cursor: pointer; +} + +#ConfigNav.nav-list a { + color: #f5f5f5; + text-decoration: none; + padding-top: 5px; + padding-bottom: 5px; + font-size: 12px; +} + +#ConfigNav.nav-list > .active > a, +#ConfigNav.nav-list > .active > a:hover { + color: #f5f5f5; + background-color: #005580; +} + +#ConfigNav { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + border: 1px solid #626262; + padding: 8px 15px; + background-color: #212529; + margin-bottom: 15px; +} + +#ConfigContent .config-header { + padding: 7px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + margin-bottom: 20px; + padding-right: 0; + padding-top: 0; + border-bottom: 1px solid #626262; +} + +.config-header .btn { + margin-top: 7px; + margin-right: 0; + background-image: none; + border: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.failure-message, +span.help-option-title { + color: #ffda6a; +} + +.config-settitle { + font-size: 14px; + font-weight: bold; + background-color: #505050; + color: #f5f5f5; + padding: 7px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + margin-bottom: 20px; + border-bottom: 1px solid #626262; +} + +.config-multicaption { + color: #c0c0c0; + font-weight: normal; +} + +#DownloadsEdit_ParamTab div.control-group.wants-divider, +#HistoryEdit_ParamTab div.control-group.wants-divider, +#ConfigContent div.control-group, +#ConfigContent.search div.control-group.multiset { + border-bottom: 1px solid #626262; + margin-bottom: 15px; + padding-bottom: 12px; +} + +.btn-switch input:focus { + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.search .option-name:hover { + cursor: pointer; + text-decoration: underline; + color: #005580; +} + +.table .update-release-notes { + color: #0074cc; + font-size: 11px; + height: 10px; + outline: none; +} + +#UpdateDialog_Hint p { + color: #555; + margin-bottom: 3px; +} + +.log-dialog .modal-body pre { + min-height: 270px; + background-color: #222222; + border: 1px solid #626262; + color: #cccccc; + padding: 3px 6px; + margin-bottom: 0px; + position: absolute; + top: 15px; + bottom: 15px; + left: 15px; + right: 15px; + overflow-y: auto; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +#FeedFilterDialog_FilterBlock { + position: absolute; + left: 15px; + width: 300px; + bottom: 0; + height: auto; + padding-top: 0; + margin-bottom: 12px; + padding: 0; + font-size: 12px; + line-height: 18px; + border: 1px solid #626262;; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +#FeedFilterDialog_FilterHeader { + font-size: 13px; + font-weight: bold; + margin-top: 5px; + padding-left: 6px; + height: 23px; + border-bottom: 1px solid #626262; + border-bottom: 1px solid rgba(0, 0, 0, 0.15); +} + +#FeedFilterDialog_FilterLines { + position: absolute; + left: 0; + top: 29px; + bottom: 0px; + width: 32px; + height: auto; + overflow: hidden; + border-right: 1px solid #626262; +} + +#FeedFilterDialog_FilterNumbers .lineno { + color: #3A87AD; + padding-right: 5px; + padding-top: 0; + text-align: right; + font-weight: bold; + white-space: nowrap; +} + +#FeedFilterDialog_FilterClient { + position: absolute; + left: 33px; + right: 0px; + top: 29px; + bottom: 0px; + width: auto; + padding-left: 3px; + height: auto; +} + +#TableDragBox { + position: absolute; + left: 100px; + top: 100px; + text-align: center; + border: 1px solid #626262; + background-color: #f8f8f8; + display: none; + cursor: grabbing; + cursor: -webkit-grabbing; + z-index: 5000; +} + +#TableDragBox .badge { + position: absolute; + left: 0px; + top: -12px; + text-align: center; + padding: 1px 6px; + color: #f5f5f5; + background-color: #D70015; +} + +tr.drag-source > td { + background-color: #f5f5f5 !important; + color: #f5f5f5 !important; + visibility: visible; +} + +.table-striped tbody tr.drag-finish td, +.table-striped tbody tr.drag-finish .progress, +.table-striped tbody tr.drag-finish td a { + background-color: #E6FAE4 !important; +} \ No newline at end of file diff --git a/webui/downloads.js b/webui/downloads.js index 05e21146b..4bc7689ed 100644 --- a/webui/downloads.js +++ b/webui/downloads.js @@ -627,8 +627,8 @@ var Downloads = (new function($) var editIds = buildContextIdList(group); $PriorityMenu.data('nzbids', editIds); DownloadsUI.updateContextWarning($PriorityMenu, editIds); - $('i', $PriorityMenu).removeClass('icon-ok').addClass('icon-empty'); - $('li[data=' + group.MaxPriority + '] i', $PriorityMenu).addClass('icon-ok'); + $('i', $PriorityMenu).css('visibility','hidden'); + $('li[data=' + group.MaxPriority + '] i', $PriorityMenu).css('visibility','visible'); Frontend.showPopupMenu($PriorityMenu, 'left', { left: $(this).offset().left - 30, top: $(this).offset().top, width: $(this).width() + 30, height: $(this).outerHeight() - 2}); @@ -671,8 +671,8 @@ var Downloads = (new function($) var editIds = buildContextIdList(group); $CategoryMenu.data('nzbids', editIds); DownloadsUI.updateContextWarning($CategoryMenu, editIds); - $('i', $CategoryMenu).removeClass('icon-ok').addClass('icon-empty'); - $('li[data="' + group.Category + '"] i', $CategoryMenu).addClass('icon-ok'); + $('i', $CategoryMenu).text(''); + $('li[data="' + group.Category + '"] i', $CategoryMenu).text('done'); Frontend.showPopupMenu($CategoryMenu, 'left', { left: $(this).offset().left - 30, top: $(this).offset().top, diff --git a/webui/edit.js b/webui/edit.js index 679e925be..baa62cdd4 100644 --- a/webui/edit.js +++ b/webui/edit.js @@ -155,7 +155,7 @@ var DownloadsEditDialog = (new function($) table += '' + (group.ServerStats.length > 0 ? '' : '') + 'Articles (total/completion)' + - (group.ServerStats.length > 0 ? ' ' : '') + + (group.ServerStats.length > 0 ? ' arrow_right_alt' : '') + '' + group.TotalArticles + ' / ' + completion + ''; $('#DownloadsEdit_Statistics').html(table); @@ -1403,7 +1403,7 @@ var DownloadsMergeDialog = (new function($) if (nzbIdList.indexOf(group.NZBID) > -1) { mergeEditIDList.push(group.NZBID); - var html = ''; table += ''; table += ''; $('#HistoryEdit_Statistics').html(table); diff --git a/webui/feed.js b/webui/feed.js index 2c7a93e1a..da0d8ae62 100644 --- a/webui/feed.js +++ b/webui/feed.js @@ -319,8 +319,8 @@ var FeedDialog = (new function($) $('#FeedDialog_Badge_BACKLOG,#FeedDialog_Badge_BACKLOG2').text(countBacklog); } - $('#FeedDialog_Toolbar .btn').removeClass('btn-inverse'); - $('#FeedDialog_Badge_' + curFilter + ',#FeedDialog_Badge_' + curFilter + '2').closest('.btn').addClass('btn-inverse'); + $('#FeedDialog_Toolbar .btn').removeClass('btn-active'); + $('#FeedDialog_Badge_' + curFilter + ',#FeedDialog_Badge_' + curFilter + '2').closest('.btn').addClass('btn-active'); $('#FeedDialog_Toolbar .badge').removeClass('badge-active'); $('#FeedDialog_Badge_' + curFilter + ',#FeedDialog_Badge_' + curFilter + '2').addClass('badge-active'); @@ -330,8 +330,8 @@ var FeedDialog = (new function($) tableInitialized = true; } - $('#FeedDialog_Titles,#FeedDialog_Titles2').toggleClass('btn-inverse', !filenameMode); - $('#FeedDialog_Filenames,#FeedDialog_Filenames2').toggleClass('btn-inverse', filenameMode); + $('#FeedDialog_Titles,#FeedDialog_Titles2').toggleClass('btn-active', !filenameMode); + $('#FeedDialog_Filenames,#FeedDialog_Filenames2').toggleClass('btn-active', filenameMode); $('#FeedDialog_ItemTable_Name').text(filenameMode ? 'Filename' : 'Title'); } @@ -715,8 +715,8 @@ var FeedFilterDialog = (new function($) $('#FeedFilterDialog_Badge_IGNORED,#FeedFilterDialog_Badge_IGNORED2').text(countIgnored); } - $('#FeedFilterDialog_Toolbar .FeedFilterDialog-filter .btn').removeClass('btn-inverse'); - $('#FeedFilterDialog_Badge_' + curFilter + ',#FeedFilterDialog_Badge_' + curFilter + '2').closest('.btn').addClass('btn-inverse'); + $('#FeedFilterDialog_Toolbar .FeedFilterDialog-filter .btn').removeClass('btn-active'); + $('#FeedFilterDialog_Badge_' + curFilter + ',#FeedFilterDialog_Badge_' + curFilter + '2').closest('.btn').addClass('btn-active'); $('#FeedFilterDialog_Toolbar .badge').removeClass('badge-active'); $('#FeedFilterDialog_Badge_' + curFilter + ',#FeedFilterDialog_Badge_' + curFilter + '2').addClass('badge-active'); @@ -726,8 +726,8 @@ var FeedFilterDialog = (new function($) tableInitialized = true; } - $('#FeedFilterDialog_Titles,#FeedFilterDialog_Titles2').toggleClass('btn-inverse', !filenameMode); - $('#FeedFilterDialog_Filenames,#FeedFilterDialog_Filenames2').toggleClass('btn-inverse', filenameMode); + $('#FeedFilterDialog_Titles,#FeedFilterDialog_Titles2').toggleClass('btn-active', !filenameMode); + $('#FeedFilterDialog_Filenames,#FeedFilterDialog_Filenames2').toggleClass('btn-active', filenameMode); $('#FeedFilterDialog_ItemTable_Name').text(filenameMode ? 'Filename' : 'Title'); } @@ -798,8 +798,14 @@ var FeedFilterDialog = (new function($) function updateRematchState() { Util.show($CHAutoRematch, autoUpdate); - $RematchIcon.toggleClass('icon-process', !autoUpdate); - $RematchIcon.toggleClass('icon-process-auto', autoUpdate); + + if (autoUpdate) + { + $RematchIcon.text('sync'); + return; + } + + $RematchIcon.text('sync_disabled'); } function filterKeyPress(event) diff --git a/webui/history.js b/webui/history.js index 371f7e58b..7992bf1ed 100644 --- a/webui/history.js +++ b/webui/history.js @@ -466,8 +466,8 @@ var History = (new function($) var editIds = buildContextIdList(hist); $CategoryMenu.data('nzbids', editIds); DownloadsUI.updateContextWarning($CategoryMenu, editIds); - $('i', $CategoryMenu).removeClass('icon-ok').addClass('icon-empty'); - $('li[data="' + hist.Category + '"] i', $CategoryMenu).addClass('icon-ok'); + $('i', $CategoryMenu).text(''); + $('li[data="' + hist.Category + '"] i', $CategoryMenu).text('done'); Frontend.showPopupMenu($CategoryMenu, 'bottom-left', { left: $(this).offset().left - 30, top: $(this).offset().top, @@ -519,8 +519,8 @@ var History = (new function($) $('#History_Badge_DELETED,#History_Badge_DELETED2').text(countDeleted); $('#History_Badge_DUPE,#History_Badge_DUPE2').text(countDupe); - $('#HistoryTab_Toolbar .history-filter').removeClass('btn-inverse'); - $('#History_Badge_' + curFilter + ',#History_Badge_' + curFilter + '2').closest('.history-filter').addClass('btn-inverse'); + $('#HistoryTab_Toolbar .history-filter').removeClass('btn-active'); + $('#History_Badge_' + curFilter + ',#History_Badge_' + curFilter + '2').closest('.history-filter').addClass('btn-active'); $('#HistoryTab_Toolbar .badge').removeClass('badge-active'); $('#History_Badge_' + curFilter + ',#History_Badge_' + curFilter + '2').addClass('badge-active'); } @@ -534,8 +534,7 @@ var History = (new function($) this.dupClick = function() { showDup = !showDup; - $('#History_Dup').toggleClass('btn-inverse', showDup); - $('#History_DupIcon').toggleClass('icon-mask', !showDup).toggleClass('icon-mask-white', showDup); + $('#History_Dup').toggleClass('btn-active', showDup); Refresher.update(); } diff --git a/webui/img/favicon-256x256-opaque.png b/webui/img/favicon-256x256-opaque.png index 4f9edf4be..009dfdb28 100644 Binary files a/webui/img/favicon-256x256-opaque.png and b/webui/img/favicon-256x256-opaque.png differ diff --git a/webui/img/favicon-256x256.png b/webui/img/favicon-256x256.png index 061eced29..363f9e97c 100644 Binary files a/webui/img/favicon-256x256.png and b/webui/img/favicon-256x256.png differ diff --git a/webui/img/favicon.ico b/webui/img/favicon.ico index b3fe04fc9..d0805b4d9 100644 Binary files a/webui/img/favicon.ico and b/webui/img/favicon.ico differ diff --git a/webui/img/house-16.ico b/webui/img/house-16.ico deleted file mode 100644 index 4c8b4f77d..000000000 Binary files a/webui/img/house-16.ico and /dev/null differ diff --git a/webui/img/icons-2x.png b/webui/img/icons-2x.png index 9591af511..61e516889 100644 Binary files a/webui/img/icons-2x.png and b/webui/img/icons-2x.png differ diff --git a/webui/img/icons.png b/webui/img/icons.png index a988733a1..0d2e6d78a 100644 Binary files a/webui/img/icons.png and b/webui/img/icons.png differ diff --git a/webui/img/warning-16.ico b/webui/img/warning-16.ico deleted file mode 100644 index 60859cc8f..000000000 Binary files a/webui/img/warning-16.ico and /dev/null differ diff --git a/webui/index.html b/webui/index.html index 2cc18a230..e11f74f71 100644 --- a/webui/index.html +++ b/webui/index.html @@ -3,7 +3,6 @@ * This file is part of nzbget. See . * * Copyright (C) 2012-2019 Andrey Prygunkov - * Copyright (C) 2023 Denis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,6 +30,7 @@ + + @@ -101,15 +103,14 @@
-
-
' + + var html = '
draft' + Util.formatNZBName(group.NZBName) + '
'; $('#DownloadsMerge_Files').append(html); } @@ -1640,13 +1640,13 @@ var HistoryEditDialog = (new function($) var table = ''; table += '
Total '+ - '' + + 'arrow_right_alt' + '' + size + '
Files (total/remaining)' + hist.FileCount + ' / ' + hist.RemainingFileCount + '
' + (hist.ServerStats.length > 0 ? '' : '') + 'Articles (total/completion)' + - (hist.ServerStats.length > 0 ? ' ' : '') + + (hist.ServerStats.length > 0 ? ' arrow_right_alt' : '') + '' + hist.TotalArticles + ' / ' + completion + '
Pause Download
-
  • Pause Post-Processing
  • -
  • Pause NZB Scan
  • +
  • donePause Download
  • +
  • donePause Post-Processing
  • +
  • donePause NZB Scan
  • 30 Minutes
  • @@ -137,6 +138,11 @@
    --h --m
    + + +
    @@ -154,7 +160,7 @@
  • 30Seconds
  • 1Minute
  • Off
  • -
  • +
  • done
  • @@ -193,10 +199,10 @@ @@ -251,37 +257,37 @@

    Unsupported browser!

    - +
    - - - - - -
    -
    -
    -
    -
    -
    + + + + + +
    +
    +
    +
    +
    +
    - - - - + + + +
    -
    -
    -
    -
    +
    +
    +
    +
    - +
    @@ -624,6 +630,9 @@

    iconSweets

    NZBGet web-interface includes selected icons from collections iconSweets and iconSweets2 by Yummygum.

    The icons are generally licensed under a custom license but used in NZBGet with author's permission.

    +

    Google Material Icons

    +

    Material Icons is an icon font useful for implementing Google's Material design language licensed under the Apache license.

    +

    Boost

    NZBGet uses Boost by Boost organization and wider Boost community

    Boost is licensed under the Boost Software License.

    @@ -660,7 +669,7 @@

    Boost

    - +

    Save settings to a local file.

    Export all settings for backup purpose. @@ -674,7 +683,7 @@

    Boost

    - +

    Load settings from a local file.

    @@ -686,7 +695,7 @@

    Boost

    - +

    Check if a new version of NZBGet is available.

    Should a new version be found you'll be asked to install it. @@ -774,9 +783,9 @@

    @@ -868,7 +877,7 @@

    Statistics and Status

    @@ -898,7 +907,7 @@

    Choose period

    @@ -942,7 +951,7 @@

    Speed Limit

    @@ -980,7 +992,7 @@

    Temporary Pause

    @@ -1009,7 +1021,7 @@

    Save Filter