nexmo-oas-renderer 2.1.1
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 +7 -0
- data/.env.example +1 -0
- data/.github/workflows/push-docker-publish.yml +19 -0
- data/.gitignore +6 -0
- data/.rspec +1 -0
- data/.rubocop.yml +135 -0
- data/.travis.yml +9 -0
- data/CHANGELOG.md +58 -0
- data/CONTRIBUTING.md +46 -0
- data/Dockerfile +6 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +248 -0
- data/LICENSE.txt +21 -0
- data/README.md +103 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/nexmo-oas-renderer +5 -0
- data/lib/nexmo/oas/engine.rb +11 -0
- data/lib/nexmo/oas/renderer.rb +13 -0
- data/lib/nexmo/oas/renderer/app.rb +201 -0
- data/lib/nexmo/oas/renderer/config.ru +9 -0
- data/lib/nexmo/oas/renderer/config/code_languages.yml +138 -0
- data/lib/nexmo/oas/renderer/config/dynamic_content.yml +1 -0
- data/lib/nexmo/oas/renderer/decorators/response_parser_decorator.rb +55 -0
- data/lib/nexmo/oas/renderer/helpers/navigation.rb +66 -0
- data/lib/nexmo/oas/renderer/helpers/render.rb +25 -0
- data/lib/nexmo/oas/renderer/helpers/summary.rb +33 -0
- data/lib/nexmo/oas/renderer/helpers/url.rb +19 -0
- data/lib/nexmo/oas/renderer/presenters/api_specification.rb +54 -0
- data/lib/nexmo/oas/renderer/presenters/endpoint.rb +21 -0
- data/lib/nexmo/oas/renderer/presenters/groups.rb +39 -0
- data/lib/nexmo/oas/renderer/presenters/navigation.rb +26 -0
- data/lib/nexmo/oas/renderer/presenters/open_api_specification.rb +62 -0
- data/lib/nexmo/oas/renderer/presenters/request_body_raw.rb +141 -0
- data/lib/nexmo/oas/renderer/presenters/response_format.rb +29 -0
- data/lib/nexmo/oas/renderer/presenters/response_tab/link.rb +36 -0
- data/lib/nexmo/oas/renderer/presenters/response_tab/panel.rb +45 -0
- data/lib/nexmo/oas/renderer/presenters/response_tabs.rb +58 -0
- data/lib/nexmo/oas/renderer/presenters/versions.rb +51 -0
- data/lib/nexmo/oas/renderer/public/500.html +66 -0
- data/lib/nexmo/oas/renderer/public/assets/images/brands/android.svg +1 -0
- data/lib/nexmo/oas/renderer/public/assets/images/brands/curl.svg +1 -0
- data/lib/nexmo/oas/renderer/public/assets/images/brands/dotnet.svg +1 -0
- data/lib/nexmo/oas/renderer/public/assets/images/brands/ios.svg +1 -0
- data/lib/nexmo/oas/renderer/public/assets/images/brands/java.svg +1 -0
- data/lib/nexmo/oas/renderer/public/assets/images/brands/javascript.svg +1 -0
- data/lib/nexmo/oas/renderer/public/assets/images/brands/node.svg +1 -0
- data/lib/nexmo/oas/renderer/public/assets/images/brands/php.svg +1 -0
- data/lib/nexmo/oas/renderer/public/assets/images/brands/python.svg +11 -0
- data/lib/nexmo/oas/renderer/public/assets/images/brands/ruby.svg +1 -0
- data/lib/nexmo/oas/renderer/public/assets/images/lost.svg +37 -0
- data/lib/nexmo/oas/renderer/public/assets/javascripts/components/format.js +47 -0
- data/lib/nexmo/oas/renderer/public/assets/javascripts/nexmo-oas-renderer.js +65 -0
- data/lib/nexmo/oas/renderer/public/assets/javascripts/popper.min.js +5 -0
- data/lib/nexmo/oas/renderer/public/assets/javascripts/prism.js +22 -0
- data/lib/nexmo/oas/renderer/public/assets/javascripts/tooltip.min.js +5 -0
- data/lib/nexmo/oas/renderer/public/assets/javascripts/volta.accordion.js +307 -0
- data/lib/nexmo/oas/renderer/public/assets/javascripts/volta.core.js +230 -0
- data/lib/nexmo/oas/renderer/public/assets/javascripts/volta.modal.js +300 -0
- data/lib/nexmo/oas/renderer/public/assets/javascripts/volta.tabs.js +143 -0
- data/lib/nexmo/oas/renderer/public/assets/javascripts/volta.tooltip.js +76 -0
- data/lib/nexmo/oas/renderer/public/assets/stylesheets/nexmo-oas-renderer.css +287 -0
- data/lib/nexmo/oas/renderer/public/assets/stylesheets/nexmo-oas-renderer.css.map +7 -0
- data/lib/nexmo/oas/renderer/public/assets/stylesheets/sass/api.scss +341 -0
- data/lib/nexmo/oas/renderer/public/assets/stylesheets/sass/mediaqueries.scss +48 -0
- data/lib/nexmo/oas/renderer/public/assets/stylesheets/sass/style.scss +6 -0
- data/lib/nexmo/oas/renderer/public/assets/stylesheets/sass/themes/dark.scss +89 -0
- data/lib/nexmo/oas/renderer/public/assets/stylesheets/sass/themes/light.scss +68 -0
- data/lib/nexmo/oas/renderer/public/assets/stylesheets/sass/variables.scss +91 -0
- data/lib/nexmo/oas/renderer/public/assets/stylesheets/volta-prism.min.css +1 -0
- data/lib/nexmo/oas/renderer/public/assets/stylesheets/volta.min.css +1 -0
- data/lib/nexmo/oas/renderer/public/assets/symbol/volta-icons.svg +1 -0
- data/lib/nexmo/oas/renderer/public/favicon.ico +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-Regular.eot +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-Regular.ttf +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-Regular.woff +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-Regular.woff2 +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiBold.eot +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiBold.ttf +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiBold.woff +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiBold.woff2 +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiMonoSemiBold.eot +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiMonoSemiBold.ttf +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiMonoSemiBold.woff +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-SemiMonoSemiBold.woff2 +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-WideMedium.eot +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-WideMedium.ttf +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-WideMedium.woff +0 -0
- data/lib/nexmo/oas/renderer/public/fonts/Spezia-WideMedium.woff2 +0 -0
- data/lib/nexmo/oas/renderer/services/oas_parser.rb +23 -0
- data/lib/nexmo/oas/renderer/services/open_api_definition_resolver.rb +35 -0
- data/lib/nexmo/oas/renderer/version.rb +9 -0
- data/lib/nexmo/oas/renderer/views/api/index.erb +19 -0
- data/lib/nexmo/oas/renderer/views/api/show.erb +1 -0
- data/lib/nexmo/oas/renderer/views/concepts/list/plain.html.erb +5 -0
- data/lib/nexmo/oas/renderer/views/layouts/_head.erb +6 -0
- data/lib/nexmo/oas/renderer/views/layouts/_javascripts.erb +14 -0
- data/lib/nexmo/oas/renderer/views/layouts/api.erb +23 -0
- data/lib/nexmo/oas/renderer/views/layouts/open_api.erb +12 -0
- data/lib/nexmo/oas/renderer/views/open_api/_auth.erb +74 -0
- data/lib/nexmo/oas/renderer/views/open_api/_available_endpoints.erb +25 -0
- data/lib/nexmo/oas/renderer/views/open_api/_callback.erb +5 -0
- data/lib/nexmo/oas/renderer/views/open_api/_callback_endpoint.erb +38 -0
- data/lib/nexmo/oas/renderer/views/open_api/_callbacks.erb +5 -0
- data/lib/nexmo/oas/renderer/views/open_api/_code_examples.erb +16 -0
- data/lib/nexmo/oas/renderer/views/open_api/_endpoint.erb +54 -0
- data/lib/nexmo/oas/renderer/views/open_api/_header.erb +71 -0
- data/lib/nexmo/oas/renderer/views/open_api/_model.erb +43 -0
- data/lib/nexmo/oas/renderer/views/open_api/_navigation.erb +68 -0
- data/lib/nexmo/oas/renderer/views/open_api/_parameter_groups.erb +56 -0
- data/lib/nexmo/oas/renderer/views/open_api/_parameters.erb +115 -0
- data/lib/nexmo/oas/renderer/views/open_api/_request_json.erb +4 -0
- data/lib/nexmo/oas/renderer/views/open_api/_request_one_of.erb +70 -0
- data/lib/nexmo/oas/renderer/views/open_api/_request_single.erb +53 -0
- data/lib/nexmo/oas/renderer/views/open_api/_requests.erb +22 -0
- data/lib/nexmo/oas/renderer/views/open_api/_response_description_parameters.erb +130 -0
- data/lib/nexmo/oas/renderer/views/open_api/_response_descriptions.erb +45 -0
- data/lib/nexmo/oas/renderer/views/open_api/_response_fields.erb +3 -0
- data/lib/nexmo/oas/renderer/views/open_api/_response_tabs.erb +18 -0
- data/lib/nexmo/oas/renderer/views/open_api/_responses.erb +51 -0
- data/lib/nexmo/oas/renderer/views/open_api/_tabbed_parameters.erb +64 -0
- data/lib/nexmo/oas/renderer/views/open_api/_tabbed_single_parameter.erb +56 -0
- data/lib/nexmo/oas/renderer/views/open_api/_webhooks.erb +30 -0
- data/lib/nexmo/oas/renderer/views/open_api/show.erb +26 -0
- data/lib/nexmo/oas/renderer/views/static/404.erb +6 -0
- data/nexmo-oas-renderer.gemspec +51 -0
- metadata +397 -0
@@ -0,0 +1,300 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2001-present, Vonage.
|
3
|
+
*
|
4
|
+
* Modals (requires core)
|
5
|
+
*/
|
6
|
+
|
7
|
+
'use strict';
|
8
|
+
|
9
|
+
Volta.modal = function () {
|
10
|
+
var _class = {
|
11
|
+
auto: 'Vlt-modal--auto',
|
12
|
+
bodyModalOpen: 'Vlt-body--modal-open',
|
13
|
+
cancel: 'Vlt-modal__cancel',
|
14
|
+
confirm: 'Vlt-modal__confirm',
|
15
|
+
content: 'Vlt-modal__content',
|
16
|
+
modal: 'Vlt-modal',
|
17
|
+
out: 'Vlt-modal--out',
|
18
|
+
panel: 'Vlt-modal__panel',
|
19
|
+
trigger: 'Vlt-modal-trigger',
|
20
|
+
visible: 'Vlt-modal_visible',
|
21
|
+
dismiss: 'Vlt-modal__dismiss',
|
22
|
+
}
|
23
|
+
|
24
|
+
var body,
|
25
|
+
dismissModalHandler,
|
26
|
+
cancelModalHandler,
|
27
|
+
confirmModalHandler,
|
28
|
+
escHandler,
|
29
|
+
clickHandler,
|
30
|
+
escAttached;
|
31
|
+
|
32
|
+
function Modal() {}
|
33
|
+
|
34
|
+
Modal.prototype = {
|
35
|
+
attachButtons: function() {
|
36
|
+
var _this = this;
|
37
|
+
_this.dismissBtn = _this.modal.querySelector('.' + _class.dismiss);
|
38
|
+
|
39
|
+
if(_this.dismissBtn) {
|
40
|
+
dismissModalHandler = dismissModal.bind(_this);
|
41
|
+
_this.dismissBtn.addEventListener('click', dismissModalHandler);
|
42
|
+
}
|
43
|
+
|
44
|
+
_this.cancelBtn = _this.modal.querySelector('.' + _class.cancel);
|
45
|
+
|
46
|
+
if(_this.cancelBtn) {
|
47
|
+
cancelModalHandler = cancelModal.bind(_this);
|
48
|
+
_this.cancelBtn.addEventListener('click', cancelModalHandler);
|
49
|
+
}
|
50
|
+
|
51
|
+
_this.confirmBtn = _this.modal.querySelector('.' + _class.confirm);
|
52
|
+
|
53
|
+
if(_this.confirmBtn) {
|
54
|
+
confirmModalHandler = confirmModal.bind(_this);
|
55
|
+
_this.confirmBtn.addEventListener('click', confirmModalHandler);
|
56
|
+
}
|
57
|
+
},
|
58
|
+
html: function(newHtml) {
|
59
|
+
this.modal.innerHTML = newHtml;
|
60
|
+
return this;
|
61
|
+
},
|
62
|
+
init: function(elementOrId) {
|
63
|
+
if(elementOrId.length) {
|
64
|
+
this.modal = document.querySelector('#' + elementOrId);
|
65
|
+
} else {
|
66
|
+
this.modal = elementOrId;
|
67
|
+
}
|
68
|
+
|
69
|
+
this._callback = Volta._getFunction(this.modal.dataset.callback);
|
70
|
+
},
|
71
|
+
open: function(e) {
|
72
|
+
if(e && e.preventDefault) {
|
73
|
+
e.preventDefault();
|
74
|
+
e.stopPropagation();
|
75
|
+
}
|
76
|
+
|
77
|
+
this.modal.classList.remove(_class.out);
|
78
|
+
this.modal.classList.add(_class.visible);
|
79
|
+
this.attachButtons();
|
80
|
+
|
81
|
+
disableScroll();
|
82
|
+
|
83
|
+
if(!escAttached && !this.modal.dataset.disableEsc || this.modal.dataset.disableEsc === "false") {
|
84
|
+
escHandler = closeModalOnEscape.bind(this);
|
85
|
+
body.addEventListener('keyup', escHandler, { once: true });
|
86
|
+
escAttached = true;
|
87
|
+
}
|
88
|
+
|
89
|
+
if(!this.modal.dataset.disableClick || this.modal.dataset.disableClick === "false") {
|
90
|
+
clickHandler = closeModalOnClick.bind(this);
|
91
|
+
this.modal.addEventListener('click', clickHandler, { once: true });
|
92
|
+
}
|
93
|
+
},
|
94
|
+
dismiss: function(e, confirmed) {
|
95
|
+
var _this = this;
|
96
|
+
|
97
|
+
if(e && e.preventDefault) {
|
98
|
+
e.preventDefault();
|
99
|
+
e.stopPropagation();
|
100
|
+
}
|
101
|
+
|
102
|
+
enableScroll();
|
103
|
+
|
104
|
+
if(_this.modal){
|
105
|
+
_this.modal.classList.remove(_class.visible);
|
106
|
+
_this.modal.classList.add(_class.out);
|
107
|
+
}
|
108
|
+
|
109
|
+
if(_this._callback) {
|
110
|
+
_this._callback(confirmed);
|
111
|
+
}
|
112
|
+
|
113
|
+
removeModal(_this);
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
return {
|
118
|
+
create: create,
|
119
|
+
init: attachModalHandlers
|
120
|
+
}
|
121
|
+
|
122
|
+
/**
|
123
|
+
* @public
|
124
|
+
*
|
125
|
+
* @description Attach a click listener to each modals trigger on the screen, which will open the modal
|
126
|
+
*/
|
127
|
+
function attachModalHandlers() {
|
128
|
+
if(!body) {
|
129
|
+
body = document.querySelector('body');
|
130
|
+
}
|
131
|
+
|
132
|
+
var triggers = document.querySelectorAll('.' + _class.trigger);
|
133
|
+
|
134
|
+
if(triggers.length > 0) {
|
135
|
+
triggers.forEach(attachTriggerHandler);
|
136
|
+
}
|
137
|
+
|
138
|
+
//Not the recommended way to use modals
|
139
|
+
var modals = document.querySelectorAll('.' + _class.modal);
|
140
|
+
|
141
|
+
if(modals.length > 0) {
|
142
|
+
modals.forEach(attachModalHandler);
|
143
|
+
}
|
144
|
+
|
145
|
+
function attachModalHandler(modal) {
|
146
|
+
if(Volta._hasClass(modal, _class.auto)) {
|
147
|
+
var trigger = document.querySelector('#' + modal.dataset.trigger);
|
148
|
+
trigger.addEventListener('click', function() {
|
149
|
+
create(modal).open();
|
150
|
+
});
|
151
|
+
}
|
152
|
+
}
|
153
|
+
|
154
|
+
function attachTriggerHandler(trigger) {
|
155
|
+
if(trigger.dataset.modal) {
|
156
|
+
var modal = document.querySelector('#' + trigger.dataset.modal);
|
157
|
+
|
158
|
+
if(!modal) {
|
159
|
+
console.warn('Volta: modal ' + trigger.dataset.modal + ' cannot be found');
|
160
|
+
}
|
161
|
+
|
162
|
+
trigger.addEventListener('click', function() {
|
163
|
+
create(modal).open();
|
164
|
+
});
|
165
|
+
}
|
166
|
+
}
|
167
|
+
}
|
168
|
+
|
169
|
+
/**
|
170
|
+
* @private
|
171
|
+
*
|
172
|
+
* @description Close the modal, triggered by cancel button, passes false to callback function
|
173
|
+
* @param {event} e
|
174
|
+
*/
|
175
|
+
function cancelModal(e) {
|
176
|
+
return this.dismiss(e, false);
|
177
|
+
}
|
178
|
+
|
179
|
+
/**
|
180
|
+
* @private
|
181
|
+
*
|
182
|
+
* @description Close the modal, triggered by confirm button, passes true to callback function
|
183
|
+
* @param {event} e
|
184
|
+
*/
|
185
|
+
function confirmModal(e) {
|
186
|
+
return this.dismiss(e, true);
|
187
|
+
}
|
188
|
+
|
189
|
+
/**
|
190
|
+
* @private
|
191
|
+
*
|
192
|
+
* @description Close the modal, triggered by 'x' button, passes false to callback function
|
193
|
+
* @param {event} e
|
194
|
+
*/
|
195
|
+
function dismissModal(e) {
|
196
|
+
return this.dismiss(e, false);
|
197
|
+
}
|
198
|
+
|
199
|
+
/** @private
|
200
|
+
*
|
201
|
+
* @description Close the modal, triggered by 'esc' key, passes false to callback function
|
202
|
+
* @param {event} e
|
203
|
+
*/
|
204
|
+
function closeModalOnEscape(e){
|
205
|
+
if(e && e.keyCode === 27) {
|
206
|
+
this.dismiss(e, false);
|
207
|
+
} else {
|
208
|
+
body.addEventListener('click', escHandler, { once: true });
|
209
|
+
}
|
210
|
+
}
|
211
|
+
|
212
|
+
|
213
|
+
/** @private
|
214
|
+
*
|
215
|
+
* @description Close the modal, triggered by 'body click, passes false to callback function
|
216
|
+
* @param {event} e
|
217
|
+
*/
|
218
|
+
function closeModalOnClick(e){
|
219
|
+
if(!Volta._hasClass(e.target, _class.trigger)
|
220
|
+
&& !Volta._closest(e.target, '.' + _class.trigger, '.' + _class.trigger)
|
221
|
+
&& !Volta._closest(e.target, '.' + _class.panel, '.' + _class.panel)) {
|
222
|
+
this.dismiss(e, false);
|
223
|
+
} else if(this.modal) {
|
224
|
+
this.modal.addEventListener('click', clickHandler, { once: true });
|
225
|
+
}
|
226
|
+
}
|
227
|
+
|
228
|
+
/**
|
229
|
+
* @public
|
230
|
+
*
|
231
|
+
* @description Create the modal object
|
232
|
+
* @param {HTMLElement|string} elementOrId Reference to the modal element or the id
|
233
|
+
*. @return {Object} A modal object
|
234
|
+
*/
|
235
|
+
function create(elementOrId) {
|
236
|
+
if(!body) {
|
237
|
+
body = document.querySelector('body');
|
238
|
+
}
|
239
|
+
var modal = Object.create(Modal.prototype, {})
|
240
|
+
modal.init(elementOrId);
|
241
|
+
return modal;
|
242
|
+
}
|
243
|
+
|
244
|
+
/**
|
245
|
+
* Private functions to disable body scroll when modal is open
|
246
|
+
*/
|
247
|
+
function disableScroll() {
|
248
|
+
body.classList.add(_class.bodyModalOpen);
|
249
|
+
body.addEventListener('touchmove', preventScroll);
|
250
|
+
body.querySelector('main').addEventListener('touchmove', preventScroll);
|
251
|
+
body.querySelector('.' + _class.content).addEventListener('touchmove', allowScroll);
|
252
|
+
}
|
253
|
+
|
254
|
+
function enableScroll() {
|
255
|
+
body.classList.remove(_class.bodyModalOpen);
|
256
|
+
body.removeEventListener('touchmove', preventScroll);
|
257
|
+
body.querySelector('main').removeEventListener('touchmove', preventScroll);
|
258
|
+
var modalContent = body.querySelector('.' + _class.content);
|
259
|
+
if(modalContent) modalContent.removeEventListener('touchmove', allowScroll);
|
260
|
+
}
|
261
|
+
|
262
|
+
function allowScroll(e) {
|
263
|
+
e.stopPropagation();
|
264
|
+
}
|
265
|
+
|
266
|
+
function preventScroll(e) {
|
267
|
+
e.preventDefault();
|
268
|
+
}
|
269
|
+
|
270
|
+
/**
|
271
|
+
* @private
|
272
|
+
*
|
273
|
+
* @description Remove the modal after dismiss, makes sure to delete the modal properties so it can be garbage collected, and removes event listeners
|
274
|
+
* @param {HTMLElement|string} elementOrId Reference to the modal element or the id
|
275
|
+
*/
|
276
|
+
function removeModal(modal) {
|
277
|
+
delete modal.modal;
|
278
|
+
|
279
|
+
if(modal.dismissBtn) {
|
280
|
+
modal.dismissBtn.removeEventListener('click', dismissModalHandler);
|
281
|
+
}
|
282
|
+
|
283
|
+
if(modal.cancelBtn) {
|
284
|
+
modal.cancelBtn.removeEventListener('click', cancelModalHandler);
|
285
|
+
}
|
286
|
+
|
287
|
+
if(modal.confirmBtn) {
|
288
|
+
modal.confirmBtn.removeEventListener('click', confirmModalHandler);
|
289
|
+
}
|
290
|
+
|
291
|
+
if(clickHandler) {
|
292
|
+
body.removeEventListener('click', clickHandler);
|
293
|
+
}
|
294
|
+
|
295
|
+
if(escHandler) {
|
296
|
+
body.removeEventListener('keyup', escHandler);
|
297
|
+
escAttached = false;
|
298
|
+
}
|
299
|
+
}
|
300
|
+
}();
|
@@ -0,0 +1,143 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2001-present, Vonage.
|
3
|
+
*
|
4
|
+
* Tabs (requires core)
|
5
|
+
*/
|
6
|
+
|
7
|
+
'use strict';
|
8
|
+
|
9
|
+
Volta.tab = function () {
|
10
|
+
var _class = {
|
11
|
+
link: 'Vlt-tabs__link',
|
12
|
+
linkJs: 'Vlt-js-tabs__link',
|
13
|
+
linkActive: 'Vlt-tabs__link_active',
|
14
|
+
linkDisabled: 'Vlt-tabs__link_disabled',
|
15
|
+
linkJsActive: 'Vlt-js-tabs__link_active',
|
16
|
+
panel: 'Vlt-tabs__panel',
|
17
|
+
panelActive: 'Vlt-tabs__panel_active',
|
18
|
+
panelJsActive: 'Vlt-js-tabs__panel_active',
|
19
|
+
tabs: 'Vlt-tabs',
|
20
|
+
}
|
21
|
+
|
22
|
+
function Tabs() {}
|
23
|
+
|
24
|
+
Tabs.prototype = {
|
25
|
+
init: function(element, isWrapper) {
|
26
|
+
var _this = this,
|
27
|
+
tabsHeader,
|
28
|
+
tabsContent;
|
29
|
+
|
30
|
+
if(isWrapper) {
|
31
|
+
tabsHeader = element.children.item(0);
|
32
|
+
tabsContent = element.children.item(1);
|
33
|
+
} else {
|
34
|
+
_this.isJs = true;
|
35
|
+
tabsHeader = element;
|
36
|
+
tabsContent = element.dataset.tabContent ?
|
37
|
+
document.querySelector('#' + element.dataset.tabContent)
|
38
|
+
: null;
|
39
|
+
}
|
40
|
+
|
41
|
+
var linkClass = _this.isJs ? _class.linkJs : _class.link;
|
42
|
+
_this._links = tabsHeader.querySelectorAll('.' + linkClass);
|
43
|
+
_this._panels = tabsContent ? tabsContent.children : undefined;
|
44
|
+
|
45
|
+
this._setActiveElements();
|
46
|
+
|
47
|
+
if(_this._panels && _this._panels.length === _this._links.length) {
|
48
|
+
_this._links.forEach(function(link){
|
49
|
+
var link = link;
|
50
|
+
|
51
|
+
link.addEventListener('toggle', function() {
|
52
|
+
_this.toggle(link);
|
53
|
+
});
|
54
|
+
|
55
|
+
link.addEventListener('click', function() {
|
56
|
+
_this.toggle(link);
|
57
|
+
});
|
58
|
+
});
|
59
|
+
} else if (_this._panels && _this._panels.length > 0) {
|
60
|
+
console.log('Volta: Tabs, number of links and panels do not match');
|
61
|
+
}
|
62
|
+
},
|
63
|
+
toggle: function(linkElement) {
|
64
|
+
var linkActiveClass = this.isJs ? _class.linkJsActive : _class.linkActive;
|
65
|
+
var panelActiveClass = this.isJs ? _class.panelJsActive : _class.panelActive;
|
66
|
+
|
67
|
+
if(!Volta._hasClass(linkElement, _class.linkDisabled) && (!this._activeLink || this._activeLink !== linkElement)) {
|
68
|
+
if(this._activeLink) {
|
69
|
+
this._activeLink.classList.remove(linkActiveClass);
|
70
|
+
this._activePanel.classList.remove(panelActiveClass);
|
71
|
+
}
|
72
|
+
|
73
|
+
this._setActiveElements(linkElement);
|
74
|
+
|
75
|
+
this._activeLink.classList.add(linkActiveClass);
|
76
|
+
this._activePanel.classList.add(panelActiveClass);
|
77
|
+
|
78
|
+
if(Volta.tooltip) {
|
79
|
+
Volta.tooltip.init();
|
80
|
+
}
|
81
|
+
}
|
82
|
+
},
|
83
|
+
_setActiveElements: function(linkElement){
|
84
|
+
var linkActiveClass = this.isJs ? _class.linkJsActive :_class.linkActive;
|
85
|
+
|
86
|
+
if(!linkElement) {
|
87
|
+
this._activeLink = this._links.item(linkActiveClass);
|
88
|
+
} else {
|
89
|
+
this._activeLink = linkElement;
|
90
|
+
}
|
91
|
+
|
92
|
+
var tabIndex;
|
93
|
+
var currentNode = 0;
|
94
|
+
|
95
|
+
while(!tabIndex && currentNode < this._links.length) {
|
96
|
+
if(this._links.item(currentNode) === this._activeLink) {
|
97
|
+
tabIndex = currentNode;
|
98
|
+
break;
|
99
|
+
}
|
100
|
+
currentNode++;
|
101
|
+
}
|
102
|
+
|
103
|
+
if(this._panels) {
|
104
|
+
this._activePanel = this._panels.item(tabIndex);
|
105
|
+
}
|
106
|
+
}
|
107
|
+
}
|
108
|
+
|
109
|
+
return {
|
110
|
+
create: create,
|
111
|
+
init: attachTabHandlers
|
112
|
+
}
|
113
|
+
|
114
|
+
/**
|
115
|
+
* @public
|
116
|
+
*
|
117
|
+
* @description Attach a listener to the tab header
|
118
|
+
*/
|
119
|
+
function attachTabHandlers() {
|
120
|
+
//traditional tabs
|
121
|
+
document.querySelectorAll('.' + _class.tabs).forEach(create);
|
122
|
+
|
123
|
+
document.querySelectorAll('[data-tab-content]').forEach(create);
|
124
|
+
}
|
125
|
+
|
126
|
+
/**
|
127
|
+
* @public
|
128
|
+
*
|
129
|
+
* @description Create a tabs component
|
130
|
+
* @param {HTMLElement} element
|
131
|
+
*/
|
132
|
+
function create(element) {
|
133
|
+
var tabs = Object.create(Tabs.prototype, {})
|
134
|
+
|
135
|
+
if(Volta._hasClass(element, _class.tabs)) {
|
136
|
+
tabs.init(element, true);
|
137
|
+
} else {
|
138
|
+
tabs.init(element);
|
139
|
+
}
|
140
|
+
|
141
|
+
return tabs;
|
142
|
+
}
|
143
|
+
}();
|
@@ -0,0 +1,76 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2001-present, Vonage.
|
3
|
+
*
|
4
|
+
* Tooltips (requires popper.js, tooltip.js)
|
5
|
+
*/
|
6
|
+
'use strict';
|
7
|
+
|
8
|
+
Volta.tooltip = function () {
|
9
|
+
var _class = {
|
10
|
+
bottom: 'Vlt-tooltip--bottom',
|
11
|
+
left: 'Vlt-tooltip--left',
|
12
|
+
tooltip: 'Vlt-tooltip',
|
13
|
+
top: 'Vlt-tooltip--top',
|
14
|
+
right: 'Vlt-tooltip--right',
|
15
|
+
large: 'Vlt-tooltip--large'
|
16
|
+
}
|
17
|
+
|
18
|
+
return {
|
19
|
+
create: create,
|
20
|
+
init: attachTooltipHandlers
|
21
|
+
}
|
22
|
+
|
23
|
+
/**
|
24
|
+
* @public
|
25
|
+
*
|
26
|
+
* @description Create a Tooltip instance for every Vlt-tooltip
|
27
|
+
*/
|
28
|
+
function attachTooltipHandlers() {
|
29
|
+
document.querySelectorAll('.' + _class.tooltip).forEach(create);
|
30
|
+
}
|
31
|
+
|
32
|
+
/**
|
33
|
+
* @public
|
34
|
+
*
|
35
|
+
* @description Create a Tooltip instance
|
36
|
+
* @param {HTMLElement} tooltip
|
37
|
+
* @return {object} a Tooltip element
|
38
|
+
*/
|
39
|
+
function create(tooltip) {
|
40
|
+
var placement;
|
41
|
+
var size;
|
42
|
+
|
43
|
+
if (Volta._hasClass(tooltip, _class.bottom)) {
|
44
|
+
placement = 'bottom';
|
45
|
+
} else if (Volta._hasClass(tooltip, _class.top)) {
|
46
|
+
placement = 'top';
|
47
|
+
} else if (Volta._hasClass(tooltip, _class.left)) {
|
48
|
+
placement = 'left';
|
49
|
+
} else if (Volta._hasClass(tooltip, _class.right)) {
|
50
|
+
placement = 'right';
|
51
|
+
}
|
52
|
+
|
53
|
+
if (Volta._hasClass(tooltip, _class.large)) {
|
54
|
+
size = ' Vlt-tooltip--large';
|
55
|
+
} else {
|
56
|
+
size='';
|
57
|
+
}
|
58
|
+
|
59
|
+
var template =
|
60
|
+
'<div class="Vlt-tooltip--js' + size + '" role="tooltip">' +
|
61
|
+
'<div class="tooltip-arrow Vlt-tooltip__arrow"></div>' +
|
62
|
+
'<div class="tooltip-inner Vlt-tooltip__content"></div>' +
|
63
|
+
'</div>';
|
64
|
+
|
65
|
+
var title = tooltip.title;
|
66
|
+
//remove the title so deafult title does not show
|
67
|
+
tooltip.title = "";
|
68
|
+
|
69
|
+
return new Tooltip(tooltip, {
|
70
|
+
html: true,
|
71
|
+
template: template,
|
72
|
+
title: title,
|
73
|
+
placement: placement
|
74
|
+
});
|
75
|
+
}
|
76
|
+
}();
|