| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 | template(name="attachmentSettings")  .attachment-settings-content    .settings-tabs      ul.tab-nav        li(class="{{#if showStorageSettings}}active{{/if}}")          a.js-attachment-storage-settings(data-id="storage-settings")            i.fa.fa-cog            | {{_ 'attachment-storage-settings'}}        li(class="{{#if showMigration}}active{{/if}}")          a.js-attachment-migration(data-id="attachment-migration")            i.fa.fa-arrow-right            | {{_ 'attachment-migration'}}        li(class="{{#if showMonitoring}}active{{/if}}")          a.js-attachment-monitoring(data-id="attachment-monitoring")            i.fa.fa-chart-line            | {{_ 'attachment-monitoring'}}        .tab-content      if loading        +spinner      else if showStorageSettings        +storageSettings      else if showMigration        +attachmentMigration      else if showMonitoring        +attachmentMonitoringtemplate(name="storageSettings")  .storage-settings    h3 {{_ 'attachment-storage-configuration'}}        .storage-config-section      h4 {{_ 'filesystem-storage'}}      .form-group        label {{_ 'writable-path'}}        input.wekan-form-control#filesystem-path(type="text" value="{{filesystemPath}}" readonly)        small.form-text.text-muted {{_ 'filesystem-path-description'}}            .form-group        label {{_ 'attachments-path'}}        input.wekan-form-control#attachments-path(type="text" value="{{attachmentsPath}}" readonly)        small.form-text.text-muted {{_ 'attachments-path-description'}}            .form-group        label {{_ 'avatars-path'}}        input.wekan-form-control#avatars-path(type="text" value="{{avatarsPath}}" readonly)        small.form-text.text-muted {{_ 'avatars-path-description'}}    .storage-config-section      h4 {{_ 'mongodb-gridfs-storage'}}      .form-group        label {{_ 'gridfs-enabled'}}        input.wekan-form-control#gridfs-enabled(type="checkbox" checked="{{gridfsEnabled}}" disabled)        small.form-text.text-muted {{_ 'gridfs-enabled-description'}}    .storage-config-section      h4 {{_ 's3-minio-storage'}}      .form-group        label {{_ 's3-enabled'}}        input.wekan-form-control#s3-enabled(type="checkbox" checked="{{s3Enabled}}" disabled)        small.form-text.text-muted {{_ 's3-enabled-description'}}            .form-group        label {{_ 's3-endpoint'}}        input.wekan-form-control#s3-endpoint(type="text" value="{{s3Endpoint}}" readonly)        small.form-text.text-muted {{_ 's3-endpoint-description'}}            .form-group        label {{_ 's3-bucket'}}        input.wekan-form-control#s3-bucket(type="text" value="{{s3Bucket}}" readonly)        small.form-text.text-muted {{_ 's3-bucket-description'}}            .form-group        label {{_ 's3-region'}}        input.wekan-form-control#s3-region(type="text" value="{{s3Region}}" readonly)        small.form-text.text-muted {{_ 's3-region-description'}}            .form-group        label {{_ 's3-access-key'}}        input.wekan-form-control#s3-access-key(type="text" placeholder="{{_ 's3-access-key-placeholder'}}" readonly)        small.form-text.text-muted {{_ 's3-access-key-description'}}            .form-group        label {{_ 's3-secret-key'}}        input.wekan-form-control#s3-secret-key(type="password" placeholder="{{_ 's3-secret-key-placeholder'}}")        small.form-text.text-muted {{_ 's3-secret-key-description'}}            .form-group        label {{_ 's3-ssl-enabled'}}        input.wekan-form-control#s3-ssl-enabled(type="checkbox" checked="{{s3SslEnabled}}" disabled)        small.form-text.text-muted {{_ 's3-ssl-enabled-description'}}            .form-group        label {{_ 's3-port'}}        input.wekan-form-control#s3-port(type="number" value="{{s3Port}}" readonly)        small.form-text.text-muted {{_ 's3-port-description'}}    .storage-actions      button.js-test-s3-connection.btn.btn-secondary {{_ 'test-s3-connection'}}      button.js-save-s3-settings.btn.btn-primary {{_ 'save-s3-settings'}}template(name="attachmentMigration")  .attachment-migration    h3 {{_ 'attachment-migration'}}        .migration-controls      .form-group        label {{_ 'migration-batch-size'}}        input.wekan-form-control#migration-batch-size(type="number" value="{{migrationBatchSize}}" min="1" max="100")        small.form-text.text-muted {{_ 'migration-batch-size-description'}}            .form-group        label {{_ 'migration-delay-ms'}}        input.wekan-form-control#migration-delay-ms(type="number" value="{{migrationDelayMs}}" min="100" max="10000")        small.form-text.text-muted {{_ 'migration-delay-ms-description'}}            .form-group        label {{_ 'migration-cpu-threshold'}}        input.wekan-form-control#migration-cpu-threshold(type="number" value="{{migrationCpuThreshold}}" min="10" max="90")        small.form-text.text-muted {{_ 'migration-cpu-threshold-description'}}    .migration-actions      .migration-buttons        button.js-migrate-all-to-filesystem.btn.btn-primary {{_ 'migrate-all-to-filesystem'}}        button.js-migrate-all-to-gridfs.btn.btn-primary {{_ 'migrate-all-to-gridfs'}}        button.js-migrate-all-to-s3.btn.btn-primary {{_ 'migrate-all-to-s3'}}            .migration-controls        button.js-pause-migration.btn.btn-warning {{_ 'pause-migration'}}        button.js-resume-migration.btn.btn-success {{_ 'resume-migration'}}        button.js-stop-migration.btn.btn-danger {{_ 'stop-migration'}}    .migration-progress      h4 {{_ 'migration-progress'}}      .progress        .progress-bar(role="progressbar" style="width: {{migrationProgress}}%" aria-valuenow="{{migrationProgress}}" aria-valuemin="0" aria-valuemax="100")          | {{migrationProgress}}%            .migration-stats        .stat-item          span.label {{_ 'total-attachments'}}:          span.value {{totalAttachments}}        .stat-item          span.label {{_ 'migrated-attachments'}}:          span.value {{migratedAttachments}}        .stat-item          span.label {{_ 'remaining-attachments'}}:          span.value {{remainingAttachments}}        .stat-item          span.label {{_ 'migration-status'}}:          span.value {{migrationStatus}}    .migration-log      h4 {{_ 'migration-log'}}      .log-container        pre#migration-log-content {{migrationLog}}template(name="attachmentMonitoring")  .attachment-monitoring    h3 {{_ 'attachment-monitoring'}}        .monitoring-stats      .stats-grid        .stat-card          h5 {{_ 'total-attachments'}}          .stat-value {{totalAttachments}}        .stat-card          h5 {{_ 'filesystem-attachments'}}          .stat-value {{filesystemAttachments}}        .stat-card          h5 {{_ 'gridfs-attachments'}}          .stat-value {{gridfsAttachments}}        .stat-card          h5 {{_ 's3-attachments'}}          .stat-value {{s3Attachments}}        .stat-card          h5 {{_ 'total-size'}}          .stat-value {{totalSize}}        .stat-card          h5 {{_ 'filesystem-size'}}          .stat-value {{filesystemSize}}        .stat-card          h5 {{_ 'gridfs-size'}}          .stat-value {{gridfsSize}}        .stat-card          h5 {{_ 's3-size'}}          .stat-value {{s3Size}}    .monitoring-charts      h4 {{_ 'storage-distribution'}}      .chart-container        canvas#storage-distribution-chart    .monitoring-actions      button.js-refresh-monitoring.btn.btn-secondary {{_ 'refresh-monitoring'}}      button.js-export-monitoring.btn.btn-primary {{_ 'export-monitoring'}}
 |