* group: bug #39768, improve perf of managePriv page.
This commit is contained in:
@@ -10,10 +10,7 @@
|
||||
#mainContainer {gap: 16px; height: calc(100vh - 165px);}
|
||||
#mainContainer > .main {flex: 1 1 75%; overflow-y: auto; padding: 0px; border: 1px solid #FFF; box-sizing: content-box;}
|
||||
#mainContainer > .side {flex: 1 1 25%;}
|
||||
#mainContainer .main .btn-group {position: absolute; visibility: hidden; display: inline-block; z-index: 2; top: 75px;}
|
||||
#mainContainer .main .btn-group .switchBtn {padding: 6px 10px;}
|
||||
#mainContainer .main .btn-group .switchBtn:first-child {border-radius: 4px 0px 0px 4px;}
|
||||
#mainContainer .main .btn-group .switchBtn:last-child {border-radius: 0px 4px 4px 0px;}
|
||||
#mainContainer .main .btn-group {position: absolute; visibility: hidden; display: inline-block; z-index: 2; top: 66px;}
|
||||
#mainContainer .table {table-layout: fixed;}
|
||||
.side .priv-panel {padding: 16px;}
|
||||
.side .priv-panel {background: #fff; padding: 10px 16px; box-shadow: 0 1px 1px rgb(0 0 0 / 5%), 0 2px 6px 0 rgb(0 0 0 / 5%);}
|
||||
@@ -69,15 +66,13 @@
|
||||
/* Manage priv by group. */
|
||||
|
||||
#privList td.menus {border-right: 0; padding-right: 0; width: 170px !important;}
|
||||
#privList td.menus + td {border-left: 0; padding-left: 0px; padding}
|
||||
#privList td.menus + td {border-left: 0; padding-left: 0px;}
|
||||
#privList .menus .checkbox-primary {float: left; width: 160px;}
|
||||
#privList .menus .checkbox-primary:first-child {float: left; width: auto;}
|
||||
#privList .menus a {margin-left: 10px;}
|
||||
|
||||
#privList {margin-bottom: 0px;}
|
||||
#privList tr {border-bottom-width: 0;}
|
||||
#privList tr > td {background-color: #FFF;}
|
||||
#privList tr:hover > td {background-color: #FFF;}
|
||||
#privList th.module {width: 142px; min-width: 142px; background-color: #EDEEF28C; font-weight: 600;}
|
||||
#privList th.package {width: 142px; min-width: 142px; background-color: #F4F5F78C; font-weight: 600;}
|
||||
#privList th .checkbox-inline input {margin-left: 0px;}
|
||||
|
||||
@@ -309,7 +309,7 @@ function positionBtn()
|
||||
{
|
||||
let btnLeft = $('.main.main-content > table').width() - 75;
|
||||
let pagePadding = $('#mainContainer').css('padding-left');
|
||||
$('.main.main-content > .btn-group').css('left', `calc(${btnLeft}px + ${pagePadding})`).css('visibility', 'unset');
|
||||
$('.main.main-content > .btn-group').css('left', `calc(${btnLeft}px + ${pagePadding} - 8px)`).css('visibility', 'unset');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -200,30 +200,19 @@ else
|
||||
),
|
||||
);
|
||||
|
||||
$getMethodItems = function($package, $subsetName, $packageID, $groupPrivs)
|
||||
$getMethodItemsHtml = function($package, $subsetName, $packageID, $groupPrivs)
|
||||
{
|
||||
$methodItems = array();
|
||||
$html = '';
|
||||
foreach($package->privs as $privID => $priv)
|
||||
{
|
||||
$methodItems[] = div
|
||||
(
|
||||
setClass('group-item'),
|
||||
set('data-module', $subsetName),
|
||||
set('data-package', $packageID),
|
||||
set('data-divid', "{$subsetName}{$packageID}"),
|
||||
set('data-id', $privID),
|
||||
checkbox
|
||||
(
|
||||
set::name("actions[{$priv->module}][]"),
|
||||
set::value($priv->method),
|
||||
set::checked(isset($groupPrivs[$priv->module][$priv->method])),
|
||||
setID("actions[{$priv->module}][{$priv->method}]"),
|
||||
set::text($priv->name),
|
||||
set('data-id', $privID)
|
||||
)
|
||||
);
|
||||
$checked = isset($groupPrivs[$priv->module][$priv->method]);
|
||||
$checkID = "actions[{$priv->module}][{$priv->method}]";
|
||||
$html .= "<div class='group-item' data-module='$subsetName' data-package='$packageID' data-divid='{$subsetName}{$packageID}' data-id='$privID'><div class='checkbox-primary'>";
|
||||
$html .= "<input type='checkbox' id='$checkID' value='$priv->method' name='actions[{$priv->module}][]' data-id='$privID'". ($checked ? ' checked' : '') . ">";
|
||||
$html .= "<label for='$checkID'>$priv->name</label>";
|
||||
$html .= '</div></div>';
|
||||
}
|
||||
return $methodItems;
|
||||
return $html;
|
||||
};
|
||||
|
||||
$dependTree = null;
|
||||
@@ -246,7 +235,7 @@ else
|
||||
);
|
||||
}
|
||||
|
||||
$privBody = null;
|
||||
$privBodyHtml = array();
|
||||
foreach($subsets as $subsetName => $subset)
|
||||
{
|
||||
if($subset->allCount == 0) continue;
|
||||
@@ -256,63 +245,40 @@ else
|
||||
{
|
||||
$subsetTitle = isset($lang->$subsetName) && isset($lang->$subsetName->common) ? $lang->$subsetName->common : $subsetName;
|
||||
|
||||
$privBody[] = h::tr
|
||||
(
|
||||
setClass(cycle('even, bg-gray')),
|
||||
$i == 1 ? h::th
|
||||
(
|
||||
setClass('text-middle text-left module'),
|
||||
set('rowspan', count($packages[$subsetName]) ? count($packages[$subsetName]) : 1),
|
||||
set('data-module', $subsetName),
|
||||
set('all-privs', $subset->allCount),
|
||||
set('select-privs', $subset->selectCount),
|
||||
div
|
||||
(
|
||||
setClass('checkbox-primary checkbox-inline checkbox-left check-all'),
|
||||
checkbox
|
||||
(
|
||||
setID("allChecker{$subsetName}"),
|
||||
set::value(1),
|
||||
set::checked($subset->selectCount && $subset->selectCount == $subset->allCount),
|
||||
set::text($subsetTitle),
|
||||
set::labelClass($subset->selectCount && $subset->selectCount != $subset->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left')
|
||||
)
|
||||
)
|
||||
) : null,
|
||||
h::th
|
||||
(
|
||||
setClass('text-middle text-left package'),
|
||||
setClass($i == 1 ? 'td-sm' : 'td-md'),
|
||||
set('data-module', $subsetName),
|
||||
set('data-package', $packageID),
|
||||
set('data-divid', "{$subsetName}{$packageID}"),
|
||||
set('all-privs', $package->allCount),
|
||||
set('select-privs', $package->selectCount),
|
||||
div
|
||||
(
|
||||
setClass('checkbox-primary checkbox-inline checkbox-left check-all'),
|
||||
checkbox
|
||||
(
|
||||
setID("allCheckerModule{$subsetName}Package{$packageID}"),
|
||||
set::value('browse'),
|
||||
set::checked($package->allCount == $package->selectCount),
|
||||
set::text($lang->group->package->$packageID),
|
||||
set::labelClass($package->selectCount && $package->selectCount != $package->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left')
|
||||
)
|
||||
)
|
||||
),
|
||||
h::td
|
||||
(
|
||||
setClass('pv-10px'),
|
||||
setID($subsetName),
|
||||
$getMethodItems($package, $subsetName, $packageID, $groupPrivs)
|
||||
)
|
||||
);
|
||||
$privBodyHtml[] = '<tr>';
|
||||
if($i == 1)
|
||||
{
|
||||
$rowspan = count($packages[$subsetName]) ? count($packages[$subsetName]) : 1;
|
||||
$checked = $subset->selectCount && $subset->selectCount == $subset->allCount;
|
||||
$checkID = "allChecker{$subsetName}";
|
||||
$privBodyHtml[] = "<th class='text-middle text-left module' rowspan='$rowspan' data-module='$subsetName' all-privs='$subset->allCount' select-privs='$subset->selectCount'>";
|
||||
$privBodyHtml[] = '<div class="checkbox-inline checkbox-left check-all"><div class="checkbox-primary">';
|
||||
$privBodyHtml[] = "<input type='checkbox' id='$checkID' value='1'" . ($checked ? ' checked' : '') . ">";
|
||||
$privBodyHtml[] = "<label for='$checkID' class='" . ($subset->selectCount && $subset->selectCount != $subset->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left') . "'>$subsetTitle</label>";
|
||||
$privBodyHtml[] = '</div></div>';
|
||||
$privBodyHtml[] = '</th>';
|
||||
}
|
||||
|
||||
$thClass = $i == 1 ? ' td-sm' : ' td-md';
|
||||
$checked = $package->allCount == $package->selectCount;
|
||||
$checkID = "allCheckerModule{$subsetName}Package{$packageID}";
|
||||
$privBodyHtml[] = "<th class='text-middle text-left package $thClass' data-module='$subsetName' data-package='$packageID' data-divid='{$subsetName}{$packageID}' all-privs='$package->allCount' select-privs='$package->selectCount'>";
|
||||
$privBodyHtml[] = '<div class="checkbox-inline checkbox-left check-all"><div class="checkbox-primary">';
|
||||
$privBodyHtml[] = "<input type='checkbox' id='$checkID' value='browse'" . ($checked ? ' checked' : '') . ">";
|
||||
$privBodyHtml[] = "<label for='$checkID' class='" . ($package->selectCount && $package->selectCount != $package->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left') . "'>{$lang->group->package->$packageID}</label>";
|
||||
$privBodyHtml[] = '</div></div>';
|
||||
$privBodyHtml[] = '</th>';
|
||||
|
||||
$privBodyHtml[] = "<td id='$subsetName'>";
|
||||
$privBodyHtml[] = $getMethodItemsHtml($package, $subsetName, $packageID, $groupPrivs);
|
||||
$privBodyHtml[] = '</td>';
|
||||
|
||||
$privBodyHtml[] = '</tr>';
|
||||
$i ++;
|
||||
}
|
||||
}
|
||||
|
||||
form
|
||||
formBase
|
||||
(
|
||||
setID('managePrivForm'),
|
||||
formHidden('actions[][]', ''),
|
||||
@@ -324,7 +290,7 @@ else
|
||||
setClass('flex'),
|
||||
div
|
||||
(
|
||||
setClass('main main-content'),
|
||||
setClass('main main-content canvas'),
|
||||
div
|
||||
(
|
||||
setClass('btn-group'),
|
||||
@@ -344,7 +310,7 @@ else
|
||||
h::table
|
||||
(
|
||||
setID('privList'),
|
||||
setClass('table table-hover table-striped table-bordered'),
|
||||
setClass('table table-striped table-bordered'),
|
||||
h::thead
|
||||
(
|
||||
h::tr
|
||||
@@ -364,12 +330,9 @@ else
|
||||
setClass('method'),
|
||||
$lang->group->method
|
||||
)
|
||||
),
|
||||
h::tbody
|
||||
(
|
||||
$privBody
|
||||
)
|
||||
)
|
||||
),
|
||||
h::body(html($privBodyHtml))
|
||||
)
|
||||
),
|
||||
div
|
||||
|
||||
@@ -145,125 +145,78 @@ else
|
||||
}
|
||||
}
|
||||
|
||||
function getPrivsItems($privs, $moduleName, $packageID, $groupPrivs)
|
||||
function getPrivsItemsHtml($privs, $moduleName, $packageID, $groupPrivs)
|
||||
{
|
||||
global $lang;
|
||||
$privsBox = array();
|
||||
$html = '';
|
||||
foreach($privs as $privID => $priv)
|
||||
{
|
||||
if(!empty($lang->$moduleName->menus) && ($priv->method == 'browse' or in_array($priv->method, array_keys($lang->$moduleName->menus)))) continue;
|
||||
$privMethod = isset($groupPrivs[$priv->module][$priv->method]) ? $priv->method : '';
|
||||
$privsBox[] = div
|
||||
(
|
||||
setClass('group-item'),
|
||||
set('data-id', $privID),
|
||||
set('data-module', $moduleName),
|
||||
set('data-package', $packageID),
|
||||
set('data-divid', "{$moduleName}{$packageID}"),
|
||||
div
|
||||
(
|
||||
setClass('checkbox-primary'),
|
||||
checkbox
|
||||
(
|
||||
set::name("actions[{$priv->module}][]"),
|
||||
setID("actions[{$priv->module}]{$priv->method}"),
|
||||
set::value($priv->method),
|
||||
set::checked($priv->method == $privMethod),
|
||||
set::text($priv->name),
|
||||
set('data-id', $privID)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
$checked = $priv->method == $privMethod;
|
||||
$checkID = "actions[{$priv->module}]{$priv->method}";
|
||||
$html .= "<div class='group-item' data-module='$moduleName' data-package='$packageID' data-divid='{$moduleName}{$packageID}' data-id='$privID'><div class='checkbox-primary'>";
|
||||
$html .= "<input type='checkbox' id='$checkID' value='$priv->method' name='actions[{$priv->module}][]' data-id='$privID'". ($checked ? ' checked' : '') . ">";
|
||||
$html .= "<label for='$checkID'>$priv->name</label>";
|
||||
$html .= '</div></div>';
|
||||
}
|
||||
|
||||
return $privsBox;
|
||||
return $html;
|
||||
};
|
||||
|
||||
$getPackagesBox = function($subsetName, $packages, $groupPrivs)
|
||||
$getPackagesBoxHtml = function($subsetName, $packages, $groupPrivs)
|
||||
{
|
||||
global $lang;
|
||||
$packagesBox = array();
|
||||
$html = '';
|
||||
foreach($packages as $packageID => $package)
|
||||
{
|
||||
$packagePrivs = $package->allCount;
|
||||
$packageSelect = $package->selectCount;
|
||||
$packagesBox[] = array
|
||||
(
|
||||
div
|
||||
(
|
||||
setClass('package'),
|
||||
set('data-module', $subsetName),
|
||||
set('data-package', $packageID),
|
||||
set('all-privs', $packagePrivs),
|
||||
set('select-privs', $packageSelect),
|
||||
set('data-divid', "{$subsetName}{$packageID}"),
|
||||
div
|
||||
(
|
||||
setClass('checkbox-primary checkbox-inline checkbox-left check-all'),
|
||||
checkbox
|
||||
(
|
||||
setID("allCheckerModule{$subsetName}Package{$packageID}"),
|
||||
set::value(1),
|
||||
set::checked($packagePrivs == $packageSelect),
|
||||
set::text($lang->group->package->$packageID),
|
||||
set::labelClass(!empty($packageSelect) && $packagePrivs != $packageSelect ? 'text-left checkbox-indeterminate-block' : 'text-left')
|
||||
)
|
||||
),
|
||||
h::i(setClass('priv-toggle icon'))
|
||||
),
|
||||
div
|
||||
(
|
||||
setClass('privs hidden'),
|
||||
set('data-module', $subsetName),
|
||||
set('data-package', $packageID),
|
||||
set('data-divid', "{$subsetName}{$packageID}"),
|
||||
div(setClass('arrow')),
|
||||
div
|
||||
(
|
||||
setClass('popover-content'),
|
||||
getPrivsItems($package->privs, $subsetName, $packageID, $groupPrivs)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
$checked = $packagePrivs == $packageSelect;
|
||||
$checkID = "allCheckerModule{$subsetName}Package{$packageID}";
|
||||
|
||||
$html .= "<div class='package' data-module='$subsetName' data-package='$packageID' all-privs='$packagePrivs' select-privs='$packageSelect' data-divid='{$subsetName}{$packageID}'>";
|
||||
$html .= "<div class='checkbox-primary checkbox-inline checkbox-left check-all'>";
|
||||
$html .= "<input type='checkbox' id='$checkID' value='1'". ($checked ? ' checked' : '') . ">";
|
||||
$html .= "<label class='" . (!empty($packageSelect) && $packagePrivs != $packageSelect ? 'text-left checkbox-indeterminate-block' : 'text-left') . "' for='$checkID'>{$lang->group->package->$packageID}</label>";
|
||||
$html .= '</div>';
|
||||
$html .= '<i class="icon priv-toggle"></i>';
|
||||
$html .= '</div>';
|
||||
|
||||
$html .= "<div class='privs hidden' data-module='$subsetName' data-package='$packageID' data-divid='{$subsetName}{$packageID}'>";
|
||||
$html .= '<div class="arrow"></div>';
|
||||
$html .= '<div class="popover-content">';
|
||||
$html .= getPrivsItemsHtml($package->privs, $subsetName, $packageID, $groupPrivs);
|
||||
$html .= '</div>';
|
||||
$html .= '</div>';
|
||||
}
|
||||
return $packagesBox;
|
||||
return $html;
|
||||
};
|
||||
|
||||
$privBody = null;
|
||||
$privBodyHtml = array();
|
||||
foreach($subsets as $subsetName => $subset)
|
||||
{
|
||||
if($subset->allCount == 0) continue;
|
||||
$subsetTitle = isset($lang->$subsetName) && isset($lang->$subsetName->common) ? $lang->$subsetName->common : $subsetName;
|
||||
|
||||
$privBody[] = h::tr
|
||||
(
|
||||
setClass(cycle('even, bg-gray')),
|
||||
h::th
|
||||
(
|
||||
setClass('text-middle text-left module'),
|
||||
set('data-module', $subsetName),
|
||||
set('all-privs', $subset->allCount),
|
||||
set('select-privs', $subset->selectCount),
|
||||
div
|
||||
(
|
||||
setClass('checkbox-primary checkbox-inline checkbox-left check-all'),
|
||||
checkbox
|
||||
(
|
||||
setID("allChecker{$subsetName}"),
|
||||
set::labelClass($subset->selectCount && $subset->selectCount != $subset->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left'),
|
||||
set::value(1),
|
||||
set::checked($subset->selectCount && $subset->selectCount == $subset->allCount),
|
||||
set::text($subsetTitle)
|
||||
)
|
||||
)
|
||||
),
|
||||
h::td
|
||||
(
|
||||
setClass('td-sm text-middle text-left package-column'),
|
||||
set('data-module', $subsetName),
|
||||
$getPackagesBox($subsetName, $packages[$subsetName], $groupPrivs)
|
||||
)
|
||||
);
|
||||
$privBodyHtml[] = '<tr>';
|
||||
|
||||
$checked = $subset->selectCount && $subset->selectCount == $subset->allCount;
|
||||
$checkID = "allChecker{$subsetName}";
|
||||
$privBodyHtml[] = "<th class='text-middle text-left module' data-module='$subsetName' all-privs='$subset->allCount' select-privs='$subset->selectCount'>";
|
||||
$privBodyHtml[] = '<div class="checkbox-inline checkbox-left check-all"><div class="checkbox-primary">';
|
||||
$privBodyHtml[] = "<input type='checkbox' id='$checkID' value='1'" . ($checked ? ' checked' : '') . ">";
|
||||
$privBodyHtml[] = "<label for='$checkID' class='" . ($subset->selectCount && $subset->selectCount != $subset->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left') . "'>{$subsetTitle}</label>";
|
||||
$privBodyHtml[] = '</div></div>';
|
||||
$privBodyHtml[] = '</th>';
|
||||
|
||||
$privBodyHtml[] = "<td class='td-sm text-middle text-left package-column' data-module='$subsetName'>";
|
||||
$privBodyHtml[] = $getPackagesBoxHtml($subsetName, $packages[$subsetName], $groupPrivs);
|
||||
$privBodyHtml[] = '</td>';
|
||||
|
||||
$privBodyHtml[] = '</tr>';
|
||||
}
|
||||
|
||||
$dependTree = null;
|
||||
@@ -341,7 +294,7 @@ else
|
||||
)
|
||||
);
|
||||
|
||||
form
|
||||
formBase
|
||||
(
|
||||
setID('managePrivForm'),
|
||||
formHidden('actions[][]', ''),
|
||||
@@ -353,7 +306,7 @@ else
|
||||
setClass('flex'),
|
||||
div
|
||||
(
|
||||
setClass('main main-content'),
|
||||
setClass('main main-content canvas'),
|
||||
div
|
||||
(
|
||||
setClass('btn-group'),
|
||||
@@ -373,7 +326,7 @@ else
|
||||
h::table
|
||||
(
|
||||
setID('privPackageList'),
|
||||
setClass('table table-hover table-striped table-bordered'),
|
||||
setClass('table table-striped table-bordered'),
|
||||
h::thead
|
||||
(
|
||||
h::tr
|
||||
@@ -390,10 +343,7 @@ else
|
||||
)
|
||||
)
|
||||
),
|
||||
h::tbody
|
||||
(
|
||||
$privBody
|
||||
)
|
||||
h::tbody(html($privBodyHtml))
|
||||
)
|
||||
),
|
||||
div
|
||||
|
||||
Reference in New Issue
Block a user