Project import generated by Copybara.

GitOrigin-RevId: 63746295f1a5ab5a619056791995793d65529e62
diff --git a/src/incidents.php b/src/incidents.php
new file mode 100644
index 0000000..fb693b1
--- /dev/null
+++ b/src/incidents.php
@@ -0,0 +1,172 @@
+<?php
+require_once("core.php");
+security::checkType(security::ADMIN);
+
+incidentsView::handleIncidentShortcuts();
+
+incidentsView::buildSelect();
+
+$numRows = incidents::numRows($select);
+$companies = companies::getAll();
+?>
+<!DOCTYPE html>
+<html>
+<head>
+  <title><?php echo $conf["appName"]; ?></title>
+  <?php visual::includeHead(); ?>
+  <link rel="stylesheet" href="css/dashboard.css">
+  <link rel="stylesheet" href="css/incidents.css">
+
+  <style>
+  .addincident, .addrecurringincident, .filter {
+    z-index: 1000;
+  }
+
+  .addincident {
+    position: fixed;
+    bottom: 16px;
+    right: 16px;
+  }
+
+  .addrecurringincident {
+    position: fixed;
+    bottom: 80px;
+    right: 25px;
+  }
+
+  .filter {
+    position: fixed;
+    bottom: 126px;
+    right: 25px;
+  }
+
+  .helper-bellow-incidents-list {
+    text-align: center;
+    font-size: 13px;
+  }
+
+  @media (max-width: 655px) {
+    .extra {
+      display: none;
+    }
+  }
+  </style>
+</head>
+<?php visual::printBodyTag(); ?>
+  <div class="mdl-layout mdl-js-layout mdl-layout--fixed-header mdl-layout--fixed-drawer">
+    <?php visual::includeNav(); ?>
+    <button class="addincident mdl-button md-js-button mdl-button--fab mdl-js-ripple-effect mdl-button--accent"><i class="material-icons">add</i><span class="mdl-ripple"></span></button>
+    <button class="addrecurringincident mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab mdl-color--grey-200"><i class="material-icons">repeat</i><span class="mdl-ripple"></span></button>
+    <button class="filter mdl-button mdl-js-button mdl-button--fab mdl-button--mini-fab mdl-color--grey-200"><i class="material-icons">filter_list</i></button>
+    <main class="mdl-layout__content">
+      <div class="page-content">
+        <div class="main mdl-shadow--4dp">
+          <h2>Incidencias</h2>
+
+          <?php
+          if ($select["showPendingQueue"]) {
+            $numRowsPending = incidents::numPending();
+            ?>
+            <h4>Cola de revisión (<?=$numRowsPending?>)<?=($select["isAnyEnabled"] ? ' <i id="tt_filtersarenotapplied" class="material-icons help">info</i>' : '')?></h4>
+            <?php
+            if ($select["isAnyEnabled"]) {
+              visual::addTooltip("tt_filtersarenotapplied", "Los filtros no se han aplicado a la cola de revisión.");
+            }
+
+            $incidentsPending = incidents::getAll(true);
+            if (count($incidentsPending)) {
+              incidentsView::renderIncidents($incidentsPending, $companies);
+            } else {
+              echo "Todas las incidencias ya han sido revisadas.";
+            }
+          }
+
+
+          $page = ($select["showResultsPaginated"] ? (isset($_GET["page"]) ? (int)$_GET["page"] - 1 : null) : 0);
+
+          if ($select["showResultsPaginated"]) {
+            $limit = (int)($_GET["limit"] ?? incidents::PAGINATION_LIMIT);
+            if ($limit <= 0 || $limit > 100) $limit = incidents::PAGINATION_LIMIT;
+          } else $limit = 0;
+
+          $incidents = incidents::getAll(null, $page, $limit, "ALL", null, null, false, $select);
+
+          if (!$select["showResultsPaginated"]) $numRows = count($incidents);
+          ?>
+
+          <h4><?=($select["isAnyEnabled"] ? "Incidencias filtradas" : "Todas las incidencias")?> (<?=(int)$numRows?>)</h4>
+
+          <?php
+          if (count($incidents)) {
+            incidentsView::renderIncidents($incidents, $companies, false, true, false, false, true);
+            /*if (!$select["showResultsPaginated"]) {
+              echo "<p class=\"helper-bellow-incidents-list mdl-color-text--grey-600\">Se está truncando la lista de incidencias a un máximo de  resultados, así que es posible que algunas incidencias no se muestren en la lista.<br>Puedes encontrar más incidencias cambiando el selector de fecha final de la sección de filtros a la fecha de la última incidencia de la lista.</p>";
+            }*/
+          } else if ($select["isAnyEnabled"]) {
+            echo "No se ha encontrado ninguna incidencia con los filtros seleccionados.";
+          } else {
+            echo "Todavía no existe ninguna incidencia. Puedes añadir una haciendo clic en el botón de la esquina inferior derecha.";
+          }
+          ?>
+
+          <?php
+          if ($select["showResultsPaginated"]) visual::renderPagination($numRows, $select["pageUrl"], $limit, ($limit == incidents::PAGINATION_LIMIT ? false : true), $select["pageUrlHasParameters"], [
+            "elementName" => "incidencias",
+            "options" => incidentsView::$limitOptions
+          ], incidents::todayPage($limit));
+          if ($select["showPendingQueue"]) visual::printDebug("incidents::getAll(true)", $incidentsPending);
+          visual::printDebug("incidents::getAll(null, ".(int)$page.", ".(int)$limit.", \"ALL\", null, null, false, \$select)", $incidents);
+          visual::printDebug("\$select", $select);
+          ?>
+        </div>
+      </div>
+    </main>
+  </div>
+
+  <?php
+  $workers = people::getAll(false, true);
+  incidentsView::renderIncidentForm($workers, function(&$worker) {
+    return (int)$worker["workerid"];
+  }, function (&$worker, &$companies) {
+    return $worker["name"].' ('.$companies[$worker["companyid"]].')';
+  }, $companies, false, false, "incidents.php");
+
+  incidentsView::renderIncidentForm($workers, function(&$worker) {
+    return (int)$worker["workerid"];
+  }, function (&$worker, &$companies) {
+    return $worker["name"].' ('.$companies[$worker["companyid"]].')';
+  }, $companies, false, true, "incidents.php");
+
+  if (isset($_GET["openRecurringFormWorker"])) {
+    $openWorker = (int)$_GET["openRecurringFormWorker"];
+    ?>
+    <script>
+    document.getElementById("recurringworker").value = "<?=security::htmlsafe($openWorker)?>";
+    document.getElementById("addrecurringincident").showModal();
+    </script>
+    <?php
+  }
+
+  incidentsView::renderFilterDialog($select);
+
+  visual::renderTooltips();
+  ?>
+
+  <div class="mdl-snackbar mdl-js-snackbar">
+    <div class="mdl-snackbar__text"></div>
+    <button type="button" class="mdl-snackbar__action"></button>
+  </div>
+
+  <?php
+  visual::smartSnackbar(incidentsView::$incidentsMsgs, 10000, false);
+  ?>
+
+  <script>
+  var _showResultsPaginated = <?=($select["showResultsPaginated"] ? "true" : "false")?>;
+  var _limit = <?=(int)$limit?>;
+  var _page = <?=(int)$page?>;
+  </script>
+  <script src="js/incidents.js"></script>
+  <script src="js/incidentsgeneric.js"></script>
+</body>
+</html>