privbypackage.html.php 15 KB

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