Compare commits

..

1 Commits
4.0 ... 4.0.1

Author SHA1 Message Date
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
15 changed files with 146 additions and 101 deletions

View File

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

View File

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

View File

@ -19,6 +19,9 @@ use TheTempusProject\Houdini\Classes\Views;
use TheTempusProject\Houdini\Classes\Issues; use TheTempusProject\Houdini\Classes\Issues;
use TheTempusProject\Bedrock\Functions\Check; use TheTempusProject\Bedrock\Functions\Check;
use TheTempusProject\Bedrock\Functions\Input; use TheTempusProject\Bedrock\Functions\Input;
use TheTempusProject\TheTempusProject as App;
use TheTempusProject\Hermes\Functions\Redirect;
use TheTempusProject\Bedrock\Functions\Session;
class Messages extends Controller { class Messages extends Controller {
private static $message; private static $message;
@ -27,6 +30,10 @@ class Messages extends Controller {
parent::__construct(); parent::__construct();
self::$title = 'Messages'; self::$title = 'Messages';
self::$message = new Message; 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() { public function create() {
@ -71,8 +78,9 @@ class Messages extends Controller {
} }
public function index() { public function index() {
Views::view( 'messages.inbox', self::$message->getInbox() ); Components::set( 'message_inbox', Views::simpleView( 'messages.inbox', self::$message->getInbox() ) );
Views::view( 'messages.outbox', self::$message->getOutbox() ); Components::set( 'message_outbox', Views::simpleView( 'messages.outbox', self::$message->getOutbox() ) );
Views::view( 'messages.index' );
} }
public function read( $id = '' ) { 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> <h2>Inbox</h2>
{PAGINATION}
<form action="{ROOT_URL}messages/delete" method="post"> <form action="{ROOT_URL}messages/delete" method="post">
<table class="table table-hover"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th style="width: 20%">From</th> <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="context-main context-main-bg col-8 offset-2 my-3 p-3">
<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="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"> <div class="card panel-primary">
{LOOP} {LOOP}
{SINGLE} {SINGLE}
<div class="card-header"> <div class="card-header context-main-bg">
<h3 class="card-title">{subject}</h3> <h5 class="card-title context-main">{subject}</h5>
</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">
</div> </div>
<div class=" col-md-9 col-lg-9 "> {/SINGLE}
<table class="table table-user-information"> <div class="card-body context-second-bg">
<tbody> <div class="row">
<td>{message}</td> <div class="col-md-3 col-lg-3 text-center">
</tbody> <a href="{ROOT_URL}home/profile/{userFrom}">{userFrom}</a><br>
</table> <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>
</div> <div class="card-footer context-main-bg">
<div class="card-footer"> {ADMIN}
{ADMIN} {ID}
{ID} <span class="float-right">
<span class="float-right"> {DTC}{sent}{/DTC}
{DTC}{sent}{/DTC} </span>
</span> {/ADMIN}
{/ADMIN} </div>
</div>
{/LOOP} {/LOOP}
</div> </div>
<form action="{ROOT_URL}messages/reply" method="post"> <form action="{ROOT_URL}messages/reply" method="post">
<input type="hidden" name="token" value="{TOKEN}"> <input type="hidden" name="token" value="{TOKEN}">
<input type="hidden" name="messageID" value="{PID}"> <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> </form>
</div> </div>
</div>
</div> </div>

View File

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

View File

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

View File

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

View File

@ -17,6 +17,8 @@ use TheTempusProject\Houdini\Classes\Issues;
use TheTempusProject\Classes\Controller; use TheTempusProject\Classes\Controller;
use TheTempusProject\Models\Notification as NotificationsModel; use TheTempusProject\Models\Notification as NotificationsModel;
use TheTempusProject\TheTempusProject as App; use TheTempusProject\TheTempusProject as App;
use TheTempusProject\Hermes\Functions\Redirect;
use TheTempusProject\Bedrock\Functions\Session;
class Notifications extends Controller { class Notifications extends Controller {
protected static $notifications; protected static $notifications;
@ -26,6 +28,10 @@ class Notifications extends Controller {
self::$notifications = new NotificationsModel; self::$notifications = new NotificationsModel;
self::$title = 'Notifications - {SITENAME}'; self::$title = 'Notifications - {SITENAME}';
self::$pageDescription = 'Your recent notifications'; 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() { public function index() {

View File

@ -7,7 +7,7 @@
data-bs-toggle="dropdown" data-bs-toggle="dropdown"
aria-haspopup="true" aria-haspopup="true"
aria-expanded="false"> 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> </a>
<ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end text-small shadow" aria-labelledby="notificationsDropdown"> <ul class="dropdown-menu dropdown-menu-dark dropdown-menu-end text-small shadow" aria-labelledby="notificationsDropdown">
{LOOP} {LOOP}

View File

@ -38,7 +38,9 @@ class Subscribe extends Plugin {
public function __construct( $load = false ) { public function __construct( $load = false ) {
parent::__construct( $load ); parent::__construct( $load );
if ( ! self::$loaded ) { 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; self::$loaded = true;
} }
} }

View File

@ -31,6 +31,7 @@ class DefaultLoader extends Loader {
if ( self::$loaded ) { if ( self::$loaded ) {
return; return;
} }
Components::set( 'DARK_MODE_SETTING', '' );
Components::set( 'TEMPLATE_URL', Template::parse( '{ROOT_URL}app/templates/default/' ) ); Components::set( 'TEMPLATE_URL', Template::parse( '{ROOT_URL}app/templates/default/' ) );
if ( VENDOR_AUTOLOADED === true ) { if ( VENDOR_AUTOLOADED === true ) {
Components::set( 'FONT_AWESOME_URL', '/vendor/fortawesome/font-awesome/css/' ); Components::set( 'FONT_AWESOME_URL', '/vendor/fortawesome/font-awesome/css/' );
@ -54,9 +55,11 @@ class DefaultLoader extends Loader {
*/ */
if ( App::$isLoggedIn ) { if ( App::$isLoggedIn ) {
if ( ! empty( App::$activePrefs['darkMode'] ) ) { 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.css">' );
$this->addCss( '<link rel="stylesheet" href="{ROOT_URL}app/css/main-dark.css" id="dark-mode-stylesheet">' ); $this->addCss( '<link rel="stylesheet" href="{ROOT_URL}app/css/main-dark.css" id="dark-mode-stylesheet">' );
} else { } 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.css">' );
$this->addCss( '<link rel="stylesheet" href="{ROOT_URL}app/css/main-dark.css" id="dark-mode-stylesheet" disabled>' ); $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> </header>
<div class="d-flex flex-column min-vh-100"> <div class="d-flex flex-column min-vh-100">
<div class="flex-container flex-grow-1"> <div class="flex-container flex-grow-1">
<!-- Issues -->
{ISSUES} {ISSUES}
<div class="container pt-4"> <div class="container pt-4">
<div class="row"> <div class="row">
@ -65,10 +66,14 @@
</div> </div>
</div> </div>
{/ISSUES} {/ISSUES}
<!-- Main Page Content -->
{CONTENT} {CONTENT}
</div> </div>
<!-- Footer -->
{FOOT} {FOOT}
</div> </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 --> <!-- Bootstrap core JavaScript and jquery -->
<script crossorigin="anonymous" src="{JQUERY_CDN}jquery.min.js"></script> <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> <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 --> <!-- Custom javascript for this template -->
{TEMPLATE_JS_INCLUDES} {TEMPLATE_JS_INCLUDES}
</body> </body>
</html> </html>