privbygroup.html.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. <?php
  2. /**
  3. * The privbygroup 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. set::actions(array()),
  39. div
  40. (
  41. setID('mainContent'),
  42. setClass('main main-content manageLimitGroup'),
  43. h::table
  44. (
  45. setClass('table table-hover table-striped table-bordered'),
  46. h::thead
  47. (
  48. h::tr
  49. (
  50. h::th($lang->group->module),
  51. h::th($lang->group->method)
  52. )
  53. ),
  54. h::tr
  55. (
  56. setClass(cycle('even, bg-gray')),
  57. h::th
  58. (
  59. setClass('text-right w-40'),
  60. $lang->my->common
  61. ),
  62. h::td
  63. (
  64. setID('my'),
  65. checkbox
  66. (
  67. setID('my-limited'),
  68. set::labelClass('priv'),
  69. set::name('actions[my][]'),
  70. set::value('limited'),
  71. set::checked(isset($groupPrivs['my']['limited'])),
  72. set::text($lang->my->limited)
  73. )
  74. ),
  75. formHidden('noChecked', '')
  76. )
  77. )
  78. ),
  79. toolbar
  80. (
  81. setClass('form-actions w-1/2'),
  82. btn(set(array('text' => $lang->save, 'btnType' => 'submit', 'type' => 'primary', 'onclick' => 'setNoChecked()'))),
  83. btn(set(array('text' => $lang->goback, 'url' => createLink('group', 'browse'), 'back' => true)))
  84. )
  85. );
  86. }
  87. else
  88. {
  89. $params = "type=byGroup&param=$groupID&nav=%s&version=$version";
  90. $mainNavItems = null;
  91. $i = 0;
  92. $dropDownItems = array();
  93. foreach($lang->mainNav as $navKey => $title)
  94. {
  95. if(!is_string($title)) continue;
  96. $i++;
  97. if($i >= $config->group->maxToolBarCount)
  98. {
  99. $dropDownItems[] = array
  100. (
  101. 'text' => strip_tags(substr($title, 0, strpos($title, '|'))),
  102. 'url' => inlink('managePriv', sprintf($params, $navKey)),
  103. 'active' => $nav == $navKey
  104. );
  105. }
  106. }
  107. $i = 0;
  108. foreach($lang->mainNav as $navKey => $title)
  109. {
  110. if(!is_string($title) || $i >= $config->group->maxToolBarCount) continue;
  111. $i++;
  112. if($i == $config->group->maxToolBarCount)
  113. {
  114. $mainNavItems[] = li
  115. (
  116. setClass('nav-item'),
  117. dropdown
  118. (
  119. btn(
  120. setClass('ghost btn btn-default'),
  121. $lang->group->more
  122. ),
  123. set::items($dropDownItems)
  124. )
  125. );
  126. }
  127. else
  128. {
  129. $mainNavItems[] = li
  130. (
  131. setClass('nav-item'),
  132. a
  133. (
  134. setClass($nav == $navKey ? 'active' : ''),
  135. set::href(inlink('managePriv', sprintf($params, $navKey))),
  136. strip_tags(substr($title, 0, strpos($title, '|')))
  137. )
  138. );
  139. }
  140. }
  141. div(setID('featureBar'), menu
  142. (
  143. setClass('nav nav-feature w-full'),
  144. li
  145. (
  146. span
  147. (
  148. icon('lock mr-2'),
  149. $group->name
  150. )
  151. ),
  152. li
  153. (
  154. span
  155. (
  156. set::className('text-md text-gray'),
  157. html($lang->arrow)
  158. )
  159. ),
  160. li
  161. (
  162. setclass('nav-item'),
  163. a
  164. (
  165. setclass(empty($nav) ? 'active' : ''),
  166. set::href(inlink('managepriv', sprintf($params, ''))),
  167. span($lang->group->all)
  168. )
  169. ),
  170. $mainNavItems,
  171. li
  172. (
  173. setClass('nav-item mr-2'),
  174. a
  175. (
  176. setClass($nav == 'general' ? 'active' : ''),
  177. set::href(inlink('managePriv', sprintf($params, 'general'))),
  178. span($lang->group->general)
  179. )
  180. ),
  181. picker
  182. (
  183. setID('versionSelect'),
  184. set::name('version'),
  185. set::items($lang->group->versions),
  186. set::value($version),
  187. set::placeholder($lang->group->versions['']),
  188. on::change('showPriv')
  189. )
  190. ));
  191. $getMethodItemsHtml = function($package, $subsetName, $packageID, $groupPrivs)
  192. {
  193. $html = '';
  194. foreach($package->privs as $privID => $priv)
  195. {
  196. $checked = isset($groupPrivs[$priv->module][$priv->method]);
  197. $checkID = "actions[{$priv->module}][{$priv->method}]";
  198. $html .= "<div class='group-item' data-module='$subsetName' data-package='$packageID' data-divid='{$subsetName}{$packageID}' data-id='$privID'><div class='checkbox-primary'>";
  199. $html .= "<input type='checkbox' id='$checkID' value='$priv->method' name='actions[{$priv->module}][]' data-id='$privID'". ($checked ? ' checked' : '') . ">";
  200. $html .= "<label for='$checkID'>$priv->name</label>";
  201. $html .= '</div></div>';
  202. }
  203. return $html;
  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. $privBodyHtml = array();
  224. foreach($subsets as $subsetName => $subset)
  225. {
  226. if($subset->allCount == 0) continue;
  227. $i = 1;
  228. foreach($packages[$subsetName] as $packageID => $package)
  229. {
  230. $subsetTitle = isset($lang->$subsetName) && isset($lang->$subsetName->common) ? $lang->$subsetName->common : $subsetName;
  231. $privBodyHtml[] = "<tr zui-key='$packageID'>";
  232. if($i == 1)
  233. {
  234. $rowspan = count($packages[$subsetName]) ? count($packages[$subsetName]) : 1;
  235. $checked = $subset->selectCount && $subset->selectCount == $subset->allCount;
  236. $checkID = "allChecker{$subsetName}";
  237. $privBodyHtml[] = "<th zui-key='module' class='text-middle text-left module' rowspan='$rowspan' data-module='$subsetName' all-privs='$subset->allCount' select-privs='$subset->selectCount'>";
  238. $privBodyHtml[] = '<div class="checkbox-inline checkbox-left check-all"><div class="checkbox-primary">';
  239. $privBodyHtml[] = "<input type='checkbox' id='$checkID' value='1'" . ($checked ? ' checked' : '') . ">";
  240. $privBodyHtml[] = "<label for='$checkID' class='" . ($subset->selectCount && $subset->selectCount != $subset->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left') . "'>$subsetTitle</label>";
  241. $privBodyHtml[] = '</div></div>';
  242. $privBodyHtml[] = '</th>';
  243. }
  244. $thClass = $i == 1 ? ' td-sm' : ' td-md';
  245. $checked = $package->allCount == $package->selectCount;
  246. $checkID = "allCheckerModule{$subsetName}Package{$packageID}";
  247. $privBodyHtml[] = "<th zui-key='package' 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'>";
  248. $privBodyHtml[] = '<div class="checkbox-inline checkbox-left check-all"><div class="checkbox-primary">';
  249. $privBodyHtml[] = "<input type='checkbox' id='$checkID' value='browse'" . ($checked ? ' checked' : '') . ">";
  250. $privBodyHtml[] = "<label for='$checkID' class='" . ($package->selectCount && $package->selectCount != $package->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left') . "'>{$lang->group->package->$packageID}</label>";
  251. $privBodyHtml[] = '</div></div>';
  252. $privBodyHtml[] = '</th>';
  253. $privBodyHtml[] = "<td zui-key='privs' id='$subsetName'>";
  254. $privBodyHtml[] = $getMethodItemsHtml($package, $subsetName, $packageID, $groupPrivs);
  255. $privBodyHtml[] = '</td>';
  256. $privBodyHtml[] = '</tr>';
  257. $i ++;
  258. }
  259. }
  260. formBase
  261. (
  262. setID('managePrivForm'),
  263. setClass('gap-0'),
  264. formHidden('actions[][]', ''),
  265. formHidden('noChecked', ''),
  266. set::actions(array()),
  267. div
  268. (
  269. setID('managePrivFormContainer'),
  270. setClass('flex'),
  271. div
  272. (
  273. setClass('main main-content canvas'),
  274. h::table
  275. (
  276. setID('privList'),
  277. setClass('table table-striped table-bordered'),
  278. h::thead
  279. (
  280. h::tr
  281. (
  282. h::th
  283. (
  284. setClass('module'),
  285. $lang->group->module
  286. ),
  287. h::th
  288. (
  289. setClass('package'),
  290. $lang->privpackage->common
  291. ),
  292. h::th
  293. (
  294. setClass('method'),
  295. $lang->group->method
  296. )
  297. )
  298. ),
  299. h::tbody(html($privBodyHtml))
  300. )
  301. ),
  302. div
  303. (
  304. setClass('side relative'),
  305. on::click('.recommend input[type=checkbox]')->call('handleSideRecommentCheckClick', jsRaw('$this')),
  306. div
  307. (
  308. setClass('btn-group absolute top-0.5 right-full z-10 mr-8'),
  309. setID('switchBtnGroup'),
  310. a
  311. (
  312. setClass('btn switchBtn'),
  313. set::href(inlink('managePriv', "type=byPackage&param={$groupID}&nav={$nav}&version={$version}")),
  314. html("<i class='icon-has-authority-pack'></i>")
  315. ),
  316. a
  317. (
  318. setClass('btn switchBtn text-primary'),
  319. set::href(inlink('managePriv', "type=byGroup&param={$groupID}&nav={$nav}&version={$version}")),
  320. html("<i class='icon-without-authority-pack'></i>")
  321. )
  322. ),
  323. div
  324. (
  325. setClass('priv-panel'),
  326. div
  327. (
  328. setClass('panel-title'),
  329. $lang->group->dependentPrivs,
  330. icon
  331. (
  332. 'help',
  333. set('data-toggle', 'tooltip'),
  334. set('data-title', $lang->group->dependPrivTips),
  335. set('data-placement', 'right'),
  336. set('data-type', 'white'),
  337. set('data-class-name', 'text-gray border border-light w-40'),
  338. setClass('text-gray')
  339. )
  340. ),
  341. div
  342. (
  343. setClass('panel-content'),
  344. div
  345. (
  346. setClass('menuTree depend menu-active-primary menu-hover-primary'),
  347. setClass(count($relatedPrivData['depend']) == 0 ? 'hidden' : ''),
  348. $dependTree
  349. ),
  350. div
  351. (
  352. setClass('table-empty-tip text-center'),
  353. setClass(count($relatedPrivData['depend']) > 0 ? 'hidden' : ''),
  354. span
  355. (
  356. setClass('text-gray'),
  357. $lang->noData
  358. )
  359. )
  360. )
  361. ),
  362. div
  363. (
  364. setClass('priv-panel mt-m'),
  365. div
  366. (
  367. setClass('panel-title'),
  368. $lang->group->recommendPrivs,
  369. icon
  370. (
  371. 'help',
  372. set('data-toggle', 'tooltip'),
  373. set('data-title', $lang->group->recommendPrivTips),
  374. set('data-placement', 'right'),
  375. set('data-type', 'white'),
  376. set('data-class-name', 'text-gray border border-light w-40'),
  377. setClass('text-gray')
  378. )
  379. ),
  380. div
  381. (
  382. setClass('panel-content'),
  383. div
  384. (
  385. setClass('menuTree recommend menu-active-primary menu-hover-primary'),
  386. setClass(count($relatedPrivData['recommend']) == 0 ? 'hidden' : ''),
  387. $recommendTree
  388. ),
  389. div
  390. (
  391. setClass('table-empty-tip text-center'),
  392. setClass(count($relatedPrivData['recommend']) > 0 ? 'hidden' : ''),
  393. span
  394. (
  395. setClass('text-gray'),
  396. $lang->noData
  397. )
  398. )
  399. )
  400. )
  401. )
  402. ),
  403. toolbar
  404. (
  405. setClass('form-actions priv-footer'),
  406. checkbox
  407. (
  408. setID('allChecker'),
  409. set::rootClass('check-all'),
  410. set::text($lang->selectAll)
  411. ),
  412. btn(set(array('text' => $lang->save, 'btnType' => 'submit', 'type' => 'primary', 'onclick' => 'setNoChecked()'))),
  413. btn(set(array('text' => $lang->goback, 'url' => createLink('group', 'browse'), 'back' => true)))
  414. )
  415. );
  416. }
  417. /* ====== Render page ====== */
  418. render();