Bootstrap 5 updates continued

This commit is contained in:
Joey Kimsey
2024-12-14 06:15:47 -05:00
parent 41426fda4e
commit de6d608857
44 changed files with 439 additions and 389 deletions

View File

@ -0,0 +1,58 @@
<?php
/**
* app/plugins/contact/controllers/admin/contact.php
*
* This is the contact admin controller.
*
* @package TP Contact
* @version 3.0
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Controllers\Admin;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\Houdini\Classes\Issues;
use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\Houdini\Classes\Navigation;
use TheTempusProject\Houdini\Classes\Components;
use TheTempusProject\Classes\AdminController;
use TheTempusProject\Models\Contact as ContactModel;
class Contact extends AdminController {
protected static $contact;
public function __construct() {
parent::__construct();
self::$title = 'Admin - Contact';
self::$contact = new ContactModel;
$view = Navigation::activePageSelect( 'nav.admin', '/admin/contact' );
Components::set( 'ADMINNAV', $view );
}
public function view( $id = null ) {
Views::view( 'contact.admin.view', self::$contact->findById( $id ) );
}
public function delete( $data = null ) {
if ( Input::exists( 'submit' ) ) {
$data = Input::post( 'F_' );
}
if ( self::$contact->delete( (array) $data ) ) {
Issues::add( 'success', 'contact deleted' );
} else {
Issues::add( 'error', 'There was an error with your request.' );
}
$this->index();
}
public function clear( $data = null ) {
self::$contact->clear();
$this->index();
}
public function index( $data = null ) {
Views::view( 'contact.admin.list', self::$contact->listPaginated() );
}
}

View File

@ -0,0 +1,47 @@
<?php
/**
* app/plugins/contact/controllers/contact.php
*
* This is the home controller for the contact plugin.
*
* @package TP Contact
* @version 3.0
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Controllers;
use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\Houdini\Classes\Issues;
use TheTempusProject\Classes\Controller;
use TheTempusProject\Classes\Forms;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\Bedrock\Functions\Session;
use TheTempusProject\Hermes\Functions\Redirect;
use TheTempusProject\Models\Contact as ContactModel;
class Contact extends Controller {
protected static $contact;
public function index() {
self::$contact = new ContactModel;
self::$title = 'Contact - {SITENAME}';
self::$pageDescription = 'At {SITENAME}, we value our users\' input. You can provide any contact or suggestions using this form.';
if ( !Input::exists() ) {
return Views::view( 'contact.create' );
}
if ( !Forms::check( 'contact' ) ) {
Issues::add( 'error', [ 'There was an error with your form, please check your submission and try again.' => Check::userErrors() ] );
return Views::view( 'contact.create' );
}
$result = self::$contact->create( Input::post( 'name' ), Input::post( 'contactEmail' ), Input::post( 'entry' ) );
if ( $result ) {
Session::flash( 'success', 'Thank you! Your contact has been received.' );
Redirect::to( 'home/index' );
} else {
Issues::add( 'error', [ 'There was an error with your form, please check your submission and try again.' => Check::userErrors() ] );
}
}
}

View File

@ -0,0 +1,56 @@
<?php
/**
* app/plugins/contact/forms.php
*
* This houses all of the form checking functions for this plugin.
*
* @package TP Contact
* @version 3.0
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Plugins\Contact;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Classes\Forms;
class ContactForms extends Forms {
/**
* Adds these functions to the form list.
*/
public function __construct() {
self::addHandler( 'contact', __CLASS__, 'contact' );
}
/**
* Validates the contact form.
*
* @return {bool}
*/
public static function contact() {
if ( !Input::exists( 'name' ) ) {
Check::addUserError( 'You must provide a name.' );
return false;
}
if ( !Check::name( Input::post( 'name' ) ) ) {
Check::addUserError( 'Invalid name.' );
return false;
}
if ( !empty( Input::post( 'contactEmail' ) ) && !Check::email( Input::post( 'contactEmail' ) ) ) {
Check::addUserError( 'Invalid Email.' );
return false;
}
if ( Input::post( 'entry' ) == '' ) {
Check::addUserError( 'Contact cannot be empty.' );
return false;
}
if ( !Check::token() ) {
return false;
}
return true;
}
}
new ContactForms;

View File

@ -0,0 +1,83 @@
<?php
/**
* app/plugins/contact/models/contact.php
*
* This class is used for the manipulation of the feedback database table.
*
* @todo make this send a confirmation email
*
* @package TP Contact
* @version 3.0
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Models;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Canary\Bin\Canary as Debug;
use TheTempusProject\Classes\DatabaseModel;
use TheTempusProject\Plugins\Contact as Plugin;
class Contact extends DatabaseModel {
public $tableName = 'feedback';
public $databaseMatrix = [
[ 'name', 'varchar', '128' ],
[ 'time', 'int', '10' ],
[ 'email', 'varchar', '128' ],
[ 'ip', 'varchar', '64' ],
[ 'feedback', 'text', '' ],
];
public $plugin;
/**
* The model constructor.
*/
public function __construct() {
parent::__construct();
$this->plugin = new Plugin;
}
/**
* Saves a contact form to the db.
*
* @param string $name -the name on the form
* @param string $email -the email provided
* @param string $feedback -contents of the feedback form.
* @return bool
*/
public function create( $name, $email, $feedback ) {
if ( !$this->plugin->checkEnabled() ) {
Debug::info( 'Contact is disabled in the config.' );
return false;
}
$fields = [
'name' => $name,
'email' => $email,
'feedback' => $feedback,
'time' => time(),
'ip' => $_SERVER['REMOTE_ADDR'],
];
if ( !self::$db->insert( $this->tableName, $fields ) ) {
Debug::info( 'Contact::create - failed to insert to db' );
return false;
}
return self::$db->lastId();
}
/**
* Function to clear contact from the DB.
*
* @todo is there a way i could check for success here I'm pretty sure this is just a bad idea?
* @return bool
*/
public function clear() {
if ( empty( self::$log ) ) {
self::$log = new Log;
}
self::$db->delete( $this->tableName, ['ID', '>=', '0'] );
self::$log->admin( 'Contacts Cleared' );
Debug::info( 'Contacts Cleared' );
return true;
}
}

View File

@ -0,0 +1,60 @@
<?php
/**
* app/plugins/contact/plugin.php
*
* This houses all of the main plugin info and functionality.
*
* @package TP Contact
* @version 3.0
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Plugins;
use TheTempusProject\Classes\Plugin;
class Contact extends Plugin {
public $pluginName = 'TP Contact';
public $pluginAuthor = 'JoeyK';
public $pluginWebsite = 'https://TheTempusProject.com';
public $modelVersion = '1.0';
public $pluginVersion = '3.0';
public $pluginDescription = 'A simple plugin which adds a form and management for user submitted contact forms.';
public $configName = 'contact';
public $configMatrix = [
'enabled' => [
'type' => 'radio',
'pretty' => 'Enable User Contact.',
'default' => true,
],
'sendEmail' => [
'type' => 'radio',
'pretty' => 'Email the user after submitting.',
'default' => false,
],
'emailTemplate' => [
'type' => 'text',
'pretty' => 'Email Template',
'default' => 'contactEmail',
],
];
public $permissionMatrix = [
'contact' => [
'pretty' => 'Can Submit Contact',
'default' => true,
],
];
public $contact_footer_links = [
[
'text' => 'Contact',
'url' => '{ROOT_URL}contact',
],
];
public $admin_links = [
[
'text' => '<i class="fa fa-fw fa-support"></i> Contact',
'url' => '{ROOT_URL}admin/contact',
],
];
}

View File

@ -0,0 +1,42 @@
<legend>Contact Forms</legend>
{PAGINATION}
<form action="{ROOT_URL}admin/contact/delete" method="post">
<table class="table table-striped">
<thead>
<tr>
<th style="width: 5%">ID</th>
<th style="width: 25%">Time</th>
<th style="width: 55%">Feedback</th>
<th style="width: 5%"></th>
<th style="width: 5%"></th>
<th style="width: 5%">
<INPUT type="checkbox" onchange="checkAll(this)" name="check.f" value="F_[]"/>
</th>
</tr>
</thead>
<tbody>
{LOOP}
<tr>
<td>{ID}</td>
<td>{DTC}{time}{/DTC}</td>
<td>{feedback}</td>
<td><a href="{ROOT_URL}admin/contact/view/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-upload"></i></a></td>
<td><a href="{ROOT_URL}admin/contact/delete/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a></td>
<td>
<input type="checkbox" value="{ID}" name="F_[]">
</td>
</tr>
{/LOOP}
{ALT}
<tr>
<td align="center" colspan="6">
No results to show.
</td>
</tr>
{/ALT}
</tbody>
</table>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger">Delete</button>
</form>
<br />
<a href="{ROOT_URL}admin/contact/clear">clear all</a>

View File

@ -0,0 +1,56 @@
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-6 col-lg-6 col-sm-offset-0 col-md-offset-3 col-lg-offset-3 top-pad" >
<div class="card">
<div class="card-header bg-dark">
<h3 class="card-title">Contact</h3>
</div>
<div class="card-body">
<div class="row">
<div class=" col-md-12 col-lg-12 ">
<table class="table table-user-primary">
<tbody>
<tr>
<td align="left" width="200">ID:</td>
<td align="right">{ID}</td>
</tr>
<tr>
<td>Time submitted:</td>
<td align="right">{DTC}{time}{/DTC}</td>
</tr>
<tr>
<td>IP:</td>
<td align="right">{ip}</td>
</tr>
<tr>
<td>Email:</td>
<td align="right">{email}</td>
</tr>
<tr>
<td>Name</td>
<td align="right">{name}</td>
</tr>
<tr>
<td align="center" colspan="2">Feedback</td>
</tr>
<tr>
<td colspan="2">{feedback}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="card-footer">
{ADMIN}
<form action="{ROOT_URL}admin/contact/delete" method="post">
<INPUT type="hidden" name="F_" value="{ID}"/>
<input type="hidden" name="token" value="{TOKEN}" />
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-times"></i></button>
</form>
{/ADMIN}
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,45 @@
<div class="context-main-bg container py-4 my-4">
<h2 class="text-center mb-4">Contact Us</h2>
<div class="col-lg-6 offset-md-3">
<p>
Here at <strong>{SITENAME}</strong>, we highly value your feedback. We constantly strive to provide our users with the highest level of quality in everything we do.
</p>
<p>
If you would like to provide any suggestions or comments on our service, we ask that you please fill out the quick form below and let us know what's on your mind.
</p>
</div>
<form action="" method="post">
<!-- Name -->
<div class="mb-3 row">
<label for="name" class="col-lg-3 col-form-label text-end">Name:</label>
<div class="col-lg-6">
<input type="text" class="form-control" name="name" id="name" required>
</div>
</div>
<!-- Email (Optional) -->
<div class="mb-3 row">
<label for="contactEmail" class="col-lg-3 col-form-label text-end">E-mail: (optional)</label>
<div class="col-lg-6">
<input type="email" class="form-control" name="contactEmail" id="contactEmail">
</div>
</div>
<!-- Feedback -->
<div class="mb-3 row">
<label for="entry" class="col-lg-3 col-form-label text-end">Feedback:</label>
<div class="col-lg-6">
<textarea class="form-control" name="entry" id="entry" rows="6" maxlength="2000" required></textarea>
<small class="form-text text-muted">Max: 2000 characters</small>
</div>
</div>
<!-- Hidden Token -->
<input type="hidden" name="token" value="{TOKEN}">
<!-- Submit Button -->
<div class="text-center">
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Submit</button>
</div>
</form>
</div>

View File

@ -0,0 +1,27 @@
<form action="" method="post" class="form-horizontal">
<legend>Feedback</legend>
<p>Here at {SITENAME} we highly value your feedback. We constantly strive to provide our users with the highest level of quality in everything we do.</p>
<p>If you would like to provide any suggestions or comments on our service, we ask that you please fill out the quick form below and let us know what's on your mind.</p>
<fieldset>
<div class="form-group">
<label for="name" class="col-lg-1 control-label">Name:</label>
<div class="col-lg-2">
<input class="form-control" type="text" name="name" id="name">
</div>
</div>
<div class="form-group">
<label for="feedbackEmail" class="col-lg-1 control-label">E-mail: (optional)</label>
<div class="col-lg-2">
<input class="form-control" type="text" name="feedbackEmail" id="feedbackEmail">
</div>
</div>
<div class="form-group">
<label for="entry" class="col-lg-3 control-label">Feedback:<br> (max:2000 characters)</label>
<div class="col-lg-6">
<textarea class="form-control" name="entry" maxlength="2000" rows="10" cols="50" id="entry"></textarea>
</div>
</div>
</fieldset>
<input type="hidden" name="token" value="{TOKEN}">
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block">Submit</button><br>
</form>