diff --git a/approot/admin-scannercontroller.xml b/approot/admin-scannercontroller.xml index 9abd7fe2..d5e17584 100644 --- a/approot/admin-scannercontroller.xml +++ b/approot/admin-scannercontroller.xml @@ -8,23 +8,23 @@
-
-
-
diff --git a/src/lms/ui/admin/ScannerController.cpp b/src/lms/ui/admin/ScannerController.cpp index 90bcb580..5cf4873c 100644 --- a/src/lms/ui/admin/ScannerController.cpp +++ b/src/lms/ui/admin/ScannerController.cpp @@ -56,8 +56,7 @@ class ReportResource : public Wt::WResource { public: - ReportResource(const Scanner::ScanStats& stats) - : _stats {stats} + ReportResource() { suggestFileName("report.txt"); } @@ -67,11 +66,22 @@ class ReportResource : public Wt::WResource beingDeleted(); } + void setScanStats(const Scanner::ScanStats& stats) + { + if (!_stats) + _stats = std::make_unique(); + + *_stats = stats; + } + void handleRequest(const Wt::Http::Request&, Wt::Http::Response& response) { - response.out() << Wt::WString::tr("Lms.Admin.ScannerController.errors-header").arg(_stats.errors.size()).toUTF8() << std::endl; + if (!_stats) + return; - for (const auto& error : _stats.errors) + response.out() << Wt::WString::tr("Lms.Admin.ScannerController.errors-header").arg(_stats->errors.size()).toUTF8() << std::endl; + + for (const auto& error : _stats->errors) { response.out() << error.file.string() << " - " << errorTypeToWString(error.error).toUTF8(); if (!error.systemError.empty()) @@ -81,12 +91,12 @@ class ReportResource : public Wt::WResource response.out() << std::endl; - response.out() << Wt::WString::tr("Lms.Admin.ScannerController.duplicates-header").arg(_stats.duplicates.size()).toUTF8() << std::endl; + response.out() << Wt::WString::tr("Lms.Admin.ScannerController.duplicates-header").arg(_stats->duplicates.size()).toUTF8() << std::endl; { auto transaction {LmsApp->getDbSession().createSharedTransaction()}; - for (const auto& duplicate : _stats.duplicates) + for (const auto& duplicate : _stats->duplicates) { const auto& track {Database::Track::find(LmsApp->getDbSession(), duplicate.trackId)}; if (!track) @@ -125,7 +135,7 @@ class ReportResource : public Wt::WResource return "?"; } - Scanner::ScanStats _stats; + std::unique_ptr _stats; }; @@ -133,10 +143,44 @@ ScannerController::ScannerController() : WTemplate {Wt::WString::tr("Lms.Admin.ScannerController.template")} { addFunction("tr", &Wt::WTemplate::Functions::tr); + addFunction("id", &Wt::WTemplate::Functions::id); using namespace Scanner; - auto onDbEvent = [&]() { refreshContents(); }; + { + _reportBtn = bindNew("report-btn", Wt::WString::tr("Lms.Admin.ScannerController.get-report")); + + auto reportResource {std::make_shared()}; + reportResource->setTakesUpdateLock(true); + _reportResource = reportResource.get(); + + Wt::WLink link {reportResource}; + link.setTarget(Wt::LinkTarget::NewWindow); + _reportBtn->setLink(link); + } + + Wt::WPushButton* scanBtn {bindNew("scan-btn", Wt::WString::tr("Lms.Admin.ScannerController.scan-now"))}; + scanBtn->clicked().connect([] + { + Service::get()->requestImmediateScan(false); + }); + + Wt::WPushButton* fullScanBtn {bindNew("full-scan-btn", Wt::WString::tr("Lms.Admin.ScannerController.force-scan-now"))}; + fullScanBtn->clicked().connect([] + { + Service::get()->requestImmediateScan(true); + }); + + _lastScanStatus = bindNew("last-scan"); + _lastScanStatus->setReadOnly(true); + + _status = bindNew("status"); + _status->setReadOnly(true); + + _stepStatus = bindNew("step-status"); + _stepStatus->setReadOnly(true); + + auto onDbEvent {[&]() { refreshContents(); }}; LmsApp->getScannerEvents().scanStarted.connect(this, [] { @@ -154,24 +198,10 @@ ScannerController::refreshContents() { using namespace Scanner; - Wt::WPushButton* reportBtn {bindNew("report-btn", Wt::WString::tr("Lms.Admin.ScannerController.get-report"))}; - - Wt::WPushButton* scanBtn {bindNew("scan-btn", Wt::WString::tr("Lms.Admin.ScannerController.scan-now"))}; - scanBtn->clicked().connect([] - { - Service::get()->requestImmediateScan(false); - }); - - Wt::WPushButton* fullScanBtn {bindNew("full-scan-btn", Wt::WString::tr("Lms.Admin.ScannerController.force-scan-now"))}; - fullScanBtn->clicked().connect([] - { - Service::get()->requestImmediateScan(true); - }); - const IScannerService::Status status {Service::get()->getStatus()}; if (status.lastCompleteScanStats) { - bindString("last-scan", Wt::WString::tr("Lms.Admin.ScannerController.last-scan-status") + _lastScanStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.last-scan-status") .arg(status.lastCompleteScanStats->nbFiles()) .arg(durationToString(status.lastCompleteScanStats->startTime, status.lastCompleteScanStats->stopTime)) .arg(status.lastCompleteScanStats->stopTime.toString()) @@ -179,60 +209,60 @@ ScannerController::refreshContents() .arg(status.lastCompleteScanStats->duplicates.size()) ); - Wt::WLink link {std::make_shared(*status.lastCompleteScanStats)}; - link.setTarget(Wt::LinkTarget::NewWindow); - reportBtn->setLink(link); + _reportResource->setScanStats(*status.lastCompleteScanStats); + _reportBtn->setEnabled(true); + } else { - bindString("last-scan", Wt::WString::tr("Lms.Admin.ScannerController.last-scan-not-available")); - reportBtn->setEnabled(false); + _lastScanStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.last-scan-not-available")); + _reportBtn->setEnabled(false); } switch (status.currentState) { case IScannerService::State::NotScheduled: - bindString("status", Wt::WString::tr("Lms.Admin.ScannerController.status-not-scheduled")); - bindEmpty("step-status"); + _status->setText(Wt::WString::tr("Lms.Admin.ScannerController.status-not-scheduled")); + _stepStatus->setText(""); break; case IScannerService::State::Scheduled: - bindString("status", Wt::WString::tr("Lms.Admin.ScannerController.status-scheduled") + _status->setText(Wt::WString::tr("Lms.Admin.ScannerController.status-scheduled") .arg(status.nextScheduledScan.toString())); - bindEmpty("step-status"); + _stepStatus->setText(""); break; case IScannerService::State::InProgress: - bindString("status", Wt::WString::tr("Lms.Admin.ScannerController.status-in-progress") + _status->setText(Wt::WString::tr("Lms.Admin.ScannerController.status-in-progress") .arg(static_cast(status.currentScanStepStats->currentStep) + 1) .arg(Scanner::ScanProgressStepCount)); switch (status.currentScanStepStats->currentStep) { case Scanner::ScanProgressStep::ChekingForMissingFiles: - bindString("step-status", Wt::WString::tr("Lms.Admin.ScannerController.step-checking-for-missing-files") + _stepStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.step-checking-for-missing-files") .arg(status.currentScanStepStats->progress())); break; case Scanner::ScanProgressStep::DiscoveringFiles: - bindString("step-status", Wt::WString::tr("Lms.Admin.ScannerController.step-discovering-files") + _stepStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.step-discovering-files") .arg(status.currentScanStepStats->processedElems)); break; case Scanner::ScanProgressStep::ScanningFiles: - bindString("step-status", Wt::WString::tr("Lms.Admin.ScannerController.step-scanning-files") + _stepStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.step-scanning-files") .arg(status.currentScanStepStats->processedElems) .arg(status.currentScanStepStats->totalElems) .arg(status.currentScanStepStats->progress())); break; case Scanner::ScanProgressStep::FetchingTrackFeatures: - bindString("step-status", Wt::WString::tr("Lms.Admin.ScannerController.step-fetching-track-features") + _stepStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.step-fetching-track-features") .arg(status.currentScanStepStats->processedElems) .arg(status.currentScanStepStats->totalElems) .arg(status.currentScanStepStats->progress())); break; case Scanner::ScanProgressStep::ReloadingSimilarityEngine: - bindString("step-status", Wt::WString::tr("Lms.Admin.ScannerController.step-reloading-similarity-engine") + _stepStatus->setText(Wt::WString::tr("Lms.Admin.ScannerController.step-reloading-similarity-engine") .arg(status.currentScanStepStats->progress())); break; } diff --git a/src/lms/ui/admin/ScannerController.hpp b/src/lms/ui/admin/ScannerController.hpp index 498d28fe..7b1418fe 100644 --- a/src/lms/ui/admin/ScannerController.hpp +++ b/src/lms/ui/admin/ScannerController.hpp @@ -19,7 +19,9 @@ #pragma once +#include #include +#include namespace UserInterface { @@ -31,6 +33,12 @@ namespace UserInterface private: void refreshContents(); + + Wt::WPushButton* _reportBtn; + Wt::WLineEdit* _lastScanStatus; + Wt::WLineEdit* _status; + Wt::WLineEdit* _stepStatus; + class ReportResource* _reportResource; }; } // namespace DatabaseStatus