- added admin roles "SUPERADMIN", "CORPORATION" (access), and "MEMBER" (default role).
This commit is contained in:
@@ -10,7 +10,6 @@ namespace Controller;
|
||||
|
||||
|
||||
use Controller\Ccp\Sso;
|
||||
use Model\BasicModel;
|
||||
use Model\CharacterModel;
|
||||
use Model\CorporationModel;
|
||||
|
||||
@@ -84,7 +83,9 @@ class Admin extends Controller{
|
||||
$adminCharacter = null;
|
||||
if( !$f3->exists(Sso::SESSION_KEY_SSO_ERROR) ){
|
||||
if( $character = $this->getCharacter() ){
|
||||
if($character->roleId == 1){
|
||||
$this->setCharacterRole($character);
|
||||
|
||||
if($character->role != 'MEMBER'){
|
||||
// current character is admin
|
||||
$adminCharacter = $character;
|
||||
}else{
|
||||
@@ -103,6 +104,36 @@ class Admin extends Controller{
|
||||
return $adminCharacter;
|
||||
}
|
||||
|
||||
/**
|
||||
* set temp "virtual" field with current admin role name for a $characterModel
|
||||
* @param CharacterModel $character
|
||||
*/
|
||||
protected function setCharacterRole(CharacterModel $character){
|
||||
$character->virtual('role', function($character){
|
||||
// default role based on roleId (auto-detected)
|
||||
if( ($role = array_search ($character->roleId, CharacterModel::ROLES)) === false ){
|
||||
$role = 'MEMBER';
|
||||
}
|
||||
|
||||
/**
|
||||
* check config files for hardcoded character roles
|
||||
* -> overwrites default role (e.g. auto detected by corp in-game roles)
|
||||
*/
|
||||
if($this->getF3()->exists('PATHFINDER.ADMIN.CHARACTER', $globalAdminData)){
|
||||
foreach((array)$globalAdminData as $adminData){
|
||||
if($adminData['ID'] === $character->_id){
|
||||
if( CharacterModel::ROLES[$adminData['ROLE']] ){
|
||||
$role = $adminData['ROLE'];
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $role;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* dispatch page events by URL $params
|
||||
* @param \Base $f3
|
||||
@@ -112,7 +143,6 @@ class Admin extends Controller{
|
||||
public function dispatch(\Base $f3, $params, $character = null){
|
||||
if($character instanceof CharacterModel){
|
||||
// user logged in
|
||||
|
||||
$parts = array_values(array_filter(array_map('strtolower', explode('/', $params['*']))));
|
||||
$f3->set('tplPage', $parts[0]);
|
||||
|
||||
@@ -233,12 +263,31 @@ class Admin extends Controller{
|
||||
* @param CharacterModel $character
|
||||
*/
|
||||
protected function initMembers(\Base $f3, CharacterModel $character){
|
||||
$data = (object) [];;
|
||||
$data = (object) [];
|
||||
|
||||
$test = BasicModel::getNew('CharacterModel');
|
||||
$test->getById( $character->_id, 0);
|
||||
if($characterCorporation = $character->getCorporation()){
|
||||
$corporations = [];
|
||||
|
||||
$data->members = $test->getCorporation()->getCharacters();
|
||||
switch($character->role){
|
||||
case 'SUPERADMIN':
|
||||
if($accessCorporations = CorporationModel::getAll(['addNPC' => true])){
|
||||
$corporations = $accessCorporations;
|
||||
}
|
||||
break;
|
||||
case 'CORPORATION':
|
||||
$corporations[] = $characterCorporation;
|
||||
break;
|
||||
}
|
||||
|
||||
foreach($corporations as $corporation){
|
||||
$data->corpMembers[$corporation->name] = $corporation->getCharacters();
|
||||
}
|
||||
|
||||
// sort corporation from current user first
|
||||
if( !empty($data->corpMembers[$characterCorporation->name]) ){
|
||||
$data->corpMembers = array($characterCorporation->name => $data->corpMembers[$characterCorporation->name]) + $data->corpMembers;
|
||||
}
|
||||
}
|
||||
|
||||
$f3->set('tplMembers', $data);
|
||||
}
|
||||
|
||||
@@ -605,7 +605,7 @@ abstract class BasicModel extends \DB\Cortex {
|
||||
* @return false|null|string
|
||||
*/
|
||||
public function getFormattedColumn($column, $format = 'Y-m-d H:i'){
|
||||
return $this->get($column) ? date($format, strtotime( $this->get($column) )) : null;;
|
||||
return $this->get($column) ? date($format, strtotime( $this->get($column) )) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -33,6 +33,15 @@ class CharacterModel extends BasicModel {
|
||||
'KICKED' => 'character is kicked',
|
||||
'BANNED' => 'character is banned'
|
||||
];
|
||||
|
||||
/**
|
||||
* all admin roles and related roleId for a character
|
||||
*/
|
||||
const ROLES = [
|
||||
'MEMBER' => 0,
|
||||
'SUPERADMIN' => 1,
|
||||
'CORPORATION' => 2
|
||||
];
|
||||
|
||||
/**
|
||||
* enables change for "kicked" column
|
||||
@@ -582,13 +591,13 @@ class CharacterModel extends BasicModel {
|
||||
* @return int
|
||||
*/
|
||||
public function requestRoleId(){
|
||||
$roleId = 0;
|
||||
$rolesData = $this->requestRoles();
|
||||
if( !empty($rolesData) ){
|
||||
$roleId = self::ROLES['MEMBER'];
|
||||
|
||||
if( !empty($rolesData = $this->requestRoles()) ){
|
||||
// roles that grant admin access for this character
|
||||
$adminRoles = array_intersect(CorporationModel::ADMIN_ROLES, $rolesData);
|
||||
if( !empty($adminRoles) ){
|
||||
$roleId = 1;
|
||||
$roleId = self::ROLES['CORPORATION'];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -202,4 +202,23 @@ class CorporationModel extends BasicModel {
|
||||
|
||||
return $characterRolesData;
|
||||
}
|
||||
|
||||
/**
|
||||
* get all corporations
|
||||
* @param array $options
|
||||
* @return \DB\CortexCollection
|
||||
*/
|
||||
public static function getAll($options = []){
|
||||
$query = [
|
||||
'active = :active',
|
||||
':active' => 1
|
||||
];
|
||||
|
||||
if( !$options['addNPC'] ){
|
||||
$query[0] .= ' AND isNPC = :isNPC';
|
||||
$query[':isNPC'] = 1;
|
||||
}
|
||||
|
||||
return (new self())->find($query);
|
||||
}
|
||||
}
|
||||
@@ -4,99 +4,102 @@
|
||||
|
||||
<h4><i class="fa fa-fw fa-users"></i> {{ ucfirst(@tplPage) }}</h4>
|
||||
|
||||
<div class="row text-center">
|
||||
<div class="col-xs-12 pf-landing-pricing-panel">
|
||||
<div class="panel panel-default pricing-big">
|
||||
<div class="panel-heading text-left">
|
||||
<h3 class="panel-title">Corporation</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<table id="table_id" class="stripe order-column row-border dataTable" data-order="[1, "asc"]" data-length-change="0" data-paging-type="full_numbers">
|
||||
<thead>
|
||||
<tr>
|
||||
<th data-width="50">id</th>
|
||||
<th>name</th>
|
||||
<th data-width="50">role</th>
|
||||
<th data-width="50">share</th>
|
||||
<th data-width="50">tracking</th>
|
||||
<th data-width="50">security</th>
|
||||
<th data-width="90">last login</th>
|
||||
<th data-width="90">kicked until</th>
|
||||
<th data-width="90" data-orderable="false">kick</th>
|
||||
<th data-width="90">banned since</th>
|
||||
<th data-width="30" data-orderable="false">ban</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<repeat group="{{ @tplMembers->members }}" value="{{ @member }}" counter="{{ @ctr }}">
|
||||
<set disableRow = "{{@member->_id}} == {{@character->_id}}" />
|
||||
|
||||
<repeat group="{{ @tplMembers->corpMembers }}" value="{{ @corpMember }}" key="{{@corpName}}" counter="{{ @corpCount }}">
|
||||
<div class="row text-center">
|
||||
<div class="col-xs-12 pf-landing-pricing-panel">
|
||||
<div class="panel panel-default pricing-big">
|
||||
<div class="panel-heading text-left">
|
||||
<h3 class="panel-title">{{ @corpCount }}. {{@corpName}}</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<table id="table_id" class="stripe order-column row-border dataTable" data-order="[1, "asc"]" data-length-change="0" data-paging-type="full_numbers">
|
||||
<thead>
|
||||
<tr>
|
||||
<td class="text-right">{{ @member->_id }}</td>
|
||||
<td class="pf-table-button-sm-cell" data-order="{{ @member->name }}" data-search="{{ @member->name }}">
|
||||
<img src="//image.eveonline.com/Character/{{ @member->_id }}_32.jpg" > {{ @member->name }}
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<check if="{{ @member->roleId }}">
|
||||
<span class="label label-success">admin</span>
|
||||
</check>
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<check if="{{ @member->shared }}">
|
||||
<true>
|
||||
<span class="label label-info">active</span>
|
||||
</true>
|
||||
<false>
|
||||
<span class="label label-default">disabled</span>
|
||||
</false>
|
||||
</check>
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<check if="{{ @member->logLocation }}">
|
||||
<true>
|
||||
<span class="label label-success">active</span>
|
||||
</true>
|
||||
<false>
|
||||
<span class="label label-warning">disabled</span>
|
||||
</false>
|
||||
</check>
|
||||
</td>
|
||||
<td class="text-right txt-color {{ @member->securityStatus >= 0 ? 'txt-color-green' : 'txt-color-orange' }}">{{ number_format(round(@member->securityStatus, 2), 2) }}</td>
|
||||
<td class="text-right">{{ @member->getFormattedColumn('lastLogin') }}</td>
|
||||
<td class="text-right txt-color txt-color-orange">{{ @member->getFormattedColumn('kicked') }}</td>
|
||||
<td class="text-center pf-table-button-sm-cell">
|
||||
<div class="btn-group btn-group-sm" role="group">
|
||||
<check if="{{ @member->kicked }}">
|
||||
<th data-width="50">id</th>
|
||||
<th>name</th>
|
||||
<th data-width="50">role</th>
|
||||
<th data-width="50">share</th>
|
||||
<th data-width="50">tracking</th>
|
||||
<th data-width="50">security</th>
|
||||
<th data-width="90">last login</th>
|
||||
<th data-width="90">kicked until</th>
|
||||
<th data-width="90" data-orderable="false">kick</th>
|
||||
<th data-width="90">banned since</th>
|
||||
<th data-width="30" data-orderable="false">ban</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<repeat group="{{ @corpMember }}" value="{{ @member }}" counter="{{ @memberCount }}">
|
||||
<set disableRow = "{{@member->_id}} == {{@character->_id}}" />
|
||||
|
||||
<tr>
|
||||
<td class="text-right">{{ @member->_id }}</td>
|
||||
<td class="pf-table-button-sm-cell" data-order="{{ @member->name }}" data-search="{{ @member->name }}">
|
||||
<img src="//image.eveonline.com/Character/{{ @member->_id }}_32.jpg" > {{ @member->name }}
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<check if="{{ @member->roleId }}">
|
||||
<span class="label label-success">admin</span>
|
||||
</check>
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<check if="{{ @member->shared }}">
|
||||
<true>
|
||||
<a class="btn btn-primary {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/kick/{{ @member->_id }}">revoke</a>
|
||||
<span class="label label-info">active</span>
|
||||
</true>
|
||||
<false>
|
||||
<repeat group="{{ @tplKickOptions }}" key="{{ @key }}" value="{{ @label }}">
|
||||
<a class="btn btn-default {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/kick/{{ @member->_id }}/{{ @key }}">{{ @label }}</a>
|
||||
</repeat>
|
||||
<span class="label label-default">disabled</span>
|
||||
</false>
|
||||
</check>
|
||||
</div>
|
||||
</td>
|
||||
<td class="text-right txt-color txt-color-danger">{{ @member->getFormattedColumn('banned') }}</td>
|
||||
<td class="text-center pf-table-button-sm-cell">
|
||||
<check if="{{ @member->banned }}">
|
||||
<true>
|
||||
<a class="btn btn-sm btn-primary {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/ban/{{ @member->_id }}">revoke</a>
|
||||
</true>
|
||||
<false>
|
||||
<a class="btn btn-sm btn-danger {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/ban/{{ @member->_id }}/1">ban</a>
|
||||
</false>
|
||||
</check>
|
||||
</td>
|
||||
</tr>
|
||||
</repeat>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<check if="{{ @member->logLocation }}">
|
||||
<true>
|
||||
<span class="label label-success">active</span>
|
||||
</true>
|
||||
<false>
|
||||
<span class="label label-warning">disabled</span>
|
||||
</false>
|
||||
</check>
|
||||
</td>
|
||||
<td class="text-right txt-color {{ @member->securityStatus >= 0 ? 'txt-color-green' : 'txt-color-orange' }}">{{ number_format(round(@member->securityStatus, 2), 2) }}</td>
|
||||
<td class="text-right">{{ @member->getFormattedColumn('lastLogin') }}</td>
|
||||
<td class="text-right txt-color txt-color-orange">{{ @member->getFormattedColumn('kicked') }}</td>
|
||||
<td class="text-center pf-table-button-sm-cell">
|
||||
<div class="btn-group btn-group-sm" role="group">
|
||||
<check if="{{ @member->kicked }}">
|
||||
<true>
|
||||
<a class="btn btn-primary {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/kick/{{ @member->_id }}">revoke</a>
|
||||
</true>
|
||||
<false>
|
||||
<repeat group="{{ @tplKickOptions }}" key="{{ @key }}" value="{{ @label }}">
|
||||
<a class="btn btn-default {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/kick/{{ @member->_id }}/{{ @key }}">{{ @label }}</a>
|
||||
</repeat>
|
||||
</false>
|
||||
</check>
|
||||
</div>
|
||||
</td>
|
||||
<td class="text-right txt-color txt-color-danger">{{ @member->getFormattedColumn('banned') }}</td>
|
||||
<td class="text-center pf-table-button-sm-cell">
|
||||
<check if="{{ @member->banned }}">
|
||||
<true>
|
||||
<a class="btn btn-sm btn-primary {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/ban/{{ @member->_id }}">revoke</a>
|
||||
</true>
|
||||
<false>
|
||||
<a class="btn btn-sm btn-danger {{ @disableRow ? 'disabled' : '' }}" href="/admin/{{ @tplPage}}/ban/{{ @member->_id }}/1">ban</a>
|
||||
</false>
|
||||
</check>
|
||||
</td>
|
||||
</tr>
|
||||
</repeat>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</repeat>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
<div class="row text-center">
|
||||
<div class="col-xs-12 pf-landing-pricing-panel">
|
||||
<div class="panel panel-default pricing-big">
|
||||
<div class="panel-heading text-left">
|
||||
<h3 class="panel-title">Settings</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<section>
|
||||
<div class="container col-xs-12">
|
||||
<div class="row"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<h4><i class="fa fa-fw fa-gears"></i> {{ ucfirst(@tplPage) }}</h4>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -11,15 +11,15 @@
|
||||
</span>
|
||||
|
||||
<p class="navbar-text">
|
||||
{{ @character->name }}
|
||||
{{ @character->name }} <span class="label label-success">{{ @character->role }}</span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="navbar-collapse">
|
||||
<ul class="nav navbar-nav navbar-right" role="tablist">
|
||||
<li class="{{ @tplPage == 'settings' ? 'active' : '' }}"><a href="/admin/settings">Settings</a></li>
|
||||
<li class="{{ @tplPage == 'settings' ? 'active' : '' }}"><a href="/admin/settings"><i class="fa fa-fw fa-gears"></i> Settings</a></li>
|
||||
<li class="{{ @tplPage == 'members' ? 'active' : '' }}"><a href="/admin/members"><i class="fa fa-fw fa-users"></i> Members</a></li>
|
||||
<li class="{{ @tplPage == 'maps' ? 'active' : '' }}"><a href="/admin/maps">Maps</a></li>
|
||||
<li class="{{ @tplPage == 'activity' ? 'active' : '' }}"><a href="/admin/activity">Activity</a></li>
|
||||
<li class="{{ @tplPage == 'maps' ? 'active' : '' }} disabled"><a href="/admin/maps"><i class="fa fa-fw fa-code-fork"></i> Maps</a></li>
|
||||
<li class="{{ @tplPage == 'activity' ? 'active' : '' }} disabled"><a href="/admin/activity"><i class="fa fa-fw fa-line-chart"></i> Activity</a></li>
|
||||
<li class="{{ @tplPage == 'login' ? 'active' : '' }}"><a href="/admin/login"><i class="fa fa-fw fa-sign-in"></i> SSO</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user