Módulo VPSManager para WHMCS con configuración externa, acceso seguro al panel y métricas Graphite para LX.
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

39 wiersze
5.8 KiB

  1. <?php if (!defined('WHMCS')) { http_response_code(403); exit; } ?>
  2. <style>
  3. .o6h-copies{color:#334555;line-height:1.5}.o6h-copies h2{font-size:25px;font-weight:400;margin:0 0 8px}.o6h-copies .copies-intro{color:#687b89;margin-bottom:24px}.o6h-copies .copies-cards{display:flex;flex-wrap:wrap;gap:14px;margin:0 0 26px}.o6h-copies .copies-card{flex:1 1 220px;border:1px solid #dfe6ec;border-radius:8px;padding:19px;background:linear-gradient(120deg,#f7fafc,#fff)}.o6h-copies .copies-label{font-size:12px;color:#596f7e;margin-bottom:12px}.o6h-copies .copies-value{font-size:24px;font-weight:600;color:#164f6d}.o6h-copies .copies-date{font-size:18px}.o6h-copies .copies-detail{font-size:12px;color:#596f7e;margin-top:8px}.o6h-copies .copies-badge{display:inline-block;border-radius:4px;padding:3px 8px;font-size:12px;white-space:nowrap;background:#eef1f4;color:#52616f}.o6h-copies .copies-full{background:#e7effa;color:#305e94}.o6h-copies .copies-incremental{background:#e9f4f4;color:#346c71}.o6h-copies .copies-panel{border:1px solid #dfe6ec;border-radius:8px;overflow:hidden}.o6h-copies .copies-panel-heading{padding:18px 20px;display:flex;justify-content:space-between;gap:12px;align-items:center}.o6h-copies .copies-panel-heading h3{margin:0;font-size:16px;font-weight:500}.o6h-copies .copies-panel-heading span{font-size:12px;color:#657885}.o6h-copies .table-responsive{margin:0;border:0}.o6h-copies table{width:100%;margin:0;border-collapse:collapse;font-size:13px}.o6h-copies th{background:#f5f8fa;color:#596f7e;font-size:12px;font-weight:600;text-align:left;padding:12px 18px}.o6h-copies td{padding:17px 18px;border-top:1px solid #edf0f3;vertical-align:middle}.o6h-copies tbody tr:first-child{background:#fafcfe}.o6h-copies .copies-num{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}.o6h-copies .copies-latest{display:block;color:#59748b;font-size:11px;margin-top:3px}.o6h-copies .copies-none{color:#467056}.o6h-copies .copies-present{color:#87551c}.o6h-copies .copies-footer{padding:13px 20px;border-top:1px solid #e6ecf0;background:#fbfcfd;color:#596f7e;font-size:12px}.o6h-copies .copies-note{font-size:12px;color:#596f7e;margin-top:18px}.o6h-copies .copies-message{padding:18px 20px;border:1px solid #dfe6ec;background:#f7fafc;border-radius:8px;margin:16px 0}.o6h-copies .copies-warning{background:#fff8e8;border-color:#e6cd91;color:#795519}@media(max-width:600px){.o6h-copies .copies-card{flex-basis:100%}.o6h-copies td,.o6h-copies th{padding:12px}.o6h-copies .copies-panel-heading{align-items:flex-start}}
  4. </style>
  5. <section class="o6h-copies" aria-label="Copias de seguridad">
  6. <h2>Copias de seguridad</h2>
  7. <p class="copies-intro">Consulta las copias disponibles de tu servicio.</p>
  8. <?php if (empty($view['available'])): ?>
  9. <div class="copies-message" role="status">La información de las copias de seguridad no está disponible temporalmente.</div>
  10. <?php else:
  11. $typeClass = static fn($type) => ['Completa' => 'copies-full', 'Incremental' => 'copies-incremental'][$type] ?? '';
  12. $incidentClass = static fn($status) => ['Sin incidencias registradas' => 'copies-none', 'Con incidencias' => 'copies-present'][$status] ?? '';
  13. ?>
  14. <?php if ($view['stale']): ?><div class="copies-message copies-warning" role="status">No se ha podido actualizar la información. Se muestran los últimos datos disponibles.</div><?php endif; ?>
  15. <div class="copies-cards">
  16. <div class="copies-card"><div class="copies-label">Copias disponibles</div><div class="copies-value"><?= $escape($view['total']) ?></div><div class="copies-detail"><?= $escape($view['full']) ?> completas · <?= $escape($view['incremental']) ?> incrementales</div></div>
  17. <?php if ($view['total'] > 0): ?>
  18. <div class="copies-card"><div class="copies-label">Inicio de la última copia</div><div class="copies-value copies-date"><?= $escape($view['rows'][0]['start']) ?></div><div class="copies-detail"><span class="copies-badge <?= $typeClass($view['rows'][0]['type']) ?>"><?= $escape($view['rows'][0]['type']) ?></span> · Hace <?= $escape($view['age']) ?> horas</div></div>
  19. <div class="copies-card"><div class="copies-label">Inicio de la última completa</div><div class="copies-value copies-date"><?= $escape($view['last_full']) ?></div></div>
  20. <?php endif; ?>
  21. </div>
  22. <?php if ($view['activity'] !== null): ?><p class="copies-detail">Actividad actual: <?= $escape($view['activity']) ?>.</p><?php endif; ?>
  23. <div class="copies-panel">
  24. <?php if ($view['total'] === 0): ?>
  25. <div class="copies-message" role="status">Todavía no hay copias disponibles.</div>
  26. <?php else: ?>
  27. <div class="copies-panel-heading"><h3>Últimas copias disponibles</h3><span><?= $escape(count($view['rows'])) ?> de <?= $escape($view['total']) ?></span></div>
  28. <div class="table-responsive"><table><thead><tr><th scope="col">Inicio</th><th scope="col">Tipo</th><th scope="col" class="copies-num">Duración</th><th scope="col" class="copies-num">Tamaño de datos</th><th scope="col">Incidencias</th></tr></thead><tbody>
  29. <?php foreach ($view['rows'] as $index => $row): ?>
  30. <tr><td><strong><?= $escape($row['start']) ?></strong><?php if ($index === 0): ?><span class="copies-latest">Última</span><?php endif; ?></td><td><span class="copies-badge <?= $typeClass($row['type']) ?>"><?= $escape($row['type']) ?></span></td><td class="copies-num"><?= $escape($row['duration']) ?></td><td class="copies-num"><?= $escape($row['size']) ?></td><td><span class="<?= $incidentClass($row['incidents']) ?>"><?= $escape($row['incidents']) ?></span></td></tr>
  31. <?php endforeach; ?>
  32. </tbody></table></div>
  33. <?php endif; ?>
  34. <div class="copies-footer">Datos obtenidos: <?= $escape($view['updated']) ?> · Zona horaria: <?= $escape($view['timezone']) ?>.</div>
  35. </div>
  36. <p class="copies-note">Las fechas indican el inicio. Los tamaños son datos lógicos aproximados. La lista muestra copias retenidas, no todos los intentos ni una verificación de restauración.</p>
  37. <?php endif; ?>
  38. </section>