combotree.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. export default function () {
  2. Ext.define('Yvan.ComboTree', {
  3. extend: 'Ext.form.field.Picker',
  4. xtype: 'combotree',
  5. triggerCls: Ext.baseCSSPrefix + 'form-arrow-trigger',
  6. config: {
  7. store: null,
  8. displayField: null,
  9. columns: null,
  10. selectOnTab: true,
  11. maxPickerHeight: 300,
  12. minPickerHeight: 100,
  13. minPickerWidth: 350,
  14. rootVisible: true,
  15. },
  16. editable: false,
  17. setStore(store) {
  18. this.store = store
  19. const me = this;
  20. if (me.store) {
  21. if (me.picker) {
  22. me.picker.setStore(store)
  23. if (me.isExpanded) {
  24. me.collapse()
  25. delete me.picker
  26. me.expand()
  27. }
  28. }
  29. this.onLoad()
  30. me.mon(me.store, {
  31. scope: me,
  32. load: me.onLoad,
  33. update: me.onUpdate
  34. });
  35. }
  36. },
  37. createPicker() {
  38. const me = this
  39. const picker = new Ext.tree.Panel({
  40. border: false,
  41. baseCls: Ext.baseCSSPrefix + 'boundlist',
  42. shrinkWrapDock: 2,
  43. store: me.store,
  44. floating: true,
  45. rootVisible: me.rootVisible,
  46. displayField: me.displayField,
  47. columns: me.columns,
  48. minHeight: me.minPickerHeight,
  49. maxHeight: me.maxPickerHeight,
  50. minWidth: me.minPickerWidth,
  51. manageHeight: false,
  52. shadow: false,
  53. scrollable: true,
  54. // modal: true,
  55. // constrain: true,
  56. // constrainTo: topScope._handle.el.dom,
  57. // renderTo: topScope._handle.el.dom,
  58. // alignTarget: topScope._handle,
  59. listeners: {
  60. scope: me,
  61. itemclick: me.onItemClick,
  62. itemkeydown: me.onPickerKeyDown
  63. }
  64. }),
  65. view = picker.getView();
  66. if (Ext.isIE9 && Ext.isStrict) {
  67. view.on({
  68. scope: me,
  69. highlightitem: me.repaintPickerView,
  70. unhighlightitem: me.repaintPickerView,
  71. afteritemexpand: me.repaintPickerView,
  72. afteritemcollapse: me.repaintPickerView
  73. });
  74. }
  75. return picker;
  76. },
  77. repaintPickerView() {
  78. const style = this.picker.getView().getEl().dom.style;
  79. style.display = style.display;
  80. },
  81. onItemClick(view, record, node, rowIndex, e) {
  82. this.selectItem(view, record);
  83. },
  84. onPickerKeyDown(treeView, record, item, index, e) {
  85. const key = e.getKey();
  86. if (key === e.ENTER || (key === e.TAB && this.selectOnTab)) {
  87. this.selectItem(treeView, record);
  88. }
  89. },
  90. selectItem(sender, record) {
  91. var me = this;
  92. me.setValue(record.getId());
  93. me.fireEvent('select', me, record);
  94. me.collapse();
  95. },
  96. onExpand() {
  97. const picker = this.picker;
  98. const store = picker.store;
  99. const value = this.value;
  100. let node;
  101. if (value) {
  102. node = store.getNodeById(value);
  103. }
  104. if (!node) {
  105. node = store.getRoot();
  106. }
  107. picker.ensureVisible(node, {
  108. select: true,
  109. focus: true
  110. });
  111. },
  112. setValue(value) {
  113. const me = this;
  114. console.log('setValue', value)
  115. me.value = value;
  116. if (!me.store || me.store.loading) {
  117. // Called while the Store is loading. Ensure it is processed by the onLoad method.
  118. return me.mixins.field.setValue.call(me, value);
  119. // return me;
  120. }
  121. let record = value ? me.store.getNodeById(value) : me.store.getRoot();
  122. if (value === undefined) {
  123. record = me.store.getRoot();
  124. console.log('setValue', record.getId())
  125. me.value = record.getId();
  126. return me.mixins.field.setValue.call(me, value);
  127. } else {
  128. record = me.store.getNodeById(value);
  129. }
  130. // set the raw value to the record's display field if a record was found
  131. me.setRawValue(record ? record.get(me.displayField) : '');
  132. return me.mixins.field.setValue.call(me, value);
  133. },
  134. getSubmitValue() {
  135. return this.value;
  136. },
  137. getValue() {
  138. return this.value;
  139. },
  140. onLoad() {
  141. const value = this.value;
  142. if (value) {
  143. this.setValue(value);
  144. }
  145. },
  146. onUpdate(store, rec, type, modifiedFieldNames) {
  147. const display = this.displayField;
  148. const me = this
  149. if (type === 'edit' && modifiedFieldNames &&
  150. Ext.Array.contains(modifiedFieldNames, display) &&
  151. this.value === rec.getId()) {
  152. me.mixins.field.setValue.call(me, this.value);
  153. this.setRawValue(rec.get(display));
  154. }
  155. }
  156. });
  157. }