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.
- checksums.yaml +4 -4
- data/README.md +81 -4
- data/app/assets/javascripts/sibu/sibu.js.erb +17 -3
- data/app/assets/javascripts/tabs/van11y-accessible-tab-panel-aria.js +122 -124
- data/app/assets/stylesheets/sibu/defaults.scss +76 -80
- data/app/assets/stylesheets/sibu/sibu.css +8 -0
- data/app/controllers/sibu/application_controller.rb +8 -0
- data/app/controllers/sibu/pages_controller.rb +11 -4
- data/app/controllers/sibu/sites_controller.rb +4 -0
- data/app/helpers/sibu/application_helper.rb +1 -1
- data/app/helpers/sibu/pages_helper.rb +104 -23
- data/app/models/sibu/page.rb +3 -3
- data/app/models/sibu/site.rb +15 -1
- data/app/models/sibu/site_template.rb +1 -1
- data/app/views/layouts/sibu/edit_content.html.erb +184 -125
- data/app/views/sibu/images/edit.js.erb +5 -3
- data/app/views/sibu/pages/_code_edit_panel.html.erb +3 -2
- data/app/views/sibu/pages/_form.html.erb +8 -0
- data/app/views/sibu/pages/_link_edit_panel.html.erb +6 -6
- data/app/views/sibu/pages/_map_edit_panel.html.erb +3 -2
- data/app/views/sibu/pages/_media_edit_panel.html.erb +6 -6
- data/app/views/sibu/pages/_new_section_panel.html.erb +1 -1
- data/app/views/sibu/pages/_paragraph_edit_panel.html.erb +2 -2
- data/app/views/sibu/pages/_text_edit_panel.html.erb +2 -2
- data/app/views/sibu/pages/child_element.js.erb +2 -2
- data/app/views/sibu/pages/clone_element.js.erb +2 -2
- data/app/views/sibu/pages/create_section.js.erb +1 -1
- data/app/views/sibu/pages/delete_element.js.erb +1 -1
- data/app/views/sibu/pages/delete_section.js.erb +1 -1
- data/app/views/sibu/pages/edit_element.js.erb +68 -66
- data/app/views/sibu/pages/edit_section.js.erb +6 -5
- data/app/views/sibu/pages/index.html.erb +2 -2
- data/app/views/sibu/pages/new_section.js.erb +22 -13
- data/app/views/sibu/pages/update_element.js.erb +2 -2
- data/app/views/sibu/pages/update_section.js.erb +3 -3
- data/config/initializers/constants.rb +5 -3
- data/db/migrate/20200401130601_add_ref_to_site_templates.rb +5 -0
- data/lib/sibu/engine.rb +0 -2
- data/lib/sibu/version.rb +1 -1
- metadata +3 -18
- data/app/views/sibu/pages/destroy.html.erb +0 -2
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b274fec919e722e48ba571e1ee3379f037af6372
|
4
|
+
data.tar.gz: 4da5793bc66501214bbb5c9a5a38b00890b4754e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '085bf4d2059a0f51494b062332fa6c9e9ada4313d6be6c4ee4799c8f0418d0fc4967d1c2ac967e7f750651866abb1fb249997e6f10e71d067c912fb5ecb5081e'
|
7
|
+
data.tar.gz: f26e18f34db37e935cdf4f891fa7033bc585a78421f32b950974460f1a777e97174cf8b728b9f95c452c6d2ffdd7fff2e82e2fbe6163e235fd5633cd0b250f88
|
data/README.md
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
-
# Sibu
|
2
|
-
|
3
|
-
|
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
|
-
|
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
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
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
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
330
|
-
|
331
|
-
|
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
|
341
|
-
if (e.keyCode ===
|
342
|
-
|
343
|
-
|
344
|
-
|
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
|
349
|
-
|
350
|
-
|
351
|
-
|
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
|
370
|
-
|
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
|
-
|
452
|
-
|
453
|
-
|
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.
|
463
|
+
window.sibuVan11yAccessibleTabPanelAria = attach;
|
466
464
|
})(document);
|