powerCtrl.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  1. app.controller('powerCtrl', ["$rootScope", "$scope", "$state", "$timeout", "$interval", "SweetAlert", "$modal", "Restangular", "api_user_data", "api_configure_data", "api_conversation", function($rootScope, $scope, $state, $timeout, $interval, SweetAlert, $modal, Restangular, api_user_data, api_configure_data, api_conversation) {
  2. var loginUser = $rootScope.user;
  3. //user tree
  4. var apple_selected, tree, treedata_avm, treedata_geography;
  5. var i = 0;
  6. $scope.bodyHeight = Math.max((window.innerHeight - 290), 500);
  7. $(window).resize(function() {
  8. $scope.bodyHeight = Math.max((window.innerHeight - 290), 500);
  9. });
  10. $rootScope.isMask = false;
  11. //角色仪表权限
  12. function dashboardaborad(branch) {
  13. $scope.dashboard_tree = angular.copy($scope.dashboard_data);
  14. angular.forEach($scope.dashboard_tree, function(index, i) {
  15. if (branch.dashboard && branch.dashboard.length > 0) {
  16. angular.forEach(branch.dashboard, function(item) {
  17. if (index.id == item.id) {
  18. $scope.dashboard_tree[i].checks = true;
  19. }
  20. })
  21. }
  22. })
  23. }
  24. //角色树
  25. $scope.my_tree = {};
  26. $scope.my_power = {};
  27. $scope.try_async_load = function() {
  28. $scope.my_data = [];
  29. $scope.doing_async = true;
  30. api_user_data.fetchDataList('role', { "idx": 0, "sum": 1000 }).then(function(response) {
  31. if (response.status == 200) {
  32. var data = response.list;
  33. var objects = [];
  34. for (var i = 0; i < data.length; i++) {
  35. var object = {};
  36. object.id = data[i].id;
  37. if (data[i].parent && data[i].parent.id != 0) {
  38. object.parent = data[i].parent.id;
  39. }
  40. angular.extend(object, data[i]);
  41. object.label = object.role;
  42. if (loginUser.id == 1) {
  43. objects.push(object);
  44. } else {
  45. if (object.rolecode != "system_menus") {
  46. objects.push(object);
  47. }
  48. }
  49. }
  50. $scope.my_data = convertParentToChildList(objects);
  51. $scope.tree_data = angular.copy($scope.my_data);
  52. if ($scope.my_data.length > 0) {
  53. $scope.doing_async = false;
  54. }
  55. } else {
  56. SweetAlert.swal({
  57. title: "系统错误!",
  58. text: "请刷新重试!",
  59. type: "error"
  60. });
  61. }
  62. });
  63. };
  64. function convertListToTree(data, treeMap) {
  65. var idToNodeMap = {}; //Keeps track of nodes using id as key, for fast lookup
  66. var root = null; //Initially set our loop to null
  67. //loop over data
  68. for (var i = 0; i < data.length; i++) {
  69. var datum = data[i];
  70. //each node will have children, so let's give it a "children" poperty
  71. datum.children = [];
  72. //add an entry for this node to the map so that any future children can
  73. //lookup the parent
  74. idToNodeMap[datum.id] = datum;
  75. //Does this node have a parent?
  76. // console.log("datum="+JSON.stringify(datum))
  77. if (typeof datum.parent === "undefined" || datum.parent === null) {
  78. //Doesn't look like it, so this node is the root of the tree
  79. root = datum;
  80. treeMap[datum.id] = root;
  81. } else {
  82. //This node has a parent, so let's look it up using the id
  83. parentNode = idToNodeMap[datum.parent.id];
  84. //We don't need this property, so let's delete it.
  85. // delete datum.parent;
  86. //Let's add the current node as a child of the parent node.
  87. parentNode.children.push(datum);
  88. }
  89. }
  90. return root;
  91. }
  92. function convertParentToChildList(data) {
  93. var treeMap = {};
  94. var list = [];
  95. convertListToTree(data, treeMap);
  96. angular.forEach(treeMap, function(item) {
  97. list.push(item);
  98. });
  99. return list;
  100. }
  101. $scope.try_async_load();
  102. //end power
  103. //普通用户菜单权限
  104. $scope.try_async_powerload = function(items) {
  105. if (items) {
  106. $scope.getbranchs = items.menu;
  107. }
  108. // $scope.my_power = [];
  109. var objects = [];
  110. var selected = [];
  111. api_user_data.roleMenu(items.id).then(function(response) {
  112. // api_configure_data.fetchDataList('menu', { "idx": 0, "sum": 1000 }).then(function(response) {
  113. if (response.status == 200) {
  114. var data = response.data;
  115. var objects = [];
  116. for (var i = 0; i < data.length; i++) {
  117. var object = {};
  118. object.id = data[i].id;
  119. if (data[i].parent && data[i].parent.id != 0) {
  120. object.parent = data[i].parent.id;
  121. }
  122. angular.extend(object, data[i]);
  123. object.label = object.title;
  124. objects.push(object);
  125. }
  126. selected = angular.copy($scope.tile);
  127. $scope.my_power = angular.copy($scope.tree_power);
  128. if (data.length > 0) {
  129. angular.forEach(selected, function(index, i) {
  130. angular.forEach(objects, function(item) {
  131. if (index.id == item.id) {
  132. selected[i].checks = true;
  133. }
  134. })
  135. })
  136. $scope.my_power = convertParentToChildList(selected);
  137. } else {
  138. $scope.my_power = convertParentToChildList($scope.tile);
  139. }
  140. if ($scope.my_power.length > 0) {
  141. $scope.doing_asyncpower = false;
  142. }
  143. } else {
  144. SweetAlert.swal({
  145. title: "系统错误!",
  146. text: "请刷新重试!",
  147. type: "error"
  148. });
  149. }
  150. });
  151. };
  152. //普通用户底菜单权限
  153. $scope.my_power = [];
  154. $scope.tile = [];
  155. $scope.try_async_powerloadlow = function() {
  156. var objects = [];
  157. api_user_data.pageMenuByCode("system_menus").then(function(response) {
  158. if (response.status == 200) {
  159. var data = response.data;
  160. var objects = [];
  161. for (var i = 0; i < data.length; i++) {
  162. var object = {};
  163. object.id = data[i].id;
  164. if (data[i].parent && data[i].parent.id != 0) {
  165. object.parent = data[i].parent.id;
  166. }
  167. angular.extend(object, data[i]);
  168. object.label = object.title;
  169. objects.push(object);
  170. }
  171. $scope.tile = objects;
  172. $scope.my_power = convertParentToChildList(objects);
  173. $scope.tree_power = angular.copy($scope.my_power);
  174. if ($scope.my_data.length > 0) {
  175. $scope.doing_asyncpower = false;
  176. }
  177. } else {
  178. SweetAlert.swal({
  179. title: "系统错误!",
  180. text: "请刷新重试!",
  181. type: "error"
  182. });
  183. }
  184. });
  185. };
  186. //管理员 底菜单
  187. $scope.try_async_powerloadadmin = function() {
  188. var objects = [];
  189. // api_conversation.pageMenuByCode("system_menus").then(function(response) {
  190. api_user_data.getMenu({}).then(function(response) {
  191. if (response.status == 200) {
  192. var data = response.data;
  193. var objects = [];
  194. for (var i = 0; i < data.length; i++) {
  195. var object = {};
  196. object.id = data[i].id;
  197. if (data[i].parent && data[i].parent.id != 0) {
  198. object.parent = data[i].parent.id;
  199. }
  200. angular.extend(object, data[i]);
  201. object.label = object.title;
  202. objects.push(object);
  203. }
  204. $scope.tile = objects;
  205. $scope.my_power = convertParentToChildList(objects);
  206. $scope.tree_power = angular.copy($scope.my_power);
  207. if ($scope.tree_power.length > 0) {
  208. $scope.doing_asyncpower = false;
  209. }
  210. } else {
  211. SweetAlert.swal({
  212. title: "系统错误!",
  213. text: "请刷新重试!",
  214. type: "error"
  215. });
  216. }
  217. });
  218. };
  219. //点击角色
  220. $scope.role = {};
  221. $scope.change = true;
  222. $scope.my_tree_handler = function(branch) {
  223. $scope.role = branch;
  224. for (var i = 0; i < $scope.roledetail.length; i++) {
  225. if ($scope.role.model == $scope.roledetail[i].name) {
  226. $scope.role.model = { 'id': $scope.roledetail[i].id, 'name': $scope.roledetail[i].name }
  227. }
  228. }
  229. $scope.formlist = branch.dashboard;;
  230. dashboardaborad($scope.role);
  231. $scope.try_async_powerload(branch);
  232. $scope.change = false;
  233. }
  234. if (loginUser.id == 1) {
  235. $scope.try_async_powerloadadmin();
  236. } else {
  237. $scope.try_async_powerloadlow();
  238. }
  239. // $scope.try_async_powerloadadmin();
  240. // console.log(loginUser);
  241. //start remove
  242. $scope.getbranchs = {};
  243. $scope.formbranch = function(branchData) {
  244. $scope.getbranchs = branchData;
  245. }
  246. //change right
  247. //修改权限
  248. $scope.changeData = function() {
  249. var menu = [];
  250. $rootScope.isMask = true;
  251. angular.forEach($scope.getbranchs, function(it) {
  252. menu.push({ "id": it.id });
  253. })
  254. var branch = { 'menu': menu };
  255. angular.extend(branch, { 'id': $scope.role.id, 'role': $scope.role.role, 'rolecode': $scope.role.rolecode, 'roletype': $scope.role.roletype, 'dashboard': $scope.role.dashboard })
  256. // var modelData = {role: branch};
  257. api_user_data.addData('role', { 'role': branch }).then(function(response) {
  258. if (response && response.status == 200) {
  259. SweetAlert.swal({
  260. title: "提交成功!",
  261. type: "success",
  262. confirmButtonColor: "#007AFF"
  263. }, function() {
  264. $rootScope.isMask = false;
  265. $scope.try_async_load();
  266. });
  267. } else {
  268. SweetAlert.swal({
  269. title: "系统错误",
  270. text: "系统错误,请稍后重试!",
  271. type: "error",
  272. confirmButtonColor: "#DD6B55"
  273. }, function() {
  274. $rootScope.isMask = false;
  275. });
  276. }
  277. })
  278. // $state.go('app.system.form',{formKey:'system_add_menu', service:'api_configure_data', model : JSON.stringify(modelData)});
  279. }
  280. //新增角色
  281. // $scope.addData = function() {
  282. // $state.go('app.system.form', { formKey: 'system_add_menu', service: 'api_configure_data' });
  283. // }
  284. //change menu
  285. // $scope.choiceMenu = [];
  286. // $scope.showHandler = function(branch) {
  287. // $scope.choiceMenu = branch;
  288. // }
  289. // $scope.changeMenu = function() {
  290. // // if ($scope.choiceMenu && $scope.choiceMenu != null) {
  291. // // }
  292. // api_configure_data.fetchDataById('menu', $scope.choiceMenu.id).then(function(response) {
  293. // if (response.status == 200) {
  294. // if (response.data.link != null) {
  295. // response.data.type = "link";
  296. // } else if (response.data.service) {
  297. // response.data.type = "service";
  298. // } else if (response.data.event) {
  299. // response.data.type = "event";
  300. // }
  301. // response.data['menu'] = { parent: response.data.parent };
  302. // var modelData = { model: response.data }
  303. // $state.go('app.system.form', { formKey: 'system_add_menu', service: 'api_configure_data', model: JSON.stringify(modelData) });
  304. // }
  305. // })
  306. // }
  307. //remove menu
  308. $scope.removeData = function() {
  309. var modalInstance = $modal.open({
  310. templateUrl: 'assets/views/delete.html',
  311. controller: function($scope, scope, $modalInstance) {
  312. $scope.rmvList = [];
  313. angular.forEach(scope.getbranchs, function(item) {
  314. $scope.rmvList.push(item.id);
  315. })
  316. $scope.ok = function() {
  317. $modalInstance.close($scope.rmvList);
  318. };
  319. $scope.cancel = function() {
  320. $modalInstance.dismiss('cancel');
  321. };
  322. },
  323. size: 'sm',
  324. resolve: {
  325. scope: function() {
  326. return $scope;
  327. }
  328. }
  329. });
  330. modalInstance.result.then(function(selectedItem) {
  331. if (selectedItem) {
  332. if (selectedItem.length > 0) {
  333. api_configure_data.rmvData('menu', selectedItem).then(function(response) {
  334. if (response.data) {
  335. SweetAlert.swal({
  336. title: "删除成功!",
  337. type: "success",
  338. confirmButtonColor: "#007AFF"
  339. }, function() {
  340. if (loginUser.id == 1) {
  341. $scope.try_async_powerloadadmin();
  342. } else {
  343. $scope.try_async_powerload();
  344. }
  345. });
  346. } else {
  347. SweetAlert.swal({
  348. title: "操作异常!",
  349. text: "系统异常,请稍后重试,或者联系管理员!",
  350. type: "error"
  351. });
  352. }
  353. })
  354. }
  355. }
  356. })
  357. }
  358. //add role
  359. $scope.addRole = function() {
  360. var modalInstance = $modal.open({
  361. templateUrl: 'assets/views/system/tpl/addpower.html',
  362. controller: function($scope, scope, $modalInstance, api_user_data) {
  363. $scope.roledetail = [{ 'id': 1, 'name': '事件流程' }, { 'id': 2, 'name': '问题流程' }, { 'id': 3, 'name': '变更流程' }, { 'id': 4, 'name': '发布流程' }, { 'id': 5, 'name': '知识库模块' }, { 'id': 6, 'name': '资产模块' }, { 'id': 7, 'name': '系统管理模块' }]
  364. $scope.cancel = function() {
  365. $modalInstance.dismiss('cancel');
  366. };
  367. $scope.ok = function(role) {
  368. if (role.role) {
  369. var roledisable = false;
  370. for (var i = 0; i < scope.my_data.length; i++) {
  371. if (scope.my_data[i].role == role.role) {
  372. roledisable = true;
  373. break;
  374. }
  375. }
  376. if (!roledisable) {
  377. angular.extend(role, { 'roletype': '0' });
  378. if (role.model) {
  379. role.model = role.model.name;
  380. }
  381. var fildata = { loginUser: loginUser, role };
  382. $modalInstance.close(fildata);
  383. } else {
  384. SweetAlert.swal({
  385. title: "新增失败!",
  386. text: "该角色已存在",
  387. type: "error"
  388. })
  389. }
  390. } else {
  391. SweetAlert.swal({
  392. title: "新增失败!",
  393. text: "请填写角色名",
  394. type: "error"
  395. })
  396. }
  397. }
  398. },
  399. resolve: {
  400. scope: function() {
  401. return $scope;
  402. }
  403. }
  404. });
  405. modalInstance.result.then(function(selectedItem) {
  406. if (selectedItem) {
  407. api_user_data.addData('role', selectedItem).then(function(response) {
  408. if (response) {
  409. if (response.status == 200) {
  410. SweetAlert.swal({
  411. title: "新增成功!",
  412. type: "success"
  413. }, function() {
  414. $scope.try_async_load();
  415. })
  416. } else {
  417. SweetAlert.swal({
  418. title: "新增失败!",
  419. type: "error"
  420. })
  421. }
  422. // $modalInstance.close();
  423. }
  424. })
  425. }
  426. })
  427. }
  428. // $scope.addRole = function(role) {
  429. // // $scope.roledetail = [{ 'id': 1, 'name': '事件流程' }, { 'id': 2, 'name': '问题流程' }, { 'id': 3, 'name': '变更流程' }]
  430. // angular.extend(role, { 'roletype': '0' });
  431. // if (role.model) {
  432. // role.model = role.model.name;
  433. // }
  434. // var fildata = { loginUser: loginUser, role };
  435. // // var fildata = { loginUser: loginUser, 'role': { 'id': $scope.role.id, 'role': $scope.role.role, 'roletype': $scope.role.roletype, 'model': model, 'remark': $scope.role.remark } };
  436. // api_user_data.addData('role', fildata).then(function(response) {
  437. // if (response) {
  438. // if (response.status == 200) {
  439. // SweetAlert.swal({
  440. // title: "新增成功!",
  441. // type: "success"
  442. // }, function() {
  443. // $scope.try_async_load();
  444. // // $scope.refreshData('expand-right', defaultFilterData);
  445. // })
  446. // } else {
  447. // SweetAlert.swal({
  448. // title: "新增失败!",
  449. // type: "error"
  450. // })
  451. // }
  452. // // $modalInstance.close();
  453. // }
  454. // })
  455. // }
  456. //角色详情
  457. $scope.roledetail = [{ 'id': 1, 'name': '事件流程' }, { 'id': 2, 'name': '问题流程' }, { 'id': 3, 'name': '变更流程' }]
  458. //change role
  459. $scope.changerole = function(role) {
  460. var model = "";
  461. if ($scope.role.model) {
  462. model = $scope.role.model.name
  463. }
  464. var fildata = { loginUser: loginUser, 'role': { 'id': $scope.role.id, 'role': $scope.role.role, 'roletype': $scope.role.roletype, 'model': model, 'remark': $scope.role.remark } };
  465. api_user_data.addData('role', fildata).then(function(response) {
  466. if (response) {
  467. if (response.status == 200) {
  468. SweetAlert.swal({
  469. title: "修改成功!",
  470. type: "success"
  471. }, function() {
  472. $scope.try_async_load();
  473. // $scope.refreshData('expand-right', defaultFilterData);
  474. })
  475. } else {
  476. SweetAlert.swal({
  477. title: "修改失败!",
  478. type: "error"
  479. })
  480. }
  481. // $modalInstance.close();
  482. }
  483. })
  484. }
  485. // })
  486. // }
  487. //change role
  488. $scope.changeRole = function() {
  489. var modalInstance = $modal.open({
  490. templateUrl: 'assets/views/system/tpl/addpower.html',
  491. controller: function($scope, scope, $modalInstance, api_user_data) {
  492. $scope.role = scope.role;
  493. $scope.cancel = function() {
  494. $modalInstance.dismiss('cancel');
  495. };
  496. $scope.ok = function(item) {
  497. var fildata = { loginUser: loginUser, 'role': { 'id': item.id, 'role': item.role, 'roletype': item.roletype } };
  498. $modalInstance.close(fildata);
  499. }
  500. },
  501. resolve: {
  502. scope: function() {
  503. return $scope;
  504. }
  505. }
  506. });
  507. modalInstance.result.then(function(selectedItem) {
  508. if (selectedItem) {
  509. api_user_data.addData('role', selectedItem).then(function(response) {
  510. if (response) {
  511. if (response.status == 200) {
  512. SweetAlert.swal({
  513. title: "修改成功!",
  514. type: "success"
  515. }, function() {
  516. $scope.try_async_load();
  517. // $scope.refreshData('expand-right', defaultFilterData);
  518. })
  519. } else {
  520. SweetAlert.swal({
  521. title: "修改失败!",
  522. type: "error"
  523. })
  524. }
  525. // $modalInstance.close();
  526. }
  527. })
  528. }
  529. })
  530. }
  531. //remove role
  532. $scope.removeRole = function() {
  533. if ($scope.role && $scope.role.roletype == 0) {
  534. var modalInstance = $modal.open({
  535. templateUrl: 'assets/views/delete.html',
  536. controller: function($scope, scope, $modalInstance) {
  537. var rmvList = [];
  538. // angular.forEach(scope.getbranchs, function(item) {
  539. // $scope.rmvList.push(item.id);
  540. // })
  541. rmvList.push(scope.role.id);
  542. $scope.ok = function() {
  543. $modalInstance.close(rmvList);
  544. };
  545. $scope.cancel = function() {
  546. $modalInstance.dismiss('cancel');
  547. };
  548. $scope.title = '角色删除';
  549. $scope.connect = '是否删除该角色'
  550. },
  551. size: 'sm',
  552. resolve: {
  553. scope: function() {
  554. return $scope;
  555. }
  556. }
  557. });
  558. modalInstance.result.then(function(selectedItem) {
  559. if (selectedItem) {
  560. if (selectedItem.length > 0) {
  561. api_user_data.rmvData('role', selectedItem).then(function(response) {
  562. if (response.data) {
  563. SweetAlert.swal({
  564. title: "删除成功!",
  565. type: "success",
  566. confirmButtonColor: "#007AFF"
  567. }, function() {
  568. $scope.try_async_load();
  569. });
  570. } else {
  571. SweetAlert.swal({
  572. title: "操作异常!",
  573. text: "系统异常,请稍后重试,或者联系管理员!",
  574. type: "error"
  575. });
  576. }
  577. })
  578. }
  579. }
  580. })
  581. } else {
  582. SweetAlert.swal({
  583. title: "操作错误!",
  584. text: "该角色不能删除!",
  585. type: "error"
  586. });
  587. }
  588. }
  589. //仪表盘
  590. //查看仪表盘权限
  591. $scope.doing_asyncdash = true;
  592. $scope.dashboard_tree = [];
  593. // $scope.try_async_dashboard = function() {
  594. // api_user_data.fetchDataList("dashboard", { "idx": 0, "sum": 1000 }).then(function(response) {
  595. // if (response.status == 200) {
  596. // var data = response.list;
  597. // var objects = [];
  598. // for (var i = 0; i < data.length; i++) {
  599. // var object = {};
  600. // object.id = data[i].id;
  601. // object.label = data[i].name;
  602. // objects.push(object);
  603. // }
  604. // $scope.dashboard_tree = objects;
  605. // $scope.dashboard_data = angular.copy($scope.dashboard_tree);
  606. // if ($scope.dashboard_data.length > 0) {
  607. // $scope.doing_asyncdash = false;
  608. // }
  609. // } else {
  610. // SweetAlert.swal({
  611. // title: "系统错误!",
  612. // text: "请刷新重试!",
  613. // type: "error"
  614. // });
  615. // }
  616. // });
  617. // }
  618. // $scope.try_async_dashboard();
  619. $scope.formlist = {};
  620. $scope.formdashboard = function(branchData) {
  621. // $scope.formlist = {};
  622. $scope.formlist = branchData;
  623. }
  624. //修改仪表盘权限
  625. // var dashboard = [];
  626. $scope.changeDashboard = function() {
  627. var firldata = {};
  628. var dashboard = [];
  629. $rootScope.isMask = true;
  630. angular.forEach($scope.formlist, function(item) {
  631. dashboard.push({ 'id': item.id, 'name': item.label });
  632. })
  633. firldata = { 'dashboard': dashboard, 'id': $scope.role.id, 'role': $scope.role.role, 'rolecode': $scope.role.rolecode, 'roletype': $scope.role.roletype, 'menu': $scope.role.menu }
  634. api_user_data.addData('role', { 'role': firldata }).then(function(response) {
  635. if (response && response.status == 200) {
  636. $scope.try_async_load();
  637. SweetAlert.swal({
  638. title: "提交成功!",
  639. type: "success",
  640. confirmButtonColor: "#007AFF"
  641. }, function() {
  642. $rootScope.isMask = false;
  643. // $scope.formlist = {}
  644. });
  645. } else {
  646. SweetAlert.swal({
  647. title: "系统错误",
  648. text: "系统错误,请稍后重试!",
  649. type: "error",
  650. confirmButtonColor: "#DD6B55"
  651. }, function() {
  652. $rootScope.isMask = false;
  653. });
  654. }
  655. })
  656. }
  657. }]);