]> git.proxmox.com Git - extjs.git/blame - extjs/modern/modern/src/dataview/IndexBar.js
add extjs 6.0.1 sources
[extjs.git] / extjs / modern / modern / src / dataview / IndexBar.js
CommitLineData
6527f429
DM
1/**\r
2 * IndexBar is a component used to display a list of data (primarily an alphabet) which can then be used to quickly\r
3 * navigate through a list (see {@link Ext.List}) of data. When a user taps on an item in the {@link Ext.IndexBar},\r
4 * it will fire the {@link #index} event.\r
5 *\r
6 * Here is an example of the usage in a {@link Ext.List}:\r
7 *\r
8 * @example phone portrait preview\r
9 * Ext.define('Contact', {\r
10 * extend: 'Ext.data.Model',\r
11 * config: {\r
12 * fields: ['firstName', 'lastName']\r
13 * }\r
14 * });\r
15 *\r
16 * var store = new Ext.data.JsonStore({\r
17 * model: 'Contact',\r
18 * sorters: 'lastName',\r
19 *\r
20 * grouper: {\r
21 * groupFn: function(record) {\r
22 * return record.get('lastName')[0];\r
23 * }\r
24 * },\r
25 *\r
26 * data: [\r
27 * {firstName: 'Screech', lastName: 'Powers'},\r
28 * {firstName: 'Kelly', lastName: 'Kapowski'},\r
29 * {firstName: 'Zach', lastName: 'Morris'},\r
30 * {firstName: 'Jessie', lastName: 'Spano'},\r
31 * {firstName: 'Lisa', lastName: 'Turtle'},\r
32 * {firstName: 'A.C.', lastName: 'Slater'},\r
33 * {firstName: 'Richard', lastName: 'Belding'}\r
34 * ]\r
35 * });\r
36 *\r
37 * var list = new Ext.List({\r
38 * fullscreen: true,\r
39 * itemTpl: '<div class="contact">{firstName} <strong>{lastName}</strong></div>',\r
40 *\r
41 * grouped : true,\r
42 * indexBar : true,\r
43 * store: store,\r
44 * hideOnMaskTap: false\r
45 * });\r
46 *\r
47*/\r
48Ext.define('Ext.dataview.IndexBar', {\r
49 extend: 'Ext.Component',\r
50 alternateClassName: 'Ext.IndexBar',\r
51\r
52 /**\r
53 * @event index\r
54 * Fires when an item in the index bar display has been tapped.\r
55 * @param {Ext.dataview.IndexBar} this The IndexBar instance\r
56 * @param {String} html The HTML inside the tapped node.\r
57 * @param {Ext.dom.Element} target The node on the indexbar that has been tapped.\r
58 */\r
59\r
60 config: {\r
61 baseCls: Ext.baseCSSPrefix + 'indexbar',\r
62\r
63 /**\r
64 * @cfg {String} direction\r
65 * Layout direction, can be either 'vertical' or 'horizontal'\r
66 * @accessor\r
67 */\r
68 direction: 'vertical',\r
69\r
70 /**\r
71 * @cfg {Array} letters\r
72 * The letters to show on the index bar.\r
73 * @accessor\r
74 */\r
75 letters: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],\r
76\r
77 ui: 'alphabet',\r
78\r
79 /**\r
80 * @cfg {String} listPrefix\r
81 * The prefix string to be used at the beginning of the list.\r
82 * E.g: useful to add a "#" prefix before numbers.\r
83 * @accessor\r
84 */\r
85 listPrefix: null\r
86 },\r
87\r
88 /**\r
89 * @private\r
90 */\r
91 itemCls: Ext.baseCSSPrefix + '',\r
92\r
93 updateDirection: function(newDirection, oldDirection) {\r
94 var baseCls = this.getBaseCls();\r
95\r
96 this.element.replaceCls(baseCls + '-' + oldDirection, baseCls + '-' + newDirection);\r
97 },\r
98\r
99 getElementConfig: function() {\r
100 // Blackberry Specific code for Index Bar Indicator\r
101 if(Ext.theme.is.Blackberry) {\r
102 return {\r
103 reference: 'wrapper',\r
104 classList: ['x-centered', 'x-indexbar-wrapper'],\r
105 children: [\r
106 {\r
107 reference: 'indicator',\r
108 classList: ['x-indexbar-indicator'],\r
109 hidden: true,\r
110 children: [{\r
111 reference: 'indicatorInner',\r
112 classList: ['x-indexbar-indicator-inner']\r
113 }]\r
114 },\r
115 this.callParent()\r
116 ]\r
117 };\r
118 } else {\r
119 return {\r
120 reference: 'wrapper',\r
121 classList: ['x-centered', 'x-indexbar-wrapper'],\r
122 children: [this.callParent()]\r
123 };\r
124 }\r
125 },\r
126\r
127 updateLetters: function(letters) {\r
128 this.innerElement.setHtml('');\r
129\r
130 if (letters) {\r
131 var ln = letters.length,\r
132 i;\r
133\r
134 for (i = 0; i < ln; i++) {\r
135 this.innerElement.createChild({\r
136 html: letters[i]\r
137 });\r
138 }\r
139 }\r
140 },\r
141\r
142 updateListPrefix: function(listPrefix) {\r
143 if (listPrefix && listPrefix.length) {\r
144 this.innerElement.createChild({\r
145 html: listPrefix\r
146 }, 0);\r
147 }\r
148 },\r
149\r
150 /**\r
151 * @private\r
152 */\r
153 initialize: function() {\r
154 this.callParent();\r
155\r
156 this.innerElement.on({\r
157 touchstart: this.onTouchStart,\r
158 touchend: this.onTouchEnd,\r
159 dragend: this.onDragEnd,\r
160 drag: this.onDrag,\r
161 scope: this\r
162 });\r
163 },\r
164\r
165 onTouchStart: function(e) {\r
166 e.stopPropagation();\r
167 this.innerElement.addCls(this.getBaseCls() + '-pressed');\r
168 this.pageBox = this.innerElement.getBox();\r
169 this.onDrag(e);\r
170 },\r
171\r
172 onTouchEnd: function(e) {\r
173 this.onDragEnd();\r
174 },\r
175\r
176 /**\r
177 * @private\r
178 */\r
179 onDragEnd: function() {\r
180 this.innerElement.removeCls(this.getBaseCls() + '-pressed');\r
181\r
182 // Blackberry Specific code for Index Bar Indicator\r
183 if(this.indicator) {\r
184 this.indicator.hide();\r
185 }\r
186 },\r
187\r
188 /**\r
189 * @private\r
190 */\r
191 onDrag: function(e) {\r
192 var point = Ext.util.Point.fromEvent(e),\r
193 target, isValidTarget,\r
194 pageBox = this.pageBox;\r
195\r
196 if (!pageBox) {\r
197 pageBox = this.pageBox = this.el.getBox();\r
198 }\r
199\r
200\r
201 if (this.getDirection() === 'vertical') {\r
202 if (point.y > pageBox.bottom || point.y < pageBox.top) {\r
203 return;\r
204 }\r
205 target = Ext.Element.fromPoint(pageBox.left + (pageBox.width / 2), point.y);\r
206 isValidTarget = target.getParent() == this.element;\r
207\r
208 // Blackberry Specific code for Index Bar Indicator\r
209 if(this.indicator) {\r
210 this.indicator.show();\r
211\r
212 var halfIndicatorHeight = this.indicator.getHeight() / 2,\r
213 y = point.y - this.element.getY();\r
214\r
215 y = Math.min(Math.max(y, halfIndicatorHeight), this.element.getHeight() - halfIndicatorHeight);\r
216\r
217 if (this.indicatorInner && isValidTarget) {\r
218 this.indicatorInner.setHtml(target.getHtml().toUpperCase());\r
219 }\r
220 this.indicator.setTop(y - (halfIndicatorHeight));\r
221 }\r
222 }\r
223 else {\r
224 if (point.x > pageBox.right || point.x < pageBox.left) {\r
225 return;\r
226 }\r
227 target = Ext.Element.fromPoint(point.x, pageBox.top + (pageBox.height / 2));\r
228 isValidTarget = target.getParent() == this.element;\r
229 }\r
230\r
231 if (target && isValidTarget) {\r
232 this.fireEvent('index', this, target.dom.innerHTML, target);\r
233 }\r
234 },\r
235\r
236 destroy: function() {\r
237 var me = this,\r
238 elements = Array.prototype.slice.call(me.innerElement.dom.childNodes),\r
239 ln = elements.length,\r
240 i = 0;\r
241\r
242 for (; i < ln; i++) {\r
243 Ext.removeNode(elements[i]);\r
244 }\r
245 this.callParent();\r
246 }\r
247});\r