create.blade.php 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. @extends('layouts.app')
  2. @section('title')录入-用户@endsection
  3. @section('content')
  4. <div class="container" id="editPanel">
  5. <div class="row justify-content-center">
  6. @if(Session::has('successTip'))
  7. <div class="alert alert-success h1">{{Session::get('successTip')}}</div>
  8. @endif
  9. <div class="col-md-8">
  10. <div class="card">
  11. <div class="card-header">录入用户</div>
  12. <div class="card-body">
  13. <form method="POST" action="{{ route('register') }}">
  14. @csrf
  15. <div class="form-group row">
  16. <label for="name" class="col-md-3 col-form-label text-md-right">姓名</label>
  17. <div class="col-md-7">
  18. <input id="name" type="text"
  19. class="form-control @error('name') is-invalid @enderror" name="name"
  20. value="{{ old('name') }}" required autocomplete="name" autofocus>
  21. @error('name')
  22. <span class="invalid-feedback" role="alert">
  23. <strong>{{ $message }}</strong>
  24. </span>
  25. @enderror
  26. </div>
  27. </div>
  28. <div class="form-group row">
  29. <label for="email" class="col-md-3 col-form-label text-md-right">Email地址</label>
  30. <div class="col-md-7">
  31. <input id="email" type="email"
  32. class="form-control @error('email') is-invalid @enderror" name="email"
  33. value="{{ old('email') }}" required autocomplete="email">
  34. @error('email')
  35. <span class="invalid-feedback" role="alert">
  36. <strong>{{ $message }}</strong>
  37. </span>
  38. @enderror
  39. </div>
  40. </div>
  41. <div class="form-group row">
  42. <label for="phone" class="col-md-3 col-form-label text-md-right">手机号码</label>
  43. <div class="col-md-7">
  44. <input id="phone" type="phone"
  45. class="form-control @error('phone') is-invalid @enderror" name="phone"
  46. value="{{ old('phone') }}" autocomplete="phone">
  47. @error('phone')
  48. <span class="invalid-feedback" role="alert">
  49. <strong>{{ $message }}</strong>
  50. </span>
  51. @enderror
  52. </div>
  53. </div>
  54. <div class="form-group row">
  55. <label for="password" class="col-md-3 col-form-label text-md-right">密码</label>
  56. <div class="col-md-7">
  57. <input id="password" type="password"
  58. class="form-control @error('password') is-invalid @enderror" name="password"
  59. required autocomplete="new-password">
  60. @error('password')
  61. <span class="invalid-feedback" role="alert">
  62. <strong>{{ $message }}</strong>
  63. </span>
  64. @enderror
  65. </div>
  66. </div>
  67. <div class="form-group row">
  68. <label for="password-confirm" class="col-md-3 col-form-label text-md-right">重输密码</label>
  69. <div class="col-md-7">
  70. <input id="password-confirm" type="password" class="form-control"
  71. name="password_confirmation" required autocomplete="new-password">
  72. </div>
  73. </div>
  74. <div class="form-group row">
  75. <label for="userWorkgroupID" class="col-md-3 col-form-label text-md-right">工作组</label>
  76. <div class="col-md-7">
  77. <select class="form-control" name="userWorkgroupID" id="userWorkgroupID">
  78. <option></option>
  79. <option v-for="userWorkgroup in userWorkgroups" :value="userWorkgroup.id">@{{
  80. userWorkgroup.name }}
  81. </option>
  82. </select>
  83. </div>
  84. </div>
  85. <div class="form-group row">
  86. <label for="role" class="col-md-3 col-form-label text-md-right">角色</label>
  87. <div class="col-md-7">
  88. <input type="text" class="form-control tooltipTarget" placeholder="定位角色"
  89. @input="seekRole($event)" title="输入关键词快速定位"></div>
  90. </div>
  91. <div class="form-group row">
  92. <label class="col-md-3"></label>
  93. <div class="col-md-4">
  94. <input name="role" hidden v-model="roles">
  95. <div class="input-group" style="max-height: 190px; overflow-y: scroll;border-radius:5px;opacity:0.5;text-align: center;">
  96. <ul class="list-group" style="width: 100%" onselectstart="return false;">
  97. <li :data-original-title="role.style ? '双击删除角色' : '双击添加角色'"
  98. v-for="role in rolesFilter" :id="role.name"
  99. class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0 "
  100. @dblclick="selectedRole(role)" :class="role.style ? 'active' :''">
  101. <span style="cursor: default;" class=""> @{{ role.name }}</span>
  102. </li>
  103. </ul>
  104. </div>
  105. </div>
  106. <div class="col-md-3">
  107. <div class="input-group"
  108. style="max-height: 190px; overflow-y: scroll;border-radius:5px;text-align: center;">
  109. <ul class="list-group" style="width: 100%" onselectstart="return false;">
  110. <li
  111. title="双击删除角色"
  112. v-for="role in rolesList" :id="role.name"
  113. class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0"
  114. @dblclick="selectedRole(role)"><span style="cursor: default;"> @{{ role.name }} </span>
  115. </li>
  116. </ul>
  117. </div>
  118. </div>
  119. </div>
  120. <div class="form-group row">
  121. <label for="logistic" class="col-md-3 col-form-label text-md-right">可见承运商</label>
  122. <div class="col-md-7">
  123. <input type="text" class="form-control tooltipTarget" placeholder="定位承运商"
  124. @input="seekLogistic($event)" title="输入关键词快速定位"></div>
  125. </div>
  126. <div class="form-group row">
  127. <label class="col-md-3"></label>
  128. <div class="col-md-4">
  129. <div class="input-group"
  130. style="max-height: 150px; overflow-y: scroll;border-radius:5px;opacity:0.5;text-align: center;">
  131. <ul class="list-group" style="width: 100%"
  132. onselectstart="return false;">
  133. <li :data-original-title="logistic.style ? '双击删除承运商' : '双击添加承运商'"
  134. v-for="logistic in logisticsFilter" :id="logistic.name"
  135. class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0"
  136. @dblclick="selectedLogistic(logistic)"
  137. :class="logistic.style ? 'active' :''"><span style="cursor: default;"> @{{ logistic.name }} </span>
  138. </li>
  139. </ul>
  140. </div>
  141. </div>
  142. <div class="col-md-3">
  143. <input name="logistic" hidden v-model="logistics">
  144. <div class="input-group"
  145. style="max-height: 150px; overflow-y: scroll;border-radius:5px;text-align: center;">
  146. <ul class="list-group" style="width: 100%" onselectstart="return false;">
  147. <li title="双击删除承运商" v-for="logistic in logisticsList"
  148. class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0"
  149. @dblclick="selectedLogistic(logistic)"><span style="cursor: default;"> @{{ logistic.name }} </span>
  150. </li>
  151. </ul>
  152. </div>
  153. </div>
  154. </div>
  155. <div class="form-group row">
  156. <label for="logistic" class="col-md-3 col-form-label text-md-right">可见供应商</label>
  157. <div class="col-md-7">
  158. <input type="text" class="form-control tooltipTarget" placeholder="定位供应商"
  159. @input="seekSupplier($event)" title="输入关键词快速定位"></div>
  160. </div>
  161. <div class="form-group row">
  162. <label class="col-md-3"></label>
  163. <div class="col-md-4">
  164. <div class="input-group"
  165. style="max-height: 150px; overflow-y: scroll;border-radius:5px;opacity:0.5;text-align: center;">
  166. <ul class="list-group" style="width: 100%"
  167. onselectstart="return false;">
  168. <li :data-original-title="supplier.style ? '双击删除供应商' : '双击添加供应商'"
  169. v-for="supplier in suppliersFilter" :id="supplier.name"
  170. class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0"
  171. @dblclick="selectedSupplier(supplier)"
  172. :class="supplier.style ? 'active' :''"><span style="cursor: default;"> @{{ supplier.name }} </span>
  173. </li>
  174. </ul>
  175. </div>
  176. </div>
  177. <div class="col-md-3">
  178. <input name="supplier" hidden v-model="supplier">
  179. <div class="input-group"
  180. style="max-height: 150px; overflow-y: scroll;border-radius:5px;text-align: center;">
  181. <ul class="list-group" style="width: 100%" onselectstart="return false;">
  182. <li :data-original-title="suppliersList ? '双击删除供应商' : ''"
  183. v-for="supplier in suppliersList"
  184. class="tooltipTarget list-group-item list-group-item-action pt-0 pb-0"
  185. @dblclick="selectedSupplier(supplier)"><span style="cursor: default;"> @{{ supplier.name }} </span>
  186. </li>
  187. </ul>
  188. </div>
  189. </div>
  190. </div>
  191. {{-- 工作组、项目组开始 --}}
  192. <div class="form-group row ">
  193. <div class="col-6">
  194. <div class="card-header row">
  195. <div class="col-4">
  196. <div class="pull-left h5 font-weight-bold mr-3">工作组</div>
  197. <div class="pull-left text-muted">
  198. <div class="custom-control custom-checkbox">
  199. <input type="checkbox" class="custom-control-input" id="check-works" @change="hideNoSelected('workGroup',$event.target.checked)">
  200. <label class="custom-control-label ml-0" for="check-works">已拥有</label>
  201. </div>
  202. </div>
  203. </div>
  204. <div class="col-5">
  205. <div class="btn-group">
  206. <a class="btn border btn-primary" @click="expand(true)">展开全部</a>
  207. <a class="btn border btn-primary" @click="expand(false)">收起全部</a>
  208. </div>
  209. </div>
  210. </div>
  211. <div class="card-body overflow-scrollbar-200" style="max-height: 400px" id="workGroup">
  212. <tree :list="workGroup" :column="'name'" ></tree>
  213. </div>
  214. </div>
  215. <div class="col-6">
  216. <div class="card-header row">
  217. <div class="pull-left h5 font-weight-bold mr-3">项目组</div>
  218. <div class="pull-left text-muted">
  219. <div class="custom-control custom-checkbox">
  220. <input type="checkbox" class="custom-control-input" id="check-ownerGroups" @change="hideNoSelected('ownerGroup',$event.target.checked)">
  221. <label class="custom-control-label ml-0" for="check-ownerGroups">已拥有</label>
  222. </div>
  223. </div>
  224. </div>
  225. <div class="card-body overflow-scrollbar-200" style="max-height: 400px">
  226. <ul class="list-group">
  227. <li class="list-group-item" v-for="owner in ownerGroup" v-show="!owner.hide">
  228. <div class="form-check">
  229. <label class="form-check-label w-100">
  230. <input type="checkbox" class="form-check-input" name="ownerGroup[]" v-model="ownerGroups" :value="owner.id">@{{ owner.name }}
  231. </label>
  232. </div>
  233. </li>
  234. </ul>
  235. </div>
  236. </div>
  237. </div>
  238. {{-- 工作组、项目组结束--}}
  239. <input type="hidden" value="{{url('maintenance/user/create')}}">
  240. <div class="form-group row mb-0">
  241. <div class="col-md-7 offset-md-4">
  242. <button type="submit" class="btn btn-primary">
  243. 录入
  244. </button>
  245. </div>
  246. </div>
  247. </form>
  248. </div>
  249. </div>
  250. </div>
  251. </div>
  252. </div>
  253. @endsection
  254. @section('lastScript')
  255. <script>
  256. let vueList = new Vue({
  257. el: "#editPanel",
  258. data: {
  259. userWorkgroups: [
  260. @foreach($userWorkgroups as $userWorkgroup)
  261. {!! $userWorkgroup !!},
  262. @endforeach
  263. ],
  264. rolesAll: [
  265. @foreach( $rolesAll as $role )
  266. {
  267. id: '{{$role->id}}', name: '{{$role->name}}', style: false
  268. },
  269. @endforeach
  270. ],
  271. rolesFilter: [
  272. @foreach( $rolesAll as $role )
  273. {
  274. id: '{{$role->id}}', name: '{{$role->name}}', style: false
  275. },
  276. @endforeach
  277. ],
  278. roles: [{{old('role')}}],
  279. rolesList: [],
  280. logisticsAll: [
  281. @foreach($logistics as $logistic)
  282. {
  283. id: '{{$logistic->id}}', name: '{{$logistic->name}}', style: false
  284. },
  285. @endforeach
  286. ],
  287. logisticsFilter: [
  288. @foreach($logistics as $logistic)
  289. {
  290. id: '{{$logistic->id}}', name: '{{$logistic->name}}', style: false
  291. },
  292. @endforeach
  293. ],
  294. logistics: [{{old('logistic')}}],
  295. logisticsList: [],
  296. suppliersAll: [
  297. @foreach($suppliers as $supplier)
  298. {
  299. id: '{{$supplier->id}}', name: '{{$supplier->name}}', style: false
  300. },
  301. @endforeach
  302. ],
  303. suppliersFilter: [
  304. @foreach($suppliers as $supplier)
  305. {
  306. id: '{{$supplier->id}}', name: '{{$supplier->name}}', style: false
  307. },
  308. @endforeach
  309. ],
  310. supplier: [{{old('supplier')}}],
  311. suppliersList: [],
  312. workGroup: [@foreach($workGroup as $wg)@json($wg),@endforeach],
  313. ownerGroup: [@foreach($ownerGroup as $group)@json($group),@endforeach],
  314. ownerGroups: []
  315. },
  316. components:{
  317. 'tree':"url:{{asset("js/vue/tree.vue")}}"
  318. },
  319. mounted: function () {
  320. $(".tooltipTarget").tooltip({ boundary: 'window' });
  321. if (this.roles.length > 0) {
  322. let rolesAll = this.rolesAll;
  323. let roles = this.roles;
  324. let rolesList = this.rolesList;
  325. for (let i = 0; i < roles.length; i++) {
  326. rolesAll.every(function (roleAll) {
  327. if (roleAll.id == roles[i]) {
  328. roleAll.style = true;
  329. rolesList.push({'id': roleAll.id, 'name': roleAll.name});
  330. return false;
  331. }
  332. return true;
  333. });
  334. }
  335. }
  336. if (this.logistics.length > 0) {
  337. let logisticsAll = this.logisticsAll;
  338. let logistics = this.logistics;
  339. let logisticsList = this.logisticsList;
  340. for (let i = 0; i < logistics.length; i++) {
  341. logisticsAll.every(function (logisticAll) {
  342. if (logisticAll.id == logistics[i]) {
  343. logisticAll.style = true;
  344. logisticsList.push({'id': logisticAll.id, 'name': logisticAll.name});
  345. return false;
  346. }
  347. return true;
  348. });
  349. }
  350. }
  351. },
  352. methods: {
  353. selectedLogistic: function (e) {
  354. let logistics = this.logistics;
  355. let logisticsAll = this.logisticsAll;
  356. let logisticsList = this.logisticsList;
  357. let isLogistic = true;
  358. if (logistics && logisticsAll) {
  359. for (let i = 0; i < logistics.length; i++) {
  360. if (logistics[i] == e.id) {
  361. logistics.splice(i, 1);
  362. logisticsAll.every(function (logisticAll) {
  363. if (logisticAll.id == e.id) {
  364. logisticAll.style = false;
  365. return false;
  366. }
  367. return true;
  368. });
  369. logisticsList.every(function (logistic, i) {
  370. if (logistic.id == e.id) {
  371. logisticsList.splice(i, 1);
  372. $(".tooltipTarget").tooltip('hide');
  373. return false;
  374. }
  375. return true;
  376. });
  377. isLogistic = false;
  378. break;
  379. }
  380. isLogistic = true;
  381. }
  382. }
  383. if (isLogistic || !logistics) {
  384. logistics.push(e.id);
  385. logisticsAll.every(function (logisticAll) {
  386. if (logisticAll.id == e.id) {
  387. logisticAll.style = true;
  388. logisticsList.push({'id': logisticAll.id, 'name': logisticAll.name});
  389. return false;
  390. }
  391. return true;
  392. });
  393. }
  394. this.resetTooltip();
  395. },
  396. selectedSupplier: function (e) {
  397. let supplier = this.supplier;
  398. let suppliersAll = this.suppliersAll;
  399. let suppliersList = this.suppliersList;
  400. let isSupplier = true;
  401. if (supplier && suppliersAll) {
  402. for (let i = 0; i < supplier.length; i++) {
  403. if (supplier[i] == e.id) {
  404. supplier.splice(i, 1);
  405. suppliersAll.every(function (suppliersAll) {
  406. if (suppliersAll.id == e.id) {
  407. suppliersAll.style = false;
  408. return false;
  409. }
  410. return true;
  411. });
  412. suppliersList.every(function (supplier, i) {
  413. if (supplier.id == e.id) {
  414. suppliersList.splice(i, 1);
  415. $(".tooltipTarget").tooltip('hide');
  416. return false;
  417. }
  418. return true;
  419. });
  420. isSupplier = false;
  421. break;
  422. }
  423. isSupplier = true;
  424. }
  425. }
  426. if (isSupplier || !supplier) {
  427. supplier.push(e.id);
  428. suppliersAll.every(function (suppliersAll) {
  429. if (suppliersAll.id == e.id) {
  430. suppliersAll.style = true;
  431. suppliersList.push({'id': suppliersAll.id, 'name': suppliersAll.name});
  432. return false;
  433. }
  434. return true;
  435. });
  436. }
  437. this.resetTooltip();
  438. },
  439. seekLogistic: function (e) {
  440. let $val = e.target.value;
  441. let logisticsAll = this.logisticsAll;
  442. let bool = false;
  443. logisticsAll.every(function (logisticAll) {
  444. let name = logisticAll.name;
  445. if (name.includes($val)) {
  446. bool = true;
  447. return false;
  448. }
  449. return true;
  450. });
  451. if($val==='' && !bool){
  452. this.logisticsFilter = this.logisticsAll;
  453. }else if(bool){
  454. this.logisticsFilter= [];
  455. for (let i = 0; i < logisticsAll.length; i++) {
  456. let carries = logisticsAll[i];
  457. let name = carries.name;
  458. if(name.includes($val)){
  459. this.logisticsFilter.push(carries);
  460. }
  461. }
  462. }
  463. this.resetTooltip();
  464. },
  465. seekSupplier: function (e) {
  466. let $val = e.target.value;
  467. let suppliersAll = this.suppliersAll;
  468. let bool = false;
  469. suppliersAll.every(function (supplierAll) {
  470. let name = supplierAll.name;
  471. if (name.includes($val)) {
  472. bool = true;
  473. return false;
  474. }
  475. return true;
  476. });
  477. if($val==='' && !bool){
  478. this.suppliersFilter = this.suppliersAll;
  479. }else if(bool){
  480. this.suppliersFilter= [];
  481. for (let i = 0; i < suppliersAll.length; i++) {
  482. let supplier = suppliersAll[i];
  483. let name = supplier.name;
  484. if(name.includes($val)){
  485. this.suppliersFilter.push(supplier);
  486. }
  487. }
  488. }
  489. this.resetTooltip();
  490. },
  491. selectedRole: function (e) {
  492. let roles = this.roles;
  493. let rolesAll = this.rolesAll;
  494. let rolesList = this.rolesList;
  495. let isRole = true;
  496. if (roles && rolesAll) {
  497. for (let i = 0; i < roles.length; i++) {
  498. if (roles[i] == e.id) {
  499. roles.splice(i, 1);
  500. rolesAll.every(function (roleAll) {
  501. if (roleAll.id == e.id) {
  502. roleAll.style = false;
  503. return false;
  504. }
  505. return true;
  506. });
  507. rolesList.every(function (role, i) {
  508. if (role.id == e.id) {
  509. rolesList.splice(i, 1);
  510. $(".tooltipTarget").tooltip('hide');
  511. return false;
  512. }
  513. return true;
  514. });
  515. isRole = false;
  516. break;
  517. }
  518. isRole = true;
  519. }
  520. }
  521. if (isRole || !roles) {
  522. roles.push(e.id);
  523. rolesAll.every(function (roleAll) {
  524. if (roleAll.id == e.id) {
  525. roleAll.style = true;
  526. rolesList.push({'id': roleAll.id, 'name': roleAll.name});
  527. return false;
  528. }
  529. return true;
  530. });
  531. }
  532. this.resetTooltip();
  533. },
  534. seekRole: function (e) {
  535. let $val = e.target.value;
  536. let rolesAll = this.rolesAll;
  537. let rolesFilter = this.rolesFilter;
  538. let bool = false;
  539. rolesAll.every(function (roleAll) {
  540. let name = roleAll.name;
  541. if (name.includes($val)) {
  542. bool = true;
  543. return false;
  544. }
  545. return true;
  546. });
  547. if ($val === '' && bool) {
  548. this.rolesFilter = this.rolesAll;
  549. } else if (bool) {
  550. this.rolesFilter = [];
  551. for (let i = 0; i < rolesAll.length; i++) {
  552. let role = rolesAll[i];
  553. let name = role.name;
  554. if (name.includes($val)) {
  555. this.rolesFilter.push(role);
  556. }
  557. }
  558. }
  559. this.resetTooltip();
  560. },
  561. resetTooltip(){
  562. setTimeout(function () {
  563. $(".tooltipTarget").tooltip({ boundary: 'window' });
  564. }, 10 )
  565. },
  566. expand(isExpand){
  567. if (isExpand) $("#workGroup .up").slideDown();
  568. else $("#workGroup .up").slideUp();
  569. },
  570. hideNoSelected(type,isHide = true){
  571. switch (type) {
  572. case "ownerGroup":
  573. this.owners.forEach((owner,i)=>{
  574. let check = isHide;
  575. if (owner.hide !== check)this.$set(this.owners[i],"hide",check);
  576. });
  577. break;
  578. case "workGroup":
  579. let nodes = document.getElementById("workGroup").getElementsByTagName("INPUT");
  580. for (let i=0;i<nodes.length;i++){
  581. if (!nodes[i].checked && isHide)nodes[i].parentElement.parentElement.className = "d-none";
  582. else nodes[i].parentElement.parentElement.className = "";
  583. }
  584. break;
  585. default: break;
  586. }
  587. },
  588. },
  589. });
  590. </script>
  591. @endsection