wip
This commit is contained in:
@ -26,6 +26,7 @@ use TheTempusProject\TheTempusProject as App;
|
|||||||
use TheTempusProject\Houdini\Classes\Components;
|
use TheTempusProject\Houdini\Classes\Components;
|
||||||
use TheTempusProject\Houdini\Classes\Forms as HoudiniForms;
|
use TheTempusProject\Houdini\Classes\Forms as HoudiniForms;
|
||||||
use TheTempusProject\Houdini\Classes\Navigation;
|
use TheTempusProject\Houdini\Classes\Navigation;
|
||||||
|
use TheTempusProject\Houdini\Classes\Template;
|
||||||
|
|
||||||
class Bookmarks extends Controller {
|
class Bookmarks extends Controller {
|
||||||
protected static $bookmarks;
|
protected static $bookmarks;
|
||||||
@ -127,8 +128,7 @@ class Bookmarks extends Controller {
|
|||||||
public function createBookmark( $id = null ) {
|
public function createBookmark( $id = null ) {
|
||||||
$folderID = Input::get('folder_id') ? Input::get('folder_id') : $id;
|
$folderID = Input::get('folder_id') ? Input::get('folder_id') : $id;
|
||||||
$folderID = Input::post('folder_id') ? Input::post('folder_id') : $id;
|
$folderID = Input::post('folder_id') ? Input::post('folder_id') : $id;
|
||||||
$folderSelect = HoudiniForms::getFormFieldHtml( 'folder_id', 'Folder', 'select', $folderID, self::$folders->simpleByUser() );
|
$this->setFolderSelect( $folderID );
|
||||||
Components::set( 'folderSelect', $folderSelect );
|
|
||||||
|
|
||||||
if ( ! Input::exists() ) {
|
if ( ! Input::exists() ) {
|
||||||
return Views::view( 'bookmarks.bookmarks.create' );
|
return Views::view( 'bookmarks.bookmarks.create' );
|
||||||
@ -172,8 +172,7 @@ class Bookmarks extends Controller {
|
|||||||
$folderID = $bookmark->folderID;
|
$folderID = $bookmark->folderID;
|
||||||
}
|
}
|
||||||
|
|
||||||
$folderSelect = HoudiniForms::getFormFieldHtml( 'folder_id', 'Folder', 'select', $folderID, self::$folders->simpleByUser() );
|
$this->setFolderSelect( $folderID );
|
||||||
Components::set( 'folderSelect', $folderSelect );
|
|
||||||
Components::set( 'color', $bookmark->color );
|
Components::set( 'color', $bookmark->color );
|
||||||
|
|
||||||
if ( ! Input::exists( 'submit' ) ) {
|
if ( ! Input::exists( 'submit' ) ) {
|
||||||
@ -227,7 +226,8 @@ class Bookmarks extends Controller {
|
|||||||
$folder = self::$folders->findById( $id );
|
$folder = self::$folders->findById( $id );
|
||||||
if ( $folder == false ) {
|
if ( $folder == false ) {
|
||||||
$folders = self::$folders->byUser();
|
$folders = self::$folders->byUser();
|
||||||
return Views::view( 'bookmarks.folders.list', $folders );
|
Components::set( 'foldersList', Views::simpleView( 'bookmarks.folders.list', $folders ) );
|
||||||
|
return Views::view( 'bookmarks.folders.listPage', $folders );
|
||||||
}
|
}
|
||||||
if ( $folder->createdBy != App::$activeUser->ID ) {
|
if ( $folder->createdBy != App::$activeUser->ID ) {
|
||||||
Session::flash( 'error', 'You do not have permission to view this folder.' );
|
Session::flash( 'error', 'You do not have permission to view this folder.' );
|
||||||
@ -241,11 +241,11 @@ class Bookmarks extends Controller {
|
|||||||
$folderID = Input::exists('folder_id') ? Input::post('folder_id') : $id;
|
$folderID = Input::exists('folder_id') ? Input::post('folder_id') : $id;
|
||||||
$folders = self::$folders->simpleByUser();
|
$folders = self::$folders->simpleByUser();
|
||||||
if ( ! empty( $folders ) ) {
|
if ( ! empty( $folders ) ) {
|
||||||
$folderSelect = HoudiniForms::getFormFieldHtml( 'folder_id', 'Folder', 'select', $folderID, $folders );
|
$this->setFolderSelect( $folderID );
|
||||||
} else {
|
} else {
|
||||||
$folderSelect = '';
|
$folderSelect = '';
|
||||||
|
Components::set( 'folderSelect', $folderSelect );
|
||||||
}
|
}
|
||||||
Components::set( 'folderSelect', $folderSelect );
|
|
||||||
if ( ! Input::exists() ) {
|
if ( ! Input::exists() ) {
|
||||||
return Views::view( 'bookmarks.folders.create' );
|
return Views::view( 'bookmarks.folders.create' );
|
||||||
}
|
}
|
||||||
@ -275,8 +275,7 @@ class Bookmarks extends Controller {
|
|||||||
}
|
}
|
||||||
$folderID = ( false === Input::exists('folder_id') ) ? $folder->ID : Input::post('folder_id');
|
$folderID = ( false === Input::exists('folder_id') ) ? $folder->ID : Input::post('folder_id');
|
||||||
|
|
||||||
$folderSelect = HoudiniForms::getFormFieldHtml( 'folder_id', 'Folder', 'select', $folderID, self::$folders->simpleByUser() );
|
$this->setFolderSelect( $folderID );
|
||||||
Components::set( 'folderSelect', $folderSelect );
|
|
||||||
Components::set( 'color', $folder->color );
|
Components::set( 'color', $folder->color );
|
||||||
|
|
||||||
if ( ! Input::exists( 'submit' ) ) {
|
if ( ! Input::exists( 'submit' ) ) {
|
||||||
@ -512,4 +511,36 @@ class Bookmarks extends Controller {
|
|||||||
}
|
}
|
||||||
return $out;
|
return $out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private function setFolderSelect( $folderID ) {
|
||||||
|
$options = self::$folders->simpleByUser();
|
||||||
|
$out = '';
|
||||||
|
$out .= '<div class="mb-3 row">';
|
||||||
|
$out .= '<label for="folder_id" class="col-lg-5 col-form-label text-end">Folder</label>';
|
||||||
|
$out .= '<div class="col-lg-3">';
|
||||||
|
$out .= '<select name="folder_id" id="folder_id" class="form-select">';
|
||||||
|
if ( isset( $options[0] ) ) {
|
||||||
|
$assocOptions = [];
|
||||||
|
foreach ( $options as $key => $value ) {
|
||||||
|
$assocOptions[$value] = $value;
|
||||||
|
}
|
||||||
|
$options = $assocOptions;
|
||||||
|
}
|
||||||
|
foreach ( $options as $fieldname => $value ) {
|
||||||
|
if ( $folderID == $value ) {
|
||||||
|
$selected = ' selected';
|
||||||
|
} else {
|
||||||
|
$selected = '';
|
||||||
|
}
|
||||||
|
$out .= '<option value="' . $value . '"' . $selected . '>' . $fieldname . '</option>';
|
||||||
|
}
|
||||||
|
$out .= '</select>';
|
||||||
|
$out .= '</div>';
|
||||||
|
$out .= '</div>';
|
||||||
|
$folderSelect = Template::parse( $out );
|
||||||
|
Components::set( 'folderSelect', $folderSelect );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,44 +1,51 @@
|
|||||||
<legend>Create Bookmark</legend>
|
<form action="" method="post" class="container py-4">
|
||||||
<form action="" method="post" class="form-horizontal">
|
<h2 class="text-center mb-4">Add Bookmark</h2>
|
||||||
<input type="hidden" name="token" value="{TOKEN}">
|
<fieldset>
|
||||||
<div class="form-group">
|
<div class="mb-3 row">
|
||||||
<label for="title" class="col-lg-3 control-label">Title</label>
|
<label for="title" class="col-lg-5 col-form-label text-end">Title</label>
|
||||||
<div class="col-lg-3">
|
<div class="col-lg-3">
|
||||||
<input type="text" class="form-control" name="title" id="title">
|
<input type="text" class="form-control" name="title" id="title" required>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="url" class="col-lg-3 control-label">URL:</label>
|
<div class="mb-3 row">
|
||||||
<div class="col-lg-3">
|
<label for="url" class="col-lg-5 col-form-label text-end">URL</label>
|
||||||
<input type="text" class="form-control" name="url" id="url">
|
<div class="col-lg-3">
|
||||||
|
<input type="text" class="form-control" name="url" id="url" required>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="description" class="col-lg-3 control-label">Description:</label>
|
<div class="mb-3 row">
|
||||||
<div class="col-lg-3">
|
<label for="title" class="col-lg-5 col-form-label text-end">Description:</label>
|
||||||
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description"></textarea>
|
<div class="col-lg-3">
|
||||||
|
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description"></textarea>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{folderSelect}
|
||||||
{folderSelect}
|
<div class="mb-3 row">
|
||||||
<div class="form-group">
|
<label for="title" class="col-lg-5 col-form-label text-end">Privacy</label>
|
||||||
<label for="privacy" class="col-lg-3 control-label">Privacy</label>
|
<div class="col-lg-3">
|
||||||
<div class="col-lg-3 select-container" id="colorContainer">
|
<select id="privacy" name="privacy" class="form-select">
|
||||||
<select id="privacy" name="privacy" class="form-control custom-select">
|
<option value="private">Private</option>
|
||||||
<option value="private">Private</option>
|
<option value="public">Public</option>
|
||||||
<option value="public">Public</option>
|
</select>
|
||||||
</select>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="mb-3 row">
|
||||||
<div class="form-group">
|
<label for="title" class="col-lg-5 col-form-label text-end">Color</label>
|
||||||
<label for="color" class="col-lg-3 control-label">Color</label>
|
<div class="col-lg-3" id="colorContainer">
|
||||||
<div class="col-lg-3 select-container" id="colorContainer">
|
{colorSelect}
|
||||||
{colorSelect}
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
<!-- Hidden Token -->
|
||||||
<label for="submit" class="col-lg-3 control-label"></label>
|
<input type="hidden" name="token" value="{TOKEN}">
|
||||||
<div class="col-lg-3">
|
|
||||||
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block ">Submit</button>
|
<!-- Submit Button -->
|
||||||
|
<div class="text-center">
|
||||||
|
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Create</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</fieldset>
|
||||||
</form>
|
</form>
|
@ -1,44 +1,51 @@
|
|||||||
<legend>Edit Bookmark</legend>
|
<form action="" method="post" class="container py-4">
|
||||||
<form action="" method="post" class="form-horizontal">
|
<h2 class="text-center mb-4">Edit Bookmark</h2>
|
||||||
<input type="hidden" name="token" value="{TOKEN}">
|
<fieldset>
|
||||||
<div class="form-group">
|
<div class="mb-3 row">
|
||||||
<label for="title" class="col-lg-3 control-label">Title</label>
|
<label for="title" class="col-lg-5 col-form-label text-end">Title</label>
|
||||||
<div class="col-lg-3">
|
<div class="col-lg-3">
|
||||||
<input type="text" class="form-control" name="title" id="title" value="{title}">
|
<input type="text" class="form-control" name="title" id="title" value="{title}" required>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="url" class="col-lg-3 control-label">URL:</label>
|
<div class="mb-3 row">
|
||||||
<div class="col-lg-3">
|
<label for="url" class="col-lg-5 col-form-label text-end">URL</label>
|
||||||
<input type="text" class="form-control" name="url" id="url" value="{url}">
|
<div class="col-lg-3">
|
||||||
|
<input type="text" class="form-control" name="url" id="url" value="{url}" required>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="description" class="col-lg-3 control-label">Description:</label>
|
<div class="mb-3 row">
|
||||||
<div class="col-lg-3">
|
<label for="title" class="col-lg-5 col-form-label text-end">Description:</label>
|
||||||
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description">{description}</textarea>
|
<div class="col-lg-3">
|
||||||
|
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description">{description}</textarea>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{folderSelect}
|
||||||
{folderSelect}
|
<div class="mb-3 row">
|
||||||
<div class="form-group">
|
<label for="title" class="col-lg-5 col-form-label text-end">Privacy</label>
|
||||||
<label for="privacy" class="col-lg-3 control-label">Privacy</label>
|
<div class="col-lg-3">
|
||||||
<div class="col-lg-3 select-container" id="colorContainer">
|
<select id="privacy" name="privacy" class="form-select" value="{privacy}">
|
||||||
<select id="privacy" name="privacy" class="form-control custom-select" value="{privacy}">
|
<option value="private">Private</option>
|
||||||
<option value="private">Private</option>
|
<option value="public">Public</option>
|
||||||
<option value="public">Public</option>
|
</select>
|
||||||
</select>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="mb-3 row">
|
||||||
<div class="form-group">
|
<label for="title" class="col-lg-5 col-form-label text-end">Color</label>
|
||||||
<label for="color" class="col-lg-3 control-label">Color</label>
|
<div class="col-lg-3" id="colorContainer">
|
||||||
<div class="col-lg-3 select-container" id="colorContainer">
|
{colorSelect}
|
||||||
{colorSelect}
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
<!-- Hidden Token -->
|
||||||
<label for="submit" class="col-lg-3 control-label"></label>
|
<input type="hidden" name="token" value="{TOKEN}">
|
||||||
<div class="col-lg-3">
|
|
||||||
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block ">Submit</button>
|
<!-- Submit Button -->
|
||||||
|
<div class="text-center">
|
||||||
|
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Save</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</fieldset>
|
||||||
</form>
|
</form>
|
@ -1,37 +1,37 @@
|
|||||||
|
|
||||||
<table class="table table-striped">
|
<table class="table context-main">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th style="width: 75%">Bookmark</th>
|
<th style="width: 75%">Bookmark</th>
|
||||||
<th style="width: 10%"></th>
|
<th style="width: 10%"></th>
|
||||||
<th style="width: 5%"></th>
|
<th style="width: 5%"></th>
|
||||||
<th style="width: 5%"></th>
|
<th style="width: 5%"></th>
|
||||||
<th style="width: 5%"></th>
|
<th style="width: 5%"></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{LOOP}
|
{LOOP}
|
||||||
<tr>
|
<tr>
|
||||||
<td style="text-align: center;">
|
<td style="text-align: center;">
|
||||||
<a href="{url}">
|
<a href="{url}">
|
||||||
{title}
|
{title}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td style="text-align: center;">
|
<td style="text-align: center;">
|
||||||
{privacy}
|
{privacy}
|
||||||
</td>
|
</td>
|
||||||
<td><a href="{ROOT_URL}bookmarks/bookmark/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-upload"></i></a></td>
|
<td><a href="{ROOT_URL}bookmarks/bookmark/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-upload"></i></a></td>
|
||||||
<td><a href="{ROOT_URL}bookmarks/editBookmark/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil-square"></i></a></td>
|
<td><a href="{ROOT_URL}bookmarks/editBookmark/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil-square"></i></a></td>
|
||||||
<td><a href="{ROOT_URL}bookmarks/deleteBookmark/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a></td>
|
<td><a href="{ROOT_URL}bookmarks/deleteBookmark/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
{/LOOP}
|
{/LOOP}
|
||||||
{ALT}
|
{ALT}
|
||||||
<tr>
|
<tr>
|
||||||
<td style="text-align: center;" colspan="6">
|
<td style="text-align: center;" colspan="6">
|
||||||
No results to show.
|
No results to show.
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{/ALT}
|
{/ALT}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<a href="{ROOT_URL}bookmarks/createBookmark" class="btn btn-sm btn-primary">Create</a>
|
<a href="{ROOT_URL}bookmarks/createBookmark" class="btn btn-sm btn-primary">Create</a>
|
8
app/plugins/bookmarks/views/bookmarks/listPage.html
Normal file
8
app/plugins/bookmarks/views/bookmarks/listPage.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="offset-md-2 col-8 py-3">
|
||||||
|
<legend class="">Bookmark List</legend>
|
||||||
|
{bookmarksList}
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -1,84 +1,120 @@
|
|||||||
{BookmarkBreadCrumbs}<br />
|
|
||||||
<div class="container col-md-4 col-lg-4">
|
|
||||||
<div class="row">
|
|
||||||
<div class="card panel-{color}">
|
|
||||||
<div class="card-header">
|
|
||||||
<h3 class="card-title">Bookmark</h3>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="">
|
|
||||||
<table class="table table-user-primary">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td align="left" width="200"><b>Title</b></td>
|
|
||||||
<td align="right">{title}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<div class="container py-4">
|
||||||
<td align="left" width="200"><b>URL</b></td>
|
<div class="row justify-content-center">
|
||||||
<td align="right">{url}</td>
|
<div class="col-md-8">
|
||||||
</tr>
|
<div class="card shadow">
|
||||||
<tr>
|
<!-- Card Header -->
|
||||||
<td align="left" width="200"><b>Type</b></td>
|
<div class="card-header text-center bg-dark text-white">
|
||||||
<td align="right">{linkType}</td>
|
<h3 class="card-title mb-0">Bookmark</h3>
|
||||||
</tr>
|
</div>
|
||||||
<tr>
|
|
||||||
<td align="left" width="200"><b>Privacy</b></td>
|
<!-- Card Body -->
|
||||||
<td align="right">{privacy}</td>
|
<div class="card-body">
|
||||||
</tr>
|
<div class="row align-items-center">
|
||||||
<tr>
|
|
||||||
<td align="left" width="200"><b>Color</b></td>
|
<!-- User Details -->
|
||||||
<td align="right">{color}</td>
|
<div class="offset-md-2 col-md-8">
|
||||||
</tr>
|
<table class="table table-borderless">
|
||||||
<tr>
|
<tbody>
|
||||||
<td align="center" colspan="2"><b>Description</b></td>
|
<tr>
|
||||||
</tr>
|
<th scope="row">Title:</th>
|
||||||
<tr>
|
<td>{title}</td>
|
||||||
<td colspan="2">{description}</td>
|
</tr>
|
||||||
</tr>
|
<tr>
|
||||||
<tr>
|
<th scope="row">URL:</th>
|
||||||
<td align="center" colspan="2"><b>Icon</b></td>
|
<td>{url}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2">{iconHtml}</td>
|
<th scope="row">Type:</th>
|
||||||
</tr>
|
<td>{linkType}</td>
|
||||||
<tr>
|
</tr>
|
||||||
<td colspan="2">{icon}</td>
|
<tr>
|
||||||
</tr>
|
<th scope="row">Privacy:</th>
|
||||||
<tr>
|
<td>{privacy}</td>
|
||||||
<td align="center" colspan="2"><b>Meta</b></td>
|
</tr>
|
||||||
</tr>
|
<tr>
|
||||||
<tr>
|
<th scope="row">Color:</th>
|
||||||
<td colspan="2">{meta}</td>
|
<td>{color}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>Created</b></td>
|
<th scope="row">Created:</th>
|
||||||
<td align="right">{DTC}{createdAt}{/DTC}</td>
|
<td>{DTC}{createdAt}{/DTC}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>Archived</b></td>
|
<th scope="row">Archived:</th>
|
||||||
<td align="right">{DTC}{archivedAt}{/DTC}</td>
|
<td>{DTC}{archivedAt}{/DTC}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>Hidden</b></td>
|
<th scope="row">Hidden:</th>
|
||||||
<td align="right">{DTC}{hiddenAt}{/DTC}</td>
|
<td>{DTC}{hiddenAt}{/DTC}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>Last Refreshed</b></td>
|
<th scope="row">Last Refreshed:</th>
|
||||||
<td align="right">{DTC}{refreshedAt}{/DTC}</td>
|
<td>{DTC}{refreshedAt}{/DTC}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
<tr>
|
||||||
</table>
|
<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 class="card-footer">
|
<!-- Admin Controls -->
|
||||||
{refreshBtn}
|
<div class="card-footer text-center">
|
||||||
{hideBtn}
|
{refreshBtn}
|
||||||
{archiveBtn}
|
{hideBtn}
|
||||||
<a href="{ROOT_URL}bookmarks/editBookmark/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil-square"></i></a>
|
{archiveBtn}
|
||||||
<a href="{ROOT_URL}bookmarks/deleteBookmark/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a>
|
<a href="{ROOT_URL}bookmarks/editBookmark/{ID}" class="btn btn-warning btn-sm me-2" data-bs-toggle="tooltip" title="Edit Bookmark">
|
||||||
|
<i class="fa fa-pencil-square"></i> Edit
|
||||||
|
</a>
|
||||||
|
<a href="{ROOT_URL}bookmarks/deleteBookmark/{ID}" class="btn btn-danger btn-sm" data-bs-toggle="tooltip" title="Delete Bookmark">
|
||||||
|
<i class="fa fa-trash"></i> Delete
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,15 +1,17 @@
|
|||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xlg-6 col-lg-6 col-md-6 col-sm-6">
|
<div class="offset-md-2 col-4 py-3">
|
||||||
<legend style="margin-top: 20px; margin-bottom: 10px;">Unsorted Bookmarks</legend>
|
<legend class="">Unsorted Bookmarks</legend>
|
||||||
{bookmarksList}
|
{bookmarksList}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xlg-6 col-lg-6 col-md-6 col-sm-6">
|
<div class="col-4 py-3">
|
||||||
<legend style="margin-top: 20px; margin-bottom: 10px;">Folders List</legend>
|
<legend class="">Folders List</legend>
|
||||||
{foldersList}
|
{foldersList}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<legend style="margin-top: 20px; margin-bottom: 10px;">Folders</legend>
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{folderPanels}
|
<div class="offset-md-2 col-8 py-3">
|
||||||
|
<legend class="">Bookmarks</legend>
|
||||||
|
{folderPanels}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
@ -1,38 +1,41 @@
|
|||||||
<legend>Create Folder</legend>
|
<form action="" method="post" class="container py-4">
|
||||||
<form action="" method="post" class="form-horizontal">
|
<h2 class="text-center mb-4">Create Folder</h2>
|
||||||
<input type="hidden" name="token" value="{TOKEN}">
|
<fieldset>
|
||||||
<div class="form-group">
|
<div class="mb-3 row">
|
||||||
<label for="title" class="col-lg-3 control-label">Title</label>
|
<label for="title" class="col-lg-5 col-form-label text-end">Title</label>
|
||||||
<div class="col-lg-3">
|
<div class="col-lg-3">
|
||||||
<input type="text" class="form-control" name="title" id="title">
|
<input type="text" class="form-control" name="title" id="title" required>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="mb-3 row">
|
||||||
<div class="form-group">
|
<label for="title" class="col-lg-5 col-form-label text-end">Description:</label>
|
||||||
<label for="description" class="col-lg-3 control-label">Description:</label>
|
<div class="col-lg-3">
|
||||||
<div class="col-lg-3">
|
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description"></textarea>
|
||||||
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description"></textarea>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{folderSelect}
|
||||||
{folderSelect}
|
<div class="mb-3 row">
|
||||||
<div class="form-group">
|
<label for="title" class="col-lg-5 col-form-label text-end">Privacy</label>
|
||||||
<label for="privacy" class="col-lg-3 control-label">Privacy</label>
|
<div class="col-lg-3">
|
||||||
<div class="col-lg-3 select-container" id="colorContainer">
|
<select id="privacy" name="privacy" class="form-select">
|
||||||
<select id="privacy" name="privacy" class="form-control custom-select">
|
<option value="private">Private</option>
|
||||||
<option value="private">Private</option>
|
<option value="public">Public</option>
|
||||||
<option value="public">Public</option>
|
</select>
|
||||||
</select>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="mb-3 row">
|
||||||
<div class="form-group">
|
<label for="title" class="col-lg-5 col-form-label text-end">Color</label>
|
||||||
<label for="color" class="col-lg-3 control-label">Color</label>
|
<div class="col-lg-3">
|
||||||
<div class="col-lg-3 select-container" id="colorContainer">
|
{colorSelect}
|
||||||
{colorSelect}
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
<!-- Hidden Token -->
|
||||||
<label for="submit" class="col-lg-3 control-label"></label>
|
<input type="hidden" name="token" value="{TOKEN}">
|
||||||
<div class="col-lg-3">
|
|
||||||
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block ">Submit</button>
|
<!-- Submit Button -->
|
||||||
|
<div class="text-center">
|
||||||
|
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Create</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</fieldset>
|
||||||
</form>
|
</form>
|
@ -1,38 +1,43 @@
|
|||||||
<legend>Edit Folder</legend>
|
|
||||||
<form action="" method="post" class="form-horizontal">
|
|
||||||
<input type="hidden" name="token" value="{TOKEN}">
|
<form action="" method="post" class="container py-4">
|
||||||
<div class="form-group">
|
<h2 class="text-center mb-4">Edit Folder</h2>
|
||||||
<label for="title" class="col-lg-3 control-label">Title</label>
|
<fieldset>
|
||||||
<div class="col-lg-3">
|
<div class="mb-3 row">
|
||||||
<input type="text" class="form-control" name="title" id="title" value="{title}">
|
<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>
|
||||||
</div>
|
<div class="mb-3 row">
|
||||||
<div class="form-group">
|
<label for="title" class="col-lg-5 col-form-label text-end">Description:</label>
|
||||||
<label for="description" class="col-lg-3 control-label">Description:</label>
|
<div class="col-lg-3">
|
||||||
<div class="col-lg-3">
|
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description">{description}</textarea>
|
||||||
<textarea class="form-control" name="description" maxlength="2000" rows="10" cols="50" id="description">{description}</textarea>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{folderSelect}
|
||||||
{folderSelect}
|
<div class="mb-3 row">
|
||||||
<div class="form-group">
|
<label for="title" class="col-lg-5 col-form-label text-end">Privacy</label>
|
||||||
<label for="privacy" class="col-lg-3 control-label">Privacy</label>
|
<div class="col-lg-3">
|
||||||
<div class="col-lg-3 select-container" id="colorContainer">
|
<select id="privacy" name="privacy" class="form-select" value="{privacy}">
|
||||||
<select id="privacy" name="privacy" class="form-control custom-select" value="{privacy}">
|
<option value="private">Private</option>
|
||||||
<option value="private">Private</option>
|
<option value="public">Public</option>
|
||||||
<option value="public">Public</option>
|
</select>
|
||||||
</select>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="mb-3 row">
|
||||||
<div class="form-group">
|
<label for="title" class="col-lg-5 col-form-label text-end">Color</label>
|
||||||
<label for="color" class="col-lg-3 control-label">Color</label>
|
<div class="col-lg-3">
|
||||||
<div class="col-lg-3 select-container" id="colorContainer">
|
{colorSelect}
|
||||||
{colorSelect}
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
<!-- Hidden Token -->
|
||||||
<label for="submit" class="col-lg-3 control-label"></label>
|
<input type="hidden" name="token" value="{TOKEN}">
|
||||||
<div class="col-lg-3">
|
|
||||||
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block ">Submit</button>
|
<!-- Submit Button -->
|
||||||
|
<div class="text-center">
|
||||||
|
<button type="submit" name="submit" value="submit" class="btn btn-primary btn-lg">Save</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</fieldset>
|
||||||
</form>
|
</form>
|
@ -1,33 +1,33 @@
|
|||||||
|
|
||||||
<table class="table table-striped">
|
<table class="table context-main">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th style="width: 35%">Title</th>
|
<th style="width: 35%">Title</th>
|
||||||
<th style="width: 20%">Privacy</th>
|
<th style="width: 20%">Privacy</th>
|
||||||
<th style="width: 30%">Description</th>
|
<th style="width: 30%">Description</th>
|
||||||
<th style="width: 5%"></th>
|
<th style="width: 5%"></th>
|
||||||
<th style="width: 5%"></th>
|
<th style="width: 5%"></th>
|
||||||
<th style="width: 5%"></th>
|
<th style="width: 5%"></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{LOOP}
|
{LOOP}
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center">{title}</td>
|
<td class="text-center">{title}</td>
|
||||||
<td align="center">{privacy}</td>
|
<td class="text-center">{privacy}</td>
|
||||||
<td>{description}</td>
|
<td>{description}</td>
|
||||||
<td><a href="{ROOT_URL}bookmarks/folders/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-info-circle"></i></a></td>
|
<td><a href="{ROOT_URL}bookmarks/folders/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-info-circle"></i></a></td>
|
||||||
<td><a href="{ROOT_URL}bookmarks/editFolder/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil-square"></i></a></td>
|
<td><a href="{ROOT_URL}bookmarks/editFolder/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil-square"></i></a></td>
|
||||||
<td><a href="{ROOT_URL}bookmarks/deleteFolder/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a></td>
|
<td><a href="{ROOT_URL}bookmarks/deleteFolder/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
{/LOOP}
|
{/LOOP}
|
||||||
{ALT}
|
{ALT}
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" colspan="7">
|
<td class="text-center context-main" colspan="7">
|
||||||
No results to show.
|
No results to show.
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{/ALT}
|
{/ALT}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<a href="{ROOT_URL}bookmarks/createFolder" class="btn btn-sm btn-primary">Create</a>
|
<a href="{ROOT_URL}bookmarks/createFolder" class="btn btn-sm btn-primary">Create</a>
|
7
app/plugins/bookmarks/views/folders/listPage.html
Normal file
7
app/plugins/bookmarks/views/folders/listPage.html
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="offset-md-2 col-8 py-3">
|
||||||
|
<legend class="">Folders List</legend>
|
||||||
|
{foldersList}
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -1,47 +1,79 @@
|
|||||||
{BookmarkBreadCrumbs}<br />
|
|
||||||
<div class="container col-md-4 col-lg-4">
|
|
||||||
<div class="row">
|
|
||||||
<div class="card panel-{color}">
|
|
||||||
<div class="card-header">
|
|
||||||
<h3 class="card-title">Bookmark Folder</h3>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="">
|
|
||||||
<table class="table table-user-primary">
|
<div class="container py-4">
|
||||||
<tbody>
|
<div class="row justify-content-center">
|
||||||
<tr>
|
<div class="col-md-8">
|
||||||
<td align="left" width="200"><b>Title</b></td>
|
<div class="card shadow">
|
||||||
<td align="right">{title}</td>
|
<!-- Card Header -->
|
||||||
</tr>
|
<div class="card-header text-center bg-dark text-white">
|
||||||
<tr>
|
<h3 class="card-title mb-0">Bookmark Folder</h3>
|
||||||
<td align="left" width="200"><b>Privacy</b></td>
|
</div>
|
||||||
<td align="right">{privacy}</td>
|
|
||||||
</tr>
|
<!-- Card Body -->
|
||||||
<tr>
|
<div class="card-body">
|
||||||
<td align="left" width="200"><b>Color</b></td>
|
<div class="row align-items-center">
|
||||||
<td align="right">{color}</td>
|
|
||||||
</tr>
|
<!-- User Details -->
|
||||||
<tr>
|
<div class="offset-md-2 col-md-8">
|
||||||
<td align="center" colspan="2"><b>Description</b></td>
|
<table class="table table-borderless">
|
||||||
</tr>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2">{description}</td>
|
<th scope="row">Title:</th>
|
||||||
</tr>
|
<td>{title}</td>
|
||||||
<tr>
|
</tr>
|
||||||
<td><b>Created</b></td>
|
<tr>
|
||||||
<td align="right">{DTC}{createdAt}{/DTC}</td>
|
<th scope="row">Privacy:</th>
|
||||||
</tr>
|
<td>{privacy}</td>
|
||||||
</tbody>
|
</tr>
|
||||||
</table>
|
<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" colspan="2">Description</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="2">{description}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="card-footer">
|
<!-- Admin Controls -->
|
||||||
<a href="{ROOT_URL}bookmarks/bookmarks/{ID}" class="btn btn-sm btn-primary"><i class="fa fa-fw fa-list"></i></a>
|
<div class="card-footer text-center">
|
||||||
<a href="{ROOT_URL}bookmarks/editFolder/{ID}" class="btn btn-sm btn-warning"><i class="fa fa-fw fa-pencil-square"></i></a>
|
<a href="{ROOT_URL}bookmarks/bookmarks/{ID}" class="btn btn-primary btn-sm me-2" data-bs-toggle="tooltip" title="Broadcast Message">
|
||||||
<a href="{ROOT_URL}bookmarks/deleteFolder/{ID}" class="btn btn-sm btn-danger"><i class="fa fa-fw fa-trash"></i></a>
|
<i class="fa fa-list"></i> Bookmarks
|
||||||
|
</a>
|
||||||
|
<a href="{ROOT_URL}bookmarks/editFolder/{ID}" class="btn btn-warning btn-sm me-2" data-bs-toggle="tooltip" title="Edit User">
|
||||||
|
<i class="fa fa-pencil-square"></i> Edit
|
||||||
|
</a>
|
||||||
|
<a href="{ROOT_URL}bookmarks/deleteFolder/{ID}" class="btn btn-danger btn-sm" data-bs-toggle="tooltip" title="Delete User">
|
||||||
|
<i class="fa fa-trash"></i> Delete
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,16 +1,18 @@
|
|||||||
<legend style="margin-top: 20px; margin-bottom: 10px;">Import Bookmarks</legend>
|
<div class="col-4 offset-md-4 py-3">
|
||||||
<form action="" method="post" enctype="multipart/form-data" class="form-horizontal">
|
<legend class="">Import Bookmarks</legend>
|
||||||
<div class="form-group">
|
<form action="" method="post" enctype="multipart/form-data" class="form-horizontal">
|
||||||
<label for="bookmark_file" class="col-lg-3 control-label">Export file (.html):</label>
|
<div class="form-group">
|
||||||
<div class="col-lg-3">
|
<label for="bookmark_file" class="col-lg-3 control-label">Export file (.html):</label>
|
||||||
<input type="file" name="bookmark_file" id="bookmark_file" accept=".html">
|
<div class="col-lg-3">
|
||||||
|
<input type="file" name="bookmark_file" id="bookmark_file" accept=".html">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="submit" class="col-lg-3 control-label"></label>
|
<label for="submit" class="col-lg-3 control-label"></label>
|
||||||
<div class="col-lg-3">
|
<div class="col-lg-3">
|
||||||
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block ">Import</button>
|
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block ">Import</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</form>
|
||||||
</form>
|
</div>
|
@ -1,6 +1,6 @@
|
|||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs justify-content-center" role="tablist">
|
||||||
<li><a href="{ROOT_URL}bookmarks/index/" class="nav-link">Dashboard</a></li>
|
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/index/" class="nav-link">Dashboard</a></li>
|
||||||
<li><a href="{ROOT_URL}bookmarks/folders/" class="nav-link">Folders</a></li>
|
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/folders/" class="nav-link">Folders</a></li>
|
||||||
<li><a href="{ROOT_URL}bookmarks/import/" class="nav-link">Import</a></li>
|
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/import/" class="nav-link">Import</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
{userFolderTabs}
|
{userFolderTabs}
|
@ -1,9 +1,9 @@
|
|||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs justify-content-center" role="tablist">
|
||||||
<li><a href="{ROOT_URL}bookmarks/folders/" class="nav-link">All</a></li>
|
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/folders/" class="nav-link">All</a></li>
|
||||||
{LOOP}
|
{LOOP}
|
||||||
<li><a href="{ROOT_URL}bookmarks/bookmarks/{ID}" class="nav-link">{title}</a></li>
|
<li class="nav-item context-main-bg mx-1"><a href="{ROOT_URL}bookmarks/bookmarks/{ID}" class="nav-link">{title}</a></li>
|
||||||
{/LOOP}
|
{/LOOP}
|
||||||
{ALT}
|
{ALT}
|
||||||
<li></li>
|
<li class="nav-item context-main-bg mx-1"></li>
|
||||||
{/ALT}
|
{/ALT}
|
||||||
</ul>
|
</ul>
|
@ -14,7 +14,7 @@ namespace TheTempusProject\Controllers\Api;
|
|||||||
use Stripe\StripeClient;
|
use Stripe\StripeClient;
|
||||||
use Stripe\Event;
|
use Stripe\Event;
|
||||||
use TheTempusProject\Models\User;
|
use TheTempusProject\Models\User;
|
||||||
use TheTempusProject\Controllers\ApiController;
|
use TheTempusProject\Classes\ApiController;
|
||||||
use TheTempusProject\Houdini\Classes\Views;
|
use TheTempusProject\Houdini\Classes\Views;
|
||||||
use TheTempusProject\Bedrock\Classes\Config;
|
use TheTempusProject\Bedrock\Classes\Config;
|
||||||
use TheTempusProject\Canary\Bin\Canary as Debug;
|
use TheTempusProject\Canary\Bin\Canary as Debug;
|
||||||
@ -178,7 +178,7 @@ class Stripe extends ApiController {
|
|||||||
$response = 'UnexpectedValueException';
|
$response = 'UnexpectedValueException';
|
||||||
} catch(\Exception $e) {
|
} catch(\Exception $e) {
|
||||||
Debug::error( 'Exception' );
|
Debug::error( 'Exception' );
|
||||||
Debug::v( $e );
|
Debug::error( $e );
|
||||||
http_response_code(400);
|
http_response_code(400);
|
||||||
$responseType = 'error';
|
$responseType = 'error';
|
||||||
$response = 'Exception';
|
$response = 'Exception';
|
||||||
|
@ -27,6 +27,9 @@ use TheTempusProject\Hermes\Functions\Route as Routes;
|
|||||||
use TheTempusProject\Houdini\Classes\Navigation;
|
use TheTempusProject\Houdini\Classes\Navigation;
|
||||||
use TheTempusProject\Models\Memberships;
|
use TheTempusProject\Models\Memberships;
|
||||||
use TheTempusProject\Houdini\Classes\Components;
|
use TheTempusProject\Houdini\Classes\Components;
|
||||||
|
use TheTempusProject\Classes\Forms;
|
||||||
|
use TheTempusProject\Bedrock\Functions\Hash;
|
||||||
|
use TheTempusProject\Canary\Bin\Canary as Debug;
|
||||||
|
|
||||||
class Member extends Controller {
|
class Member extends Controller {
|
||||||
public static $customers;
|
public static $customers;
|
||||||
@ -61,10 +64,17 @@ class Member extends Controller {
|
|||||||
Session::flash( 'error', 'You do not have any active payment methods. You can subscribe by going <a href="/member/join/1">here</a>' );
|
Session::flash( 'error', 'You do not have any active payment methods. You can subscribe by going <a href="/member/join/1">here</a>' );
|
||||||
return Redirect::to( 'member/manage' );
|
return Redirect::to( 'member/manage' );
|
||||||
}
|
}
|
||||||
$session = $stripe->billingPortal->sessions->create([
|
try {
|
||||||
'customer' => $customer,
|
$session = $stripe->billingPortal->sessions->create([
|
||||||
'return_url' => Routes::getAddress() . 'member/manage',
|
'customer' => $customer,
|
||||||
]);
|
'return_url' => Routes::getAddress() . 'member/manage',
|
||||||
|
]);
|
||||||
|
} catch (\Stripe\Exception\InvalidRequestException $e) {
|
||||||
|
Debug::error('Membership -> ManagePayment - Stripe not configured correctly');
|
||||||
|
Debug::error( $e );
|
||||||
|
Session::flash( 'error', 'There was an issue redirecting you to Stripe, please try again.' );
|
||||||
|
return Redirect::to( 'member/manage' );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -147,16 +157,6 @@ class Member extends Controller {
|
|||||||
Views::view( 'members.landing1', $product );
|
Views::view( 'members.landing1', $product );
|
||||||
}
|
}
|
||||||
|
|
||||||
public function signup( $id = null ) {
|
|
||||||
self::$title = 'Sign-up for {SIITENAME}!';
|
|
||||||
$product = self::$products->findById( $id );
|
|
||||||
if ( empty( $product ) ) {
|
|
||||||
Session::flash( 'success', 'We aren\'t currently accepting new members, please check back soon!' );
|
|
||||||
return Redirect::home();
|
|
||||||
}
|
|
||||||
Views::view( 'members.landing2', $product );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getyearly( $id = null ) {
|
public function getyearly( $id = null ) {
|
||||||
if ( empty( $id ) ) {
|
if ( empty( $id ) ) {
|
||||||
Issues::add( 'error', 'no id' );
|
Issues::add( 'error', 'no id' );
|
||||||
@ -236,4 +236,82 @@ class Member extends Controller {
|
|||||||
self::$title = '(almost) Members Area';
|
self::$title = '(almost) Members Area';
|
||||||
Views::view( 'members.paymentcomplete' );
|
Views::view( 'members.paymentcomplete' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public function signup( $plan = 'monthly' ) {
|
||||||
|
$plan = strtolower( $plan );
|
||||||
|
if ( ! in_array( $plan, ['monthly','yearly'] ) ) {
|
||||||
|
Session::flash( 'error', 'Unknown plan' );
|
||||||
|
return Redirect::to( 'home/index' );
|
||||||
|
}
|
||||||
|
|
||||||
|
$product = self::$products->mainProduct();
|
||||||
|
if ( empty( $product ) ) {
|
||||||
|
Session::flash( 'error', 'Unknown product' );
|
||||||
|
return Redirect::to( 'home/index' );
|
||||||
|
}
|
||||||
|
|
||||||
|
$index = 'stripe_price_' . $plan;
|
||||||
|
$pretty = 'prettyPrice' . ucfirst( $plan );
|
||||||
|
|
||||||
|
$stripePrice = $product->$index;
|
||||||
|
$prettyPrice = $product->$pretty;
|
||||||
|
|
||||||
|
self::$title = 'Sign up for {SITENAME} ' . ucfirst( $plan );
|
||||||
|
|
||||||
|
Components::set( 'planName', ucfirst( $plan ) );
|
||||||
|
Components::set( 'prettyPrice', $prettyPrice );
|
||||||
|
Components::set( 'TERMS', Views::simpleView( 'terms' ) );
|
||||||
|
if ( App::$isLoggedIn ) {
|
||||||
|
Session::flash( 'notice', 'You are already logged in, were you looking for information on <a href="#">Upgrading</a>?' );
|
||||||
|
return Redirect::to( 'home/index' );
|
||||||
|
}
|
||||||
|
if ( !Input::exists() ) {
|
||||||
|
return Views::view( 'members.register' );
|
||||||
|
}
|
||||||
|
if ( ! Forms::check( 'register' ) ) {
|
||||||
|
Issues::add( 'error', [ 'There was an error with your registration.' => Check::userErrors() ] );
|
||||||
|
return Views::view( 'members.register' );
|
||||||
|
}
|
||||||
|
self::$user->create( [
|
||||||
|
'username' => Input::post( 'username' ),
|
||||||
|
'password' => Hash::make( Input::post( 'password' ) ),
|
||||||
|
'email' => Input::post( 'email' ),
|
||||||
|
'terms' => 1,
|
||||||
|
] );
|
||||||
|
|
||||||
|
if ( !self::$user->logIn( Input::post( 'username' ), Input::post( 'password' ), Input::post( 'remember' ) ) ) {
|
||||||
|
Session::flash( 'error', 'Thank you for registering! Unfortunately, there was an issue logging you in, please log in and order again.' );
|
||||||
|
return Redirect::to( 'home/index' );
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = self::$user->authorize( Input::post( 'username' ), Input::post( 'password' ) );
|
||||||
|
|
||||||
|
$customer = self::$customers->findOrCreate( $user->ID );
|
||||||
|
if ( empty( $customer ) ) {
|
||||||
|
Session::flash( 'error', 'Thank you for registering! Unfortunately, there was an issue communicating with Stripe and we can\'t collect payment right now.' );
|
||||||
|
return Redirect::to( 'home/index' );
|
||||||
|
}
|
||||||
|
|
||||||
|
$api_key = Config::getValue( 'memberships/stripeSecret' );
|
||||||
|
$stripe = new \Stripe\StripeClient( $api_key );
|
||||||
|
$session = $stripe->checkout->sessions->create([
|
||||||
|
'payment_method_types' => ['card'],
|
||||||
|
'customer' => $customer,
|
||||||
|
'line_items' => [[
|
||||||
|
'price' => $stripePrice,
|
||||||
|
'quantity' => 1,
|
||||||
|
]],
|
||||||
|
'mode' => 'subscription',
|
||||||
|
'success_url' => Routes::getAddress() . 'member/paymentcomplete?session_id={CHECKOUT_SESSION_ID}',
|
||||||
|
'cancel_url' => Routes::getAddress() . 'member/paymentcanceled',
|
||||||
|
]);
|
||||||
|
header('Location: ' . $session->url);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
}
|
}
|
@ -36,9 +36,6 @@ class MembershipProducts extends DatabaseModel {
|
|||||||
|
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if ( ! self::$loaded ) {
|
if ( ! self::$loaded ) {
|
||||||
$api_key = Config::getValue( 'memberships/stripeSecret' );
|
$api_key = Config::getValue( 'memberships/stripeSecret' );
|
||||||
if ( $api_key == 'sk_xxxxxxxxxxxxxxx' || empty($api_key) ) {
|
if ( $api_key == 'sk_xxxxxxxxxxxxxxx' || empty($api_key) ) {
|
||||||
@ -48,8 +45,6 @@ class MembershipProducts extends DatabaseModel {
|
|||||||
}
|
}
|
||||||
self::$loaded = true;
|
self::$loaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function create( $name, $description, $monthly_price, $yearly_price ) {
|
public function create( $name, $description, $monthly_price, $yearly_price ) {
|
||||||
@ -88,12 +83,14 @@ class MembershipProducts extends DatabaseModel {
|
|||||||
]);
|
]);
|
||||||
return $product;
|
return $product;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function createStripePrices( $product, $monthly_price, $yearly_price ) {
|
public function createStripePrices( $product, $monthly_price, $yearly_price ) {
|
||||||
$out = [];
|
$out = [];
|
||||||
$out['monthly'] = $this->createStripeMonthlyPrice( $product, $monthly_price );
|
$out['monthly'] = $this->createStripeMonthlyPrice( $product, $monthly_price );
|
||||||
$out['yearly'] = $this->createStripeYearlyPrice( $product, $yearly_price );
|
$out['yearly'] = $this->createStripeYearlyPrice( $product, $yearly_price );
|
||||||
return $out;
|
return $out;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function createStripeMonthlyPrice( $product, $monthly_price ) {
|
public function createStripeMonthlyPrice( $product, $monthly_price ) {
|
||||||
if ( empty( self::$stripe ) ) {
|
if ( empty( self::$stripe ) ) {
|
||||||
return false;
|
return false;
|
||||||
@ -106,6 +103,7 @@ class MembershipProducts extends DatabaseModel {
|
|||||||
'lookup_key' => 'membership-monthly',
|
'lookup_key' => 'membership-monthly',
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function createStripeYearlyPrice( $product, $yearly_price ) {
|
public function createStripeYearlyPrice( $product, $yearly_price ) {
|
||||||
if ( empty( self::$stripe ) ) {
|
if ( empty( self::$stripe ) ) {
|
||||||
return false;
|
return false;
|
||||||
@ -173,6 +171,7 @@ class MembershipProducts extends DatabaseModel {
|
|||||||
);
|
);
|
||||||
return $this->createStripeYearlyPrice( $product, $yearly_price );
|
return $this->createStripeYearlyPrice( $product, $yearly_price );
|
||||||
}
|
}
|
||||||
|
|
||||||
public function updateStripeMonthlyPrice( $product, $monthly_price ) {
|
public function updateStripeMonthlyPrice( $product, $monthly_price ) {
|
||||||
$stripe->prices->update(
|
$stripe->prices->update(
|
||||||
$monthly->id,
|
$monthly->id,
|
||||||
@ -206,10 +205,18 @@ class MembershipProducts extends DatabaseModel {
|
|||||||
|
|
||||||
public function findByPriceID( $d ) {
|
public function findByPriceID( $d ) {
|
||||||
$data = self::$db->get( $this->tableName, [ 'stripe_price_monthly', '=', $d, 'OR', 'stripe_price_yearly', '=', $d ] );
|
$data = self::$db->get( $this->tableName, [ 'stripe_price_monthly', '=', $d, 'OR', 'stripe_price_yearly', '=', $d ] );
|
||||||
|
|
||||||
if ( ! $data->count() ) {
|
if ( ! $data->count() ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return $data->first();
|
return $data->first();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function mainProduct() {
|
||||||
|
$data = self::$db->get( $this->tableName, '*' );
|
||||||
|
if ( ! $data->count() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->filter( $data->first() );
|
||||||
|
}
|
||||||
}
|
}
|
@ -2,7 +2,7 @@
|
|||||||
<div class="row justify-content-center">
|
<div class="row justify-content-center">
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
<legend>Memberships</legend>
|
<legend>Memberships</legend>
|
||||||
<table class="table table-striped text-center">
|
<table class="table text-center context-main">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th style="width: 25%">Name</th>
|
<th style="width: 25%">Name</th>
|
||||||
|
69
app/plugins/members/views/register.html
Normal file
69
app/plugins/members/views/register.html
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<form action="" method="post" class="container py-4">
|
||||||
|
<h2 class="text-center mb-4">Create an Account</h2>
|
||||||
|
<p class="text-center">After registration is complete, you will be redirected to Stripe to handle payment.</p>
|
||||||
|
<p class="text-center">
|
||||||
|
You have selected the <strong>{planName}</strong> plan at <em>{prettyPrice}</em>.
|
||||||
|
</p>
|
||||||
|
<fieldset>
|
||||||
|
<!-- Username -->
|
||||||
|
<div class="mb-3 row">
|
||||||
|
<label for="username" class="col-lg-6 col-form-label text-end">Username:</label>
|
||||||
|
<div class="col-lg-2">
|
||||||
|
<input type="text" class="form-control" name="username" id="username" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Email -->
|
||||||
|
<div class="mb-3 row">
|
||||||
|
<label for="email" class="col-lg-6 col-form-label text-end">Email:</label>
|
||||||
|
<div class="col-lg-2">
|
||||||
|
<input type="email" class="form-control" name="email" id="email" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Re-enter Email -->
|
||||||
|
<div class="mb-3 row">
|
||||||
|
<label for="email2" class="col-lg-6 col-form-label text-end">Re-Enter Email:</label>
|
||||||
|
<div class="col-lg-2">
|
||||||
|
<input type="email" class="form-control" name="email2" id="email2" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Password -->
|
||||||
|
<div class="mb-3 row">
|
||||||
|
<label for="password" class="col-lg-6 col-form-label text-end">Password:</label>
|
||||||
|
<div class="col-lg-2">
|
||||||
|
<input type="password" class="form-control" name="password" id="password" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Re-enter Password -->
|
||||||
|
<div class="mb-3 row">
|
||||||
|
<label for="password2" class="col-lg-6 col-form-label text-end">Re-Enter Password:</label>
|
||||||
|
<div class="col-lg-2">
|
||||||
|
<input type="password" class="form-control" name="password2" id="password2" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Terms of Service -->
|
||||||
|
<div class="mb-3 text-center">
|
||||||
|
<div class="">
|
||||||
|
<input type="checkbox" class="form-check-input" name="terms" id="terms" value="1" required>
|
||||||
|
<label for="terms" class="form-check-label">
|
||||||
|
I have read and agree to the <a href="/home/terms" class="text-primary">Terms of Service</a>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="terms mt-2 mx-auto">
|
||||||
|
{TERMS}
|
||||||
|
</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">Sign up</button>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
@ -96,7 +96,7 @@
|
|||||||
<div class="col-lg-6 mx-auto">
|
<div class="col-lg-6 mx-auto">
|
||||||
<p class="fs-5 mb-4">Not everyone is a night owl or dark dweller, and those people are... fine. But for the rest of us, dark mode rules them all. Dark mode is available site-wide, free of charge! (Its also included in all products!)</p>
|
<p class="fs-5 mb-4">Not everyone is a night owl or dark dweller, and those people are... fine. But for the rest of us, dark mode rules them all. Dark mode is available site-wide, free of charge! (Its also included in all products!)</p>
|
||||||
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center">
|
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center">
|
||||||
<button type="button" class="btn btn-outline-light btn-lg px-4">Enable Now</button>
|
<button type="button" class="btn btn-outline-light btn-lg px-4" id="dark-mode-toggle-button">Enable Now</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -321,7 +321,9 @@
|
|||||||
<li>Direct control of Feature Development</li>
|
<li>Direct control of Feature Development</li>
|
||||||
<li>Early Access to new features</li>
|
<li>Early Access to new features</li>
|
||||||
</ul>
|
</ul>
|
||||||
<button type="button" class="mt-auto w-100 btn btn-lg btn-primary">Get started</button>
|
<a href="/member/signup/monthly" class="mt-auto w-100 btn btn-lg btn-primary">
|
||||||
|
Get started
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -335,7 +337,9 @@
|
|||||||
<ul class="list-unstyled mt-3 mb-4">
|
<ul class="list-unstyled mt-3 mb-4">
|
||||||
<li>Its cheaper if you like the product</li>
|
<li>Its cheaper if you like the product</li>
|
||||||
</ul>
|
</ul>
|
||||||
<button type="button" class="mt-auto w-100 btn btn-lg btn-primary">Get started</button>
|
<a href="/member/signup/yearly" class="mt-auto w-100 btn btn-lg btn-primary">
|
||||||
|
Get started
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Reference in New Issue
Block a user