* group: bug #39768, improve perf of managePriv page.

This commit is contained in:
sunhao
2023-12-26 15:58:28 +08:00
parent ae6695ee7a
commit 70bcb11e43
4 changed files with 99 additions and 191 deletions
+2 -7
View File
@@ -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;}
+1 -1
View File
@@ -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');
}
/**
+44 -81
View File
@@ -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
+52 -102
View File
@@ -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