blob: 29fb4f5dd7991fdd9beb9069a47749cac9aab9bf [file] [log] [blame]
Akron4510a3e2021-09-10 15:09:56 +02001define(['buttongroup','buttongroup/menu','menu/item','state'], function (buttonGroupClass, buttonGroupMenuClass, defaultItemClass, stateClass) {
Akrondefa5e82018-07-10 12:09:46 +02002
3 var FunObj = {
4 count : 0,
5 create : function () {
6 return Object.create(this);
7 },
8 incr : function () {
9 this.count++;
10 }
11 };
12
13 describe('KorAP.ButtonGroup', function () {
14
15 it('should be initializable', function () {
16 var group = buttonGroupClass.create(['action', 'bottom']);
17 var el = group.element();
18 expect(el.tagName).toEqual('DIV');
19 expect(el.firstChild).toBeNull();
20 expect(el.classList.contains('action')).toBeTruthy();
21 expect(el.classList.contains('bottom')).toBeTruthy();
22 expect(el.classList.contains('button-group')).toBeTruthy();
23 });
24
25 it('should be expandable', function () {
26 var group = buttonGroupClass.create();
27 expect(group.element().classList.contains('button-group')).toBeTruthy();
28
Akron792b1a42020-09-14 18:56:38 +020029 group.add('Meta', { 'cls':['meta', 'top']}, function (e) {});
Akrondefa5e82018-07-10 12:09:46 +020030
31 var btn = group.element().firstChild;
32 expect(btn.tagName).toEqual('SPAN');
33 expect(btn.classList.contains('meta')).toBeTruthy();
34 expect(btn.classList.contains('top')).toBeTruthy();
35 expect(btn.innerText).toEqual('Meta');
36 });
37
Akrond141a362018-07-10 18:12:13 +020038 it('should be clearable', function () {
39 var group = buttonGroupClass.create();
40 expect(group.element().classList.contains('button-group')).toBeTruthy();
41
Akron792b1a42020-09-14 18:56:38 +020042 group.add('Meta', {'cls':['meta', 'top']}, function (e) {});
43 group.add('Mate', {'cls':['mate']}, function (e) {});
Akrond141a362018-07-10 18:12:13 +020044
45 var btn = group.element().children[0];
46 expect(btn.tagName).toEqual('SPAN');
47 expect(btn.classList.contains('meta')).toBeTruthy();
48 expect(btn.classList.contains('top')).toBeTruthy();
49 expect(btn.innerText).toEqual('Meta');
50
51 btn = group.element().children[1];
52 expect(btn.tagName).toEqual('SPAN');
53 expect(btn.classList.contains('mate')).toBeTruthy();
54 expect(btn.classList.contains('top')).toBeFalsy();
55 expect(btn.innerText).toEqual('Mate');
56
57 // clear button
58 group.clear();
59
60 expect(group.element().children.length).toEqual(0);
61
Akron792b1a42020-09-14 18:56:38 +020062 group.add('New', {'cls':['new']}, function (e) {});
Akrond141a362018-07-10 18:12:13 +020063
64 btn = group.element().children[0];
65 expect(btn.tagName).toEqual('SPAN');
66 expect(btn.classList.contains('new')).toBeTruthy();
67 expect(btn.classList.contains('top')).toBeFalsy();
68 expect(btn.innerText).toEqual('New');
69 });
70
71
Akrondefa5e82018-07-10 12:09:46 +020072 it('should listen to button clicks', function () {
73 var group = buttonGroupClass.create();
74
75 var count = 0;
76
77 group.add('Meta', undefined, function () {
78 count++;
79 });
80
81 expect(count).toEqual(0);
82
83 // Click on the button
84 group.element().firstChild.click();
85
86 expect(count).toEqual(1);
87 });
88
89 it('should respect binds', function () {
90 var group = buttonGroupClass.create();
91 fun = FunObj.create();
92 expect(fun.count).toEqual(0);
93
94 // Bind group to another object
Akronb23e2712018-07-13 18:17:37 +020095 var group2 = group.bind(fun);
96 expect(group2).toEqual(group);
97 expect(group.bind()).toEqual(fun);
Akrondefa5e82018-07-10 12:09:46 +020098
99 group.add('Incr', undefined, function (e) {
100 // increment on bind object
101 this.incr()
102 });
103
104 // Click on the button
105 group.element().firstChild.click();
106 expect(fun.count).toEqual(1);
107 });
Akron52ed22d2018-07-11 17:05:19 +0200108
hebasta40a85cf2020-07-15 18:10:08 +0200109 it('should add icon', function () {
110 var group = buttonGroupClass.create();
111 expect(group.element().classList.contains('button-group')).toBeTruthy();
112
Akron792b1a42020-09-14 18:56:38 +0200113 group.add('Meta', {'cls':['meta'], 'icon': 'metaicon'}, function (e) {});
hebasta40a85cf2020-07-15 18:10:08 +0200114
115 var btn = group.element().firstChild;
116 expect(btn.tagName).toEqual('SPAN');
117 expect(btn.getAttribute('data-icon')).toEqual('metaicon');
Akron83a58bc2024-11-08 09:55:19 +0100118 expect(btn.getAttribute('title')).toEqual('Meta');
hebasta40a85cf2020-07-15 18:10:08 +0200119 expect(btn.classList.contains('meta')).toBeTruthy();
120 expect(btn.innerText).toEqual('Meta');
121 });
122
Akron83a58bc2024-11-08 09:55:19 +0100123 it('should add description', function () {
124 var group = buttonGroupClass.create();
125 expect(group.element().classList.contains('button-group')).toBeTruthy();
126
127 group.add('Meta', {'cls':['meta'], 'icon': 'metaicon', 'desc': 'MyMeta'}, function (e) {});
128
129 var btn = group.element().firstChild;
130 expect(btn.tagName).toEqual('SPAN');
131 expect(btn.getAttribute('data-icon')).toEqual('metaicon');
132 expect(btn.getAttribute('title')).toEqual('MyMeta');
133 expect(btn.classList.contains('meta')).toBeTruthy();
134 expect(btn.innerText).toEqual('Meta');
135 });
136
Akron52ed22d2018-07-11 17:05:19 +0200137 it('should open lists', function () {
Akron8120ac12020-09-14 18:05:33 +0200138 var group = buttonGroupClass.create();
139 expect(group.element().classList.contains('button-group')).toBeTruthy();
140
Akron644ad9f2021-07-26 16:12:59 +0200141 var b = group.addList('More', {'cls':['more']});
142 var list = b.list;
Akron8120ac12020-09-14 18:05:33 +0200143
144 list.readItems([
145 ['cool', 'cool', function () { }],
146 ['very cool', 'veryCool', function () { }]
147 ]);
148
149 var btn = group.element().firstChild;
150 expect(btn.tagName).toEqual('SPAN');
151 expect(btn.classList.contains('more')).toBeTruthy();
152 expect(btn.innerText).toEqual('More');
153
154 expect(list.element().classList.contains('visible')).toBeFalsy();
Akron52ed22d2018-07-11 17:05:19 +0200155
Akron8120ac12020-09-14 18:05:33 +0200156 // Click to show menu
157 btn.click();
158
159 expect(list.element().classList.contains('visible')).toBeTruthy();
160
161 expect(list.element().children[1].children[0].innerText).toEqual('cool--');
162 expect(list.element().children[1].children[1].innerText).toEqual('very cool--');
163
164 document.body.removeChild(list.element());
Akron52ed22d2018-07-11 17:05:19 +0200165 });
Akron858cbc82019-12-05 16:53:13 +0100166
Akron20b6d312021-07-26 15:14:42 +0200167 it('should add to lists', function () {
168 var group = buttonGroupClass.create();
169 expect(group.element().classList.contains('button-group')).toBeTruthy();
170
Akron644ad9f2021-07-26 16:12:59 +0200171 var b = group.addList('More', {'cls':['more']});
172 var list = b.list;
Akron20b6d312021-07-26 15:14:42 +0200173
174 let x = 'empty';
175 list.add('Meta1', {'cls':['meta'], 'icon': 'metaicon'}, function (e) {
176 x = 'meta1';
177 });
178 list.add('Meta2', {'cls':['meta'], 'icon': 'metaicon'}, function (e) {
179 x = 'meta2'
180 });
181
182 var btn = group.element().firstChild;
183 expect(btn.tagName).toEqual('SPAN');
184 expect(btn.classList.contains('more')).toBeTruthy();
185 expect(btn.innerText).toEqual('More');
186
187 expect(list.element().classList.contains('visible')).toBeFalsy();
188
189 // Click to show menu
190 btn.click();
191
192 expect(list.element().classList.contains('visible')).toBeTruthy();
Leo Reppdedcf1a2021-08-18 18:57:47 +0200193 expect(directElementChildrenByTagName(list.element(),"li")[0].innerHTML).toEqual('Meta1');
194 expect(directElementChildrenByTagName(list.element(),"li")[1].innerHTML).toEqual('Meta2');
Akron20b6d312021-07-26 15:14:42 +0200195
196 expect(x).toEqual('empty');
Leo Reppdedcf1a2021-08-18 18:57:47 +0200197 directElementChildrenByTagName(list.element(),"li")[0].click();
Akron20b6d312021-07-26 15:14:42 +0200198 expect(x).toEqual('meta1');
199
200 expect(list.element().classList.contains('visible')).toBeFalsy();
201
202 // Click to show menu
203 btn.click();
204
205 expect(list.element().classList.contains('visible')).toBeTruthy();
Leo Reppdedcf1a2021-08-18 18:57:47 +0200206 directElementChildrenByTagName(list.element(),"li")[1].click();
Akron20b6d312021-07-26 15:14:42 +0200207 expect(x).toEqual('meta2');
208
209 expect(list.element().classList.contains('visible')).toBeFalsy();
210
211 expect(list.element().children[1].children[0].innerText).toEqual('Meta1--');
212 expect(list.element().children[1].children[1].innerText).toEqual('Meta2--');
213
214 document.body.removeChild(list.element());
215 });
216
217
Akron858cbc82019-12-05 16:53:13 +0100218 it('should support toggle buttons', function () {
219 var group = buttonGroupClass.create();
220
221 let s = stateClass.create();
222
223 expect(s.get()).toBeFalsy();
224
Akron792b1a42020-09-14 18:56:38 +0200225 group.addToggle('example',{'cls':["examplecls"]}, s);
Akron858cbc82019-12-05 16:53:13 +0100226
227 let e = group.element();
228
229 expect(e.firstChild.getAttribute("title")).toBe("example");
230 expect(e.firstChild.classList.contains("examplecls")).toBeTruthy();
231
232 expect(e.firstChild.firstChild.classList.contains("check")).toBeTruthy();
233 expect(e.firstChild.firstChild.classList.contains("button-icon")).toBeTruthy();
234 expect(e.firstChild.lastChild.textContent).toBe("example");
235
236 // Check state
237 expect(s.get()).toBeFalsy();
238 expect(e.firstChild.firstChild.classList.contains("checked")).toBeFalsy();
239
240 // Click on the button
241 e.firstChild.click();
242
243 // Check state
244 expect(s.get()).toBeTruthy();
245 expect(e.firstChild.firstChild.classList.contains("checked")).toBeTruthy();
Akron83a58bc2024-11-08 09:55:19 +0100246
247
248 group.addToggle('example2',{'cls':["examplecls"], "desc":"Haha"}, s);
249
250 e = group.element();
251
252 expect(e.children[1].getAttribute("title")).toBe("Haha");
Akron858cbc82019-12-05 16:53:13 +0100253 });
Akronf8af3b82021-07-21 20:24:00 +0200254
255 it('should allow adoption', function () {
256
257 const el = document.createElement('div');
258
259 const group = buttonGroupClass.adopt(el);
260
261 group.add('Meta', {'cls':['meta', 'top']}, function (e) {});
262 group.add('Mate', {'cls':['mate']}, function (e) {});
263
264 var btn = group.element().children[0];
265 expect(btn.tagName).toEqual('SPAN');
266 expect(btn.classList.contains('meta')).toBeTruthy();
267 expect(btn.classList.contains('top')).toBeTruthy();
268 expect(btn.innerText).toEqual('Meta');
269
270 btn = group.element().children[1];
271 expect(btn.tagName).toEqual('SPAN');
272 expect(btn.classList.contains('mate')).toBeTruthy();
273 expect(btn.classList.contains('top')).toBeFalsy();
274 expect(btn.innerText).toEqual('Mate');
275 });
276
277 it('should make anchor element definable', function () {
278
279 const el = document.createElement('div');
280 const c1 = el.appendChild(document.createElement('c1'));
281 const c2 = el.appendChild(document.createElement('c2'));
282 const c3 = el.appendChild(document.createElement('c3'));
Akronc8c8bf12021-09-24 11:30:45 +0200283
284 let group = buttonGroupClass.adopt(el);
285 expect(group.anchor(null)).toBeFalsy();
Akronf8af3b82021-07-21 20:24:00 +0200286
Akronc8c8bf12021-09-24 11:30:45 +0200287 group = buttonGroupClass.adopt(el);
Akronf8af3b82021-07-21 20:24:00 +0200288 expect(group.anchor(c3)).toBeTruthy();
289
290 group.add('Meta', {'cls':['meta', 'top']}, function (e) {});
291 group.add('Mate', {'cls':['mate']}, function (e) {});
292
293 let btn = group.element().children[0];
294 expect(btn.tagName).toEqual('C1');
295
296 btn = group.element().children[1];
297 expect(btn.tagName).toEqual('C2');
298
299 btn = group.element().children[2];
300 expect(btn.tagName).toEqual('SPAN');
301 expect(btn.classList.contains('meta')).toBeTruthy();
302 expect(btn.classList.contains('top')).toBeTruthy();
303 expect(btn.innerText).toEqual('Meta');
304
305 btn = group.element().children[3];
306 expect(btn.tagName).toEqual('SPAN');
307 expect(btn.classList.contains('mate')).toBeTruthy();
308 expect(btn.classList.contains('top')).toBeFalsy();
309 expect(btn.innerText).toEqual('Mate');
310
311 btn = group.element().children[4];
312 expect(btn.tagName).toEqual('C3');
313 });
Akrondefa5e82018-07-10 12:09:46 +0200314 });
Akron4510a3e2021-09-10 15:09:56 +0200315
316 describe('KorAP.ButtonGroup.Menu', function () {
317 it('should reposition', function () {
318 const menu = buttonGroupMenuClass.create([["hallo", undefined, function () {}]], defaultItemClass);
319 const div = document.createElement('div');
320
321 document.body.appendChild(div);
322
323 div.style.position = 'absolute';
324 div.style.display = 'block';
325 div.style.left = '14px';
326 div.style.top = '20px';
327 div.style.width = '40px';
328 div.style.height = '30px';
329
330 menu.show();
331
332 // 000
333 menu._repos(div);
334 let elem = menu.element();
335 const fffl = elem.style.left;
336 const ffft = elem.style.top;
337
338 // 100
339 menu.openAt(true, false, false);
340 menu._repos(div);
341 elem = menu.element();
342 const tffl = elem.style.left;
343 expect(tffl).not.toEqual(fffl);
344
345
346 // 011
347 menu.openAt(false, true, true);
348 menu._repos(div);
349 elem = menu.element();
350 const fttt = elem.style.top;
351 expect(fttt).not.toEqual(ffft);
352
353 document.body.removeChild(div);
354 document.body.removeChild(elem);
355 });
356 });
Akrondefa5e82018-07-10 12:09:46 +0200357});