Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions DashboardsAccess.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace Funarte;

class DashboardsAccess
{
public static function userCanAccess(?object $user): bool
{
if (!$user || $user->is('guest')) {
return false;
}

return $user->is('admin') || $user->hasRole('dados');
}

public static function userMenuLinkMarkup(string $label = 'Painéis de Dados'): string
{
return sprintf(
'<li><mc-link route="dashboards/index" icon="dashboard">%s</mc-link></li>',
$label
);
}

public static function appendPanelNavItem(array &$navItems, ?object $user, string $label = 'Painéis de Dados'): void
{
if (!self::userCanAccess($user)) {
return;
}

if (!isset($navItems['admin']['items']) || !is_array($navItems['admin']['items'])) {
$navItems['admin']['items'] = [];
}

foreach ($navItems['admin']['items'] as $item) {
if (($item['route'] ?? null) === 'dashboards') {
return;
}
}

array_unshift($navItems['admin']['items'], [
'route' => 'dashboards/index',
'icon' => 'dashboard',
'label' => $label,
]);
}
}
29 changes: 29 additions & 0 deletions DashboardsController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace Funarte;

use MapasCulturais\App;

class DashboardsController extends \MapasCulturais\Controller
{
/**
* Página principal de Painéis de Dados
* Acesso restrito a usuários com role 'dados' ou 'admin'
*/
public function ALL_index()
{
$app = App::i();

if ($app->user->is('guest')) {
$this->redirect($app->createUrl('auth'));
return;
}

if (!DashboardsAccess::userCanAccess($app->user)) {
$this->redirect($app->createUrl('site', 'index'));
return;
}

$this->render('index');
}
}
6 changes: 5 additions & 1 deletion Theme.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use MapasCulturais\API;
use MapasCulturais\Definitions;
use MapasCulturais\Entities\Agent;
use MapasCulturais\i;

// class Theme extends \Subsite\Theme {
class Theme extends \MapasCulturais\Themes\BaseV2\Theme
Expand All @@ -23,6 +24,7 @@ function __construct($config = [])
parent::__construct($config);
$app->registerController('funarte_search', 'Funarte\SearchController');
$app->registerController('circuitos', 'Funarte\CircuitosController');
$app->registerController('dashboards', 'Funarte\DashboardsController');
}

function register()
Expand Down Expand Up @@ -103,6 +105,8 @@ function _init()
...$i
];
}

DashboardsAccess::appendPanelNavItem($nav_items, $app->user, i::__('Painéis de Dados'));
});

/*
Expand Down Expand Up @@ -164,7 +168,7 @@ function _init()
$icon['project'] = "ph:pinwheel-fill";
$icon['calendar'] = "bx:calendar";
$icon['map-marker'] = "mdi:map-marker";

});

}
Expand Down
13 changes: 13 additions & 0 deletions components/user-menu-dashboards-link/template.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php
/**
* @var MapasCulturais\App $app
* @var MapasCulturais\Themes\BaseV2\Theme $this
*/

use MapasCulturais\i;

$user = $app->user;

if (\Funarte\DashboardsAccess::userCanAccess($user)) {
echo \Funarte\DashboardsAccess::userMenuLinkMarkup(i::__('Painéis de Dados'));
}
57 changes: 57 additions & 0 deletions views/dashboards/index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<style>

.container {
display: flex;
flex: 1;
overflow: hidden;

/* Centering Logic */
width: 100%;
max-width: 1400px; /* Controls how wide the content gets */
margin: 0 auto; /* Centers the container horizontally */

/* Visual polish */
background-color: white;
box-shadow: 0 0 20px rgba(0,0,0,0.05); /* Adds a subtle shadow */
border-left: 1px solid #e0e0e0;
border-right: 1px solid #e0e0e0;
}

aside { width: 260px; background-color: #ffffff; border-right: 1px solid #e0e0e0; display: flex; flex-direction: column; padding-top: 10px; overflow-y: auto; }

.menu-title { font-size: 0.75rem; color: #888; text-transform: uppercase; font-weight: bold; padding: 15px 20px 10px; letter-spacing: 0.5px; }

button { background: none; border: none; width: 100%; padding: 12px 20px; text-align: left; cursor: pointer; color: #444; font-size: 0.95rem; transition: 0.2s; outline: none; }
button:hover { background-color: #f0f0f0; }
button.active { background-color: #e0f7fa; color: #006064; border-left: 4px solid #0e01c7; font-weight: 600; }

main { flex: 1; background-color: #fff; position: relative; }
iframe { width: 100%; height: 100%; border: none; display: block; }
</style>

<div class="container">
<aside>
<div class="menu-title">Navegue pelos Painéis</div>

<button class="nav-btn active" onclick="loadDashboard(this, 'https://metabase.cultura.gov.br/public/dashboard/e52c6973-adf2-4494-bf16-a894c0b89fbc')">Agentes - Diagnóstico Sociodemográfico e Diversidade</button>
<button class="nav-btn" onclick="loadDashboard(this, 'https://metabase.cultura.gov.br/public/dashboard/f02defdf-6934-48f6-a26e-074537c80500')">Agenda Cultural</button>
<button class="nav-btn" onclick="loadDashboard(this, 'https://metabase.cultura.gov.br/public/dashboard/ccf8418a-03ad-4919-aeba-bfb7279859f0')">Gestão de Fomento e Editais</button>
<button class="nav-btn" onclick="loadDashboard(this, 'https://metabase.cultura.gov.br/public/dashboard/50fd3415-8c54-4749-abd9-95a98cd61797')">Iniciativas Culturais</button>
<button class="nav-btn" onclick="loadDashboard(this, 'https://metabase.cultura.gov.br/public/dashboard/bf432615-189e-4e97-b1af-2a895a1cb8ba')">Espaços Culturais</button>
<button class="nav-btn" onclick="loadDashboard(this, 'https://metabase.cultura.gov.br/public/dashboard/f2110b02-18d5-4fb5-b81b-efd21dc8c9c7')">Monitoramento do Sistema (Operacional)</button>
<button class="nav-btn" onclick="loadDashboard(this, 'https://metabase.cultura.gov.br/public/dashboard/1f578420-aeea-4109-ac3b-4eae3e80215e')">Comunicação</button>
</aside>

<main>
<iframe id="dashboard-frame" src="https://metabase.cultura.gov.br/public/dashboard/e52c6973-adf2-4494-bf16-a894c0b89fbc" allowtransparency></iframe>
</main>
</div>

<script>
function loadDashboard(btn, url) {
const frame = document.getElementById('dashboard-frame');
if (frame.src !== url) frame.src = url;
document.querySelectorAll('.nav-btn').forEach(b => b.classList.remove('active'));
btn.classList.add('active');
}
</script>