sibu 0.9.3 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +81 -4
  3. data/app/assets/javascripts/sibu/sibu.js.erb +17 -3
  4. data/app/assets/javascripts/tabs/van11y-accessible-tab-panel-aria.js +122 -124
  5. data/app/assets/stylesheets/sibu/defaults.scss +76 -80
  6. data/app/assets/stylesheets/sibu/sibu.css +8 -0
  7. data/app/controllers/sibu/application_controller.rb +8 -0
  8. data/app/controllers/sibu/pages_controller.rb +11 -4
  9. data/app/controllers/sibu/sites_controller.rb +4 -0
  10. data/app/helpers/sibu/application_helper.rb +1 -1
  11. data/app/helpers/sibu/pages_helper.rb +104 -23
  12. data/app/models/sibu/page.rb +3 -3
  13. data/app/models/sibu/site.rb +15 -1
  14. data/app/models/sibu/site_template.rb +1 -1
  15. data/app/views/layouts/sibu/edit_content.html.erb +184 -125
  16. data/app/views/sibu/images/edit.js.erb +5 -3
  17. data/app/views/sibu/pages/_code_edit_panel.html.erb +3 -2
  18. data/app/views/sibu/pages/_form.html.erb +8 -0
  19. data/app/views/sibu/pages/_link_edit_panel.html.erb +6 -6
  20. data/app/views/sibu/pages/_map_edit_panel.html.erb +3 -2
  21. data/app/views/sibu/pages/_media_edit_panel.html.erb +6 -6
  22. data/app/views/sibu/pages/_new_section_panel.html.erb +1 -1
  23. data/app/views/sibu/pages/_paragraph_edit_panel.html.erb +2 -2
  24. data/app/views/sibu/pages/_text_edit_panel.html.erb +2 -2
  25. data/app/views/sibu/pages/child_element.js.erb +2 -2
  26. data/app/views/sibu/pages/clone_element.js.erb +2 -2
  27. data/app/views/sibu/pages/create_section.js.erb +1 -1
  28. data/app/views/sibu/pages/delete_element.js.erb +1 -1
  29. data/app/views/sibu/pages/delete_section.js.erb +1 -1
  30. data/app/views/sibu/pages/edit_element.js.erb +68 -66
  31. data/app/views/sibu/pages/edit_section.js.erb +6 -5
  32. data/app/views/sibu/pages/index.html.erb +2 -2
  33. data/app/views/sibu/pages/new_section.js.erb +22 -13
  34. data/app/views/sibu/pages/update_element.js.erb +2 -2
  35. data/app/views/sibu/pages/update_section.js.erb +3 -3
  36. data/config/initializers/constants.rb +5 -3
  37. data/db/migrate/20200401130601_add_ref_to_site_templates.rb +5 -0
  38. data/lib/sibu/engine.rb +0 -2
  39. data/lib/sibu/version.rb +1 -1
  40. metadata +3 -18
  41. data/app/views/sibu/pages/destroy.html.erb +0 -2
  42. data/app/views/sibu/pages/update.html.erb +0 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b5863fe5be538035f122d5bca9adf79b3003d14c
4
- data.tar.gz: c54c068d10c247f59e1ff89993ce824421d9f8c6
3
+ metadata.gz: b274fec919e722e48ba571e1ee3379f037af6372
4
+ data.tar.gz: 4da5793bc66501214bbb5c9a5a38b00890b4754e
5
5
  SHA512:
6
- metadata.gz: 0f610a0d5e30ae5d3808bd3dace1aaad977cb12f0ad9dcca17cc538c87b38fda947476768dd517a062406ce48c21a7c23563d6ff16b7e260b85a183752ace900
7
- data.tar.gz: a399ffcf3ddc03508e37a404ad5c934d506af3cd1c4ca4a61f7d52437a74b798dcc073b2ff0f262b0a3fba1898c460aa55d2677fdf88fb8adee6cbf676936224
6
+ metadata.gz: '085bf4d2059a0f51494b062332fa6c9e9ada4313d6be6c4ee4799c8f0418d0fc4967d1c2ac967e7f750651866abb1fb249997e6f10e71d067c912fb5ecb5081e'
7
+ data.tar.gz: f26e18f34db37e935cdf4f891fa7033bc585a78421f32b950974460f1a777e97174cf8b728b9f95c452c6d2ffdd7fff2e82e2fbe6163e235fd5633cd0b250f88
data/README.md CHANGED
@@ -1,9 +1,13 @@
1
- # Sibu - A site builder engine for Ruby on Rails
2
- This is an engine for Ruby on Rails that enables creation of static
3
- websites in a simple & wysiwyg way.
1
+ # Sibu
2
+ Sibu is an engine to build websites. It focuses on :
3
+ - Maintaining a simple data model, so it can be exported & imported in many formats
4
+ - Increasing the productivity of web developers by using a Domain Specific Language for page edition
5
+ - Providing non-technical users with a simple and accessible site administration interface
4
6
 
5
7
  ## Usage
6
- How to use my plugin.
8
+ Sibu is currently implemented as a Ruby on Rails engine. Therefore its setup requires a host Ruby on Rails application, that can be created via :
9
+
10
+ `rails new my_app`
7
11
 
8
12
  ## Installation
9
13
  Add this line to your application's Gemfile:
@@ -22,6 +26,79 @@ Or install it yourself as:
22
26
  $ gem install sibu
23
27
  ```
24
28
 
29
+ Once the installation is complete, make sure that you copy the database migrations to your application :
30
+ ```bash
31
+ rake sibu:install:migrations
32
+ ```
33
+
34
+ And finally run the migrations to update your database model :
35
+ ```bash
36
+ rake db:migrate
37
+ ```
38
+
39
+ ## Configuration
40
+ Configuration is provided via the `sibu` key of the Rails application configuration. Typically, this would be done in a `sibu.rb` file in the `config/initializers` folder of your Rails application.
41
+ The example below lists the configuration options available :
42
+ ```ruby
43
+ Rails.application.config.sibu = {
44
+
45
+ # Title metatag of the admin interface
46
+ title: 'My website administration',
47
+
48
+ # Stylesheet to use to style the admin interface
49
+ stylesheet: 'my_user_css',
50
+
51
+ # Javascript to include in the admin interface
52
+ javascript: 'my_user_js',
53
+
54
+ # Path to the admin interface header partial
55
+ top_panel: 'shared/user/top_panel',
56
+
57
+ # Path to the main content edition partial - must include a yield to delegate content display to the Sibu engine
58
+ content_panel: 'shared/user/content_panel',
59
+
60
+ # Path to the admin interface footer partial
61
+ bottom_panel: 'shared/user/bottom_panel',
62
+
63
+ # Name of the method that will be used to authenticate admin users - this method must be available to Sibu controllers
64
+ auth_filter: :authenticate_user!,
65
+
66
+ # Name of the method that will retrieve the current user - this method must be available to Sibu controllers
67
+ current_user: 'current_user',
68
+
69
+ # A flag to indicate that the Sibu instance should offer a separate environment for each user
70
+ multi_user: true,
71
+
72
+ # A proc to identify super-admin users in a multi-users setup (optional)
73
+ admin_filter: Proc.new {|usr| usr.is_admin},
74
+
75
+ # When active, users will be able to override the colors and fonts of the sites templates (optional)
76
+ custom_styles: true,
77
+
78
+ # Lists of colors and fonts available for sites templates customization - Only used when custom_styles is set to true (optional)
79
+ primary_colors: ['#23527c', '#00B1BF', '#BECD00'],
80
+ secondary_colors: ['#E2007A', '#aaaaa1', '#be6432'],
81
+ primary_fonts: ['Intro', 'Lato', 'SourceSansPro'],
82
+ secondary_fonts: ['Aleo', 'Bodoni', 'Cinzel'],
83
+
84
+ # The domain name that will host the admin interface (should be different from the website domain name)
85
+ host: 'localhost',
86
+
87
+ # A partial for 404 error pages
88
+ not_found: 'shared/templates/not_found',
89
+
90
+ # Dimensions of the images to use in the website - Uploaded images will be automatically resized in the provided formats
91
+ images: {large: 1600, medium: 800, small: 320},
92
+
93
+ # Versions available for the created websites
94
+ versions: [['Français', 'fr'], ['Anglais', 'en']],
95
+
96
+ # A proc to override the default ordering of the sections when editing content (optional)
97
+ sections_ordering: Proc.new {|sections| sections.sort_by {|s| SECTIONS_TABS.index(s['category'])}}
98
+ }
99
+ ```
100
+
101
+
25
102
  ## Improvements
26
103
  - Use a specific controller & helper for site display
27
104
  - Move page templates to SiteTemplate model
@@ -1,5 +1,3 @@
1
- //= require jquery
2
- //= require jquery_ujs
3
1
  //= require sibu/common
4
2
  //= require ../quill/quill
5
3
  //= require ../tabs/van11y-accessible-tab-panel-aria
@@ -140,7 +138,7 @@ function displayCurrentCenter(img, centerPos) {
140
138
  }
141
139
 
142
140
  function refreshAfterEdit(reload, sectionId) {
143
- var baseUrl = window.location.href.split('?')[0];
141
+ var baseUrl = window.location.href.split('?')[0].replace(/#.+/, '');
144
142
  if (reload) {
145
143
  if (sectionId) {
146
144
  window.location.href = baseUrl + '?edit_section=' + sectionId;
@@ -152,6 +150,22 @@ function refreshAfterEdit(reload, sectionId) {
152
150
  }
153
151
  }
154
152
 
153
+ function setLinkMode(elt) {
154
+ var selected = elt.value,
155
+ enabledElts = document.querySelector("#link_" + selected).querySelectorAll("#element_value, #element_target");
156
+ for (var i = 0; i < enabledElts.length; i++) {
157
+ enabledElts[i].removeAttribute("disabled");
158
+ }
159
+
160
+ var linkModes = document.querySelectorAll(".sibu_edit_form .link_mode");
161
+ for (var j = 0; j < linkModes.length; j++) {
162
+ if(linkModes[j].getAttribute("id") !== ("link_" + selected)) {
163
+ linkModes[j].querySelector("#element_value").setAttribute("disabled", "disabled");
164
+ linkModes[j].querySelector("#element_target").setAttribute("disabled", "disabled");
165
+ }
166
+ }
167
+ }
168
+
155
169
  function initSectionsPanel() {
156
170
 
157
171
  }
@@ -160,9 +160,10 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
160
160
  * @param {Node} node Default document
161
161
  * @return {Array}
162
162
  */
163
+ // Note : patched to target only direct child nodes having .js-tabs class
163
164
  var $listTabs = function $listTabs() {
164
165
  var node = arguments.length <= 0 || arguments[0] === undefined ? doc : arguments[0];
165
- return [].slice.call(node.querySelectorAll('.' + TABS_JS));
166
+ return [].slice.call(node.querySelectorAll(':scope > .' + TABS_JS));
166
167
  };
167
168
 
168
169
  /**
@@ -178,10 +179,10 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
178
179
  var hx = tabs_node.hasAttribute(TABS_DATA_HX) === true ? tabs_node.getAttribute(TABS_DATA_HX) : '';
179
180
  var hxGeneratedClass = tabs_node.hasAttribute(TABS_DATA_GENERATED_HX_CLASS) === true ? tabs_node.getAttribute(TABS_DATA_GENERATED_HX_CLASS) : TABS_HX_DEFAULT_CLASS;
180
181
  var existingHx = tabs_node.hasAttribute(TABS_DATA_EXISTING_HX) === true ? tabs_node.getAttribute(TABS_DATA_EXISTING_HX) : '';
181
- var $tabList = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_LIST));
182
- var $tabListItems = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_LISTITEM));
183
- var $tabListLinks = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_LISTLINK));
184
- var $tabListPanels = [].slice.call(tabs_node.querySelectorAll('.' + TABS_JS_CONTENT));
182
+ var $tabList = [].slice.call(tabs_node.querySelectorAll(':scope > .' + TABS_JS_LIST));
183
+ var $tabListItems = [].slice.call(tabs_node.querySelectorAll(':scope > .' + TABS_JS_LIST + ' > .' + TABS_JS_LISTITEM));
184
+ var $tabListLinks = [].slice.call(tabs_node.querySelectorAll(':scope > .' + TABS_JS_LIST + ' > .' + TABS_JS_LISTITEM + ' > .' + TABS_JS_LISTLINK));
185
+ var $tabListPanels = [].slice.call(tabs_node.querySelectorAll(':scope > .' + TABS_JS_CONTENT));
185
186
  var noTabSelected = true;
186
187
 
187
188
  // container
@@ -300,35 +301,91 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
300
301
  };
301
302
 
302
303
  /* listeners */
303
- var bindListeners = function() {
304
- ['click', 'keydown'].forEach(function (eventName) {
305
- //let isCtrl = false;
306
-
307
- doc.body.addEventListener(eventName, function (e) {
304
+ ['click', 'keydown'].forEach(function (eventName) {
305
+ //let isCtrl = false;
306
+
307
+ doc.body.addEventListener(eventName, function (e) {
308
+
309
+ // click on a tab link or on something IN a tab link
310
+ var parentLink = searchParent(e.target, TABS_JS_LISTLINK);
311
+ if ((hasClass(e.target, TABS_JS_LISTLINK) === true || parentLink !== '') && eventName === 'click') {
312
+ var linkSelected = hasClass(e.target, TABS_JS_LISTLINK) === true ? e.target : findById(parentLink);
313
+ var parentTabId = searchParent(e.target, TABS_JS);
314
+ var parentTab = findById(parentTabId);
315
+ //let $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
316
+ var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
317
+ var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
318
+
319
+ // aria selected false on all links
320
+ unSelectLinks($parentListLinks);
321
+ // add aria-hidden on all tabs contents
322
+ unSelectContents($parentListContents);
323
+ // add aria selected on selected link + show linked panel
324
+ selectLink(linkSelected);
325
+
326
+ e.preventDefault();
327
+ }
308
328
 
309
- // click on a tab link or on something IN a tab link
310
- var parentLink = searchParent(e.target, TABS_JS_LISTLINK);
311
- if ((hasClass(e.target, TABS_JS_LISTLINK) === true || parentLink !== '') && eventName === 'click') {
312
- var linkSelected = hasClass(e.target, TABS_JS_LISTLINK) === true ? e.target : findById(parentLink);
313
- var parentTabId = searchParent(e.target, TABS_JS);
314
- var parentTab = findById(parentTabId);
315
- //let $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
316
- var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
317
- var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
329
+ // Key down on tabs
330
+ if ((hasClass(e.target, TABS_JS_LISTLINK) === true || parentLink !== '') && eventName === 'keydown') {
331
+ //let linkSelected = hasClass( e.target, TABS_JS_LISTLINK) === true ? e.target : findById( parentLink );
332
+ var parentTabId = searchParent(e.target, TABS_JS);
333
+ var parentTab = findById(parentTabId);
334
+ var $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
335
+ var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
336
+ var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
337
+ var firstLink = $parentListItems[0].querySelector('.' + TABS_JS_LISTLINK);
338
+ var lastLink = $parentListItems[$parentListItems.length - 1].querySelector('.' + TABS_JS_LISTLINK);
339
+
340
+ // strike home on a tab => 1st tab
341
+ if (e.keyCode === 36) {
342
+ unSelectLinks($parentListLinks);
343
+ unSelectContents($parentListContents);
344
+ selectLink(firstLink);
318
345
 
319
- // aria selected false on all links
346
+ e.preventDefault();
347
+ }
348
+ // strike end on a tab => last tab
349
+ else if (e.keyCode === 35) {
320
350
  unSelectLinks($parentListLinks);
321
- // add aria-hidden on all tabs contents
322
351
  unSelectContents($parentListContents);
323
- // add aria selected on selected link + show linked panel
324
- selectLink(linkSelected);
352
+ selectLink(lastLink);
325
353
 
326
354
  e.preventDefault();
327
355
  }
356
+ // strike up or left on the tab => previous tab
357
+ else if ((e.keyCode === 37 || e.keyCode === 38) && !e.ctrlKey) {
358
+ if (firstLink.getAttribute(ATTR_SELECTED) === 'true') {
359
+ unSelectLinks($parentListLinks);
360
+ unSelectContents($parentListContents);
361
+ selectLink(lastLink);
362
+
363
+ e.preventDefault();
364
+ } else {
365
+ selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'prev');
366
+ e.preventDefault();
367
+ }
368
+ }
369
+ // strike down or right in the tab => next tab
370
+ else if ((e.keyCode === 40 || e.keyCode === 39) && !e.ctrlKey) {
371
+ if (lastLink.getAttribute(ATTR_SELECTED) === 'true') {
372
+ unSelectLinks($parentListLinks);
373
+ unSelectContents($parentListContents);
374
+ selectLink(firstLink);
375
+
376
+ e.preventDefault();
377
+ } else {
378
+ selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'next');
379
+ e.preventDefault();
380
+ }
381
+ }
382
+ }
328
383
 
329
- // Key down on tabs
330
- if ((hasClass(e.target, TABS_JS_LISTLINK) === true || parentLink !== '') && eventName === 'keydown') {
331
- //let linkSelected = hasClass( e.target, TABS_JS_LISTLINK) === true ? e.target : findById( parentLink );
384
+ // Key down in tab panels
385
+ var parentTabPanelId = searchParent(e.target, TABS_JS_CONTENT);
386
+ if (parentTabPanelId !== '' && eventName === 'keydown') {
387
+ (function () {
388
+ var linkSelected = findById(findById(parentTabPanelId).getAttribute(ATTR_LABELLEDBY));
332
389
  var parentTabId = searchParent(e.target, TABS_JS);
333
390
  var parentTab = findById(parentTabId);
334
391
  var $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
@@ -337,130 +394,71 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
337
394
  var firstLink = $parentListItems[0].querySelector('.' + TABS_JS_LISTLINK);
338
395
  var lastLink = $parentListItems[$parentListItems.length - 1].querySelector('.' + TABS_JS_LISTLINK);
339
396
 
340
- // strike home on a tab => 1st tab
341
- if (e.keyCode === 36) {
342
- unSelectLinks($parentListLinks);
343
- unSelectContents($parentListContents);
344
- selectLink(firstLink);
345
-
397
+ // strike up + ctrl => go to header
398
+ if (e.keyCode === 38 && e.ctrlKey) {
399
+ setTimeout(function () {
400
+ linkSelected.focus();
401
+ }, 0);
346
402
  e.preventDefault();
347
403
  }
348
- // strike end on a tab => last tab
349
- else if (e.keyCode === 35) {
350
- unSelectLinks($parentListLinks);
351
- unSelectContents($parentListContents);
352
- selectLink(lastLink);
353
-
404
+ // strike pageup + ctrl => go to prev header
405
+ if (e.keyCode === 33 && e.ctrlKey) {
406
+ // go to header
407
+ linkSelected.focus();
354
408
  e.preventDefault();
355
- }
356
- // strike up or left on the tab => previous tab
357
- else if ((e.keyCode === 37 || e.keyCode === 38) && !e.ctrlKey) {
409
+ // then previous
358
410
  if (firstLink.getAttribute(ATTR_SELECTED) === 'true') {
359
411
  unSelectLinks($parentListLinks);
360
412
  unSelectContents($parentListContents);
361
413
  selectLink(lastLink);
362
-
363
- e.preventDefault();
364
414
  } else {
365
415
  selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'prev');
366
- e.preventDefault();
367
416
  }
368
417
  }
369
- // strike down or right in the tab => next tab
370
- else if ((e.keyCode === 40 || e.keyCode === 39) && !e.ctrlKey) {
418
+ // strike pagedown + ctrl => go to next header
419
+ if (e.keyCode === 34 && e.ctrlKey) {
420
+ // go to header
421
+ linkSelected.focus();
422
+ e.preventDefault();
423
+ // then next
371
424
  if (lastLink.getAttribute(ATTR_SELECTED) === 'true') {
372
425
  unSelectLinks($parentListLinks);
373
426
  unSelectContents($parentListContents);
374
427
  selectLink(firstLink);
375
-
376
- e.preventDefault();
377
428
  } else {
378
429
  selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'next');
379
- e.preventDefault();
380
430
  }
381
431
  }
382
- }
383
-
384
- // Key down in tab panels
385
- var parentTabPanelId = searchParent(e.target, TABS_JS_CONTENT);
386
- if (parentTabPanelId !== '' && eventName === 'keydown') {
387
- (function () {
388
- var linkSelected = findById(findById(parentTabPanelId).getAttribute(ATTR_LABELLEDBY));
389
- var parentTabId = searchParent(e.target, TABS_JS);
390
- var parentTab = findById(parentTabId);
391
- var $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
392
- var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
393
- var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
394
- var firstLink = $parentListItems[0].querySelector('.' + TABS_JS_LISTLINK);
395
- var lastLink = $parentListItems[$parentListItems.length - 1].querySelector('.' + TABS_JS_LISTLINK);
396
-
397
- // strike up + ctrl => go to header
398
- if (e.keyCode === 38 && e.ctrlKey) {
399
- setTimeout(function () {
400
- linkSelected.focus();
401
- }, 0);
402
- e.preventDefault();
403
- }
404
- // strike pageup + ctrl => go to prev header
405
- if (e.keyCode === 33 && e.ctrlKey) {
406
- // go to header
407
- linkSelected.focus();
408
- e.preventDefault();
409
- // then previous
410
- if (firstLink.getAttribute(ATTR_SELECTED) === 'true') {
411
- unSelectLinks($parentListLinks);
412
- unSelectContents($parentListContents);
413
- selectLink(lastLink);
414
- } else {
415
- selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'prev');
416
- }
417
- }
418
- // strike pagedown + ctrl => go to next header
419
- if (e.keyCode === 34 && e.ctrlKey) {
420
- // go to header
421
- linkSelected.focus();
422
- e.preventDefault();
423
- // then next
424
- if (lastLink.getAttribute(ATTR_SELECTED) === 'true') {
425
- unSelectLinks($parentListLinks);
426
- unSelectContents($parentListContents);
427
- selectLink(firstLink);
428
- } else {
429
- selectLinkInList($parentListItems, $parentListLinks, $parentListContents, 'next');
430
- }
431
- }
432
- })();
433
- }
434
-
435
- // click on a tab link
436
- var parentLinkToPanelId = searchParent(e.target, TABS_JS_LINK_TO_TAB);
437
- if ((hasClass(e.target, TABS_JS_LINK_TO_TAB) === true || parentLinkToPanelId !== '') && eventName === 'click') {
438
- var panelSelectedId = hasClass(e.target, TABS_JS_LINK_TO_TAB) === true ? e.target.getAttribute('href').replace('#', '') : findById(parentLinkToPanelId).replace('#', '');
439
- var panelSelected = findById(panelSelectedId);
440
- var buttonPanelSelected = findById(panelSelected.getAttribute(ATTR_LABELLEDBY));
441
- var parentTabId = searchParent(e.target, TABS_JS);
442
- var parentTab = findById(parentTabId);
443
- //let $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
444
- var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
445
- var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
446
-
447
- unSelectLinks($parentListLinks);
448
- unSelectContents($parentListContents);
449
- selectLink(buttonPanelSelected);
432
+ })();
433
+ }
450
434
 
451
- e.preventDefault();
452
- }
453
- }, true);
454
- });
455
- };
435
+ // click on a tab link
436
+ var parentLinkToPanelId = searchParent(e.target, TABS_JS_LINK_TO_TAB);
437
+ if ((hasClass(e.target, TABS_JS_LINK_TO_TAB) === true || parentLinkToPanelId !== '') && eventName === 'click') {
438
+ var panelSelectedId = hasClass(e.target, TABS_JS_LINK_TO_TAB) === true ? e.target.getAttribute('href').replace('#', '') : findById(parentLinkToPanelId).replace('#', '');
439
+ var panelSelected = findById(panelSelectedId);
440
+ var buttonPanelSelected = findById(panelSelected.getAttribute(ATTR_LABELLEDBY));
441
+ var parentTabId = searchParent(e.target, TABS_JS);
442
+ var parentTab = findById(parentTabId);
443
+ //let $parentListItems = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTITEM));
444
+ var $parentListLinks = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_LISTLINK));
445
+ var $parentListContents = [].slice.call(parentTab.querySelectorAll('.' + TABS_JS_CONTENT));
446
+
447
+ unSelectLinks($parentListLinks);
448
+ unSelectContents($parentListContents);
449
+ selectLink(buttonPanelSelected);
450
+
451
+ e.preventDefault();
452
+ }
453
+ }, true);
454
+ });
456
455
 
457
456
  var onLoad = function onLoad() {
458
457
  attach();
459
- bindListeners();
460
458
  document.removeEventListener('DOMContentLoaded', onLoad);
461
459
  };
462
460
 
463
461
  document.addEventListener('DOMContentLoaded', onLoad);
464
462
 
465
- window.van11yAccessibleTabPanelAria = attach;
463
+ window.sibuVan11yAccessibleTabPanelAria = attach;
466
464
  })(document);