page-role.component.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. <nz-page-header>
  2. <nz-page-header-title
  3. >申报单位管理
  4. <br />
  5. <!-- <div class="subtitle">
  6. 使用组织机构树管理使用“十四五”高等教育国家规划教材申报系统的所有单位,单位与申报工作流程相关联。
  7. </div> -->
  8. </nz-page-header-title>
  9. <nz-page-header-extra>
  10. <nz-space>
  11. <!-- <button
  12. style="background: #3e49b3; border: 1px #3e49b3"
  13. *nzSpaceItem
  14. nz-button
  15. nzType="primary"
  16. (click)="addMember()"
  17. >
  18. 添加账号
  19. </button> -->
  20. </nz-space>
  21. </nz-page-header-extra>
  22. </nz-page-header>
  23. <div class="edit-content">
  24. <div class="tool">
  25. <div class="tool-left">
  26. <div class="search">
  27. <!-- <nz-input-group style="width: 210px" [nzPrefix]="prefixTemplateUser">
  28. <input
  29. type="text"
  30. nz-input
  31. placeholder="搜索"
  32. [(ngModel)]="searchValue"
  33. (ngModelChange)="onSearchNodes($event)"
  34. />
  35. </nz-input-group> -->
  36. <ng-template #prefixTemplateUser
  37. ><span nz-icon nzType="search"></span
  38. ></ng-template>
  39. <button
  40. nz-button
  41. nzType="default"
  42. nz-dropdown
  43. [nzDropdownMenu]="menutep"
  44. [nzPlacement]="'bottomLeft'"
  45. style="margin-left: 0px; width: 280px;"
  46. >
  47. <span nz-icon nzType="plus" nzTheme="outline"></span>新建
  48. </button>
  49. <nz-dropdown-menu #menutep="nzDropdownMenu">
  50. <ul nz-menu>
  51. <li nz-menu-item>
  52. <button
  53. nz-button
  54. nzType="link"
  55. (click)="showModalDepart('add')"
  56. style="color: #231c1f"
  57. >
  58. <span nz-icon nzType="plus" nzTheme="outline"></span>添加部门
  59. </button>
  60. </li>
  61. <!-- <li nz-menu-item>
  62. <button
  63. nz-button
  64. nzType="link"
  65. style="color: #231c1f"
  66. (click)="showModalOrganize()"
  67. >
  68. <span nz-icon nzType="merge" nzTheme="outline"></span>
  69. 新建组织
  70. </button>
  71. </li> -->
  72. </ul>
  73. </nz-dropdown-menu>
  74. </div>
  75. <div class="">{{ currentDepart ? currentDepart.title : "" }}</div>
  76. <div class="tag">
  77. <span nz-icon nzType="team" nzTheme="outline"></span>
  78. {{ profiles.length }}人
  79. </div>
  80. <label nz-checkbox [(ngModel)]="checkedShowFilter"
  81. (ngModelChange)="onChecked()"
  82. >仅显示部门直属成员</label
  83. >
  84. </div>
  85. <div class="tool-right">
  86. <a nz-button nzType="link" (click)="addMember()">
  87. <span nz-icon nzType="plus" nzTheme="outline"></span>添加成员
  88. </a>
  89. </div>
  90. </div>
  91. <div class="layout" #maxWidth>
  92. <div class="sider" #sider>
  93. @if(nodes.length > 0){
  94. <nz-tree
  95. [nzData]="nodes"
  96. nzAsyncData
  97. [nzSearchValue]="searchValueNode"
  98. (nzClick)="nzEvent($event)"
  99. (nzExpandChange)="nzEvent($event)"
  100. (nzSearchValueChange)="onSearch($event)"
  101. [nzTreeTemplate]="nzTreeTemplate"
  102. [nzExpandedKeys]="nzExpandedKeys"
  103. ></nz-tree>
  104. }@else {
  105. <div class="loading">
  106. <nz-spin nzSimple></nz-spin>
  107. <div class="tips">节点加载中</div>
  108. </div>
  109. }
  110. <ng-template #nzTreeTemplate let-node let-origin="origin">
  111. <span
  112. class="custom-node"
  113. (contextmenu)="contextMenu($event, menu, node)"
  114. >
  115. <span class="folder-name">{{ node.title }}</span>
  116. </span>
  117. </ng-template>
  118. <!-- 节点右键菜单 -->
  119. <nz-dropdown-menu #menu="nzDropdownMenu">
  120. <ul nz-menu>
  121. <li nz-menu-item (click)="showModalDepart('add')">添加下级部门</li>
  122. @if (activatedNode?.origin?.branch) {
  123. <li nz-menu-item (click)="showModalDepart('edit')">编辑部门</li>
  124. <li nz-menu-item (click)="onDelDepart()">删除部门</li>
  125. }
  126. </ul>
  127. </nz-dropdown-menu>
  128. </div>
  129. <div class="breadcrumb">
  130. <!-- <comp-table-list
  131. #list
  132. [schema]="Department"
  133. *ngIf="className && fieldsArray"
  134. [className]="className"
  135. [fieldsArray]="fieldsArray"
  136. [queryParams]="queryParams"
  137. ></comp-table-list> -->
  138. <nz-table
  139. #tableData
  140. [nzData]="profiles"
  141. [nzTotal]="profileLength"
  142. [nzPageSize]="pageSize"
  143. [nzPageIndex]="pageIndex"
  144. style="margin: 10px 0"
  145. [nzLoading]="loading"
  146. nzSize="middle"
  147. [nzNoResult]="emptyResult"
  148. [nzFrontPagination]="false"
  149. nzTableLayout="fixed"
  150. (nzPageIndexChange)="pageIndexChange($event)"
  151. >
  152. <thead>
  153. <tr>
  154. <th
  155. nzWidth="50px"
  156. nzLeft
  157. [nzChecked]="checkedAll"
  158. [nzIndeterminate]="indeterminate"
  159. nzLabel="Select all"
  160. (nzCheckedChange)="onAllChecked($event)"
  161. ></th>
  162. <th nzWidth="120px">用户</th>
  163. <th nzWidth="120px">手机号</th>
  164. <th nzWidth="120px">邮箱</th>
  165. <th nzWidth="120px">人员类型</th>
  166. <th nzWidth="120px">所属部门</th>
  167. <th nzWidth="50px" nzRight>操作</th>
  168. </tr>
  169. </thead>
  170. <tbody>
  171. @for (data of profiles; track data.id) {
  172. <tr>
  173. <td
  174. nzLeft
  175. [nzChecked]="setOfCheckedId.has(data.id)"
  176. (nzCheckedChange)="onItemChecked(data.id, $event)"
  177. ></td>
  178. <td
  179. nzEllipsis
  180. (click)="goDateil(data.get('user')?.id)"
  181. class="activeTd"
  182. >
  183. <nz-avatar nzIcon="user"></nz-avatar>
  184. {{ data?.get("user")?.get("name") || '-'}}
  185. </td>
  186. <td nzEllipsis>
  187. {{ data?.get("user")?.get("phone") || '-' }}
  188. </td>
  189. <td nzEllipsis>
  190. {{ data?.get("user")?.get("email") || data?.get("email") || '-'}}
  191. </td>
  192. <td nzEllipsis>
  193. {{ data?.get("identity") }}
  194. </td>
  195. <td nzEllipsis>
  196. {{ data?.get("user").get("departmentName") || '-' }}
  197. </td>
  198. <td nzEllipsis nzRight>
  199. <button
  200. nz-button
  201. nz-dropdown
  202. [nzDropdownMenu]="menu"
  203. [nzPlacement]="'bottomLeft'"
  204. >
  205. <span nz-icon nzType="ellipsis" nzTheme="outline"></span>
  206. </button>
  207. <nz-dropdown-menu #menu="nzDropdownMenu">
  208. <ul nz-menu>
  209. <li nz-menu-item>
  210. <button
  211. (click)="removeBranch(data)"
  212. nz-button
  213. style="color: #231c1f"
  214. nzType="link"
  215. >
  216. <span nz-icon nzType="stop" nzTheme="outline"></span
  217. >移除部门
  218. </button>
  219. </li>
  220. </ul>
  221. </nz-dropdown-menu>
  222. </td>
  223. </tr>
  224. }
  225. </tbody>
  226. </nz-table>
  227. <ng-template #emptyResult>
  228. <nz-empty nzNotFoundImage="/img/group-empty.png"></nz-empty>
  229. </ng-template>
  230. </div>
  231. </div>
  232. </div>
  233. <nz-modal
  234. [(nzVisible)]="isVisible"
  235. nzTitle="{{ editType == 'edit' ? '编辑' : '新建' }}部门"
  236. (nzOnCancel)="handleCancel()"
  237. nzWidth="800px"
  238. nzCentered
  239. >
  240. <ng-container *nzModalContent>
  241. <div nz-row class="depart-modal">
  242. <div nz-col nzSpan="12">
  243. <div class="row">
  244. <div class="label">
  245. 部门名称 <span style="color: #e8353e">*</span>
  246. </div>
  247. <div class="value">
  248. <input
  249. nz-input
  250. placeholder="请输入部门名称"
  251. [(ngModel)]="editObject.name"
  252. type="text"
  253. />
  254. </div>
  255. </div>
  256. <div class="row">
  257. <div class="label">code</div>
  258. <div class="value">
  259. <input
  260. nz-input
  261. placeholder="请输入code"
  262. [(ngModel)]="editObject.code"
  263. type="text"
  264. />
  265. </div>
  266. </div>
  267. <div class="row">
  268. <div class="label">部门描述</div>
  269. <div class="value">
  270. <textarea
  271. [nzAutosize]="{ minRows: 4, maxRows: 4 }"
  272. placeholder="请输入部门描述"
  273. nz-input
  274. [(ngModel)]="editObject.desc"
  275. ></textarea>
  276. </div>
  277. </div>
  278. </div>
  279. <div nz-col nzSpan="12">
  280. <div class="row">
  281. <div class="label">
  282. 上级部门 <span style="color: #e8353e">*</span>
  283. </div>
  284. <div class="value">
  285. <nz-input-group nzSearch [nzAddOnAfter]="suffixIconclear">
  286. <input
  287. nz-input
  288. placeholder="可击下方选择所属上级"
  289. [(ngModel)]="modalValue"
  290. (ngModelChange)="onSearchNodes($event, true)"
  291. (blur)="onblur('editObject')"
  292. type="text"
  293. />
  294. </nz-input-group>
  295. <ng-template #suffixIconclear>
  296. <button nz-button nzType="primary" nzSearch (click)="reset('editObject')">清空</button>
  297. </ng-template>
  298. </div>
  299. </div>
  300. <div class="select">
  301. <div class="bar">
  302. <a style="color: #86909c" (click)="onPre()">所有部门</a>
  303. @for (data of parentMap; track data.title) {
  304. <span style="margin: 0 10px">/</span>
  305. <a (click)="onPre(data, $index)">{{ data.title }}</a>
  306. }
  307. </div>
  308. <div class="tree">
  309. @if(parentList.length > 0){ @for (data of parentList; track $index)
  310. {
  311. <div class="li" (click)="onCheckedDepart('branch', data)">
  312. <label
  313. nz-radio
  314. [ngModel]="data.key == radio"
  315. [nzValue]="data.key"
  316. (click)="onCheckedDepart('branch', data, true)"
  317. >{{ data.title }}</label
  318. >
  319. @if (!data.isLeaf) {
  320. <span nz-icon nzType="right" nzTheme="outline"></span>
  321. }
  322. </div>
  323. }}@else {
  324. <nz-empty nzNotFoundContent="暂无下级部门"></nz-empty>
  325. }
  326. </div>
  327. </div>
  328. </div>
  329. </div>
  330. </ng-container>
  331. <div *nzModalFooter>
  332. <button nz-button nzType="default" (click)="handleCancel()">取消</button>
  333. <button
  334. nz-button
  335. nzType="primary"
  336. style="background: #3e49b3; border: 1px #3e49b3"
  337. (click)="handleOk()"
  338. >
  339. 确定
  340. </button>
  341. </div>
  342. </nz-modal>
  343. <nz-modal
  344. [(nzVisible)]="accountIsVisible"
  345. nzTitle="添加账号"
  346. (nzOnCancel)="handleCancel()"
  347. nzWidth="800px"
  348. nzCentered
  349. >
  350. <ng-container *nzModalContent>
  351. <div nz-row class="depart-modal">
  352. <div nz-col nzSpan="12">
  353. <div class="row" style="margin-bottom: 6px;">
  354. <div class="label">
  355. 选择所属部门 <span style="color: #e8353e">*</span>
  356. </div>
  357. <div class="value">
  358. <nz-input-group nzSearch [nzAddOnAfter]="suffixIconclear">
  359. <input
  360. nz-input
  361. placeholder="请选择所属部门"
  362. [(ngModel)]="modalValue"
  363. (ngModelChange)="onSearchNodes($event, true)"
  364. type="text"
  365. (blur)="onblur('account')"
  366. />
  367. </nz-input-group>
  368. <ng-template #suffixIconclear>
  369. <button nz-button nzType="primary" nzSearch (click)="reset('account')">清空</button>
  370. </ng-template>
  371. </div>
  372. </div>
  373. <div class="select">
  374. <div class="bar">
  375. <a style="color: #86909c" (click)="onPre()">所有部门</a>
  376. @for (data of parentMap; track data.title) {
  377. <span style="margin: 0 10px">/</span>
  378. <a (click)="onPre(data, $index)">{{ data.title }}</a>
  379. }
  380. </div>
  381. <div class="tree">
  382. @if(parentList.length > 0){ @for (data of parentList; track $index)
  383. {
  384. <div class="li" (click)="onCheckedDepart('account', data)">
  385. <label
  386. nz-radio
  387. [ngModel]="data.key == radio"
  388. [nzValue]="data.key"
  389. (click)="onCheckedDepart('account', data, data?.branch)"
  390. >{{ data.title }}</label
  391. >
  392. @if (!data.isLeaf) {
  393. <span nz-icon nzType="right" nzTheme="outline"></span>
  394. }
  395. </div>
  396. }}@else {
  397. <nz-empty nzNotFoundContent="暂无下级部门"></nz-empty>
  398. }
  399. </div>
  400. </div>
  401. <div class="row">
  402. <div class="label">人员类型</div>
  403. <div class="value">
  404. <nz-select
  405. style="width: 100%"
  406. [disabled]="!this.account.department?.id"
  407. nzShowSearch
  408. nzAllowClear
  409. [(ngModel)]="account.identity"
  410. nzPlaceHolder="请选择所属的身份类型"
  411. >
  412. @for(item of userType; track item;let index = $index){
  413. <nz-option nzCustomContent [nzValue]="item" [nzLabel]="item">{{
  414. item
  415. }}</nz-option>
  416. }
  417. </nz-select>
  418. </div>
  419. </div>
  420. </div>
  421. <div nz-col nzSpan="12">
  422. <div class="row">
  423. <div class="label">姓名 <span style="color: #e8353e">*</span></div>
  424. <div class="value">
  425. <input
  426. nz-input
  427. placeholder="请输入姓名"
  428. [(ngModel)]="account.name"
  429. type="text"
  430. />
  431. </div>
  432. </div>
  433. <div class="row">
  434. <div class="label">手机号 <span style="color: #e8353e">*</span></div>
  435. <div class="value">
  436. <input
  437. nz-input
  438. maxlength="11"
  439. placeholder="请输入手机号"
  440. [(ngModel)]="account.phone"
  441. type="text"
  442. />
  443. </div>
  444. </div>
  445. <div class="row">
  446. <div class="label">邮箱 <span style="color: #e8353e">*</span></div>
  447. <div class="value">
  448. <input
  449. nz-input
  450. placeholder="请输入邮箱"
  451. [(ngModel)]="account.email"
  452. type="email"
  453. />
  454. </div>
  455. </div>
  456. <div class="row">
  457. <div class="label">密码 <span style="color: #e8353e">*</span></div>
  458. <div class="value">
  459. <nz-input-group nzSearch [nzAddOnAfter]="">
  460. <input
  461. type="password"
  462. [(ngModel)]="account.password"
  463. nz-input
  464. placeholder="请输入密码"
  465. />
  466. </nz-input-group>
  467. <!-- <ng-template #suffixIconButton>
  468. <button
  469. nz-button
  470. (click)="randomPassword()"
  471. nzType="primary"
  472. nzSearch
  473. >
  474. 自动生成密码
  475. </button>
  476. </ng-template> -->
  477. </div>
  478. </div>
  479. </div>
  480. </div>
  481. </ng-container>
  482. <div *nzModalFooter>
  483. <button nz-button nzType="default" (click)="handleCancel()">取消</button>
  484. <button
  485. nz-button
  486. nzType="primary"
  487. style="background: #3e49b3; border: 1px #3e49b3"
  488. [nzLoading]="isLoadingOne"
  489. (click)="accountComplete()"
  490. >
  491. 确定
  492. </button>
  493. </div>
  494. </nz-modal>
  495. <!-- 全选操作:批量操作 -->
  496. <div class="batch-toolbar-modal" *ngIf="setOfCheckedId.size">
  497. <div class="batch-toolbar">
  498. <div class="styles_counter__18S08">
  499. <span>已选</span>
  500. <span class="styles_num__178Wa">{{ setOfCheckedId.size }}</span>
  501. </div>
  502. <div class="batch-toolbar-actions">
  503. <div class="ant-space ant-space-horizontal ant-space-align-center">
  504. <div class="ant-space-item" style="margin-right: 16px">
  505. <button nz-button nzType="text" (click)="removeBranchAll()">
  506. <span nz-icon nzType="delete"></span>
  507. 移除部门
  508. </button>
  509. </div>
  510. </div>
  511. </div>
  512. <div class="styles_cancel__AARoT">
  513. <button nz-button nzType="text" (click)="resetChange()">取消选中</button>
  514. </div>
  515. </div>
  516. </div>