privbypackage.html.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. <?php
  2. /**
  3. * The privbypackage view file of group module of ZenTaoPMS.
  4. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
  5. * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  6. * @author Shujie Tian<tianshujie@easycorp.ltd>
  7. * @package group
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. jsVar('window.selectedPrivIdList', $selectedPrivList);
  12. jsVar('allPrivList', $allPrivList);
  13. jsVar('groupID', $groupID);
  14. jsVar('type', $type);
  15. jsVar('nav', $nav);
  16. if($group->role == 'limited')
  17. {
  18. div
  19. (
  20. setID('featureBar'),
  21. menu
  22. (
  23. setClass('nav nav-feature w-full'),
  24. li
  25. (
  26. setclass('nav-item'),
  27. a
  28. (
  29. setclass('active'),
  30. span($group->name)
  31. )
  32. )
  33. )
  34. );
  35. form
  36. (
  37. setID('managePrivForm'),
  38. setClass('gap-0'),
  39. set::actions(array()),
  40. div
  41. (
  42. setID('mainContent'),
  43. setClass('main main-content manageLimitGroup'),
  44. h::table
  45. (
  46. setClass('table table-hover table-striped table-bordered'),
  47. h::thead
  48. (
  49. h::tr
  50. (
  51. h::th($lang->group->module),
  52. h::th($lang->group->method)
  53. )
  54. ),
  55. h::tr
  56. (
  57. setClass(cycle('even, bg-gray')),
  58. h::th
  59. (
  60. setClass('text-right w-40'),
  61. $lang->my->common
  62. ),
  63. h::td
  64. (
  65. setID('my'),
  66. checkbox
  67. (
  68. setID('my-limited'),
  69. set::labelClass('priv nowrap'),
  70. set::name('actions[my][]'),
  71. set::value('limited'),
  72. set::checked(isset($groupPrivs['my']['limited'])),
  73. set::text($lang->my->limited)
  74. )
  75. ),
  76. formHidden('noChecked', '')
  77. )
  78. )
  79. ),
  80. toolbar
  81. (
  82. setClass('form-actions w-1/2'),
  83. btn(set(array('text' => $lang->save, 'btnType' => 'submit', 'type' => 'primary', 'onclick' => 'setNoChecked()'))),
  84. btn(set(array('text' => $lang->goback, 'url' => createLink('group', 'browse'), 'back' => true)))
  85. )
  86. );
  87. }
  88. else
  89. {
  90. $params = "type=byPackage&param=$groupID&nav=%s&version=$version";
  91. $mainNavItems = null;
  92. $i = 0;
  93. $dropDownItems = array();
  94. foreach($lang->mainNav as $navKey => $title)
  95. {
  96. if(!is_string($title)) continue;
  97. $i++;
  98. if($i >= $config->group->maxToolBarCount)
  99. {
  100. $dropDownItems[] = array
  101. (
  102. 'text' => strip_tags(substr($title, 0, strpos($title, '|'))),
  103. 'url' => inlink('managePriv', sprintf($params, $navKey)),
  104. 'active' => $nav == $navKey
  105. );
  106. }
  107. }
  108. $i = 0;
  109. foreach($lang->mainNav as $navKey => $title)
  110. {
  111. if(!is_string($title) || $i >= $config->group->maxToolBarCount) continue;
  112. $i++;
  113. if($i == $config->group->maxToolBarCount)
  114. {
  115. $mainNavItems[] = li
  116. (
  117. setClass('nav-item'),
  118. dropdown
  119. (
  120. btn(
  121. setClass('ghost btn btn-default'),
  122. $lang->group->more
  123. ),
  124. set::items($dropDownItems)
  125. )
  126. );
  127. }
  128. else
  129. {
  130. $mainNavItems[] = li
  131. (
  132. setClass('nav-item'),
  133. a
  134. (
  135. setClass($nav == $navKey ? 'active' : ''),
  136. set::href(inlink('managePriv', sprintf($params, $navKey))),
  137. strip_tags(substr($title, 0, strpos($title, '|')))
  138. )
  139. );
  140. }
  141. }
  142. function getPrivsItemsHtml($privs, $moduleName, $packageID, $groupPrivs)
  143. {
  144. global $lang;
  145. $html = '';
  146. foreach($privs as $privID => $priv)
  147. {
  148. $privMethod = isset($groupPrivs[$priv->module][$priv->method]) ? $priv->method : '';
  149. $checked = $priv->method == $privMethod;
  150. $checkID = "actions[{$priv->module}]{$priv->method}";
  151. $html .= "<div class='group-item' data-module='$moduleName' data-package='$packageID' data-divid='{$moduleName}{$packageID}' data-id='$privID'><div class='checkbox-primary'>";
  152. $html .= "<input type='checkbox' id='$checkID' value='$priv->method' name='actions[{$priv->module}][]' data-id='$privID'". ($checked ? ' checked' : '') . ">";
  153. $html .= "<label class='nowrap' for='$checkID'>$priv->name</label>";
  154. $html .= '</div></div>';
  155. }
  156. return $html;
  157. };
  158. $getPackagesBoxHtml = function($subsetName, $packages, $groupPrivs)
  159. {
  160. global $lang,$app;
  161. $isEn = $app->getClientLang() == 'en';
  162. $itemWidth = $isEn ? 'style="width: calc(33% - 5px);"' : '';
  163. $html = '';
  164. foreach($packages as $packageID => $package)
  165. {
  166. $packagePrivs = $package->allCount;
  167. $packageSelect = $package->selectCount;
  168. $checked = $packagePrivs == $packageSelect;
  169. $checkID = "allCheckerModule{$subsetName}Package{$packageID}";
  170. $html .= "<div class='package' data-module='$subsetName' $itemWidth data-package='$packageID' all-privs='$packagePrivs' select-privs='$packageSelect' data-divid='{$subsetName}{$packageID}'>";
  171. $html .= "<div class='checkbox-primary checkbox-inline checkbox-left check-all'>";
  172. $html .= "<input type='checkbox' id='$checkID' value='1'". ($checked ? ' checked' : '') . ">";
  173. $html .= "<label class='" . (!empty($packageSelect) && $packagePrivs != $packageSelect ? 'text-left checkbox-indeterminate-block' : 'text-left') . "' for='$checkID'>{$lang->group->package->$packageID}</label>";
  174. $html .= '</div>';
  175. $html .= '<i class="icon priv-toggle"></i>';
  176. $html .= '</div>';
  177. $html .= "<div class='privs hidden' data-module='$subsetName' data-package='$packageID' data-divid='{$subsetName}{$packageID}'>";
  178. $html .= '<div class="arrow"></div>';
  179. $html .= '<div class="popover-content">';
  180. $html .= getPrivsItemsHtml($package->privs, $subsetName, $packageID, $groupPrivs);
  181. $html .= '</div>';
  182. $html .= '</div>';
  183. }
  184. return $html;
  185. };
  186. $privBodyHtml = array();
  187. foreach($subsets as $subsetName => $subset)
  188. {
  189. if($subset->allCount == 0) continue;
  190. $subsetTitle = isset($lang->$subsetName) && isset($lang->$subsetName->common) ? $lang->$subsetName->common : $subsetName;
  191. $privBodyHtml[] = "<tr zui-key='$subsetName'>";
  192. $checked = $subset->selectCount && $subset->selectCount == $subset->allCount;
  193. $checkID = "allChecker{$subsetName}";
  194. $privBodyHtml[] = "<th class='text-middle text-left module' data-module='$subsetName' all-privs='$subset->allCount' select-privs='$subset->selectCount'>";
  195. $privBodyHtml[] = '<div class="checkbox-inline checkbox-left check-all"><div class="checkbox-primary">';
  196. $privBodyHtml[] = "<input type='checkbox' id='$checkID' value='1'" . ($checked ? ' checked' : '') . ">";
  197. $privBodyHtml[] = "<label for='$checkID' class='" . ($subset->selectCount && $subset->selectCount != $subset->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left') . "'>{$subsetTitle}</label>";
  198. $privBodyHtml[] = '</div></div>';
  199. $privBodyHtml[] = '</th>';
  200. $privBodyHtml[] = "<td class='td-sm text-middle text-left package-column' data-module='$subsetName'>";
  201. $privBodyHtml[] = $getPackagesBoxHtml($subsetName, $packages[$subsetName], $groupPrivs);
  202. $privBodyHtml[] = '</td>';
  203. $privBodyHtml[] = '</tr>';
  204. }
  205. $dependTree = null;
  206. foreach($relatedPrivData['depend'] as $dependPrivs)
  207. {
  208. $dependTree[] = checkboxGroup
  209. (
  210. set::title(array('text' => $dependPrivs['text'], 'id' => "dependPrivs[{$dependPrivs['id']}]", 'name' => 'dependPrivs[]', 'data-id' => $dependPrivs['id'], 'data-has-children' => !empty($dependPrivs['children']), 'disabled' => true, 'checked' => true)),
  211. !empty($dependPrivs['children']) ? set::items($dependPrivs['children']) : null
  212. );
  213. }
  214. $recommendTree = null;
  215. foreach($relatedPrivData['recommend'] as $recommendPrivs)
  216. {
  217. $recommendTree[] = checkboxGroup
  218. (
  219. set::title(array('text' => $recommendPrivs['text'], 'id' => "recommendPrivs[{$recommendPrivs['id']}]", 'name' => 'recommendPrivs[]', 'data-id' => $recommendPrivs['id'], 'data-has-children' => !empty($recommendPrivs['children']))),
  220. !empty($recommendPrivs['children']) ? set::items($recommendPrivs['children']) : null
  221. );
  222. }
  223. div
  224. (
  225. setID('featureBar'),
  226. menu
  227. (
  228. setClass('nav nav-feature w-full'),
  229. li
  230. (
  231. span
  232. (
  233. icon('lock mr-2'),
  234. $group->name
  235. )
  236. ),
  237. li
  238. (
  239. span
  240. (
  241. set::className('text-md text-gray'),
  242. html($lang->arrow)
  243. )
  244. ),
  245. li
  246. (
  247. setclass('nav-item'),
  248. a
  249. (
  250. setclass(empty($nav) ? 'active' : ''),
  251. set::href(inlink('managepriv', sprintf($params, ''))),
  252. span($lang->group->all)
  253. )
  254. ),
  255. $mainNavItems,
  256. li
  257. (
  258. setClass('nav-item mr-2'),
  259. a
  260. (
  261. setClass($nav == 'general' ? 'active' : ''),
  262. set::href(inlink('managePriv', sprintf($params, 'general'))),
  263. span($lang->group->general)
  264. )
  265. ),
  266. picker
  267. (
  268. setID('versionSelect'),
  269. set::name('version'),
  270. set::items($lang->group->versions),
  271. set::value($version),
  272. set::placeholder($lang->group->versions['']),
  273. on::change('showPriv')
  274. )
  275. )
  276. );
  277. formBase
  278. (
  279. setID('managePrivForm'),
  280. setClass('gap-0'),
  281. formHidden('actions[][]', ''),
  282. formHidden('noChecked', ''),
  283. set::actions(array()),
  284. div
  285. (
  286. setID('managePrivFormContainer'),
  287. setClass('flex'),
  288. div
  289. (
  290. setClass('main main-content canvas'),
  291. h::table
  292. (
  293. setID('privPackageList'),
  294. setClass('table table-striped table-bordered'),
  295. on::click()->call('handlePrivPackageListClick', jsRaw('event')),
  296. h::thead
  297. (
  298. h::tr
  299. (
  300. h::th
  301. (
  302. setClass('module'),
  303. $lang->group->module
  304. ),
  305. h::th
  306. (
  307. setClass('package'),
  308. $lang->privpackage->common
  309. )
  310. )
  311. ),
  312. h::tbody(html($privBodyHtml))
  313. )
  314. ),
  315. div
  316. (
  317. setClass('side relative'),
  318. on::click('.recommend input[type=checkbox]')->call('handleSideRecommentCheckClick', jsRaw('$this')),
  319. div
  320. (
  321. setClass('btn-group absolute top-0.5 right-full z-10 mr-8'),
  322. setID('switchBtnGroup'),
  323. a
  324. (
  325. setClass('btn switchBtn text-primary'),
  326. set::href(inlink('managePriv', "type=byPackage&param=$groupID&nav=$nav&version=$version")),
  327. html("<i class='icon-has-authority-pack'></i>")
  328. ),
  329. a
  330. (
  331. setClass('btn switchBtn'),
  332. set::href(inlink('managePriv', "type=byGroup&param=$groupID&nav=$nav&version=$version")),
  333. html("<i class='icon-without-authority-pack'></i>")
  334. )
  335. ),
  336. div
  337. (
  338. setClass('priv-panel'),
  339. div
  340. (
  341. setClass('panel-title'),
  342. $lang->group->dependentPrivs,
  343. icon
  344. (
  345. 'help',
  346. set('data-toggle', 'tooltip'),
  347. set('data-title', $lang->group->dependPrivTips),
  348. set('data-placement', 'right'),
  349. set('data-type', 'white'),
  350. set('data-class-name', 'text-gray border border-light w-40'),
  351. setClass('text-gray')
  352. )
  353. ),
  354. div
  355. (
  356. setClass('panel-content'),
  357. div
  358. (
  359. setClass('menuTree depend menu-active-primary menu-hover-primary'),
  360. setClass(count($relatedPrivData['depend']) == 0 ? 'hidden' : ''),
  361. $dependTree
  362. ),
  363. div
  364. (
  365. setClass('table-empty-tip text-center'),
  366. setClass(count($relatedPrivData['depend']) > 0 ? 'hidden' : ''),
  367. span
  368. (
  369. setClass('text-gray'),
  370. $lang->noData
  371. )
  372. )
  373. )
  374. ),
  375. div
  376. (
  377. setClass('priv-panel mt-m'),
  378. div
  379. (
  380. setClass('panel-title'),
  381. $lang->group->recommendPrivs,
  382. icon
  383. (
  384. 'help',
  385. set('data-toggle', 'tooltip'),
  386. set('data-title', $lang->group->recommendPrivTips),
  387. set('data-placement', 'right'),
  388. set('data-type', 'white'),
  389. set('data-class-name', 'text-gray border border-light w-40'),
  390. setClass('text-gray')
  391. )
  392. ),
  393. div
  394. (
  395. setClass('panel-content'),
  396. div
  397. (
  398. setClass('menuTree recommend menu-active-primary menu-hover-primary'),
  399. setClass(count($relatedPrivData['recommend']) == 0 ? 'hidden' : ''),
  400. $recommendTree
  401. ),
  402. div
  403. (
  404. setClass('table-empty-tip text-center'),
  405. setClass(count($relatedPrivData['recommend']) > 0 ? 'hidden' : ''),
  406. span
  407. (
  408. setClass('text-gray'),
  409. $lang->noData
  410. )
  411. )
  412. )
  413. )
  414. )
  415. ),
  416. toolbar
  417. (
  418. setClass('form-actions priv-footer'),
  419. checkbox
  420. (
  421. setID('allChecker'),
  422. set::rootClass('check-all'),
  423. set::text($lang->selectAll)
  424. ),
  425. btn(set(array('text' => $lang->save, 'btnType' => 'submit', 'type' => 'primary', 'onclick' => 'setNoChecked()'))),
  426. btn(set(array('text' => $lang->goback, 'url' => createLink('group', 'browse'), 'back' => true)))
  427. )
  428. );
  429. }
  430. /* ====== Render page ====== */
  431. render();