| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 | template(name="cronSettings")  ul#cron-setting.setting-detail    li      h3 {{_ 'cron-migrations'}}      .form-group        label {{_ 'migration-status'}}        .status-indicator          span.status-label {{_ 'status'}}:          span.status-value {{migrationStatus}}        .progress-section          .progress            .progress-bar(role="progressbar" style="width: {{migrationProgress}}%" aria-valuenow="{{migrationProgress}}" aria-valuemin="0" aria-valuemax="100")               | {{migrationProgress}}%          .progress-text            | {{migrationProgress}}% {{_ 'complete'}}            .form-group        button.js-start-all-migrations.btn.btn-primary {{_ 'start-all-migrations'}}        button.js-pause-all-migrations.btn.btn-warning {{_ 'pause-all-migrations'}}        button.js-stop-all-migrations.btn.btn-danger {{_ 'stop-all-migrations'}}        li      h3 {{_ 'board-operations'}}      .form-group        label {{_ 'scheduled-board-operations'}}        button.js-schedule-board-cleanup.btn.btn-primary {{_ 'schedule-board-cleanup'}}        button.js-schedule-board-archive.btn.btn-warning {{_ 'schedule-board-archive'}}        button.js-schedule-board-backup.btn.btn-info {{_ 'schedule-board-backup'}}        li      h3 {{_ 'cron-jobs'}}      .form-group        label {{_ 'active-cron-jobs'}}        each cronJobs          .job-item            .job-info              .job-name {{name}}              .job-schedule {{schedule}}              .job-description {{description}}            .job-actions              button.js-pause-job.btn.btn-sm.btn-warning(data-job-id="{{_id}}") {{_ 'pause'}}              button.js-delete-job.btn.btn-sm.btn-danger(data-job-id="{{_id}}") {{_ 'delete'}}        .add-job-section          button.js-add-cron-job.btn.btn-success {{_ 'add-cron-job'}}template(name="cronMigrations")  .cron-migrations    .migration-header      h2        i.fa.fa-database        | {{_ 'database-migrations'}}      .migration-controls        button.btn.btn-primary.js-start-all-migrations          i.fa.fa-play          | {{_ 'start-all-migrations'}}        button.btn.btn-warning.js-pause-all-migrations          i.fa.fa-pause          | {{_ 'pause-all-migrations'}}        button.btn.btn-danger.js-stop-all-migrations          i.fa.fa-stop          | {{_ 'stop-all-migrations'}}        .migration-progress      .progress-overview        .progress-bar          .progress-fill(style="width: {{migrationProgress}}%")         .progress-text {{migrationProgress}}%        .progress-label {{_ 'overall-progress'}}            .current-step        i.fa.fa-cog.fa-spin        | {{migrationCurrentStep}}            .migration-status        i.fa.fa-info-circle        | {{migrationStatus}}        .migration-steps      h3 {{_ 'migration-steps'}}      .steps-list        each migrationSteps          .migration-step(class="{{#if completed}}completed{{/if}}" class="{{#if isCurrentStep}}current{{/if}}")            .step-header              .step-icon                if completed                  i.fa.fa-check-circle                else if isCurrentStep                  i.fa.fa-cog.fa-spin                else                  i.fa.fa-circle-o              .step-info                .step-name {{name}}                .step-description {{description}}              .step-progress                if completed                  .progress-text 100%                else if isCurrentStep                  .progress-text {{progress}}%                else                  .progress-text 0%            if isCurrentStep              .step-progress-bar                .progress-fill(style="width: {{progress}}%")template(name="cronBoardOperations")  .cron-board-operations    .board-operations-header      h2        i.fa.fa-tasks        | {{_ 'board-operations'}}      .board-operations-controls        button.btn.btn-success.js-refresh-board-operations          i.fa.fa-refresh          | {{_ 'refresh'}}        button.btn.btn-primary.js-start-test-operation          i.fa.fa-play          | {{_ 'start-test-operation'}}        button.btn.btn-info.js-force-board-scan          i.fa.fa-search          | {{_ 'force-board-scan'}}        .board-operations-stats      .stats-grid        .stat-item          .stat-value {{operationStats.total}}          .stat-label {{_ 'total-operations'}}        .stat-item          .stat-value {{operationStats.running}}          .stat-label {{_ 'running'}}        .stat-item          .stat-value {{operationStats.completed}}          .stat-label {{_ 'completed'}}        .stat-item          .stat-value {{operationStats.error}}          .stat-label {{_ 'errors'}}        .stat-item          .stat-value {{queueStats.pending}}          .stat-label {{_ 'pending'}}        .stat-item          .stat-value {{queueStats.maxConcurrent}}          .stat-label {{_ 'max-concurrent'}}        .stat-item          .stat-value {{boardMigrationStats.unmigratedCount}}          .stat-label {{_ 'unmigrated-boards'}}        .stat-item          .stat-value {{boardMigrationStats.isScanning}}          .stat-label {{_ 'scanning-status'}}        .system-resources      .resource-item        .resource-label {{_ 'cpu-usage'}}        .resource-bar          .resource-fill(style="width: {{systemResources.cpuUsage}}%")        .resource-value {{systemResources.cpuUsage}}%      .resource-item        .resource-label {{_ 'memory-usage'}}        .resource-bar          .resource-fill(style="width: {{systemResources.memoryUsage}}%")        .resource-value {{systemResources.memoryUsage}}%      .resource-item        .resource-label {{_ 'cpu-cores'}}        .resource-value {{systemResources.cpuCores}}        .board-operations-search      .search-box        input.form-control.js-search-board-operations(type="text" placeholder="{{_ 'search-boards-or-operations'}}")        i.fa.fa-search.search-icon        .board-operations-list      .operations-header        h3 {{_ 'board-operations'}} ({{pagination.total}})        .pagination-info          | {{_ 'showing'}} {{pagination.start}} - {{pagination.end}} {{_ 'of'}} {{pagination.total}}            .operations-table        table.table.table-striped          thead            tr              th {{_ 'board-id'}}              th {{_ 'operation-type'}}              th {{_ 'status'}}              th {{_ 'progress'}}              th {{_ 'start-time'}}              th {{_ 'duration'}}              th {{_ 'actions'}}          tbody            each boardOperations              tr                td                  .board-id {{boardId}}                td                  .operation-type {{operationType}}                td                  span.status-badge(class="status-{{status}}") {{status}}                td                  .progress-container                    .progress-bar                      .progress-fill(style="width: {{progress}}%")                    .progress-text {{progress}}%                td {{formatDateTime startTime}}                td {{formatDuration startTime endTime}}                td                  .btn-group                    if isRunning                      button.btn.btn-sm.btn-warning.js-pause-operation(data-operation="{{id}}")                        i.fa.fa-pause                    else                      button.btn.btn-sm.btn-success.js-resume-operation(data-operation="{{id}}")                        i.fa.fa-play                    button.btn.btn-sm.btn-danger.js-stop-operation(data-operation="{{id}}")                      i.fa.fa-stop                    button.btn.btn-sm.btn-info.js-view-details(data-operation="{{id}}")                      i.fa.fa-info-circle            .pagination        if pagination.hasPrev          button.btn.btn-sm.btn-default.js-prev-page            i.fa.fa-chevron-left            | {{_ 'previous'}}        .page-info          | {{_ 'page'}} {{pagination.page}} {{_ 'of'}} {{pagination.totalPages}}        if pagination.hasNext          button.btn.btn-sm.btn-default.js-next-page            | {{_ 'next'}}            i.fa.fa-chevron-righttemplate(name="cronJobs")  .cron-jobs    .jobs-header      h2        i.fa.fa-clock-o        | {{_ 'cron-jobs'}}      .jobs-controls        button.btn.btn-success.js-refresh-jobs          i.fa.fa-refresh          | {{_ 'refresh'}}        .jobs-list      table.table.table-striped        thead          tr            th {{_ 'job-name'}}            th {{_ 'schedule'}}            th {{_ 'status'}}            th {{_ 'last-run'}}            th {{_ 'next-run'}}            th {{_ 'actions'}}        tbody          each cronJobs            tr              td {{name}}              td {{schedule}}              td                span.status-badge(class="status-{{status}}") {{status}}              td {{formatDate lastRun}}              td {{formatDate nextRun}}              td                .btn-group                  if isRunning                    button.btn.btn-sm.btn-warning.js-pause-job(data-job="{{name}}")                      i.fa.fa-pause                  else                    button.btn.btn-sm.btn-success.js-start-job(data-job="{{name}}")                      i.fa.fa-play                  button.btn.btn-sm.btn-danger.js-stop-job(data-job="{{name}}")                    i.fa.fa-stop                  button.btn.btn-sm.btn-danger.js-remove-job(data-job="{{name}}")                    i.fa.fa-trashtemplate(name="cronAddJob")  .cron-add-job    .add-job-header      h2        i.fa.fa-plus        | {{_ 'add-cron-job'}}        .add-job-form      form.js-add-cron-job-form        .form-group          label(for="job-name") {{_ 'job-name'}}          input.form-control#job-name(type="text" name="name" required)                .form-group          label(for="job-description") {{_ 'job-description'}}          textarea.form-control#job-description(name="description" rows="3")                .form-group          label(for="job-schedule") {{_ 'schedule'}}          select.form-control#job-schedule(name="schedule")            option(value="every 1 minute") {{_ 'every-1-minute'}}            option(value="every 5 minutes") {{_ 'every-5-minutes'}}            option(value="every 10 minutes") {{_ 'every-10-minutes'}}            option(value="every 30 minutes") {{_ 'every-30-minutes'}}            option(value="every 1 hour") {{_ 'every-1-hour'}}            option(value="every 6 hours") {{_ 'every-6-hours'}}            option(value="every 1 day") {{_ 'every-1-day'}}            option(value="once") {{_ 'run-once'}}                .form-group          label(for="job-weight") {{_ 'weight'}}          input.form-control#job-weight(type="number" name="weight" value="1" min="1" max="10")                .form-actions          button.btn.btn-primary(type="submit")            i.fa.fa-plus            | {{_ 'add-job'}}          button.btn.btn-default.js-cancel-add-job            i.fa.fa-times            | {{_ 'cancel'}}
 |