index.blade.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. @extends('layouts.app')
  2. @section('title')菜单@endsection
  3. @section('content')
  4. <div class="container-fluid" id="container" @drop="drop($event)" @dragover="dragover($event, false)">
  5. @include("maintenance.menu._modal")
  6. <div class="card" id="content">
  7. <div class="card-body">
  8. @can("计量单位-录入")<button class="btn btn-outline-info mb-1 mr-3" @click="openModal()"><span class="fa fa-plus"></span>&nbsp;新&nbsp;&nbsp;增</button>@endcan
  9. @can("计量单位-录入")<button class="btn border border-2 mb-1 mr-3" :class="isSaveSort ? 'btn-success' : 'text-secondary'" :disabled="!isSaveSort" @click="sort()"> 保 存 </button>@endcan
  10. <div class="row text-nowrap">
  11. <ul class="list-group col-9 offset-1" style="cursor: move;">
  12. <li class="list-group-item" v-for="menu in menus" draggable="true" :id="'menu-'+menu.id"
  13. :data-order="menu.sequence" :data-id="menu.id" :data-parent="menu.parent_id" :data-level="menu.level"
  14. @drop="drop($event)" @dragover="dragover($event)" @dragstart.stop="dragstart(menu.id)">
  15. <i v-if="menu.font" :class="menu.font" :style="menu.font_style"></i>&nbsp;@{{ menu.name }}
  16. <span class="fa fa-close pull-right text-danger" style="cursor: pointer"></span>
  17. <span class="fa fa-edit pull-right text-primary mr-2" style="cursor: pointer"></span>
  18. <div class="row" v-if="menu.child.length>0">
  19. <ul class="list-group col-9 offset-1">
  20. <li class="list-group-item" v-for="menu2 in menu.child" draggable="true" :id="'menu-'+menu2.id"
  21. :data-order="menu2.sequence" :data-id="menu2.id" :data-parent="menu2.parent_id" :data-level="menu2.level"
  22. @drop="drop($event)" @dragover="dragover($event,dragoverId!=menu.id)" @dragstart.stop="dragstart(menu2.id)">
  23. @{{ menu2.name }}
  24. <div class="row" v-if="menu2.child.length>0">
  25. <ul class="list-group col-9 offset-1">
  26. <li class="list-group-item" v-for="menu3 in menu2.child" draggable="true" :id="'menu-'+menu3.id"
  27. :data-order="menu3.sequence" :data-id="menu3.id" :data-parent="menu3.parent_id" :data-level="menu3.level"
  28. @drop="drop($event)" @dragover="dragover($event,dragoverId!=menu2.id && dragoverId!=menu.id)" @dragstart.stop="dragstart(menu3.id)">
  29. @{{ menu3.name }}
  30. <div class="row" v-if="menu3.child.length>0">
  31. <ul class="list-group col-9 offset-1">
  32. <li class="list-group-item" v-for="menu4 in menu3.child" draggable="true" :id="'menu-'+menu4.id"
  33. :data-order="menu4.sequence" :data-id="menu4.id" :data-parent="menu4.parent_id" :data-level="menu4.level"
  34. @drop="drop($event)" @dragover="dragover($event,dragoverId!=menu3.id && dragoverId!=menu2.id && dragoverId!=menu.id)" @dragstart.stop="dragstart(menu4.id)">
  35. @{{ menu4.name }}
  36. </li>
  37. </ul>
  38. </div>
  39. </li>
  40. </ul>
  41. </div>
  42. </li>
  43. </ul>
  44. </div>
  45. </li>
  46. </ul>
  47. </div>
  48. <li id="dragover-container" class="border-dashed-red" v-show="isDragover" @drop="drop($event)" @dragover="dragover($event,false)">
  49. <div class='w-100 text-center text-secondary'>拖拽至此</div>
  50. </li>
  51. </div>
  52. </div>
  53. </div>
  54. @endsection
  55. @section('lastScript')
  56. <script>
  57. new Vue({
  58. el:"#container",
  59. data:{
  60. menus:[],
  61. unit:{},
  62. errors:{},
  63. dragoverId:"",
  64. isDragover : false,
  65. isSaveSort : false,
  66. menuList:[],
  67. icons:[],
  68. },
  69. mounted(){
  70. let menus = [@foreach($menus as $menu)@json($menu),@endforeach];
  71. let menuMap = {};
  72. menus.forEach(menu=>{
  73. menu["child"] = [];
  74. menuMap["_"+menu.id] = menu;
  75. });
  76. menus.forEach(menu=>{
  77. if (menu.parent_id){
  78. menuMap["_"+menu.parent_id].child.push(menu);
  79. delete menuMap["_"+menu.id];
  80. }
  81. });
  82. this.menus = menuMap;
  83. this._formatSelected();
  84. },
  85. methods:{
  86. _formatSelected(){
  87. new Promise(()=>{
  88. this.menuList = this._mergeArray(this.menus);
  89. this._getIcons()
  90. });
  91. },
  92. _getIcons(){
  93. let url = "{{url('')}}"+"/js/utilities/icons.json";
  94. let request = new XMLHttpRequest();
  95. request.open("get", url);
  96. request.send(null);
  97. request.onload = function () {
  98. if (request.status == 200) {
  99. this.icons = JSON.parse(request.responseText);
  100. }
  101. }
  102. },
  103. _mergeArray(obj,arr=[]){
  104. for (let key in obj){
  105. let name = "";
  106. for (let i=1;i<obj[key]["level"];i++){
  107. name += " ";
  108. }
  109. if (obj[key]['level']!==1)name += "└─";
  110. name += obj[key]["name"];
  111. arr.push({name:name,id:obj[key]["id"],level:obj[key]["level"]});
  112. if (obj[key].child)arr = this._mergeArray(obj[key].child,arr);
  113. }
  114. return arr;
  115. },
  116. openModal(unit = null){
  117. if (unit) this.unit={id:unit.id,name:unit.name};
  118. else this.tag={id:"",name:""};
  119. $("#modal").modal("show");
  120. },
  121. submitUnit(){
  122. let url="{{url('maintenance/unit/save')}}";
  123. let msg=this.unit.id ? "成功修改单位“"+this.unit.name+"”" : "成功新增单位“"+this.unit.name+"”";
  124. window.tempTip.postBasicRequest(url,this.unit,(res)=>{
  125. if(res && res.errors){
  126. this.errors = res.errors;
  127. return '';
  128. }
  129. if (this.unit.id){
  130. this.units.some((unit)=> {
  131. if (unit.id === this.unit.id){
  132. unit.name = this.unit.name;
  133. return true;
  134. }
  135. });
  136. }else this.units.unshift({
  137. id:res.id,
  138. name:res.name,
  139. created_at:res.created_at,
  140. });
  141. $("#modal").modal("hide");
  142. return msg;
  143. },true);
  144. },
  145. dragover(e, isAllow = true){
  146. e.preventDefault();
  147. e.stopPropagation();
  148. if (isAllow) e.currentTarget.after(document.getElementById("dragover-container"))
  149. },
  150. dragstart(id){
  151. $("#menu-"+id).after($("#dragover-container"));
  152. this.dragoverId = id;
  153. this.isDragover = true;
  154. },
  155. drop(e){
  156. e.preventDefault();
  157. e.stopPropagation();
  158. $("#dragover-container").after($("#menu-"+this.dragoverId));
  159. this.handleDrag(this.dragoverId);
  160. this.dragoverId = "";
  161. this.isDragover = false;
  162. this.isSaveSort = true;
  163. },
  164. handleDrag(id){
  165. return new Promise(()=>{
  166. let params = {};
  167. let dom = document.getElementById("menu-"+id);
  168. let oldParent = dom.getAttribute("data-parent");
  169. let parent = dom.parentElement;
  170. let newParent = function () {
  171. while (parent && parent.tagName!=='LI')parent = parent.parentElement;
  172. return parent ? parent.getAttribute("data-id") : null;
  173. }();
  174. if (oldParent!==newParent){
  175. dom.setAttribute("data-parent",newParent);
  176. params.id = id;
  177. params.parent_id = newParent;
  178. let oldLevel = dom.getAttribute("data-level");
  179. let newLevel = parent ? Number(parent.getAttribute("data-level"))+1 : 1;
  180. let diff = oldLevel-newLevel;
  181. if (diff!=0){
  182. dom.setAttribute("data-level",newLevel);
  183. params.level = newLevel;
  184. let child = dom.getElementsByTagName("LI");
  185. if (child.length>0){
  186. params.diff = diff;
  187. params.child = [];
  188. for (let i=0;i<child.length;i++){
  189. params.child.push(child[i].getAttribute("data-id"));
  190. let level = child[i].getAttribute("data-level")-diff;
  191. child[i].setAttribute("data-level",level);
  192. }
  193. }
  194. }
  195. if (JSON.stringify(params)!=='{}'){
  196. window.tempTip.postBasicRequest("{{url('maintenance/menu/update')}}",params,()=>{});
  197. }
  198. }
  199. });
  200. },
  201. sort(){
  202. let nodes = document.getElementById("content").getElementsByTagName("LI");
  203. let update = [["id","sequence"]];
  204. let index = 1;
  205. for (let i=0;i<nodes.length;i++){
  206. let id = nodes[i].getAttribute("data-id");
  207. if (!id)continue;
  208. let oldOrder = nodes[i].getAttribute("data-order");
  209. if (oldOrder != index){
  210. nodes[i].setAttribute("data-order",index);
  211. update.push({id:id,sequence:index});
  212. }
  213. index++;
  214. }
  215. if (update.length > 1){
  216. let url = "{{url('maintenance/menu/sort')}}";
  217. window.tempTip.postBasicRequest(url,{"update":update},()=>{
  218. this.isSaveSort = false;
  219. });
  220. }else this.isSaveSort = false;
  221. },
  222. }
  223. });
  224. </script>
  225. @endsection