]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | /**\r |
2 | * Filter type for {@link Ext.grid.column.Number number columns}.\r | |
3 | *\r | |
4 | * @example\r | |
5 | * var shows = Ext.create('Ext.data.Store', {\r | |
6 | * fields: ['id','show'],\r | |
7 | * data: [\r | |
8 | * {id: 0, show: 'Battlestar Galactica'},\r | |
9 | * {id: 1, show: 'Doctor Who'},\r | |
10 | * {id: 2, show: 'Farscape'},\r | |
11 | * {id: 3, show: 'Firefly'},\r | |
12 | * {id: 4, show: 'Star Trek'},\r | |
13 | * {id: 5, show: 'Star Wars: Christmas Special'}\r | |
14 | * ]\r | |
15 | * });\r | |
16 | * \r | |
17 | * Ext.create('Ext.grid.Panel', {\r | |
18 | * renderTo: Ext.getBody(),\r | |
19 | * title: 'Sci-Fi Television',\r | |
20 | * height: 250,\r | |
21 | * width: 250,\r | |
22 | * store: shows,\r | |
23 | * plugins: 'gridfilters',\r | |
24 | * columns: [{\r | |
25 | * dataIndex: 'id',\r | |
26 | * text: 'ID',\r | |
27 | * width: 50,\r | |
28 | * filter: 'number' // May also be 'numeric'\r | |
29 | * },{\r | |
30 | * dataIndex: 'show',\r | |
31 | * text: 'Show',\r | |
32 | * flex: 1 \r | |
33 | * }]\r | |
34 | * });\r | |
35 | * \r | |
36 | */\r | |
37 | Ext.define('Ext.grid.filters.filter.Number', {\r | |
38 | extend: 'Ext.grid.filters.filter.TriFilter',\r | |
39 | alias: ['grid.filter.number', 'grid.filter.numeric'],\r | |
40 | \r | |
41 | uses: ['Ext.form.field.Number'],\r | |
42 | \r | |
43 | type: 'number',\r | |
44 | \r | |
45 | config: {\r | |
46 | /**\r | |
47 | * @cfg {Object} [fields]\r | |
48 | * Configures field items individually. These properties override those defined\r | |
49 | * by `{@link #itemDefaults}`.\r | |
50 | *\r | |
51 | * Example usage:\r | |
52 | *\r | |
53 | * fields: {\r | |
54 | * // Override itemDefaults for one field:\r | |
55 | * gt: {\r | |
56 | * width: 200\r | |
57 | * }\r | |
58 | *\r | |
59 | * // "lt" and "eq" fields retain all itemDefaults\r | |
60 | * },\r | |
61 | */\r | |
62 | fields: {\r | |
63 | gt: {\r | |
64 | iconCls: Ext.baseCSSPrefix + 'grid-filters-gt',\r | |
65 | margin: '0 0 3px 0'\r | |
66 | },\r | |
67 | lt: {\r | |
68 | iconCls: Ext.baseCSSPrefix + 'grid-filters-lt',\r | |
69 | margin: '0 0 3px 0'\r | |
70 | },\r | |
71 | eq: {\r | |
72 | iconCls: Ext.baseCSSPrefix + 'grid-filters-eq',\r | |
73 | margin: 0\r | |
74 | }\r | |
75 | }\r | |
76 | },\r | |
77 | \r | |
78 | //<locale>\r | |
79 | /**\r | |
80 | * @cfg {String} emptyText\r | |
81 | * The empty text to show for each field.\r | |
82 | */\r | |
83 | emptyText: 'Enter Number...',\r | |
84 | //</locale>\r | |
85 | \r | |
86 | itemDefaults: {\r | |
87 | xtype: 'numberfield',\r | |
88 | enableKeyEvents: true,\r | |
89 | hideEmptyLabel: false,\r | |
90 | labelSeparator: '',\r | |
91 | labelWidth: 29,\r | |
92 | selectOnFocus: false\r | |
93 | },\r | |
94 | \r | |
95 | menuDefaults: {\r | |
96 | // A menu with only form fields needs some body padding. Normally this padding\r | |
97 | // is managed by the items, but we have no normal menu items.\r | |
98 | bodyPadding: 3,\r | |
99 | showSeparator: false\r | |
100 | },\r | |
101 | \r | |
102 | createMenu: function () {\r | |
103 | var me = this,\r | |
104 | listeners = {\r | |
105 | scope: me,\r | |
106 | keyup: me.onValueChange,\r | |
107 | spin: {\r | |
108 | fn: me.onInputSpin,\r | |
109 | buffer: 200\r | |
110 | },\r | |
111 | el: {\r | |
112 | click: me.stopFn\r | |
113 | }\r | |
114 | },\r | |
115 | itemDefaults = me.getItemDefaults(),\r | |
116 | menuItems = me.menuItems,\r | |
117 | fields = me.getFields(),\r | |
118 | field, i, len, key, item, cfg;\r | |
119 | \r | |
120 | me.callParent();\r | |
121 | \r | |
122 | me.fields = {};\r | |
123 | \r | |
124 | for (i = 0, len = menuItems.length; i < len; i++) {\r | |
125 | key = menuItems[i];\r | |
126 | if (key !== '-') {\r | |
127 | field = fields[key];\r | |
128 | \r | |
129 | cfg = {\r | |
130 | labelClsExtra: Ext.baseCSSPrefix + 'grid-filters-icon ' + field.iconCls\r | |
131 | };\r | |
132 | \r | |
133 | if (itemDefaults) {\r | |
134 | Ext.merge(cfg, itemDefaults);\r | |
135 | }\r | |
136 | \r | |
137 | Ext.merge(cfg, field);\r | |
138 | cfg.emptyText = cfg.emptyText || me.emptyText;\r | |
139 | delete cfg.iconCls;\r | |
140 | \r | |
141 | me.fields[key] = item = me.menu.add(cfg);\r | |
142 | \r | |
143 | item.filter = me.filter[key];\r | |
144 | item.filterKey = key;\r | |
145 | item.on(listeners);\r | |
146 | } else {\r | |
147 | me.menu.add(key);\r | |
148 | }\r | |
149 | }\r | |
150 | },\r | |
151 | \r | |
152 | getValue: function (field) {\r | |
153 | var value = {};\r | |
154 | value[field.filterKey] = field.getValue();\r | |
155 | return value;\r | |
156 | },\r | |
157 | \r | |
158 | /**\r | |
159 | * @private\r | |
160 | * Handler method called when there is a spin event on a NumberField\r | |
161 | * item of this menu.\r | |
162 | */\r | |
163 | onInputSpin: function (field, direction) {\r | |
164 | var value = {};\r | |
165 | \r | |
166 | value[field.filterKey] = field.getValue();\r | |
167 | \r | |
168 | this.setValue(value);\r | |
169 | },\r | |
170 | \r | |
171 | stopFn: function(e) {\r | |
172 | e.stopPropagation();\r | |
173 | }\r | |
174 | });\r |