ItemSelector.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  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,needto=new Object(),addArr=new Array();
  175. var toStore=this.toField.boundList.getStore();
  176. Ext.Array.each(fromList.getStore().data.items,function(item){
  177. needto[item.value]=item;
  178. });
  179. Ext.Array.each(toStore.data.items,function(item){
  180. needto[item.value]=item;
  181. });
  182. var keys=Ext.Object.getKeys(needto);
  183. Ext.each(keys, function(k){
  184. addArr.push(needto[k]);
  185. });
  186. this.toField.boundList.getStore().loadData(addArr);
  187. fromList.getStore().removeAll();
  188. },
  189. onRemoveBtnClick : function() {
  190. var me = this,
  191. toList = me.toField.boundList,
  192. selected = this.getSelections(toList);
  193. toList.getStore().remove(selected);
  194. this.fromField.boundList.getStore().add(selected);
  195. },
  196. onRemoveAllBtnClick : function() {
  197. var me = this,
  198. toList = me.toField.boundList;
  199. this.fromField.boundList.getStore().add(toList.getStore().data.items);
  200. toList.getStore().removeAll();
  201. },
  202. onItemDblClick : function(view) {
  203. var me = this;
  204. if (view == me.toField.boundList){
  205. me.onRemoveBtnClick();
  206. }
  207. else if (view == me.fromField.boundList) {
  208. me.onAddBtnClick();
  209. }
  210. },
  211. setRawValue: function(value) {
  212. var me = this,
  213. Array = Ext.Array,
  214. toStore, fromStore, models;
  215. value = Array.from(value);
  216. me.rawValue = value;
  217. if (me.toField) {
  218. toStore = me.toField.boundList.getStore();
  219. fromStore = me.fromField.boundList.getStore();
  220. // Move any selected values back to the fromField
  221. fromStore.add(toStore.getRange());
  222. toStore.removeAll();
  223. // Move the new values over to the toField
  224. models = [];
  225. Ext.Array.forEach(value, function(val) {
  226. var undef,
  227. model = fromStore.findRecord(me.valueField, val, undef, undef, true, true);
  228. if (model) {
  229. models.push(model);
  230. }
  231. });
  232. fromStore.remove(models);
  233. toStore.add(models);
  234. }
  235. return value;
  236. },
  237. getRawValue: function() {
  238. var me = this,
  239. toField = me.toField,
  240. rawValue = me.rawValue;
  241. if (toField) {
  242. rawValue = Ext.Array.map(toField.boundList.getStore().getRange(), function(model) {
  243. return model.get(me.valueField);
  244. });
  245. }
  246. me.rawValue = rawValue;
  247. return rawValue;
  248. },
  249. /**
  250. * @private Cascade readOnly/disabled state to the sub-fields and buttons
  251. */
  252. updateReadOnly: function() {
  253. var me = this,
  254. readOnly = me.readOnly || me.disabled;
  255. if (me.rendered) {
  256. me.toField.setReadOnly(readOnly);
  257. me.fromField.setReadOnly(readOnly);
  258. Ext.Array.forEach(me.innerCt.query('button'), function(button) {
  259. button.setDisabled(readOnly);
  260. });
  261. }
  262. },
  263. onDisable: function(){
  264. this.callParent();
  265. var fromField = this.fromField;
  266. // if we have one, we have both, they get created at the same time
  267. if (fromField) {
  268. fromField.disable();
  269. this.toField.disable();
  270. }
  271. },
  272. onEnable: function(){
  273. this.callParent();
  274. var fromField = this.fromField;
  275. // if we have one, we have both, they get created at the same time
  276. if (fromField) {
  277. fromField.enable();
  278. this.toField.enable();
  279. }
  280. },
  281. onDestroy: function() {
  282. Ext.destroyMembers(this, 'innerCt');
  283. this.callParent();
  284. },
  285. getModelData:function(){
  286. var me = this,
  287. toField = me.toField,arr=new Array();
  288. if (toField) {
  289. rawValue = Ext.Array.map(toField.boundList.getStore().getRange(), function(model) {
  290. arr.push(Ext.JSON.encode(model.data));
  291. });
  292. }
  293. return arr;
  294. }
  295. });