ItemSelector.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. Ext.define('erp.view.oa.doc.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: ['value','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: true,
  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. scope: me
  79. }
  80. }
  81. }, me.multiselects[0], commonConfig),
  82. toConfig = Ext.apply({
  83. height:window.innerHeight*0.7,
  84. store: Ext.create('Ext.data.Store', {model: me.store.model}),
  85. listeners: {
  86. boundList: {
  87. itemdblclick: me.onItemDblClick,
  88. scope: me
  89. },
  90. change: me.onToFieldChange,
  91. scope: me
  92. }
  93. }, me.multiselects[1], commonConfig),
  94. fromField = Ext.widget('multiselect', fromConfig),
  95. toField = Ext.widget('multiselect', toConfig),
  96. innerCt,
  97. buttons = [];
  98. Ext.ux.form.MultiSelect.superclass.onRender.call(me, ct, position);
  99. me.fromField = fromField;
  100. me.toField = toField;
  101. if (!me.hideNavIcons) {
  102. Ext.Array.forEach(me.buttons, function(name) {
  103. buttons.push({
  104. xtype: 'button',
  105. tooltip: me.buttonsText[name],
  106. handler: me['on' + Ext.String.capitalize(name) + 'BtnClick'],
  107. text:me.buttonsText[name],
  108. cls:'button1 pill',
  109. scope: me
  110. });
  111. buttons.push({xtype: 'component', height: 3, width: 1, style: 'font-size:0;line-height:0'});
  112. });
  113. }
  114. innerCt = me.innerCt = Ext.widget('container', {
  115. renderTo: me.bodyEl,
  116. layout: {
  117. type: 'hbox',
  118. align: 'middle'
  119. },
  120. items: [
  121. me.fromField,
  122. {
  123. xtype: 'container',
  124. margins: '0 10',
  125. items: buttons
  126. },
  127. me.toField
  128. ]
  129. });
  130. innerCt.ownerCt = me;
  131. me.bindStore(me.store);
  132. me.setRawValue(me.rawValue);
  133. },
  134. onToFieldChange: function() {
  135. this.checkChange();
  136. },
  137. getSelections: function(list){
  138. var store = list.getStore(),
  139. selections = list.getSelectionModel().getSelection(),
  140. i = 0,
  141. len = selections.length;
  142. return Ext.Array.sort(selections, function(a, b){
  143. a = store.indexOf(a);
  144. b = store.indexOf(b);
  145. if (a < b) {
  146. return -1;
  147. } else if (a > b) {
  148. return 1;
  149. }
  150. return 0;
  151. });
  152. },
  153. onAddBtnClick : function() {
  154. var me = this,
  155. fromList = me.fromField.boundList,
  156. selected = this.getSelections(fromList),needto=new Object(),addArr=new Array();
  157. var toStore=this.toField.boundList.getStore();
  158. Ext.Array.each(toStore.data.items,function(item){
  159. needto[item.data.value]=item.data;
  160. });
  161. Ext.Array.each(selected,function(item){
  162. needto[item.data.value]=item.data;
  163. });
  164. var keys=Ext.Object.getKeys(needto);
  165. Ext.each(keys, function(k){
  166. addArr.push(needto[k]);
  167. });
  168. fromList.getStore().remove(selected);
  169. this.toField.boundList.getStore().loadData(addArr);
  170. },
  171. onAddAllBtnClick : function() {
  172. var me = this,
  173. fromList = me.fromField.boundList,
  174. toValues=this.toField.boundList.getStore().data,
  175. needto=new Object(),
  176. addArr=new Array();
  177. var toStore=this.toField.boundList.getStore();
  178. Ext.Array.each(fromList.getStore().data.items,function(item){
  179. needto[item.data.value]=item.data;
  180. });
  181. Ext.Array.each(toStore.data.items,function(item){
  182. needto[item.data.value]=item.data;
  183. });
  184. var keys=Ext.Object.getKeys(needto);
  185. Ext.each(keys, function(k){
  186. addArr.push(needto[k]);
  187. });
  188. this.toField.boundList.getStore().loadData(addArr);
  189. fromList.getStore().removeAll();
  190. },
  191. onRemoveBtnClick : function() {
  192. var me = this,
  193. toList = me.toField.boundList,
  194. selected = this.getSelections(toList);
  195. toList.getStore().remove(selected);
  196. this.fromField.boundList.getStore().add(selected);
  197. },
  198. onRemoveAllBtnClick : function() {
  199. var me = this,
  200. toList = me.toField.boundList;
  201. this.fromField.boundList.getStore().add(toList.getStore().data.items);
  202. toList.getStore().removeAll();
  203. },
  204. onItemDblClick : function(view) {
  205. var me = this;
  206. if (view == me.toField.boundList){
  207. me.onRemoveBtnClick();
  208. }
  209. else if (view == me.fromField.boundList) {
  210. me.onAddBtnClick();
  211. }
  212. },
  213. setRawValue: function(value) {
  214. var me = this,
  215. Array = Ext.Array,
  216. toStore, fromStore, models;
  217. value = Array.from(value);
  218. me.rawValue = value;
  219. if (me.toField) {
  220. toStore = me.toField.boundList.getStore();
  221. fromStore = me.fromField.boundList.getStore();
  222. // Move any selected values back to the fromField
  223. fromStore.add(toStore.getRange());
  224. toStore.removeAll();
  225. // Move the new values over to the toField
  226. models = [];
  227. Ext.Array.forEach(value, function(val) {
  228. var undef,
  229. model = fromStore.findRecord(me.valueField, val, undef, undef, true, true);
  230. if (model) {
  231. models.push(model);
  232. }
  233. });
  234. fromStore.remove(models);
  235. toStore.add(models);
  236. }
  237. return value;
  238. },
  239. getRawValue: function() {
  240. var me = this,
  241. toField = me.toField,
  242. rawValue = me.rawValue;
  243. if (toField) {
  244. rawValue = Ext.Array.map(toField.boundList.getStore().getRange(), function(model) {
  245. return model.get(me.valueField);
  246. });
  247. }
  248. me.rawValue = rawValue;
  249. return rawValue;
  250. },
  251. /**
  252. * @private Cascade readOnly/disabled state to the sub-fields and buttons
  253. */
  254. updateReadOnly: function() {
  255. var me = this,
  256. readOnly = me.readOnly || me.disabled;
  257. if (me.rendered) {
  258. me.toField.setReadOnly(readOnly);
  259. me.fromField.setReadOnly(readOnly);
  260. Ext.Array.forEach(me.innerCt.query('button'), function(button) {
  261. button.setDisabled(readOnly);
  262. });
  263. }
  264. },
  265. onDisable: function(){
  266. this.callParent();
  267. var fromField = this.fromField;
  268. // if we have one, we have both, they get created at the same time
  269. if (fromField) {
  270. fromField.disable();
  271. this.toField.disable();
  272. }
  273. },
  274. onEnable: function(){
  275. this.callParent();
  276. var fromField = this.fromField;
  277. // if we have one, we have both, they get created at the same time
  278. if (fromField) {
  279. fromField.enable();
  280. this.toField.enable();
  281. }
  282. },
  283. onDestroy: function() {
  284. Ext.destroyMembers(this, 'innerCt');
  285. this.callParent();
  286. },
  287. getModelData:function(){
  288. var me = this,
  289. toField = me.toField,arr=new Array();
  290. if (toField) {
  291. rawValue = Ext.Array.map(toField.boundList.getStore().getRange(), function(model) {
  292. arr.push(Ext.JSON.encode(model.data));
  293. });
  294. }
  295. return arr;
  296. }
  297. });