From 1ef85c6c2cb5cf5b8953a29280347cf2910e0c20 Mon Sep 17 00:00:00 2001 From: Joey Kimsey Date: Wed, 1 Jan 2025 22:17:38 -0500 Subject: [PATCH] wip --- app/classes/api_controller.php | 21 +++-- app/classes/forms.php | 13 +++ app/classes/preferences.php | 2 + app/controllers/api/login.php | 11 +-- app/controllers/usercp.php | 45 ++++++++- app/js/main.js | 59 +++++++----- app/models/token.php | 9 +- app/models/user.php | 5 + app/plugins/blog/views/sidebar.html | 4 +- app/plugins/blog/views/sidebar2.html | 2 +- .../controllers/api/bookmark_folders.php | 4 +- .../bookmarks/controllers/extensions.php | 87 +++++++++++++++++- .../images/edge/bookmark-options.png | Bin 0 -> 12025 bytes .../bookmarks/images/edge/extensions-icon.png | Bin 0 -> 6823 bytes app/plugins/bookmarks/images/edge/options.png | Bin 0 -> 13028 bytes app/plugins/bookmarks/images/edge/pin.png | Bin 0 -> 17681 bytes app/plugins/bookmarks/images/edge/pinned.png | Bin 0 -> 6117 bytes .../bookmarks/images/edge/settings-page.png | Bin 0 -> 41278 bytes .../images/firefox/extensions-icon.png | Bin 0 -> 4601 bytes app/plugins/bookmarks/images/firefox/icon.png | Bin 0 -> 5838 bytes .../bookmarks/images/firefox/manage-page.png | Bin 0 -> 26397 bytes .../images/firefox/manage-select.png | Bin 0 -> 22575 bytes .../bookmarks/images/firefox/manage.png | Bin 0 -> 9840 bytes app/plugins/bookmarks/images/firefox/pin.png | Bin 0 -> 16289 bytes .../bookmarks/images/firefox/pinned.png | Bin 0 -> 5709 bytes .../images/firefox/settings-page.png | Bin 0 -> 37106 bytes .../opera/{optiions.png => options.png} | Bin app/plugins/bookmarks/images/opera/pinned.png | Bin 0 -> 35953 bytes .../bookmarks/images/opera/settings-page.png | Bin 0 -> 38635 bytes app/plugins/bookmarks/js/bookmarklet.js | 35 +++++++ app/plugins/bookmarks/js/bookmarks.js | 30 +++++- .../bookmarks/views/bookmarks/create.html | 6 +- .../bookmarks/views/dashboards/view.html | 1 + .../views/extensions/bookmarklet.html | 76 +++++++++++---- .../extensions/bookmarkletExplainer.html | 19 ++++ .../views/tutorials/edge/export.html | 48 ++++++++++ .../views/tutorials/edge/import.html | 64 +++++++++++++ .../bookmarks/views/tutorials/edge/pin.html | 36 ++++++++ .../views/tutorials/edge/settings.html | 37 ++++++++ .../views/tutorials/firefox/export.html | 4 +- .../views/tutorials/firefox/pin.html | 2 +- .../views/tutorials/firefox/settings.html | 26 +++++- .../views/tutorials/firefox/update.html | 0 .../views/tutorials/opera/export.html | 40 ++++++++ .../views/tutorials/opera/import.html | 48 ++++++++++ .../bookmarks/views/tutorials/opera/pin.html | 46 +++++++++ .../views/tutorials/opera/settings.html | 37 ++++++++ app/plugins/comments/views/create.html | 2 +- app/plugins/comments/views/list.html | 2 +- app/plugins/reviews/controllers/reviews.php | 81 ++++++++++++++-- app/plugins/reviews/forms.php | 16 ++++ app/plugins/reviews/models/review.php | 29 ++++-- .../reviews/models/review_category.php | 26 ++++++ app/plugins/reviews/views/admin/category.html | 49 +++++----- .../reviews/views/admin/categoryCreate.html | 57 +++++++----- .../reviews/views/admin/categoryEdit.html | 57 +++++++----- app/plugins/reviews/views/admin/review.html | 53 ++++++----- app/plugins/reviews/views/admin/view.html | 49 ++++++++++ app/plugins/reviews/views/create.html | 51 +++++++--- app/plugins/reviews/views/edit.html | 44 +++++++++ app/plugins/reviews/views/list.html | 18 ++-- app/plugins/reviews/views/view.html | 47 ++++++++++ app/plugins/wip/views/admin/edit.html | 2 +- app/templates/default/default.inc.php | 11 ++- app/views/register.html | 4 +- 65 files changed, 1200 insertions(+), 215 deletions(-) create mode 100644 app/plugins/bookmarks/images/edge/bookmark-options.png create mode 100644 app/plugins/bookmarks/images/edge/extensions-icon.png create mode 100644 app/plugins/bookmarks/images/edge/options.png create mode 100644 app/plugins/bookmarks/images/edge/pin.png create mode 100644 app/plugins/bookmarks/images/edge/pinned.png create mode 100644 app/plugins/bookmarks/images/edge/settings-page.png create mode 100644 app/plugins/bookmarks/images/firefox/extensions-icon.png create mode 100644 app/plugins/bookmarks/images/firefox/icon.png create mode 100644 app/plugins/bookmarks/images/firefox/manage-page.png create mode 100644 app/plugins/bookmarks/images/firefox/manage-select.png create mode 100644 app/plugins/bookmarks/images/firefox/manage.png create mode 100644 app/plugins/bookmarks/images/firefox/pin.png create mode 100644 app/plugins/bookmarks/images/firefox/pinned.png create mode 100644 app/plugins/bookmarks/images/firefox/settings-page.png rename app/plugins/bookmarks/images/opera/{optiions.png => options.png} (100%) create mode 100644 app/plugins/bookmarks/images/opera/pinned.png create mode 100644 app/plugins/bookmarks/images/opera/settings-page.png create mode 100644 app/plugins/bookmarks/js/bookmarklet.js create mode 100644 app/plugins/bookmarks/views/extensions/bookmarkletExplainer.html create mode 100644 app/plugins/bookmarks/views/tutorials/edge/export.html create mode 100644 app/plugins/bookmarks/views/tutorials/edge/import.html create mode 100644 app/plugins/bookmarks/views/tutorials/edge/pin.html create mode 100644 app/plugins/bookmarks/views/tutorials/edge/settings.html create mode 100644 app/plugins/bookmarks/views/tutorials/firefox/update.html create mode 100644 app/plugins/bookmarks/views/tutorials/opera/export.html create mode 100644 app/plugins/bookmarks/views/tutorials/opera/import.html create mode 100644 app/plugins/bookmarks/views/tutorials/opera/pin.html create mode 100644 app/plugins/bookmarks/views/tutorials/opera/settings.html create mode 100644 app/plugins/reviews/views/edit.html create mode 100644 app/plugins/reviews/views/view.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 6b840f0..3bf15fa 100644 --- a/app/classes/preferences.php +++ b/app/classes/preferences.php @@ -201,6 +201,8 @@ class Preferences { $tempPrefsArray = $this->normalizePreferenceArray( $name, $details ); if ( isset( $populated[ $name ] ) ) { $tempPrefsArray['value'] = $populated[$name]; + } else { + $tempPrefsArray['value'] = $tempPrefsArray['default']; } // $form .= Forms::getFormFieldHtml( $name, $tempPrefsArray['pretty'], $tempPrefsArray['type'], $tempPrefsArray['default'], $tempPrefsArray['options'] ); if ( $tempPrefsArray['type'] == 'checkbox' ) { 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/usercp.php b/app/controllers/usercp.php index c1c9b15..c0b13cf 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,6 +98,8 @@ 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' ) ) { @@ -109,4 +115,39 @@ 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 ); + $fields2 = []; + $fields3 = $fields1; + + if ( isset( $fields1[ $name ] ) ) { + $fields2[ $name ] = $value; + $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/js/main.js b/app/js/main.js index 5b38519..3173ece 100644 --- a/app/js/main.js +++ b/app/js/main.js @@ -119,35 +119,46 @@ 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'); + if (darkModeStylesheet.disabled) { + toggleDarkModePref( true ); + darkModeStylesheet.disabled = false; + localStorage.setItem('darkMode', 'enabled'); } else { - table.classList.add('table-light'); - table.classList.remove('table-dark'); + 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/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/views/sidebar.html b/app/plugins/blog/views/sidebar.html index 07ca483..7cdf184 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..8be0657 100644 --- a/app/plugins/blog/views/sidebar2.html +++ b/app/plugins/blog/views/sidebar2.html @@ -2,7 +2,7 @@

Archives