DbfindButton.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. Ext.define('erp.view.core.button.DbfindButton',{
  2. extend: 'Ext.Button',
  3. alias: 'widget.erpDbfindButton',
  4. //id: 'dbfind',
  5. text: 'DBfind设置',
  6. cls: 'x-btn-blue',
  7. iconCls: 'x-button-icon-query',
  8. hidden: false,
  9. disabled:true,
  10. style: {
  11. marginLeft: '10px'
  12. },
  13. width: 120,
  14. initComponent : function(){
  15. this.callParent(arguments);
  16. },
  17. dbfindSetUI: function(caller, field){
  18. var me=this;
  19. var formData=null,gridData=null,findData=null;
  20. var arr=new Array();
  21. Ext.Array.each(Ext.getCmp('grid').data,function(item){
  22. var obj=new Object();
  23. //obj.display=item.fd_caption;
  24. obj.display=item.fd_field;
  25. obj.value=item.fd_field;
  26. arr.push(obj);
  27. });
  28. var localJson=me.getDbFindSetUI(caller,field);
  29. if(localJson!=null||localJson.griddata!=null){
  30. gridData=localJson.griddata;
  31. formData=localJson.formdata;
  32. findData=localJson.fields;
  33. }else {
  34. gridData=new Array();
  35. for(var i=0;i<10;i++){
  36. var o = new Object();
  37. gridData.push(o);
  38. }
  39. }
  40. function showButton(value,cellmeta){
  41. var returnStr = "<INPUT align='center' type='button' value='删除' onclick='Delete();'>";
  42. return returnStr;
  43. };
  44. Ext.create('Ext.Window', {
  45. width: '90%',
  46. height: '100%',
  47. autoShow: true,
  48. layout: 'border',
  49. title:'<h1>Form查找配置</h1>',
  50. items: [{
  51. region:'north',
  52. xtype: 'form',
  53. id:'dbform',
  54. layout: 'column',
  55. autoScroll:true,
  56. buttonAlign:'center',
  57. bodyStyle: 'background:#f1f1f1;',
  58. fieldDefaults: {
  59. labelWidth: 70,
  60. fieldStyle:'background:#FFFAFA;color:#515151;'
  61. },
  62. items: [{
  63. xtype: 'textfield',
  64. fieldLabel: '描述',
  65. id:'ds_caption',
  66. name: 'ds_caption',
  67. columnWidth: 0.25
  68. },{
  69. xtype: 'textfield',
  70. fieldLabel: '关联表名',
  71. name: 'ds_whichdbfind',
  72. id:'ds_whichdbfind',
  73. allowBlank:false,
  74. fieldStyle:'background:#fffac0;color:#515151;',
  75. columnWidth: 0.5,
  76. },{
  77. xtype: 'dbfindtrigger',
  78. fieldLabel: '关联字段',
  79. name: 'ds_likefield',
  80. allowBlank:false,
  81. fieldStyle:'background:#fffac0;color:#515151;',
  82. columnWidth: 0.25,
  83. dbKey:'ds_whichdbfind',
  84. mappingKey:'ddd_tablename',
  85. dbMessage:'请选择该字段所属表名',
  86. },{
  87. xtype:'multidbfindtrigger',
  88. fieldLabel:'所需表',
  89. name: 'ds_tables',
  90. id:'ds_tables',
  91. allowBlank:false,
  92. fieldStyle:'background:#fffac0;color:#515151;',
  93. columnWidth: 0.5,
  94. listeners:{
  95. change:function(){
  96. Ext.getCmp('submitchange').setDisabled(false);
  97. }
  98. }
  99. },{
  100. xtype: 'textfield',
  101. fieldLabel: '条件',
  102. name: 'ds_uifixedcondition',
  103. columnWidth: 0.5
  104. },{
  105. xtype:'hidden',
  106. name:'ds_id'
  107. },{
  108. xtype:'hidden',
  109. name:'ds_caller'
  110. },{
  111. xtype:'hidden',
  112. name:'ds_whichui'
  113. }],
  114. buttons:[{
  115. xtype:'button',
  116. text: '确认',
  117. id:'submitchange',
  118. iconCls: 'x-button-icon-submit',
  119. cls: 'x-btn-gray',
  120. width: 60,
  121. disabled:true,
  122. handler:function(btn){
  123. var newValue=Ext.getCmp('ds_tables').value;
  124. Ext.Ajax.request({
  125. url : basePath +'common/getDbFindFields.action',
  126. params: {
  127. table:newValue,
  128. },
  129. async: false,
  130. method : 'post',
  131. callback : function(options,success,response){
  132. var res = new Ext.decode(response.responseText);
  133. if(res.exceptionInfo != null){
  134. showError(res.exceptionInfo);return;
  135. }
  136. if(res.success){
  137. findData=Ext.decode(res.findfields);
  138. }
  139. }
  140. });
  141. }
  142. },{
  143. xtype:'button',
  144. text: $I18N.common.button.erpSaveButton,
  145. iconCls: 'x-button-icon-save',
  146. cls: 'x-btn-gray',
  147. formBind: true,//form.isValid() == false时,按钮disabled
  148. width: 60,
  149. style: {
  150. marginLeft: '10px'
  151. },
  152. handler:function(){
  153. me.save(me,caller,field);
  154. }
  155. },{
  156. xtype:'button',
  157. text: $I18N.common.button.erpCloseButton,
  158. iconCls: 'x-button-icon-close',
  159. cls: 'x-btn-gray',
  160. width: 60,
  161. style: {
  162. marginLeft: '10px'
  163. },
  164. handler:function(btn){
  165. btn.ownerCt.ownerCt.ownerCt.close();
  166. }
  167. }]
  168. },{
  169. region:'center',
  170. xtype: 'grid',
  171. id:'dbgrid',
  172. columnLines:true,
  173. store:Ext.create('Ext.data.Store',{
  174. fields:['ds_findtoui_f','ds_findtoui_i','ds_dbcaption',{name:'ds_dbwidth',type:'float'}]
  175. }),
  176. emptyText : $I18N.common.grid.emptyText,
  177. bodyStyle: 'background-color:#f1f1f1;',
  178. plugins: Ext.create('Ext.grid.plugin.CellEditing', {
  179. clicksToEdit: 1
  180. }),
  181. listeners:{
  182. itemclick:function(selModel, record,e,index){
  183. var grid=selModel.ownerCt;
  184. if(index.toString() == 'NaN'){
  185. index = '';
  186. }
  187. if(index == grid.store.data.items.length-1){//如果选择了最后一行
  188. var items=grid.store.data.items;
  189. for(var i=0;i<10;i++){
  190. var o = new Object();
  191. grid.store.insert(items.length, o);
  192. items[items.length-1]['index'] = items.length-1;
  193. }
  194. }
  195. }
  196. },
  197. columns: [{
  198. cls : "x-grid-header-1",
  199. text: '取值字段',
  200. xtype: 'combocolumn',
  201. dataIndex: 'ds_findtoui_f',
  202. renderer: function(val, meta, record){
  203. if(!val){
  204. val="";
  205. }
  206. return '<img src="' + basePath + 'resource/images/icon/need.png" title="必填字段">' +
  207. '<span style="color:blue;padding-left:2px;" title="必填字段">' + val + '</span>';
  208. },
  209. flex: 1,
  210. format:"",
  211. editor: {
  212. format:'',
  213. xtype: 'combo',
  214. listConfig:{
  215. maxHeight:180
  216. },
  217. store: {
  218. fields: ['display', 'value'],
  219. data :[],
  220. },
  221. displayField: 'display',
  222. valueField: 'value',
  223. queryMode: 'local',
  224. onTriggerClick:function(trigger){
  225. var me=this;
  226. this.getStore().loadData(findData);
  227. if (!me.readOnly && !me.disabled) {
  228. if (me.isExpanded) {
  229. me.collapse();
  230. } else {
  231. me.expand();
  232. }
  233. me.inputEl.focus();
  234. }
  235. }
  236. }
  237. },{
  238. cls : "x-grid-header-1",
  239. text: '赋值字段',
  240. xtype: 'combocolumn',
  241. dataIndex: 'ds_findtoui_i',
  242. flex: 1,
  243. renderer: function(val, meta, record){
  244. return val;
  245. },
  246. editor: {
  247. format:"",
  248. xtype: 'combo',
  249. listConfig:{
  250. maxHeight:180
  251. },
  252. store: {
  253. fields: ['display', 'value'],
  254. data:arr
  255. },
  256. displayField: 'display',
  257. valueField: 'value',
  258. queryMode: 'local',
  259. }
  260. },{
  261. cls : "x-grid-header-1",
  262. text: '描述',
  263. dataIndex: 'ds_dbcaption',
  264. flex: 1,
  265. editor:{
  266. xtype:'textfield',
  267. format:""
  268. },
  269. },{
  270. cls : "x-grid-header-1",
  271. text: '列宽',
  272. dataIndex: 'ds_dbwidth',
  273. //format: '0',
  274. flex:1,
  275. editor: {
  276. xtype: 'textfield',
  277. ///format: '0'
  278. }
  279. },{
  280. cls : "x-grid-header-1",
  281. text:'操作',
  282. dataIndex: 'button',
  283. flex:0.5,
  284. renderer:showButton,
  285. }]
  286. }]
  287. });
  288. Ext.getCmp('dbform').getForm().setValues(formData);
  289. Ext.getCmp('dbgrid').getStore().loadData(gridData);
  290. },
  291. dbfindSetGrid:function(caller,grid,field){
  292. var FindFields=new Array(),me=this,SetFields=new Array(),gridData=new Array(),DBCaller=null,DBKey=null;
  293. var me=this;
  294. function showButton(value,cellmeta){
  295. var returnStr = "<INPUT align='center' type='button' value='删除' onclick='DeleteGrid();'>";
  296. return returnStr;
  297. };
  298. var localJson=me.getDBGridFields(caller,field);
  299. if(localJson==null||!localJson.data){
  300. //说明无数据
  301. for(var i=0;i<10;i++){
  302. var o = new Object();
  303. o.ds_caller=caller;
  304. gridData.push(o);
  305. }Ext.Array.each(grid.data,function(item){
  306. var obj=new Object();
  307. obj.display=item.dg_caption;
  308. obj.value=item.dg_field;
  309. SetFields.push(obj);
  310. });
  311. }else {
  312. DBCaller=localJson.data.dbcaller;
  313. DBKey=localJson.data.linkkey;
  314. Ext.Array.each(localJson.data.details,function(field){
  315. var o=new Object();
  316. o.display=field.dd_fieldcaption;
  317. o.value=field.dd_fieldname;
  318. FindFields.push(o);
  319. });
  320. Ext.Array.each(grid.data,function(item){
  321. var obj=new Object();
  322. obj.display=item.dg_caption;
  323. obj.value=item.dg_field;
  324. SetFields.push(obj);
  325. });
  326. gridData=localJson.data.dbfindsetgrid;
  327. }
  328. Ext.create('Ext.Window', {
  329. width: '90%',
  330. height: '100%',
  331. autoShow: true,
  332. layout: 'border',
  333. title:'<h1>Grid查找配置</h1>',
  334. items: [{
  335. region:'center',
  336. xtype: 'grid',
  337. id:'dbGridgrid',
  338. columnLines:true,
  339. store:Ext.create('Ext.data.Store',{
  340. fields:['ds_id','ds_caller','ds_gridfield','ds_dbfindfield']
  341. }),
  342. emptyText : $I18N.common.grid.emptyText,
  343. bodyStyle: 'background-color:#f1f1f1;',
  344. plugins: Ext.create('Ext.grid.plugin.CellEditing', {
  345. clicksToEdit: 1
  346. }),
  347. tbar:[{
  348. xtype:'button',
  349. text: $I18N.common.button.erpSaveButton,
  350. iconCls: 'x-button-icon-save',
  351. cls: 'x-btn-gray',
  352. formBind: true,//form.isValid() == false时,按钮disabled
  353. width: 60,
  354. style: {
  355. margin: '10 5 0 5'
  356. },
  357. handler:function(btn){
  358. me.saveDBFindSetGrid(btn,caller,field);
  359. }
  360. },'-',{
  361. xtype:'button',
  362. text: $I18N.common.button.erpCloseButton,
  363. iconCls: 'x-button-icon-close',
  364. cls: 'x-btn-gray',
  365. formBind: true,//form.isValid() == false时,按钮disabled
  366. width: 60,
  367. handler:function(btn){
  368. btn.ownerCt.ownerCt.ownerCt.close();
  369. }
  370. },'-',{
  371. xtype:'button',
  372. text: '维护DBFindSet',
  373. iconCls: 'x-button-icon-submit',
  374. cls: 'x-btn-gray',
  375. width: 120,
  376. handler:function(btn){
  377. var value=btn.ownerCt.items.items[6].lastValue;
  378. if(value){
  379. openGridUrl(value,"ds_caller", "dd_caller", "jsps/ma/dbFindSet.jsp", "DBFind维护");
  380. }
  381. }
  382. },'-',{
  383. xtype:'dbfindtrigger',
  384. fieldLabel:'<h3>DBFindSetCaller</h3>',
  385. labelWidth:110,
  386. labelSeparator:"",
  387. name:'dbcaller',
  388. id:'dbcaller',
  389. allowBlank:false,
  390. value:DBCaller,
  391. fieldStyle:'background:#fffac0;color:#515151;',
  392. listeners:{
  393. change:function(field,newValue){
  394. Ext.getCmp('commitchange').setDisabled(false);
  395. },
  396. blur:function(){
  397. }
  398. }
  399. },{
  400. xtype:'hidden',
  401. name:'dbtable',
  402. id:'dbtablename',
  403. listeners:{
  404. change:function(field,newValue){
  405. var link=Ext.getCmp('linkkey');
  406. link.dbBaseCondition="ddd_tablename='"+newValue.toUpperCase()+"'";
  407. link.setDisabled(false);
  408. Ext.getCmp('linkkey').setValue(null);
  409. }
  410. }
  411. },{
  412. xtype:'dbfindtrigger',
  413. labelAlign:'right',
  414. fieldLabel:'<h3>关联字段名</h3>',
  415. labelWidth:80,
  416. labelSeparator:"",
  417. name:'linkkey',
  418. id:'linkkey',
  419. value:DBKey,
  420. disabled:true,
  421. allowBlank:false,
  422. fieldStyle:'background:#fffac0;color:#515151;',
  423. listeners:{
  424. afterrender:function(field){
  425. if(field.value){
  426. field.setDisabled(false);
  427. }
  428. }
  429. }
  430. },'-',{
  431. xtype:'button',
  432. text: '确认',
  433. id:'commitchange',
  434. iconCls: 'x-button-icon-submit',
  435. cls: 'x-btn-gray',
  436. width: 60,
  437. disabled:true,
  438. handler:function(btn){
  439. var field=Ext.getCmp('dbcaller');
  440. var table=Ext.getCmp('dbtablename').value;
  441. if(field.originalValue==field.value||table==undefined){
  442. Ext.Msg.alert('提示','未作修改!');
  443. btn.setDisabled(true);
  444. return;
  445. }else{
  446. //更改下拉store 同时 reset 关联字段
  447. var json=me.getDBGridFields(field.value,null);
  448. Ext.Array.each(json.data.details,function(field){
  449. var o=new Object();
  450. FindFields=new Array();
  451. o.display=field.dd_fieldcaption;
  452. o.value=field.dd_fieldname;
  453. FindFields.push(o);
  454. });
  455. }
  456. }
  457. }],
  458. listeners:{
  459. itemclick:function(selModel, record,e,index){
  460. var grid=selModel.ownerCt;
  461. if(index.toString() == 'NaN'){
  462. index = '';
  463. }
  464. if(index == grid.store.data.items.length-1){//如果选择了最后一行
  465. var items=grid.store.data.items;
  466. for(var i=0;i<10;i++){
  467. var o = new Object();
  468. o.ds_caller=caller;
  469. grid.store.insert(items.length, o);
  470. items[items.length-1]['index'] = items.length-1;
  471. }
  472. }
  473. }
  474. },
  475. columns: [{
  476. text: 'ID',
  477. dataIndex: 'ds_id',
  478. xtype:'numbercolumn',
  479. width:0,
  480. },{
  481. cls : "x-grid-header-1",
  482. text: 'Caller',
  483. dataIndex: 'ds_caller',
  484. flex:1,
  485. readOnly:true
  486. },{
  487. cls : "x-grid-header-1",
  488. text:'Grid赋值字段',
  489. dataIndex: 'ds_gridfield',
  490. flex:1,
  491. renderer: function(val, meta, record){
  492. if(!val){
  493. val="";
  494. }
  495. return '<img src="' + basePath + 'resource/images/icon/need.png" title="必填字段">' +
  496. '<span style="color:blue;padding-left:2px;" title="必填字段">' + val + '</span>';
  497. },
  498. editor: {
  499. format:"",
  500. xtype: 'combobox',
  501. listConfig:{
  502. maxHeight:180
  503. },
  504. typeAhead: true,
  505. triggerAction: 'all',
  506. selectOnTab: true,
  507. store: {
  508. fields: ['display', 'value'],
  509. data:SetFields,
  510. },
  511. displayField: 'display',
  512. valueField: 'value',
  513. queryMode: 'local',
  514. }
  515. },{
  516. cls : "x-grid-header-1",
  517. text:'查找字段',
  518. dataIndex: 'ds_dbfindfield',
  519. flex:1,
  520. renderer: function(val, meta, record){
  521. if(!val){
  522. val="";
  523. }
  524. return '<img src="' + basePath + 'resource/images/icon/need.png" title="必填字段">' +
  525. '<span style="color:blue;padding-left:2px;" title="必填字段">' + val + '</span>';
  526. },
  527. editor: {
  528. format:"",
  529. xtype: 'combo',
  530. listConfig:{
  531. maxHeight:180
  532. },
  533. store: {
  534. fields: ['display', 'value'],
  535. data:[],
  536. },
  537. onTriggerClick:function(trigger){
  538. var me=this;
  539. this.getStore().loadData(FindFields);
  540. if (!me.readOnly && !me.disabled) {
  541. if (me.isExpanded) {
  542. me.collapse();
  543. } else {
  544. me.expand();
  545. }
  546. me.inputEl.focus();
  547. }
  548. },
  549. displayField: 'display',
  550. valueField: 'value',
  551. queryMode: 'local',
  552. }
  553. },{
  554. cls : "x-grid-header-1",
  555. text:'操作',
  556. flex:0.5,
  557. dataIndex: 'button',
  558. renderer:showButton,
  559. }]
  560. }]
  561. });
  562. Ext.getCmp('dbGridgrid').getStore().loadData(gridData);
  563. },
  564. save:function(me,caller,field){
  565. var grid=Ext.getCmp('dbgrid');
  566. grid.necessaryField='ds_findtoui_f';
  567. var jsonGridData = new Array();
  568. var dd;
  569. var s = grid.getStore().data.items;
  570. for(var i=0;i<s.length;i++){
  571. var data = s[i].data;
  572. dd = new Object();
  573. if(data[grid.necessaryField] != null && data[grid.necessaryField] != ""){
  574. Ext.each(grid.columns, function(c){
  575. dd[c.dataIndex] = s[i].data[c.dataIndex];
  576. });
  577. jsonGridData.push(Ext.JSON.encode(dd));
  578. }
  579. }
  580. var param=jsonGridData;
  581. if(param == null || param == ''){
  582. showError($I18N.common.grid.emptyDetail);
  583. }else {
  584. var r = Ext.getCmp('dbform').getForm().getValues();
  585. var params = new Object();
  586. params.formStore = unescape(Ext.JSON.encode(r).replace(/\\/g,"%"));
  587. params.gridStore = unescape(param.toString().replace(/\\/g,"%"));
  588. Ext.Ajax.request({
  589. url : basePath + 'common/saveDbfindSetUI.action',
  590. params : params,
  591. method : 'post',
  592. callback : function(options,success,response){
  593. var res=new Ext.decode(response.responseText);
  594. if(res.exceptionInfo != null){
  595. showError(res.exceptionInfo);return;
  596. }
  597. if(res.success){
  598. Ext.Msg.alert('提示','保存成功!');
  599. var jsondata=me.getDbFindSetUI(caller,field);
  600. Ext.getCmp('dbform').getForm().setValues(jsondata.formdata);
  601. Ext.getCmp('dbgrid').getStore().loadData(jsondata.griddata);
  602. }
  603. }
  604. });
  605. }
  606. },
  607. saveDBFindSetGrid:function(btn,pagecaller,dgfield){
  608. var bar=btn.ownerCt,grid=btn.ownerCt.ownerCt;
  609. var caller=bar.items.items[6].value;
  610. var field=bar.items.items[8].value;
  611. var me=this;
  612. var jsonGridData = new Array();
  613. grid.necessaryField='ds_gridfield';
  614. var dd;
  615. var s = grid.getStore().data.items;
  616. for(var i=0;i<s.length;i++){
  617. var data = s[i].data;
  618. dd = new Object();
  619. if(s[i].dirty&&data[grid.necessaryField] != null && data[grid.necessaryField] != ""){
  620. Ext.each(grid.columns, function(c){
  621. dd[c.dataIndex] = s[i].data[c.dataIndex];
  622. });
  623. jsonGridData.push(Ext.JSON.encode(dd));
  624. }
  625. }
  626. if(jsonGridData == null || jsonGridData == '')
  627. showError($I18N.common.grid.emptyDetail);
  628. if(caller&&caller!=""&&field&&field!=""){
  629. Ext.Ajax.request({
  630. url : basePath +'common/saveDbFindSetGrid.action',
  631. params: {
  632. caller:caller,
  633. field:field,
  634. dgfield:dgfield,
  635. gridStore:jsonGridData
  636. },
  637. method : 'post',
  638. callback : function(options,success,response){
  639. var re = new Ext.decode(response.responseText);
  640. if(re.success){
  641. var json=me.getDBGridFields(pagecaller,dgfield);
  642. grid.getStore().loadData(json.data.dbfindsetgrid);
  643. Ext.Msg.alert('提示','保存成功!');
  644. }
  645. else if(re.exceptionInfo == null){
  646. showError(res.exceptionInfo);return ;
  647. }
  648. }
  649. });
  650. }
  651. },
  652. getDBGridFields:function(caller,field){
  653. var localJson=null;
  654. Ext.Ajax.request({
  655. url : basePath +'common/getDbFindSetGridFields.action',
  656. params: {
  657. caller:caller,
  658. field:field
  659. },
  660. async: false,
  661. method : 'post',
  662. callback : function(options,success,response){
  663. var re = new Ext.decode(response.responseText);
  664. if(re.exceptionInfo == null){
  665. localJson=re;
  666. }
  667. }
  668. });
  669. return localJson;
  670. },
  671. getDbFindSetUI:function(caller,field){
  672. var localJson=null;
  673. Ext.Ajax.request({
  674. url : basePath +'common/getDbFindSetUI.action',
  675. params: {
  676. caller:caller,
  677. field:field
  678. },
  679. async: false,
  680. method : 'post',
  681. callback : function(options,success,response){
  682. var res = new Ext.decode(response.responseText);
  683. if(res.exceptionInfo != null){
  684. showError(res.exceptionInfo);
  685. return;
  686. }
  687. if(res.success){
  688. localJson=res;
  689. }
  690. }
  691. });
  692. return localJson;
  693. }
  694. });