privbygroup.html.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <?php
  2. /**
  3. * The privbygroup view file of project 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 Yuting Wang<wangyuting@easycorp.ltd>
  7. * @package project
  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('projectID', $projectID);
  15. jsVar('type', $type);
  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' => inlink('group', "project={$projectID}"), 'back' => true)))
  84. )
  85. );
  86. }
  87. else
  88. {
  89. $params = "projectID={$projectID}&groupID=$groupID&type=byGroup";
  90. div(setID('featureBar'), menu
  91. (
  92. setClass('nav nav-feature w-full'),
  93. li
  94. (
  95. span
  96. (
  97. icon('lock mr-2'),
  98. $group->name
  99. )
  100. ),
  101. li
  102. (
  103. span
  104. (
  105. set::className('text-md text-gray'),
  106. html($lang->arrow)
  107. )
  108. ),
  109. li
  110. (
  111. setclass('nav-item'),
  112. a
  113. (
  114. setclass(empty($nav) ? 'active' : ''),
  115. set::href(inlink('managepriv', sprintf($params, ''))),
  116. span($lang->group->all)
  117. )
  118. )
  119. ));
  120. $getMethodItemsHtml = function($package, $subsetName, $packageID, $groupPrivs)
  121. {
  122. $html = '';
  123. foreach($package->privs as $privID => $priv)
  124. {
  125. $checked = isset($groupPrivs[$priv->module][$priv->method]);
  126. $checkID = "actions[{$priv->module}][{$priv->method}]";
  127. $html .= "<div class='group-item' data-module='$subsetName' data-package='$packageID' data-divid='{$subsetName}{$packageID}' data-id='$privID'><div class='checkbox-primary'>";
  128. $html .= "<input type='checkbox' id='$checkID' value='$priv->method' name='actions[{$priv->module}][]' data-id='$privID'". ($checked ? ' checked' : '') . ">";
  129. $html .= "<label for='$checkID'>$priv->name</label>";
  130. $html .= '</div></div>';
  131. }
  132. return $html;
  133. };
  134. $dependTree = null;
  135. foreach($relatedPrivData['depend'] as $dependPrivs)
  136. {
  137. $dependTree[] = checkboxGroup
  138. (
  139. 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)),
  140. !empty($dependPrivs['children']) ? set::items($dependPrivs['children']) : null
  141. );
  142. }
  143. $recommendTree = null;
  144. foreach($relatedPrivData['recommend'] as $recommendPrivs)
  145. {
  146. $recommendTree[] = checkboxGroup
  147. (
  148. set::title(array('text' => $recommendPrivs['text'], 'id' => "recommendPrivs[{$recommendPrivs['id']}]", 'name' => 'recommendPrivs[]', 'data-id' => $recommendPrivs['id'], 'data-has-children' => !empty($recommendPrivs['children']))),
  149. !empty($recommendPrivs['children']) ? set::items($recommendPrivs['children']) : null
  150. );
  151. }
  152. $privBodyHtml = array();
  153. foreach($subsets as $subsetName => $subset)
  154. {
  155. if($subset->allCount == 0) continue;
  156. $i = 1;
  157. foreach($packages[$subsetName] as $packageID => $package)
  158. {
  159. $subsetTitle = isset($lang->$subsetName) && isset($lang->$subsetName->common) ? $lang->$subsetName->common : $subsetName;
  160. $privBodyHtml[] = "<tr zui-key='$packageID'>";
  161. if($i == 1)
  162. {
  163. $rowspan = count($packages[$subsetName]) ? count($packages[$subsetName]) : 1;
  164. $checked = $subset->selectCount && $subset->selectCount == $subset->allCount;
  165. $checkID = "allChecker{$subsetName}";
  166. $privBodyHtml[] = "<th zui-key='module' class='text-middle text-left module' rowspan='$rowspan' data-module='$subsetName' all-privs='$subset->allCount' select-privs='$subset->selectCount'>";
  167. $privBodyHtml[] = '<div class="checkbox-inline checkbox-left check-all"><div class="checkbox-primary">';
  168. $privBodyHtml[] = "<input type='checkbox' id='$checkID' value='1'" . ($checked ? ' checked' : '') . ">";
  169. $privBodyHtml[] = "<label for='$checkID' class='" . ($subset->selectCount && $subset->selectCount != $subset->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left') . "'>$subsetTitle</label>";
  170. $privBodyHtml[] = '</div></div>';
  171. $privBodyHtml[] = '</th>';
  172. }
  173. $thClass = $i == 1 ? ' td-sm' : ' td-md';
  174. $checked = $package->allCount == $package->selectCount;
  175. $checkID = "allCheckerModule{$subsetName}Package{$packageID}";
  176. $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'>";
  177. $privBodyHtml[] = '<div class="checkbox-inline checkbox-left check-all"><div class="checkbox-primary">';
  178. $privBodyHtml[] = "<input type='checkbox' id='$checkID' value='browse'" . ($checked ? ' checked' : '') . ">";
  179. $privBodyHtml[] = "<label for='$checkID' class='" . ($package->selectCount && $package->selectCount != $package->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left') . "'>{$lang->group->package->$packageID}</label>";
  180. $privBodyHtml[] = '</div></div>';
  181. $privBodyHtml[] = '</th>';
  182. $privBodyHtml[] = "<td zui-key='privs' id='$subsetName'>";
  183. $privBodyHtml[] = $getMethodItemsHtml($package, $subsetName, $packageID, $groupPrivs);
  184. $privBodyHtml[] = '</td>';
  185. $privBodyHtml[] = '</tr>';
  186. $i ++;
  187. }
  188. }
  189. formBase
  190. (
  191. setID('managePrivForm'),
  192. setClass('gap-0' . ($app->getClientLang() == 'en' ? ' en-priv' : '')),
  193. formHidden('actions[][]', ''),
  194. formHidden('noChecked', ''),
  195. set::actions(array()),
  196. div
  197. (
  198. setID('managePrivFormContainer'),
  199. setClass('flex'),
  200. div
  201. (
  202. setClass('main main-content canvas'),
  203. h::table
  204. (
  205. setID('privList'),
  206. setClass('table table-striped table-bordered'),
  207. h::thead
  208. (
  209. h::tr
  210. (
  211. h::th
  212. (
  213. setClass('module'),
  214. $lang->group->module
  215. ),
  216. h::th
  217. (
  218. setClass('package'),
  219. $lang->privpackage->common
  220. ),
  221. h::th
  222. (
  223. setClass('method'),
  224. $lang->group->method
  225. )
  226. )
  227. ),
  228. h::tbody(html($privBodyHtml))
  229. )
  230. ),
  231. div
  232. (
  233. setClass('side relative'),
  234. on::click('.recommend input[type=checkbox]')->call('handleSideRecommentCheckClick', jsRaw('$this')),
  235. div
  236. (
  237. setClass('btn-group absolute top-0.5 right-full z-10 mr-8'),
  238. setID('switchBtnGroup'),
  239. a
  240. (
  241. setClass('btn switchBtn'),
  242. set::href(inlink('managePriv', "projectID=$projectID&groupID=$groupID&type=byPackage")),
  243. html("<i class='icon-has-authority-pack'></i>")
  244. ),
  245. a
  246. (
  247. setClass('btn switchBtn text-primary'),
  248. set::href(inlink('managePriv', "projectID=$projectID&groupID=$groupID&type=byGroup")),
  249. html("<i class='icon-without-authority-pack'></i>")
  250. )
  251. ),
  252. div
  253. (
  254. setClass('priv-panel'),
  255. div
  256. (
  257. setClass('panel-title'),
  258. $lang->group->dependentPrivs,
  259. icon
  260. (
  261. 'help',
  262. set('data-toggle', 'tooltip'),
  263. set('data-title', $lang->group->dependPrivTips),
  264. set('data-placement', 'right'),
  265. set('data-type', 'white'),
  266. set('data-class-name', 'text-gray border border-light w-40'),
  267. setClass('text-gray')
  268. )
  269. ),
  270. div
  271. (
  272. setClass('panel-content'),
  273. div
  274. (
  275. setClass('menuTree depend menu-active-primary menu-hover-primary'),
  276. setClass(count($relatedPrivData['depend']) == 0 ? 'hidden' : ''),
  277. $dependTree
  278. ),
  279. div
  280. (
  281. setClass('table-empty-tip text-center'),
  282. setClass(count($relatedPrivData['depend']) > 0 ? 'hidden' : ''),
  283. span
  284. (
  285. setClass('text-gray'),
  286. $lang->noData
  287. )
  288. )
  289. )
  290. ),
  291. div
  292. (
  293. setClass('priv-panel mt-m'),
  294. div
  295. (
  296. setClass('panel-title'),
  297. $lang->group->recommendPrivs,
  298. icon
  299. (
  300. 'help',
  301. set('data-toggle', 'tooltip'),
  302. set('data-title', $lang->group->recommendPrivTips),
  303. set('data-placement', 'right'),
  304. set('data-type', 'white'),
  305. set('data-class-name', 'text-gray border border-light w-40'),
  306. setClass('text-gray')
  307. )
  308. ),
  309. div
  310. (
  311. setClass('panel-content'),
  312. div
  313. (
  314. setClass('menuTree recommend menu-active-primary menu-hover-primary'),
  315. setClass(count($relatedPrivData['recommend']) == 0 ? 'hidden' : ''),
  316. $recommendTree
  317. ),
  318. div
  319. (
  320. setClass('table-empty-tip text-center'),
  321. setClass(count($relatedPrivData['recommend']) > 0 ? 'hidden' : ''),
  322. span
  323. (
  324. setClass('text-gray'),
  325. $lang->noData
  326. )
  327. )
  328. )
  329. )
  330. )
  331. ),
  332. toolbar
  333. (
  334. setClass('form-actions priv-footer'),
  335. checkbox
  336. (
  337. setID('allChecker'),
  338. set::rootClass('check-all'),
  339. set::text($lang->selectAll)
  340. ),
  341. btn(set(array('text' => $lang->save, 'btnType' => 'submit', 'type' => 'primary', 'onclick' => 'setNoChecked()'))),
  342. btn(set(array('text' => $lang->goback, 'url' => inlink('group', "project={$projectID}"), 'back' => true)))
  343. )
  344. );
  345. }
  346. /* ====== Render page ====== */
  347. render();