Files
namaste/utilities/gaAdmin.php
gramps 373ebc8c93 Archive: Namaste PHP AMQP framework v1.0 (2017-2020)
952 days continuous production uptime, 40k+ tp/s single node.
Original corpo Bitbucket history not included — clean archive commit.
2026-04-05 09:49:30 -07:00

835 lines
34 KiB
PHP

<?php
/**
* gaAdmin -- the Namaste Admin program
*
* This program provides the administrative interface for Namaste - it is a single-script PHP program that utilizes
* Material-Design Bootstrap framework and template. (Licensed to Micheal Shallop/Single-Project) See the licensing
* doc in ./html for more info.
*
* The program self-processes user-input and allows for:
*
* a) updating some table-based data used in Namaste
* b) dashboard of generalized Namaste activity
*
* Over time, additional functionality will be added as required. For now, the main purpose of the program is to allow
* the Namaste admin an easy way to edit db data values, and passively view the state of Namaste.
*
* This script will only run from the admin service and so required a web-service to be installed.
*
* Programmer Notes:
* -----------------
* This project is incomplete - it requires someone much more adept (which is pretty much anyone) at f/e programming
* than myself. The sub-directory (./utilities/admin) contains additional scripts/programs for this main program.
*
* The MDB libs are in ./html and are licensed to me for this project. I acquired the admin-theme for this project
* and it's doc is at: https://mdbootstrap.com/product/admin-theme/
*
* @author mike@givingassistant.org
* @version 1.0.0
*
*
* HISTORY:
* ========
* 08-03-18 mks CORE-1113: Initial coding.
*
*/
// initialization
require_once(dirname(__DIR__) . '/config/sneakerstrap.inc');
$systemMessage = [];
$formErrors = [];
$data = $_POST;
$formStatus = false;
$sysDataLoad = false;
$formState = STATE_DATA_ERROR;
if (!is_null($data) and isset($data['c'])) {
require_once('admin/fetchSysData.php');
}
// request to manipulate constants (state/status)
if (isset($data['c']) and $sysDataLoad) {
switch (intval($data['c'])) {
case 1 :
// state constants
case 2 :
// status constants
require_once('admin/loadConstants.php');
break;
default :
$systemMessage[] = 'received a bad parameter for constants - could not load constant data';
break;
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Material Design Bootstrap</title>
<!-- Font Awesome -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<!-- Bootstrap core CSS -->
<link href="../html/css/bootstrap.min.css" rel="stylesheet">
<!-- Material Design Bootstrap -->
<link href="../html/css/mdb.min.css" rel="stylesheet">
<!-- Your custom styles (optional) -->
<link href="../html/css/style.css" rel="stylesheet">
</head>
<body class="fixed-sn indigo-skin">
<!--Main Navigation-->
<header>
<!--Navbar-->
<nav class="navbar navbar-expand-lg justify-content-between double-nav fixed-top navbar-dark blue-gradient">
<!-- SideNav slide-out button -->
<div class="float-left">
<a href="#" data-activates="slide-out" class="button-collapse">
<i class="fa fa-bars"></i>
</a>
</div>
<!-- Breadcrumb-->
<div class="breadcrumb-dn mr-auto darken-1">
<p>Namaste Administration</p>
</div>
<!-- Links -->
<ul class="nav navbar-nav nav-flex-icons ml-auto">
<li class="nav-item">
<a class="nav-link">
<i class="fa fa-envelope"></i>
<span class="clearfix d-none d-sm-inline-block">Contact</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link">
<i class="fa fa-gear"></i>
<span class="clearfix d-none d-sm-inline-block">Settings</span>
</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-user"></i>
<span class="clearfix d-none d-sm-inline-block">Account</span>
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</li>
</ul>
</nav>
<!--/.Navbar-->
<!-- Sidebar navigation -->
<div id="slide-out" class="side-nav fixed">
<ul class="custom-scrollbar list-unstyled">
<!-- Logo -->
<li class="logo-sn waves-effect">
<div class=" text-center">
<a href="#" class="pl-0">
<img src="../html/img/namaste.png" height="50" alt="">
</a>
</div>
</li>
<!--/. Logo -->
<!--Search Form-->
<li>
<form class="search-form" role="search">
<div class="md-form my-0 waves-light">
<input type="text" class="form-control py-2" placeholder="Search">
</div>
</form>
</li>
<!--/.Search Form-->
<!-- Side navigation links -->
<li>
<ul class="collapsible collapsible-accordion">
<li>
<a class="collapsible-header waves-effect arrow-r">
<i class="fa fa-gear"></i> Edit Constants
<i class="fa fa-angle-down rotate-icon"></i>
</a>
<div class="collapsible-body">
<ul>
<!-- <form id="gaConstants" action="" method="post">-->
<form id="gaConstants" action="">
<li>
<!--<a href="javascript:void(0);" onclick="$('#gaConstants').submit()" id="stateConstants" class="getSysD waves-effect">State Constants</a>-->
<a href="javascript:void(0);" id="stateConstants" class="getSysD waves-effect">State Constants</a>
</li>
<li>
<a href="javascript:void(0);" id="statusConstants" class="getSysD waves-effect">Status Constants</a>
<!--<a href="javascript:void(0);" onclick="$('#gaConstants').submit()" id="statusConstants" class="getSysD waves-effect">Status Constants</a>-->
</li>
</form>
</ul>
</div>
</li>
<li>
<a class="collapsible-header waves-effect arrow-r">
<i class="fa fa-hand-pointer-o"></i> Instruction
<i class="fa fa-angle-down rotate-icon"></i>
</a>
<div class="collapsible-body">
<ul>
<li>
<a href="#" class="waves-effect">For bloggers</a>
</li>
<li>
<a href="#" class="waves-effect">For authors</a>
</li>
</ul>
</div>
</li>
<li>
<a class="collapsible-header waves-effect arrow-r">
<i class="fa fa-eye"></i> About
<i class="fa fa-angle-down rotate-icon"></i>
</a>
<div class="collapsible-body">
<ul>
<li>
<a href="#" class="waves-effect">Introduction</a>
</li>
<li>
<a href="#" class="waves-effect">Monthly meetings</a>
</li>
</ul>
</div>
</li>
<li>
<a class="collapsible-header waves-effect arrow-r">
<i class="fa fa-envelope-o"></i> Contact me
<i class="fa fa-angle-down rotate-icon"></i>
</a>
<div class="collapsible-body">
<ul>
<li>
<a href="#" class="waves-effect">FAQ</a>
</li>
<li>
<a href="#" class="waves-effect">Write a message</a>
</li>
</ul>
</div>
</li>
</ul>
</li>
<!--/. Side navigation links -->
</ul>
<!-- Mask -->
<div class="sidenav-bg mask-strong"></div>
</div>
<!--/. Sidebar navigation -->
</header>
<!--Main Navigation-->
<!--Main layout-->
<main>
<div class="container-fluid">
<!--Section: Modals-->
<section>
<!--Modal: modalConfirmDelete-->
<div class="modal fade" id="modalConfirmDelete" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-sm modal-notify modal-danger" role="document">
<!--Content-->
<div class="modal-content text-center">
<!--Header-->
<div class="modal-header d-flex justify-content-center">
<p class="heading">Are you sure?</p>
</div>
<!--Body-->
<div class="modal-body">
<i class="fa fa-times fa-4x animated rotateIn"></i>
</div>
<!--Footer-->
<div class="modal-footer flex-center">
<a href="https://mdbootstrap.com/product/material-design-for-bootstrap-pro/" class="btn btn-danger">Yes</a>
<a type="button" class="btn btn-outline-danger waves-effect" data-dismiss="modal">No</a>
</div>
</div>
<!--/.Content-->
</div>
</div>
<!--Modal: modalConfirmDelete-->
</section>
<!--Section: Modals-->
<!--Section: Main panel-->
<section class="card card-cascade narrower mb-5">
<!--Grid row-->
<div class="row">
<!-- MAIN PANEL BEGINS HERE -->
<?php
// if (!empty($systemMessage)) echo $systemMessage;
if (!empty($htmlMain)) {
echo $htmlMain;
}
?>
<!-- MAIN PANEL ENDS HERE -->
</div>
<!--Grid row-->
</section>
<!--Section: Main panel-->
<!--Section: Table-->
<section class="mb-5">
<!--Top Table UI-->
<div class="card p-2 mb-5">
<!--Grid row-->
<div class="row">
<!--Grid column-->
<div class="col-lg-3 col-md-12">
<!--Name-->
<select class="mdb-select colorful-select dropdown-primary mx-2">
<option value="" disabled selected>Bulk actions</option>
<option value="1">Delete</option>
<option value="2">Export</option>
<option value="3">Change segment</option>
</select>
</div>
<!--Grid column-->
<!--Grid column-->
<div class="col-lg-3 col-md-6">
<!--Blue select-->
<select class="mdb-select colorful-select dropdown-primary mx-2">
<option value="" disabled selected>Show only</option>
<option value="1">All
<span> (2000)</span>
</option>
<option value="2">Never opened
<span> (200)</span>
</option>
<option value="3">Opened but unanswered
<span> (1800)</span>
</option>
<option value="4">Answered
<span> (200)</span>
</option>
<option value="5">Unsunscribed
<span> (50)</span>
</option>
</select>
<!--/Blue select-->
</div>
<!--Grid column-->
<!--Grid column-->
<div class="col-lg-3 col-md-6">
<!--Blue select-->
<select class="mdb-select colorful-select dropdown-primary mx-2">
<option value="" disabled selected>Filter segments</option>
<option value="1">Contacts in no segments
<span> (100)</span>
</option>
<option value="1">Segment 1
<span> (2000)</span>
</option>
<option value="2">Segment 2
<span> (1000)</span>
</option>
<option value="3">Segment 3
<span> (4000)</span>
</option>
</select>
<!--/Blue select-->
</div>
<!--Grid column-->
<!--Grid column-->
<div class="col-lg-3 col-md-6">
<form class="md-form form-inline mt-2 ml-2">
<input class="form-control my-0" type="text" placeholder="Search" style="max-width: 150px;">
<button class="btn btn-sm btn-info ml-2 px-2">
<i class="fa fa-search"></i>
</button>
</form>
</div>
<!--Grid column-->
</div>
<!--Grid row-->
</div>
<!--Top Table UI-->
<!--Card-->
<div class="card card-cascade narrower">
<!--Card header-->
<div class="view view-cascade py-3 gradient-card-header info-color-dark mx-4 d-flex justify-content-between align-items-center">
<div>
<button type="button" class="btn btn-outline-white btn-rounded btn-sm px-2">
<i class="fa fa-th-large mt-0"></i>
</button>
<button type="button" class="btn btn-outline-white btn-rounded btn-sm px-2">
<i class="fa fa-columns mt-0"></i>
</button>
</div>
<a href="" class="white-text mx-3">Table name</a>
<div>
<button type="button" class="btn btn-outline-white btn-rounded btn-sm px-2">
<i class="fa fa-pencil mt-0"></i>
</button>
<button type="button" class="btn btn-outline-white btn-rounded btn-sm px-2" data-toggle="modal" data-target="#modalConfirmDelete">
<i class="fa fa-remove mt-0"></i>
</button>
<button type="button" class="btn btn-outline-white btn-rounded btn-sm px-2">
<i class="fa fa-info-circle mt-0"></i>
</button>
</div>
</div>
<!--/Card header-->
<!--Card content-->
<div class="card-body card-body-cascade">
<div class="table-responsive">
<table class="table">
<thead>
<tr>
<th>
<input class="form-check-input" type="checkbox" id="checkbox">
<label for="checkbox" class="label-table form-check-label"></label>
</th>
<th class="th-lg">First column</th>
<th class="th-lg">Second column</th>
<th class="th-lg">Third column</th>
<th class="th-lg">Fourth column</th>
<th class="th-lg">Fifth column</th>
<th class="th-lg">Sixth column</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">
<input class="form-check-input" type="checkbox" id="checkbox1">
<label for="checkbox1" class="label-table form-check-label"></label>
</th>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
</tr>
<tr>
<th scope="row">
<input class="form-check-input" type="checkbox" id="checkbox2">
<label for="checkbox2" class="label-table form-check-label"></label>
</th>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
</tr>
<tr>
<th scope="row">
<input class="form-check-input" type="checkbox" id="checkbox3">
<label for="checkbox3" class="label-table form-check-label"></label>
</th>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
<td>Lorem Ipsum</td>
</tr>
</tbody>
</table>
</div>
<hr class="my-0">
<!--Bottom Table UI-->
<div class="d-flex justify-content-between">
<!--Name-->
<select class="mdb-select colorful-select dropdown-primary mt-2 hidden-md-down">
<option value="" disabled>Rows number</option>
<option value="1" selected>10 rows</option>
<option value="2">25 rows</option>
<option value="3">50 rows</option>
<option value="4">100 rows</option>
</select>
<!--Pagination -->
<nav class="my-4">
<ul class="pagination pagination-circle pg-blue mb-0">
<!--First-->
<li class="page-item disabled">
<a class="page-link">First</a>
</li>
<!--Arrow left-->
<li class="page-item disabled">
<a class="page-link" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
<span class="sr-only">Previous</span>
</a>
</li>
<!--Numbers-->
<li class="page-item active">
<a class="page-link">1</a>
</li>
<li class="page-item">
<a class="page-link">2</a>
</li>
<li class="page-item">
<a class="page-link">3</a>
</li>
<li class="page-item">
<a class="page-link">4</a>
</li>
<li class="page-item">
<a class="page-link">5</a>
</li>
<!--Arrow right-->
<li class="page-item">
<a class="page-link" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
<span class="sr-only">Next</span>
</a>
</li>
<!--First-->
<li class="page-item">
<a class="page-link">Last</a>
</li>
</ul>
</nav>
<!--/Pagination -->
</div>
<!--Bottom Table UI-->
</div>
<!--/.Card content-->
</div>
<!--/.Card-->
</section>
<!--Section: Table-->
<!--Section: Accordion-->
<section class="mb-5">
<!--Accordion wrapper-->
<div class="accordion" id="accordionEx" role="tablist" aria-multiselectable="true">
<!-- Accordion card -->
<div class="card">
<!-- Card header -->
<div class="card-header" role="tab" id="headingOne">
<!--Options-->
<div class="dropdown pull-left">
<button class="btn btn-info btn-sm m-0 mr-3 p-2 dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
<i class="fa fa-pencil"></i>
</button>
<div class="dropdown-menu dropdown-info">
<a class="dropdown-item" href="#">Add new</a>
<a class="dropdown-item" href="#">Rename folder</a>
<a class="dropdown-item" href="#">Delete folder</a>
</div>
</div>
<!-- Heading -->
<a id="folder-1" data-toggle="collapse" data-parent="#accordionEx" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
<h5 class="mt-1 mb-0">
<span>Folder 1</span>
<i class="fa fa-angle-down rotate-icon"></i>
</h5>
</a>
</div>
<!-- Card body -->
<div id="collapseOne" class="collapse show" role="tabpanel" aria-labelledby="headingOne">
<div class="card-body">
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute,
non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch
3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda
shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt
sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer
farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus
labore sustainable VHS.
</div>
</div>
</div>
<!-- Accordion card -->
<!-- Accordion card -->
<div class="card">
<!-- Card header -->
<div class="card-header" role="tab" id="headingTwo">
<!--Options-->
<div class="dropdown pull-left">
<button class="btn btn-info btn-sm m-0 mr-3 p-2 dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
<i class="fa fa-pencil"></i>
</button>
<div class="dropdown-menu dropdown-info">
<a class="dropdown-item" href="#">Add new</a>
<a class="dropdown-item" href="#">Rename folder</a>
<a class="dropdown-item" href="#">Delete folder</a>
</div>
</div>
<!-- Heading -->
<a id="folder-2" data-toggle="collapse" data-parent="#accordionEx" href="#collapseTwo" aria-expanded="true" aria-controls="collapseTwo">
<h5 class="mt-1 mb-0">
<span>Folder 2</span>
<i class="fa fa-angle-down rotate-icon"></i>
</h5>
</a>
</div>
<!-- Card body -->
<div id="collapseTwo" class="collapse" role="tabpanel" aria-labelledby="headingTwo">
<div class="card-body">
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute,
non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch
3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda
shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt
sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer
farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus
labore sustainable VHS.
</div>
</div>
</div>
<!-- Accordion card -->
<!-- Accordion card -->
<div class="card">
<!-- Card header -->
<div class="card-header" role="tab" id="headingThree">
<!--Options-->
<div class="dropdown pull-left">
<button class="btn btn-info btn-sm m-0 mr-3 p-2 dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
<i class="fa fa-pencil"></i>
</button>
<div class="dropdown-menu dropdown-info">
<a class="dropdown-item" href="#">Add new</a>
<a class="dropdown-item" href="#">Rename folder</a>
<a class="dropdown-item" href="#">Delete folder</a>
</div>
</div>
<!-- Heading -->
<a id="folder-3" data-toggle="collapse" data-parent="#accordionEx" href="#collapseThree" aria-expanded="true" aria-controls="collapseThree">
<h5 class="mt-1 mb-0">
<span>Folder 3</span>
<i class="fa fa-angle-down rotate-icon"></i>
</h5>
</a>
</div>
<!-- Card body -->
<div id="collapseThree" class="collapse" role="tabpanel" aria-labelledby="headingThree">
<div class="card-body">
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute,
non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch
3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda
shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt
sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer
farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus
labore sustainable VHS.
</div>
</div>
</div>
<!-- Accordion card -->
</div>
<!--/.Accordion wrapper-->
</section>
<!--Section: Accordion-->
</div>
</main>
<!--Main layout-->
<!--Footer-->
<footer class="page-footer mt-4">
<!--Copyright-->
<div class="footer-copyright text-center py-3">
<div class="container-fluid">
© 2018 Copyright:
<a href="https://www.givvingassistant.org"> GivingAssistant.org </a>
</div>
</div>
<!--/.Copyright-->
</footer>
<!--/.Footer-->
<!-- SCRIPTS -->
<!-- JQuery -->
<script type="text/javascript" src="../html/js/jquery-3.3.1.min.js"></script>
<!-- Bootstrap tooltips -->
<script type="text/javascript" src="../html/js/popper.min.js"></script>
<!-- Bootstrap core JavaScript -->
<script type="text/javascript" src="../html/js/bootstrap.min.js"></script>
<!-- MDB core JavaScript -->
<script type="text/javascript" src="../html/js/mdb.min.js"></script>
<!-- gaAdmin JS Processing Script -->
<script type="text/javascript" src="admin/gaAdmin.js"></script>
<!-- Initializations -->
<script>
// SideNav Initialization
$(".button-collapse").sideNav();
// Material Select Initialization
$(document).ready(function () {
$('.mdb-select').material_select();
});
// Data Picker Initialization
$('.datepicker').pickadate();
// Tooltip Initialization
$(function () {
$('[data-toggle="tooltip"]').tooltip()
});
</script>
<!-- Charts -->
<script>
// Minimalist chart
$(function () {
$('.min-chart#chart-sales').easyPieChart({
barColor: "#4caf50",
onStep: function (from, to, percent) {
$(this.el).find('.percent').text(Math.round(percent));
}
});
});
// Main chart
// var ctxL = document.getElementById("lineChart").getContext('2d');
// var myLineChart = new Chart(ctxL, {
// type: 'line',
// data: {
// labels: ["January", "February", "March", "April", "May", "June", "July"],
// datasets: [{
// label: "My First dataset",
// fillColor: "#fff",
// backgroundColor: 'rgba(255, 255, 255, .3)',
// borderColor: 'rgba(255, 255, 255)',
// data: [0, 10, 5, 2, 20, 30, 45],
// }]
// },
// options: {
// legend: {
// labels: {
// fontColor: "#fff",
// }
// },
// scales: {
// xAxes: [{
// gridLines: {
// display: true,
// color: "rgba(255,255,255,.25)"
// },
// ticks: {
// fontColor: "#fff",
// },
// }],
// yAxes: [{
// display: true,
// gridLines: {
// display: true,
// color: "rgba(255,255,255,.25)"
// },
// ticks: {
// fontColor: "#fff",
// },
// }],
// }
// }
// });
</script>
<!-- Alerts -->
<script>
$(function () {
$('#folder-1').click(function () {
toastr.error("Folder 1 has been clicked!", "Folder 1", {
"positionClass": "toast-top-right",
});
});
$('#folder-2').click(function () {
// make it not disappear
toastr.info("Folder 2 has been clicked!", "Folder 2", );
});
$('#folder-3').click(function () {
// make it not disappear
toastr.info("Folder 3 has been clicked!", "Folder 3", );
});
});
</script>
</body>
</html>