Compare commits

..

2 Commits
4.0 ... 4.0.2

Author SHA1 Message Date
509a10bc36 more fixes
remove unused redirects plugin after functionality was moved to core
fixed after-install links
2025-01-22 14:46:14 -05:00
5e99213601 bugfixes
improved dark mode user pref
Fixed invalid default Group
Fixed subscriptions showing when plugin was disabled
Fixed messages and notifications showing when disabled
2025-01-22 14:11:52 -05:00
17 changed files with 149 additions and 144 deletions

View File

@ -95,25 +95,45 @@ $(document).ready(function() {
});
document.addEventListener('DOMContentLoaded', function () {
const ttpDarkmode = document.getElementById('dark-mode-pref');
const toggleButton = document.getElementById('dark-mode-toggle');
const enableButton = document.getElementById('dark-mode-toggle-button');
const darkModeStylesheet = document.getElementById('dark-mode-stylesheet');
let currentState = '';
// Check if dark mode is saved in localStorage
if (localStorage.getItem('darkMode') === 'enabled') {
// Check if dark mode is set by ttp
if ( ttpDarkmode ) {
if ( 'true' == ttpDarkmode.value ) {
currentState = 'enabled';
}
if ( 'false' == ttpDarkmode.value ) {
currentState = 'disabled';
}
}
// Check if dark mode is set in localStorage
if ( '' == currentState ) {
if ( localStorage.getItem('darkMode') === 'enabled' ) {
currentState = 'enabled';
}
}
// Update current button states
if ( 'enabled' == currentState ) {
darkModeStylesheet.disabled = false;
if ( toggleButton ) {
toggleButton.checked = true;
}
if ( enableButton ) {
enableButton.innerText = 'Disable Now';
}
}
// Style striped table elements
document.querySelectorAll('.table-striped').forEach((table) => {
if (localStorage.getItem('darkMode') === 'enabled') {
if ( 'enabled' == currentState ) {
table.classList.add('table-dark');
} else {
table.classList.add('table-light')
@ -122,7 +142,7 @@ document.addEventListener('DOMContentLoaded', function () {
if ( enableButton ) {
enableButton.addEventListener('click', function () {
if (darkModeStylesheet.disabled) {
if ( darkModeStylesheet.disabled ) {
darkModeStylesheet.disabled = false;
localStorage.setItem('darkMode', 'enabled');
enableButton.innerText = 'Disable Now';
@ -138,21 +158,21 @@ document.addEventListener('DOMContentLoaded', function () {
toggleButton.addEventListener('click', function () {
if (darkModeStylesheet.disabled) {
toggleDarkModePref( true );
darkModeStylesheet.disabled = false;
localStorage.setItem('darkMode', 'enabled');
darkModeStylesheet.disabled = false;
localStorage.setItem('darkMode', 'enabled');
} else {
toggleDarkModePref( false );
darkModeStylesheet.disabled = true;
localStorage.setItem('darkMode', 'disabled');
}
document.querySelectorAll('.table-striped').forEach((table) => {
if (localStorage.getItem('darkMode') === 'enabled') {
table.classList.add('table-dark');
table.classList.remove('table-light');
} else {
toggleDarkModePref( false );
darkModeStylesheet.disabled = true;
localStorage.setItem('darkMode', 'disabled');
}
document.querySelectorAll('.table-striped').forEach((table) => {
if (localStorage.getItem('darkMode') === 'enabled') {
table.classList.add('table-dark');
table.classList.remove('table-light');
} else {
table.classList.add('table-light');
table.classList.remove('table-dark');
table.classList.add('table-light');
table.classList.remove('table-dark');
}
});
});

View File

@ -31,7 +31,7 @@ class Group extends DatabaseModel {
'defaultGroup' => [
'type' => 'customSelect',
'pretty' => 'The Default Group for new registrations.',
'default' => 5,
'default' => 4,
],
];
public $databaseMatrix = [

View File

@ -19,6 +19,9 @@ use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\Houdini\Classes\Issues;
use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\TheTempusProject as App;
use TheTempusProject\Hermes\Functions\Redirect;
use TheTempusProject\Bedrock\Functions\Session;
class Messages extends Controller {
private static $message;
@ -27,6 +30,10 @@ class Messages extends Controller {
parent::__construct();
self::$title = 'Messages';
self::$message = new Message;
if ( ! App::$isLoggedIn ) {
Session::flash( 'error', 'You do not have permission to access this page.' );
return Redirect::home();
}
}
public function create() {
@ -71,8 +78,9 @@ class Messages extends Controller {
}
public function index() {
Views::view( 'messages.inbox', self::$message->getInbox() );
Views::view( 'messages.outbox', self::$message->getOutbox() );
Components::set( 'message_inbox', Views::simpleView( 'messages.inbox', self::$message->getInbox() ) );
Components::set( 'message_outbox', Views::simpleView( 'messages.outbox', self::$message->getOutbox() ) );
Views::view( 'messages.index' );
}
public function read( $id = '' ) {

View File

@ -1 +1 @@
<span class="label label-danger">{MESSAGE_COUNT}</span>
<span class="badge bg-danger rounded-pill">{MESSAGE_COUNT}</span>

View File

@ -1,7 +1,6 @@
<h2>Inbox</h2>
{PAGINATION}
<form action="{ROOT_URL}messages/delete" method="post">
<table class="table table-hover">
<table class="table table-striped">
<thead>
<tr>
<th style="width: 20%">From</th>

View File

@ -0,0 +1,8 @@
<div class="context-main context-main-bg col-10 offset-1 my-3 p-3">
<div class="my-3 p-3">
{message_inbox}
</div>
<div class="my-3 p-3">
{message_outbox}
</div>
</div>

View File

@ -1,43 +1,37 @@
<div class="container">
<div class="row">
<div class="context-main context-main-bg col-8 offset-2 my-3 p-3">
<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 panel-primary">
{LOOP}
{SINGLE}
<div class="card-header">
<h3 class="card-title">{subject}</h3>
</div>
{/SINGLE}
<div class="card-body">
<div class="row">
<div class="col-md-3 col-lg-3 " align="center">
<a href="{ROOT_URL}home/profile/{userFrom}">{userFrom}</a><br>
<img alt="User Pic" src="{ROOT_URL}{fromAvatar}" class="img-circle img-responsive">
{SINGLE}
<div class="card-header context-main-bg">
<h5 class="card-title context-main">{subject}</h5>
</div>
<div class=" col-md-9 col-lg-9 ">
<table class="table table-user-information">
<tbody>
<td>{message}</td>
</tbody>
</table>
{/SINGLE}
<div class="card-body context-second-bg">
<div class="row">
<div class="col-md-3 col-lg-3 text-center">
<a href="{ROOT_URL}home/profile/{userFrom}">{userFrom}</a><br>
<img alt="User Pic" src="{ROOT_URL}{fromAvatar}" class="img-circle img-fluid">
</div>
<div class=" col-md-9 col-lg-9 context-main">
{message}
</div>
</div>
</div>
</div>
<div class="card-footer">
{ADMIN}
{ID}
<span class="float-right">
{DTC}{sent}{/DTC}
</span>
{/ADMIN}
</div>
<div class="card-footer context-main-bg">
{ADMIN}
{ID}
<span class="float-right">
{DTC}{sent}{/DTC}
</span>
{/ADMIN}
</div>
{/LOOP}
</div>
<form action="{ROOT_URL}messages/reply" method="post">
<input type="hidden" name="token" value="{TOKEN}">
<input type="hidden" name="messageID" value="{PID}">
<button name="submit" value="reply" type="submit" class="btn btn-sm btn-primary">Reply</button>
<button name="submit" value="reply" type="submit" class="btn btn-md btn-primary my-4">Reply</button>
</form>
</div>
</div>
</div>

View File

@ -1,49 +1,46 @@
<div class="dropdown nav-item mx-2">
<a
href="#"
class="d-block dropdown-toggle nav-link"
class="d-flex align-items-center text-white text-decoration-none dropdown-toggle"
id="messagesDropdown"
data-bs-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false">
<i class="fa fa-fw fa-envelope"></i><span class="ml-3">{MBADGE}</span>
<i class="fa fa-fw fa-envelope"></i><span class="">{MBADGE}</span>
</a>
<ul class="dropdown-menu text-small" aria-labelledby="messagesDropdown">
<li class="message-header">
<div class="media">
<div class="media-body text-center" style="padding-bottom: 10px; padding-top: 10px">
{MESSAGE_COUNT} unread message(s) total
</div>
</div>
</li>
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end text-small shadow" aria-labelledby="messagesDropdown">
{LOOP}
<li class="message-preview">
<a href="{ROOT_URL}messages/view/{ID}">
<div class="media">
<span class="float-left">
<img class="media-object avatar-round-40" src="{ROOT_URL}{fromAvatar}" alt="">
</span>
<div class="media-body">
<h5 class="media-heading"><strong>{userFrom}</strong>
</h5>
<p class="small text-muted"><i class="fa fa-clock-o"></i> {DTC}{lastReply}{/DTC}</p>
{summary}
<!-- Message Item -->
<li>
<a href="{ROOT_URL}messages/view/{ID}" class="dropdown-item">
<div class="d-flex">
<h5 class="media-heading text-start">
<img class="" style="width: 40px;" src="{ROOT_URL}{fromAvatar}" alt="">
<strong>{userFrom}</strong>
</h5>
<div class="text-end">
<div class="media-body">
<p class="small text-muted mb-1"><i class="fa fa-clock-o me-1"></i> {DTC}{lastReply}{/DTC}</p>
<span>{summary}</span>
</div>
</div>
</div>
</a>
</li>
{/LOOP}
{ALT}
<li class="message-preview">
<div class="media">
<div class="media-body text-center" style="padding-bottom: 10px; padding-top: 10px">
<h5 class="media-heading"><strong>No Messages</strong></h5>
</div>
</div>
<li class="px-3 text-center">
<strong>No Messages</strong>
</li>
{/ALT}
<li class="message-footer text-center">
<a href="{ROOT_URL}messages" class="dropdown-item">Read All New Messages</a>
<!-- Footer -->
<li>
<hr class="dropdown-divider">
</li>
<li>
<a href="/messages" class="dropdown-item text-center">
Read All New Messages
</a>
</li>
</ul>
</div>

View File

@ -1,7 +1,6 @@
<h2>Outbox</h2>
{PAGINATION}
<form action="{ROOT_URL}messages/delete" method="post">
<table class="table table-hover">
<table class="table table-striped">
<thead>
<tr>
<th style="width: 20%">To</th>

View File

@ -1,14 +1,18 @@
<form action="" method="post" class="form-horizontal">
<legend>Reply</legend>
<fieldset>
<div class="form-group">
<label for="message" class="col-lg-3 control-label">Message:</label>
<div class="col-lg-6">
<textarea class="form-control" name="message" maxlength="2000" rows="10" cols="50" id="message"></textarea>
<div class="context-main context-main-bg col-8 offset-2 my-3 p-3">
<form action="" method="post" class="form-horizontal">
<legend class="text-center">Reply</legend>
<fieldset>
<div class="form-group">
<div class="col-6 offset-3">
<label for="message" class="control-label">Message:</label>
<textarea class="form-control" name="message" maxlength="2000" rows="10" cols="50" id="message"></textarea>
</div>
</div>
</fieldset>
<input type="hidden" name="messageID" value="{messageID}">
<input type="hidden" name="token" value="{TOKEN}">
<div class="text-center">
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block my-3">Send</button>
</div>
</fieldset>
<input type="hidden" name="messageID" value="{messageID}">
<input type="hidden" name="token" value="{TOKEN}">
<button name="submit" value="submit" type="submit" class="btn btn-lg btn-primary center-block">Send</button><br>
</form>
</form>
</div>

View File

@ -17,6 +17,8 @@ use TheTempusProject\Houdini\Classes\Issues;
use TheTempusProject\Classes\Controller;
use TheTempusProject\Models\Notification as NotificationsModel;
use TheTempusProject\TheTempusProject as App;
use TheTempusProject\Hermes\Functions\Redirect;
use TheTempusProject\Bedrock\Functions\Session;
class Notifications extends Controller {
protected static $notifications;
@ -26,6 +28,10 @@ class Notifications extends Controller {
self::$notifications = new NotificationsModel;
self::$title = 'Notifications - {SITENAME}';
self::$pageDescription = 'Your recent notifications';
if ( ! App::$isLoggedIn ) {
Session::flash( 'error', 'You do not have permission to access this page.' );
return Redirect::home();
}
}
public function index() {

View File

@ -7,7 +7,7 @@
data-bs-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false">
<i class="fa fa-fw fa-bell"></i><span class="ms-2">{NBADGE}</span>
<i class="fa fa-fw fa-bell"></i><span class="">{NBADGE}</span>
</a>
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end text-small shadow" aria-labelledby="notificationsDropdown">
{LOOP}

View File

@ -1,40 +0,0 @@
<?php
/**
* app/plugins/redirects/plugin.php
*
* This houses all of the main plugin info and functionality.
*
* @package TP Redirects
* @version 3.0
* @author Joey Kimsey <Joey@thetempusproject.com>
* @link https://TheTempusProject.com
* @license https://opensource.org/licenses/MIT [MIT LICENSE]
*/
namespace TheTempusProject\Plugins;
use ReflectionClass;
use TheTempusProject\Classes\Installer;
use TheTempusProject\Houdini\Classes\Navigation;
use TheTempusProject\Classes\Plugin;
use TheTempusProject\TheTempusProject as App;
class Redirects extends Plugin {
public $pluginName = 'TP Redirects';
public $pluginAuthor = 'JoeyK';
public $pluginWebsite = 'https://TheTempusProject.com';
public $modelVersion = '1.0';
public $pluginVersion = '3.0';
public $pluginDescription = 'A simple plugin which adds redirects.';
public $permissionMatrix = [
'redirects' => [
'pretty' => 'Can modify redirects',
'default' => false,
],
];
public $admin_links = [
[
'text' => '<i class="fa fa-fw fa-external-link"></i> Redirects',
'url' => '{ROOT_URL}admin/routes',
],
];
}

View File

@ -38,7 +38,9 @@ class Subscribe extends Plugin {
public function __construct( $load = false ) {
parent::__construct( $load );
if ( ! self::$loaded ) {
Components::append( 'FOOTER_RIGHT', Views::simpleView( 'subscribe.footer.right') );
if ( $this->checkEnabled() ) {
Components::append( 'FOOTER_RIGHT', Views::simpleView( 'subscribe.footer.right') );
}
self::$loaded = true;
}
}

View File

@ -31,6 +31,7 @@ class DefaultLoader extends Loader {
if ( self::$loaded ) {
return;
}
Components::set( 'DARK_MODE_SETTING', '' );
Components::set( 'TEMPLATE_URL', Template::parse( '{ROOT_URL}app/templates/default/' ) );
if ( VENDOR_AUTOLOADED === true ) {
Components::set( 'FONT_AWESOME_URL', '/vendor/fortawesome/font-awesome/css/' );
@ -54,9 +55,11 @@ class DefaultLoader extends Loader {
*/
if ( App::$isLoggedIn ) {
if ( ! empty( App::$activePrefs['darkMode'] ) ) {
Components::set( 'DARK_MODE_SETTING', 'true' );
$this->addCss( '<link rel="stylesheet" href="{ROOT_URL}app/css/main.css">' );
$this->addCss( '<link rel="stylesheet" href="{ROOT_URL}app/css/main-dark.css" id="dark-mode-stylesheet">' );
} else {
Components::set( 'DARK_MODE_SETTING', 'false' );
$this->addCss( '<link rel="stylesheet" href="{ROOT_URL}app/css/main.css">' );
$this->addCss( '<link rel="stylesheet" href="{ROOT_URL}app/css/main-dark.css" id="dark-mode-stylesheet" disabled>' );
}

View File

@ -55,6 +55,7 @@
</header>
<div class="d-flex flex-column min-vh-100">
<div class="flex-container flex-grow-1">
<!-- Issues -->
{ISSUES}
<div class="container pt-4">
<div class="row">
@ -65,10 +66,14 @@
</div>
</div>
{/ISSUES}
<!-- Main Page Content -->
{CONTENT}
</div>
<!-- Footer -->
{FOOT}
</div>
<!-- User Pref to control Dark mode across frontend and backend -->
<input type="hidden" name="dark-mode-pref" id="dark-mode-pref" value="{DARK_MODE_SETTING}">
<!-- Bootstrap core JavaScript and jquery -->
<script crossorigin="anonymous" src="{JQUERY_CDN}jquery.min.js"></script>
<script crossorigin="anonymous" src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js"></script>
@ -76,4 +81,4 @@
<!-- Custom javascript for this template -->
{TEMPLATE_JS_INCLUDES}
</body>
</html>
</html>

View File

@ -20,11 +20,11 @@
</p>
<!-- Call-to-Action Buttons -->
<div class="d-flex justify-content-center gap-3 mt-4">
<a href="/login" class="btn btn-success btn-lg">
<a href="/home/login" class="btn btn-success btn-lg">
<i class="fa fa-sign-in-alt me-2"></i> Log In
</a>
<a href="/dashboard" class="btn btn-outline-success btn-lg">
<i class="fa fa-cogs me-2"></i> Go to Dashboard
<a href="/home/index" class="btn btn-outline-success btn-lg">
<i class="fa fa-cogs me-2"></i> Go to Homepage
</a>
</div>
</div>