ItemSelector.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. Ext.define('erp.view.common.DeskTop.ItemSelector', {
  2. extend: 'Ext.ux.form.MultiSelect',
  3. alias: ['widget.itemselectorfield', 'widget.itemselector'],
  4. alternateClassName: ['Ext.ux.ItemSelector'],
  5. requires: ['Ext.ux.layout.component.form.ItemSelector', 'Ext.button.Button'],
  6. hideNavIcons:false,
  7. buttons: ['add', 'remove','addAll','removeAll'],
  8. buttonsText: {
  9. add: "添加  >>",
  10. remove: "<<&nbsp;&nbsp;移除",
  11. addAll: "全部添加",
  12. removeAll: "全部移除"
  13. },
  14. componentLayout: {
  15. type:'itemselectorfield',
  16. defaultHeight:window.innerHeight*0.7
  17. },
  18. store:Ext.create('Ext.data.ArrayStore', {
  19. data: [],
  20. fields: ['id','text'],
  21. sortInfo: {
  22. field: 'value',
  23. direction: 'ASC',
  24. idProperty:'value'
  25. }
  26. }),
  27. initComponent: function(){
  28. var me = this;
  29. me.bindStore(me.store, true);
  30. if (me.store.autoCreated) {
  31. me.valueField = me.displayField = 'field1';
  32. if (!me.store.expanded) {
  33. me.displayField = 'field2';
  34. }
  35. }
  36. if (!Ext.isDefined(me.valueField)) {
  37. me.valueField = me.displayField;
  38. }
  39. me.callParent();
  40. },
  41. multiselects: [],
  42. bindStore: function(store, initial) {
  43. var me = this,
  44. toField = me.toField,
  45. fromField = me.fromField,
  46. models;
  47. me.callParent(arguments);
  48. if (toField) {
  49. // Clear both field stores
  50. toField.store.removeAll();
  51. fromField.store.removeAll();
  52. models = [];
  53. me.store.each(function(model) {
  54. models.push(model.copy(model.getId()));
  55. });
  56. fromField.store.add(models);
  57. }
  58. },
  59. onRender: function(ct, position) {
  60. var me = this,
  61. baseCSSPrefix = Ext.baseCSSPrefix,
  62. ddGroup = 'ItemSelectorDD-' + Ext.id(),
  63. commonConfig = {
  64. displayField: me.displayField,
  65. valueField: me.valueField,
  66. dragGroup: ddGroup,
  67. dropGroup: ddGroup,
  68. flex: 1,
  69. hideLabel: false,
  70. disabled: me.disabled
  71. },
  72. fromConfig = Ext.apply({
  73. height:window.innerHeight*0.7,
  74. store: Ext.create('Ext.data.Store', {model: me.store.model}),
  75. listeners: {
  76. boundList: {
  77. itemdblclick: me.onItemDblClick,
  78. beforedrop:function( node, data, overModel, dropPosition, dropFunction, eOpts){
  79. var bool=data.records[0].data.remove;
  80. if(!bool){return false;}
  81. },
  82. scope: me
  83. }
  84. }
  85. }, me.multiselects[0], commonConfig),
  86. toConfig = Ext.apply({
  87. height:window.innerHeight*0.7,
  88. store: Ext.create('Ext.data.Store', {model: me.store.model}),
  89. listeners: {
  90. boundList: {
  91. itemdblclick: me.onItemDblClick,
  92. scope: me
  93. },
  94. change: me.onToFieldChange,
  95. scope: me
  96. }
  97. }, me.multiselects[1], commonConfig),
  98. fromField = Ext.widget('multiselect', fromConfig),
  99. toField = Ext.widget('multiselect', toConfig),
  100. innerCt,
  101. buttons = [];
  102. Ext.ux.form.MultiSelect.superclass.onRender.call(me, ct, position);
  103. me.fromField = fromField;
  104. me.toField = toField;
  105. if (!me.hideNavIcons) {
  106. Ext.Array.forEach(me.buttons, function(name) {
  107. buttons.push({
  108. xtype: 'button',
  109. tooltip: me.buttonsText[name],
  110. handler: me['on' + Ext.String.capitalize(name) + 'BtnClick'],
  111. text:me.buttonsText[name],
  112. cls:'button1 pill',
  113. scope: me
  114. });
  115. buttons.push({xtype: 'component', height: 3, width: 1, style: 'font-size:0;line-height:0'});
  116. });
  117. }
  118. innerCt = me.innerCt = Ext.widget('container', {
  119. renderTo: me.bodyEl,
  120. layout: {
  121. type: 'hbox',
  122. align: 'middle'
  123. },
  124. items: [
  125. me.fromField,
  126. {
  127. xtype: 'container',
  128. margins: '0 10',
  129. items: buttons
  130. },
  131. me.toField
  132. ]
  133. });
  134. innerCt.ownerCt = me;
  135. me.bindStore(me.store);
  136. me.setRawValue(me.rawValue);
  137. },
  138. onToFieldChange: function() {
  139. this.checkChange();
  140. },
  141. getSelections: function(list){
  142. var store = list.getStore(),
  143. selections = list.getSelectionModel().getSelection(),
  144. i = 0,
  145. len = selections.length;
  146. return Ext.Array.sort(selections, function(a, b){
  147. a = store.indexOf(a);
  148. b = store.indexOf(b);
  149. if (a < b) {
  150. return -1;
  151. } else if (a > b) {
  152. return 1;
  153. }
  154. return 0;
  155. });
  156. },
  157. onAddBtnClick : function() {//添加
  158. var me = this,
  159. fromList = me.fromField.boundList,
  160. selected = this.getSelections(fromList),needto=new Object(),addArr=new Array();
  161. var toStore=this.toField.boundList.getStore();
  162. Ext.Array.each(toStore.data.items,function(item){
  163. needto[item.data.id]=item.data;
  164. });
  165. Ext.Array.each(selected,function(item){
  166. needto[item.data.id]=item.data;
  167. });
  168. var keys=Ext.Object.getKeys(needto);
  169. Ext.each(keys, function(k){
  170. addArr.push(needto[k]);
  171. });
  172. fromList.getStore().remove(selected);
  173. this.toField.boundList.getStore().loadData(addArr);
  174. },
  175. onAddAllBtnClick : function() {//全部添加
  176. var me = this,
  177. fromList = me.fromField.boundList,
  178. toValues=this.toField.boundList.getStore().data,
  179. needto=new Object(),
  180. addArr=new Array();
  181. var toStore=this.toField.boundList.getStore();
  182. Ext.Array.each(toStore.data.items,function(item){
  183. needto[item.data.id]=item.data;
  184. });
  185. Ext.Array.each(fromList.getStore().data.items,function(item){
  186. needto[item.data.id]=item.data;
  187. });
  188. var keys=Ext.Object.getKeys(needto);
  189. Ext.each(keys, function(k){
  190. addArr.push(needto[k]);
  191. });
  192. this.toField.boundList.getStore().loadData(addArr);
  193. fromList.getStore().removeAll();
  194. },
  195. onRemoveBtnClick : function() {//移除
  196. var me = this,
  197. toList = me.toField.boundList,
  198. selected = this.getSelections(toList);
  199. if(selected.length>0){
  200. for(var i=0;i<selected.length;i++){
  201. if(selected[i].data.remove){
  202. toList.getStore().remove(selected[i]);
  203. me.fromField.boundList.getStore().add(selected[i]);
  204. }
  205. }
  206. }
  207. },
  208. onRemoveAllBtnClick : function() {//全部移除
  209. var me = this,
  210. toList = me.toField.boundList;
  211. var data_r=new Array();
  212. Ext.Array.each(toList.getStore().data.items,function(item){
  213. if(item.data.remove){
  214. data_r.push(item);
  215. }
  216. });
  217. me.fromField.boundList.getStore().add(data_r);
  218. toList.getStore().remove(data_r);
  219. },
  220. onItemDblClick : function(view) {
  221. var me = this;
  222. if (view == me.toField.boundList){
  223. me.onRemoveBtnClick();
  224. }
  225. else if (view == me.fromField.boundList) {
  226. me.onAddBtnClick();
  227. }
  228. },
  229. setRawValue: function(value) {
  230. var me = this,
  231. Array = Ext.Array,
  232. toStore, fromStore, models;
  233. value = Array.from(value);
  234. me.rawValue = value;
  235. if (me.toField) {
  236. toStore = me.toField.boundList.getStore();
  237. fromStore = me.fromField.boundList.getStore();
  238. // Move any selected values back to the fromField
  239. fromStore.add(toStore.getRange());
  240. toStore.removeAll();
  241. // Move the new values over to the toField
  242. models = [];
  243. Ext.Array.forEach(value, function(val) {
  244. var undef,
  245. model = fromStore.findRecord(me.valueField, val, undef, undef, true, true);
  246. if (model) {
  247. models.push(model);
  248. }
  249. });
  250. fromStore.remove(models);
  251. toStore.add(models);
  252. }
  253. return value;
  254. },
  255. getRawValue: function() {
  256. var me = this,
  257. toField = me.toField,
  258. rawValue = me.rawValue;
  259. if (toField) {
  260. rawValue = Ext.Array.map(toField.boundList.getStore().getRange(), function(model) {
  261. return model.get(me.valueField);
  262. });
  263. }
  264. me.rawValue = rawValue;
  265. return rawValue;
  266. },
  267. /**
  268. * @private Cascade readOnly/disabled state to the sub-fields and buttons
  269. */
  270. updateReadOnly: function() {
  271. var me = this,
  272. readOnly = me.readOnly || me.disabled;
  273. if (me.rendered) {
  274. me.toField.setReadOnly(readOnly);
  275. me.fromField.setReadOnly(readOnly);
  276. Ext.Array.forEach(me.innerCt.query('button'), function(button) {
  277. button.setDisabled(readOnly);
  278. });
  279. }
  280. },
  281. onDisable: function(){
  282. this.callParent();
  283. var fromField = this.fromField;
  284. // if we have one, we have both, they get created at the same time
  285. if (fromField) {
  286. fromField.disable();
  287. this.toField.disable();
  288. }
  289. },
  290. onEnable: function(){
  291. this.callParent();
  292. var fromField = this.fromField;
  293. // if we have one, we have both, they get created at the same time
  294. if (fromField) {
  295. fromField.enable();
  296. this.toField.enable();
  297. }
  298. },
  299. onDestroy: function() {
  300. Ext.destroyMembers(this, 'innerCt');
  301. this.callParent();
  302. },
  303. getModelData:function(){
  304. var me = this,
  305. toField = me.toField,arr=new Array();
  306. if (toField) {
  307. rawValue = Ext.Array.map(toField.boundList.getStore().getRange(), function(model) {
  308. arr.push(Ext.JSON.encode(model.data));
  309. });
  310. }
  311. return arr;
  312. }
  313. });