From 32a9711adeda9b87356a439af49f7a99f82bae21 Mon Sep 17 00:00:00 2001 From: Joey Kimsey Date: Sat, 4 Jan 2025 17:21:14 -0500 Subject: [PATCH] wip from ATB --- app/classes/api_controller.php | 21 +-- app/classes/forms.php | 13 ++ app/classes/preferences.php | 80 +++++++++++- app/config/constants.php | 2 +- app/controllers/admin/home.php | 2 +- app/controllers/admin/routes.php | 30 +++-- app/controllers/api/login.php | 11 +- app/controllers/home.php | 28 +--- app/controllers/register.php | 7 +- app/controllers/usercp.php | 44 ++++++- app/css/main-dark.css | 16 +++ app/css/main.css | 4 +- app/images/ttp.png | Bin 26925 -> 45727 bytes app/js/main.js | 74 ++++++----- app/models/routes.php | 2 +- app/models/token.php | 9 +- app/models/user.php | 5 + app/plugins/blog/controllers/admin/blog.php | 4 +- app/plugins/blog/controllers/blog.php | 47 ++++--- app/plugins/blog/models/posts.php | 71 ++++++---- app/plugins/blog/views/admin/create.html | 8 ++ app/plugins/blog/views/admin/edit.html | 8 ++ app/plugins/blog/views/list.html | 2 +- app/plugins/blog/views/post.html | 2 +- app/plugins/blog/views/sidebar.html | 4 +- app/plugins/blog/views/sidebar2.html | 2 +- app/plugins/bugreport/views/create.html | 1 + .../comments/controllers/admin/comments.php | 6 +- app/plugins/comments/views/list.html | 2 +- .../notifications/models/notification.php | 2 +- .../nav/recentNotificationsDropdown.html | 4 +- app/plugins/subscribe/views/footer/right.html | 14 +- app/templates/default/default.inc.php | 11 +- app/views/about.html | 12 +- app/views/admin/routes/create.html | 2 +- app/views/admin/tokens/create.html | 2 +- app/views/admin/tokens/edit.html | 2 +- app/views/footer/container.html | 4 +- app/views/footer/copy.html | 2 +- app/views/index.html | 122 +++++++----------- app/views/install/configure.html | 4 +- app/views/install/models.html | 4 +- app/views/install/nav.html | 24 ++-- app/views/install/plugins.html | 4 +- app/views/install/resources.html | 4 +- app/views/install/routing.html | 4 +- app/views/install/start.html | 13 -- .../install/{agreement.html => terms.html} | 6 +- .../install/{adminUser.html => user.html} | 4 +- app/views/install/{check.html => verify.html} | 4 +- app/views/install/welcome.html | 17 +++ app/views/login.html | 4 +- app/views/nav/statusLoggedOut.html | 61 ++++----- app/views/privacy.html | 15 ++- app/views/register.html | 2 +- app/views/start.html | 23 ++++ app/views/user_cp/settings.html | 2 +- bin/tempus_project.php | 3 +- index.php | 9 +- install.php | 9 +- 60 files changed, 556 insertions(+), 342 deletions(-) delete mode 100644 app/views/install/start.html rename app/views/install/{agreement.html => terms.html} (81%) rename app/views/install/{adminUser.html => user.html} (95%) rename app/views/install/{check.html => verify.html} (91%) create mode 100644 app/views/install/welcome.html create mode 100644 app/views/start.html diff --git a/app/classes/api_controller.php b/app/classes/api_controller.php index 99faa73..b23fbe4 100644 --- a/app/classes/api_controller.php +++ b/app/classes/api_controller.php @@ -18,6 +18,8 @@ use TheTempusProject\Hermes\Functions\Redirect; use TheTempusProject\Bedrock\Functions\Session; use TheTempusProject\Bedrock\Classes\Config; use TheTempusProject\Models\Token; +use TheTempusProject\Canary\Bin\Canary as Debug; +use TheTempusProject\Houdini\Classes\Views; class ApiController extends Controller { protected static $canAccessApplicationApi = false; @@ -26,16 +28,15 @@ class ApiController extends Controller { protected static $authToken; public function __construct( $secure = true ) { + header('Content-Type: application/json; charset=utf-8'); parent::__construct(); - $this->verifyApiRequest(); - if ( $secure && ! $this->canUseApi() ) { - Session::flash( 'error', 'You do not have permission to view this page.' ); - return Redirect::home(); - } + Template::setTemplate( 'api' ); Template::noFollow(); Template::noIndex(); - Template::addHeader( 'Content-Type: application/json; charset=utf-8' ); - Template::setTemplate( 'api' ); + $res = $this->verifyApiRequest(); + if ( $secure && ! $this->canUseApi() ) { + exit( $res ); + } } protected function canUseApi() { @@ -72,16 +73,16 @@ class ApiController extends Controller { } else { $secret = $this->getSecretToken(); if ( empty( $secret ) ) { - return; + return Views::simpleView( 'api.response', ['response' => json_encode( [ 'error' => 'invalid secret' ], true )]); } $token = $tokens->findBySecret( $secret ); } if ( empty( $token ) ) { - return; + return Views::simpleView( 'api.response', ['response' => json_encode( [ 'error' => 'invalid token' ], true )]); } self::$authToken = $token; if ( $token->expiresAt <= time() && empty( $secret ) ) { - return; + return Views::simpleView( 'api.response', ['response' => json_encode( [ 'error' => 'token expired' ], true )]); } if ( $token->expiresAt <= time() ) { self::$canAccessAuthenticationApi = true; diff --git a/app/classes/forms.php b/app/classes/forms.php index d4402e7..1d6c4cb 100644 --- a/app/classes/forms.php +++ b/app/classes/forms.php @@ -114,6 +114,7 @@ class Forms extends Check { self::addHandler( 'install', __CLASS__, 'install' ); self::addHandler( 'adminCreateToken', __CLASS__, 'adminCreateToken' ); self::addHandler( 'apiLogin', __CLASS__, 'apiLogin' ); + self::addHandler( 'updatePreference', __CLASS__, 'updatePreference' ); self::addHandler( 'installStart', __CLASS__, 'install', [ 'start' ] ); self::addHandler( 'installAgreement', __CLASS__, 'install', [ 'agreement' ] ); self::addHandler( 'installCheck', __CLASS__, 'install', [ 'check' ] ); @@ -650,4 +651,16 @@ class Forms extends Check { } return true; } + + public static function updatePreference() { + if ( !Input::exists( 'prefName' ) ) { + self::addUserError( 'You must specify a name' ); + return false; + } + if ( !Input::exists( 'prefValue' ) ) { + self::addUserError( 'You must specify a value' ); + return false; + } + return true; + } } diff --git a/app/classes/preferences.php b/app/classes/preferences.php index b059ffa..3bf15fa 100644 --- a/app/classes/preferences.php +++ b/app/classes/preferences.php @@ -13,6 +13,7 @@ namespace TheTempusProject\Classes; use TheTempusProject\Houdini\Classes\Issues; use TheTempusProject\Houdini\Classes\Forms; +use TheTempusProject\Houdini\Classes\Template; use TheTempusProject\Canary\Bin\Canary as Debug; use TheTempusProject\Bedrock\Functions\Check; use TheTempusProject\Bedrock\Functions\Upload; @@ -186,17 +187,92 @@ class Preferences { } public function getFormHtml( $populated = [] ) { + // dv( self::$preferences ); $form = ''; + // Added so i can force some sort of ordering + $inputTypes = [ + 'file' => [], + 'select' => [], + 'timezone' => [], + 'checkbox' => [], + 'switch' => [], + ]; foreach ( self::$preferences as $name => $details ) { $tempPrefsArray = $this->normalizePreferenceArray( $name, $details ); if ( isset( $populated[ $name ] ) ) { - $tempPrefsArray['default'] = $populated[$name]; + $tempPrefsArray['value'] = $populated[$name]; + } else { + $tempPrefsArray['value'] = $tempPrefsArray['default']; } - $form .= Forms::getFormFieldHtml( $name, $tempPrefsArray['pretty'], $tempPrefsArray['type'], $tempPrefsArray['default'], $tempPrefsArray['options'] ); + // $form .= Forms::getFormFieldHtml( $name, $tempPrefsArray['pretty'], $tempPrefsArray['type'], $tempPrefsArray['default'], $tempPrefsArray['options'] ); + if ( $tempPrefsArray['type'] == 'checkbox' ) { + $tempPrefsArray['type'] = 'switch'; + } + $inputTypes[ $tempPrefsArray['type'] ][] = self::getFormFieldHtml( $name, $tempPrefsArray['pretty'], $tempPrefsArray['type'], $tempPrefsArray['value'], $tempPrefsArray['options'] ); + } + foreach ( $inputTypes as $skip => $items ) { + $form .= implode( ' ', $items ); } return $form; } + public static function getFormFieldHtml( $fieldname, $fieldTitle, $type, $defaultValue = '', $options = null ) { + $html = ''; + switch ( $type ) { + case 'radio': + case 'bool': + case 'boolean': + $fieldHtml = Forms::getRadioHtml( $fieldname, [ 'true', 'false' ], $defaultValue ); + break; + case 'select': + $fieldHtml = Forms::getSelectHtml( $fieldname, $options, $defaultValue ); + break; + case 'customSelect': + if ( empty( $options ) ) { + $options = '{' . $fieldname . '-options}'; + } + $fieldHtml = Forms::getSelectHtml( $fieldname, $options, $defaultValue ); + break; + case 'block': + $fieldHtml = Forms::getTextBlockHtml( $fieldname, $defaultValue ); + break; + case 'text': + case 'url': + $fieldHtml = Forms::getTextHtml( $fieldname, $defaultValue ); + break; + case 'checkbox': + $fieldHtml = Forms::getCheckboxHtml( $fieldname, $defaultValue ); + break; + case 'switch': + $fieldHtml = Forms::getSwitchHtml( $fieldname, $defaultValue ); + break; + case 'timezone': + $fieldHtml = Forms::getTimezoneHtml( $defaultValue ); + break; + case 'file': + $fieldHtml = Forms::getFileHtml( $fieldname ); + break; + default: + Debug::error( "unknown field type: $type" ); + break; + } + + $html .= '
'; + $html .= ''; + $html .= '
'; + $html .= $fieldHtml; + $html .= '
'; + if ( 'file' === $type ) { + $html .= '
'; + $html .= '

Current Image

'; + $html .= '
'; + $html .= 'User Avatar'; + $html .= '
'; + } + $html .= '
'; + return Template::parse( $html ); + } + public function convertFormToArray( $fillMissing = true, $defaultsOnly = true ) { $prefsArray = []; foreach ( self::$preferences as $name => $details ) { diff --git a/app/config/constants.php b/app/config/constants.php index 2f59171..2f1863c 100644 --- a/app/config/constants.php +++ b/app/config/constants.php @@ -38,7 +38,7 @@ if ( ! defined( 'CONFIG_DIRECTORY' ) ) { # Tempus Debugger define( 'CANARY_SECURE_HASH', 'd73ed7591a30f0ca7d686a0e780f0d05' ); # Tempus Project Core -define( 'APP_NAME', 'All The Bookmarks'); +define( 'APP_NAME', 'The Tempus Project'); define( 'TP_DEFAULT_LOGO', 'images/logo.png'); // Check define( 'MINIMUM_PHP_VERSION', 8.1); diff --git a/app/controllers/admin/home.php b/app/controllers/admin/home.php index c4a7704..6572929 100644 --- a/app/controllers/admin/home.php +++ b/app/controllers/admin/home.php @@ -32,12 +32,12 @@ class Home extends AdminController { } public function index() { + Components::set( 'commentDash', '' ); if ( class_exists( 'TheTempusProject\Plugins\Comments' ) ) { $plugin = new CommentPlugin; if ( ! $plugin->checkEnabled() ) { Debug::info( 'Comments Plugin is disabled in the control panel.' ); - Components::set( 'commentDash', '' ); } else { $comments = new Comments; $commentList = Views::simpleView( 'comments.admin.dashboard', $comments->recent( 'all', 5 ) ); diff --git a/app/controllers/admin/routes.php b/app/controllers/admin/routes.php index e21307b..0f65ccc 100644 --- a/app/controllers/admin/routes.php +++ b/app/controllers/admin/routes.php @@ -37,19 +37,25 @@ class Routes extends AdminController { public function create() { if ( Input::exists( 'redirect_type' ) ) { - if ( !TTPForms::check( 'createRoute' ) ) { - Issues::add( 'error', [ 'There was an error with your route.' => Check::userErrors() ] ); - } - if ( self::$routes->create( - Input::post( 'original_url' ), - Input::post( 'forwarded_url' ), - Input::post( 'nickname' ), - Input::post( 'redirect_type' ) - ) ) { - Session::flash( 'success', 'Route Created' ); - Redirect::to( 'admin/routes' ); - } + return Views::view( 'admin.routes.create' ); } + + if ( !TTPForms::check( 'createRoute' ) ) { + Issues::add( 'error', [ 'There was an error with your route.' => Check::userErrors() ] ); + return Views::view( 'admin.routes.create' ); + } + + if ( self::$routes->create( + Input::post( 'original_url' ), + Input::post( 'forwarded_url' ), + Input::post( 'nickname' ), + Input::post( 'redirect_type' ) + ) ) { + Session::flash( 'success', 'Route Created' ); + Redirect::to( 'admin/routes' ); + } + + Issues::add( 'error', 'There was an unknown error saving your redirect.' ); Views::view( 'admin.routes.create' ); } diff --git a/app/controllers/api/login.php b/app/controllers/api/login.php index 279a1cb..74536eb 100644 --- a/app/controllers/api/login.php +++ b/app/controllers/api/login.php @@ -27,15 +27,14 @@ class Login extends ApiController { parent::__construct( false ); self::$tokens = new Token; self::$user = new User; - // Template::addHeader( 'Access-Control-Allow-Origin: *' ); - // Template::addHeader( 'Content-Type: application/json; charset=utf-8' ); + Template::addHeader( 'Access-Control-Allow-Origin: *' ); + Template::addHeader( 'Content-Type: application/json; charset=utf-8' ); } public function index() { - header('Access-Control-Allow-Origin: *'); - if ( !Forms::check( 'apiLogin' ) ) { + if ( ! Forms::check( 'apiLogin' ) ) { $responseType = 'error'; - $response = 'malformed input1'; + $response = 'malformed input'; return Views::view( 'api.response', ['response' => json_encode( [ $responseType => $response ], true )]); } $user = self::$user->authorize( Input::post( 'username' ), Input::post( 'password' ) ); @@ -45,7 +44,7 @@ class Login extends ApiController { return Views::view( 'api.response', ['response' => json_encode( [ $responseType => $response ], true )]); } $responseType = 'token'; - $token = self::$tokens->findOrCreateUserToken( $user->ID ); + $token = self::$tokens->findOrCreateUserToken( $user->ID, true ); return Views::view( 'api.response', ['response' => json_encode( [ $responseType => $token ], true )]); } } \ No newline at end of file diff --git a/app/controllers/home.php b/app/controllers/home.php index daf116d..16659f1 100644 --- a/app/controllers/home.php +++ b/app/controllers/home.php @@ -27,13 +27,13 @@ use TheTempusProject\TheTempusProject as App; class Home extends Controller { public function index() { self::$title = '{SITENAME}'; - self::$pageDescription = 'This is the homepage of your new Tempus Project Installation. Thank you for installing. find more info at https://thetempusproject.com'; + self::$pageDescription = '{SITENAME} is here to provide you a better, faster, and easier - way to create and manage your own web applications.'; Views::view( 'index' ); } public function login() { self::$title = 'Portal - {SITENAME}'; - self::$pageDescription = 'Please log in to use {SITENAME} member features.'; + self::$pageDescription = 'Please log in to access all of the great features {SITENAME} has to offer.'; if ( App::$isLoggedIn ) { return Issues::add( 'notice', 'You are already logged in. Please click here to log out.' ); } @@ -69,7 +69,7 @@ class Home extends Controller { public function profile( $id = null ) { self::$title = 'User Profile - {SITENAME}'; - self::$pageDescription = 'User Profiles for {SITENAME}'; + self::$pageDescription = 'User Profile - {SITENAME}'; if ( !App::$isLoggedIn ) { return Issues::add( 'notice', 'You must be logged in to view this page.' ); } @@ -89,38 +89,22 @@ class Home extends Controller { Views::view( 'termsPage' ); } - public function hashtag( $id = null ) { - self::$title = 'HashTag - {SITENAME}'; - self::$pageDescription = 'HashTags for {SITENAME}'; - if ( !App::$isLoggedIn ) { - return Issues::add( 'notice', 'You must be logged in to view this page.' ); - } - // this should look up comments and blog posts with the hashtag in them - Views::view( 'hashtags' ); - } - public function about() { self::$title = 'About - {SITENAME}'; - self::$pageDescription = '{SITENAME} Terms and Conditions of use. Please use {SITENAME} safely.'; + self::$pageDescription = '{SITENAME} was started by a developer with years of industry experience which has lead to a refined no-nonsense tool for everyone. Find out more about us here.'; Views::view( 'about' ); } - public function contact() { - self::$title = 'Contact Us - {SITENAME}'; - self::$pageDescription = '{SITENAME} Terms and Conditions of use. Please use {SITENAME} safely.'; - Views::view( 'contact' ); - } - public function privacy() { self::$title = 'Privacy Policy - {SITENAME}'; - self::$pageDescription = '{SITENAME} Terms and Conditions of use. Please use {SITENAME} safely.'; + self::$pageDescription = 'At {SITENAME} you privacy is very important to us. On this page you can find a detailed outline of all the information we collect and how its used.'; Components::set( 'PRIVACY', Views::simpleView( 'privacy' ) ); Views::raw( '
{PRIVACY}
' ); } public function faq() { self::$title = 'Frequently Asked Questions - {SITENAME}'; - self::$pageDescription = '{SITENAME} Terms and Conditions of use. Please use {SITENAME} safely.'; + self::$pageDescription = 'Many times, we aren\'t the first to ask why or how something works. Here you will find a list of {SITENAME} commonly asked questions and our best answers.' ; Views::view( 'faq' ); } } diff --git a/app/controllers/register.php b/app/controllers/register.php index f07cb19..275fdc2 100644 --- a/app/controllers/register.php +++ b/app/controllers/register.php @@ -27,6 +27,7 @@ use TheTempusProject\Classes\Forms; class Register extends Controller { public function confirm( $code = null ) { + Template::noIndex(); self::$title = 'Confirm Email'; if ( !isset( $code ) && !Input::exists( 'confirmationCode' ) ) { return Views::view( 'confirmation' ); @@ -43,8 +44,8 @@ class Register extends Controller { } public function index() { - self::$title = 'Register'; - self::$pageDescription = 'Many features of the site are disabled or even hidden from unregistered users. On this page you can sign up for an account to access all the app has to offer.'; + self::$title = '{SITENAME} Sign Up'; + self::$pageDescription = 'Many features of {SITENAME} are disabled or hidden from unregistered users. On this page you can sign up for an account to access all the app has to offer.'; Components::set( 'TERMS', Views::simpleView( 'terms' ) ); if ( App::$isLoggedIn ) { return Issues::add( 'notice', 'You are currently logged in.' ); @@ -94,6 +95,7 @@ class Register extends Controller { public function resend() { self::$title = 'Resend Confirmation'; + Template::noIndex(); if ( !App::$isLoggedIn ) { return Issues::add( 'notice', 'Please log in to resend your confirmation email.' ); } @@ -110,6 +112,7 @@ class Register extends Controller { public function reset( $code = null ) { self::$title = 'Password Reset'; + Template::noIndex(); if ( !isset( $code ) && !Input::exists( 'resetCode' ) ) { Issues::add( 'info', 'Please provide a reset code.' ); return Views::view( 'password_reset_code' ); diff --git a/app/controllers/usercp.php b/app/controllers/usercp.php index 55f7c58..39a5444 100644 --- a/app/controllers/usercp.php +++ b/app/controllers/usercp.php @@ -36,12 +36,12 @@ class Usercp extends Controller { Redirect::home(); } Template::noIndex(); - $menu = Views::simpleView( 'nav.usercp', App::$userCPlinks ); - Navigation::activePageSelect( $menu, null, true, true ); } public function email() { self::$title = 'Email Settings'; + $menu = Views::simpleView( 'nav.usercp', App::$userCPlinks ); + Navigation::activePageSelect( $menu, null, true, true ); if ( App::$activeUser->confirmed != '1' ) { return Issues::add( 'notice', 'You need to confirm your email address before you can make modifications. If you would like to resend that confirmation link, please click here', true ); } @@ -68,11 +68,15 @@ class Usercp extends Controller { public function index() { self::$title = 'User Control Panel'; + $menu = Views::simpleView( 'nav.usercp', App::$userCPlinks ); + Navigation::activePageSelect( $menu, null, true, true ); Views::view( 'profile', App::$activeUser ); } public function password() { self::$title = 'Password Settings'; + $menu = Views::simpleView( 'nav.usercp', App::$userCPlinks ); + Navigation::activePageSelect( $menu, null, true, true ); if ( !Input::exists() ) { return Views::view( 'user_cp.password_change' ); } @@ -94,11 +98,12 @@ class Usercp extends Controller { public function settings() { self::$title = 'Preferences'; + $menu = Views::simpleView( 'nav.usercp', App::$userCPlinks ); + Navigation::activePageSelect( $menu, null, true, true ); $prefs = new Preferences; $fields = App::$activePrefs; if ( Input::exists( 'submit' ) ) { $fields = $prefs->convertFormToArray( true, false ); - // dv( $fields ); // @TODO now i may need to rework the form checker to work with this.... // if (!Forms::check('userPrefs')) { // Issues::add( 'error', [ 'There was an error with your request.' => Check::userErrors() ] ); @@ -110,4 +115,37 @@ class Usercp extends Controller { Components::set( 'PREFERENCES_FORM', $prefs->getFormHtml( $fields ) ); Views::view( 'user_cp.settings', App::$activeUser ); } + + public function updatePref() { + Template::setTemplate( 'api' ); + if ( ! App::$isLoggedIn ) { + return Views::view( 'api.response', ['response' => json_encode( [ 'error' => 'Not Logged In' ], true )]); + } + if ( ! Forms::check( 'updatePreference' ) ) { + return Views::view( 'api.response', ['response' => json_encode( [ 'error' => Check::userErrors() ], true )]); + } + $name = Input::post( 'prefName' ); + $value = Input::post('prefValue' ); + + if ( 'false' === $value ) { + $value = false; + } elseif ( 'true' === $value ) { + $value = true; + } + + if ( empty( Preferences::get( $name ) ) ) { + return Views::view( 'api.response', ['response' => json_encode( [ 'error' => 'Unknown Preference' ], true )]); + } + + $prefs = new Preferences; + $fields1 = $prefs->convertFormToArray( true, false ); + $fields3 = $fields1; + + if ( isset( $fields1[ $name ] ) ) { + $fields3[ $name ] = $value; + } + $result = self::$user->updatePrefs( $fields3, App::$activeUser->ID ); + + return Views::view( 'api.response', ['response' => json_encode( $result, true )]); + } } diff --git a/app/css/main-dark.css b/app/css/main-dark.css index 226a12b..4e9e249 100644 --- a/app/css/main-dark.css +++ b/app/css/main-dark.css @@ -21,9 +21,14 @@ .context-second-bg { background-color: #1e1e1e; } +.context-third-bg { + background-color: #3a3a3a; +} .bg-default { background-color: #2c2c2c; } + + .bg-none,.bg-warning { color: #000 !important; } @@ -135,3 +140,14 @@ body { .text-shadow-3 { text-shadow: 0 .5rem 1.5rem rgba(255, 255, 255, .25); } + +.form-control { + background-color: #1f1f1f; + color: #e0e0e0; +} +.form-control:focus { + color: #e0e0e0; + border-color: #1e90ff; + background-color: #1f1f1f; + box-shadow: 0 0 0 .25rem rgba(30, 144, 255, .5); +} \ No newline at end of file diff --git a/app/css/main.css b/app/css/main.css index 7f64ee8..c05624d 100644 --- a/app/css/main.css +++ b/app/css/main.css @@ -92,8 +92,10 @@ html { pre { white-space: pre-wrap; } + body { - background-image: linear-gradient(180deg, #eee, #fff 100px, #fff); + background-color: #e4e4e4; + /* background-image: linear-gradient(180deg, #eee, #fff 100px, #fff); */ } @media ( min-width: 768px ) { .main { diff --git a/app/images/ttp.png b/app/images/ttp.png index 2ad7269fee9ff0e03e3b26050ccf073889b28c65..ebb70f8d3e29eee9450387aa4962b386295fd0c3 100644 GIT binary patch literal 45727 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 ZQ=i7Rp5FuBdqhX4r){iNuHp3Xe*kIHyTSkf diff --git a/app/js/main.js b/app/js/main.js index 5b38519..47b416a 100644 --- a/app/js/main.js +++ b/app/js/main.js @@ -102,7 +102,10 @@ document.addEventListener('DOMContentLoaded', function () { // Check if dark mode is saved in localStorage if (localStorage.getItem('darkMode') === 'enabled') { darkModeStylesheet.disabled = false; - toggleButton.checked = true; + + if ( toggleButton ) { + toggleButton.checked = true; + } if ( enableButton ) { enableButton.innerText = 'Disable Now'; @@ -119,35 +122,48 @@ document.addEventListener('DOMContentLoaded', function () { if ( enableButton ) { enableButton.addEventListener('click', function () { - if (darkModeStylesheet.disabled) { - darkModeStylesheet.disabled = false; - localStorage.setItem('darkMode', 'enabled'); - enableButton.innerText = 'Disable Now'; - } else { - darkModeStylesheet.disabled = true; - localStorage.setItem('darkMode', 'disabled'); - enableButton.innerText = 'Enable Now'; - } + if (darkModeStylesheet.disabled) { + darkModeStylesheet.disabled = false; + localStorage.setItem('darkMode', 'enabled'); + enableButton.innerText = 'Disable Now'; + } else { + darkModeStylesheet.disabled = true; + localStorage.setItem('darkMode', 'disabled'); + enableButton.innerText = 'Enable Now'; + } }); } - toggleButton.addEventListener('click', function () { - if (darkModeStylesheet.disabled) { - darkModeStylesheet.disabled = false; - localStorage.setItem('darkMode', 'enabled'); - } else { - 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'); - } - }); - }); + if ( toggleButton ) { + toggleButton.addEventListener('click', function () { + if (darkModeStylesheet.disabled) { + toggleDarkModePref( true ); + 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 { + table.classList.add('table-light'); + table.classList.remove('table-dark'); + } + }); + }); + } + + function toggleDarkModePref( value ) { + var fields = {}; + fields.prefName = 'darkMode'; + fields.prefValue = value; + $.post( '/usercp/updatePref', fields ).done(function(response) { + // alert('Timer updated successfully!'); + }); + } }); diff --git a/app/models/routes.php b/app/models/routes.php index 63a23d1..8333692 100644 --- a/app/models/routes.php +++ b/app/models/routes.php @@ -72,7 +72,7 @@ class Routes extends DatabaseModel { return false; } if ( !Check::simpleName( $nickname ) ) { - Debug::warn( 'Invalid route nickname: ' . $name ); + Debug::warn( 'Invalid route nickname: ' . $nickname ); return false; } if ( 'external' == $type && !Check::url( $forwarded_url ) ) { diff --git a/app/models/token.php b/app/models/token.php index 167e961..fe9198a 100644 --- a/app/models/token.php +++ b/app/models/token.php @@ -94,10 +94,15 @@ class Token extends DatabaseModel { return false; } - public function findOrCreateUserToken( $user_id ) { + public function findOrCreateUserToken( $user_id, $refresh = false ) { $test = $this->findUserToken( $user_id ); if ( ! empty( $test ) ) { - return $test->token; + if ( ! empty( $refresh ) ) { + $token = $this->refresh( $test->ID, 'user' ); + } else { + $token = $test->token; + } + return $token; } $expiration = Config::getValue( 'api/UserAccessTokenExpiration' ); diff --git a/app/models/user.php b/app/models/user.php index 5eb8a38..62012fa 100644 --- a/app/models/user.php +++ b/app/models/user.php @@ -121,6 +121,11 @@ class User extends DatabaseModel { '50', ], ], + 'darkMode' => [ + 'pretty' => 'Enable Dark-Mode viewing', + 'type' => 'checkbox', + 'default' => 'false', + ], ]; protected static $avatars; protected static $preferences; diff --git a/app/plugins/blog/controllers/admin/blog.php b/app/plugins/blog/controllers/admin/blog.php index adfc451..36b9097 100644 --- a/app/plugins/blog/controllers/admin/blog.php +++ b/app/plugins/blog/controllers/admin/blog.php @@ -46,7 +46,7 @@ class Blog extends AdminController { return $this->index(); } - $result = self::$posts->newPost( Input::post( 'title' ), Input::post( 'blogPost' ), Input::post( 'submit' ) ); + $result = self::$posts->newPost( Input::post( 'title' ), Input::post( 'blogPost' ), Input::post( 'slug' ), Input::post( 'submit' ) ); if ( $result ) { Issues::add( 'success', 'Your post has been created.' ); return $this->index(); @@ -67,7 +67,7 @@ class Blog extends AdminController { Issues::add( 'error', [ 'There was an error with your form.' => Check::userErrors() ] ); return $this->index(); } - if ( self::$posts->updatePost( $data, Input::post( 'title' ), Input::post( 'blogPost' ), Input::post( 'submit' ) ) === true ) { + if ( self::$posts->updatePost( $data, Input::post( 'title' ), Input::post( 'blogPost' ), Input::post( 'slug' ), Input::post( 'submit' ) ) === true ) { Issues::add( 'success', 'Post Updated.' ); return $this->index(); } diff --git a/app/plugins/blog/controllers/blog.php b/app/plugins/blog/controllers/blog.php index b14100b..80cc7c8 100644 --- a/app/plugins/blog/controllers/blog.php +++ b/app/plugins/blog/controllers/blog.php @@ -62,12 +62,17 @@ class Blog extends Controller { return $this->index(); } - $plugin = new Comments; - if ( ! $plugin->checkEnabled() ) { - Issues::add( 'error', 'Comments are disabled.' ); + if ( class_exists( 'TheTempusProject\Plugins\Comments' ) ) { + $plugin = new Comments; + if ( ! $plugin->checkEnabled() ) { + Issues::add( 'error', 'Comments are disabled.' ); + return $this->index(); + } + $comments = new CommentsModel; + } else { + Debug::info( 'error', 'Comments plugin missing.' ); return $this->index(); } - $comments = new CommentsModel; switch ( $sub ) { case 'post': @@ -100,7 +105,10 @@ class Blog extends Controller { } $post = self::$posts->findById( $id ); if ( empty( $post ) ) { - return $this->index(); + $post = self::$posts->findBySlug( $id ); + if ( empty( $post ) ) { + return $this->index(); + } } Debug::log( 'Controller initiated: ' . __METHOD__ . '.' ); self::$title = 'Blog Post'; @@ -111,25 +119,24 @@ class Blog extends Controller { Components::set( 'CONTENT_ID', $id ); Components::set( 'COMMENT_TYPE', self::$posts->tableName ); + Components::set( 'NEWCOMMENT', '' ); + Components::set( 'count', '0' ); + Components::set( 'COMMENTS', '' ); - $plugin = new Comments; - if ( ! $plugin->checkEnabled() ) { - Components::set( 'NEWCOMMENT', '' ); - Components::set( 'count', '0' ); - Components::set( 'COMMENTS', '' ); - } else { - $comments = new CommentsModel; - if ( App::$isLoggedIn ) { - Components::set( 'NEWCOMMENT', Views::simpleView( 'comments.create' ) ); - } else { - Components::set( 'NEWCOMMENT', '' ); + if ( class_exists( 'TheTempusProject\Plugins\Comments' ) ) { + $plugin = new Comments; + if ( $plugin->checkEnabled() ) { + $comments = new CommentsModel; + if ( App::$isLoggedIn ) { + Components::set( 'NEWCOMMENT', Views::simpleView( 'comments.create' ) ); + } else { + Components::set( 'NEWCOMMENT', '' ); + } + Components::set( 'count', $comments->count( self::$posts->tableName, $post->ID ) ); + Components::set( 'COMMENTS', Views::simpleView( 'comments.list', $comments->display( 10, self::$posts->tableName, $post->ID ) ) ); } - Components::set( 'count', $comments->count( self::$posts->tableName, $post->ID ) ); - Components::set( 'COMMENTS', Views::simpleView( 'comments.list', $comments->display( 10, self::$posts->tableName, $post->ID ) ) ); } - $post = self::$posts->findById( $id ); - self::$title .= ' - ' . $post->title; self::$pageDescription = strip_tags( $post->contentSummaryNoLink ); Views::view( 'blog.post', $post ); diff --git a/app/plugins/blog/models/posts.php b/app/plugins/blog/models/posts.php index 471f51d..212ac2b 100644 --- a/app/plugins/blog/models/posts.php +++ b/app/plugins/blog/models/posts.php @@ -32,6 +32,7 @@ class Posts extends DatabaseModel { [ 'edited', 'int', '10' ], [ 'draft', 'int', '1' ], [ 'title', 'varchar', '86' ], + [ 'slug', 'varchar', '64' ], [ 'content', 'text', '' ], ]; @@ -45,7 +46,7 @@ class Posts extends DatabaseModel { } } - public function newPost( $title, $post, $draft ) { + public function newPost( $title, $post, $slug, $draft ) { if ( !Check::dataTitle( $title ) ) { Debug::info( 'modelBlog: illegal title.' ); @@ -59,6 +60,7 @@ class Posts extends DatabaseModel { $fields = [ 'author' => App::$activeUser->ID, 'draft' => $draft, + 'slug' => $slug, 'created' => time(), 'edited' => time(), 'content' => Sanitize::rich( $post ), @@ -73,7 +75,7 @@ class Posts extends DatabaseModel { return true; } - public function updatePost( $id, $title, $content, $draft ) { + public function updatePost( $id, $title, $content, $slug, $draft ) { if ( empty( self::$log ) ) { self::$log = new Log; } @@ -94,6 +96,7 @@ class Posts extends DatabaseModel { } $fields = [ 'draft' => $draft, + 'slug' => $slug, 'edited' => time(), 'content' => Sanitize::rich( $content ), 'title' => $title, @@ -131,39 +134,47 @@ class Posts extends DatabaseModel { } $draft = ''; $authorName = self::$user->getUsername( $instance->author ); - $cleanPost = Sanitize::contentShort( $instance->content ); - $postSpace = explode( ' ', $cleanPost ); - $postLine = explode( "\n", $cleanPost ); - // summary by words: 100 - $spaceSummary = implode( ' ', array_splice( $postSpace, 0, 100 ) ); - // summary by lines: 5 - $lineSummary = implode( "\n", array_splice( $postLine, 0, 5 ) ); - if ( strlen( $spaceSummary ) < strlen( $lineSummary ) ) { - $contentSummary = $spaceSummary; - if ( count( $postSpace, 1 ) <= 100 ) { - $contentSummaryNoLink = $contentSummary; - $contentSummary .= '... Read More'; - } + + // Summarize + if ( ! empty( $instance->slug ) ) { + $identifier = $instance->slug; + } else { + $identifier = $instance->ID; + } + + $cleanPost = Sanitize::contentShort( $instance->content ); + // By Word + $wordsArray = explode( ' ', $cleanPost ); + $wordSummary = implode( ' ', array_splice( $wordsArray, 0, 100 ) ); + // By Line + $linesArray = explode( "\n", $cleanPost ); + $lineSummary = implode( "\n", array_splice( $linesArray, 0, 5 ) ); + + if ( strlen( $wordSummary ) < strlen( $lineSummary ) ) { + $contentSummaryNoLink = $wordSummary; + $contentSummary = $wordSummary . '... Read More'; } else { - // @todo: need to refine this after testing $contentSummaryNoLink = $lineSummary; - $contentSummary = $lineSummary . '... Read More'; + $contentSummary = $lineSummary . '... Read More'; + } + + $instance->contentSummaryNoLink = $contentSummaryNoLink; + $instance->contentSummary = $contentSummary; + + if ( isset( $params['stripHtml'] ) && $params['stripHtml'] === true ) { + $instance->contentSummary = strip_tags( $instance->content ); } if ( $instance->draft != '0' ) { $draft = ' Draft'; } $instance->isDraft = $draft; $instance->authorName = $authorName; - $instance->contentSummaryNoLink = $contentSummaryNoLink; - $instance->contentSummary = $contentSummary; - if ( isset( $params['stripHtml'] ) && $params['stripHtml'] === true ) { - $instance->contentSummary = strip_tags( $instance->content ); - } if ( self::$comments !== false ) { $instance->commentCount = self::$comments->count( 'blog', $instance->ID ); } $instance->content = Filters::applyOne( 'mentions.0', $instance->content, true ); $instance->content = Filters::applyOne( 'hashtags.0', $instance->content, true ); + $out[] = $instance; if ( !empty( $end ) ) { $out = $out[0]; @@ -291,6 +302,22 @@ class Posts extends DatabaseModel { return $this->filter( $postData->results() ); } + public function findBySlug( $slug, $includeDraft = false ) { + $whereClause = []; + if ( $includeDraft !== true ) { + $whereClause = ['draft', '=', '0', 'AND']; + } + + $whereClause = array_merge( $whereClause, ['slug', '=', $slug] ); + + $postData = self::$db->get( $this->tableName, $whereClause ); + if ( !$postData->count() ) { + Debug::info( 'No Blog posts found.' ); + return false; + } + return $this->filter( $postData->first() ); + } + public function byMonth( $month, $year = 0, $includeDraft = false ) { if ( 0 === $year ) { $year = date( 'Y' ); diff --git a/app/plugins/blog/views/admin/create.html b/app/plugins/blog/views/admin/create.html index 7ae25f5..00d9d00 100644 --- a/app/plugins/blog/views/admin/create.html +++ b/app/plugins/blog/views/admin/create.html @@ -12,6 +12,14 @@

+ +
+ +
+ +
+
+
diff --git a/app/plugins/blog/views/admin/edit.html b/app/plugins/blog/views/admin/edit.html index 986ff11..957a2e8 100644 --- a/app/plugins/blog/views/admin/edit.html +++ b/app/plugins/blog/views/admin/edit.html @@ -12,6 +12,14 @@
+ +
+ +
+ +
+
+
diff --git a/app/plugins/blog/views/list.html b/app/plugins/blog/views/list.html index a924026..0a42697 100644 --- a/app/plugins/blog/views/list.html +++ b/app/plugins/blog/views/list.html @@ -1,7 +1,7 @@ {LOOP}

{title}

- +
{contentSummary}
diff --git a/app/plugins/blog/views/post.html b/app/plugins/blog/views/post.html index b955657..3484817 100644 --- a/app/plugins/blog/views/post.html +++ b/app/plugins/blog/views/post.html @@ -3,7 +3,7 @@

{title}


- + {content} {ADMIN}
diff --git a/app/plugins/blog/views/sidebar.html b/app/plugins/blog/views/sidebar.html index 07ca483..85eb67e 100644 --- a/app/plugins/blog/views/sidebar.html +++ b/app/plugins/blog/views/sidebar.html @@ -5,7 +5,7 @@
    {LOOP} -
  1. {title}
  2. +
  3. {title}
  4. {/LOOP} {ALT}
  5. No Posts to show
  6. @@ -13,6 +13,6 @@
\ No newline at end of file diff --git a/app/plugins/blog/views/sidebar2.html b/app/plugins/blog/views/sidebar2.html index b135d93..d64ac19 100644 --- a/app/plugins/blog/views/sidebar2.html +++ b/app/plugins/blog/views/sidebar2.html @@ -2,7 +2,7 @@

Archives

    {LOOP} -
  • ({count}) {monthText} {year}
  • +
  • ({count}) {monthText} {year}
  • {/LOOP} {ALT}
  • None To Show
  • diff --git a/app/plugins/bugreport/views/create.html b/app/plugins/bugreport/views/create.html index a3607c9..8230842 100644 --- a/app/plugins/bugreport/views/create.html +++ b/app/plugins/bugreport/views/create.html @@ -1,5 +1,6 @@

    Bug Report

    +

    Thank you for visiting our bug reporting page. We value our users' input highly and in an effort to better serve your needs, please fill out the form below to help us address this issue.

    We read each and every bug report submitted, and by submitting this form you allow us to send you a follow-up email.

    diff --git a/app/plugins/comments/controllers/admin/comments.php b/app/plugins/comments/controllers/admin/comments.php index 8967873..4c9ead6 100644 --- a/app/plugins/comments/controllers/admin/comments.php +++ b/app/plugins/comments/controllers/admin/comments.php @@ -49,13 +49,13 @@ class Comments extends AdminController { $this->index(); } - public function viewComments( $contentIID = null ) { - if ( empty( $contentIID ) ) { + public function viewComments( $contentID = null ) { + if ( empty( $contentID ) ) { Issues::add( 'error', 'Content ID not found.' ); return $this->index(); } $contentData = self::$comments->findById( $data ); - if ( empty( $contentIID ) ) { + if ( empty( $contentID ) ) { return Views::view( 'comments.list', $commentData ); } Issues::add( 'error', 'Comment not found.' ); diff --git a/app/plugins/comments/views/list.html b/app/plugins/comments/views/list.html index 3fc478b..1cdf0fc 100644 --- a/app/plugins/comments/views/list.html +++ b/app/plugins/comments/views/list.html @@ -28,7 +28,7 @@ {/LOOP} {ALT} -
  • +
  • Be the first to comment.

    diff --git a/app/plugins/notifications/models/notification.php b/app/plugins/notifications/models/notification.php index 75af1c3..e83b6b2 100644 --- a/app/plugins/notifications/models/notification.php +++ b/app/plugins/notifications/models/notification.php @@ -115,7 +115,7 @@ class Notification extends DatabaseModel { ]; if ( !self::$db->update( $this->tableName, $id, $fields ) ) { new CustomException( 'notificationDelete' ); - Debug::error( "Bookmarks: $id not updated" ); + Debug::error( "Notifications: $id not updated" ); return false; } return true; diff --git a/app/plugins/notifications/views/nav/recentNotificationsDropdown.html b/app/plugins/notifications/views/nav/recentNotificationsDropdown.html index afffdaf..0715826 100644 --- a/app/plugins/notifications/views/nav/recentNotificationsDropdown.html +++ b/app/plugins/notifications/views/nav/recentNotificationsDropdown.html @@ -3,13 +3,13 @@ -
- - -https://www.bookmarkninja.com/ - - -simple robust versatile -sleek -clean -intuitive -modern - -A cleaner app for managing bookmarks to cut down on the clutter - -Available accross all devices and systems. - -regardless of windows or mac, android or apple, wwe have you covered - - -bring all your bookmarks at once, simply export from your current browser and use our import tool - -stop straining your eyes! Not only can you use our dark mode feature, but we have several styles to choose from to customize your experience - - -no mobile app necessary - - -privacy is key! but sharing is ok -by defaults everything is set to private, but usiing the web interface will alow you to share single links or entire lists/folders - + \ No newline at end of file diff --git a/app/views/install/configure.html b/app/views/install/configure.html index a5eac74..3b4c616 100644 --- a/app/views/install/configure.html +++ b/app/views/install/configure.html @@ -1,5 +1,5 @@ -{installer-nav} -
+
+ {installer-nav}
Configure diff --git a/app/views/install/models.html b/app/views/install/models.html index 9b7bd7a..85cba5d 100644 --- a/app/views/install/models.html +++ b/app/views/install/models.html @@ -1,5 +1,5 @@ -{installer-nav} -
+
+ {installer-nav}

All models are required for proper installation of The Tempus Project. In this step, we will add the database tables required for these models. In the next step, you'll be able to select which plugins you would like installed.

diff --git a/app/views/install/nav.html b/app/views/install/nav.html index 84a3eb2..a1e937a 100644 --- a/app/views/install/nav.html +++ b/app/views/install/nav.html @@ -1,12 +1,12 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/views/install/plugins.html b/app/views/install/plugins.html index 94ad294..3adcca6 100644 --- a/app/views/install/plugins.html +++ b/app/views/install/plugins.html @@ -1,5 +1,5 @@ -{installer-nav} -
+
+ {installer-nav}

diff --git a/app/views/install/resources.html b/app/views/install/resources.html index d271668..666f678 100644 --- a/app/views/install/resources.html +++ b/app/views/install/resources.html @@ -1,5 +1,5 @@ -{installer-nav} -

+
+ {installer-nav}

diff --git a/app/views/install/routing.html b/app/views/install/routing.html index 1511e4e..c3306e9 100644 --- a/app/views/install/routing.html +++ b/app/views/install/routing.html @@ -1,5 +1,5 @@ -{installer-nav} -

+
+ {installer-nav}

The Tempus Project uses rewrites in htaccess files (Apache), or location directives (Nginx), to automatically route all incoming traffic through the app. In this step, we will help set-up and then test that the required configurations have been made.

diff --git a/app/views/install/start.html b/app/views/install/start.html deleted file mode 100644 index 3fa11a4..0000000 --- a/app/views/install/start.html +++ /dev/null @@ -1,13 +0,0 @@ -
-
-
- {installer-nav} -

Welcome to The Tempus Project Installer.

-

This installer will guide you through the process of installing and configuring The Tempus Project. Do not forget to delete this file once you have completed installation.

- - -
- -
-
-
\ No newline at end of file diff --git a/app/views/install/agreement.html b/app/views/install/terms.html similarity index 81% rename from app/views/install/agreement.html rename to app/views/install/terms.html index 5db62c6..69ab428 100644 --- a/app/views/install/agreement.html +++ b/app/views/install/terms.html @@ -1,7 +1,7 @@ -{installer-nav} -
+
+ {installer-nav}
-
+
{TERMS}
diff --git a/app/views/install/adminUser.html b/app/views/install/user.html similarity index 95% rename from app/views/install/adminUser.html rename to app/views/install/user.html index 736092a..69d8c74 100644 --- a/app/views/install/adminUser.html +++ b/app/views/install/user.html @@ -1,5 +1,5 @@ -{installer-nav} -
+
+ {installer-nav}
diff --git a/app/views/install/check.html b/app/views/install/verify.html similarity index 91% rename from app/views/install/check.html rename to app/views/install/verify.html index 6c763ab..6b7fcfe 100644 --- a/app/views/install/check.html +++ b/app/views/install/verify.html @@ -1,5 +1,5 @@ -{installer-nav} -
+
+ {installer-nav}

Requirements

diff --git a/app/views/install/welcome.html b/app/views/install/welcome.html new file mode 100644 index 0000000..b95adea --- /dev/null +++ b/app/views/install/welcome.html @@ -0,0 +1,17 @@ +
+
+
+
+ {installer-nav} +

Welcome to The Tempus Project Installer.

+

+ This installer will guide you through the process of installing and configuring The Tempus Project. Do not forget to delete this file once you have completed installation. +

+ + +
+ +
+
+
+
\ No newline at end of file diff --git a/app/views/login.html b/app/views/login.html index 6ed5b17..54aa03c 100644 --- a/app/views/login.html +++ b/app/views/login.html @@ -8,7 +8,7 @@
logo -

AllTheBookmarks

+

{SITENAME}

@@ -26,7 +26,7 @@
- Forgot password? diff --git a/app/views/nav/statusLoggedOut.html b/app/views/nav/statusLoggedOut.html index aecd27d..b9c8dfc 100644 --- a/app/views/nav/statusLoggedOut.html +++ b/app/views/nav/statusLoggedOut.html @@ -1,4 +1,3 @@ -