wip
This commit is contained in:
100
app/plugins/wip/controllers/admin/wip.php
Normal file
100
app/plugins/wip/controllers/admin/wip.php
Normal file
@ -0,0 +1,100 @@
|
||||
<?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 - WIP';
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
36
app/plugins/wip/controllers/wip.php
Normal file
36
app/plugins/wip/controllers/wip.php
Normal 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
79
app/plugins/wip/forms.php
Normal 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;
|
100
app/plugins/wip/models/projects.php
Normal file
100
app/plugins/wip/models/projects.php
Normal file
@ -0,0 +1,100 @@
|
||||
<?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;
|
||||
use DateTime;
|
||||
|
||||
class Projects extends DatabaseModel {
|
||||
public $tableName = 'projects';
|
||||
public $databaseMatrix = [
|
||||
[ 'title', 'varchar', '128' ],
|
||||
[ 'description', 'text', '' ],
|
||||
[ 'progress', 'int', '3' ],
|
||||
[ 'startDate', 'varchar', '32' ],
|
||||
[ 'endDate', '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;
|
||||
}
|
||||
if ( ! empty( $instance->startDate ) ) {
|
||||
$startDate = DateTime::createFromFormat( 'Y-m', $instance->startDate );
|
||||
$startDateFormatted = $startDate->format('F Y');
|
||||
$instance->prettyStart = $startDateFormatted;
|
||||
} else {
|
||||
$instance->prettyStart = 'TBD';
|
||||
}
|
||||
if ( ! empty( $instance->endDate ) ) {
|
||||
$endDate = DateTime::createFromFormat( 'Y-m', $instance->endDate );
|
||||
$endDateFormatted = $endDate->format('F Y');
|
||||
$instance->prettyEnd = $endDateFormatted;
|
||||
} else {
|
||||
$instance->prettyEnd = 'TBD';
|
||||
}
|
||||
$out[] = $instance;
|
||||
if ( !empty( $end ) ) {
|
||||
$out = $out[0];
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
}
|
44
app/plugins/wip/plugin.php
Normal file
44
app/plugins/wip/plugin.php
Normal 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-flask"></i> Wip',
|
||||
'url' => '{ROOT_URL}admin/wip',
|
||||
],
|
||||
];
|
||||
}
|
48
app/plugins/wip/views/admin/create.html
Normal file
48
app/plugins/wip/views/admin/create.html
Normal file
@ -0,0 +1,48 @@
|
||||
<div class="context-main-bg context-main p-3">
|
||||
<legend class="text-center">Add WIP</legend>
|
||||
<hr>
|
||||
{ADMIN_BREADCRUMBS}
|
||||
<form method="post">
|
||||
<fieldset>
|
||||
<!-- Title -->
|
||||
<div class="mb-3 row">
|
||||
<label for="title" class="col-lg-5 col-form-label text-end">Title:</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="text" class="form-control" name="title" id="title" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Progress -->
|
||||
<div class="mb-3 row">
|
||||
<label for="progress" class="col-lg-5 col-form-label text-end">Progress:</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="text" class="form-control" name="progress" id="progress" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Start Month/Year -->
|
||||
<div class="mb-3 row">
|
||||
<label for="startDate" class="col-lg-5 col-form-label text-end">Start Month/Year:</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="month" class="form-control" name="startDate" id="startDate" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Description -->
|
||||
<div class="mb-3 row">
|
||||
<label for="description" class="col-lg-5 col-form-label text-end">Description:</label>
|
||||
<div class="col-lg-3">
|
||||
<textarea class="form-control" name="description" maxlength="2000" rows="5" cols="50" id="description"></textarea>
|
||||
</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">Create</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
48
app/plugins/wip/views/admin/edit.html
Normal file
48
app/plugins/wip/views/admin/edit.html
Normal file
@ -0,0 +1,48 @@
|
||||
<div class="context-main-bg context-main p-3">
|
||||
<legend class="text-center">Edit WIP</legend>
|
||||
<hr>
|
||||
{ADMIN_BREADCRUMBS}
|
||||
<form method="post">
|
||||
<fieldset>
|
||||
<!-- Title -->
|
||||
<div class="mb-3 row">
|
||||
<label for="title" class="col-lg-5 col-form-label text-end">Title:</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="text" class="form-control" name="title" id="title" value="{title}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Progress -->
|
||||
<div class="mb-3 row">
|
||||
<label for="progress" class="col-lg-5 col-form-label text-end">Progress:</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="text" class="form-control" name="progress" id="progress" value="{progress}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Start Month/Year -->
|
||||
<div class="mb-3 row">
|
||||
<label for="startDate" class="col-lg-5 col-form-label text-end">Start Month/Year:</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="month" class="form-control" name="startDate" id="startDate" value="{startDate}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Description -->
|
||||
<div class="mb-3 row">
|
||||
<label for="description" class="col-lg-5 col-form-label text-end">Description:</label>
|
||||
<div class="col-lg-3">
|
||||
<textarea class="form-control" name="description" maxlength="2000" rows="5" cols="50" id="description">{description}</textarea>
|
||||
</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">Save</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
44
app/plugins/wip/views/admin/list.html
Normal file
44
app/plugins/wip/views/admin/list.html
Normal file
@ -0,0 +1,44 @@
|
||||
<div class="context-main-bg context-main p-3">
|
||||
<legend class="text-center">Works in Progress</legend>
|
||||
<hr>
|
||||
{ADMIN_BREADCRUMBS}
|
||||
<form action="{ROOT_URL}admin/wip/delete" method="post">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" style="width: 30%">Title</th>
|
||||
<th scope="col" style="width: 20%">Progress</th>
|
||||
<th scope="col" style="width: 20%">Start Date</th>
|
||||
<th scope="col" style="width: 10%"></th>
|
||||
<th scope="col" style="width: 10%"></th>
|
||||
<th scope="col" 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}" class="text-decoration-none">{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="fa fa-fw fa-pencil"></i></a></td>
|
||||
<td><a href="{ROOT_URL}admin/wip/delete/{ID}" class="btn btn-sm btn-danger" role="button"><i class="fa fa-fw fa-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"><i class="fa fa-fw fa-trash"></i></button>
|
||||
</form>
|
||||
</div>
|
46
app/plugins/wip/views/admin/view.html
Normal file
46
app/plugins/wip/views/admin/view.html
Normal file
@ -0,0 +1,46 @@
|
||||
<div class="container py-4">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8">
|
||||
{ADMIN_BREADCRUMBS}
|
||||
<div class="card shadow">
|
||||
<!-- Card Header -->
|
||||
<div class="card-header text-center bg-dark text-white">
|
||||
<h3 class="card-title mb-0">{title}</h3>
|
||||
</div>
|
||||
|
||||
<!-- Card Body -->
|
||||
<div class="card-body">
|
||||
<div class="row align-items-center">
|
||||
<!-- Details -->
|
||||
<table class="table table-borderless">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th scope="row" class="col-3">Title</th>
|
||||
<td>{title}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Progress</th>
|
||||
<td>{progress}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Started:</th>
|
||||
<td>{DTC}{startDate}{/DTC}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Description</th>
|
||||
<td>{description}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Admin Controls -->
|
||||
<div class="card-footer text-center">
|
||||
<a href="{ROOT_URL}admin/wip/edit/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil"></i></a>
|
||||
<a href="{ROOT_URL}admin/wip/delete/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
29
app/plugins/wip/views/wip.html
Normal file
29
app/plugins/wip/views/wip.html
Normal file
@ -0,0 +1,29 @@
|
||||
<div class="m-2 m-lg-4">
|
||||
<div class="col-12 mx-5 col-sm-10 col-lg-8 mx-auto p-4 rounded shadow-sm context-main-bg">
|
||||
<h1 class="text-center">Work in Progress</h1>
|
||||
<hr>
|
||||
{LOOP}
|
||||
<div class="wip-project">
|
||||
<h3 class="wip-project-title text-center text-md-start text-primary">{title}</h3>
|
||||
<div class="d-flex justify-content-between">
|
||||
<small><span class="text-muted">Started: </span><i class="">{prettyStart}</i></small>
|
||||
<small><span class="text-muted">Finished: </span><i class="">{prettyEnd}</i></small>
|
||||
</div>
|
||||
<div class="progress mt-2">
|
||||
<div class="progress-bar" role="progressbar" style="width: {progress}%" aria-valuenow="{progress}" aria-valuemin="0" aria-valuemax="100"></div>
|
||||
</div>
|
||||
<div class="well my-3">
|
||||
{description}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 offset-3 my-2">
|
||||
<hr>
|
||||
</div>
|
||||
{/LOOP}
|
||||
{ALT}
|
||||
<div class="wip-project">
|
||||
<p>None Found</p>
|
||||
</div>
|
||||
{/ALT}
|
||||
</div>
|
||||
</div>
|
Reference in New Issue
Block a user