This commit is contained in:
Joey Kimsey
2024-12-02 17:43:55 -05:00
parent 113499254b
commit de5530b1e3
95 changed files with 3192 additions and 509 deletions

View File

@ -0,0 +1,103 @@
<?php
/**
* app/plugins/portfolio/controllers/admin/portfolio.php
*
* This is the Portfolio admin controller.
*
* @package TP Portfolio
* @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\Check;
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\Classes\Forms;
use TheTempusProject\Models\Links;
class Portfolio extends AdminController {
public static $links;
public function __construct() {
parent::__construct();
self::$links = new Links;
self::$title = 'Admin - Portfolio';
$view = Navigation::activePageSelect( 'nav.admin', '/admin/portfolio' );
Components::set( 'ADMINNAV', $view );
}
public function index( $data = null ) {
Views::view( 'portfolio.admin.list', self::$links->listPaginated() );
}
public function create( $data = null ) {
if ( !Input::exists( 'submit' ) ) {
return Views::view( 'portfolio.admin.create' );
}
if ( !Forms::check( 'newLink' ) ) {
Issues::add( 'error', [ 'There was an error with your request.' => Check::userErrors() ] );
return $this->index();
}
$result = self::$links->create( Input::post( 'section' ), Input::post( 'title' ), Input::post( 'image' ), Input::post( 'url' ), Input::post( 'description' ) );
if ( $result ) {
Issues::add( 'success', 'Your link has been created.' );
return $this->index();
} else {
Issues::add( 'error', [ 'There was an unknown error submitting your data.' => Check::userErrors() ] );
return $this->index();
}
}
public function edit( $data = null ) {
if ( !Input::exists( 'submit' ) ) {
return Views::view( 'portfolio.admin.edit', self::$links->findById( $data ) );
}
if ( !Forms::check( 'editLink' ) ) {
Issues::add( 'error', [ 'There was an error with your form.' => Check::userErrors() ] );
return $this->index();
}
$fields = [
'section' => Input::post( 'section' ),
'title' => Input::post( 'title' ),
'image' => Input::post( 'image' ),
'url' => Input::post( 'url' ),
'description' => Input::post( 'description' ),
];
if ( self::$links->update( $data, $fields ) ) {
Issues::add( 'success', 'Link Updated.' );
return $this->index();
}
Issues::add( 'error', 'There was an error with your request.' );
$this->index();
}
public function view( $data = null ) {
$linkData = self::$links->findById( $data );
if ( $linkData !== false ) {
return Views::view( 'portfolio.admin.view', $linkData );
}
Issues::add( 'error', 'Link not found.' );
$this->index();
}
public function delete( $data = null ) {
if ( $data == null ) {
if ( Input::exists( 'P_' ) ) {
$data = Input::post( 'P_' );
}
}
if ( !self::$links->delete( (array) $data ) ) {
Issues::add( 'error', 'There was an error with your request.' );
} else {
Issues::add( 'success', 'Link has been deleted' );
}
$this->index();
}
}

View File

@ -0,0 +1,36 @@
<?php
/**
* app/plugins/portfolio/controllers/portfolio.php
*
* This is the bug reports controller.
*
* @package TP Portfolio
* @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\Issues;
use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\Classes\Controller;
use TheTempusProject\Models\Links;
class Portfolio extends Controller {
protected static $links;
public function index() {
self::$links = new Links;
self::$title = '{SITENAME} - Portfolio';
self::$pageDescription = 'Its not the longest portfolio in the world, but I\'m certainly proud of it.';
$links = self::$links->listPaginated();
if ( false == $links ) {
Issues::add( 'error', 'Well, this is embarrassing, surely he wouldn\'t just have no portfolio..... right.... Dave? ... erm Joey?' );
return;
} else {
Views::view( 'portfolio.portfolio', self::$links->listPaginated() );
}
}
}

View File

@ -0,0 +1,79 @@
<?php
/**
* app/plugins/portfolio/forms.php
*
* This houses all of the form checking functions for this plugin.
*
* @package TP Portfolio
* @version 3.0
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Plugins\Portfolio;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Classes\Forms;
class PortfolioForms extends Forms {
/**
* Adds these functions to the form list.
*/
public function __construct() {
self::addHandler( 'newLink', __CLASS__, 'newLink' );
self::addHandler( 'editLink', __CLASS__, 'editLink' );
}
/**
* Validates the new position post form.
*
* @return {bool}
*/
public static function newLink() {
if ( !Input::exists( 'section' ) ) {
self::addUserError( 'You must specify section' );
return false;
}
if ( !Input::exists( 'title' ) ) {
self::addUserError( 'You must specify title' );
return false;
}
if ( !Input::exists( 'url' ) ) {
self::addUserError( 'You must specify url' );
return false;
}
if ( !Input::exists( 'description' ) ) {
self::addUserError( 'You must specify description' );
return false;
}
return true;
}
/**
* Validates the edit position post form.
*
* @return {bool}
*/
public static function editLink() {
if ( !Input::exists( 'section' ) ) {
self::addUserError( 'You must specify section' );
return false;
}
if ( !Input::exists( 'title' ) ) {
self::addUserError( 'You must specify title' );
return false;
}
if ( !Input::exists( 'url' ) ) {
self::addUserError( 'You must specify url' );
return false;
}
if ( !Input::exists( 'description' ) ) {
self::addUserError( 'You must specify description' );
return false;
}
return true;
}
}
new PortfolioForms;

View File

@ -0,0 +1,71 @@
<?php
/**
* app/plugins/portfolio/models/links.php
*
* This class is used for the manipulation of the links database table.
*
* @package TP Portfolio
* @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\Classes\Config;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Canary\Bin\Canary as Debug;
use TheTempusProject\Classes\DatabaseModel;
use TheTempusProject\Plugins\Portfolio as Plugin;
class Links extends DatabaseModel {
public $tableName = 'portfolio_links';
public $databaseMatrix = [
[ 'section', 'varchar', '32' ],
[ 'title', 'varchar', '128' ],
[ 'image', 'varchar', '256' ],
[ 'url', 'varchar', '256' ],
[ 'description', 'text', '' ],
];
public $plugin;
/**
* The model constructor.
*/
public function __construct() {
parent::__construct();
$this->plugin = new Plugin;
}
public function create( $section, $title, $image, $url, $description ) {
if ( !$this->plugin->checkEnabled() ) {
Debug::info( 'Portfolio is disabled in the config.' );
return false;
}
$fields = [
'section' => $section,
'title' => $title,
'image' => $image,
'url' => $url,
'description' => $description,
];
if ( !self::$db->insert( $this->tableName, $fields ) ) {
Debug::info( 'Links::create - failed to insert to db' );
return false;
}
return self::$db->lastId();
}
public function update( $id, $fields ) {
if ( !Check::id( $id ) ) {
Debug::info( 'modelBlog: illegal ID.' );
return false;
}
if ( !self::$db->update( $this->tableName, $id, $fields ) ) {
// new CustomException( 'linkUpdate' );
Debug::error( "Links:update: $id not updated: $fields" );
return false;
}
return true;
}
}

View File

@ -0,0 +1,44 @@
<?php
/**
* app/plugins/portfolio/plugin.php
*
* This houses all of the main plugin info and functionality.
*
* @package TP Portfolio
* @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 Portfolio extends Plugin {
public $pluginName = 'TP Portfolio';
public $pluginAuthor = 'JoeyK';
public $pluginWebsite = 'https://TheTempusProject.com';
public $modelVersion = '1.0';
public $pluginVersion = '3.0';
public $pluginDescription = 'A simple plugin which adds management for a portfolio.';
public $configName = 'portfolio';
public $configMatrix = [
'enabled' => [
'type' => 'radio',
'pretty' => 'Enable the portfolio Feature.',
'default' => true,
],
];
public $main_links = [
[
'text' => 'Portfolio',
'url' => '{ROOT_URL}portfolio/index',
],
];
public $admin_links = [
[
'text' => '<i class="fa fa-fw fa-support"></i> Portfolio',
'url' => '{ROOT_URL}admin/portfolio',
],
];
}

View File

@ -0,0 +1,19 @@
<h2>Add Portfolio Link</h2>
<form action="#" method="POST">
<label for="section">Section Name:</label><br>
<input type="text" id="section" name="section" required><br><br>
<label for="title">Title:</label><br>
<input type="text" id="title" name="title" required><br><br>
<label for="image">Image:</label><br>
<input type="text" id="image" name="image" required><br><br>
<label for="url">URL:</label><br>
<input type="text" id="url" name="url" required><br><br>
<label for="description">Description:</label><br>
<textarea id="description" name="description" rows="20" cols="50" required></textarea><br><br>
<input type="submit" name="submit" value="Submit">
</form>

View File

@ -0,0 +1,19 @@
<h2>Edit Portfolio Link</h2>
<form action="#" method="POST">
<label for="section">Section Name:</label><br>
<input type="text" id="section" name="section" value="{section}" required><br><br>
<label for="title">Title:</label><br>
<input type="text" id="title" name="title" value="{title}" required><br><br>
<label for="image">Image:</label><br>
<input type="text" id="image" name="image" value="{image}" required><br><br>
<label for="url">URL:</label><br>
<input type="text" id="url" name="url" value="{url}" required><br><br>
<label for="description">Description</label><br>
<textarea id="description" name="description" rows="20" cols="50" required>{description}</textarea><br><br>
<input type="submit" name="submit" value="Submit">
</form>

View File

@ -0,0 +1,41 @@
<legend>Portfolio Links</legend>
{PAGINATION}
<form action="{ROOT_URL}admin/portfolio/delete" method="post">
<table class="table table-striped">
<thead>
<tr>
<th style="width: 30%">title</th>
<th style="width: 30%">section</th>
<th style="width: 25%">url</th>
<th style="width: 5%"></th>
<th style="width: 5%"></th>
<th style="width: 5%">
<INPUT type="checkbox" onchange="checkAll(this)" name="check.b" value="B_[]"/>
</th>
</tr>
</thead>
<tbody>
{LOOP}
<tr>
<td><a href="{ROOT_URL}admin/portfolio/view/{ID}">{title}</a></td>
<td>{section}</td>
<td>{url}</td>
<td><a href="{ROOT_URL}admin/portfolio/edit/{ID}" class="btn btn-sm btn-warning" role="button"><i class="glyphicon glyphicon-edit"></i></a></td>
<td><a href="{ROOT_URL}admin/portfolio/delete/{ID}" class="btn btn-sm btn-danger" role="button"><i class="glyphicon glyphicon-trash"></i></a></td>
<td>
<input type="checkbox" value="{ID}" name="P_[]">
</td>
</tr>
{/LOOP}
{ALT}
<tr>
<td colspan="7">
No results to show.
</td>
</tr>
{/ALT}
</tbody>
</table>
<a href="{ROOT_URL}admin/portfolio/create" class="btn btn-sm btn-primary" role="button">Create</a>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger">Delete</button>
</form>

View File

@ -0,0 +1,16 @@
<legend>Portfolio Link</legend>
<hr>
<div class="media portfolio-link">
<div class="media-left">
<a href="#">
<img class="media-object" src="{image}" alt="{title} preview">
</a>
</div>
<div class="media-body">
<h4 class="media-heading"><a href="{url}">{title}</a></h4>
{description}
</div>
</div>

View File

@ -0,0 +1,20 @@
<h1>Portfolio</h1>
<hr>
{LOOP}
<div class="media portfolio-link col-md-8 col-md-offset-2">
<div class="media-left">
<a href="#">
<img class="media-object" src="{image}" alt="{title} preview">
</a>
</div>
<div class="media-body">
<h4 class="media-heading"><a href="{url}">{title}</a></h4>
{description}
</div>
</div>
{/LOOP}
{ALT}
<div class="portfolio-link">
<p>None Found</p>
</div>
{/ALT}

View File

@ -0,0 +1,103 @@
<?php
/**
* app/plugins/resume/controllers/admin/resume.php
*
* This is the Resume admin controller.
*
* @package TP Resume
* @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\Check;
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\Classes\Forms;
use TheTempusProject\Models\Positions;
class Resume extends AdminController {
public static $positions;
public function __construct() {
parent::__construct();
self::$positions = new Positions;
self::$title = 'Admin - Resume';
$view = Navigation::activePageSelect( 'nav.admin', '/admin/resume' );
Components::set( 'ADMINNAV', $view );
}
public function index( $data = null ) {
Views::view( 'resume.admin.list', self::$positions->listPaginated() );
}
public function create( $data = null ) {
if ( !Input::exists( 'submit' ) ) {
return Views::view( 'resume.admin.create' );
}
if ( !Forms::check( 'newPosition' ) ) {
Issues::add( 'error', [ 'There was an error with your request.' => Check::userErrors() ] );
return $this->index();
}
$result = self::$positions->create( Input::post( 'name' ), Input::post( 'position' ), Input::post( 'start' ), Input::post( 'end' ), Input::post( 'details' ) );
if ( $result ) {
Issues::add( 'success', 'Your position has been created.' );
return $this->index();
} else {
Issues::add( 'error', [ 'There was an unknown error submitting your data.' => Check::userErrors() ] );
return $this->index();
}
}
public function edit( $data = null ) {
if ( !Input::exists( 'submit' ) ) {
return Views::view( 'resume.admin.edit', self::$positions->findById( $data ) );
}
if ( !Forms::check( 'editPosition' ) ) {
Issues::add( 'error', [ 'There was an error with your form.' => Check::userErrors() ] );
return $this->index();
}
$fields = [
'name' => Input::post( 'name' ),
'position' => Input::post( 'position' ),
'start' => Input::post( 'start' ),
'end' => Input::post( 'end' ),
'details' => Input::post( 'details' ),
];
if ( self::$positions->update( $data, $fields ) ) {
Issues::add( 'success', 'Position Updated.' );
return $this->index();
}
Issues::add( 'error', 'There was an error with your request.' );
$this->index();
}
public function view( $data = null ) {
$positionData = self::$positions->findById( $data );
if ( $positionData !== false ) {
return Views::view( 'resume.admin.view', $positionData );
}
Issues::add( 'error', 'Position not found.' );
$this->index();
}
public function delete( $data = null ) {
if ( $data == null ) {
if ( Input::exists( 'P_' ) ) {
$data = Input::post( 'P_' );
}
}
if ( !self::$positions->delete( (array) $data ) ) {
Issues::add( 'error', 'There was an error with your request.' );
} else {
Issues::add( 'success', 'Position has been deleted' );
}
$this->index();
}
}

View File

@ -0,0 +1,58 @@
<?php
/**
* app/plugins/resume/controllers/resume.php
*
* This is the bug reports controller.
*
* @package TP Resume
* @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\Issues;
use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\Classes\Controller;
use TheTempusProject\Models\Positions;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\Houdini\Classes\Components;
use TheTempusProject\Houdini\Classes\Template;
class Resume extends Controller {
protected static $positions;
public function index() {
self::$positions = new Positions;
self::$title = '{SITENAME} - Resume';
self::$pageDescription = 'Its not the longest resume in the world, but I\'m certainly proud of it.';
$positions = self::$positions->listPaginated();
if ( false == $positions ) {
Issues::add( 'error', 'Well, this is embarrassing, surely he wouldn\'t just have no resume..... right.... Dave? ... erm Joey?' );
return;
} else {
Components::set( 'RESUME_NAV', Views::simpleView( 'resume.nav') );
Components::set( 'RESUME_DOWNLOADS', Views::simpleView( 'resume.download') );
if ( !Input::exists( 'view' ) ) {
return Views::view( 'resume.resume', $positions );
} else {
Components::append( 'TEMPLATE_CSS_INCLUDES', Template::parse('<link rel="stylesheet" href="{ROOT_URL}app/plugins/resume/css/timeline.css" />') );
$side = 'left';
foreach ($positions as $key => $position) {
$position->side = $side; // Add the new entry for side
$side = ($side === 'left') ? 'right' : 'left'; // Alternate between left and right
}
return Views::view( 'resume.timeline', $positions );
}
}
}
public function test() {
self::$positions = new Positions;
self::$title = '{SITENAME} - Resume';
self::$pageDescription = 'Its not the longest resume in the world, but I\'m certainly proud of it.';
return Views::view( 'resume.test' );
}
}

View File

@ -0,0 +1,132 @@
* {
box-sizing: border-box;
}
body {
/* background-color: #474e5d;
font-family: Helvetica, sans-serif; */
}
/* The actual timeline (the vertical ruler) */
.resume-timeline {
position: relative;
max-width: 1200px;
margin: 0 auto;
}
/* The actual timeline (the vertical ruler) */
.resume-timeline::after {
content: '';
position: absolute;
width: 6px;
background-color: #B5B5B5;
top: 0;
bottom: 0;
left: 50%;
margin-left: -3px;
}
/* Container around content */
.timeline-container {
padding: 10px 40px;
position: relative;
background-color: inherit;
width: 50%;
}
/* The circles on the timeline */
.timeline-container::after {
content: '';
position: absolute;
width: 25px;
height: 25px;
right: -13px;
background-color: #337ab7;
border: 4px solid #FF9F55;
top: 15px;
border-radius: 50%;
z-index: 1;
}
/* Place the container to the left */
.left {
left: 0;
}
/* Place the container to the right */
.right {
left: 50%;
}
/* Add arrows to the left container (pointing right) */
.left::before {
content: " ";
height: 0;
position: absolute;
top: 22px;
width: 0;
z-index: 1;
right: 30px;
border: medium solid white;
border-width: 10px 0 10px 10px;
border-color: transparent transparent transparent white;
}
/* Add arrows to the right container (pointing left) */
.right::before {
content: " ";
height: 0;
position: absolute;
top: 22px;
width: 0;
z-index: 1;
left: 30px;
border: medium solid white;
border-width: 10px 10px 10px 0;
border-color: transparent white transparent transparent;
}
/* Fix the circle for containers on the right side */
.right::after {
left: -11px;
}
/* The actual content */
.timeline-content {
padding: 20px 30px;
background-color: white;
position: relative;
border-radius: 6px;
}
/* Media queries - Responsive timeline on screens less than 600px wide */
@media screen and (max-width: 600px) {
/* Place the timelime to the left */
.resume-timeline::after {
left: 31px;
}
/* Full-width containers */
.timeline-container {
width: 100%;
padding-left: 70px;
padding-right: 25px;
}
/* Make sure that all arrows are pointing leftwards */
.timeline-container::before {
left: 60px;
border: medium solid white;
border-width: 10px 10px 10px 0;
border-color: transparent white transparent transparent;
}
/* Make sure all circles are at the same spot */
.left::after, .right::after {
left: 15px;
}
/* Make all right containers behave like the left ones */
.right {
left: 0%;
}
}

View File

@ -0,0 +1,87 @@
<?php
/**
* app/plugins/resume/forms.php
*
* This houses all of the form checking functions for this plugin.
*
* @package TP Resume
* @version 3.0
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Plugins\Resume;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Classes\Forms;
class ResumeForms extends Forms {
/**
* Adds these functions to the form list.
*/
public function __construct() {
self::addHandler( 'newPosition', __CLASS__, 'newPosition' );
self::addHandler( 'editPosition', __CLASS__, 'editPosition' );
}
/**
* Validates the new position post form.
*
* @return {bool}
*/
public static function newPosition() {
if ( !Input::exists( 'name' ) ) {
self::addUserError( 'You must specify name' );
return false;
}
if ( !Input::exists( 'position' ) ) {
self::addUserError( 'You must specify position' );
return false;
}
if ( !Input::exists( 'start' ) ) {
self::addUserError( 'You must specify start' );
return false;
}
if ( !Input::exists( 'end' ) ) {
self::addUserError( 'You must specify end' );
return false;
}
if ( !Input::exists( 'details' ) ) {
self::addUserError( 'You must specify details' );
return false;
}
return true;
}
/**
* Validates the edit position post form.
*
* @return {bool}
*/
public static function editPosition() {
if ( !Input::exists( 'name' ) ) {
self::addUserError( 'You must specify name' );
return false;
}
if ( !Input::exists( 'position' ) ) {
self::addUserError( 'You must specify position' );
return false;
}
if ( !Input::exists( 'start' ) ) {
self::addUserError( 'You must specify start' );
return false;
}
if ( !Input::exists( 'end' ) ) {
self::addUserError( 'You must specify end' );
return false;
}
if ( !Input::exists( 'details' ) ) {
self::addUserError( 'You must specify details' );
return false;
}
return true;
}
}
new ResumeForms;

View File

@ -0,0 +1,88 @@
<?php
/**
* app/plugins/resume/models/positions.php
*
* This class is used for the manipulation of the positions database table.
*
* @package TP Resume
* @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\Classes\Config;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Canary\Bin\Canary as Debug;
use TheTempusProject\Classes\DatabaseModel;
use TheTempusProject\Plugins\Resume as Plugin;
class Positions extends DatabaseModel {
public $tableName = 'positions';
public $databaseMatrix = [
[ 'name', 'varchar', '128' ],
[ 'position', 'varchar', '128' ],
[ 'start', 'varchar', '16' ],
[ 'end', 'varchar', '16' ],
[ 'details', 'text', '' ],
];
public $plugin;
/**
* The model constructor.
*/
public function __construct() {
parent::__construct();
$this->plugin = new Plugin;
}
public function create( $name, $position, $start, $end, $details ) {
if ( !$this->plugin->checkEnabled() ) {
Debug::info( 'Resume is disabled in the config.' );
return false;
}
$fields = [
'name' => $name,
'position' => $position,
'start' => $start,
'end' => $end,
'details' => $details,
];
if ( !self::$db->insert( $this->tableName, $fields ) ) {
Debug::info( 'Position::create - failed to insert to db' );
return false;
}
return self::$db->lastId();
}
public function filter( $postArray, $params = [] ) {
foreach ( $postArray as $instance ) {
if ( !is_object( $instance ) ) {
$instance = $postArray;
$end = true;
}
$instance->prettyStart = $instance->start;
$instance->prettyEnd = $instance->end;
$out[] = $instance;
if ( !empty( $end ) ) {
$out = $out[0];
break;
}
}
return $out;
}
public function update( $id, $fields ) {
if ( !Check::id( $id ) ) {
Debug::info( 'Positions:update: illegal ID.' );
return false;
}
if ( !self::$db->update( $this->tableName, $id, $fields ) ) {
// new CustomException( 'positionUpdate' );
Debug::error( "Positions:update: $id not updated: $fields" );
return false;
}
return true;
}
}

View File

@ -0,0 +1,44 @@
<?php
/**
* app/plugins/resume/plugin.php
*
* This houses all of the main plugin info and functionality.
*
* @package TP Resume
* @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 Resume extends Plugin {
public $pluginName = 'TP Resume';
public $pluginAuthor = 'JoeyK';
public $pluginWebsite = 'https://TheTempusProject.com';
public $modelVersion = '1.0';
public $pluginVersion = '3.0';
public $pluginDescription = 'A simple plugin which adds management for a resume.';
public $configName = 'resume';
public $configMatrix = [
'enabled' => [
'type' => 'radio',
'pretty' => 'Enable the resume Feature.',
'default' => true,
],
];
public $main_links = [
[
'text' => 'Resume',
'url' => '{ROOT_URL}resume/index',
],
];
public $admin_links = [
[
'text' => '<i class="fa fa-fw fa-support"></i> Resume',
'url' => '{ROOT_URL}admin/resume',
],
];
}

View File

@ -0,0 +1,19 @@
<h2>Resume Entry Form</h2>
<form action="#" method="POST">
<label for="name">Company Name:</label><br>
<input type="text" id="name" name="name" required><br><br>
<label for="position">Position:</label><br>
<input type="text" id="position" name="position" required><br><br>
<label for="start">Start Month/Year:</label><br>
<input type="month" id="start" name="start" required><br><br>
<label for="end">End Month/Year:</label><br>
<input type="month" id="end" name="end" required><br><br>
<label for="details">Details:</label><br>
<textarea id="details" name="details" rows="20" cols="50" required></textarea><br><br>
<input type="submit" name="submit" value="Submit">
</form>

View File

@ -0,0 +1,19 @@
<h2>Edit Resume Position</h2>
<form action="#" method="POST">
<label for="name">Company Name:</label><br>
<input type="text" id="name" name="name" value="{name}" required><br><br>
<label for="position">Position:</label><br>
<input type="text" id="position" name="position" value="{position}" required><br><br>
<label for="start">Start Month/Year:</label><br>
<input type="month" id="start" name="start" value="{start}" required><br><br>
<label for="end">End Month/Year:</label><br>
<input type="month" id="end" name="end" value="{end}" required><br><br>
<label for="details">Details:</label><br>
<textarea id="details" name="details" rows="20" cols="50" required>{details}</textarea><br><br>
<input type="submit" name="submit" value="Submit">
</form>

View File

@ -0,0 +1,43 @@
<legend>Resume Positions</legend>
{PAGINATION}
<form action="{ROOT_URL}admin/resume/delete" method="post">
<table class="table table-striped">
<thead>
<tr>
<th style="width: 30%">Name</th>
<th style="width: 20%">Position</th>
<th style="width: 10%">Start</th>
<th style="width: 10%">End</th>
<th style="width: 10%"></th>
<th style="width: 10%"></th>
<th style="width: 10%">
<INPUT type="checkbox" onchange="checkAll(this)" name="check.b" value="B_[]"/>
</th>
</tr>
</thead>
<tbody>
{LOOP}
<tr>
<td><a href="{ROOT_URL}admin/resume/view/{ID}">{name}</a></td>
<td>{position}</td>
<td>{prettyStart}</td>
<td>{prettyEnd}</td>
<td><a href="{ROOT_URL}admin/resume/edit/{ID}" class="btn btn-sm btn-warning" role="button"><i class="glyphicon glyphicon-edit"></i></a></td>
<td><a href="{ROOT_URL}admin/resume/delete/{ID}" class="btn btn-sm btn-danger" role="button"><i class="glyphicon glyphicon-trash"></i></a></td>
<td>
<input type="checkbox" value="{ID}" name="P_[]">
</td>
</tr>
{/LOOP}
{ALT}
<tr>
<td colspan="7">
No results to show.
</td>
</tr>
{/ALT}
</tbody>
</table>
<a href="{ROOT_URL}admin/resume/create" class="btn btn-sm btn-primary" role="button">Create</a>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger">Delete</button>
</form>

View File

@ -0,0 +1,8 @@
<legend>Resume Position</legend>
<div class="resume-position">
<h3 class="resume-position-title">{name}</h3>
<p><b>{position}</b> from <i>{prettyStart}</i> to <i>{prettyEnd}</i></p>
<div class="well">
{details}
</div>
</div>

View File

@ -0,0 +1,9 @@
<div class="col-lg-12 text-center" role="group" aria-label="Resume Downloads">
<div class="btn-group text-center" role="group" aria-label="Resume Downloads">
<h3>Download</h3>
<a href="/downloads/JoeyKimsey-resume.docx" class="btn btn-default" role="button">Word</a>
<a href="/downloads/JoeyKimsey-resume.pdf" class="btn btn-default" role="button">PDF</a>
<a href="/downloads/JoeyKimsey-resume.md" class="btn btn-default" role="button">Markdown</a>
<a href="/downloads/JoeyKimsey-resume.txt" class="btn btn-default" role="button">Text</a>
</div>
</div>

View File

@ -0,0 +1,4 @@
<div class="btn-group btn-group-justified" role="group" aria-label="Resume View Type">
<a href="?view=tiimeline" class="btn btn-default" role="button">Timeliine</a>
<a href="?" class="btn btn-default" role="button">Standard</a>
</div>

View File

@ -0,0 +1,18 @@
<h1>Resume</h1>
<hr>
{RESUME_NAV}
{LOOP}
<div class="resume-position">
<h3 class="resume-position-title">{name}</h3>
<p><b>{position}</b> from <i>{prettyStart}</i> to <i>{prettyEnd}</i></p>
<div class="well">
{details}
</div>
</div>
{/LOOP}
{ALT}
<div class="resume-position">
<p>None Found</p>
</div>
{/ALT}
{RESUME_DOWNLOADS}

View File

@ -0,0 +1,139 @@
<div class="btn-group btn-group-justified" role="group" aria-label="Resume View Type">
<a href="?view=tiimeline" class="btn btn-default" role="button">Timeline</a>
<div class="btn-group">
<button class="btn btn-default btn-lg dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
Options <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</div>
<a href="?" class="btn btn-default" role="button">Standard</a>
</div>
<div class="row">
<div class="col-lg-6">
<div class="input-group">
<span class="input-group-addon">
<input type="checkbox" aria-label="...">
</span>
<span class="input-group-addon" id="basic-addon3">
Show / Hide the Bullshit
</span>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<div class="input-group">
<span class="input-group-addon" id="basic-addon3">https://example.com/users/</span>
<input type="checkbox" aria-label="...">
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<div class="input-group">
<span class="input-group-addon">
<input type="checkbox" aria-label="...">
</span>
<input type="text" class="form-control" aria-label="...">
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<div class="input-group">
<span class="input-group-addon">
<input type="checkbox" aria-label="...">
</span>
<span class="input-group-addon" id="basic-addon3">https://example.com/users/</span>
</div>
</div>
</div>
<div class="input-group">
<span class="input-group-addon" id="basic-addon1">@</span>
<input type="text" class="form-control" placeholder="Username" aria-describedby="basic-addon1">
</div>
<div class="input-group">
<input type="text" class="form-control" placeholder="Recipient's username" aria-describedby="basic-addon2">
<span class="input-group-addon" id="basic-addon2">@example.com</span>
</div>
<label for="basic-url">Your vanity URL</label>
<div class="input-group">
<span class="input-group-addon" id="basic-addon3">https://example.com/users/</span>
<input type="text" class="form-control" id="basic-url" aria-describedby="basic-addon3">
</div>

View File

@ -0,0 +1,22 @@
<h1>Resume</h1>
<hr>
{RESUME_NAV}
{LOOP}
<div class="resume-timeline">
<div class="timeline-container {side}">
<div class="timeline-content">
<h3 class="resume-position-title">{name}</h3>
<p><b>{position}</b> from <i>{prettyStart}</i> to <i>{prettyEnd}</i></p>
<div class="well">
{details}
</div>
</div>
</div>
</div>
{/LOOP}
{ALT}
<div class="resume-timeline">
<p>None Found</p>
</div>
{/ALT}
{RESUME_DOWNLOADS}

View File

@ -1,65 +0,0 @@
<?php
/**
* app/plugins/subscribe/controllers/admin/subscriptions.php
*
* This is the subscriptions admin controller.
*
* @package TP Subscribe
* @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\Bedrock\Functions\Check;
use TheTempusProject\Houdini\Classes\Issues;
use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\Classes\AdminController;
use TheTempusProject\Models\Subscribe;
use TheTempusProject\Classes\Forms;
class Subscriptions extends AdminController {
public static $subscribe;
public function __construct() {
parent::__construct();
self::$title = 'Admin - Email Subscribers';
self::$subscribe = new Subscribe;
}
public function delete( $data = null ) {
if ( $data == null ) {
if ( Input::exists( 'submit' ) ) {
$data = Input::post( 'S_' );
}
}
if ( !self::$subscribe->delete( (array) $data ) ) {
Issues::add( 'error', 'There was an error with your request, please try again.' );
} else {
Issues::add( 'success', 'Subscriber removed.' );
}
$this->index();
}
public function add( $data = null ) {
if ( !Input::exists( 'submit' ) ) {
return Views::view( 'subscribe.admin.add' );
}
if ( !Forms::check( 'subscribe' ) ) {
Issues::add( 'error', [ 'There was an error with your request.' => Check::userErrors() ] );
return $this->index();
}
if ( !self::$subscribe->add( Input::post( 'email' ) ) ) {
Issues::add( 'error', 'There was an error with your request, please try again.' );
return $this->index();
}
Issues::add( 'success', 'Subscriber added.' );
$this->index();
}
public function index( $data = null ) {
Views::view( 'subscribe.admin.list', self::$subscribe->listPaginated() );
}
}

View File

@ -1,79 +0,0 @@
<?php
/**
* app/plugins/subscribe/controllers/subscribe.php
*
* This is the home controller for the subscribe plugin.
*
* @package TP Subscribe
* @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\Classes\Controller;
use TheTempusProject\Classes\Forms;
use TheTempusProject\Hermes\Functions\Redirect;
use TheTempusProject\Bedrock\Functions\Session;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Classes\Email;
use TheTempusProject\Houdini\Classes\Issues;
use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\Models\Subscribe as SubscribeModel;
class Subscribe extends Controller {
private static $subscribe;
public function __construct() {
parent::__construct();
self::$subscribe = new SubscribeModel;
}
public function index() {
self::$title = 'Subscribe - {SITENAME}';
self::$pageDescription = 'We are always publishing great content and keeping our members up to date. If you would like to join our list, you can subscribe here.';
if ( !Input::exists( 'email' ) ) {
return Views::view( 'subscribe.subscribe' );
}
if ( !Forms::check( 'subscribe' ) ) {
Issues::add( 'error', [ 'There was an error with your form.' => Check::userErrors() ] );
return Views::view( 'subscribe.subscribe' );
}
if ( !self::$subscribe->add( Input::post( 'email' ) ) ) {
Issues::add( 'error', 'There was an error with your request, please try again.' );
return Views::view( 'subscribe.subscribe' );
}
$data = self::$subscribe->get( Input::post( 'email' ) );
Email::send( Input::post( 'email' ), 'subscribe', $data->confirmationCode, ['template' => true] );
Issues::add( 'success', 'You have successfully been subscribed to our mailing list.' );
}
public function unsubscribe( $email = null, $code = null ) {
self::$title = '{SITENAME}';
self::$pageDescription = '';
if ( !empty( $email ) && !empty( $code ) ) {
if ( self::$subscribe->unsubscribe( $email, $code ) ) {
return Issues::add( 'success', 'You have been successfully unsubscribed from receiving further mailings.' );
}
Issues::add( 'error', 'There was an error with your request.' );
return Views::view( 'subscribe.unsubscribe' );
}
if ( !Input::exists( 'submit' ) ) {
return Views::view( 'subscribe.unsubscribe' );
}
if ( !Forms::check( 'unsubscribe' ) ) {
Issues::add( 'error', [ 'There was an error with your request.' => Check::userErrors() ] );
return Views::view( 'subscribe.unsubscribe' );
}
$data = self::$subscribe->get( Input::post( 'email' ) );
if ( empty( $data ) ) {
Issues::add( 'notice', 'There was an error with your request.' );
return Views::view( 'subscribe.unsubscribe' );
}
Email::send( Input::post( 'email' ), 'unsubInstructions', $data->confirmationCode, ['template' => true] );
Session::flash( 'success', 'An email with instructions on how to unsubscribe has been sent to your email.' );
Redirect::to( 'home/index' );
}
}

View File

@ -1,73 +0,0 @@
<?php
/**
* app/plugins/subscribe/forms.php
*
* This houses all of the form checking functions for this plugin.
*
* @package TP Subscribe
* @version 3.0
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Plugins\Subscribe;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\Classes\Forms;
class SubscribeForms extends Forms {
/**
* Adds these functions to the form list.
*/
public function __construct() {
self::addHandler( 'subscribe', __CLASS__, 'subscribe' );
self::addHandler( 'unsubscribe', __CLASS__, 'unsubscribe' );
self::addHandler( 'newSubscription', __CLASS__, 'newSubscription' );
}
/**
* Validates the subscribe form.
*
* @return {bool}
*/
public static function subscribe() {
if ( !self::email( Input::post( 'email' ) ) ) {
self::addUserError( 'Invalid email.' );
return false;
}
if ( !self::token() ) {
return false;
}
return true;
}
/**
* Validates the unsubscribe form.
*
* @return {bool}
*/
public static function unsubscribe() {
if ( !self::email( Input::post( 'email' ) ) ) {
self::addUserError( 'Invalid email.' );
return false;
}
if ( !self::token() ) {
return false;
}
return true;
}
/**
* Validates the new subscription form.
*
* @return {bool}
*/
public static function newSubscription() {
if ( !self::token() ) {
return false;
}
return true;
}
}
new SubscribeForms;

View File

@ -1,97 +0,0 @@
<?php
/**
* app/plugins/subscribe/models/subscribe.php
*
* This class is used for the manipulation of the subscribers database table.
*
* @package TP Subscribe
* @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\Bedrock\Functions\Code;
use TheTempusProject\Canary\Bin\Canary as Debug;
use TheTempusProject\Classes\DatabaseModel;
class Subscribe extends DatabaseModel {
public $tableName = 'subscribers';
public $databaseMatrix = [
[ 'confirmed', 'int', '1' ],
[ 'subscribed', 'int', '10' ],
[ 'confirmationCode', 'varchar', '80' ],
[ 'email', 'varchar', '75' ],
];
/**
* Adds an email to the subscribers database.
*
* @param string $email - the email you are trying to add.
* @return bool
*/
public function add( $email ) {
if ( !Check::email( $email ) ) {
return false;
}
$alreadyExists = self::$db->get( $this->tableName, ['email', '=', $email] );
if ( $alreadyExists->error() ) {
Debug::info( 'Error querying database: ' . $alreadyExists->errorMessage() );
return false;
}
if ( $alreadyExists->count() ) {
Debug::info( 'email already subscribed.' );
return false;
}
$fields = [
'email' => $email,
'confirmationCode' => Code::genConfirmation(),
'confirmed' => 0,
'subscribed' => time(),
];
self::$db->insert( $this->tableName, $fields );
return self::$db->lastId();
}
/**
* Removes an email from the subscribers database.
*
* @param string $email - The email you are trying to remove.
* @param string $code - The confirmation code to unsubscribe.
* @return boolean
*/
public function unsubscribe( $email, $code ) {
if ( !Check::email( $email ) ) {
return false;
}
$user = self::$db->get( $this->tableName, ['email', '=', $email, 'AND', 'confirmationCode', '=', $code] );
if ( !$user->count() ) {
Debug::info( __METHOD__ . ' - Cannot find subscriber with that email and code' );
return false;
}
self::$db->delete( $this->tableName, ['ID', '=', $user->first()->ID] );
return true;
}
/**
* Returns a subscriber object for the provided email address.
*
* @param string $email - An email address to look for.
* @return bool|object - Depending on success.
*/
public function get( $email ) {
if ( !Check::email( $email ) ) {
return false;
}
$data = self::$db->get( $this->tableName, ['email', '=', $email] );
if ( !$data->count() ) {
Debug::info( __METHOD__ . ' - Email not found' );
return false;
}
return (object) $data->first();
}
}

View File

@ -1,41 +0,0 @@
<?php
/**
* app/plugins/subscribe/plugin.php
*
* This houses all of the main plugin info and functionality.
*
* @package TP Subscribe
* @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 ReflectionClass;
use TheTempusProject\Classes\Installer;
use TheTempusProject\Houdini\Classes\Navigation;
use TheTempusProject\Classes\Plugin;
use TheTempusProject\Houdini\Classes\Components;
use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\TheTempusProject as App;
class Subscribe extends Plugin {
public $pluginName = 'TP Subscribe';
public $pluginAuthor = 'JoeyK';
public $pluginWebsite = 'https://TheTempusProject.com';
public $modelVersion = '1.0';
public $pluginVersion = '3.0';
public $pluginDescription = 'A simple plugin to add a method for users to share their email.';
public $admin_links = [
[
'text' => '<i class="fa fa-fw fa-address-book"></i> Subscriptions',
'url' => '{ROOT_URL}admin/subscriptions',
],
];
public function __construct( $load = false ) {
parent::__construct( $load );
Components::set( 'FOOTER_RIGHT', Views::simpleView( 'subscribe.footer.right') );
}
}

View File

@ -1,5 +0,0 @@
<form action="" method="post" class="form-horizontal">
<input type="email" placeholder="Email" id="email" name="email">
<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>

View File

@ -1,37 +0,0 @@
<legend>Subscribers</legend>
{PAGINATION}
<form action="{ROOT_URL}admin/subscriptions/delete" method="post">
<table class="table table-striped">
<thead>
<tr>
<th style="width: 5%">ID</th>
<th style="width: 85%">email</th>
<th style="width: 5%"></th>
<th style="width: 5%">
<INPUT type="checkbox" onchange="checkAll(this)" name="check.s" value="S_[]"/>
</th>
</tr>
</thead>
<tbody>
{LOOP}
<tr>
<td align="center">{ID}</td>
<td>{EMAIL}</td>
<td><a href="{ROOT_URL}admin/subscriptions/delete/{ID}" class="btn btn-sm btn-danger" role="button"><i class="glyphicon glyphicon-trash"></i></a></td>
<td>
<input type="checkbox" value="{ID}" name="S_[]">
</td>
</tr>
{/LOOP}
{ALT}
<tr>
<td align="center" colspan="6">
No results to show.
</td>
</tr>
{/ALT}
</tbody>
</table>
<a href="{ROOT_URL}admin/subscriptions/add" class="btn btn-sm btn-primary" role="button">Add</a>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger">Delete</button>
</form>

View File

@ -1,5 +0,0 @@
<form action="{ROOT_URL}subscribe/home" method="post" class="form-horizontal">
<input type="email" placeholder="Email" id="email" name="email" autocomplete="email">
<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>

View File

@ -1,5 +0,0 @@
<form action="{ROOT_URL}home/unsubscribe" method="post" class="form-horizontal">
<input type="email" placeholder="Email" id="email" name="email">
<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>

View File

@ -0,0 +1,85 @@
<?php
/**
* app/plugins/updates/controllers/updates.php
*
* This is the status updates controller.
*
* @package TP Status-Updates
* @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\Hermes\Functions\Redirect;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\Bedrock\Functions\Session;
use TheTempusProject\Houdini\Classes\Issues;
use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\Classes\Controller;
use TheTempusProject\Classes\Forms;
use TheTempusProject\Models\Update;
use TheTempusProject\TheTempusProject as App;
use TheTempusProject\Houdini\Classes\Components;
class Updates extends Controller {
protected static $updates;
public function __construct() {
parent::__construct();
self::$updates = new Update;
self::$title = 'Status Updates - {SITENAME}';
self::$pageDescription = 'On this page you can view and post new status updates.';
if ( ! App::$isLoggedIn ) {
return Issues::add( 'notice', 'You must be logged in to post or view statuses.' );
}
}
public function index() {
$updates = self::$updates->byUser( App::$activeUser->ID );
Components::set( 'list', Views::simpleView( 'updates.list', $updates ) );
Components::set( 'create', Views::simpleView( 'updates.create' ) );
if ( ! Input::exists() ) {
return Views::view( 'updates.dash' );
}
if ( ! Forms::check( 'createUpdate' ) ) {
Issues::add( 'error', [ 'There was an error with your report.' => Check::userErrors() ] );
return Views::view( 'updates.dash' );
}
$result = self::$updates->create( Input::post( 'status' ) );
if ( true === $result ) {
Issues::add( 'success', 'Your status has been posted.' );
} else {
Issues::add( 'error', 'There was an unresolved error while submitting your status.' );
}
return Views::view( 'updates.dash' );
}
public function post() {
if ( ! Input::exists() ) {
return Views::view( 'updates.create' );
}
if ( !Forms::check( 'createUpdate' ) ) {
Issues::add( 'error', [ 'There was an error with your report.' => Check::userErrors() ] );
return Views::view( 'updates.create' );
}
$result = self::$updates->create( Input::post( 'status' ) );
if ( true === $result ) {
Session::flash( 'success', 'Your status has been posted.' );
Redirect::to( 'home/index' );
} else {
Issues::add( 'error', 'There was an unresolved error while submitting your status.' );
return Views::view( 'updates.create' );
}
}
public function byUser( $id = null ) {
}
}

View File

@ -0,0 +1,36 @@
<?php
/**
* app/plugins/updates/forms.php
*
* This houses all of the form checking functions for this plugin.
*
* @package TP Status-Updates
* @version 3.0
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Plugins\Updates;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Classes\Forms;
class UpdateForms extends Forms {
/**
* Adds these functions to the form list.
*/
public function __construct() {
self::addHandler( 'createUpdate', __CLASS__, 'createUpdate' );
}
public static function createUpdate() {
if ( ! Input::exists( 'status' ) ) {
Check::addUserError( 'You must provide an status.' );
return false;
}
return true;
}
}
new UpdateForms;

View File

@ -0,0 +1,87 @@
<?php
/**
* app/plugins/updates/models/update.php
*
* This class is used for the manipulation of the status_updates database table.
*
* @package TP Status-Updates
* @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\Classes\Config;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Canary\Bin\Canary as Debug;
use TheTempusProject\Classes\DatabaseModel;
use TheTempusProject\Plugins\Updates as Plugin;
use TheTempusProject\TheTempusProject as App;
class Update extends DatabaseModel {
public $tableName = 'status_updates';
public $databaseMatrix = [
[ 'status', 'varchar', '512' ],
[ 'createdAt', 'int', '10' ],
[ 'createdBy', 'int', '10' ],
[ 'updatedAt', 'int', '10' ],
[ 'updatedBy', 'int', '10' ],
[ 'deletedAt', 'int', '10' ],
[ 'deletedBy', 'int', '10' ],
];
public $plugin;
/**
* The model constructor.
*/
public function __construct() {
parent::__construct();
$this->plugin = new Plugin;
}
public function create( $status ) {
if ( ! $this->plugin->checkEnabled() ) {
Debug::info( 'Status-Updates are disabled in the config.' );
return false;
}
$fields = [
'status' => $status,
'createdAt' => time(),
'createdBy' => App::$activeUser->ID,
];
if ( !self::$db->insert( $this->tableName, $fields ) ) {
Debug::info( 'Status-Updates::create - failed to insert to db' );
return false;
}
return self::$db->lastId();
}
public function update( $status ) {
if ( !$this->plugin->checkEnabled() ) {
Debug::info( 'Status-Updates are disabled in the config.' );
return false;
}
$fields = [
'status' => $status,
'updatedAt' => time(),
'updatedBy' => App::$activeUser->ID,
];
if ( !self::$db->update( $this->tableName, $id, $fields ) ) {
Debug::info( 'Status-Updates::update - failed to update to db' );
return false;
}
return true;
}
public function byUser( $userID, $limit = null ) {
$whereClause = [ 'createdBy', '=', $userID ];
if ( empty( $limit ) ) {
$reviews = self::$db->get( $this->tableName, $whereClause );
} else {
$reviews = self::$db->get( $this->tableName, $whereClause, 'ID', 'DESC', [0, $limit] );
}
if ( !$reviews->count() ) {
Debug::info( 'No Reviews found.' );
return false;
}
return $this->filter( $reviews->results() );
}
}

View File

@ -0,0 +1,30 @@
<?php
/**
* app/plugins/updates/plugin.php
*
* This houses all of the main plugin info and functionality.
*
* @package TP Status-Updates
* @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 Updates extends Plugin {
public $pluginName = 'TP Status-Updates';
public $pluginAuthor = 'JoeyK';
public $pluginWebsite = 'https://TheTempusProject.com';
public $modelVersion = '1.0';
public $pluginVersion = '3.0';
public $pluginDescription = 'A simple plugin which adds a user status update system.';
public $permissionMatrix = [
'updates' => [
'pretty' => 'Can create status updates',
'default' => false,
],
];
}

View File

@ -0,0 +1,10 @@
<div class="container mt-5">
<h2>Update your status</h2>
<form id="status-form" method="post">
<div class="form-group">
<label for="status">Your Status:</label>
<textarea class="form-control" id="status" name="status" rows="5" required></textarea>
</div>
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block ">Submit</button>
</form>
</div>

View File

@ -0,0 +1,2 @@
{list}
{create}

View File

@ -0,0 +1,26 @@
<legend>Updates</legend>
<table class="table table-striped">
<thead>
<tr>
<th style="width: 20%">Date</th>
<th style="width: 70%">Status</th>
<th style="width: 10%"></th>
</tr>
</thead>
<tbody>
{LOOP}
<tr>
<td align="center">{DTC}{createdAt}{/DTC}</td>
<td align="center">{status}</td>
<td><a href="{ROOT_URL}updates/delete/{ID}" class="btn btn-sm btn-danger" role="button"><i class="glyphicon glyphicon-trash"></i></a></td>
</tr>
{/LOOP}
{ALT}
<tr>
<td align="center" colspan="6">
No results to show.
</td>
</tr>
{/ALT}
</tbody>
</table>

View File

@ -0,0 +1,102 @@
<?php
/**
* app/plugins/wip/controllers/admin/wip.php
*
* This is the projects admin controller.
*
* @package TP Wip
* @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\Check;
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\Classes\Forms;
use TheTempusProject\Models\Projects;
class Wip extends AdminController {
public static $projects;
public function __construct() {
parent::__construct();
self::$projects = new Projects;
self::$title = 'Admin - Projects';
$view = Navigation::activePageSelect( 'nav.admin', '/admin/wip' );
Components::set( 'ADMINNAV', $view );
}
public function index( $data = null ) {
Views::view( 'wip.admin.list', self::$projects->listPaginated() );
}
public function create( $data = null ) {
if ( !Input::exists( 'submit' ) ) {
return Views::view( 'wip.admin.create' );
}
if ( !Forms::check( 'newProject' ) ) {
Issues::add( 'error', [ 'There was an error with your request.' => Check::userErrors() ] );
return $this->index();
}
$result = self::$projects->create( Input::post( 'title' ), Input::post( 'description' ), Input::post( 'progress' ), Input::post( 'startDate' ) );
if ( $result ) {
Issues::add( 'success', 'Your projects has been created.' );
return $this->index();
} else {
Issues::add( 'error', [ 'There was an unknown error submitting your data.' => Check::userErrors() ] );
return $this->index();
}
}
public function edit( $data = null ) {
if ( !Input::exists( 'submit' ) ) {
return Views::view( 'wip.admin.edit', self::$projects->findById( $data ) );
}
if ( !Forms::check( 'editProject' ) ) {
Issues::add( 'error', [ 'There was an error with your form.' => Check::userErrors() ] );
return $this->index();
}
$fields = [
'title' => Input::post( 'title' ),
'description' => Input::post( 'description' ),
'progress' => Input::post( 'progress' ),
'startDate' => Input::post( 'startDate' ),
];
if ( self::$projects->update( $data, $fields ) ) {
Issues::add( 'success', 'Projects Updated.' );
return $this->index();
}
Issues::add( 'error', 'There was an error with your request.' );
$this->index();
}
public function view( $data = null ) {
$projectData = self::$projects->findById( $data );
if ( $projectData !== false ) {
return Views::view( 'wip.admin.view', $projectData );
}
Issues::add( 'error', 'Projects not found.' );
$this->index();
}
public function delete( $data = null ) {
if ( $data == null ) {
if ( Input::exists( 'P_' ) ) {
$data = Input::post( 'P_' );
}
}
if ( !self::$projects->delete( (array) $data ) ) {
Issues::add( 'error', 'There was an error with your request.' );
} else {
Issues::add( 'success', 'Projects has been deleted' );
}
$this->index();
}
}

View File

@ -0,0 +1,36 @@
<?php
/**
* app/plugins/wip/controllers/wip.php
*
* This is the bug reports controller.
*
* @package TP Wip
* @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\Issues;
use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\Classes\Controller;
use TheTempusProject\Models\Projects;
class Wip extends Controller {
protected static $projects;
public function index() {
self::$projects = new Projects;
self::$title = '{SITENAME} - Works in Progress';
self::$pageDescription = 'Its not the longest wip in the world, but I\'m certainly proud of it.';
$projects = self::$projects->listPaginated();
if ( false == $projects ) {
Issues::add( 'error', 'Well, this is embarrassing, surely he wouldn\'t just have no wip..... right.... Dave? ... erm Joey?' );
return;
} else {
Views::view( 'wip.wip', self::$projects->listPaginated() );
}
}
}

79
app/plugins/wip/forms.php Normal file
View File

@ -0,0 +1,79 @@
<?php
/**
* app/plugins/wip/forms.php
*
* This houses all of the form checking functions for this plugin.
*
* @package TP Wip
* @version 3.0
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Plugins\Wip;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Classes\Forms;
class WipForms extends Forms {
/**
* Adds these functions to the form list.
*/
public function __construct() {
self::addHandler( 'newProject', __CLASS__, 'newProject' );
self::addHandler( 'editProject', __CLASS__, 'editProject' );
}
/**
* Validates the new project post form.
*
* @return {bool}
*/
public static function newProject() {
if ( !Input::exists( 'title' ) ) {
self::addUserError( 'You must specify title' );
return false;
}
if ( !Input::exists( 'description' ) ) {
self::addUserError( 'You must specify description' );
return false;
}
if ( !Input::exists( 'progress' ) ) {
self::addUserError( 'You must specify progress' );
return false;
}
if ( !Input::exists( 'startDate' ) ) {
self::addUserError( 'You must specify startDate' );
return false;
}
return true;
}
/**
* Validates the edit project post form.
*
* @return {bool}
*/
public static function editProject() {
if ( !Input::exists( 'title' ) ) {
self::addUserError( 'You must specify title' );
return false;
}
if ( !Input::exists( 'description' ) ) {
self::addUserError( 'You must specify description' );
return false;
}
if ( !Input::exists( 'progress' ) ) {
self::addUserError( 'You must specify progress' );
return false;
}
if ( !Input::exists( 'startDate' ) ) {
self::addUserError( 'You must specify startDate' );
return false;
}
return true;
}
}
new WipForms;

View File

@ -0,0 +1,85 @@
<?php
/**
* app/plugins/wip/models/projects.php
*
* This class is used for the manipulation of the projects database table.
*
* @package TP WIP
* @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\Classes\Config;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Canary\Bin\Canary as Debug;
use TheTempusProject\Classes\DatabaseModel;
use TheTempusProject\Plugins\Wip as Plugin;
class Projects extends DatabaseModel {
public $tableName = 'projects';
public $databaseMatrix = [
[ 'title', 'varchar', '128' ],
[ 'description', 'text', '' ],
[ 'progress', 'int', '3' ],
[ 'startDate', 'varchar', '32' ],
];
public $plugin;
/**
* The model constructor.
*/
public function __construct() {
parent::__construct();
$this->plugin = new Plugin;
}
public function create( $title, $description, $progress, $startDate ) {
if ( !$this->plugin->checkEnabled() ) {
Debug::info( 'Wip is disabled in the config.' );
return false;
}
$fields = [
'title' => $title,
'description' => $description,
'progress' => $progress,
'startDate' => $startDate,
];
if ( !self::$db->insert( $this->tableName, $fields ) ) {
Debug::info( 'Projects::create - failed to insert to db' );
return false;
}
return self::$db->lastId();
}
public function update( $id, $fields ) {
if ( !Check::id( $id ) ) {
Debug::info( 'Project:update: illegal ID.' );
return false;
}
if ( !self::$db->update( $this->tableName, $id, $fields ) ) {
// new CustomException( 'projectUpdate' );
Debug::error( "Project:update: $id not updated: $fields" );
return false;
}
return true;
}
public function filter( $postArray, $params = [] ) {
foreach ( $postArray as $instance ) {
if ( !is_object( $instance ) ) {
$instance = $postArray;
$end = true;
}
$instance->prettyStart = $instance->startDate;
$out[] = $instance;
if ( !empty( $end ) ) {
$out = $out[0];
break;
}
}
return $out;
}
}

View File

@ -0,0 +1,44 @@
<?php
/**
* app/plugins/wip/plugin.php
*
* This houses all of the main plugin info and functionality.
*
* @package TP Wip
* @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 Wip extends Plugin {
public $pluginName = 'TP Wip';
public $pluginAuthor = 'JoeyK';
public $pluginWebsite = 'https://TheTempusProject.com';
public $modelVersion = '1.0';
public $pluginVersion = '3.0';
public $pluginDescription = 'A simple plugin which adds management for a wip.';
public $configName = 'wip';
public $configMatrix = [
'enabled' => [
'type' => 'radio',
'pretty' => 'Enable the wip Feature.',
'default' => true,
],
];
public $main_links = [
[
'text' => 'WIP',
'url' => '{ROOT_URL}wip/index',
],
];
public $admin_links = [
[
'text' => '<i class="fa fa-fw fa-support"></i> Wip',
'url' => '{ROOT_URL}admin/wip',
],
];
}

View File

@ -0,0 +1,16 @@
<h2>Create Project</h2>
<form action="#" method="POST">
<label for="title">Title:</label><br>
<input type="text" id="title" name="title" required><br><br>
<label for="progress">Progress:</label><br>
<input type="text" id="progress" name="progress" required><br><br>
<label for="startDate">Start Month/Year:</label><br>
<input type="month" id="startDate" name="startDate" required><br><br>
<label for="description">Description:</label><br>
<textarea id="description" name="description" rows="20" cols="50" required></textarea><br><br>
<input type="submit" name="submit" value="Submit">
</form>

View File

@ -0,0 +1,16 @@
<h2>Edit Project</h2>
<form action="#" method="POST">
<label for="title">Title:</label><br>
<input type="text" id="title" name="title" value="{title}" required><br><br>
<label for="progress">Progress:</label><br>
<input type="text" id="progress" name="progress" value="{progress}" required><br><br>
<label for="startDate">Start Month/Year:</label><br>
<input type="month" id="startDate" name="startDate" value="{startDate}" required><br><br>
<label for="description">Description:</label><br>
<textarea id="description" name="description" rows="20" cols="50" required>{description}</textarea><br><br>
<input type="submit" name="submit" value="Submit">
</form>

View File

@ -0,0 +1,41 @@
<legend>Works in Progress</legend>
{PAGINATION}
<form action="{ROOT_URL}admin/wip/delete" method="post">
<table class="table table-striped">
<thead>
<tr>
<th style="width: 30%">Title</th>
<th style="width: 20%">Progress</th>
<th style="width: 20%">Start Date</th>
<th style="width: 10%"></th>
<th style="width: 10%"></th>
<th style="width: 10%">
<INPUT type="checkbox" onchange="checkAll(this)" name="check.b" value="P_[]"/>
</th>
</tr>
</thead>
<tbody>
{LOOP}
<tr>
<td><a href="{ROOT_URL}admin/wip/view/{ID}">{title}</a></td>
<td>{progress}</td>
<td>{startDate}</td>
<td><a href="{ROOT_URL}admin/wip/edit/{ID}" class="btn btn-sm btn-warning" role="button"><i class="glyphicon glyphicon-edit"></i></a></td>
<td><a href="{ROOT_URL}admin/wip/delete/{ID}" class="btn btn-sm btn-danger" role="button"><i class="glyphicon glyphicon-trash"></i></a></td>
<td>
<input type="checkbox" value="{ID}" name="P_[]">
</td>
</tr>
{/LOOP}
{ALT}
<tr>
<td colspan="7">
No results to show.
</td>
</tr>
{/ALT}
</tbody>
</table>
<a href="{ROOT_URL}admin/wip/create" class="btn btn-sm btn-primary" role="button">Create</a>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger">Delete</button>
</form>

View File

@ -0,0 +1,8 @@
<legend>WIP</legend>
<div class="wip-project">
<h3 class="wip-project-title">{name}</h3>
<p><b>{position}</b> from <i>{prettyStart}</i> to <i>{prettyEnd}</i></p>
<div class="well">
{details}
</div>
</div>

View File

@ -0,0 +1,19 @@
<h1>Work in Progress</h1>
<hr>
{LOOP}
<div class="wip-project">
<h3 class="wip-project-title">{title}</h3>
<p><b>Started: </b><i>{prettyStart}</i></p>
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: {progress}%" aria-valuenow="{progress}" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<div class="well">
{description}
</div>
</div>
{/LOOP}
{ALT}
<div class="wip-project">
<p>None Found</p>
</div>
{/ALT}