added alert classes and supporting functions

This commit is contained in:
James Richie
2026-02-23 19:55:25 -05:00
parent 6195ca4709
commit 187d3b3522
29 changed files with 2035 additions and 359 deletions
+2
View File
@@ -1 +1,3 @@
# atlhousingreport # atlhousingreport
# Summary
+392
View File
@@ -0,0 +1,392 @@
<?php
// ============
// Alerts Class
// ============
class Alerts extends Base {
// Variables.
private $current_user_id = "";
private $current_user_name = "";
private $current_user_email = "";
private $pagination_size = 20;
private $pagination_page = 1;
// ==================
// Class Constructor.
// ==================
public function __construct() {
set_error_handler(array($this, "displayError"));
date_default_timezone_set(self::TIMEZONE);
$this->current_user_id = $_SESSION[self::USER_ID] ?? "";
$this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
$this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
$this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
}
// ============
// Setup Alerts
// ============
public function setupAlerts() {
$alerts = $this->getAlertsPage();
$popovers = (new Popovers())->getPopovers();
$XML = $this->mergeXML($alerts, "<XML/>");
$XML = $this->mergeXML($popovers, $XML);
$content = $this->applyXSL($XML, $this->getXSL("setupAlerts"));
$this->displayContent($content);
}
// =========
// Add Alert
// =========
public function addAlert() {
$step = filter_input(INPUT_POST, "step") ?: "prompt";
switch ($step) {
case "prompt":
$content = $this->applyXSL("", $this->getXSL("addAlert"));
$this->displayContent($content);
break;
case "add":
$alert_title = filter_input(INPUT_POST, "alert_title") ?: "";
$alert_starts_date = filter_input(INPUT_POST, "alert_starts_date") ?: "";
$alert_starts_time = filter_input(INPUT_POST, "alert_starts_time") ?: "";
$alert_expires_date = filter_input(INPUT_POST, "alert_expires_date") ?: "";
$alert_expires_time = filter_input(INPUT_POST, "alert_expires_time") ?: "";
$alert_message = filter_input(INPUT_POST, "alert_message") ?: "";
$alert_starts = date("Y-m-d H:i", strtotime("{$alert_starts_date} {$alert_starts_time}"));
$alert_expires = date("Y-m-d H:i", strtotime("{$alert_expires_date} {$alert_expires_time}"));
$SQL = "insert into alerts
( alert_title,
alert_started,
alert_expired,
alert_message,
alert_creator,
alert_created )
VALUES ( :alert_title,
:alert_started,
:alert_expired,
:alert_message,
:alert_creator,
:alert_created )";
$statement = $this->connect()->prepare($SQL);
$statement->bindValue(":alert_title", $alert_title);
$statement->bindValue(":alert_started", $alert_starts);
$statement->bindValue(":alert_expired", $alert_expires);
$statement->bindValue(":alert_message", $alert_message);
$statement->bindValue(":alert_creator", $this->current_user_name);
$statement->bindValue(":alert_created", $this->getTimestamp());
$statement->execute();
break;
default:
$this->displayHome();
}
}
// ============
// Delete Alert
// ============
public function deleteAlert() {
$alert_serial = filter_input(INPUT_POST, "alert_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
$alert = $this->getAlert($alert_serial);
if ($alert->count() == 0) {
$this->logError("Invalid Alert ({$alert_serial}). " . __METHOD__);
}
$SQL = "delete from alerts
where alert_serial = {$alert_serial}";
$this->executeSQL($SQL);
}
// ==========
// Edit Alert
// ==========
public function editAlert() {
$step = filter_input(INPUT_POST, "step") ?: "prompt";
switch ($step) {
case "prompt":
$alert_serial = filter_input(INPUT_POST, "alert_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
$alert = $this->getAlert($alert_serial);
if ($alert->count() == 0) {
$this->logError("Invalid Alert ({$alert_serial}): " . __METHOD__);
}
$content = $this->applyXSL($alert, $this->getXSL("editAlert"));
$this->displayContent($content);
break;
case "update":
$alert_serial = filter_input(INPUT_POST, "alert_serial") ?: 0;
$alert_title = filter_input(INPUT_POST, "alert_title") ?: "";
$alert_starts_date = filter_input(INPUT_POST, "alert_starts_date") ?: "";
$alert_starts_time = filter_input(INPUT_POST, "alert_starts_time") ?: "";
$alert_expires_date = filter_input(INPUT_POST, "alert_expires_date") ?: "";
$alert_expires_time = filter_input(INPUT_POST, "alert_expires_time") ?: "";
$alert_message = filter_input(INPUT_POST, "alert_message") ?: "";
$alert_starts = date("Y-m-d H:i", strtotime("{$alert_starts_date} {$alert_starts_time}"));
$alert_expires = date("Y-m-d H:i", strtotime("{$alert_expires_date} {$alert_expires_time}"));
$alert = $this->getAlert($alert_serial);
if ($alert->count() === 0) {
$this->logError("Invalid Alert ({$alert_serial}). " . __METHOD__);
}
$connection = $this->connect();
$SQL = "update alerts
set alert_title = :alert_title,
alert_started = :alert_started,
alert_expired = :alert_expired,
alert_message = :alert_message
where alert_serial = :alert_serial";
$statement = $connection->prepare($SQL);
$statement->bindValue(":alert_serial", $alert_serial);
$statement->bindValue(":alert_title", $alert_title);
$statement->bindValue(":alert_started", $alert_starts);
$statement->bindValue(":alert_expired", $alert_expires);
$statement->bindValue(":alert_message", $alert_message);
$statement->execute();
break;
default:
$this->displayHome();
}
}
// =====================
// Return a Alert Object
// =====================
public function getAlert($alert_serial = 0) {
$SQL = "select *,
date_format(alert_started, '%Y') as alert_started_year,
date_format(alert_started, '%m') as alert_started_month,
date_format(alert_started, '%b') as alert_started_month_abbreviated,
date_format(alert_started, '%M') as alert_started_month_verbose,
date_format(alert_started, '%d') as alert_started_day,
date_format(alert_started, '%a') as alert_started_day_abbreviated,
date_format(alert_started, '%W') as alert_started_day_verbose,
date_format(alert_started, '%Y-%m-%d') as alert_started_date,
date_format(alert_started, '%W, %M %D') as alert_started_date_verbose,
date_format(alert_started, '%H:%i') as alert_started_time,
date_format(alert_started, '%l:%i %p') as alert_started_time_verbose,
date_format(alert_started, '%Y-%m-%d %l:%i %p') as alert_started_verbose,
date_format(alert_expired, '%Y') as alert_expired_year,
date_format(alert_expired, '%m') as alert_expired_month,
date_format(alert_expired, '%b') as alert_expired_month_abbreviated,
date_format(alert_expired, '%M') as alert_expired_month_verbose,
date_format(alert_expired, '%d') as alert_expired_day,
date_format(alert_expired, '%a') as alert_expired_day_abbreviated,
date_format(alert_expired, '%W') as alert_expired_day_verbose,
date_format(alert_expired, '%Y-%m-%d') as alert_expired_date,
date_format(alert_expired, '%W, %M %D') as alert_expired_date_verbose,
date_format(alert_expired, '%H:%i') as alert_expired_time,
date_format(alert_expired, '%l:%i %p') as alert_expired_time_verbose,
date_format(alert_expired, '%Y-%m-%d %l:%i %p') as alert_expired_verbose
from alerts
where alert_serial = {$alert_serial}";
return $this->getTable("alerts", $SQL);
}
// ========================
// Return a Alerts Object
// ========================
public function getAlerts() {
$SQL = "select view_alerts.*
from view_alerts";
return $this->getTable("alerts", $SQL);
}
// ===========================
// Return a Alerts Page Object
// ===========================
public function getAlertsPage() {
// Find Criteria
$find_alert = filter_input(INPUT_POST, "find_alert") ?: "";
$find_words = $this->sanitizeString($find_alert);
// Show Per Page
$this->pagination_size = filter_input(INPUT_POST, "alerts_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size;
// Record Count
$connection = $this->connect();
$SQL = "select count(*) as count
from view_alerts
where alert_title regexp :alert_title";
$statement = $connection->prepare($SQL);
$statement->bindValue(":alert_title", $find_words);
$statement->execute();
$recordset = $statement->fetch(PDO::FETCH_ASSOC);
$count = (count($recordset) > 0) ? (integer) $recordset["count"] : (integer) 0;
// Pagination
$pagination = filter_input(INPUT_POST, "pagination") ?: "";
switch ($pagination) {
case "first" : $this->pagination_page = 1;
break;
case "previous" : $this->pagination_page = max(($this->pagination_page - 1), 1);
break;
case "next" : $this->pagination_page = ($this->pagination_page + 1);
break;
case "last" : $this->pagination_page = ($count / $this->pagination_size);
break;
}
$offset = (($this->pagination_page * $this->pagination_size) - $this->pagination_size);
$start = ($offset + 1);
$end = min($count, (($start + $this->pagination_size) - 1));
// Data
$SQL = "select view_alerts.*
from view_alerts
where alert_title regexp :alert_title
limit {$this->pagination_size}
offset {$offset}";
$statement = $connection->prepare($SQL);
$statement->bindValue(":alert_title", $find_words);
$statement->execute();
$alerts = $this->getTableXML("alerts", $statement);
// Insert Pagination Attributes
$alerts->addAttribute("count", $count);
$alerts->addAttribute("start", $start);
$alerts->addAttribute("end", $end);
$alerts->addAttribute("page", $this->pagination_page);
$_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
return $alerts;
}
// ===============================
// Return an Active Alerts Object.
// ===============================
public function getActiveAlerts() {
$SQL = "select *,
date_format(alert_started, '%Y') as alert_started_year,
date_format(alert_started, '%m') as alert_started_month,
date_format(alert_started, '%b') as alert_started_month_abbreviated,
date_format(alert_started, '%M') as alert_started_month_verbose,
date_format(alert_started, '%d') as alert_started_day,
date_format(alert_started, '%a') as alert_started_day_abbreviated,
date_format(alert_started, '%W') as alert_started_day_verbose,
date_format(alert_started, '%Y-%m-%d') as alert_started_date,
date_format(alert_started, '%W, %M %D') as alert_started_date_verbose,
date_format(alert_started, '%H:%i') as alert_started_time,
date_format(alert_started, '%l:%i %p') as alert_started_time_verbose,
date_format(alert_started, '%Y-%m-%d %l:%i %p') as alert_started_verbose,
date_format(alert_expired, '%Y') as alert_expired_year,
date_format(alert_expired, '%m') as alert_expired_month,
date_format(alert_expired, '%b') as alert_expired_month_abbreviated,
date_format(alert_expired, '%M') as alert_expired_month_verbose,
date_format(alert_expired, '%d') as alert_expired_day,
date_format(alert_expired, '%a') as alert_expired_day_abbreviated,
date_format(alert_expired, '%W') as alert_expired_day_verbose,
date_format(alert_expired, '%Y-%m-%d') as alert_expired_date,
date_format(alert_expired, '%W, %M %D') as alert_expired_date_verbose,
date_format(alert_expired, '%H:%i') as alert_expired_time,
date_format(alert_expired, '%l:%i %p') as alert_expired_time_verbose,
date_format(alert_expired, '%Y-%m-%d %l:%i %p') as alert_expired_verbose
from alerts
where (alert_started < now() and alert_expired > now())
order by alert_expired";
$alerts = $this->getTable("alerts", $SQL);
foreach ($alerts as $alert) {
$alert->alert_time_elapsed = $this->getTimeElapsed((string) $alert->alert_started);
}
return $alerts;
}
}
?>
+2
View File
@@ -90,6 +90,8 @@ class Base {
$XSLParms["RANDOM_NUMBER"] = rand(); $XSLParms["RANDOM_NUMBER"] = rand();
$XSLParms["TODAY_YYYYMMDD"] = date("Y-m-d"); $XSLParms["TODAY_YYYYMMDD"] = date("Y-m-d");
$XSLParms["TODAY_MMDDYYYY"] = date("m/d/Y"); $XSLParms["TODAY_MMDDYYYY"] = date("m/d/Y");
$XSLParms["TODAY_HHMM"] = date("Hi");
$XSLParms["COPYRIGHT"] = date("Y");
$XML = new DOMDocument(); $XML = new DOMDocument();
$XSL = new DOMDocument(); $XSL = new DOMDocument();
+2
View File
@@ -577,9 +577,11 @@ class Subscriptions extends Base {
public function userSubscriptions() { public function userSubscriptions() {
$subscriptions = $this->getUsersActiveSubscriptions($this->current_user_serial); $subscriptions = $this->getUsersActiveSubscriptions($this->current_user_serial);
$alerts = (new Alerts())->getActiveAlerts();
$popovers = (new Popovers())->getPopovers(); $popovers = (new Popovers())->getPopovers();
$XML = $this->mergeXML($subscriptions, "<XML/>"); $XML = $this->mergeXML($subscriptions, "<XML/>");
$XML = $this->mergeXML($alerts, $XML);
$XML = $this->mergeXML($popovers, $XML); $XML = $this->mergeXML($popovers, $XML);
$content = $this->applyXSL($XML, $this->getXSL("userSubscriptions")); $content = $this->applyXSL($XML, $this->getXSL("userSubscriptions"));
+255
View File
@@ -0,0 +1,255 @@
// =========
// Add Alert
// =========
$(document).ready(function () {
var $application = $("#APPLICATION_MNEMONIC").val(), $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"), $CKEditor;
// ----------------------
// Initialize the Editor.
// ----------------------
ClassicEditor
.create(document.querySelector('#alert_message'), {
toolbar: {
items: [
'heading',
'|',
'bold',
'italic',
'underline',
'link',
'bulletedList',
'numberedList',
'|',
'fontColor',
'fontSize',
'fontFamily',
'|',
'indent',
'outdent',
'alignment',
'|',
'horizontalLine',
'insertTable',
'|',
'undo',
'redo',
'|'
]},
link: {
addTargetToExternalLinks: true,
defaultProtocol: "http://"
}
})
.then(editor => {
$CKEditor = editor;
})
.catch(error => {
console.error('CK-Editor error...');
console.error(error);
});
// ------------
// Date Pickers
// ------------
$("#alert_starts_date").datepicker({format: "yyyy-mm-dd",
container: "div.starts-date",
keyboardNavigation: false,
autoclose: true,
orientation: "bottom",
todayBtn: "linked",
todayHighlight: true});
$("#alert_expires_date").datepicker({format: "yyyy-mm-dd",
container: "div.expires-date",
keyboardNavigation: false,
autoclose: true,
orientation: "bottom",
todayBtn: "linked",
todayHighlight: true});
$("#alert_starts_time").inputmask({alias: "datetime",
placeholder: "HH:MM",
inputFormat: "HH:MM",
insertMode: false,
showMaskOnHover: false,
hourFormat: 24
});
$("#alert_expires_time").inputmask({alias: "datetime",
placeholder: "HH:MM",
inputFormat: "HH:MM",
insertMode: false,
showMaskOnHover: false,
hourFormat: 24
});
// ---------------------
// Show Calendar Buttons
// ---------------------
$(".btnAlertStartDateCalendar").on("click", function (e) {
e.preventDefault();
$("#alert_starts_date").focus().datepicker("show");
});
$(".btnAlertExpiresDateCalendar").on("click", function (e) {
e.preventDefault();
$("#alert_expires_date").focus().datepicker("show");
});
$("#alert_starts_date").on("blur", function () {
$("#alert_starts_time").focus();
});
$("#alert_expires_date").on("blur", function () {
$("#alert_expires_time").focus();
});
// -----------
// Save Button
// -----------
$(".btnSave").on("click", function (e) {
e.preventDefault();
$("#addAlert").submit();
});
// -------------
// Cancel Button
// -------------
$(".btnCancel").on("click", function () {
$sessionStorage.action = $sessionStorage.addAlert || "";
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
formSubmit($sessionStorage);
});
// ---------------
// Validate Inputs
// ---------------
$("#addAlert").submit(function (e) {
var alert_title = $("#alert_title"),
alert_starts_date = $("#alert_starts_date"),
alert_starts_time = $("#alert_starts_time"),
alert_expires_date = $("#alert_expires_date"),
alert_expires_time = $("#alert_expires_time"),
alert_message = $("#alert_message");
clearInputErrors();
alert_title.val(alert_title.val().replace(/\s+/g, " ").trim());
if (isBlank(alert_title)) {
createInputError(alert_title, "Title is required");
return false;
}
if ((!isBlank(alert_starts_date)) && (!isDate(alert_starts_date))) {
createInputError(alert_starts_date, "Date is invalid");
return false;
}
if (isBlank(alert_starts_time)) {
createInputError(alert_starts_time, "Please enter a Time");
return false;
}
if (!alert_starts_time.inputmask("isComplete")) {
createInputError(alert_starts_time, "Please enter a Time");
return false;
}
if (isBlank(alert_expires_date)) {
createInputError(alert_expires_date, "Please enter a Date");
return false;
}
if ((!isBlank(alert_expires_date)) && (!isDate(alert_expires_date))) {
createInputError(alert_expires_date, "Date is invalid");
return false;
}
if (isBlank(alert_expires_time)) {
createInputError(alert_expires_time, "Please enter a Time");
return false;
}
if (!alert_expires_time.inputmask("isComplete")) {
createInputError(alert_expires_time, "Please enter a Time");
return false;
}
// if (isBlank(alert_message)) {
// createInputError(alert_message, "Please enter a Message");
// return false;
// }
if (!checkDateTime(alert_starts_date, alert_starts_time, alert_expires_date, alert_expires_time)) {
createInputError(alert_expires_time, "Cannot be prior to Start");
return false;
}
e.preventDefault();
$CKEditor.updateSourceElement();
$.post("./", $(this).serialize())
.done(function () {
$sessionStorage.action = $sessionStorage.addAlert || "";
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
formSubmit($sessionStorage);
});
});
});
// -----------------------------------------------------
// Expires date/time cannot be prior to Start date/time.
// -----------------------------------------------------
function checkDateTime(alert_starts_date, alert_starts_time, alert_expires_date, alert_expires_time) {
var starts_date_parts = alert_starts_date.val().split("-"),
starts_time_parts = alert_starts_time.val().split(":"),
expires_date_parts = alert_expires_date.val().split("-"),
expires_time_parts = alert_expires_time.val().split(":"),
starts_date,
expires_date;
starts_date = new Date(starts_date_parts[0], parseInt(starts_date_parts[1], 10) - 1, starts_date_parts[2]);
expires_date = new Date(expires_date_parts[0], parseInt(expires_date_parts[1], 10) - 1, expires_date_parts[2]);
starts_date.setHours(starts_time_parts[0], starts_time_parts[1], 0, 0);
expires_date.setHours(expires_time_parts[0], expires_time_parts[1], 0, 0);
if (expires_date.getTime() < starts_date.getTime()) {
return false;
} else {
return true;
}
}
+8 -8
View File
@@ -3,16 +3,16 @@
// Add Dropdown // Add Dropdown
// ============ // ============
$(document).ready(function() { $(document).ready(function () {
var $application = "ATLHOUSINGREPORT", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"); $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// ----------- // -----------
// Save Button // Save Button
// ----------- // -----------
$(".btnSave").on("click", function(e) { $(".btnSave").on("click", function (e) {
e.preventDefault(); e.preventDefault();
$("#addDropdown").submit(); $("#addDropdown").submit();
}); });
@@ -21,15 +21,15 @@ $(document).ready(function() {
// Cancel Button. // Cancel Button.
// -------------- // --------------
$(".btnCancel").on("click", function() { $(".btnCancel").on("click", function () {
formSubmit({ action : $sessionStorage.addDropdown }); formSubmit({action: $sessionStorage.addDropdown});
}); });
// --------------- // ---------------
// Validate Inputs // Validate Inputs
// --------------- // ---------------
$("#addDropdown").submit( function(e) { $("#addDropdown").submit(function (e) {
var dropdowntype_serial = $("#dropdowntype_serial").val(), var dropdowntype_serial = $("#dropdowntype_serial").val(),
dropdown_value = $("#dropdown_value"); dropdown_value = $("#dropdown_value");
@@ -43,7 +43,7 @@ $(document).ready(function() {
return false; return false;
} }
if (formPost({ action : "Dropdowns.dropdownExists", dropdowntype_serial : dropdowntype_serial, dropdown_serial : 0, dropdown_value : dropdown_value.val() }) === true) { if (formPost({action: "Dropdowns.dropdownExists", dropdowntype_serial: dropdowntype_serial, dropdown_serial: 0, dropdown_value: dropdown_value.val()}) === true) {
createInputError(dropdown_value, "Value already exists"); createInputError(dropdown_value, "Value already exists");
return false; return false;
} }
@@ -52,7 +52,7 @@ $(document).ready(function() {
$.post("./", $(this).serialize()) $.post("./", $(this).serialize())
.done(function() { .done(function () {
$sessionStorage.action = $sessionStorage.addDropdown || ""; $sessionStorage.action = $sessionStorage.addDropdown || "";
$sessionStorage.toast = "Dropdown was Added"; $sessionStorage.toast = "Dropdown was Added";
+1 -1
View File
@@ -5,7 +5,7 @@
$(document).ready(function() { $(document).ready(function() {
var $application = "ATLHOUSINGREPORT", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"); $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// ----------- // -----------
+1 -1
View File
@@ -5,7 +5,7 @@
$(document).ready(function() { $(document).ready(function() {
var $application = "ATLHOUSINGREPORT", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"); $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// ----------- // -----------
+17
View File
@@ -263,6 +263,23 @@ $(document).ready(function () {
}); });
// --------------
// Setup Alerts
// --------------
$(".setup-alerts").on("click", function () {
$sessionStorage.action = "Alerts.setupAlerts";
$sessionStorage.pagination = "first";
$sessionStorage.find_alert = "";
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
formSubmit($sessionStorage);
});
// ------------- // -------------
// Setup Reports // Setup Reports
// ------------- // -------------
+255
View File
@@ -0,0 +1,255 @@
// ==========
// Edit Alert
// ==========
$(document).ready(function () {
var $application = $("#APPLICATION_MNEMONIC").val(), $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"), $CKEditor;
// ----------------------
// Initialize the Editor.
// ----------------------
ClassicEditor
.create(document.querySelector('#alert_message'), {
toolbar: {
items: [
'heading',
'|',
'bold',
'italic',
'underline',
'link',
'bulletedList',
'numberedList',
'|',
'fontColor',
'fontSize',
'fontFamily',
'|',
'indent',
'outdent',
'alignment',
'|',
'horizontalLine',
'insertTable',
'|',
'undo',
'redo',
'|'
]},
link: {
addTargetToExternalLinks: true,
defaultProtocol: "http://"
}
})
.then(editor => {
$CKEditor = editor;
})
.catch(error => {
console.error('CK-Editor error...');
console.error(error);
});
// ------------
// Date Pickers
// ------------
$("#alert_starts_date").datepicker({format: "yyyy-mm-dd",
container: "div.starts-date",
keyboardNavigation: false,
autoclose: true,
orientation: "bottom",
todayBtn: "linked",
todayHighlight: true});
$("#alert_expires_date").datepicker({format: "yyyy-mm-dd",
container: "div.expires-date",
keyboardNavigation: false,
autoclose: true,
orientation: "bottom",
todayBtn: "linked",
todayHighlight: true});
$("#alert_starts_time").inputmask({alias: "datetime",
placeholder: "HH:MM",
inputFormat: "HH:MM",
insertMode: false,
showMaskOnHover: false,
hourFormat: 24
});
$("#alert_expires_time").inputmask({alias: "datetime",
placeholder: "HH:MM",
inputFormat: "HH:MM",
insertMode: false,
showMaskOnHover: false,
hourFormat: 24
});
// ---------------------
// Show Calendar Buttons
// ---------------------
$(".btnAlertStartDateCalendar").on("click", function (e) {
e.preventDefault();
$("#alert_starts_date").focus().datepicker("show");
});
$(".btnAlertExpiresDateCalendar").on("click", function (e) {
e.preventDefault();
$("#alert_expires_date").focus().datepicker("show");
});
$("#alert_starts_date").on("blur", function () {
$("#alert_starts_time").focus();
});
$("#alert_expires_date").on("blur", function () {
$("#alert_expires_time").focus();
});
// -----------
// Save Button
// -----------
$(".btnSave").on("click", function (e) {
e.preventDefault();
$("#editAlert").submit();
});
// -------------
// Cancel Button
// -------------
$(".btnCancel").on("click", function () {
$sessionStorage.action = $sessionStorage.editAlert || "";
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
formSubmit($sessionStorage);
});
// ---------------
// Validate Inputs
// ---------------
$("#editAlert").submit(function (e) {
var alert_title = $("#alert_title"),
alert_starts_date = $("#alert_starts_date"),
alert_starts_time = $("#alert_starts_time"),
alert_expires_date = $("#alert_expires_date"),
alert_expires_time = $("#alert_expires_time"),
alert_message = $("#alert_message");
clearInputErrors();
alert_title.val(alert_title.val().replace(/\s+/g, " ").trim());
if (isBlank(alert_title)) {
createInputError(alert_title, "Title is required");
return false;
}
if ((!isBlank(alert_starts_date)) && (!isDate(alert_starts_date))) {
createInputError(alert_starts_date, "Date is invalid");
return false;
}
if (isBlank(alert_starts_time)) {
createInputError(alert_starts_time, "Please enter a Time");
return false;
}
if (!alert_starts_time.inputmask("isComplete")) {
createInputError(alert_starts_time, "Please enter a Time");
return false;
}
if (isBlank(alert_expires_date)) {
createInputError(alert_expires_date, "Please enter a Date");
return false;
}
if ((!isBlank(alert_expires_date)) && (!isDate(alert_expires_date))) {
createInputError(alert_expires_date, "Date is invalid");
return false;
}
if (isBlank(alert_expires_time)) {
createInputError(alert_expires_time, "Please enter a Time");
return false;
}
if (!alert_expires_time.inputmask("isComplete")) {
createInputError(alert_expires_time, "Please enter a Time");
return false;
}
// if (isBlank(alert_message)) {
// createInputError(alert_message, "Please enter a Message");
// return false;
// }
if (!checkDateTime(alert_starts_date, alert_starts_time, alert_expires_date, alert_expires_time)) {
createInputError(alert_expires_time, "Cannot be prior to Start");
return false;
}
e.preventDefault();
$CKEditor.updateSourceElement();
$.post("./", $(this).serialize())
.done(function () {
$sessionStorage.action = $sessionStorage.addAlert || "";
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
formSubmit($sessionStorage);
});
});
});
// -----------------------------------------------------
// Expires date/time cannot be prior to Start date/time.
// -----------------------------------------------------
function checkDateTime(alert_starts_date, alert_starts_time, alert_expires_date, alert_expires_time) {
var starts_date_parts = alert_starts_date.val().split("-"),
starts_time_parts = alert_starts_time.val().split(":"),
expires_date_parts = alert_expires_date.val().split("-"),
expires_time_parts = alert_expires_time.val().split(":"),
starts_date,
expires_date;
starts_date = new Date(starts_date_parts[0], parseInt(starts_date_parts[1], 10) - 1, starts_date_parts[2]);
expires_date = new Date(expires_date_parts[0], parseInt(expires_date_parts[1], 10) - 1, expires_date_parts[2]);
starts_date.setHours(starts_time_parts[0], starts_time_parts[1], 0, 0);
expires_date.setHours(expires_time_parts[0], expires_time_parts[1], 0, 0);
if (expires_date.getTime() < starts_date.getTime()) {
return false;
} else {
return true;
}
}
+1 -1
View File
@@ -5,7 +5,7 @@
$(document).ready(function() { $(document).ready(function() {
var $application = "ATLHOUSINGREPORT", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"); $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// ----------- // -----------
+1 -1
View File
@@ -5,7 +5,7 @@
$(document).ready(function() { $(document).ready(function() {
var $application = "ATLHOUSINGREPORT", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"); $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// ----------- // -----------
+22 -22
View File
@@ -3,9 +3,9 @@
// Edit Popover // Edit Popover
// ============ // ============
$(document).ready(function() { $(document).ready(function () {
var $application = "ATLHOUSINGREPORT", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"), $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"),
$CKEditor; $CKEditor;
@@ -13,8 +13,8 @@ $(document).ready(function() {
// Initialize the Editor. // Initialize the Editor.
// ---------------------- // ----------------------
ClassicEditor ClassicEditor
.create( document.querySelector( '#popover_text' ), { .create(document.querySelector('#popover_text'), {
toolbar: { toolbar: {
items: [ items: [
'heading', 'heading',
@@ -40,26 +40,26 @@ ClassicEditor
'undo', 'undo',
'redo', 'redo',
'|' '|'
] }, ]},
link: { link: {
addTargetToExternalLinks : true, addTargetToExternalLinks: true,
defaultProtocol : "http://" defaultProtocol: "http://"
} }
}) })
.then( editor => { .then(editor => {
$CKEditor = editor; $CKEditor = editor;
}) })
.catch( error => { .catch(error => {
console.error( 'CK-Editor error...' ); console.error('CK-Editor error...');
console.error( error ); console.error(error);
}); });
// ----------- // -----------
// Save Button // Save Button
// ----------- // -----------
$(".btnSave").on("click", function(e) { $(".btnSave").on("click", function (e) {
e.preventDefault(); e.preventDefault();
@@ -71,9 +71,9 @@ ClassicEditor
// Cancel Button. // Cancel Button.
// -------------- // --------------
$(".btnCancel").on("click", function() { $(".btnCancel").on("click", function () {
$sessionStorage.action = $sessionStorage.editPopover || ""; $sessionStorage.action = $sessionStorage.editPopover;
sessionStorage.setItem($application, JSON.stringify($sessionStorage)); sessionStorage.setItem($application, JSON.stringify($sessionStorage));
@@ -85,7 +85,7 @@ ClassicEditor
// Delete Button // Delete Button
// ------------- // -------------
$(".btnDelete").on("click", function() { $(".btnDelete").on("click", function () {
$("#confirm-dialog").removeClass().addClass("modal confirm-delete-popover") $("#confirm-dialog").removeClass().addClass("modal confirm-delete-popover")
.find(".modal-title").html("Confirm Delete Popover").end() .find(".modal-title").html("Confirm Delete Popover").end()
@@ -94,11 +94,11 @@ ClassicEditor
}); });
$("body").on("click", ".confirm-delete-popover .btnConfirmDialogConfirm", function() { $("body").on("click", ".confirm-delete-popover .btnConfirmDialogConfirm", function () {
$.post("./", { action : "Popovers.deletePopover", popover_serial : $sessionStorage.popover_serial }) $.post("./", {action: "Popovers.deletePopover", popover_serial: $sessionStorage.popover_serial})
.done(function() { .done(function () {
$sessionStorage.action = $sessionStorage.editPopover || ""; $sessionStorage.action = $sessionStorage.editPopover || "";
@@ -114,7 +114,7 @@ ClassicEditor
// Validate Inputs // Validate Inputs
// --------------- // ---------------
$("#editPopover").submit( function(e) { $("#editPopover").submit(function (e) {
var popover_serial = $("#popover_serial"), var popover_serial = $("#popover_serial"),
popover_name = $("#popover_name"), popover_name = $("#popover_name"),
@@ -131,7 +131,7 @@ ClassicEditor
return false; return false;
} }
if (formPost({ action : "Popovers.popoverExists", popover_serial : popover_serial.val(), popover_name : popover_name.val() }) === true) { if (formPost({action: "Popovers.popoverExists", popover_serial: popover_serial.val(), popover_name: popover_name.val()}) === true) {
createInputError(popover_name, "Name already exists"); createInputError(popover_name, "Name already exists");
return false; return false;
} }
@@ -147,9 +147,9 @@ ClassicEditor
$.post("./", $(this).serialize()) $.post("./", $(this).serialize())
.done(function() { .done(function () {
$sessionStorage.action = $sessionStorage.editPopover || ""; $sessionStorage.action = $sessionStorage.editPopover;
sessionStorage.setItem($application, JSON.stringify($sessionStorage)); sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+1 -1
View File
@@ -5,7 +5,7 @@
$(document).ready(function() { $(document).ready(function() {
var $application = "ATLHOUSINGREPORT", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"); $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// ----------- // -----------
+1 -1
View File
@@ -5,7 +5,7 @@
$(document).ready(function() { $(document).ready(function() {
var $application = "ATLHOUSINGREPORT", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"); $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// ----------- // -----------
+205
View File
@@ -0,0 +1,205 @@
// ==============
// Setup Alerts
// ==============
$(document).ready(function () {
var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// -----------
// Find Button
// -----------
$(".btnFind").on("click", function () {
$sessionStorage.action = "Alerts.setupAlerts";
$sessionStorage.pagination = "first";
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
$("#spinner-dialog").modal("show");
formSubmit($sessionStorage);
});
$("#find_alert").on("keyup", function (e) {
if (e.key === "Enter") {
$(".btnFind").trigger("click");
}
});
// -----------------
// Clear Find Button
// -----------------
$(".btnClearFind").on("click", function () {
$("#find_alert").val("").trigger("change");
$sessionStorage.action = "Alerts.setupAlerts";
$sessionStorage.pagination = "first";
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
$("#spinner-dialog").modal("show");
formSubmit($sessionStorage);
});
// ------------------
// Pagination Buttons
// ------------------
$(".btnPagination").on("click", function () {
$sessionStorage.action = "Alerts.setupAlerts";
$sessionStorage.pagination = $(this).data("pagination");
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
$("#spinner-dialog").modal("show");
formSubmit($sessionStorage);
delete $sessionStorage.pagination;
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
});
// ----------
// Add Button
// ----------
$(".btnAdd").on("click", function () {
$sessionStorage.action = "Alerts.addAlert";
$sessionStorage.addAlert = "Alerts.setupAlerts";
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
formSubmit($sessionStorage);
});
// -----------
// Done Button
// -----------
$(".btnDone").on("click", function () {
formSubmit({action: ""});
});
// ----
// Edit
// ----
$("#alerts-table tbody").on("click touch", "tr", function (e) {
e.preventDefault();
$sessionStorage.action = "Alerts.editAlert";
$sessionStorage.alert_serial = $(this).data("alert-serial");
$sessionStorage.editAlert = "Alerts.setupAlerts";
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
formSubmit($sessionStorage);
});
// -------------------
// Save Changed Inputs
// -------------------
$(".autosave").on("change", function (e) {
switch (e.target.type) {
case "text" :
$sessionStorage[e.target.name] = $(this).val();
break;
case "radio" :
$sessionStorage[e.target.name] = $(this).val();
break;
case "checkbox" :
$sessionStorage[e.target.name] = $(this).prop("checked");
break;
case "select-one" :
$sessionStorage[e.target.name] = $(this).val();
break;
case "hidden" :
$sessionStorage[e.target.name] = $(this).val();
break;
default :
$sessionStorage[e.target.name] = $(this).val();
break;
}
sessionStorage.setItem($application, JSON.stringify($sessionStorage));
});
// ----------------
// Initalize Inputs
// ----------------
$.each($sessionStorage, function (name, value) {
var $input = $(":input").filter("[name='" + name + "']");
if ($input.length > 0) {
switch ($input.prop("type")) {
case "text" :
$input.val(value);
break;
case "radio" :
$input.filter("[value=" + value + "]").prop("checked", true);
break;
case "checkbox" :
$input.prop("checked", value);
break;
case "select-one" :
$input.val(value);
break;
case "hidden" :
$input.val(value);
break;
default :
$input.val(value);
break;
}
}
});
// ------------------
// Save preset Inputs
// ------------------
$("input[type=radio]:checked").trigger("change");
// -----------------
// Per Page Dropdown
// -----------------
$("#alerts_per_page").on("change", function () {
$(".btnFind").trigger("click");
});
});
+1 -1
View File
@@ -5,7 +5,7 @@
$(document).ready(function() { $(document).ready(function() {
var $application = "ATLHOUSINGREPORT", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"); $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// -------------------------------- // --------------------------------
+1 -1
View File
@@ -5,7 +5,7 @@
$(document).ready(function() { $(document).ready(function() {
var $application = "ATLHOUSINGREPORT", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"); $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// ----------- // -----------
+49 -25
View File
@@ -3,16 +3,16 @@
// Setup Popovers // Setup Popovers
// ============== // ==============
$(document).ready(function() { $(document).ready(function () {
var $application = "PARKS", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"); $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// ----------- // -----------
// Find Button // Find Button
// ----------- // -----------
$(".btnFind").on("click", function() { $(".btnFind").on("click", function () {
$sessionStorage.action = "Popovers.setupPopovers"; $sessionStorage.action = "Popovers.setupPopovers";
$sessionStorage.pagination = "first"; $sessionStorage.pagination = "first";
@@ -25,7 +25,7 @@ $(document).ready(function() {
}); });
$("#find_popover").on("keyup", function(e) { $("#find_popover").on("keyup", function (e) {
if (e.key === "Enter") { if (e.key === "Enter") {
$(".btnFind").trigger("click"); $(".btnFind").trigger("click");
} }
@@ -35,7 +35,7 @@ $(document).ready(function() {
// Clear Find Button // Clear Find Button
// ----------------- // -----------------
$(".btnClearFind").on("click", function() { $(".btnClearFind").on("click", function () {
$("#find_popover").val("").trigger("change"); $("#find_popover").val("").trigger("change");
@@ -54,7 +54,7 @@ $(document).ready(function() {
// Pagination Buttons // Pagination Buttons
// ------------------ // ------------------
$(".btnPagination").on("click", function() { $(".btnPagination").on("click", function () {
$sessionStorage.action = "Popovers.setupPopovers"; $sessionStorage.action = "Popovers.setupPopovers";
$sessionStorage.pagination = $(this).data("pagination"); $sessionStorage.pagination = $(this).data("pagination");
@@ -75,7 +75,7 @@ $(document).ready(function() {
// Add Button // Add Button
// ---------- // ----------
$(".btnAdd").on("click", function() { $(".btnAdd").on("click", function () {
$sessionStorage.action = "Popovers.addPopover"; $sessionStorage.action = "Popovers.addPopover";
$sessionStorage.addPopover = "Popovers.setupPopovers"; $sessionStorage.addPopover = "Popovers.setupPopovers";
@@ -90,9 +90,9 @@ $(document).ready(function() {
// Done Button // Done Button
// ----------- // -----------
$(".btnDone").on("click", function() { $(".btnDone").on("click", function () {
formSubmit({ action : "" }); formSubmit({action: ""});
}); });
@@ -100,7 +100,7 @@ $(document).ready(function() {
// Edit // Edit
// ---- // ----
$("#popovers-table tbody").on("click touch", "tr", function(e) { $("#popovers-table tbody").on("click touch", "tr", function (e) {
e.preventDefault(); e.preventDefault();
@@ -118,17 +118,29 @@ $(document).ready(function() {
// Save Changed Inputs // Save Changed Inputs
// ------------------- // -------------------
$(".autosave").on("change", function(e) { $(".autosave").on("change", function (e) {
switch (e.target.type) { switch (e.target.type) {
case "text" : $sessionStorage[e.target.name] = $(this).val(); break; case "text" :
case "radio" : $sessionStorage[e.target.name] = $(this).val(); break; $sessionStorage[e.target.name] = $(this).val();
case "checkbox" : $sessionStorage[e.target.name] = $(this).prop("checked"); break; break;
case "select-one" : $sessionStorage[e.target.name] = $(this).val(); break; case "radio" :
case "hidden" : $sessionStorage[e.target.name] = $(this).val(); break; $sessionStorage[e.target.name] = $(this).val();
break;
case "checkbox" :
$sessionStorage[e.target.name] = $(this).prop("checked");
break;
case "select-one" :
$sessionStorage[e.target.name] = $(this).val();
break;
case "hidden" :
$sessionStorage[e.target.name] = $(this).val();
break;
default : $sessionStorage[e.target.name] = $(this).val(); break; default :
$sessionStorage[e.target.name] = $(this).val();
break;
} }
@@ -140,7 +152,7 @@ $(document).ready(function() {
// Initalize Inputs // Initalize Inputs
// ---------------- // ----------------
$.each($sessionStorage, function(name, value) { $.each($sessionStorage, function (name, value) {
var $input = $(":input").filter("[name='" + name + "']"); var $input = $(":input").filter("[name='" + name + "']");
@@ -148,13 +160,25 @@ $(document).ready(function() {
switch ($input.prop("type")) { switch ($input.prop("type")) {
case "text" : $input.val(value); break; case "text" :
case "radio" : $input.filter("[value=" + value + "]").prop("checked", true); break; $input.val(value);
case "checkbox" : $input.prop("checked", value); break; break;
case "select-one" : $input.val(value); break; case "radio" :
case "hidden" : $input.val(value); break; $input.filter("[value=" + value + "]").prop("checked", true);
break;
case "checkbox" :
$input.prop("checked", value);
break;
case "select-one" :
$input.val(value);
break;
case "hidden" :
$input.val(value);
break;
default : $input.val(value); break; default :
$input.val(value);
break;
} }
@@ -172,7 +196,7 @@ $(document).ready(function() {
// Per Page Dropdown // Per Page Dropdown
// ----------------- // -----------------
$("#popovers_per_page").on("change", function() { $("#popovers_per_page").on("change", function () {
$(".btnFind").trigger("click"); $(".btnFind").trigger("click");
+1 -1
View File
@@ -5,7 +5,7 @@
$(document).ready(function() { $(document).ready(function() {
var $application = "ATLHOUSINGREPORT", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"); $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// ----------- // -----------
+1 -1
View File
@@ -5,7 +5,7 @@
$(document).ready(function() { $(document).ready(function() {
var $application = "ATLHOUSINGREPORT", var $application = $("#APPLICATION_MNEMONIC").val(),
$sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"); $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
// ----------- // -----------
+1 -5
View File
@@ -2,10 +2,6 @@
<project-private xmlns="http://www.netbeans.org/ns/project-private/1"> <project-private xmlns="http://www.netbeans.org/ns/project-private/1">
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/> <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2"> <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group> <group/>
<file>file:/C:/Users/JamesRichie/OneDrive%20-%20OneSource%20IT%20Solutions%20LLC/Documents/NetBeansProjects/dec-international/atlhousingreport/classes/SupportTickets.php</file>
<file>file:/C:/Users/JamesRichie/OneDrive%20-%20OneSource%20IT%20Solutions%20LLC/Documents/NetBeansProjects/dec-international/atlhousingreport/xsl/viewSupportTickets.xsl</file>
<file>file:/C:/Users/JamesRichie/OneDrive%20-%20OneSource%20IT%20Solutions%20LLC/Documents/NetBeansProjects/dec-international/atlhousingreport/js/viewSupportTickets.js</file>
</group>
</open-files> </open-files>
</project-private> </project-private>
+23
View File
@@ -0,0 +1,23 @@
<?php
$SQL = "create table alerts
(
alert_serial serial,
alert_title varchar(100) default null,
alert_started datetime default null,
alert_expired datetime default null,
alert_message varchar(1000) default null,
alert_creator varchar(100) default null,
alert_created datetime default null,
alert_changer varchar(100) default null,
alert_changed datetime default null,
primary key (alert_serial)
)
default character set = utf8";
?>
+16
View File
@@ -0,0 +1,16 @@
<?php
$SQL = "create view view_alerts as
select alerts.*,
date_format(alert_created, '%c/%e/%Y %l:%i %p') as alert_created_verbose,
date_format(alert_changed, '%c/%e/%Y %l:%i %p') as alert_changed_verbose,
date_format(alert_started, '%c/%e/%Y %l:%i %p') as alert_started_verbose,
date_format(alert_expired, '%c/%e/%Y %l:%i %p') as alert_expires_verbose
from alerts
order by alert_created";
?>
+137
View File
@@ -0,0 +1,137 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="utf-8" indent="yes"/>
<!-- Parameters -->
<xsl:param name="VERSION">1.0</xsl:param>
<xsl:param name="PAGE-TITLE">Add Alert</xsl:param>
<xsl:param name="PAGE-NAME">addAlert</xsl:param>
<xsl:template match="/">
<script src="js/{$PAGE-NAME}.js?version={$VERSION}"/>
<script src="js/ckeditor.js?version={$VERSION}"/>
<div class="{$PAGE-NAME}">
<div class="card">
<div class="card-header bg-primary text-white p-1 ps-3 border-bottom-0">
<i class="bi bi-plus-lg me-2"/>
<xsl:value-of select="$PAGE-TITLE"/>
</div>
<div class="card-body">
<form action="" name="{$PAGE-NAME}" method="post" id="{$PAGE-NAME}" enctype="multipart/form-data">
<input type="hidden" name="action" value="Alerts.addAlert"/>
<input type="hidden" name="step" value="add"/>
<div class="row">
<div class="col-lg-5 mb-3">
<label class="form-label" for="alert_title">Title</label>
<input type="text" class="form-control form-control-sm" name="alert_title" id="alert_title" maxlength="100" autocomplete="off" autofocus="yes"/>
</div>
</div>
<div class="row">
<div class="col-md-3 mb-3">
<label class="form-label" for="alert_starts_date">Start Date</label>
<div class="input-group input-group-sm starts-date">
<span class="input-group-text">Date:</span>
<input type="text" class="form-control form-control-sm date-mask" name="alert_starts_date" id="alert_starts_date" autocomplete="off" maxlength="10"
value="{$TODAY_YYYYMMDD}"/>
<button class="btn btn-outline-primary btnAlertStartDateCalendar" type="button" data-target="#alert_starts_date" data-bs-toggle="tooltip" data-bs-title="Calendar" tabindex="-1">
<i class="bi bi-calendar3"></i>
</button>
</div>
</div>
<div class="col-md-3 mb-3">
<label class="form-label" for="alert_starts_time">Start Time <span class="text-small text-muted text-nowrap ml-2">(24-Hour format)</span></label>
<div class="input-group input-group-sm">
<span class="input-group-text">Time:</span>
<input type="text" class="form-control form-control-sm date-mask" name="alert_starts_time" id="alert_starts_time" autocomplete="off" maxlength="10"
value="{$TODAY_HHMM}"/>
</div>
</div>
</div>
<div class="row">
<div class="col-md-3 mb-3">
<label class="form-label" for="alert_expires_date">Expires Date</label>
<div class="input-group input-group-sm expires-date">
<span class="input-group-text">Date:</span>
<input type="text" class="form-control form-control-sm date-mask" name="alert_expires_date" id="alert_expires_date" autocomplete="off" maxlength="10"/>
<button class="btn btn-outline-primary btnAlertExpiresDateCalendar" type="button" data-target="#alert_expires_date" data-bs-toggle="tooltip" data-bs-title="Calendar" tabindex="-1">
<i class="bi bi-calendar3"></i>
</button>
</div>
</div>
<div class="col-md-3 mb-3">
<label class="form-label" for="alert_expires_time">Expires Time <span class="text-small text-muted text-nowrap ml-2">(24-Hour format)</span></label>
<div class="input-group input-group-sm start_date">
<span class="input-group-text">Time:</span>
<input type="text" class="form-control form-control-sm date-mask" name="alert_expires_time" id="alert_expires_time" autocomplete="off" maxlength="10"/>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 mb-3">
<label class="form-label" for="alert_message">Alert Message</label>
<textarea class="form-control form-control-sm" name="alert_message" id="alert_message"/>
</div>
</div>
</form>
<div class="buttons mt-1 mb-2">
<button type="button" class="btn btn-sm btn-primary me-2 btnCancel">
<i class="bi bi-box-arrow-left me-2"/>Cancel</button>
<button type="button" class="btn btn-sm btn-primary me-2 btnSave">
<i class="bi bi-save me-2"/>Save</button>
</div>
</div>
</div>
</div>
</xsl:template>
</xsl:stylesheet>
+4 -1
View File
@@ -179,6 +179,9 @@
<div class="dropdown-divider mt-1 mb-1"/> <div class="dropdown-divider mt-1 mb-1"/>
<a class="dropdown-item ps-2 setup-alerts" href="javascript:void(0);">
<i class="bi bi-info-circle me-2"/>Alerts</a>
<a class="dropdown-item ps-2 setup-counties" href="javascript:void(0);"> <a class="dropdown-item ps-2 setup-counties" href="javascript:void(0);">
<i class="bi bi-building me-2"/>Counties <i class="bi bi-building me-2"/>Counties
</a> </a>
@@ -218,7 +221,7 @@
<i class="bi bi-journal me-2"/>Journal <i class="bi bi-journal me-2"/>Journal
</a> </a>
<!-- <a class="dropdown-item ps-2 view-support-tickets" href="javascript:void(0);"> <!-- <a class="dropdown-item ps-2 view-support-tickets" href="javascript:void(0);">
<i class="bi bi-question-circle me-2"/>Support Tickets <i class="bi bi-question-circle me-2"/>Support Tickets
</a>--> </a>-->
+143
View File
@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="utf-8" indent="yes"/>
<!-- Parameters -->
<xsl:param name="VERSION">1.0</xsl:param>
<xsl:param name="PAGE-TITLE">Edit Alert</xsl:param>
<xsl:param name="PAGE-NAME">editAlert</xsl:param>
<xsl:template match="/">
<script src="js/{$PAGE-NAME}.js?version={$VERSION}"/>
<script src="js/ckeditor.js?version={$VERSION}"/>
<div class="{$PAGE-NAME}">
<div class="card">
<div class="card-header bg-primary text-white p-1 ps-3 border-bottom-0">
<i class="bi bi-chat-square-dots me-2"/>
<xsl:value-of select="$PAGE-TITLE"/>
</div>
<div class="card-body">
<form action="" name="{$PAGE-NAME}" method="post" id="{$PAGE-NAME}" enctype="multipart/form-data">
<input type="hidden" name="action" value="Alerts.editAlert"/>
<input type="hidden" name="step" value="update"/>
<input type="hidden" name="alert_serial" id="alert_serial" value="{//alerts/record/alert_serial}"/>
<div class="row">
<div class="col-lg-5 mb-3">
<label class="form-label" for="alert_title">Title</label>
<input type="text" class="form-control form-control-sm" name="alert_title" id="alert_title" maxlength="100" autocomplete="off" value="{//alerts/record/alert_title}"/>
</div>
</div>
<div class="row">
<div class="col-md-3 mb-3">
<label class="form-label" for="alert_starts_date">Start Date</label>
<div class="input-group input-group-sm starts-date">
<span class="input-group-text">Date:</span>
<input type="text" class="form-control form-control-sm date-mask" name="alert_starts_date" id="alert_starts_date" autocomplete="off" maxlength="10"
value="{//alerts/record/alert_started_date}"/>
<button class="btn btn-outline-primary btnAlertStartDateCalendar" type="button" data-target="#alert_starts_date" data-bs-toggle="tooltip" data-bs-title="Calendar" tabindex="-1">
<i class="bi bi-calendar3"></i>
</button>
</div>
</div>
<div class="col-md-3 mb-3">
<label class="form-label" for="alert_starts_time">Start Time <span class="text-small text-muted text-nowrap ml-2">(24-Hour format)</span></label>
<div class="input-group input-group-sm">
<span class="input-group-text">Time:</span>
<input type="text" class="form-control form-control-sm date-mask" name="alert_starts_time" id="alert_starts_time" autocomplete="off" maxlength="10"
value="{//alerts/record/alert_started_time}"/>
</div>
</div>
</div>
<div class="row">
<div class="col-md-3 mb-3">
<label class="form-label" for="alert_expires_date">Expires Date</label>
<div class="input-group input-group-sm expires-date">
<span class="input-group-text">Date:</span>
<input type="text" class="form-control form-control-sm date-mask" name="alert_expires_date" id="alert_expires_date" autocomplete="off" maxlength="10"
value="{//alerts/record/alert_expired_date}"/>
<button class="btn btn-outline-primary btnAlertExpiresDateCalendar" type="button" data-target="#alert_expires_date" data-bs-toggle="tooltip" data-bs-title="Calendar" tabindex="-1">
<i class="bi bi-calendar3"></i>
</button>
</div>
</div>
<div class="col-md-3 mb-3">
<label class="form-label" for="alert_expires_time">Expires Time <span class="text-small text-muted text-nowrap ml-2">(24-Hour format)</span></label>
<div class="input-group input-group-sm start_date">
<span class="input-group-text">Time:</span>
<input type="text" class="form-control form-control-sm date-mask" name="alert_expires_time" id="alert_expires_time" autocomplete="off" maxlength="10" value="{//alerts/record/alert_expired_time}"/>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 mb-3">
<label class="form-label" for="alert_message">Alert Message</label>
<textarea class="form-control form-control-sm" name="alert_message" id="alert_message">
<xsl:value-of select="//alerts/record/alert_message"/>
</textarea>
</div>
</div>
</form>
<div class="buttons mt-1 mb-2">
<button type="button" class="btn btn-sm btn-primary me-2 btnCancel">
<i class="bi bi-box-arrow-left me-2"/>Cancel</button>
<button type="button" class="btn btn-sm btn-primary me-2 btnSave">
<i class="bi bi-save me-2"/>Save</button>
</div>
</div>
</div>
</div>
</xsl:template>
</xsl:stylesheet>
+160
View File
@@ -0,0 +1,160 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="utf-8" indent="yes"/>
<!-- Parameters -->
<xsl:param name="VERSION">1.0</xsl:param>
<xsl:param name="PAGE-TITLE">Alerts</xsl:param>
<xsl:param name="PAGE-NAME">setupAlerts</xsl:param>
<!-- Variables -->
<xsl:variable name="PAGINATION_COUNT" select="//alerts/@count"/>
<xsl:variable name="PAGINATION_START" select="//alerts/@start"/>
<xsl:variable name="PAGINATION_END" select="//alerts/@end"/>
<xsl:variable name="PAGINATION_PAGE" select="//alerts/@page"/>
<!-- Main Template -->
<xsl:template match="/">
<script src="js/{$PAGE-NAME}.js?version={$VERSION}"/>
<div class="{$PAGE-NAME}">
<div class="card">
<div class="card-header bg-primary text-white p-1 ps-3 border-bottom-0">
<i class="bi bi-info-circle me-2"/>
<xsl:value-of select="$PAGE-TITLE"/>
<xsl:if test="$PAGINATION_COUNT > 0">
<xsl:text> | Showing </xsl:text>
<xsl:value-of select="format-number($PAGINATION_START, '###,##0')"/>
<xsl:text> to </xsl:text>
<xsl:value-of select="format-number($PAGINATION_END, '###,##0')"/>
<xsl:text> of </xsl:text>
<xsl:value-of select="format-number($PAGINATION_COUNT, '###,##0')"/>
</xsl:if>
</div>
<div class="card-body">
<div class="row align-items-center mt-2 mb-3">
<div class="col-lg-4">
<div class="input-group input-group-sm">
<input type="text" class="form-control autosave" name="find_alert" id="find_alert" maxlength="100" autocomplete="off" placeholder="{//popovers/record[popover_name = 'find_alert']/popover_placeholder}" autofocus="autofocus"/>
<button type="button" class="btn btn-primary fw-bold btnFind" data-bs-toggle="tooltip" data-bs-title="{//popovers/record[popover_name = 'find_alert']/popover_text}" data-bs-html="true" data-bs-custom-class="custom-tooltip">
<i class="bi bi-search"/>
</button>
<button type="button" class="btn btn-primary fw-bold btnClearFind" data-bs-toggle="tooltip" data-bs-title="Clear Find" data-bs-custom-class="custom-tooltip">
<i class="bi bi-arrow-clockwise"/>
</button>
</div>
</div>
<div class="col-auto">
<div class="input-group input-group-sm" data-bs-toggle="tooltip" data-bs-title="Show Per Page" data-bs-custom-class="custom-tooltip">
<div class="input-group-text">
<i class="bi bi-list-ol"/>
</div>
<select class="form-select autosave" name="alerts_per_page" id="alerts_per_page">
<option value="20">20</option>
<option value="40">40</option>
<option value="60">60</option>
<option value="80">80</option>
<option value="100">100</option>
</select>
</div>
</div>
</div>
<!-- Action Buttons -->
<div class="buttons mt-3 mb-2">
<button type="button" class="btn btn-sm btn-primary me-2 btnDone">
<i class="bi bi-box-arrow-left me-2"/>Done</button>
<button type="button" class="btn btn-sm btn-primary me-2 btnAdd">
<i class="bi bi-plus-lg me-2"/>Add</button>
<div class="btn-group ms-2" role="group">
<xsl:if test="$PAGINATION_PAGE > 1">
<button type="button" class="btn btn-sm btn-primary btnPagination" data-pagination="first" data-bs-toggle="tooltip" data-bs-title="First Page" data-bs-custom-class="custom-tooltip">
<i class="bi bi-chevron-bar-left me-1"/>First</button>
<button type="button" class="btn btn-sm btn-primary btnPagination" data-pagination="previous" data-bs-toggle="tooltip" data-bs-title="Previous Page" data-bs-custom-class="custom-tooltip">
<i class="bi bi-chevron-left me-1"/>Previous</button>
</xsl:if>
<xsl:if test="$PAGINATION_COUNT > $PAGINATION_END">
<button type="button" class="btn btn-sm btn-primary btnPagination" data-pagination="next" data-bs-toggle="tooltip" data-bs-title="Next Page" data-bs-custom-class="custom-tooltip">
<i class="bi bi-chevron-right me-1"/>Next</button>
<button type="button" class="btn btn-sm btn-primary btnPagination" data-pagination="last" data-bs-toggle="tooltip" data-bs-title="Last Page" data-bs-custom-class="custom-tooltip">
<i class="bi bi-chevron-bar-right me-1"/>Last</button>
</xsl:if>
</div>
</div>
<hr class="mt-3 mb-2"/>
<xsl:choose>
<xsl:when test="count(//alerts/record) = 0">
<div class="fs-5 text-danger fw-bold fst-italic mt-3 mb-1">
<xsl:text>There are no Alerts to view...</xsl:text>
</div>
</xsl:when>
<xsl:otherwise>
<div class="table-wrapper table-responsive">
<table class="table table-sm table-striped table-hover base-table table-auto" id="alerts-table">
<thead>
<th>Title</th>
<th>Starts</th>
<th>Expires</th>
</thead>
<tbody>
<xsl:apply-templates select="//alerts"/>
</tbody>
</table>
</div>
</xsl:otherwise>
</xsl:choose>
</div>
</div>
</div>
</xsl:template>
<!-- Template for table rows -->
<xsl:template match="alerts/record">
<tr class="hoverable alert-row" data-alert-serial="{alert_serial}" data-alert-name="{alert_title}">
<td class="alert_title">
<xsl:value-of select="alert_title"/>
</td>
<td class="alert_start">
<xsl:value-of select="alert_started_verbose"/>
</td>
<td class="alert_end">
<xsl:value-of select="alert_expires_verbose"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
+44
View File
@@ -17,6 +17,26 @@
<div class="{$PAGE-NAME}"> <div class="{$PAGE-NAME}">
<xsl:choose>
<xsl:when test="count(//alerts/record) > 0">
<div class="card mb-4">
<div class="card-header bg-danger text-white p-1 ps-3">
<i class="bi bi-info-circle me-2"/>
Messages
</div>
<div class="card-body">
<xsl:apply-templates select="//alerts"/>
</div>
</div>
</xsl:when>
</xsl:choose>
<div class="card"> <div class="card">
<div class="card-header bg-primary text-white p-1 ps-3"> <div class="card-header bg-primary text-white p-1 ps-3">
@@ -102,4 +122,28 @@
</xsl:template> </xsl:template>
<!-- Template to create Alerts objects -->
<xsl:template match="alerts">
<xsl:for-each select="record">
<div class="row">
<xsl:value-of select="alert_message" disable-output-escaping="yes"/>
</div>
<!-- <div class="row alert-time-elapsed-row mb-0 text-muted">
<div class="col alert-company">
<xsl:value-of select="alert_time_elapsed"/>
</div>
</div>-->
<xsl:if test="position() != last()">
<hr class="mt-1 mb-1"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>