| | |
| | | <?php |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\forms\TaxonomySelector; |
| | | use JetBrains\PhpStorm\NoReturn;use JVBase\forms\TaxonomySelector; |
| | | use JVBase\base\Site; |
| | | use JVBase\meta\Form; |
| | | use JVBase\integrations\ServiceMap;use JVBase\meta\Form; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\ui\Navigation; |
| | | use WP_Error;use WP_Query;use WP_User; |
| | |
| | | */ |
| | | class DashboardManager |
| | | { |
| | | use ServiceMap; |
| | | |
| | | protected WP_User $user; |
| | | protected Cache $cache; |
| | | protected string $role; |
| | |
| | | |
| | | public function __construct() |
| | | { |
| | | $this->cache = Cache::for('dashboard', WEEK_IN_SECONDS)->connect('user'); |
| | | $this->cache = Cache::for('dashboard', WEEK_IN_SECONDS)->user(); |
| | | |
| | | |
| | | add_action('init', [$this, 'registerDashboard']); |
| | | |
| | | $this->user = wp_get_current_user(); |
| | |
| | | |
| | | jvb_register_do_once('buildDashboard', [$this, 'activate']); |
| | | |
| | | add_filter('the_seo_framework_sitemap_exclude_ids', [$this, 'excludeDashboard'], 10, 1); |
| | | add_filter('the_seo_framework_sitemap_exclude_ids', [$this, 'excludeDashboard'], 8, 1); |
| | | } |
| | | |
| | | public function excludeDashboard(array $ids):array { |
| | | $cached = $this->cache->remember( |
| | | public function excludeDashboard(array $IDs):array { |
| | | $exclude = $this->cache->remember( |
| | | 'dashboardIDs', |
| | | function() { |
| | | return get_posts([ |
| | |
| | | 'fields' => 'ids', |
| | | ]); |
| | | }); |
| | | return array_merge($ids, $cached); |
| | | if (!empty($exclude)) { |
| | | $IDs = array_merge($IDs, $exclude); |
| | | } |
| | | |
| | | return $IDs; |
| | | } |
| | | |
| | | /** |
| | |
| | | /** |
| | | * Redirect all non-admin users from wp-admin to custom dashboard |
| | | */ |
| | | public function redirectFromAdmin() |
| | | public function redirectFromAdmin():void |
| | | { |
| | | // Skip if already processing a redirect |
| | | if (defined('DOING_AJAX') && DOING_AJAX) { |
| | |
| | | } |
| | | } |
| | | |
| | | protected function redirectToLogin():void |
| | | #[NoReturn]protected function redirectToLogin():void |
| | | { |
| | | wp_redirect(wp_login_url(get_home_url(null, '/dash'))); |
| | | exit; |
| | | } |
| | | |
| | | protected function redirectToDashboard():void |
| | | #[NoReturn]protected function redirectToDashboard():void |
| | | { |
| | | wp_redirect(get_home_url(null, '/dash')); |
| | | exit; |
| | |
| | | if (!is_404() && !is_user_logged_in()) { |
| | | error_log('Redirecting to login - user not logged in'); |
| | | $this->redirectToLogin(); |
| | | return; |
| | | } |
| | | |
| | | // If logged in but doesn't have dashboard access, redirect to home |
| | |
| | | if (is_404() && (str_starts_with($wp->request, 'dash/') || $wp->request === 'dash')) { |
| | | error_log('404 on dashboard URL, redirecting to dashboard home'); |
| | | $this->redirectToDashboard(); |
| | | return; |
| | | } |
| | | |
| | | // For valid dashboard pages, check access permissions |
| | |
| | | $page = $this->getCurrentPageTitle(); |
| | | // Check if page exists in allowed pages |
| | | $allowedPages = $this->getUserAllowedPages(); |
| | | |
| | | error_log('Allowed pages: '.print_r($allowedPages, true)); |
| | | if (!in_array($page, $allowedPages)) { |
| | | error_log("User not allowed to access page: {$page}"); |
| | | $this->redirectToDashboard(); |
| | |
| | | */ |
| | | protected function buildIntegrationPages(int $parentID):void |
| | | { |
| | | $integrations = JVB()->getAvailableServices(false); |
| | | |
| | | foreach ($integrations as $name => $integration) { |
| | | $integrations = $this->getAvailableServices(); |
| | | foreach ($integrations as $service) { |
| | | $integration = $this->getService($service); |
| | | $title = $integration->getTitle(); |
| | | |
| | | $slug = sanitize_title($title); |
| | | $this->createDashboardPage($slug, $title, $parentID); |
| | | } |
| | |
| | | } |
| | | $integrationSlugs = array_map(function($name) { |
| | | return sanitize_title(str_replace('_', '-', $name)); |
| | | }, array_keys(JVB()->getAvailableServices(false))); |
| | | }, array_keys($this->getAvailableServices())); |
| | | |
| | | // Check if this is an integration subpage |
| | | if (in_array($page, $integrationSlugs)) { |
| | |
| | | } |
| | | protected function renderDashboard(string $page):string |
| | | { |
| | | ob_start(); |
| | | // ob_start(); |
| | | jvbInlineStyles('nav'); |
| | | jvbInlineStyles('dash'); |
| | | jvbInlineStyles('forms'); |
| | | $this->renderHeader(); |
| | | // Pass to page handler |
| | | $constantSlug = $this->getConstantSlug($page); |
| | | |
| | | echo apply_filters( |
| | | 'jvbDashboardPage', |
| | | $this->renderPage($page), |
| | |
| | | ); |
| | | |
| | | $this->renderFooter(); |
| | | return ob_get_clean(); |
| | | // return ob_get_clean(); |
| | | return ''; |
| | | // $integrationSlugs = array_map(function($name) { |
| | | // return sanitize_title(str_replace('_', '-', $name)); |
| | | // }, array_keys(JVB()->getAvailableServices(false))); |
| | |
| | | } |
| | | |
| | | } |
| | | return $icon; |
| | | return match($icon) { |
| | | 'favourites' => 'heart', |
| | | default => $icon |
| | | }; |
| | | }); |
| | | } |
| | | protected function getSlug(string $slug, string $page):string |
| | |
| | | |
| | | <?php |
| | | $menu = new Navigation('sidebar'); |
| | | $menuClasses = ['col', 'left', 'nowrap']; |
| | | $menuClasses = ['left']; |
| | | $itemClasses = ['col']; |
| | | $menu->addClass('col left')->hasToggle()->defaultMenuClasses($menuClasses); |
| | | $menu->addClass('sidebar left')->hasToggle()->defaultMenuClasses($menuClasses); |
| | | $menu->defaultItemClasses($itemClasses); |
| | | $pages = $this->getUserAllowedPages()?:[]; |
| | | //Dashboard |
| | |
| | | //content types |
| | | $all = array_merge( |
| | | Registrar::getRegistered('post'), |
| | | Registrar::getFeatured('is_content', 'term') |
| | | Registrar::withFeature('is_content', 'term') |
| | | ); |
| | | $availableContent = array_filter($pages, function($page, $key) use($all) { |
| | | return !is_numeric($key) && in_array($key, $all) && JVB()->roles()->checkRole($this->user, $key); |
| | | return !is_numeric($key) && in_array($key, $all) && Roles::getInstance()()->checkRole($this->user, $key); |
| | | }, ARRAY_FILTER_USE_BOTH); |
| | | if (!empty ($availableContent)){ |
| | | $content = $menu->addItem('Your Content', jvbDashIcon('book-bookmark')) |
| | |
| | | |
| | | public function renderIndex(string $content, string $page):string |
| | | { |
| | | jvbDump($page); |
| | | if ($page !== '' && $page !== 'dash') { |
| | | return $content; |
| | | } |
| | | |
| | | if (Site::has('referrals')) { |
| | | $whatever = JVB()->referrals()->getReferralWelcomeMessage($this->user->ID); |
| | | $whatever = Referrals::getInstance()->getReferralWelcomeMessage($this->user->ID); |
| | | if (!empty($whatever)) { |
| | | return $whatever; |
| | | } |
| | |
| | | jvbRenderSections($this->userLink, 'post', $type); |
| | | } |
| | | |
| | | protected function renderSettings():void |
| | | { |
| | | wp_enqueue_script('jvb-form'); |
| | | wp_enqueue_script( |
| | | 'jvb-bio-manager', |
| | | JVB_URL.'assets/js/min/bioManager.min.js', |
| | | array('jvb-client-queue', 'sortablejs', 'quill-js', 'jvb-taxonomy-selector'), |
| | | '1.0.0', |
| | | true |
| | | ); |
| | | wp_localize_script('jvb-bio-manager', 'bioSettings', [ |
| | | 'type' => 'user_settings', |
| | | ]); |
| | | $content = apply_filters('jvbDashboardSettings', ''); |
| | | if ($content !== '') { |
| | | echo $content; |
| | | } else { |
| | | jvbRenderSections($this->user->ID, 'user', jvbUserRole()); |
| | | } |
| | | |
| | | } |
| | | |
| | | protected function getIntegrationsMenu():string |
| | | { |
| | | $integrations = JVB()->getAvailableServices(false); |
| | | $integrations = $this->getAvailableServices(); |
| | | $out = ''; |
| | | if (!empty($integrations)) { |
| | | $out = '<nav class="integrations"><ul>'; |
| | | |
| | | $url = get_home_url(null, '/dash/integrations/'); |
| | | $out .= '<li><a href="'.$url.'">'.jvbDashIcon('plugs-connected').'Integrations</a></li>'; |
| | | foreach ($integrations as $name=> $integration) { |
| | | if (!JVB()->userCanConnect($name, $this->user->ID) || !$integration->hasDefaults()) { |
| | | foreach ($integrations as $service) { |
| | | $integration = $this->getService($service); |
| | | if (method_exists($integration, 'userCanConnect') && !$integration->userCanConnect($this->user->ID)) { |
| | | continue; |
| | | } |
| | | $link = sanitize_title(str_replace('_', '-',$name)); |
| | | $link = sanitize_title(str_replace('_', '-',$service)); |
| | | $out .= '<li><a href="'.$url.$link.'">'.jvbDashIcon($integration->icon).$integration->getTitle().'</a></li>'; |
| | | } |
| | | $out .= '</ul></nav>'; |
| | |
| | | if ($connection !== 'integrations') { |
| | | |
| | | $userID = (Site::has('has_membership')) ? $this->user->ID : null; |
| | | $integration = JVB()->connect($connection, $userID); |
| | | |
| | | echo '<h1>Managing '.$integration->title.'</h1>'; |
| | | $integration->renderDefaults(); |
| | | $integration = $this->getServiceUser($connection, $userID); |
| | | if (method_exists($integration, 'renderDefaults')) { |
| | | echo '<h1>Managing '.$integration->title.'</h1>'; |
| | | $integration->renderDefaults(); |
| | | } |
| | | } else { |
| | | ?> |
| | | <section class="item-grid integrations"> |
| | | <?php |
| | | $all = JVB()->getAvailableServices(); |
| | | foreach ($all as $name) { |
| | | |
| | | foreach ($this->getAvailableServices() as $name) { |
| | | if (current_user_can('manage_options')) { |
| | | $userID = null; |
| | | } else { |
| | | $userID = $this->user->ID; |
| | | } |
| | | |
| | | JVB()->connect($name, $userID)->renderConnection(); |
| | | $integration = $this->getService($name); |
| | | if (method_exists($integration, 'determineUser') |
| | | && method_exists($integration, 'renderConnection')) { |
| | | $integration->determineUser(); |
| | | $integration->renderConnection(); |
| | | } |
| | | } |
| | | ?> |
| | | </section> |
| | |
| | | <?php |
| | | $i=1; |
| | | $content = Registrar::getRegistered('post'); |
| | | $contentTax = Registrar::getFeatured('is_content', 'term'); |
| | | $contentTax = Registrar::withFeature('is_content', 'term'); |
| | | $taxonomies = Registrar::getRegistered('term'); |
| | | foreach($contentTax as $index => $tax) { |
| | | unset($taxonomies[$index]); |
| | |
| | | |
| | | echo jvbNewModal( |
| | | 'edit-modal '.$type, |
| | | 'edit-modal', |
| | | 'Edit '.ucfirst($type), |
| | | jvbRenderForm('admin', $fields) |
| | | ); |
| | |
| | | $pages[] = 'Favourites'; |
| | | } |
| | | |
| | | if (!empty(Registrar::getFeatured('karma'))) { |
| | | if (!empty(Registrar::withFeature('karma'))) { |
| | | $pages[] = 'Karmic Score'; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | if (!$user || !$this->userHasDashboardAccess($user)) { |
| | | error_log('No Dashboard Access'); |
| | | return []; |
| | | } |
| | | |
| | | |
| | | $pages = $this->cache->get($userID); |
| | | |
| | | $pages = false; |
| | | if ($pages === false || JVB_TESTING) { |
| | | if (user_can($userID, 'manage_options')) { |
| | | // Admin gets all pages as flat array |
| | |
| | | $pages = $this->getAllDashboardPages(); |
| | | |
| | | $canSkip = user_can($userID, 'skip_moderation'); |
| | | jvbDump($pages, 'All Pages'); |
| | | foreach($pages as $key => $slug) { |
| | | //Default to Remove pages |
| | | $remove = true; |
| | |
| | | $membership = Site::membership(); |
| | | $type = $registrar? $registrar->getType() : false; |
| | | if ($type) { |
| | | $permission = JVB()->roles()->getPermission('edit', $key); |
| | | $permission = Roles::getInstance()()->getPermission('edit', $key); |
| | | } |
| | | switch ($type) { |
| | | case 'content': |
| | |
| | | break; |
| | | case 'taxonomy': |
| | | $registrar = Registrar::getInstance($key); |
| | | if ($registrar && $registrar->hasFeature('is_content') && (!empty(JVB()->roles()->getOwnedTerms($userID, $key)) || !empty(JVB()->roles()->getManagedTerms($userID, $key)))){ |
| | | if ($registrar && $registrar->hasFeature('is_content') && (!empty(Roles::getInstance()()->getOwnedTerms($userID, $key)) || !empty(Roles::getInstance()()->getManagedTerms($userID, $key)))){ |
| | | $remove = false; |
| | | } else if (count(array_intersect($registrar->registrar->for, array_keys($pages))) > 0) { |
| | | $remove = false; |
| | |
| | | foreach ($roles as $role) { |
| | | $contents = Registrar::getInstance($role)?->getCreatable(); |
| | | if (!empty($contents)) { |
| | | $hasKarma = Registrar::getFeatured('karma'); |
| | | $hasKarma = Registrar::withFeature('karma'); |
| | | $remove = empty(array_intersect($contents, $hasKarma)); |
| | | } |
| | | } |
| | | break; |
| | | case 'Account': |
| | | case 'dash': |
| | | case 'Referrals': |
| | | case 'favourites': |
| | |
| | | */ |
| | | protected function getRolesWithDashboard():array |
| | | { |
| | | return Registrar::getFeatured('has_dashboard', 'user'); |
| | | return Registrar::withFeature('has_dashboard', 'user'); |
| | | } |
| | | |
| | | /** |