plugin wip

This commit is contained in:
Joey Kimsey
2024-12-17 22:45:47 -05:00
parent 0955fb4175
commit e537771708
42 changed files with 1043 additions and 693 deletions

1
.gitignore vendored
View File

@ -56,7 +56,6 @@ Temporary Items
.htaccess
app/config/*
!app/config/constants.php
uploads/images/*
logs/*
.vscode/
mail.log

View File

@ -434,7 +434,10 @@ class Bookmarks extends Controller {
}
public function import() {
// echo '<pre>';
if ( !App::$isMember ) {
Issues::add( 'notice', 'You must have an active membership to import bookmarks.' );
return $this->index();
}
if ( ! Input::exists('submit') ) {
return Views::view( 'bookmarks.import' );
@ -489,6 +492,11 @@ class Bookmarks extends Controller {
}
public function export() {
if ( !App::$isMember ) {
Issues::add( 'notice', 'You must have an active membership to export bookmarks.' );
return $this->index();
}
$folders = self::$folders->byUser();
if ( ! Input::exists('submit') ) {
@ -544,6 +552,35 @@ class Bookmarks extends Controller {
}
}
public function share( $id = '' ) {
$panelArray = [];
$folders = self::$folders->byUser();
if ( empty( $folders ) ) {
return Views::view( 'bookmarks.share' );
}
foreach ( $folders as $key => $folder ) {
$panel = new \stdClass();
$folderObject = new \stdClass();
if ( $folder->privacy == 'private' ) {
$links = self::$bookmarks->publicByFolder( $folder->ID );
} else {
$links = self::$bookmarks->byFolder( $folder->ID );
}
$folderObject->bookmarks = $links;
$folderObject->ID = $folder->ID;
$folderObject->uuid = $folder->uuid;
$folderObject->title = $folder->title;
$folderObject->color = $folder->color;
$folderObject->privacyBadge = $folder->privacyBadge;
$folderObject->bookmarkListRows = Views::simpleView( 'bookmarks.components.shareListRows', $folderObject->bookmarks );
$panel->panel = Views::simpleView( 'bookmarks.components.shareListPanel', [$folderObject] );
$panelArray[] = $panel;
}
return Views::view( 'bookmarks.share', $panelArray );
}
private function exportFolder( $title, $editedAt, $createdAt, $links ) {
$htmlDoc = '<DT><H3 ADD_DATE="'.$createdAt.'" LAST_MODIFIED="'.$editedAt.'">'.$title.'</H3>' . PHP_EOL;
$htmlDoc .= '<DL><p>' . PHP_EOL;
@ -561,37 +598,7 @@ class Bookmarks extends Controller {
return $htmlDoc;
}
public function share( $id = '' ) {
$panelArray = [];
$folders = self::$folders->byUser();
foreach ( $folders as $key => $folder ) {
$panel = new \stdClass();
$folderObject = new \stdClass();
if ( $folder->privacy == 'private' ) {
$folderObject->privacyBadge = '<span class="mx-2 badge bg-success">Private</span>';
$links = self::$bookmarks->publicByFolder( $folder->ID );
} else {
$folderObject->privacyBadge = '<span class="mx-2 badge bg-danger">Public</span>';
$links = self::$bookmarks->byFolder( $folder->ID );
}
$folderObject->bookmarks = $links;
$folderObject->ID = $folder->ID;
$folderObject->uuid = $folder->uuid;
$folderObject->title = $folder->title;
$folderObject->color = $folder->color;
$folderObject->bookmarkListRows = Views::simpleView( 'bookmarks.components.shareListRows', $folderObject->bookmarks );
$panel->panel = Views::simpleView( 'bookmarks.components.shareListPanel', [$folderObject] );
$panelArray[] = $panel;
}
return Views::view( 'bookmarks.share', $panelArray );
}
public function parseBookmarks($htmlContent)
{
private function parseBookmarks($htmlContent) {
$started = false;
$out = [];
$currentFolder = [];

View File

@ -35,29 +35,6 @@ class Shared extends Controller {
Components::set( 'SITE_URL', Routes::getAddress() );
}
public function index() {
$bookmarks = self::$bookmarks->noFolder();
$folders = self::$folders->byUser();
$panelArray = [];
if ( !empty( $folders ) ) {
foreach ( $folders as $folder ) {
$panel = new \stdClass();
$folderObject = new \stdClass();
$folderObject->bookmarks = self::$bookmarks->byFolder( $folder->ID );
$folderObject->ID = $folder->ID;
$folderObject->title = $folder->title;
$folderObject->color = $folder->color;
$folderObject->bookmarkListRows = Views::simpleView( 'bookmarks.components.bookmarkListRows', $folderObject->bookmarks );
$panelArray[] = $folderObject;
}
}
Components::set( 'foldersList', Views::simpleView( 'bookmarks.folders.list', $folders ) );
Components::set( 'folderPanels', Views::simpleView( 'bookmarks.components.bookmarkListPanel', $panelArray ) );
Components::set( 'bookmarksList', Views::simpleView( 'bookmarks.bookmarks.list', $bookmarks ) );
return Views::view( 'bookmarks.dash' );
}
public function shared( $type = '', $id = '' ) {
if ( empty( $type ) ) {
Session::flash( 'error', 'Unknown share' );
@ -105,7 +82,7 @@ class Shared extends Controller {
}
}
}
return Views::view( 'bookmarks.shareLink', $bookmark );
return Views::view( 'bookmarks.public.bookmark', $bookmark );
}
public function folder( $id = '' ) {
@ -122,6 +99,9 @@ class Shared extends Controller {
Session::flash( 'error', 'Unknown share' );
return Redirect::to( 'home/index' );
}
return Views::view( 'bookmarks.shareFolder', $folder );
$folder->bookmarks = self::$bookmarks->unsafeByFolder( $folder->ID );
$folder->bookmarkListRows = Views::simpleView( 'bookmarks.components.publicListRows', $folder->bookmarks );
$folder->panel = Views::simpleView( 'bookmarks.components.publicList', [$folder] );
return Views::view( 'bookmarks.public.folder', $folder );
}
}

View File

@ -42,7 +42,7 @@ class Bookmarks extends DatabaseModel {
[ 'hiddenAt', 'int', '11' ],
[ 'order', 'int', '11' ],
[ 'linkType', 'varchar', '32' ],
[ 'uuid', 'char', '36' ],
[ 'uuid', 'uuid', '36' ],
];
/**
@ -132,6 +132,20 @@ class Bookmarks extends DatabaseModel {
return $this->filter( $bookmarks->results() );
}
public function unsafeByFolder( $id, $limit = null ) {
$whereClause = [ 'folderID', '=', $id ];
if ( empty( $limit ) ) {
$bookmarks = self::$db->get( $this->tableName, $whereClause );
} else {
$bookmarks = self::$db->get( $this->tableName, $whereClause, 'ID', 'DESC', [0, $limit] );
}
if ( !$bookmarks->count() ) {
Debug::info( 'No Bookmarks found.' );
return false;
}
return $this->filter( $bookmarks->results() );
}
public function byFolder( $id, $limit = null ) {
$whereClause = ['createdBy', '=', App::$activeUser->ID, 'AND'];
@ -351,32 +365,46 @@ class Bookmarks extends DatabaseModel {
}
if ( $instance->privacy == 'private' ) {
$instance->privacyBadge = '<span class="mx-3 badge bg-success">Private</span>';
$instance->privacyBadge = '<span class="mx-2 translate-center badge bg-success rounded-pill">Private</span>';
} else {
$instance->privacyBadge = '<span class="mx-3 badge bg-danger">Public</span>';
$instance->privacyBadge = '<span class="mx-2 translate-center badge bg-danger rounded-pill">Public</span>';
}
if ( $instance->privacy == 'private' ) {
$instance->publish = '
<a href="{ROOT_URL}bookmarks/publish/'.$instance->ID.'" class="btn btn-sm btn-outline-danger">
<i class="fa fa-fw fa-lock"></i>
</a>';
} else {
$instance->publish = '
<a href="{ROOT_URL}bookmarks/retract/'.$instance->ID.'" class="btn btn-sm btn-outline-secondary">
<i class="fa fa-fw fa-lock"></i>
</a>';
}
if ( empty( $instance->hiddenAt ) ) {
$instance->hideBtn = '
<a href="{ROOT_URL}bookmarks/hideBookmark/'.$instance->ID.'" class="btn btn-sm btn-warning">
<a href="{ROOT_URL}bookmarks/hideBookmark/'.$instance->ID.'" class="btn btn-sm btn-outline-warning">
<i class="fa fa-fw fa-eye"></i>
</a>';
} else {
$instance->hideBtn = '
<a href="{ROOT_URL}bookmarks/showBookmark/'.$instance->ID.'" class="btn btn-sm btn-default">
<a href="{ROOT_URL}bookmarks/showBookmark/'.$instance->ID.'" class="btn btn-sm btn-outline-secondary">
<i class="fa fa-fw fa-eye"></i>
</a>';
}
if ( empty( $instance->archivedAt ) ) {
$instance->archiveBtn = '
<a href="{ROOT_URL}bookmarks/archiveBookmark/'.$instance->ID.'" class="btn btn-sm btn-info">
<a href="{ROOT_URL}bookmarks/archiveBookmark/'.$instance->ID.'" class="btn btn-sm btn-outline-info">
<i class="fa fa-fw fa-briefcase"></i>
</a>';
} else {
$instance->archiveBtn = '
<a href="{ROOT_URL}bookmarks/unarchiveBookmark/'.$instance->ID.'" class="btn btn-sm btn-default">
<a href="{ROOT_URL}bookmarks/unarchiveBookmark/'.$instance->ID.'" class="btn btn-sm btn-outline-secondary">
<i class="fa fa-fw fa-briefcase"></i>
</a>';
}
if ( ! empty( $instance->refreshedAt ) && time() < ( $instance->refreshedAt + ( 60 * 10 ) ) ) {
$instance->refreshBtn = '
<a href="{ROOT_URL}bookmarks/refreshBookmark/'.$instance->ID.'" class="btn btn-sm btn-danger">
@ -445,6 +473,7 @@ class Bookmarks extends DatabaseModel {
}
return true;
}
public function retract( $id ) {
if ( !Check::id( $id ) ) {
Debug::info( 'Bookmarks: illegal ID.' );
@ -461,7 +490,6 @@ class Bookmarks extends DatabaseModel {
return true;
}
public function archive( $id ) {
if ( !Check::id( $id ) ) {
Debug::info( 'Bookmarks: illegal ID.' );

View File

@ -25,10 +25,20 @@ class Bookmarkviews extends DatabaseModel {
[ 'title', 'varchar', '256' ],
[ 'description', 'text', '' ],
[ 'privacy', 'varchar', '48' ],
[ 'createdBy', 'int', '11' ],
[ 'createdAt', 'int', '11' ],
[ 'updatedAt', 'int', '11' ],
[ 'uuid', 'char', '36' ],
[ 'uuid', 'text', '' ],
];
/**

View File

@ -29,7 +29,7 @@ class Folders extends DatabaseModel {
[ 'folderID', 'int', '11' ],
[ 'createdBy', 'int', '11' ],
[ 'createdAt', 'int', '11' ],
[ 'uuid', 'char', '36' ],
[ 'uuid', 'text', '' ],
];
/**
@ -197,6 +197,13 @@ class Folders extends DatabaseModel {
// Real Work Starts Here
$instance->prettyPrivacy = ucfirst( $instance->privacy );
$instance->prettyTitle = ucfirst( $instance->title );
if ( $instance->privacy == 'private' ) {
$instance->privacyBadge = '<span class="mx-2 translate-center badge bg-success rounded-pill">Private</span>';
} else {
$instance->privacyBadge = '<span class="mx-2 translate-center badge rounded-pill bg-danger">Public</span>';
}
// Real Work Ends Here
$out[] = $instance;
if ( !empty( $end ) ) {

View File

@ -43,6 +43,10 @@ class Bookmarks extends Plugin {
'url' => '{ROOT_URL}bookmarks/index',
'filter' => 'loggedin',
],
[
'text' => 'Extensions',
'url' => '{ROOT_URL}extensions/index',
],
];
public $configMatrix = [
'enabled' => [

View File

@ -1,5 +1,8 @@
<form action="" method="post" class="container py-4">
<h2 class="text-center mb-4">Add Bookmark</h2>
<div class="mb-4 mt-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<legend class="text-center">Add Bookmark</legend>
<hr>
<form method="post" class="container py-4">
<fieldset>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Title</label>
@ -49,3 +52,5 @@
</div>
</fieldset>
</form>
</div>
</div>

View File

@ -2,11 +2,11 @@
<div class="col-xlg-6 col-lg-6 col-md-6 col-sm-6 bookmark-card">
<div class="card m-3 accordion">
<div class="accordion-item">
<div class="card-header accordion-header bg-{color} context-main" data-bs-target="#Collapse{ID}" data-bs-toggle="collapse" aria-expanded="true" aria-controls="Collapse{ID}">
{title}
<div class="card-header accordion-header text-center bg-{color} context-main" data-bs-target="#Collapse{ID}" data-bs-toggle="collapse" aria-expanded="true" aria-controls="Collapse{ID}">
<span class="h4 text-center">{title}</span>
</div>
<div id="Collapse{ID}" class="accordion-collapse collapse show" style="width:100%; position: relative;">
<div class="card-body accordion-body context-other-bg p-2">
<div id="Collapse{ID}" class="accordion-collapse collapse w-100 position-relative show">
<div class="card-body accordion-body p-2 context-second-bg">
<ul class="list-group">
{bookmarkListRows}
</ul>
@ -14,8 +14,8 @@
<div class="card-footer d-flex justify-content-center align-items-center context-main-bg">
<a href="{ROOT_URL}bookmarks/createBookmark/{ID}" class="btn btn-sm btn-success"><i class="fa fa-fw fa-plus"></i></a></td>
<span class="ms-auto">
<a href="{ROOT_URL}bookmarks/bookmarks/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-list"></i></a>
<a href="{ROOT_URL}bookmarks/folders/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-info-circle"></i></a></td>
<a href="{ROOT_URL}bookmarks/bookmarks/{ID}" class="btn btn-sm btn-outline-primary"><i class="fa fa-fw fa-list"></i></a>
<a href="{ROOT_URL}bookmarks/folders/{ID}" class="btn btn-sm btn-outline-primary"><i class="fa fa-fw fa-info-circle"></i></a></td>
<a href="{ROOT_URL}bookmarks/editFolder/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil"></i></a></td>
<a href="{ROOT_URL}bookmarks/deleteFolder/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a></td>
</span>
@ -26,7 +26,7 @@
</div>
{/LOOP}
{ALT}
<div class="col-xlg-6 col-lg-6 col-md-6 col-sm-6">
<p>no folders</p>
<div class="col-12 text-center h4">
<p>No folders found.</p>
</div>
{/ALT}

View File

@ -1,18 +1,19 @@
{LOOP}
<li class="list-group-item mb-1 context-main-b bg-{color}">
<li class="list-group-item context-main-b bg-{color}">
<a href="{ROOT_URL}bookmarks/bookmark/{ID}" class="context-main">{iconHtml}</a>
<a href="{url}"> {title}</a>
<span class="float-end">
{hideBtn}
{archiveBtn}
{publish}
<a href="{ROOT_URL}bookmarks/editBookmark/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil"></i></a>
<a href="{ROOT_URL}bookmarks/deleteBookmark/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a>
</span>
</li>
{/LOOP}
{ALT}
<li class="list-group-item py-1">
<li class="list-group-item context-main context-main-bg">
<p class="list-group text-center">No Bookmarks</p>
</li>
{/ALT}

View File

@ -0,0 +1,27 @@
{LOOP}
<div class="bookmark-card">
<div class="card m-3 accordion">
<div class="accordion-item">
<div class="card-header accordion-header bg-{color} context-main">
<div class="d-flex justify-content-between align-items-center w-100" data-bs-target="#Collapse{ID}" data-bs-toggle="collapse" aria-expanded="true" aria-controls="Collapse{ID}">
<div class="text-center h4">{title}</div>
</div>
</div>
<div id="Collapse{ID}" class="accordion-collapse collapse w-100 position-relative show">
<div class="card-body accordion-body p-2 context-second-bg">
<ul class="list-group">
{bookmarkListRows}
</ul>
</div>
</div>
</div>
</div>
</div>
{/LOOP}
{ALT}
<div class="context-other-bg">
<p class="context-other-bg">no Folders</p>
</div>
{/ALT}

View File

@ -0,0 +1,30 @@
{LOOP}
<li class="list-group-item context-main-bg bg-{color}">
<a href="{ROOT_URL}bookmarks/bookmark/{ID}" class="context-main">{iconHtml}</a>
<a href="{url}"> {title}</a>
<span class="float-end">
<a class="btn btn-sm btn-primary" data-bs-toggle="modal" data-bs-target="#linkShare{ID}">
<i class="fa fa-fw fa-share"></i>
</a>
<div class="modal fade" id="linkShare{ID}" tabindex="-1" style="display: none;" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5">Share Url</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<input type="text" value="{SITE_URL}shared/link/{uuid}" name="input" class="w-100 form-control" id="shareLinkUrlInput{ID}">
<button class="btn btn-secondary mt-2" onclick="copyElementText('shareLinkUrlInput{ID}')">Copy</button>
</div>
</div>
</div>
</div>
</span>
</li>
{/LOOP}
{ALT}
<li class="list-group-item context-main context-main-bg">
<p class="list-group text-center">No Bookmarks</p>
</li>
{/ALT}

View File

@ -2,35 +2,45 @@
<div class="col-xlg-6 col-lg-6 col-md-6 col-sm-6 bookmark-card">
<div class="card m-3 accordion">
<div class="accordion-item">
<div class="card-header accordion-header bg-{color} context-main" data-bs-target="#Collapse{ID}" data-bs-toggle="collapse" aria-expanded="true" aria-controls="Collapse{ID}">
{title}{privacyBadge}
<a class="btn btn-sm btn-primary float-end" data-bs-toggle="modal" data-bs-target="#linkShare{ID}">
<div class="card-header accordion-header bg-{color} context-main">
<div class="d-flex justify-content-between align-items-center w-100">
<span data-bs-target="#Collapse{ID}" data-bs-toggle="collapse" aria-expanded="true" aria-controls="Collapse{ID}">
<span class="text-center px-5">{privacyBadge}</span>
<span class="h4 text-center px-5">{title}</span>
</span>
<a class="btn btn-sm btn-primary btn-rounded" data-bs-toggle="modal" data-bs-target="#linkShare{ID}">
<i class="fa fa-fw fa-share"></i>
</a>
<div class="modal fade" id="linkShare{ID}" tabindex="-1" style="display: none;" aria-hidden="true">
</div>
</div>
<div class="modal fade context-main" id="linkShare{ID}" tabindex="-1" style="display: none;" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalCenteredScrollableTitle">Modal title</h1>
<div class="modal-header context-main-bg">
<h1 class="modal-title fs-5">Share Url</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<input type="text" value="{SITE_URL}shared/folder/{uuid}" name="input">
<div class="modal-body context-second-bg">
<p>This link can be shared with anyone and will show display info as long as it is set to public privacy.</p>
<input type="text" value="{SITE_URL}shared/folder/{uuid}" name="input" class="w-100 form-control" id="shareFolderUrlInput{ID}">
<button class="btn btn-secondary mt-2" onclick="copyElementText('shareFolderUrlInput{ID}')">Copy</button>
</div>
</div>
</div>
</div>
</div>
<div id="Collapse{ID}" class="accordion-collapse collapse show" style="width:100%; position: relative;">
<div class="card-body accordion-body context-other-bg p-2">
<div id="Collapse{ID}" class="accordion-collapse collapse w-100 position-relative show">
<div class="card-body accordion-body p-2 context-second-bg">
<ul class="list-group">
{bookmarkListRows}
</ul>
</div>
<div class="card-footer d-flex justify-content-center align-items-center context-main-bg">
<span class="ms-auto">
<a href="{ROOT_URL}bookmarks/bookmarks/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-list"></i></a>
<a href="{ROOT_URL}bookmarks/folders/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-info-circle"></i></a></td>
<a href="{ROOT_URL}bookmarks/bookmarks/{ID}" class="btn btn-sm btn-outline-primary "><i class="fa fa-fw fa-list"></i></a>
<a href="{ROOT_URL}bookmarks/folders/{ID}" class="btn btn-sm btn-outline-primary"><i class="fa fa-fw fa-info-circle"></i></a></td>
</span>
</div>
</div>
@ -39,7 +49,7 @@
</div>
{/LOOP}
{ALT}
<div class="col-xlg-6 col-lg-6 col-md-6 col-sm-6">
<p>no folders</p>
<div class="context-other-bg">
<p class="context-other-bg">no Folders</p>
</div>
{/ALT}

View File

@ -1,9 +1,9 @@
{LOOP}
<li class="list-group-item mb-1 context-main-b bg-{color}">
<li class="list-group-item context-main-bg bg-{color}">
<a href="{ROOT_URL}bookmarks/bookmark/{ID}" class="context-main">{iconHtml}</a>
<a href="{url}"> {title}</a>{privacyBadge}
<span class="float-end">
<a href="{ROOT_URL}bookmarks/retract/{ID}" class="btn btn-sm btn-success"><i class="fa fa-fw fa-eye"></i></a>
{publish}
<a class="btn btn-sm btn-primary" data-bs-toggle="modal" data-bs-target="#linkShare{ID}">
<i class="fa fa-fw fa-share"></i>
</a>
@ -11,11 +11,12 @@
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalCenteredScrollableTitle">Modal title</h1>
<h1 class="modal-title fs-5">Share Url</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<input type="text" value="{SITE_URL}shared/link/{uuid}" name="input">
<input type="text" value="{SITE_URL}shared/link/{uuid}" name="input" class="w-100 form-control" id="shareLinkUrlInput{ID}">
<button class="btn btn-secondary mt-2" onclick="copyElementText('shareLinkUrlInput{ID}')">Copy</button>
</div>
</div>
</div>
@ -24,7 +25,7 @@
</li>
{/LOOP}
{ALT}
<li class="list-group-item py-1">
<li class="list-group-item context-main context-main-bg">
<p class="list-group text-center">No Bookmarks</p>
</li>
{/ALT}

View File

@ -1,5 +1,5 @@
<div class="row mt-4">
<div class="row mt-4 g-1">
<div class="offset-md-1 col-5 mr-2 py-3 context-main-bg">
<legend class="text-center">Unsorted Bookmarks</legend>
{bookmarksList}
@ -9,7 +9,7 @@
{foldersList}
</div>
</div>
<div class="row mb-4 mt-4">
<div class="mb-4 mt-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<legend class="text-center">Bookmarks</legend>
<hr>

View File

@ -1,5 +1,10 @@
<div class="mb-4 mt-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<legend class="text-center">Add Folder</legend>
<hr>
<form action="" method="post" class="container py-4">
<h2 class="text-center mb-4">Create Folder</h2>
<fieldset>
<div class="mb-3 row">
<label for="title" class="col-lg-5 col-form-label text-end">Title</label>
@ -39,3 +44,5 @@
</div>
</fieldset>
</form>
</div>
</div>

View File

@ -0,0 +1,48 @@
<div class="container py-4">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card shadow">
<!-- Card Header -->
<div class="card-header text-center bg-dark text-white">
<h3 class="card-title mb-0">Bookmark</h3>
</div>
<!-- Card Body -->
<div class="card-body">
<div class="row align-items-center">
<!-- User Details -->
<div class="offset-md-2 col-md-8">
<table class="table table-borderless">
<tbody>
<tr>
<th scope="row">Title:</th>
<td>{title}</td>
</tr>
<tr>
<th scope="row">URL:</th>
<td>{url}</td>
</tr>
<tr>
<th scope="row">Created:</th>
<td>{DTC}{createdAt}{/DTC}</td>
</tr>
<tr>
<th scope="row">Last Refreshed:</th>
<td>{DTC}{refreshedAt}{/DTC}</td>
</tr>
<tr>
<th scope="row" colspan="2">Icon</th>
</tr>
<tr>
<td colspan="2">{iconHtml}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -19,17 +19,13 @@
<th scope="row">Title:</th>
<td>{title}</td>
</tr>
<tr>
<th scope="row">Privacy:</th>
<td>{privacy}</td>
</tr>
<tr>
<th scope="row">Color:</th>
<td>{color}</td>
</tr>
<tr>
<th scope="row">Created:</th>
<td>{DTC}{createdAt}{/DTC}</td>
<th scope="row">Added on:</th>
<td>{DTC date}{createdAt}{/DTC}</td>
</tr>
<tr>
<th scope="row" colspan="2">Description</th>
@ -45,4 +41,9 @@
</div>
</div>
</div>
<div class="row justify-content-center">
<div class="col-md-12">
{panel}
</div>
</div>
</div>

View File

@ -5,10 +5,9 @@
<div class="offset-3 col-lg-6 my-4">
<p>Any link or folder can be shared. By default, the extensions and app both default to <strong>private</strong>. On this page, you can quickly see a list of any public links and folders. These "public" items can be shared with anyone who has the link.</p>
</div>
<div class="row g-3" data-masonry='{ "percentPosition": false }' id="bookmarkSort">
{LOOP}
<div class="col-6 col-md-12">
{panel}
</div>
{/LOOP}
{ALT}
<div class="col-12">
@ -17,3 +16,4 @@
{/ALT}
</div>
</div>
</div>

View File

@ -1,83 +0,0 @@
<div class="container py-4">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card shadow">
<!-- Card Header -->
<div class="card-header text-center bg-dark text-white">
<h3 class="card-title mb-0">Bookmark</h3>
</div>
<!-- Card Body -->
<div class="card-body">
<div class="row align-items-center">
<!-- User Details -->
<div class="offset-md-2 col-md-8">
<table class="table table-borderless">
<tbody>
<tr>
<th scope="row">Title:</th>
<td>{title}</td>
</tr>
<tr>
<th scope="row">URL:</th>
<td>{url}</td>
</tr>
<tr>
<th scope="row">Type:</th>
<td>{linkType}</td>
</tr>
<tr>
<th scope="row">Privacy:</th>
<td>{privacy}</td>
</tr>
<tr>
<th scope="row">Color:</th>
<td>{color}</td>
</tr>
<tr>
<th scope="row">Created:</th>
<td>{DTC}{createdAt}{/DTC}</td>
</tr>
<tr>
<th scope="row">Archived:</th>
<td>{DTC}{archivedAt}{/DTC}</td>
</tr>
<tr>
<th scope="row">Hidden:</th>
<td>{DTC}{hiddenAt}{/DTC}</td>
</tr>
<tr>
<th scope="row">Last Refreshed:</th>
<td>{DTC}{refreshedAt}{/DTC}</td>
</tr>
<tr>
<th scope="row" colspan="2">Description</th>
</tr>
<tr>
<td colspan="2">{description}</td>
</tr>
<tr>
<th scope="row" colspan="2">Icon</th>
</tr>
<tr>
<td colspan="2">{iconHtml}</td>
</tr>
<tr>
<td colspan="2">{icon}</td>
</tr>
<tr>
<th scope="row" colspan="2">Meta</th>
</tr>
<tr>
<td colspan="2">{meta}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -57,15 +57,15 @@ class Products extends AdminController {
public function edit( $id = null ) {
if ( !Input::exists( 'submit' ) ) {
return Views::view( 'members.admin.products.edit', self::$posts->findById( $id ) );
return Views::view( 'members.admin.products.edit', self::$products->findById( $id ) );
}
if ( !Forms::check( 'editMembershipProduct' ) ) {
Issues::add( 'error', [ 'There was an error with your form.' => Check::userErrors() ] );
return $this->index();
}
if ( self::$posts->updatePost( $id, Input::post( 'title' ), Input::post( 'blogPost' ), Input::post( 'submit' ) ) === true ) {
Issues::add( 'success', 'Post Updated.' );
if ( self::$products->updatePost( $id, Input::post( 'name' ), Input::post( 'description' ), Input::post( 'monthly_price' ), Input::post( 'yearly_price' ) ) === true ) {
Issues::add( 'success', 'Your product Updated.' );
return $this->index();
}
Issues::add( 'error', 'There was an error with your request.' );
@ -75,9 +75,9 @@ class Products extends AdminController {
public function view( $id = null ) {
$data = self::$products->findById( $id );
if ( $data !== false ) {
return Views::view( 'blog.admin.view', $data );
return Views::view( 'members.admin.products.view', $data );
}
Issues::add( 'error', 'Post not found.' );
Issues::add( 'error', 'Product not found.' );
$this->index();
}

View File

@ -39,7 +39,13 @@ class Records extends AdminController {
public function edit( $data = null ) {
}
public function view( $data = null ) {
public function view( $id = null ) {
$data = self::$memberships->findById( $id );
if ( $data !== false ) {
return Views::view( 'members.admin.memberships.view', $data );
}
Issues::add( 'error', 'Membership not found.' );
$this->index();
}
public function delete( $data = null ) {

View File

@ -53,10 +53,10 @@ class Members extends Plugin {
'text' => '<i class="fa fa-fw fa-database"></i> Subscriptions',
'url' => '{ROOT_URL}admin/records',
],
[
'text' => '<i class="fa fa-fw fa-database"></i> Invoices',
'url' => '{ROOT_URL}admin/invoices',
],
// [
// 'text' => '<i class="fa fa-fw fa-database"></i> Invoices',
// 'url' => '{ROOT_URL}admin/invoices',
// ],
],
],
];

View File

@ -1,5 +1,7 @@
<legend>Memberships</legend>
{PAGINATION}
<div class="context-main-bg context-main p-3">
<legend class="text-center">Memberships</legend>
<hr>
{ADMIN_BREADCRUMBS}
<form action="{ROOT_URL}admin/products/delete" method="post">
<table class="table table-striped">
<thead>
@ -40,5 +42,6 @@
{/ALT}
</tbody>
</table>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger">Delete</button>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></button>
</form>
</div>

View File

@ -0,0 +1,76 @@
<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">{name}</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">User</th>
<td>{name}</td>
</tr>
<tr>
<th scope="row">Status</th>
<td>{status}</td>
</tr>
<tr>
<th scope="row">Billing Frequency</th>
<td>{billing_frequency}</td>
</tr>
<tr>
<th scope="row">Started:</th>
<td>{DTC}{current_period_end}{/DTC}</td>
</tr>
<tr>
<th scope="row">Ended:</th>
<td>{DTC}{current_period_start}{/DTC}</td>
</tr>
<tr>
<th scope="row">Stripe Customer</th>
<td class="input-group mb-3">
<input type="text" value="{stripe_customer}" name="input" class="form-control" id="stripeCustomer{ID}">
<button class="btn btn-secondary" onclick="copyElementText('stripeCustomer{ID}')">Copy</button>
</td>
</tr>
<tr>
<th scope="row">Stripe Subscription</th>
<td class="input-group mb-3">
<input type="text" value="{stripe_subscription}" name="input" class="form-control" id="stripeSubscription{ID}">
<button class="btn btn-secondary" onclick="copyElementText('stripeSubscription{ID}')">Copy</button>
</td>
</tr>
<tr>
<th scope="row">Stripe Subscription Price</th>
<td class="input-group mb-3">
<input type="text" value="{subscription_price_id}" name="input" class="form-control" id="stripeSubscriptionPrice{ID}">
<button class="btn btn-secondary" onclick="copyElementText('stripeSubscriptionPrice{ID}')">Copy</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Admin Controls -->
<div class="card-footer text-center">
{ADMIN}
<form action="{ROOT_URL}admin/feedback/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-trash"></i></button>
</form>
{/ADMIN}
</div>
</div>
</div>
</div>
</div>

View File

@ -1,34 +1,51 @@
<legend>Create Membership Product</legend>
<form action="" method="post" class="form-horizontal">
<input type="hidden" name="token" value="{TOKEN}">
<div class="form-group">
<label for="name" class="col-lg-3 control-label">Name</label>
<div class="col-lg-3">
<div class="context-main-bg context-main p-3">
<legend class="text-center">Create Membership Product</legend>
<hr>
{ADMIN_BREADCRUMBS}
<form action="" method="post">
<fieldset>
<!-- 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">
</div>
</div>
<div class="form-group">
<label for="description" class="col-lg-3 control-label">Description:</label>
<div class="col-lg-3">
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description"></textarea>
</div>
</div>
<div class="form-group">
<label for="monthly_price" class="col-lg-3 control-label">Monthly Price:</label>
<div class="col-lg-3">
<!-- Monthly Price -->
<div class="mb-3 row">
<label for="monthly_price" class="col-lg-3 col-form-label text-end">Monthly Price:</label>
<div class="col-lg-6">
<input type="number" class="form-control" name="monthly_price" id="monthly_price">
<small class="form-text text-muted">Integer required: $4.99 : 499</small>
</div>
</div>
<div class="form-group">
<label for="yearly_price" class="col-lg-3 control-label">Yearly Price:</label>
<div class="col-lg-3">
<!-- Yearly Price -->
<div class="mb-3 row">
<label for="yearly_price" class="col-lg-3 col-form-label text-end">Yearly Price:</label>
<div class="col-lg-6">
<input type="number" class="form-control" name="yearly_price" id="yearly_price">
<small class="form-text text-muted">Integer required: $4.99 : 499</small>
</div>
</div>
<div class="form-group">
<label for="submit" class="col-lg-3 control-label"></label>
<div class="col-lg-3">
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block ">Submit</button>
<!-- Description -->
<div class="mb-3 row">
<label for="description" class="col-lg-3 col-form-label text-end">Description:</label>
<div class="col-lg-6">
<textarea class="form-control" name="description" id="description" 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}">
</fieldset>
<!-- Submit Button -->
<div class="text-center">
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg center-block">Send</button>
</div>
</form>
</div>

View File

@ -1,34 +1,51 @@
<legend>Edit Membership Product</legend>
<form action="" method="post" class="form-horizontal">
<input type="hidden" name="token" value="{TOKEN}">
<div class="form-group">
<label for="name" class="col-lg-3 control-label">Name</label>
<div class="col-lg-3">
<div class="context-main-bg context-main p-3">
<legend class="text-center">Create Membership Product</legend>
<hr>
{ADMIN_BREADCRUMBS}
<form action="" method="post">
<fieldset>
<!-- 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" value="{name}">
</div>
</div>
<div class="form-group">
<label for="description" class="col-lg-3 control-label">Description:</label>
<div class="col-lg-3">
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description">{description}</textarea>
</div>
</div>
<div class="form-group">
<label for="monthly_price" class="col-lg-3 control-label">Monthly Price:</label>
<div class="col-lg-3">
<!-- Monthly Price -->
<div class="mb-3 row">
<label for="monthly_price" class="col-lg-3 col-form-label text-end">Monthly Price:</label>
<div class="col-lg-6">
<input type="number" class="form-control" name="monthly_price" id="monthly_price" value="{monthly_price}">
<small class="form-text text-muted">Integer required: $4.99 : 499</small>
</div>
</div>
<div class="form-group">
<label for="yearly_price" class="col-lg-3 control-label">Yearly Price:</label>
<div class="col-lg-3">
<!-- Yearly Price -->
<div class="mb-3 row">
<label for="yearly_price" class="col-lg-3 col-form-label text-end">Yearly Price:</label>
<div class="col-lg-6">
<input type="number" class="form-control" name="yearly_price" id="yearly_price" value="{yearly_price}">
<small class="form-text text-muted">Integer required: $4.99 : 499</small>
</div>
</div>
<div class="form-group">
<label for="submit" class="col-lg-3 control-label"></label>
<div class="col-lg-3">
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block ">Submit</button>
<!-- Description -->
<div class="mb-3 row">
<label for="description" class="col-lg-3 col-form-label text-end">Description:</label>
<div class="col-lg-6">
<textarea class="form-control" name="description" id="description" rows="6" maxlength="2000" required>{description}</textarea>
<small class="form-text text-muted">Max: 2000 characters</small>
</div>
</div>
<!-- Hidden Token -->
<input type="hidden" name="token" value="{TOKEN}">
</fieldset>
<!-- Submit Button -->
<div class="text-center">
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg center-block">Send</button>
</div>
</form>
</div>

View File

@ -1,12 +1,15 @@
<legend>Membership Products</legend>
{PAGINATION}
<div class="context-main-bg context-main p-3">
<legend class="text-center">Membership Products</legend>
<hr>
{ADMIN_BREADCRUMBS}
<form action="{ROOT_URL}admin/products/delete" method="post">
<table class="table table-striped">
<thead>
<tr>
<th style="width: 10%">Name</th>
<th style="width: 25%">Monthly Price</th>
<th style="width: 55%">Yearly Price</th>
<th style="width: 50%">Yearly Price</th>
<th style="width: 5%"></th>
<th style="width: 5%"></th>
<th style="width: 5%"></th>
<th style="width: 5%">
@ -21,6 +24,7 @@
<td>{monthly_price}</td>
<td>{yearly_price}</td>
<td><a href="{ROOT_URL}admin/products/view/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-upload"></i></a></td>
<td><a href="{ROOT_URL}admin/products/edit/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil"></i></a></td>
<td><a href="{ROOT_URL}admin/products/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="MP_[]">
@ -37,5 +41,6 @@
</tbody>
</table>
<a href="{ROOT_URL}admin/products/create" class="btn btn-sm btn-primary">Create</a>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger">Delete</button>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></button>
</form>
</div>

View File

@ -1,52 +1,68 @@
<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">Membership Product</h3>
<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">{name}</h3>
</div>
<!-- Card Body -->
<div class="card-body">
<div class="row">
<div class=" col-md-12 col-lg-12 ">
<table class="table table-user-primary">
<div class="row align-items-center">
<!-- Log Details -->
<table class="table table-borderless">
<tbody>
<tr>
<td align="left" width="200">ID:</td>
<td align="right">{ID}</td>
<th scope="row" class="col-3">Name</th>
<td>{name}</td>
</tr>
<tr>
<td>Time submitted:</td>
<td align="right">{DTC}{time}{/DTC}</td>
<th scope="row">Monthly Price</th>
<td>{monthly_price}</td>
</tr>
<tr>
<td>IP:</td>
<td align="right">{ip}</td>
<th scope="row">Yearly Price</th>
<td>{yearly_price}</td>
</tr>
<tr>
<td>Email:</td>
<td align="right">{email}</td>
<th scope="row">Stripe Product</th>
<td class="input-group mb-3">
<input type="text" value="{stripe_product}" name="input" class="form-control" id="stripeProduct{ID}">
<button class="btn btn-secondary" onclick="copyElementText('stripeProduct{ID}')" aria-describedby="stripeProduct{ID}">Copy</button>
</td>
</tr>
<tr>
<td>Name</td>
<td align="right">{name}</td>
<th scope="row">Stripe Price Yearly</th>
<td class="input-group mb-3">
<input type="text" value="{stripe_price_yearly}" name="input" class="form-control" id="stripeYearly{ID}">
<button class="btn btn-secondary" onclick="copyElementText('stripeYearly{ID}')">Copy</button>
</td>
</tr>
<tr>
<td align="center" colspan="2">Feedback</td>
<th scope="row">Stripe Price Monthly</th>
<td class="input-group mb-3">
<input type="text" value="{stripe_price_monthly}" name="input" class="form-control" id="stripeMonthly{ID}">
<button class="btn btn-secondary" onclick="copyElementText('stripeMonthly{ID}')">Copy</button>
</td>
</tr>
<tr>
<td colspan="2">{feedback}</td>
<th scope="row">Description</th>
<td>{description}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="card-footer">
<!-- Admin Controls -->
<div class="card-footer text-center">
{ADMIN}
<form action="{ROOT_URL}admin/feedback/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>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></button>
</form>
{/ADMIN}
</div>

View File

@ -29,7 +29,7 @@
</td>
<td>
<a href="{ROOT_URL}member/cancel/{ID}" class="btn btn-sm btn-danger">
<i class="fa fa-fw fa-times"></i>
<i class="fa fa-fw fa-trash"></i>
</a>
</td>
</tr>

View File

@ -27,8 +27,8 @@
</div>
</div>
<div class="panel-footer">
<a href="{ROOT_URL}admin/reviews/categoryEdit/{ID}" class="btn btn-md btn-warning" role="button">Edit</a>
<a href="{ROOT_URL}admin/reviews/categoryDelete/{ID}" class="btn btn-md btn-danger" role="button">Delete</a>
<a href="{ROOT_URL}admin/reviews/categoryEdit/{ID}" class="btn btn-md btn-warning" role="button"><i class="fa fa-fw fa-pencil"></i></a>
<a href="{ROOT_URL}admin/reviews/categoryDelete/{ID}" class="btn btn-md btn-danger" role="button"><i class="fa fa-fw fa-trash"></i></a>
</div>
</div>
</div>

View File

@ -51,17 +51,24 @@ class Suggestions extends Controller {
Issues::add( 'error', 'Suggestion not found.' );
return $this->index();
}
if ( empty( self::$comments ) ) {
self::$comments = new CommentsModel;
}
if ( Input::exists( 'contentId' ) ) {
$this->comments( 'post', Input::post( 'contentId' ) );
}
Components::set( 'CONTENT_ID', $id );
Components::set( 'COMMENT_TYPE', 'suggestions' );
$plugin = new Comments;
if ( ! $plugin->checkEnabled() ) {
Components::set( 'NEWCOMMENT', '' );
Components::set( 'count', '' );
Components::set( 'COMMENTS', '' );
} else {
$comments = new CommentsModel;
Components::set( 'count', $comments->count( 'suggestion', $id ) );
Components::set( 'COMMENTS', Views::simpleView( 'comments.list', $comments->display( 10, self::$suggestions->tableName, $id ) ) );
Components::set( 'NEWCOMMENT', Views::simpleView( 'comments.create' ) );
Components::set( 'count', self::$comments->count( 'suggestion', $id ) );
Components::set( 'COMMENTS', Views::simpleView( 'comments.list', self::$comments->display( 10, self::$suggestions->tableName, $id ) ) );
}
Views::view( 'suggestions.view', $data );
}
@ -98,36 +105,40 @@ class Suggestions extends Controller {
}
public function comments( $sub = null, $data = null ) {
if ( empty( self::$comments ) ) {
self::$comments = new CommentsModel;
}
$commentsPlugin = new Comments;
if ( empty( $sub ) || empty( $data ) ) {
Session::flash( 'error', 'Whoops, try again.' );
Redirect::to( 'suggestions' );
Issues::add( 'error', 'There was an issue with your request. Please check the url and try again.' );
return $this->index();
}
$plugin = new Comments;
if ( ! $plugin->checkEnabled() ) {
Issues::add( 'error', 'Comments are disabled.' );
return $this->index();
}
switch ( $sub ) {
case 'post':
$content = self::$suggestions->findById( $data );
if ( empty( $content ) ) {
Session::flash( 'error', 'Unknown Content.' );
Redirect::to( 'suggestions' );
Issues::add( 'error', 'Unknown Content.' );
return $this->index();
}
return $commentsPlugin->formPost( self::$suggestions->tableName, $content, 'suggestions/view/' );
Redirect::to( 'suggestions' );
return $plugin->formPost( self::$suggestions->tableName, $content, 'suggestions/view/' );
case 'edit':
$content = self::$comments->findById( $data );
if ( empty( $content ) ) {
Session::flash( 'error', 'Unknown Comment.' );
Redirect::to( 'suggestions' );
Issues::add( 'error', 'Unknown Comment.' );
return $this->index();
}
return $commentsPlugin->formEdit( self::$suggestions->tableName, $content, 'suggestions/view/' );
return $plugin->formEdit( self::$suggestions->tableName, $content, 'suggestions/view/' );
case 'delete':
$content = self::$comments->findById( $data );
if ( empty( $content ) ) {
Session::flash( 'error', 'Unknown Comment.' );
Redirect::to( 'suggestions' );
Issues::add( 'error', 'Unknown Comment.' );
return $this->index();
}
return $commentsPlugin->formDelete( self::$suggestions->tableName, $content, 'suggestions/view/' );
return $plugin->formDelete( self::$suggestions->tableName, $content, 'suggestions/view/' );
}
}
}

View File

@ -1,22 +1,38 @@
<form action="" method="post" class="form-horizontal">
<div class="form-group">
<div class="col-lg-4 col-lg-offset-4">
<label for="title" class="col-lg-3 control-label">Title</label>
<input type="text" class="form-check-input" name="title" id="title" value="{title}">
<div class="mb-4 mt-4">
<div class="offset-md-1 col-10 py-3 context-main-bg">
<legend class="text-center">Edit Suggestion</legend>
<hr>
<form action="" method="post" class="container py-4">
<fieldset>
<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>
<div class="form-group">
<div class="col-lg-4 col-lg-offset-4">
<label for="suggestion">Suggestion</label>
<textarea class="form-control" name="suggestion" maxlength="2000" rows="10" cols="50" id="suggestion">{suggestion}</textarea>
<div class="mb-3 row">
<label for="approved" class="col-lg-5 col-form-label text-end">Approved</label>
<div class="col-lg-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="approved" value="true" name="approved">
</div>
</div>
<div class="form-group">
<div class="col-lg-4 col-lg-offset-4">
<input class="" type="checkbox" name="approved" id="approved" value="true" {CHECKED:approved=true}>
<label for="approved">Approved (Publicly available)?</label>
</div>
<div class="mb-3 row">
<label for="suggestion" class="col-lg-5 col-form-label text-end">Suggestion:</label>
<div class="col-lg-3">
<textarea class="form-control" name="suggestion" maxlength="2000" rows="5" cols="50" id="suggestion">{suggestion}</textarea>
</div>
</div>
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block">Save</button>
<!-- 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>
</div>

View File

@ -1,5 +1,7 @@
<legend>Suggestions</legend>
{PAGINATION}
<div class="context-main-bg context-main p-3">
<legend class="text-center">Suggestions</legend>
<hr>
{ADMIN_BREADCRUMBS}
<form action="{ROOT_URL}admin/suggestions/delete" method="post">
<table class="table table-striped">
<thead>
@ -50,7 +52,8 @@
{/ALT}
</tbody>
</table>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger">Delete</button>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></button>
</form>
<br />
<a href="{ROOT_URL}admin/suggestions/clear">clear all</a>
</div>

View File

@ -1,17 +1,14 @@
<div class="row">
<div class="col-lg-12 col-sm-12 blog-main">
<div class="blog-post">
<h2 class="blog-post-title">Suggestion</h2>
<div class="context-main-bg context-main p-3">
<legend class="text-center">Suggestion: {title}</legend>
<hr>
<p class="blog-post-meta">{DTC date}{suggestedOn}{/DTC} by <a href="{ROOT_URL}home/profile/{author}">{submittedBy}</a></p>
{ADMIN_BREADCRUMBS}
<p class="blog-post-meta">{DTC date}{suggestedOn}{/DTC} by <a href="{ROOT_URL}admin/users/view/{author}">{submittedBy}</a></p>
{suggestion}
{ADMIN}
<hr>
<a href="{ROOT_URL}admin/suggestions/delete/{ID}" class="btn btn-md btn-danger" role="button">Delete</a>
<a href="{ROOT_URL}admin/suggestions/edit/{ID}" class="btn btn-md btn-warning" role="button">Edit</a>
<a href="{ROOT_URL}admin/suggestions/edit/{ID}" class="btn btn-md btn-warning" role="button"><i class="fa fa-fw fa-pencil"></i></a>
<a href="{ROOT_URL}admin/suggestions/delete/{ID}" class="btn btn-md btn-danger" role="button"><i class="fa fa-fw fa-trash"></i></a>
<hr>
{/ADMIN}
</div><!-- /.suggestions-post -->
{COMMENTS}
</div><!-- /.suggestions-main -->
</div><!-- /.row -->
</div>

View File

@ -8,8 +8,8 @@
{suggestion}
{ADMIN}
<hr>
<a href="{ROOT_URL}admin/suggestions/delete/{ID}" class="btn btn-md btn-danger" role="button">Delete</a>
<a href="{ROOT_URL}admin/suggestions/edit/{ID}" class="btn btn-md btn-warning" role="button">Edit</a>
<a href="{ROOT_URL}admin/suggestions/edit/{ID}" class="btn btn-md btn-warning" role="button"><i class="fa fa-fw fa-pencil"></i></a>
<a href="{ROOT_URL}admin/suggestions/delete/{ID}" class="btn btn-md btn-danger" role="button"><i class="fa fa-fw fa-trash"></i></a>
<hr>
{/ADMIN}
</div><!-- /.suggestions-post -->

View File

@ -28,7 +28,7 @@ class Wip extends AdminController {
public function __construct() {
parent::__construct();
self::$projects = new Projects;
self::$title = 'Admin - Projects';
self::$title = 'Admin - WIP';
$view = Navigation::activePageSelect( 'nav.admin', '/admin/wip' );
Components::set( 'ADMINNAV', $view );
}

View File

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

View File

@ -1,16 +1,48 @@
<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>
<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>
<label for="progress">Progress:</label><br>
<input type="text" id="progress" name="progress" value="{progress}" required><br><br>
<!-- 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>
<label for="startDate">Start Month/Year:</label><br>
<input type="month" id="startDate" name="startDate" value="{startDate}" required><br><br>
<!-- 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>
<label for="description">Description:</label><br>
<textarea id="description" name="description" rows="20" cols="50" required>{description}</textarea><br><br>
<!-- 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>
<input type="submit" name="submit" value="Submit">
<!-- 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>

View File

@ -1,15 +1,17 @@
<legend>Works in Progress</legend>
{PAGINATION}
<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 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%">
<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>
@ -37,5 +39,6 @@
</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>
<button name="submit" value="submit" type="submit" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></button>
</form>
</div>

View File

@ -1,8 +1,46 @@
<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 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>

View File

@ -137,19 +137,15 @@ class TheTempusProject extends Bedrock {
];
public $main_links = [
[
'text' => 'Home',
'text' => 'About',
'url' => '{ROOT_URL}home/index',
'filter' => 'notloggedin',
],
[
'text' => 'Admin',
'url' => '{ROOT_URL}admin/index',
'filter' => 'admin',
],
[
'text' => 'Extensions',
'url' => '{ROOT_URL}extensions/index',
// 'filter' => 'notloggedin',
],
];
public $filters = [
[