sibu 0.7.3 → 0.8.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 667c4b9cf1f4ef1bd0e3a7713df142d23bf429d4
4
- data.tar.gz: 481f1264b52f5a2591035ba55a2239988f293815
3
+ metadata.gz: d1e386778852e44a0751ec065d259a3d02423e04
4
+ data.tar.gz: 63734db5d138f1a863428a8990c8abc901c6dbce
5
5
  SHA512:
6
- metadata.gz: 850463b883dfd41aa0b048cfaccca4af385f6ef2f725189e15ecfb047e10da872442b19f4a14c9545549cddc1dbc6a7d6c7ed922883fa7b18fd60739c7d1e0ec
7
- data.tar.gz: e702dda5a7578bc2655c568b6a4602ef43af759293de983e53a44b1cf21fb0e879030369ff7a9c3e0b09d0ff2ef00ef9c867da4229b0b0265e6653c414d14fb0
6
+ metadata.gz: e82342f402b119115ed0fa6e76c2c1ba819847022ccb0ab45e890d8ddcc171b792b95287b99004b4b2c02122f152e1210f85677dff984e922beb4144b8c5a8cc
7
+ data.tar.gz: 168e70cca77e87181e289a5e624bfe60eadca752d35d95c80f31b66b4d68af3ba89409822fe1caadf1182e7af1ac3f767491051b27de47fada7ae950a08af645
@@ -2,6 +2,7 @@
2
2
  //= require jquery_ujs
3
3
  //= require sibu/common
4
4
  //= require ../quill/quill
5
+ //= require ../tabs/van11y-accessible-tab-panel-aria
5
6
  //= require_self
6
7
 
7
8
  var Inline = Quill.import('blots/inline');
@@ -116,7 +117,6 @@ function initCustomCenter() {
116
117
  var rect = e.target.getBoundingClientRect();
117
118
  var x = e.clientX - rect.left;
118
119
  var y = e.clientY - rect.top;
119
- console.log('x : ' + x + ' - y : ' + y);
120
120
  centerPos.css("top", y + "px");
121
121
  centerPos.css("left", x + "px");
122
122
  $("#element_class").val(`posx_${Math.floor((x / rect.width) * 10) * 10} posy_${Math.floor((y / rect.height) * 10) * 10}`);
@@ -138,32 +138,6 @@ function displayCurrentCenter(img, centerPos) {
138
138
  centerPos.show();
139
139
  }
140
140
 
141
-
142
- //function initCropper(imgId) {
143
- // var wrapper = $(".sibu_crop").first();
144
- // var srcImg = $("#content_panel").find(".sb-editing img[data-id='" + imgId + "']").first();
145
- // var srcContainer = srcImg.parent();
146
- // var ratio = parseFloat(srcContainer.css("width")) / parseFloat(wrapper.css("width"));
147
- // var wrapperHeight = Math.min(320, parseFloat(srcContainer.css("height")) / ratio) + "px";
148
- // wrapper.css("height", wrapperHeight);
149
- // return new Cropper(wrapper.find("img")[0], {
150
- // crop: function(event) {
151
- // var data = event.detail;
152
- // var cropper = this.cropper;
153
- // var imageData = cropper.getImageData();
154
- // var previewWidth = parseFloat(srcContainer.css("width"));
155
- // var imageScaledRatio = data.width / previewWidth;
156
- // var width = imageData.naturalWidth / imageScaledRatio + 'px';
157
- // var height = imageData.naturalHeight / imageScaledRatio + 'px';
158
- // var marginLeft = -data.x / imageScaledRatio + 'px';
159
- // var marginTop = -data.y / imageScaledRatio + 'px';
160
- // // console.log("crop detail : " + JSON.stringify(data));
161
- // // console.log('img data : ' + JSON.stringify(imageData));
162
- // $("#element_style").val("width: " + width + "; height: " + height + "; margin-left: " + marginLeft + "; margin-top: " + marginTop +"; max-width: none; max-height: none;");
163
- // }
164
- // });
165
- //}
166
-
167
141
  function refreshAfterEdit(reload, sectionId) {
168
142
  var baseUrl = window.location.href.split('?')[0];
169
143
  if (reload) {
@@ -175,4 +149,8 @@ function refreshAfterEdit(reload, sectionId) {
175
149
  } else {
176
150
  window.history.replaceState(null, null, window.location.pathname);
177
151
  }
152
+ }
153
+
154
+ function initSectionsPanel() {
155
+
178
156
  }
@@ -0,0 +1,466 @@
1
+ /*
2
+ * ES2015 accessible tabs panel system, using ARIA
3
+ * Website: https://van11y.net/accessible-tab-panel/
4
+ * License MIT: https://github.com/nico3333fr/van11y-accessible-tab-panel-aria/blob/master/LICENSE
5
+ */
6
+ 'use strict';
7
+
8
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
+
10
+ (function (doc) {
11
+
12
+ 'use strict';
13
+
14
+ var TABS_JS = 'js-tabs';
15
+ var TABS_JS_LIST = 'js-tablist';
16
+ var TABS_JS_LISTITEM = 'js-tablist__item';
17
+ var TABS_JS_LISTLINK = 'js-tablist__link';
18
+ var TABS_JS_CONTENT = 'js-tabcontent';
19
+ var TABS_JS_LINK_TO_TAB = 'js-link-to-tab';
20
+
21
+ var TABS_DATA_PREFIX_CLASS = 'data-tabs-prefix-class';
22
+ var TABS_DATA_HX = 'data-hx';
23
+ var TABS_DATA_GENERATED_HX_CLASS = 'data-tabs-generated-hx-class';
24
+ var TABS_DATA_EXISTING_HX = 'data-existing-hx';
25
+
26
+ var TABS_DATA_SELECTED_TAB = 'data-selected';
27
+
28
+ var TABS_PREFIX_IDS = 'label_';
29
+
30
+ var TABS_STYLE = 'tabs';
31
+ var TABS_LIST_STYLE = 'tabs__list';
32
+ var TABS_LISTITEM_STYLE = 'tabs__item';
33
+ var TABS_LINK_STYLE = 'tabs__link';
34
+ var TABS_CONTENT_STYLE = 'tabs__content';
35
+
36
+ var TABS_HX_DEFAULT_CLASS = 'invisible';
37
+
38
+ var TABS_ROLE_TABLIST = 'tablist';
39
+ var TABS_ROLE_TAB = 'tab';
40
+ var TABS_ROLE_TABPANEL = 'tabpanel';
41
+ var TABS_ROLE_PRESENTATION = 'presentation';
42
+
43
+ var ATTR_ROLE = 'role';
44
+ var ATTR_LABELLEDBY = 'aria-labelledby';
45
+ var ATTR_HIDDEN = 'aria-hidden';
46
+ var ATTR_CONTROLS = 'aria-controls';
47
+ var ATTR_SELECTED = 'aria-selected';
48
+
49
+ var DELAY_HASH_UPDATE = 1000;
50
+
51
+ var hash = window.location.hash.replace('#', '');
52
+
53
+ //const IS_OPENED_CLASS = 'is-opened';
54
+
55
+ var findById = function findById(id) {
56
+ return doc.getElementById(id);
57
+ };
58
+
59
+ var addClass = function addClass(el, className) {
60
+ if (el.classList) {
61
+ el.classList.add(className); // IE 10+
62
+ } else {
63
+ el.className += ' ' + className; // IE 8+
64
+ }
65
+ };
66
+
67
+ /*const removeClass = (el, className) => {
68
+ if (el.classList) {
69
+ el.classList.remove(className); // IE 10+
70
+ }
71
+ else {
72
+ el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); // IE 8+
73
+ }
74
+ }*/
75
+
76
+ var hasClass = function hasClass(el, className) {
77
+ if (el.classList) {
78
+ return el.classList.contains(className); // IE 10+
79
+ } else {
80
+ return new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className); // IE 8+ ?
81
+ }
82
+ };
83
+
84
+ var setAttributes = function setAttributes(node, attrs) {
85
+ Object.keys(attrs).forEach(function (attribute) {
86
+ node.setAttribute(attribute, attrs[attribute]);
87
+ });
88
+ };
89
+ var unSelectLinks = function unSelectLinks(elts) {
90
+ elts.forEach(function (link_node) {
91
+ var _setAttributes;
92
+
93
+ setAttributes(link_node, (_setAttributes = {}, _defineProperty(_setAttributes, ATTR_SELECTED, 'false'), _defineProperty(_setAttributes, 'tabindex', '-1'), _setAttributes));
94
+ });
95
+ };
96
+ var unSelectContents = function unSelectContents(elts) {
97
+ elts.forEach(function (content_node) {
98
+ content_node.setAttribute(ATTR_HIDDEN, true);
99
+ });
100
+ };
101
+
102
+ var selectLink = function selectLink(el) {
103
+ var _setAttributes2;
104
+
105
+ var destination = findById(el.getAttribute(ATTR_CONTROLS));
106
+ setAttributes(el, (_setAttributes2 = {}, _defineProperty(_setAttributes2, ATTR_SELECTED, 'true'), _defineProperty(_setAttributes2, 'tabindex', '0'), _setAttributes2));
107
+ destination.removeAttribute(ATTR_HIDDEN);
108
+ setTimeout(function () {
109
+ el.focus();
110
+ }, 0);
111
+ // Note : removed to prevent conflicts when editing sibu elements
112
+ // setTimeout(function () {
113
+ // history.pushState(null, null, location.pathname + location.search + '#' + el.getAttribute(ATTR_CONTROLS));
114
+ // }, DELAY_HASH_UPDATE);
115
+ };
116
+
117
+ var selectLinkInList = function selectLinkInList(itemsList, linkList, contentList, param) {
118
+ var indice_trouve = undefined;
119
+
120
+ itemsList.forEach(function (itemNode, index) {
121
+ if (itemNode.querySelector('.' + TABS_JS_LISTLINK).getAttribute(ATTR_SELECTED) === 'true') {
122
+ indice_trouve = index;
123
+ }
124
+ });
125
+ unSelectLinks(linkList);
126
+ unSelectContents(contentList);
127
+ if (param === 'next') {
128
+ selectLink(linkList[indice_trouve + 1]);
129
+ setTimeout(function () {
130
+ linkList[indice_trouve + 1].focus();
131
+ }, 0);
132
+ }
133
+ if (param === 'prev') {
134
+ selectLink(linkList[indice_trouve - 1]);
135
+ setTimeout(function () {
136
+ linkList[indice_trouve - 1].focus();
137
+ }, 0);
138
+ }
139
+ };
140
+
141
+ /* gets an element el, search if it is child of parent class, returns id of the parent */
142
+ var searchParent = function searchParent(el, parentClass) {
143
+ var found = false;
144
+ var parentElement = el.parentNode;
145
+ while (parentElement && found === false) {
146
+ if (hasClass(parentElement, parentClass) === true) {
147
+ found = true;
148
+ } else {
149
+ parentElement = parentElement.parentNode;
150
+ }
151
+ }
152
+ if (found === true) {
153
+ return parentElement.getAttribute('id');
154
+ } else {
155
+ return '';
156
+ }
157
+ };
158
+
159
+ /** Find all tabs inside a container
160
+ * @param {Node} node Default document
161
+ * @return {Array}
162
+ */
163
+ var $listTabs = function $listTabs() {
164
+ var node = arguments.length <= 0 || arguments[0] === undefined ? doc : arguments[0];
165
+ return [].slice.call(node.querySelectorAll('.' + TABS_JS));
166
+ };
167
+
168
+ /**
169
+ * Build tooltips for a container
170
+ * @param {Node} node
171
+ */
172
+ var attach = function attach(node) {
173
+
174
+ $listTabs(node).forEach(function (tabs_node) {
175
+
176
+ var iLisible = Math.random().toString(32).slice(2, 12);
177
+ var prefixClassName = tabs_node.hasAttribute(TABS_DATA_PREFIX_CLASS) === true ? tabs_node.getAttribute(TABS_DATA_PREFIX_CLASS) + '-' : '';
178
+ var hx = tabs_node.hasAttribute(TABS_DATA_HX) === true ? tabs_node.getAttribute(TABS_DATA_HX) : '';
179
+ var hxGeneratedClass = tabs_node.hasAttribute(TABS_DATA_GENERATED_HX_CLASS) === true ? tabs_node.getAttribute(TABS_DATA_GENERATED_HX_CLASS) : TABS_HX_DEFAULT_CLASS;
180
+ 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));
185
+ var noTabSelected = true;
186
+
187
+ // container
188
+ addClass(tabs_node, prefixClassName + TABS_STYLE);
189
+ tabs_node.setAttribute('id', TABS_STYLE + iLisible);
190
+
191
+ // ul
192
+ $tabList.forEach(function (tabList) {
193
+ var _setAttributes3;
194
+
195
+ addClass(tabList, prefixClassName + TABS_LIST_STYLE);
196
+ setAttributes(tabList, (_setAttributes3 = {}, _defineProperty(_setAttributes3, ATTR_ROLE, TABS_ROLE_TABLIST), _defineProperty(_setAttributes3, 'id', TABS_LIST_STYLE + iLisible), _setAttributes3));
197
+ });
198
+ // li
199
+ $tabListItems.forEach(function (tabListItem, index) {
200
+ var _setAttributes4;
201
+
202
+ addClass(tabListItem, prefixClassName + TABS_LISTITEM_STYLE);
203
+ setAttributes(tabListItem, (_setAttributes4 = {}, _defineProperty(_setAttributes4, ATTR_ROLE, TABS_ROLE_PRESENTATION), _defineProperty(_setAttributes4, 'id', TABS_LISTITEM_STYLE + iLisible + '-' + (index + 1)), _setAttributes4));
204
+ });
205
+ // a
206
+ $tabListLinks.forEach(function (tabListLink) {
207
+ var _setAttributes5, _setAttributes6;
208
+
209
+ var idHref = tabListLink.getAttribute("href").replace('#', '');
210
+ var panelControlled = findById(idHref);
211
+ var linkText = tabListLink.innerText;
212
+ var panelSelected = tabListLink.hasAttribute(TABS_DATA_SELECTED_TAB) === true;
213
+
214
+ addClass(tabListLink, prefixClassName + TABS_LINK_STYLE);
215
+ setAttributes(tabListLink, (_setAttributes5 = {
216
+ 'id': TABS_PREFIX_IDS + idHref
217
+ }, _defineProperty(_setAttributes5, ATTR_ROLE, TABS_ROLE_TAB), _defineProperty(_setAttributes5, ATTR_CONTROLS, idHref), _defineProperty(_setAttributes5, 'tabindex', '-1'), _defineProperty(_setAttributes5, ATTR_SELECTED, 'false'), _setAttributes5));
218
+
219
+ // panel controlled
220
+ setAttributes(panelControlled, (_setAttributes6 = {}, _defineProperty(_setAttributes6, ATTR_HIDDEN, 'true'), _defineProperty(_setAttributes6, ATTR_ROLE, TABS_ROLE_TABPANEL), _defineProperty(_setAttributes6, ATTR_LABELLEDBY, TABS_PREFIX_IDS + idHref), _setAttributes6));
221
+ addClass(panelControlled, prefixClassName + TABS_CONTENT_STYLE);
222
+
223
+ // if already selected
224
+ if (panelSelected && noTabSelected) {
225
+ noTabSelected = false;
226
+ setAttributes(tabListLink, _defineProperty({
227
+ 'tabindex': '0'
228
+ }, ATTR_SELECTED, 'true'));
229
+ setAttributes(panelControlled, _defineProperty({}, ATTR_HIDDEN, 'false'));
230
+ }
231
+
232
+ // hx
233
+ if (hx !== '') {
234
+ var hx_node = document.createElement(hx);
235
+ hx_node.setAttribute('class', hxGeneratedClass);
236
+ hx_node.setAttribute('tabindex', '0');
237
+ hx_node.innerHTML = linkText;
238
+ panelControlled.insertBefore(hx_node, panelControlled.firstChild);
239
+ }
240
+ // existingHx
241
+
242
+ if (existingHx !== '') {
243
+ var $hx_existing = [].slice.call(panelControlled.querySelectorAll(existingHx + ':first-child'));
244
+ $hx_existing.forEach(function (hx_item) {
245
+ hx_item.setAttribute('tabindex', '0');
246
+ });
247
+ }
248
+
249
+ tabListLink.removeAttribute('href');
250
+ });
251
+
252
+ if (hash !== '') {
253
+ var nodeHashed = findById(hash);
254
+ if (nodeHashed !== null) {
255
+ // just in case of an dumb error
256
+ // search if hash is current tabs_node
257
+ if (tabs_node.querySelector('#' + hash) !== null) {
258
+ // search if hash is ON tabs
259
+ if (hasClass(nodeHashed, TABS_JS_CONTENT) === true) {
260
+ // unselect others
261
+ unSelectLinks($tabListLinks);
262
+ unSelectContents($tabListPanels);
263
+ // select this one
264
+ nodeHashed.removeAttribute(ATTR_HIDDEN);
265
+ var linkHashed = findById(TABS_PREFIX_IDS + hash);
266
+ setAttributes(linkHashed, _defineProperty({
267
+ 'tabindex': '0'
268
+ }, ATTR_SELECTED, 'true'));
269
+ noTabSelected = false;
270
+ } else {
271
+ // search if hash is IN tabs
272
+ var panelParentId = searchParent(nodeHashed, TABS_JS_CONTENT);
273
+ if (panelParentId !== '') {
274
+ // unselect others
275
+ unSelectLinks($tabListLinks);
276
+ unSelectContents($tabListPanels);
277
+ // select this one
278
+ var panelParent = findById(panelParentId);
279
+ panelParent.removeAttribute(ATTR_HIDDEN);
280
+ var linkParent = findById(TABS_PREFIX_IDS + panelParentId);
281
+ setAttributes(linkParent, _defineProperty({
282
+ 'tabindex': '0'
283
+ }, ATTR_SELECTED, 'true'));
284
+ noTabSelected = false;
285
+ }
286
+ }
287
+ }
288
+ }
289
+ }
290
+
291
+ // if no selected => select first
292
+ if (noTabSelected === true) {
293
+ setAttributes($tabListLinks[0], _defineProperty({
294
+ 'tabindex': '0'
295
+ }, ATTR_SELECTED, 'true'));
296
+ var panelFirst = findById($tabListLinks[0].getAttribute(ATTR_CONTROLS));
297
+ panelFirst.removeAttribute(ATTR_HIDDEN);
298
+ }
299
+ });
300
+ };
301
+
302
+ /* listeners */
303
+ var bindListeners = function() {
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
+ }
328
+
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);
345
+
346
+ e.preventDefault();
347
+ }
348
+ // strike end on a tab => last tab
349
+ else if (e.keyCode === 35) {
350
+ unSelectLinks($parentListLinks);
351
+ unSelectContents($parentListContents);
352
+ selectLink(lastLink);
353
+
354
+ e.preventDefault();
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
+ }
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);
450
+
451
+ e.preventDefault();
452
+ }
453
+ }, true);
454
+ });
455
+ };
456
+
457
+ var onLoad = function onLoad() {
458
+ attach();
459
+ bindListeners();
460
+ document.removeEventListener('DOMContentLoaded', onLoad);
461
+ };
462
+
463
+ document.addEventListener('DOMContentLoaded', onLoad);
464
+
465
+ window.van11yAccessibleTabPanelAria = attach;
466
+ })(document);
@@ -255,6 +255,8 @@ $sibu-color3 : #333 !default;
255
255
  #sections_panel {
256
256
  .sibu_sections {
257
257
  padding: 2rem;
258
+ max-height: 60vh;
259
+ overflow-y: scroll;
258
260
 
259
261
  > div {
260
262
  > * {
@@ -277,6 +279,51 @@ $sibu-color3 : #333 !default;
277
279
  }
278
280
  }
279
281
  }
282
+
283
+ .tabs__list {
284
+ margin: 0;
285
+ padding: 0;
286
+ }
287
+ .tabs__item {
288
+ display: inline-block;
289
+ > a {
290
+ text-decoration: none;
291
+ }
292
+ }
293
+
294
+ .tabs__link {
295
+ display: inline-block;
296
+ cursor: pointer;
297
+ margin-bottom: -2px;
298
+ padding: 1rem 2.5rem;
299
+ border-bottom: 4px solid transparent;
300
+ color: $sibu-color1;
301
+ text-decoration: none;
302
+ border-radius: 0 0 0 0;
303
+ transition: .25s;
304
+ transition-property: color, border, background-color;
305
+ font-size: 2rem;
306
+ &:focus {
307
+ border-bottom-color: $sibu-color2;
308
+ color: $sibu-color2;
309
+ outline: 0;
310
+ }
311
+ }
312
+
313
+ [aria-selected="true"].tabs__link {
314
+ border-bottom-color: $sibu-color2;
315
+ color: $sibu-color2;
316
+ outline: 0;
317
+ }
318
+
319
+ .tabs__content {
320
+ padding: 3rem 2rem;
321
+ background-color: white;
322
+ }
323
+
324
+ [aria-hidden="true"].tabs__content {
325
+ display: none;
326
+ }
280
327
  }
281
328
 
282
329
  .sibu_actions {
@@ -63,11 +63,6 @@
63
63
  background-color: white;
64
64
  }
65
65
 
66
- #sections_panel .sibu_sections {
67
- max-height: 60vh;
68
- overflow-y: scroll;
69
- }
70
-
71
66
  #element_actions button {
72
67
  display: none;
73
68
  }
@@ -131,7 +131,7 @@ module Sibu
131
131
  @after = params[:after]
132
132
  @links = @site.pages_path_by_id
133
133
 
134
- @site.site_template.available_templates.each do |t|
134
+ @site.site_template.available_sections.each do |t|
135
135
  template_defaults = @site.site_template.templates ? (@site.site_template.templates[t["template"]] || {}) : {}
136
136
  @page.sections << template_defaults.merge(t).to_h
137
137
  end
@@ -8,7 +8,7 @@ module Sibu
8
8
  end
9
9
 
10
10
  def sections_templates
11
- @site.site_template.available_templates
11
+ @site.site_template.available_sections
12
12
  end
13
13
 
14
14
  def site_images
@@ -36,7 +36,7 @@ module Sibu
36
36
  end
37
37
 
38
38
  def section_template(section)
39
- "#{site_template.path}/#{section["template"]}"
39
+ "#{site_template.path}/#{section["category"]}/#{section["template"]}"
40
40
  end
41
41
 
42
42
  def not_found
@@ -9,9 +9,14 @@ module Sibu
9
9
  name.parameterize.gsub('-', '_')
10
10
  end
11
11
 
12
- def available_templates
13
- Dir.glob(File.join(Rails.root, "app/views/shared/#{path}/*.erb")).map {|f| f.split('/').last}
14
- .map {|f| f[1..-1].gsub('.html.erb', '')}.select {|f| f != 'site'}.map {|f| {"id" => "sibu_template_#{f}", "template" => f}}
12
+ def available_sections(path_prefix = 'app/views/shared')
13
+ sections_list = []
14
+ Dir.glob(File.join(Rails.root, "#{path_prefix}/#{path}/*/")).each do |dir|
15
+ cat = dir.split('/').last
16
+ sections_list += Dir.glob(dir + "*.erb").map {|f| f.split('/').last}.
17
+ map {|f| f[1..-1].gsub('.html.erb', '')}.map {|f| {"id" => "sibu_template_#{f}", "category" => cat, "template" => f}}
18
+ end
19
+ sections_list
15
20
  end
16
21
  end
17
22
  end
@@ -90,6 +90,13 @@
90
90
 
91
91
  function newSection(isAfter) {
92
92
  var section = $(".sb-editing").first();
93
+ var sectionsPanel = $("#sections_panel");
94
+ sectionsPanel.html(
95
+ '<div class="sibu_panel sibu_view"><h2>Choix du type de section</h2></div>' +
96
+ '<div><div class="sibu_sections sibu_site_content" style="text-align: center;">Chargement en cours...</div></div>' +
97
+ '<div class="sibu_panel sibu_view"><div class="sibu_actions"><a href="#" onclick="cancelSectionsEdit(); return false;">Annuler</a></div></div>'
98
+ );
99
+ sectionsPanel.slideDown("fast");
93
100
  $.ajax({
94
101
  url: "<%= new_section_site_page_path(@site.id, @page.id) %>",
95
102
  method: "GET",
@@ -20,7 +20,7 @@
20
20
  <p>Veuillez sélectionner une image.</p>
21
21
  <% end %>
22
22
  <div class="sibu_custom_center" style="display: <%= (@element["src"] == DEFAULT_IMG || @element["src"].blank?) ? 'none' : 'block' %>">
23
- <%= check_box_tag('custom_center', true, !@element["class"].blank?, id: 'custom_center', class: 'checkbox') %>
23
+ <%= check_box_tag('custom_center', true, (!@element["class"].blank? && @element["class"].include?('posx')), id: 'custom_center', class: 'checkbox') %>
24
24
  <%= label_tag 'custom_center', "Recentrer l'image" %>
25
25
  </div>
26
26
  <div class="sibu_center">
@@ -4,16 +4,32 @@
4
4
  </div>
5
5
  <div>
6
6
  <div class="sibu_sections sibu_site_content">
7
- <div id="<%= "#{@site.site_template.reference}_sections" %>">
8
- <% sections_templates.each do |st| %>
9
- <div data-sb-template="<%= st["template"] %>">
10
- <%= render "shared/#{@site.section_template(st)}", sec: st %>
11
- </div>
12
- <% end %>
7
+ <div id="<%= "#{@site.site_template.reference}_sections" %>" class="sibu_sections_tabs">
8
+ <% sections_by_category = sections_templates.group_by {|st| st['category']} %>
9
+ <div class="js-tabs">
10
+ <ul class="js-tablist" data-existing-hx="h3">
11
+ <% sections_by_category.keys.each do |cat| %>
12
+ <li class="js-tablist__item">
13
+ <a href="#<%= cat %>" class="js-tablist__link" data-selected="1"><%= t "sibu.section.category.#{cat}" %></a>
14
+ </li>
15
+ <% end %>
16
+ </ul>
17
+ <% sections_by_category.each_pair do |cat, sections| %>
18
+ <div id="<%= cat %>" class="js-tabcontent">
19
+ <h3 style="display: none;"><%= t "sibu.section.category.#{cat}" %></h3>
20
+ <% sections.each do |st| %>
21
+ <div data-sb-template="<%= st["template"] %>" data-sb-category="<%= st["category"] %>">
22
+ <%= render "shared/#{@site.section_template(st)}", sec: st %>
23
+ </div>
24
+ <% end %>
25
+ </div>
26
+ <% end %>
27
+ </div>
13
28
  </div>
14
29
  </div>
15
30
  <%= form_tag(create_section_site_page_path(@site.id, @page.id), method: :post, remote: true) do |f| %>
16
31
  <%= hidden_field_tag 'section[template]', '' %>
32
+ <%= hidden_field_tag 'section[category]', '' %>
17
33
  <%= hidden_field_tag :section_id, @section_id %>
18
34
  <%= hidden_field_tag :after, @after%>
19
35
  <%= hidden_field_tag :entity, @entity_type %>
@@ -46,29 +46,29 @@ editPanel.slideDown("fast", function() {
46
46
  $(this).addClass('selected');
47
47
  $("#element_src").val($(this).data("src"));
48
48
  $("#element_alt").val($(this).data("alt"));
49
- editPanel.find(".sibu_center").html('<img src="' + $("#element_src").val() + '"/>');
49
+ editPanel.find(".sibu_center").html('<img src="' + $("#element_src").val() + '"/><div id="sibu_center_pos" style="display: none;">✕</div>');
50
50
  editPanel.find(".sibu_selected_image > p:first-child").hide();
51
51
  editPanel.find(".sibu_selected_image").find(".sibu_custom_center").show();
52
52
  editPanel.find(".sibu_selected_image").find(".sibu_field").show();
53
53
  if(customCenter.is(":checked")) {
54
- customCtr = initCustomCenter();
54
+ customCenter.removeAttr("checked");
55
+ $("#element_class").val("");
56
+ $(".sibu_center").attr("style", "");
55
57
  }
56
58
  }
57
59
  });
58
60
  if(editPanel.find(".sibu_center img").size() > 0) {
59
61
  if(customCenter.is(":checked")) {
60
- customCtr = initCustomCenter("<%= @element_id %>");
62
+ initCustomCenter("<%= @element_id %>");
61
63
  }
62
64
  }
63
65
  customCenter.change(function() {
64
66
  if($(this).is(":checked")) {
65
- customCtr = initCustomCenter("<%= @element_id %>");
67
+ initCustomCenter("<%= @element_id %>");
66
68
  } else {
67
- $("#element_style").val("");
69
+ $("#element_class").val("");
68
70
  $(".sibu_center").attr("style", "");
69
- // if(cropper) {
70
- // cropper.destroy();
71
- // }
71
+ $(".sibu_center > #sibu_center_pos").hide();
72
72
  }
73
73
  });
74
74
  <% when 'link' %>
@@ -1,18 +1,19 @@
1
1
  var sectionsPanel = $("#sections_panel");
2
- sectionsPanel.html("");
3
- sectionsPanel.html("<%= j(render 'new_section_panel') %>");
4
- var sections = sectionsPanel.find(".sibu_sections [data-sb-template]");
5
- sections.click(function() {
6
- if(!$(this).hasClass('selected')) {
7
- sections.removeClass('selected');
8
- $(this).addClass('selected');
9
- $("#section_template").val($(this).data("sb-template"));
10
- }
11
- });
12
- sectionsPanel.slideDown("fast", function() {
2
+ if (sectionsPanel.size()) {
3
+ sectionsPanel.html("<%= j(render 'new_section_panel') %>");
4
+ van11yAccessibleTabPanelAria($(".sibu_sections_tabs")[0]);
5
+ var sections = sectionsPanel.find(".sibu_sections [data-sb-template]");
6
+ sections.click(function() {
7
+ if(!$(this).hasClass('selected')) {
8
+ sections.removeClass('selected');
9
+ $(this).addClass('selected');
10
+ $("#section_template").val($(this).data("sb-template"));
11
+ $("#section_category").val($(this).data("sb-category"));
12
+ }
13
+ });
13
14
  if(typeof initSectionsForm === "function") {
14
15
  initSectionsForm();
15
16
  }
16
- });
17
- document.body.style.overflow = "hidden";
18
- sibuCallback("newSection");
17
+ document.body.style.overflow = "hidden";
18
+ sibuCallback("newSection");
19
+ }
data/lib/sibu/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sibu
2
- VERSION = '0.7.3'
2
+ VERSION = '0.8.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sibu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean-Baptiste Vilain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-11 00:00:00.000000000 Z
11
+ date: 2019-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -129,6 +129,7 @@ files:
129
129
  - app/assets/javascripts/quill/quill.js
130
130
  - app/assets/javascripts/sibu/common.js
131
131
  - app/assets/javascripts/sibu/sibu.js.erb
132
+ - app/assets/javascripts/tabs/van11y-accessible-tab-panel-aria.js
132
133
  - app/assets/stylesheets/cropper/cropper.css
133
134
  - app/assets/stylesheets/quill/quill.snow.css
134
135
  - app/assets/stylesheets/sibu/defaults.scss