From eff2f558576ff58cb402c7b28b38620ddc467599 Mon Sep 17 00:00:00 2001 From: Udo Walter Date: Thu, 30 Nov 2017 17:40:00 +0100 Subject: [permissionmanager] new permission and location chooser in roleeditor --- modules-available/permissionmanager/page.inc.php | 157 ++++++++++++++------- modules-available/permissionmanager/style.css | 46 +++--- .../permissionmanager/templates/_page.html | 44 +++--- .../templates/modulepermissionbox.html | 13 -- .../permissionmanager/templates/permission.html | 6 - .../templates/permissiontreenode.html | 9 -- .../permissionmanager/templates/roleeditor.html | 138 +++++------------- .../permissionmanager/templates/treenode.html | 11 ++ .../permissionmanager/templates/treepanel.html | 13 ++ 9 files changed, 209 insertions(+), 228 deletions(-) delete mode 100644 modules-available/permissionmanager/templates/modulepermissionbox.html delete mode 100644 modules-available/permissionmanager/templates/permission.html delete mode 100644 modules-available/permissionmanager/templates/permissiontreenode.html create mode 100644 modules-available/permissionmanager/templates/treenode.html create mode 100644 modules-available/permissionmanager/templates/treepanel.html (limited to 'modules-available/permissionmanager') diff --git a/modules-available/permissionmanager/page.inc.php b/modules-available/permissionmanager/page.inc.php index 20e8ad3a..9aba80b3 100644 --- a/modules-available/permissionmanager/page.inc.php +++ b/modules-available/permissionmanager/page.inc.php @@ -30,8 +30,8 @@ class Page_PermissionManager extends Page } elseif ($action === 'saveRole') { $roleID = Request::post("roleid", false); $rolename = Request::post("rolename"); - $locations = Request::post("allLocations", "off") == "on" ? array(NULL) : Request::post("locations"); - $permissions = Request::post("allPermissions", "off") == "on" ? array("*") : Request::post("permissions");; + $locations = self::processLocations(Request::post("locations")); + $permissions = self::processPermissions(Request::post("permissions")); PermissionDbUpdate::saveRole($rolename, $locations, $permissions, $roleID); } } @@ -46,13 +46,12 @@ class Page_PermissionManager extends Page // switch between tables, but always show menu to switch tables if ( $show === 'roles' || $show === 'users' || $show === 'locations' ) { // get menu button colors - $buttonColors = self::setButtonColors($show); + $buttonColors = array(); + $buttonColors['rolesButtonClass'] = $show === 'roles' ? 'active' : ''; + $buttonColors['usersButtonClass'] = $show === 'users' ? 'active' : ''; + $buttonColors['locationsButtonClass'] = $show === 'locations' ? 'active' : ''; - $data = array(); - - Render::openTag('div', array('class' => 'row')); Render::addtemplate('_page', $buttonColors); - Render::closeTag('div'); if ($show === "roles") { $data = array("roles" => GetPermissionData::getRoles()); @@ -67,68 +66,128 @@ class Page_PermissionManager extends Page } elseif ($show === "roleEditor") { $data = array(); - $roleID = Request::get("roleid", false); + $selectedPermissions = array(); $selectedLocations = array(); + $roleID = Request::get("roleid", false); if ($roleID) { $roleData = GetPermissionData::getRoleData($roleID); $data["roleid"] = $roleID; $data["rolename"] = $roleData["rolename"]; - if (count($roleData["locations"]) == 1 && $roleData["locations"][0] == 0) { - $data["allLocChecked"] = "checked"; - $data["selectizeClass"] = "faded unclickable"; - } else { - $data["allLocChecked"] = ""; - $data["selectizeClass"] = ""; - $selectedLocations = $roleData["locations"]; - } - if (count($roleData["permissions"]) == 1 && $roleData["permissions"][0] == "*") { - $data["allPermChecked"] = "checked"; - $data["permissionsClass"] = "faded unclickable"; - } else { - $data["allPermChecked"] = ""; - $data["permissionsClass"] = ""; - $data["selectedPermissions"] = implode(" ", $roleData["permissions"]); - } + $selectedPermissions = $roleData["permissions"]; + $selectedLocations = $roleData["locations"]; } - $permissions = PermissionUtil::getPermissions(); + $data["permissionHTML"] = self::generatePermissionHTML(PermissionUtil::getPermissions(), $selectedPermissions); + $data["locationHTML"] = self::generateLocationHTML(Location::getTree(), $selectedLocations); - $data["locations"] = Location::getLocations($selectedLocations); - $data["moduleNames"] = array(); - foreach (array_keys($permissions) as $moduleid) { - $data["moduleNames"][] = array("id" => $moduleid, "name" => Module::get($moduleid)->getDisplayName()); - } - $data["permissionHTML"] = self::generatePermissionHTML($permissions, "*"); Render::addTemplate('roleeditor', $data); } } - // Menu: Selected table is shown in blue (btn-primary) - private function setButtonColors($show) { - if ($show === 'roles') { - $buttonColors['rolesButtonClass'] = 'active'; - } elseif ($show === 'users') { - $buttonColors['usersButtonClass'] = 'active'; - } elseif ($show === 'locations') { - $buttonColors['locationsButtonClass'] = 'active'; + private static function generatePermissionHTML($subPermissions, $selectedPermissions = array(), $selectAll = false, $permString = "") + { + $res = ""; + $toplevel = $permString == ""; + if ($toplevel && in_array("*", $selectedPermissions)) $selectAll = true; + foreach ($subPermissions as $k => $v) { + $leaf = !is_array($v); + $nextPermString = $permString ? $permString.".".$k : $k; + $id = $leaf ? $nextPermString : $nextPermString.".*"; + $selected = $selectAll || in_array($id, $selectedPermissions); + $res .= Render::parse("treenode", + array("id" => $id, + "name" => $toplevel ? Module::get($k)->getDisplayName() : $k, + "toplevel" => $toplevel, + "checkboxname" => "permissions", + "selected" => $selected, + "HTML" => $leaf ? "" : self::generatePermissionHTML($v, $selectedPermissions, $selected, $nextPermString), + "description" => $leaf ? $v : "")); } - - return $buttonColors; + if ($toplevel) { + $res = Render::parse("treepanel", + array("id" => "*", + "name" => Dictionary::translateFile("template-tags", "lang_Permissions"), + "checkboxname" => "permissions", + "selected" => $selectAll, + "HTML" => $res)); + } + return $res; } - private static function generatePermissionHTML($subPermissions, $permString) + private static function generateLocationHTML($locations, $selectedLocations = array(), $selectAll = false, $toplevel = true) { - $genModuleBox = $permString == "*"; $res = ""; - foreach ($subPermissions as $k => $v) { - $res .= Render::parse($genModuleBox ? "modulepermissionbox" : (is_array($v) ? "permissiontreenode" : "permission"), - array("id" => $genModuleBox ? $k : $permString.".".$k, - "name" => $genModuleBox ? Module::get($k)->getDisplayName(): $k, - "HTML" => is_array($v) ? self::generatePermissionHTML($v, $genModuleBox ? $k : $permString.".".$k) : "", - "description" => $v)); + if ($toplevel && in_array(0, $selectedLocations)) $selectAll = true; + foreach ($locations as $location) { + $selected = $selectAll || in_array($location["locationid"], $selectedLocations); + $res .= Render::parse("treenode", + array("id" => $location["locationid"], + "name" => $location["locationname"], + "toplevel" => $toplevel, + "checkboxname" => "locations", + "selected" => $selected, + "HTML" => array_key_exists("children", $location) ? + self::generateLocationHTML($location["children"], $selectedLocations, $selected, false) : "")); + } + if ($toplevel) { + $res = Render::parse("treepanel", + array("id" => 0, + "name" => Dictionary::translateFile("template-tags", "lang_Locations"), + "checkboxname" => "locations", + "selected" => $selectAll, + "HTML" => $res)); } return $res; } + private static function processLocations($locations) + { + if (in_array(0, $locations)) return array(NULL); + $result = array(); + foreach ($locations as $location) { + $rootchain = array_reverse(Location::getLocationRootChain($location)); + foreach ($rootchain as $l) { + if (in_array($l, $result)) break; + if (in_array($l, $locations)) { + $result[] = $l; + break; + } + } + } + return $result; + } + + private static function processPermissions($permissions) + { + if (in_array("*", $permissions)) return array("*"); + $result = array(); + foreach ($permissions as $permission) { + $x =& $result; + foreach (explode(".", $permission) as $p) { + $x =& $x[$p]; + } + } + return self::extractPermissions($result); + } + + private static function extractPermissions($permissions) + { + $result = array(); + foreach ($permissions as $permission => $a) { + if (is_array($a)) { + if (array_key_exists("*", $a)) { + $result[] = $permission.".*"; + } else { + foreach (self::extractPermissions($a) as $subPermission) { + $result[] = $permission.".".$subPermission; + } + } + } else { + $result[] = $permission; + } + } + return $result; + } + } diff --git a/modules-available/permissionmanager/style.css b/modules-available/permissionmanager/style.css index abc3270a..bb03d153 100644 --- a/modules-available/permissionmanager/style.css +++ b/modules-available/permissionmanager/style.css @@ -10,7 +10,7 @@ #rolename { width: 200px; display: inline-block; - margin-left: 20px; + margin-left: 10px; } .table { @@ -41,52 +41,48 @@ margin-bottom: 20px; } -.list-group, .checkbox { - margin: 0; -} - -.faded { - opacity: 0.6; -} - -.unclickable { - pointer-events: none; -} -input[type='checkbox']:disabled { - cursor: inherit; +.tree-container .selected { + background-color: rgba(0, 182, 41, 0.23); } -.module-toggle-group { - width: 100%; - margin-top: 20px; -} - -.module-container { +.tree-container { -moz-column-gap: 20px; -webkit-column-gap: 20px; column-gap: 20px; } -.module-container div { +.tree-container > ul { display: inline-block; width: 100%; + padding: 0; } - @media (max-width: 767px) { - .module-container { + .tree-container { -moz-column-count: 1; -webkit-column-count: 1; column-count: 1; } } -@media (min-width: 768px) { - .module-container { +@media (min-width: 768px) and (max-width: 991px) { + .tree-container { -moz-column-count: 2; -webkit-column-count: 2; column-count: 2; } } + +@media (min-width: 992px) { + .tree-container { + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + } +} + +ul { + list-style-type: none; +} \ No newline at end of file diff --git a/modules-available/permissionmanager/templates/_page.html b/modules-available/permissionmanager/templates/_page.html index ff487c8f..405462f7 100644 --- a/modules-available/permissionmanager/templates/_page.html +++ b/modules-available/permissionmanager/templates/_page.html @@ -1,27 +1,29 @@ -
-