fomantic-ui-sass 2.9.0 → 2.9.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 +4 -4
- data/app/assets/fonts/semantic-ui/Lato-Bold.woff +0 -0
- data/app/assets/fonts/semantic-ui/Lato-Bold.woff2 +0 -0
- data/app/assets/fonts/semantic-ui/Lato-BoldItalic.woff +0 -0
- data/app/assets/fonts/semantic-ui/Lato-BoldItalic.woff2 +0 -0
- data/app/assets/fonts/semantic-ui/Lato-Italic.woff +0 -0
- data/app/assets/fonts/semantic-ui/Lato-Italic.woff2 +0 -0
- data/app/assets/fonts/semantic-ui/Lato-Regular.woff +0 -0
- data/app/assets/fonts/semantic-ui/Lato-Regular.woff2 +0 -0
- data/app/assets/fonts/semantic-ui/LatoLatin-Bold.woff +0 -0
- data/app/assets/fonts/semantic-ui/LatoLatin-Bold.woff2 +0 -0
- data/app/assets/fonts/semantic-ui/LatoLatin-BoldItalic.woff +0 -0
- data/app/assets/fonts/semantic-ui/LatoLatin-BoldItalic.woff2 +0 -0
- data/app/assets/fonts/semantic-ui/LatoLatin-Italic.woff +0 -0
- data/app/assets/fonts/semantic-ui/LatoLatin-Italic.woff2 +0 -0
- data/app/assets/fonts/semantic-ui/LatoLatin-Regular.woff +0 -0
- data/app/assets/fonts/semantic-ui/LatoLatin-Regular.woff2 +0 -0
- data/app/assets/fonts/semantic-ui/brand-icons.woff +0 -0
- data/app/assets/fonts/semantic-ui/brand-icons.woff2 +0 -0
- data/app/assets/fonts/semantic-ui/icons.woff +0 -0
- data/app/assets/fonts/semantic-ui/icons.woff2 +0 -0
- data/app/assets/fonts/semantic-ui/outline-icons.woff +0 -0
- data/app/assets/fonts/semantic-ui/outline-icons.woff2 +0 -0
- data/app/assets/javascripts/semantic-ui/accordion.js +569 -596
- data/app/assets/javascripts/semantic-ui/api.js +1158 -1180
- data/app/assets/javascripts/semantic-ui/calendar.js +1935 -1810
- data/app/assets/javascripts/semantic-ui/checkbox.js +843 -842
- data/app/assets/javascripts/semantic-ui/dimmer.js +707 -738
- data/app/assets/javascripts/semantic-ui/dropdown.js +4196 -4237
- data/app/assets/javascripts/semantic-ui/embed.js +646 -676
- data/app/assets/javascripts/semantic-ui/flyout.js +1515 -1466
- data/app/assets/javascripts/semantic-ui/form.js +2023 -2005
- data/app/assets/javascripts/semantic-ui/modal.js +1545 -1487
- data/app/assets/javascripts/semantic-ui/nag.js +521 -527
- data/app/assets/javascripts/semantic-ui/popup.js +1457 -1457
- data/app/assets/javascripts/semantic-ui/progress.js +970 -998
- data/app/assets/javascripts/semantic-ui/rating.js +508 -524
- data/app/assets/javascripts/semantic-ui/search.js +1521 -1535
- data/app/assets/javascripts/semantic-ui/shape.js +784 -811
- data/app/assets/javascripts/semantic-ui/sidebar.js +1062 -1100
- data/app/assets/javascripts/semantic-ui/site.js +437 -477
- data/app/assets/javascripts/semantic-ui/slider.js +1311 -1312
- data/app/assets/javascripts/semantic-ui/state.js +639 -658
- data/app/assets/javascripts/semantic-ui/sticky.js +848 -902
- data/app/assets/javascripts/semantic-ui/tab.js +903 -967
- data/app/assets/javascripts/semantic-ui/toast.js +911 -885
- data/app/assets/javascripts/semantic-ui/transition.js +1049 -1078
- data/app/assets/javascripts/semantic-ui/visibility.js +1214 -1246
- data/app/assets/stylesheets/semantic-ui/collections/_breadcrumb.scss +7 -7
- data/app/assets/stylesheets/semantic-ui/collections/_form.scss +246 -341
- data/app/assets/stylesheets/semantic-ui/collections/_grid.scss +185 -331
- data/app/assets/stylesheets/semantic-ui/collections/_menu.scss +272 -433
- data/app/assets/stylesheets/semantic-ui/collections/_message.scss +127 -199
- data/app/assets/stylesheets/semantic-ui/collections/_table.scss +549 -776
- data/app/assets/stylesheets/semantic-ui/elements/_button.scss +711 -1123
- data/app/assets/stylesheets/semantic-ui/elements/_container.scss +9 -8
- data/app/assets/stylesheets/semantic-ui/elements/_divider.scss +45 -63
- data/app/assets/stylesheets/semantic-ui/elements/_emoji.scss +3556 -3556
- data/app/assets/stylesheets/semantic-ui/elements/_flag.scss +272 -270
- data/app/assets/stylesheets/semantic-ui/elements/_header.scss +120 -144
- data/app/assets/stylesheets/semantic-ui/elements/_icon.scss +667 -747
- data/app/assets/stylesheets/semantic-ui/elements/_image.scss +41 -65
- data/app/assets/stylesheets/semantic-ui/elements/_input.scss +358 -276
- data/app/assets/stylesheets/semantic-ui/elements/_label.scss +361 -412
- data/app/assets/stylesheets/semantic-ui/elements/_list.scss +51 -72
- data/app/assets/stylesheets/semantic-ui/elements/_loader.scss +69 -157
- data/app/assets/stylesheets/semantic-ui/elements/_placeholder.scss +24 -44
- data/app/assets/stylesheets/semantic-ui/elements/_rail.scss +17 -22
- data/app/assets/stylesheets/semantic-ui/elements/_reveal.scss +46 -85
- data/app/assets/stylesheets/semantic-ui/elements/_segment.scss +150 -226
- data/app/assets/stylesheets/semantic-ui/elements/_step.scss +79 -152
- data/app/assets/stylesheets/semantic-ui/elements/_text.scss +33 -33
- data/app/assets/stylesheets/semantic-ui/globals/_reset.scss +10 -15
- data/app/assets/stylesheets/semantic-ui/globals/_site.scss +30 -43
- data/app/assets/stylesheets/semantic-ui/modules/_accordion.scss +37 -55
- data/app/assets/stylesheets/semantic-ui/modules/_calendar.scss +26 -29
- data/app/assets/stylesheets/semantic-ui/modules/_checkbox.scss +122 -193
- data/app/assets/stylesheets/semantic-ui/modules/_dimmer.scss +55 -174
- data/app/assets/stylesheets/semantic-ui/modules/_dropdown.scss +254 -388
- data/app/assets/stylesheets/semantic-ui/modules/_embed.scss +20 -31
- data/app/assets/stylesheets/semantic-ui/modules/_flyout.scss +97 -143
- data/app/assets/stylesheets/semantic-ui/modules/_modal.scss +122 -156
- data/app/assets/stylesheets/semantic-ui/modules/_nag.scss +55 -65
- data/app/assets/stylesheets/semantic-ui/modules/_popup.scss +426 -204
- data/app/assets/stylesheets/semantic-ui/modules/_progress.scss +108 -213
- data/app/assets/stylesheets/semantic-ui/modules/_rating.scss +83 -124
- data/app/assets/stylesheets/semantic-ui/modules/_search.scss +71 -100
- data/app/assets/stylesheets/semantic-ui/modules/_shape.scss +16 -32
- data/app/assets/stylesheets/semantic-ui/modules/_sidebar.scss +105 -208
- data/app/assets/stylesheets/semantic-ui/modules/_slider.scss +93 -121
- data/app/assets/stylesheets/semantic-ui/modules/_sticky.scss +3 -7
- data/app/assets/stylesheets/semantic-ui/modules/_tab.scss +12 -16
- data/app/assets/stylesheets/semantic-ui/modules/_toast.scss +71 -149
- data/app/assets/stylesheets/semantic-ui/modules/_transition.scss +371 -1282
- data/app/assets/stylesheets/semantic-ui/views/_ad.scss +36 -47
- data/app/assets/stylesheets/semantic-ui/views/_card.scss +221 -367
- data/app/assets/stylesheets/semantic-ui/views/_comment.scss +43 -61
- data/app/assets/stylesheets/semantic-ui/views/_feed.scss +37 -59
- data/app/assets/stylesheets/semantic-ui/views/_item.scss +86 -133
- data/app/assets/stylesheets/semantic-ui/views/_statistic.scss +77 -118
- data/lib/fomantic/ui/sass/version.rb +2 -2
- data/tasks/converter.rb +1 -1
- metadata +17 -1
|
@@ -1,1019 +1,955 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* # Fomantic-UI - Tab
|
|
3
|
-
*
|
|
3
|
+
* https://github.com/fomantic/Fomantic-UI/
|
|
4
4
|
*
|
|
5
5
|
*
|
|
6
6
|
* Released under the MIT license
|
|
7
|
-
*
|
|
7
|
+
* https://opensource.org/licenses/MIT
|
|
8
8
|
*
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
window =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
$
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
activeTabPath,
|
|
77
|
-
parameterArray,
|
|
78
|
-
module,
|
|
79
|
-
|
|
80
|
-
historyEvent
|
|
81
|
-
|
|
82
|
-
;
|
|
83
|
-
|
|
84
|
-
module = {
|
|
85
|
-
|
|
86
|
-
initialize: function() {
|
|
87
|
-
module.debug('Initializing tab menu item', $module);
|
|
88
|
-
module.fix.callbacks();
|
|
89
|
-
module.determineTabs();
|
|
90
|
-
|
|
91
|
-
module.debug('Determining tabs', settings.context, $tabs);
|
|
92
|
-
// set up automatic routing
|
|
93
|
-
if(settings.auto) {
|
|
94
|
-
module.set.auto();
|
|
95
|
-
}
|
|
96
|
-
module.bind.events();
|
|
97
|
-
|
|
98
|
-
if(settings.history && !initializedHistory) {
|
|
99
|
-
module.initializeHistory();
|
|
100
|
-
initializedHistory = true;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
var activeTab = module.determine.activeTab();
|
|
104
|
-
if(settings.autoTabActivation && instance === undefined && activeTab == null) {
|
|
105
|
-
activeTab = settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation;
|
|
106
|
-
module.debug('No active tab detected, setting tab active', activeTab);
|
|
107
|
-
module.changeTab(activeTab);
|
|
108
|
-
}
|
|
109
|
-
if(activeTab != null && settings.history) {
|
|
110
|
-
var autoUpdate = $.address.autoUpdate();
|
|
111
|
-
$.address.autoUpdate(false);
|
|
112
|
-
$.address.value(activeTab);
|
|
113
|
-
$.address.autoUpdate(autoUpdate);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
module.instantiate();
|
|
117
|
-
},
|
|
118
|
-
|
|
119
|
-
instantiate: function () {
|
|
120
|
-
module.verbose('Storing instance of module', module);
|
|
121
|
-
instance = module;
|
|
122
|
-
$module
|
|
123
|
-
.data(moduleNamespace, module)
|
|
124
|
-
;
|
|
125
|
-
},
|
|
126
|
-
|
|
127
|
-
destroy: function() {
|
|
128
|
-
module.debug('Destroying tabs', $module);
|
|
129
|
-
$module
|
|
130
|
-
.removeData(moduleNamespace)
|
|
131
|
-
.off(eventNamespace)
|
|
132
|
-
;
|
|
133
|
-
},
|
|
11
|
+
(function ($, window, document) {
|
|
12
|
+
'use strict';
|
|
13
|
+
|
|
14
|
+
function isWindow(obj) {
|
|
15
|
+
return obj !== null && obj === obj.window;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function isFunction(obj) {
|
|
19
|
+
return typeof obj === 'function' && typeof obj.nodeType !== 'number';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
window = window !== undefined && window.Math === Math
|
|
23
|
+
? window
|
|
24
|
+
: globalThis;
|
|
25
|
+
|
|
26
|
+
$.fn.tab = function (parameters) {
|
|
27
|
+
var
|
|
28
|
+
// use window context if none specified
|
|
29
|
+
$allModules = isFunction(this)
|
|
30
|
+
? $(window)
|
|
31
|
+
: $(this),
|
|
32
|
+
$document = $(document),
|
|
33
|
+
moduleSelector = $allModules.selector || '',
|
|
34
|
+
time = Date.now(),
|
|
35
|
+
performance = [],
|
|
36
|
+
|
|
37
|
+
query = arguments[0],
|
|
38
|
+
methodInvoked = typeof query === 'string',
|
|
39
|
+
queryArguments = [].slice.call(arguments, 1),
|
|
40
|
+
|
|
41
|
+
initializedHistory = false,
|
|
42
|
+
returnedValue
|
|
43
|
+
;
|
|
44
|
+
|
|
45
|
+
$allModules.each(function () {
|
|
46
|
+
var
|
|
47
|
+
settings = $.isPlainObject(parameters)
|
|
48
|
+
? $.extend(true, {}, $.fn.tab.settings, parameters)
|
|
49
|
+
: $.extend({}, $.fn.tab.settings),
|
|
50
|
+
|
|
51
|
+
className = settings.className,
|
|
52
|
+
metadata = settings.metadata,
|
|
53
|
+
selector = settings.selector,
|
|
54
|
+
error = settings.error,
|
|
55
|
+
regExp = settings.regExp,
|
|
56
|
+
|
|
57
|
+
eventNamespace = '.' + settings.namespace,
|
|
58
|
+
moduleNamespace = 'module-' + settings.namespace,
|
|
59
|
+
|
|
60
|
+
$module = $(this),
|
|
61
|
+
$context,
|
|
62
|
+
$tabs,
|
|
63
|
+
|
|
64
|
+
cache = {},
|
|
65
|
+
firstLoad = true,
|
|
66
|
+
recursionDepth = 0,
|
|
67
|
+
element = this,
|
|
68
|
+
instance = $module.data(moduleNamespace),
|
|
69
|
+
|
|
70
|
+
activeTabPath,
|
|
71
|
+
parameterArray,
|
|
72
|
+
module,
|
|
73
|
+
|
|
74
|
+
historyEvent
|
|
75
|
+
;
|
|
134
76
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
77
|
+
module = {
|
|
78
|
+
|
|
79
|
+
initialize: function () {
|
|
80
|
+
module.debug('Initializing tab menu item', $module);
|
|
81
|
+
module.determineTabs();
|
|
82
|
+
|
|
83
|
+
module.debug('Determining tabs', settings.context, $tabs);
|
|
84
|
+
// set up automatic routing
|
|
85
|
+
if (settings.auto) {
|
|
86
|
+
module.set.auto();
|
|
87
|
+
}
|
|
88
|
+
module.bind.events();
|
|
89
|
+
|
|
90
|
+
if (settings.history && !initializedHistory) {
|
|
91
|
+
module.initializeHistory();
|
|
92
|
+
initializedHistory = true;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
var activeTab = module.determine.activeTab();
|
|
96
|
+
if (settings.autoTabActivation && instance === undefined && activeTab === null) {
|
|
97
|
+
activeTab = settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation;
|
|
98
|
+
module.debug('No active tab detected, setting tab active', activeTab);
|
|
99
|
+
module.changeTab(activeTab);
|
|
100
|
+
}
|
|
101
|
+
if (activeTab !== null && settings.history) {
|
|
102
|
+
var autoUpdate = $.address.autoUpdate();
|
|
103
|
+
$.address.autoUpdate(false);
|
|
104
|
+
$.address.value(activeTab);
|
|
105
|
+
$.address.autoUpdate(autoUpdate);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
module.instantiate();
|
|
109
|
+
},
|
|
146
110
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
111
|
+
instantiate: function () {
|
|
112
|
+
module.verbose('Storing instance of module', module);
|
|
113
|
+
instance = module;
|
|
114
|
+
$module
|
|
115
|
+
.data(moduleNamespace, module)
|
|
116
|
+
;
|
|
117
|
+
},
|
|
151
118
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
$reference = $module;
|
|
160
|
-
}
|
|
161
|
-
$context = $reference.parent();
|
|
162
|
-
module.verbose('Determined parent element for creating context', $context);
|
|
163
|
-
}
|
|
164
|
-
else if(settings.context) {
|
|
165
|
-
$context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context);
|
|
166
|
-
module.verbose('Using selector for tab context', settings.context, $context);
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
$context = $('body');
|
|
170
|
-
}
|
|
171
|
-
// find tabs
|
|
172
|
-
if(settings.childrenOnly) {
|
|
173
|
-
$tabs = $context.children(selector.tabs);
|
|
174
|
-
module.debug('Searching tab context children for tabs', $context, $tabs);
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
$tabs = $context.find(selector.tabs);
|
|
178
|
-
module.debug('Searching tab context for tabs', $context, $tabs);
|
|
179
|
-
}
|
|
180
|
-
},
|
|
119
|
+
destroy: function () {
|
|
120
|
+
module.debug('Destroying tabs', $module);
|
|
121
|
+
$module
|
|
122
|
+
.removeData(moduleNamespace)
|
|
123
|
+
.off(eventNamespace)
|
|
124
|
+
;
|
|
125
|
+
},
|
|
181
126
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
module.error(error.legacyInit, parameters.onFirstLoad);
|
|
194
|
-
}
|
|
195
|
-
settings = $.extend(true, {}, $.fn.tab.settings, parameters);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
},
|
|
127
|
+
bind: {
|
|
128
|
+
events: function () {
|
|
129
|
+
// if using $.tab don't add events
|
|
130
|
+
if (!isWindow(element)) {
|
|
131
|
+
module.debug('Attaching tab activation events to element', $module);
|
|
132
|
+
$module
|
|
133
|
+
.on('click' + eventNamespace, module.event.click)
|
|
134
|
+
;
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
},
|
|
199
138
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
139
|
+
determineTabs: function () {
|
|
140
|
+
var
|
|
141
|
+
$reference
|
|
142
|
+
;
|
|
143
|
+
|
|
144
|
+
// determine tab context
|
|
145
|
+
if (settings.context === 'parent') {
|
|
146
|
+
if ($module.closest(selector.ui).length > 0) {
|
|
147
|
+
$reference = $module.closest(selector.ui);
|
|
148
|
+
module.verbose('Using closest UI element as parent', $reference);
|
|
149
|
+
} else {
|
|
150
|
+
$reference = $module;
|
|
151
|
+
}
|
|
152
|
+
$context = $reference.parent();
|
|
153
|
+
module.verbose('Determined parent element for creating context', $context);
|
|
154
|
+
} else if (settings.context) {
|
|
155
|
+
$context = [window, document].indexOf(settings.context) < 0 ? $document.find(settings.context) : $(settings.context);
|
|
156
|
+
module.verbose('Using selector for tab context', settings.context, $context);
|
|
157
|
+
} else {
|
|
158
|
+
$context = $('body');
|
|
159
|
+
}
|
|
160
|
+
// find tabs
|
|
161
|
+
if (settings.childrenOnly) {
|
|
162
|
+
$tabs = $context.children(selector.tabs);
|
|
163
|
+
module.debug('Searching tab context children for tabs', $context, $tabs);
|
|
164
|
+
} else {
|
|
165
|
+
$tabs = $context.find(selector.tabs);
|
|
166
|
+
module.debug('Searching tab context for tabs', $context, $tabs);
|
|
167
|
+
}
|
|
168
|
+
},
|
|
226
169
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
;
|
|
253
|
-
module.performance.display();
|
|
254
|
-
module.debug('History change event', tabPath, event);
|
|
255
|
-
historyEvent = event;
|
|
256
|
-
if(tabPath !== undefined) {
|
|
257
|
-
module.changeTab(tabPath);
|
|
258
|
-
}
|
|
259
|
-
if(pageTitle) {
|
|
260
|
-
$.address.title(pageTitle);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
},
|
|
170
|
+
initializeHistory: function () {
|
|
171
|
+
module.debug('Initializing page state');
|
|
172
|
+
if ($.address === undefined) {
|
|
173
|
+
module.error(error.state);
|
|
174
|
+
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
if (settings.historyType === 'state') {
|
|
178
|
+
module.debug('Using HTML5 to manage state');
|
|
179
|
+
if (settings.path !== false) {
|
|
180
|
+
$.address
|
|
181
|
+
.history(true)
|
|
182
|
+
.state(settings.path)
|
|
183
|
+
;
|
|
184
|
+
$(window).trigger('popstate');
|
|
185
|
+
} else {
|
|
186
|
+
module.error(error.path);
|
|
187
|
+
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
$.address
|
|
192
|
+
.bind('change', module.event.history.change)
|
|
193
|
+
;
|
|
194
|
+
},
|
|
265
195
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
196
|
+
event: {
|
|
197
|
+
click: function (event) {
|
|
198
|
+
var
|
|
199
|
+
tabPath = $(this).data(metadata.tab)
|
|
200
|
+
;
|
|
201
|
+
if (tabPath !== undefined) {
|
|
202
|
+
if (settings.history) {
|
|
203
|
+
module.verbose('Updating page state', event);
|
|
204
|
+
$.address.value(tabPath);
|
|
205
|
+
} else {
|
|
206
|
+
module.verbose('Changing tab', event);
|
|
207
|
+
module.changeTab(tabPath);
|
|
208
|
+
}
|
|
209
|
+
event.preventDefault();
|
|
210
|
+
} else {
|
|
211
|
+
module.debug('No tab specified');
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
history: {
|
|
215
|
+
change: function (event) {
|
|
216
|
+
var
|
|
217
|
+
tabPath = event.pathNames.join('/') || module.get.initialPath(),
|
|
218
|
+
pageTitle = settings.templates.determineTitle(tabPath) || false
|
|
219
|
+
;
|
|
220
|
+
module.performance.display();
|
|
221
|
+
module.debug('History change event', tabPath, event);
|
|
222
|
+
historyEvent = event;
|
|
223
|
+
if (tabPath !== undefined) {
|
|
224
|
+
module.changeTab(tabPath);
|
|
225
|
+
}
|
|
226
|
+
if (pageTitle) {
|
|
227
|
+
$.address.title(pageTitle);
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
},
|
|
272
232
|
|
|
273
|
-
|
|
233
|
+
refresh: function () {
|
|
234
|
+
if (activeTabPath) {
|
|
235
|
+
module.debug('Refreshing tab', activeTabPath);
|
|
236
|
+
module.changeTab(activeTabPath);
|
|
237
|
+
}
|
|
238
|
+
},
|
|
274
239
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
240
|
+
cache: {
|
|
241
|
+
|
|
242
|
+
read: function (cacheKey) {
|
|
243
|
+
return cacheKey !== undefined
|
|
244
|
+
? cache[cacheKey]
|
|
245
|
+
: false;
|
|
246
|
+
},
|
|
247
|
+
add: function (cacheKey, content) {
|
|
248
|
+
cacheKey = cacheKey || activeTabPath;
|
|
249
|
+
module.debug('Adding cached content for', cacheKey);
|
|
250
|
+
cache[cacheKey] = content;
|
|
251
|
+
},
|
|
252
|
+
remove: function (cacheKey) {
|
|
253
|
+
cacheKey = cacheKey || activeTabPath;
|
|
254
|
+
module.debug('Removing cached content for', cacheKey);
|
|
255
|
+
delete cache[cacheKey];
|
|
256
|
+
},
|
|
257
|
+
},
|
|
292
258
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
return text.replace(regExp.escape, '\\$&');
|
|
297
|
-
}
|
|
298
|
-
},
|
|
259
|
+
escape: {
|
|
260
|
+
string: function (text) {
|
|
261
|
+
text = String(text);
|
|
299
262
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
url = (typeof settings.path == 'string')
|
|
304
|
-
? settings.path.replace(/\/$/, '') + '/{$tab}'
|
|
305
|
-
: '/{$tab}'
|
|
306
|
-
;
|
|
307
|
-
module.verbose('Setting up automatic tab retrieval from server', url);
|
|
308
|
-
if($.isPlainObject(settings.apiSettings)) {
|
|
309
|
-
settings.apiSettings.url = url;
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
settings.apiSettings = {
|
|
313
|
-
url: url
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
},
|
|
317
|
-
loading: function(tabPath) {
|
|
318
|
-
var
|
|
319
|
-
$tab = module.get.tabElement(tabPath),
|
|
320
|
-
isLoading = $tab.hasClass(className.loading)
|
|
321
|
-
;
|
|
322
|
-
if(!isLoading) {
|
|
323
|
-
module.verbose('Setting loading state for', $tab);
|
|
324
|
-
$tab
|
|
325
|
-
.addClass(className.loading)
|
|
326
|
-
.siblings($tabs)
|
|
327
|
-
.removeClass(className.active + ' ' + className.loading)
|
|
328
|
-
;
|
|
329
|
-
if($tab.length > 0) {
|
|
330
|
-
settings.onRequest.call($tab[0], tabPath);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
},
|
|
334
|
-
state: function(state) {
|
|
335
|
-
$.address.value(state);
|
|
336
|
-
}
|
|
337
|
-
},
|
|
263
|
+
return text.replace(regExp.escape, '\\$&');
|
|
264
|
+
},
|
|
265
|
+
},
|
|
338
266
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
267
|
+
set: {
|
|
268
|
+
auto: function () {
|
|
269
|
+
var
|
|
270
|
+
url = typeof settings.path === 'string'
|
|
271
|
+
? settings.path.replace(/\/$/, '') + '/{$tab}'
|
|
272
|
+
: '/{$tab}'
|
|
273
|
+
;
|
|
274
|
+
module.verbose('Setting up automatic tab retrieval from server', url);
|
|
275
|
+
if ($.isPlainObject(settings.apiSettings)) {
|
|
276
|
+
settings.apiSettings.url = url;
|
|
277
|
+
} else {
|
|
278
|
+
settings.apiSettings = {
|
|
279
|
+
url: url,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
loading: function (tabPath) {
|
|
284
|
+
var
|
|
285
|
+
$tab = module.get.tabElement(tabPath),
|
|
286
|
+
isLoading = $tab.hasClass(className.loading)
|
|
287
|
+
;
|
|
288
|
+
if (!isLoading) {
|
|
289
|
+
module.verbose('Setting loading state for', $tab);
|
|
290
|
+
$tab
|
|
291
|
+
.addClass(className.loading)
|
|
292
|
+
.siblings($tabs)
|
|
293
|
+
.removeClass(className.active + ' ' + className.loading)
|
|
294
|
+
;
|
|
295
|
+
if ($tab.length > 0) {
|
|
296
|
+
settings.onRequest.call($tab[0], tabPath);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
state: function (state) {
|
|
301
|
+
$.address.value(state);
|
|
302
|
+
},
|
|
303
|
+
},
|
|
354
304
|
|
|
355
|
-
|
|
356
|
-
|
|
305
|
+
changeTab: function (tabPath) {
|
|
306
|
+
var
|
|
307
|
+
pushStateAvailable = window.history && window.history.pushState,
|
|
308
|
+
shouldIgnoreLoad = pushStateAvailable && settings.ignoreFirstLoad && firstLoad,
|
|
309
|
+
remoteContent = settings.auto || $.isPlainObject(settings.apiSettings),
|
|
310
|
+
// only add default path if not remote content
|
|
311
|
+
pathArray = remoteContent && !shouldIgnoreLoad
|
|
312
|
+
? module.utilities.pathToArray(tabPath)
|
|
313
|
+
: module.get.defaultPathArray(tabPath)
|
|
314
|
+
;
|
|
315
|
+
tabPath = module.utilities.arrayToPath(pathArray);
|
|
316
|
+
$.each(pathArray, function (index, tab) {
|
|
317
|
+
var
|
|
318
|
+
currentPathArray = pathArray.slice(0, index + 1),
|
|
319
|
+
currentPath = module.utilities.arrayToPath(currentPathArray),
|
|
320
|
+
|
|
321
|
+
isTab = module.is.tab(currentPath),
|
|
322
|
+
isLastIndex = index + 1 === pathArray.length,
|
|
323
|
+
|
|
324
|
+
$tab = module.get.tabElement(currentPath),
|
|
325
|
+
$anchor,
|
|
326
|
+
nextPathArray,
|
|
327
|
+
nextPath,
|
|
328
|
+
isLastTab
|
|
329
|
+
;
|
|
330
|
+
module.verbose('Looking for tab', tab);
|
|
331
|
+
if (isTab) {
|
|
332
|
+
module.verbose('Tab was found', tab);
|
|
333
|
+
// scope up
|
|
334
|
+
activeTabPath = currentPath;
|
|
335
|
+
parameterArray = module.utilities.filterArray(pathArray, currentPathArray);
|
|
336
|
+
|
|
337
|
+
if (isLastIndex) {
|
|
338
|
+
isLastTab = true;
|
|
339
|
+
} else {
|
|
340
|
+
nextPathArray = pathArray.slice(0, index + 2);
|
|
341
|
+
nextPath = module.utilities.arrayToPath(nextPathArray);
|
|
342
|
+
isLastTab = !module.is.tab(nextPath);
|
|
343
|
+
if (isLastTab) {
|
|
344
|
+
module.verbose('Tab parameters found', nextPathArray);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
if (settings.onBeforeChange.call(element, currentPath) === false) {
|
|
348
|
+
module.debug('onBeforeChange returned false, cancelling tab change', $tab);
|
|
349
|
+
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
if (isLastTab && remoteContent) {
|
|
353
|
+
if (!shouldIgnoreLoad) {
|
|
354
|
+
module.activate.navigation(currentPath);
|
|
355
|
+
module.fetch.content(currentPath, tabPath);
|
|
356
|
+
} else {
|
|
357
|
+
module.debug('Ignoring remote content on first tab load', currentPath);
|
|
358
|
+
firstLoad = false;
|
|
359
|
+
module.cache.add(tabPath, $tab.html());
|
|
360
|
+
module.activate.all(currentPath);
|
|
361
|
+
settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
|
|
362
|
+
settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
return false;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
module.debug('Opened local tab', currentPath);
|
|
369
|
+
module.activate.all(currentPath);
|
|
370
|
+
if (!module.cache.read(currentPath)) {
|
|
371
|
+
module.cache.add(currentPath, true);
|
|
372
|
+
module.debug('First time tab loaded calling tab init');
|
|
373
|
+
settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
|
|
374
|
+
}
|
|
375
|
+
settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
|
|
376
|
+
} else if (tabPath.search('/') === -1 && tabPath !== '') {
|
|
377
|
+
// look for in page anchor
|
|
378
|
+
tabPath = module.escape.string(tabPath);
|
|
379
|
+
$anchor = $('#' + tabPath + ', a[name="' + tabPath + '"]');
|
|
380
|
+
currentPath = $anchor.closest('[data-tab]').data(metadata.tab);
|
|
381
|
+
$tab = module.get.tabElement(currentPath);
|
|
382
|
+
// if anchor exists use parent tab
|
|
383
|
+
if ($anchor && $anchor.length > 0 && currentPath) {
|
|
384
|
+
module.debug('Anchor link used, opening parent tab', $tab, $anchor);
|
|
385
|
+
if (settings.onBeforeChange.call(element, currentPath) === false) {
|
|
386
|
+
module.debug('onBeforeChange returned false, cancelling tab change', $tab);
|
|
387
|
+
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
if (!$tab.hasClass(className.active)) {
|
|
391
|
+
setTimeout(function () {
|
|
392
|
+
module.scrollTo($anchor);
|
|
393
|
+
}, 0);
|
|
394
|
+
}
|
|
395
|
+
module.activate.all(currentPath);
|
|
396
|
+
if (!module.cache.read(currentPath)) {
|
|
397
|
+
module.cache.add(currentPath, true);
|
|
398
|
+
module.debug('First time tab loaded calling tab init');
|
|
399
|
+
settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
|
|
400
|
+
}
|
|
401
|
+
settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
|
|
402
|
+
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
} else {
|
|
406
|
+
module.error(error.missingTab, $module, $context, currentPath);
|
|
407
|
+
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
},
|
|
357
412
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
parameterArray = module.utilities.filterArray(pathArray, currentPathArray);
|
|
370
|
-
|
|
371
|
-
if(isLastIndex) {
|
|
372
|
-
isLastTab = true;
|
|
373
|
-
}
|
|
374
|
-
else {
|
|
375
|
-
nextPathArray = pathArray.slice(0, index + 2);
|
|
376
|
-
nextPath = module.utilities.arrayToPath(nextPathArray);
|
|
377
|
-
isLastTab = ( !module.is.tab(nextPath) );
|
|
378
|
-
if(isLastTab) {
|
|
379
|
-
module.verbose('Tab parameters found', nextPathArray);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
if (settings.onBeforeChange.call(element, currentPath) === false) {
|
|
383
|
-
module.debug('onBeforeChange returned false, cancelling tab change', $tab);
|
|
384
|
-
return false;
|
|
385
|
-
}
|
|
386
|
-
if(isLastTab && remoteContent) {
|
|
387
|
-
if(!shouldIgnoreLoad) {
|
|
388
|
-
module.activate.navigation(currentPath);
|
|
389
|
-
module.fetch.content(currentPath, tabPath);
|
|
390
|
-
}
|
|
391
|
-
else {
|
|
392
|
-
module.debug('Ignoring remote content on first tab load', currentPath);
|
|
393
|
-
firstLoad = false;
|
|
394
|
-
module.cache.add(tabPath, $tab.html());
|
|
395
|
-
module.activate.all(currentPath);
|
|
396
|
-
settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
|
|
397
|
-
settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
|
|
398
|
-
}
|
|
399
|
-
return false;
|
|
400
|
-
}
|
|
401
|
-
else {
|
|
402
|
-
module.debug('Opened local tab', currentPath);
|
|
403
|
-
module.activate.all(currentPath);
|
|
404
|
-
if( !module.cache.read(currentPath) ) {
|
|
405
|
-
module.cache.add(currentPath, true);
|
|
406
|
-
module.debug('First time tab loaded calling tab init');
|
|
407
|
-
settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
|
|
408
|
-
}
|
|
409
|
-
settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
|
|
410
|
-
}
|
|
413
|
+
scrollTo: function ($element) {
|
|
414
|
+
var
|
|
415
|
+
scrollOffset = $element && $element.length > 0
|
|
416
|
+
? $element.offset().top
|
|
417
|
+
: false
|
|
418
|
+
;
|
|
419
|
+
if (scrollOffset !== false) {
|
|
420
|
+
module.debug('Forcing scroll to an in-page link in a hidden tab', scrollOffset, $element);
|
|
421
|
+
$document.scrollTop(scrollOffset);
|
|
422
|
+
}
|
|
423
|
+
},
|
|
411
424
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
}
|
|
437
|
-
settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
|
|
438
|
-
return false;
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
module.error(error.missingTab, $module, $context, currentPath);
|
|
443
|
-
return false;
|
|
444
|
-
}
|
|
445
|
-
});
|
|
446
|
-
},
|
|
425
|
+
update: {
|
|
426
|
+
content: function (tabPath, html, evaluateScripts) {
|
|
427
|
+
var
|
|
428
|
+
$tab = module.get.tabElement(tabPath),
|
|
429
|
+
tab = $tab[0]
|
|
430
|
+
;
|
|
431
|
+
evaluateScripts = evaluateScripts !== undefined
|
|
432
|
+
? evaluateScripts
|
|
433
|
+
: settings.evaluateScripts;
|
|
434
|
+
if (typeof settings.cacheType === 'string' && settings.cacheType.toLowerCase() === 'dom' && typeof html !== 'string') {
|
|
435
|
+
$tab
|
|
436
|
+
.empty()
|
|
437
|
+
.append($(html).clone(true))
|
|
438
|
+
;
|
|
439
|
+
} else {
|
|
440
|
+
if (evaluateScripts) {
|
|
441
|
+
module.debug('Updating HTML and evaluating inline scripts', tabPath, html);
|
|
442
|
+
$tab.html(html);
|
|
443
|
+
} else {
|
|
444
|
+
module.debug('Updating HTML', tabPath, html);
|
|
445
|
+
tab.innerHTML = html;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
},
|
|
449
|
+
},
|
|
447
450
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
451
|
+
fetch: {
|
|
452
|
+
|
|
453
|
+
content: function (tabPath, fullTabPath) {
|
|
454
|
+
var
|
|
455
|
+
$tab = module.get.tabElement(tabPath),
|
|
456
|
+
apiSettings = {
|
|
457
|
+
dataType: 'html',
|
|
458
|
+
encodeParameters: false,
|
|
459
|
+
on: 'now',
|
|
460
|
+
cache: settings.alwaysRefresh,
|
|
461
|
+
headers: {
|
|
462
|
+
'X-Remote': true,
|
|
463
|
+
},
|
|
464
|
+
onSuccess: function (response) {
|
|
465
|
+
if (settings.cacheType === 'response') {
|
|
466
|
+
module.cache.add(fullTabPath, response);
|
|
467
|
+
}
|
|
468
|
+
module.update.content(tabPath, response);
|
|
469
|
+
if (tabPath == activeTabPath) {
|
|
470
|
+
module.debug('Content loaded', tabPath);
|
|
471
|
+
module.activate.tab(tabPath);
|
|
472
|
+
} else {
|
|
473
|
+
module.debug('Content loaded in background', tabPath);
|
|
474
|
+
}
|
|
475
|
+
settings.onFirstLoad.call($tab[0], tabPath, parameterArray, historyEvent);
|
|
476
|
+
settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);
|
|
477
|
+
|
|
478
|
+
if (settings.loadOnce) {
|
|
479
|
+
module.cache.add(fullTabPath, true);
|
|
480
|
+
} else if (typeof settings.cacheType === 'string' && settings.cacheType.toLowerCase() === 'dom' && $tab.children().length > 0) {
|
|
481
|
+
setTimeout(function () {
|
|
482
|
+
var
|
|
483
|
+
$clone = $tab.children().clone(true)
|
|
484
|
+
;
|
|
485
|
+
$clone = $clone.not('script');
|
|
486
|
+
module.cache.add(fullTabPath, $clone);
|
|
487
|
+
}, 0);
|
|
488
|
+
} else {
|
|
489
|
+
module.cache.add(fullTabPath, $tab.html());
|
|
490
|
+
}
|
|
491
|
+
},
|
|
492
|
+
urlData: {
|
|
493
|
+
tab: fullTabPath,
|
|
494
|
+
},
|
|
495
|
+
},
|
|
496
|
+
request = $tab.api('get request') || false,
|
|
497
|
+
existingRequest = request && request.state() === 'pending',
|
|
498
|
+
requestSettings,
|
|
499
|
+
cachedContent
|
|
500
|
+
;
|
|
501
|
+
|
|
502
|
+
fullTabPath = fullTabPath || tabPath;
|
|
503
|
+
cachedContent = module.cache.read(fullTabPath);
|
|
504
|
+
|
|
505
|
+
if (settings.cache && cachedContent) {
|
|
506
|
+
module.activate.tab(tabPath);
|
|
507
|
+
module.debug('Adding cached content', fullTabPath);
|
|
508
|
+
if (!settings.loadOnce) {
|
|
509
|
+
if (settings.evaluateScripts === 'once') {
|
|
510
|
+
module.update.content(tabPath, cachedContent, false);
|
|
511
|
+
} else {
|
|
512
|
+
module.update.content(tabPath, cachedContent);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);
|
|
516
|
+
} else if (existingRequest) {
|
|
517
|
+
module.set.loading(tabPath);
|
|
518
|
+
module.debug('Content is already loading', fullTabPath);
|
|
519
|
+
} else if ($.api !== undefined) {
|
|
520
|
+
requestSettings = $.extend(true, {}, settings.apiSettings, apiSettings);
|
|
521
|
+
module.debug('Retrieving remote content', fullTabPath, requestSettings);
|
|
522
|
+
module.set.loading(tabPath);
|
|
523
|
+
$tab.api(requestSettings);
|
|
524
|
+
} else {
|
|
525
|
+
module.error(error.api);
|
|
526
|
+
}
|
|
527
|
+
},
|
|
528
|
+
},
|
|
459
529
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
530
|
+
activate: {
|
|
531
|
+
all: function (tabPath) {
|
|
532
|
+
module.activate.tab(tabPath);
|
|
533
|
+
module.activate.navigation(tabPath);
|
|
534
|
+
},
|
|
535
|
+
tab: function (tabPath) {
|
|
536
|
+
var
|
|
537
|
+
$tab = module.get.tabElement(tabPath),
|
|
538
|
+
$deactiveTabs = settings.deactivate === 'siblings'
|
|
539
|
+
? $tab.siblings($tabs)
|
|
540
|
+
: $tabs.not($tab),
|
|
541
|
+
isActive = $tab.hasClass(className.active)
|
|
542
|
+
;
|
|
543
|
+
module.verbose('Showing tab content for', $tab);
|
|
544
|
+
if (!isActive) {
|
|
545
|
+
$tab
|
|
546
|
+
.addClass(className.active)
|
|
547
|
+
;
|
|
548
|
+
$deactiveTabs
|
|
549
|
+
.removeClass(className.active + ' ' + className.loading)
|
|
550
|
+
;
|
|
551
|
+
if ($tab.length > 0) {
|
|
552
|
+
settings.onVisible.call($tab[0], tabPath);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
},
|
|
556
|
+
navigation: function (tabPath) {
|
|
557
|
+
var
|
|
558
|
+
$navigation = module.get.navElement(tabPath),
|
|
559
|
+
$deactiveNavigation = settings.deactivate === 'siblings'
|
|
560
|
+
? $navigation.siblings($allModules)
|
|
561
|
+
: $allModules.not($navigation),
|
|
562
|
+
isActive = $navigation.hasClass(className.active)
|
|
563
|
+
;
|
|
564
|
+
module.verbose('Activating tab navigation for', $navigation, tabPath);
|
|
565
|
+
if (!isActive) {
|
|
566
|
+
$navigation
|
|
567
|
+
.addClass(className.active)
|
|
568
|
+
;
|
|
569
|
+
$deactiveNavigation
|
|
570
|
+
.removeClass(className.active + ' ' + className.loading)
|
|
571
|
+
;
|
|
572
|
+
}
|
|
573
|
+
},
|
|
574
|
+
},
|
|
488
575
|
|
|
489
|
-
|
|
576
|
+
deactivate: {
|
|
577
|
+
all: function () {
|
|
578
|
+
module.deactivate.navigation();
|
|
579
|
+
module.deactivate.tabs();
|
|
580
|
+
},
|
|
581
|
+
navigation: function () {
|
|
582
|
+
$allModules
|
|
583
|
+
.removeClass(className.active)
|
|
584
|
+
;
|
|
585
|
+
},
|
|
586
|
+
tabs: function () {
|
|
587
|
+
$tabs
|
|
588
|
+
.removeClass(className.active + ' ' + className.loading)
|
|
589
|
+
;
|
|
590
|
+
},
|
|
591
|
+
},
|
|
490
592
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
on : 'now',
|
|
498
|
-
cache : settings.alwaysRefresh,
|
|
499
|
-
headers : {
|
|
500
|
-
'X-Remote': true
|
|
593
|
+
is: {
|
|
594
|
+
tab: function (tabName) {
|
|
595
|
+
return tabName !== undefined
|
|
596
|
+
? module.get.tabElement(tabName).length > 0
|
|
597
|
+
: false;
|
|
598
|
+
},
|
|
501
599
|
},
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
600
|
+
|
|
601
|
+
get: {
|
|
602
|
+
initialPath: function () {
|
|
603
|
+
return $allModules.eq(0).data(metadata.tab) || $tabs.eq(0).data(metadata.tab);
|
|
604
|
+
},
|
|
605
|
+
path: function () {
|
|
606
|
+
return $.address.value();
|
|
607
|
+
},
|
|
608
|
+
// adds default tabs to tab path
|
|
609
|
+
defaultPathArray: function (tabPath) {
|
|
610
|
+
return module.utilities.pathToArray(module.get.defaultPath(tabPath));
|
|
611
|
+
},
|
|
612
|
+
defaultPath: function (tabPath) {
|
|
613
|
+
var
|
|
614
|
+
$defaultNav = $allModules.filter('[data-' + metadata.tab + '^="' + module.escape.string(tabPath) + '/"]').eq(0),
|
|
615
|
+
defaultTab = $defaultNav.data(metadata.tab) || false
|
|
616
|
+
;
|
|
617
|
+
if (defaultTab) {
|
|
618
|
+
module.debug('Found default tab', defaultTab);
|
|
619
|
+
if (recursionDepth < settings.maxDepth) {
|
|
620
|
+
recursionDepth++;
|
|
621
|
+
|
|
622
|
+
return module.get.defaultPath(defaultTab);
|
|
623
|
+
}
|
|
624
|
+
module.error(error.recursion);
|
|
625
|
+
} else {
|
|
626
|
+
module.debug('No default tabs found for', tabPath, $tabs);
|
|
627
|
+
}
|
|
628
|
+
recursionDepth = 0;
|
|
629
|
+
|
|
630
|
+
return tabPath;
|
|
631
|
+
},
|
|
632
|
+
navElement: function (tabPath) {
|
|
633
|
+
tabPath = tabPath || activeTabPath;
|
|
634
|
+
|
|
635
|
+
return $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]');
|
|
636
|
+
},
|
|
637
|
+
tabElement: function (tabPath) {
|
|
638
|
+
var
|
|
639
|
+
$fullPathTab,
|
|
640
|
+
$simplePathTab,
|
|
641
|
+
tabPathArray,
|
|
642
|
+
lastTab
|
|
643
|
+
;
|
|
644
|
+
tabPath = tabPath || activeTabPath;
|
|
645
|
+
tabPathArray = module.utilities.pathToArray(tabPath);
|
|
646
|
+
lastTab = module.utilities.last(tabPathArray);
|
|
647
|
+
$fullPathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]');
|
|
648
|
+
$simplePathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(lastTab) + '"]');
|
|
649
|
+
|
|
650
|
+
return $fullPathTab.length > 0
|
|
651
|
+
? $fullPathTab
|
|
652
|
+
: $simplePathTab;
|
|
653
|
+
},
|
|
654
|
+
tab: function () {
|
|
655
|
+
return activeTabPath;
|
|
656
|
+
},
|
|
532
657
|
},
|
|
533
|
-
urlData: {
|
|
534
|
-
tab: fullTabPath
|
|
535
|
-
}
|
|
536
|
-
},
|
|
537
|
-
request = $tab.api('get request') || false,
|
|
538
|
-
existingRequest = ( request && request.state() === 'pending' ),
|
|
539
|
-
requestSettings,
|
|
540
|
-
cachedContent
|
|
541
|
-
;
|
|
542
658
|
|
|
543
|
-
|
|
544
|
-
|
|
659
|
+
determine: {
|
|
660
|
+
activeTab: function () {
|
|
661
|
+
var activeTab = null;
|
|
662
|
+
|
|
663
|
+
$tabs.each(function (_index, tab) {
|
|
664
|
+
var $tab = $(tab);
|
|
665
|
+
|
|
666
|
+
if ($tab.hasClass(className.active)) {
|
|
667
|
+
var
|
|
668
|
+
tabPath = $(this).data(metadata.tab),
|
|
669
|
+
$anchor = $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]')
|
|
670
|
+
;
|
|
671
|
+
|
|
672
|
+
if ($anchor.hasClass(className.active)) {
|
|
673
|
+
activeTab = tabPath;
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
});
|
|
545
677
|
|
|
678
|
+
return activeTab;
|
|
679
|
+
},
|
|
680
|
+
},
|
|
681
|
+
|
|
682
|
+
utilities: {
|
|
683
|
+
filterArray: function (keepArray, removeArray) {
|
|
684
|
+
return $.grep(keepArray, function (keepValue) {
|
|
685
|
+
return $.inArray(keepValue, removeArray) === -1;
|
|
686
|
+
});
|
|
687
|
+
},
|
|
688
|
+
last: function (array) {
|
|
689
|
+
return Array.isArray(array)
|
|
690
|
+
? array[array.length - 1]
|
|
691
|
+
: false;
|
|
692
|
+
},
|
|
693
|
+
pathToArray: function (pathName) {
|
|
694
|
+
if (pathName === undefined) {
|
|
695
|
+
pathName = activeTabPath;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
return typeof pathName === 'string'
|
|
699
|
+
? pathName.split('/')
|
|
700
|
+
: [pathName];
|
|
701
|
+
},
|
|
702
|
+
arrayToPath: function (pathArray) {
|
|
703
|
+
return Array.isArray(pathArray)
|
|
704
|
+
? pathArray.join('/')
|
|
705
|
+
: false;
|
|
706
|
+
},
|
|
707
|
+
},
|
|
546
708
|
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
709
|
+
setting: function (name, value) {
|
|
710
|
+
module.debug('Changing setting', name, value);
|
|
711
|
+
if ($.isPlainObject(name)) {
|
|
712
|
+
$.extend(true, settings, name);
|
|
713
|
+
} else if (value !== undefined) {
|
|
714
|
+
if ($.isPlainObject(settings[name])) {
|
|
715
|
+
$.extend(true, settings[name], value);
|
|
716
|
+
} else {
|
|
717
|
+
settings[name] = value;
|
|
718
|
+
}
|
|
719
|
+
} else {
|
|
720
|
+
return settings[name];
|
|
721
|
+
}
|
|
722
|
+
},
|
|
723
|
+
internal: function (name, value) {
|
|
724
|
+
if ($.isPlainObject(name)) {
|
|
725
|
+
$.extend(true, module, name);
|
|
726
|
+
} else if (value !== undefined) {
|
|
727
|
+
module[name] = value;
|
|
728
|
+
} else {
|
|
729
|
+
return module[name];
|
|
730
|
+
}
|
|
731
|
+
},
|
|
732
|
+
debug: function () {
|
|
733
|
+
if (!settings.silent && settings.debug) {
|
|
734
|
+
if (settings.performance) {
|
|
735
|
+
module.performance.log(arguments);
|
|
736
|
+
} else {
|
|
737
|
+
module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
|
|
738
|
+
module.debug.apply(console, arguments);
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
},
|
|
742
|
+
verbose: function () {
|
|
743
|
+
if (!settings.silent && settings.verbose && settings.debug) {
|
|
744
|
+
if (settings.performance) {
|
|
745
|
+
module.performance.log(arguments);
|
|
746
|
+
} else {
|
|
747
|
+
module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
|
|
748
|
+
module.verbose.apply(console, arguments);
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
},
|
|
752
|
+
error: function () {
|
|
753
|
+
if (!settings.silent) {
|
|
754
|
+
module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
|
|
755
|
+
module.error.apply(console, arguments);
|
|
756
|
+
}
|
|
757
|
+
},
|
|
758
|
+
performance: {
|
|
759
|
+
log: function (message) {
|
|
760
|
+
var
|
|
761
|
+
currentTime,
|
|
762
|
+
executionTime,
|
|
763
|
+
previousTime
|
|
764
|
+
;
|
|
765
|
+
if (settings.performance) {
|
|
766
|
+
currentTime = Date.now();
|
|
767
|
+
previousTime = time || currentTime;
|
|
768
|
+
executionTime = currentTime - previousTime;
|
|
769
|
+
time = currentTime;
|
|
770
|
+
performance.push({
|
|
771
|
+
Name: message[0],
|
|
772
|
+
Arguments: [].slice.call(message, 1) || '',
|
|
773
|
+
Element: element,
|
|
774
|
+
'Execution Time': executionTime,
|
|
775
|
+
});
|
|
776
|
+
}
|
|
777
|
+
clearTimeout(module.performance.timer);
|
|
778
|
+
module.performance.timer = setTimeout(module.performance.display, 500);
|
|
779
|
+
},
|
|
780
|
+
display: function () {
|
|
781
|
+
var
|
|
782
|
+
title = settings.name + ':',
|
|
783
|
+
totalTime = 0
|
|
784
|
+
;
|
|
785
|
+
time = false;
|
|
786
|
+
clearTimeout(module.performance.timer);
|
|
787
|
+
$.each(performance, function (index, data) {
|
|
788
|
+
totalTime += data['Execution Time'];
|
|
789
|
+
});
|
|
790
|
+
title += ' ' + totalTime + 'ms';
|
|
791
|
+
if (moduleSelector) {
|
|
792
|
+
title += ' \'' + moduleSelector + '\'';
|
|
793
|
+
}
|
|
794
|
+
if (performance.length > 0) {
|
|
795
|
+
console.groupCollapsed(title);
|
|
796
|
+
if (console.table) {
|
|
797
|
+
console.table(performance);
|
|
798
|
+
} else {
|
|
799
|
+
$.each(performance, function (index, data) {
|
|
800
|
+
console.log(data.Name + ': ' + data['Execution Time'] + 'ms');
|
|
801
|
+
});
|
|
802
|
+
}
|
|
803
|
+
console.groupEnd();
|
|
804
|
+
}
|
|
805
|
+
performance = [];
|
|
806
|
+
},
|
|
807
|
+
},
|
|
808
|
+
invoke: function (query, passedArguments, context) {
|
|
809
|
+
var
|
|
810
|
+
object = instance,
|
|
811
|
+
maxDepth,
|
|
812
|
+
found,
|
|
813
|
+
response
|
|
814
|
+
;
|
|
815
|
+
passedArguments = passedArguments || queryArguments;
|
|
816
|
+
context = context || element;
|
|
817
|
+
if (typeof query === 'string' && object !== undefined) {
|
|
818
|
+
query = query.split(/[ .]/);
|
|
819
|
+
maxDepth = query.length - 1;
|
|
820
|
+
$.each(query, function (depth, value) {
|
|
821
|
+
var camelCaseValue = depth !== maxDepth
|
|
822
|
+
? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
|
|
823
|
+
: query
|
|
824
|
+
;
|
|
825
|
+
if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {
|
|
826
|
+
object = object[camelCaseValue];
|
|
827
|
+
} else if (object[camelCaseValue] !== undefined) {
|
|
828
|
+
found = object[camelCaseValue];
|
|
829
|
+
|
|
830
|
+
return false;
|
|
831
|
+
} else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {
|
|
832
|
+
object = object[value];
|
|
833
|
+
} else if (object[value] !== undefined) {
|
|
834
|
+
found = object[value];
|
|
835
|
+
|
|
836
|
+
return false;
|
|
837
|
+
} else {
|
|
838
|
+
module.error(error.method, query);
|
|
839
|
+
|
|
840
|
+
return false;
|
|
841
|
+
}
|
|
842
|
+
});
|
|
843
|
+
}
|
|
844
|
+
if (isFunction(found)) {
|
|
845
|
+
response = found.apply(context, passedArguments);
|
|
846
|
+
} else if (found !== undefined) {
|
|
847
|
+
response = found;
|
|
848
|
+
}
|
|
849
|
+
if (Array.isArray(returnedValue)) {
|
|
850
|
+
returnedValue.push(response);
|
|
851
|
+
} else if (returnedValue !== undefined) {
|
|
852
|
+
returnedValue = [returnedValue, response];
|
|
853
|
+
} else if (response !== undefined) {
|
|
854
|
+
returnedValue = response;
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
return found;
|
|
858
|
+
},
|
|
859
|
+
};
|
|
860
|
+
if (methodInvoked) {
|
|
861
|
+
if (instance === undefined) {
|
|
862
|
+
module.initialize();
|
|
553
863
|
}
|
|
554
|
-
|
|
555
|
-
|
|
864
|
+
module.invoke(query);
|
|
865
|
+
} else {
|
|
866
|
+
if (instance !== undefined) {
|
|
867
|
+
instance.invoke('destroy');
|
|
556
868
|
}
|
|
557
|
-
|
|
558
|
-
settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);
|
|
559
|
-
}
|
|
560
|
-
else if(existingRequest) {
|
|
561
|
-
module.set.loading(tabPath);
|
|
562
|
-
module.debug('Content is already loading', fullTabPath);
|
|
563
|
-
}
|
|
564
|
-
else if($.api !== undefined) {
|
|
565
|
-
requestSettings = $.extend(true, {}, settings.apiSettings, apiSettings);
|
|
566
|
-
module.debug('Retrieving remote content', fullTabPath, requestSettings);
|
|
567
|
-
module.set.loading(tabPath);
|
|
568
|
-
$tab.api(requestSettings);
|
|
869
|
+
module.initialize();
|
|
569
870
|
}
|
|
570
|
-
|
|
571
|
-
module.error(error.api);
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
},
|
|
871
|
+
});
|
|
575
872
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
},
|
|
581
|
-
tab: function(tabPath) {
|
|
582
|
-
var
|
|
583
|
-
$tab = module.get.tabElement(tabPath),
|
|
584
|
-
$deactiveTabs = (settings.deactivate == 'siblings')
|
|
585
|
-
? $tab.siblings($tabs)
|
|
586
|
-
: $tabs.not($tab),
|
|
587
|
-
isActive = $tab.hasClass(className.active)
|
|
588
|
-
;
|
|
589
|
-
module.verbose('Showing tab content for', $tab);
|
|
590
|
-
if(!isActive) {
|
|
591
|
-
$tab
|
|
592
|
-
.addClass(className.active)
|
|
593
|
-
;
|
|
594
|
-
$deactiveTabs
|
|
595
|
-
.removeClass(className.active + ' ' + className.loading)
|
|
596
|
-
;
|
|
597
|
-
if($tab.length > 0) {
|
|
598
|
-
settings.onVisible.call($tab[0], tabPath);
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
},
|
|
602
|
-
navigation: function(tabPath) {
|
|
603
|
-
var
|
|
604
|
-
$navigation = module.get.navElement(tabPath),
|
|
605
|
-
$deactiveNavigation = (settings.deactivate == 'siblings')
|
|
606
|
-
? $navigation.siblings($allModules)
|
|
607
|
-
: $allModules.not($navigation),
|
|
608
|
-
isActive = $navigation.hasClass(className.active)
|
|
609
|
-
;
|
|
610
|
-
module.verbose('Activating tab navigation for', $navigation, tabPath);
|
|
611
|
-
if(!isActive) {
|
|
612
|
-
$navigation
|
|
613
|
-
.addClass(className.active)
|
|
614
|
-
;
|
|
615
|
-
$deactiveNavigation
|
|
616
|
-
.removeClass(className.active + ' ' + className.loading)
|
|
617
|
-
;
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
},
|
|
873
|
+
return returnedValue !== undefined
|
|
874
|
+
? returnedValue
|
|
875
|
+
: this;
|
|
876
|
+
};
|
|
621
877
|
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
},
|
|
627
|
-
navigation: function() {
|
|
628
|
-
$allModules
|
|
629
|
-
.removeClass(className.active)
|
|
630
|
-
;
|
|
631
|
-
},
|
|
632
|
-
tabs: function() {
|
|
633
|
-
$tabs
|
|
634
|
-
.removeClass(className.active + ' ' + className.loading)
|
|
635
|
-
;
|
|
636
|
-
}
|
|
637
|
-
},
|
|
878
|
+
// shortcut for tabbed content with no defined navigation
|
|
879
|
+
$.tab = function () {
|
|
880
|
+
$(window).tab.apply(this, arguments);
|
|
881
|
+
};
|
|
638
882
|
|
|
639
|
-
|
|
640
|
-
tab: function(tabName) {
|
|
641
|
-
return (tabName !== undefined)
|
|
642
|
-
? ( module.get.tabElement(tabName).length > 0 )
|
|
643
|
-
: false
|
|
644
|
-
;
|
|
645
|
-
}
|
|
646
|
-
},
|
|
883
|
+
$.fn.tab.settings = {
|
|
647
884
|
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
return $allModules.eq(0).data(metadata.tab) || $tabs.eq(0).data(metadata.tab);
|
|
651
|
-
},
|
|
652
|
-
path: function() {
|
|
653
|
-
return $.address.value();
|
|
654
|
-
},
|
|
655
|
-
// adds default tabs to tab path
|
|
656
|
-
defaultPathArray: function(tabPath) {
|
|
657
|
-
return module.utilities.pathToArray( module.get.defaultPath(tabPath) );
|
|
658
|
-
},
|
|
659
|
-
defaultPath: function(tabPath) {
|
|
660
|
-
var
|
|
661
|
-
$defaultNav = $allModules.filter('[data-' + metadata.tab + '^="' + module.escape.string(tabPath) + '/"]').eq(0),
|
|
662
|
-
defaultTab = $defaultNav.data(metadata.tab) || false
|
|
663
|
-
;
|
|
664
|
-
if( defaultTab ) {
|
|
665
|
-
module.debug('Found default tab', defaultTab);
|
|
666
|
-
if(recursionDepth < settings.maxDepth) {
|
|
667
|
-
recursionDepth++;
|
|
668
|
-
return module.get.defaultPath(defaultTab);
|
|
669
|
-
}
|
|
670
|
-
module.error(error.recursion);
|
|
671
|
-
}
|
|
672
|
-
else {
|
|
673
|
-
module.debug('No default tabs found for', tabPath, $tabs);
|
|
674
|
-
}
|
|
675
|
-
recursionDepth = 0;
|
|
676
|
-
return tabPath;
|
|
677
|
-
},
|
|
678
|
-
navElement: function(tabPath) {
|
|
679
|
-
tabPath = tabPath || activeTabPath;
|
|
680
|
-
return $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]');
|
|
681
|
-
},
|
|
682
|
-
tabElement: function(tabPath) {
|
|
683
|
-
var
|
|
684
|
-
$fullPathTab,
|
|
685
|
-
$simplePathTab,
|
|
686
|
-
tabPathArray,
|
|
687
|
-
lastTab
|
|
688
|
-
;
|
|
689
|
-
tabPath = tabPath || activeTabPath;
|
|
690
|
-
tabPathArray = module.utilities.pathToArray(tabPath);
|
|
691
|
-
lastTab = module.utilities.last(tabPathArray);
|
|
692
|
-
$fullPathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]');
|
|
693
|
-
$simplePathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(lastTab) + '"]');
|
|
694
|
-
return ($fullPathTab.length > 0)
|
|
695
|
-
? $fullPathTab
|
|
696
|
-
: $simplePathTab
|
|
697
|
-
;
|
|
698
|
-
},
|
|
699
|
-
tab: function() {
|
|
700
|
-
return activeTabPath;
|
|
701
|
-
}
|
|
702
|
-
},
|
|
885
|
+
name: 'Tab',
|
|
886
|
+
namespace: 'tab',
|
|
703
887
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
888
|
+
silent: false,
|
|
889
|
+
debug: false,
|
|
890
|
+
verbose: false,
|
|
891
|
+
performance: true,
|
|
707
892
|
|
|
708
|
-
|
|
709
|
-
|
|
893
|
+
auto: false, // uses pjax style endpoints fetching content from same url with remote-content headers
|
|
894
|
+
history: false, // use browser history
|
|
895
|
+
historyType: 'hash', // #/ or html5 state
|
|
896
|
+
path: false, // base path of url
|
|
710
897
|
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
$anchor = $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]')
|
|
715
|
-
;
|
|
898
|
+
context: false, // specify a context that tabs must appear inside
|
|
899
|
+
childrenOnly: false, // use only tabs that are children of context
|
|
900
|
+
maxDepth: 25, // max depth a tab can be nested
|
|
716
901
|
|
|
717
|
-
|
|
718
|
-
activeTab = tabPath;
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
});
|
|
902
|
+
deactivate: 'siblings', // whether tabs should deactivate sibling menu elements or all elements initialized together
|
|
722
903
|
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
904
|
+
alwaysRefresh: false, // load tab content new every tab click
|
|
905
|
+
cache: true, // cache the content requests to pull locally
|
|
906
|
+
loadOnce: false, // Whether tab data should only be loaded once when using remote content
|
|
907
|
+
cacheType: 'response', // Whether to cache exact response, or to html cache contents after scripts execute
|
|
908
|
+
ignoreFirstLoad: false, // don't load remote content on first load
|
|
726
909
|
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
return ( $.inArray(keepValue, removeArray) == -1);
|
|
731
|
-
});
|
|
732
|
-
},
|
|
733
|
-
last: function(array) {
|
|
734
|
-
return Array.isArray(array)
|
|
735
|
-
? array[ array.length - 1]
|
|
736
|
-
: false
|
|
737
|
-
;
|
|
738
|
-
},
|
|
739
|
-
pathToArray: function(pathName) {
|
|
740
|
-
if(pathName === undefined) {
|
|
741
|
-
pathName = activeTabPath;
|
|
742
|
-
}
|
|
743
|
-
return typeof pathName == 'string'
|
|
744
|
-
? pathName.split('/')
|
|
745
|
-
: [pathName]
|
|
746
|
-
;
|
|
747
|
-
},
|
|
748
|
-
arrayToPath: function(pathArray) {
|
|
749
|
-
return Array.isArray(pathArray)
|
|
750
|
-
? pathArray.join('/')
|
|
751
|
-
: false
|
|
752
|
-
;
|
|
753
|
-
}
|
|
754
|
-
},
|
|
910
|
+
apiSettings: false, // settings for api call
|
|
911
|
+
evaluateScripts: 'once', // whether inline scripts should be parsed (true/false/once). Once will not re-evaluate on cached content
|
|
912
|
+
autoTabActivation: true, // whether a non existing active tab will auto activate the first available tab
|
|
755
913
|
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
}
|
|
765
|
-
else {
|
|
766
|
-
settings[name] = value;
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
else {
|
|
770
|
-
return settings[name];
|
|
771
|
-
}
|
|
914
|
+
onFirstLoad: function (tabPath, parameterArray, historyEvent) {}, // called first time loaded
|
|
915
|
+
onLoad: function (tabPath, parameterArray, historyEvent) {}, // called on every load
|
|
916
|
+
onVisible: function (tabPath, parameterArray, historyEvent) {}, // called every time tab visible
|
|
917
|
+
onRequest: function (tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content
|
|
918
|
+
onBeforeChange: function (tabPath) {}, // called before a tab is about to be changed. Returning false will cancel the tab change
|
|
919
|
+
|
|
920
|
+
templates: {
|
|
921
|
+
determineTitle: function (tabArray) {}, // returns page title for path
|
|
772
922
|
},
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
}
|
|
923
|
+
|
|
924
|
+
error: {
|
|
925
|
+
api: 'You attempted to load content without API module',
|
|
926
|
+
method: 'The method you called is not defined',
|
|
927
|
+
missingTab: 'Activated tab cannot be found. Tabs are case-sensitive.',
|
|
928
|
+
noContent: 'The tab you specified is missing a content url.',
|
|
929
|
+
path: 'History enabled, but no path was specified',
|
|
930
|
+
recursion: 'Max recursive depth reached',
|
|
931
|
+
state: 'History requires Asual\'s Address library <https://github.com/asual/jquery-address>',
|
|
783
932
|
},
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
module.performance.log(arguments);
|
|
788
|
-
}
|
|
789
|
-
else {
|
|
790
|
-
module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
|
|
791
|
-
module.debug.apply(console, arguments);
|
|
792
|
-
}
|
|
793
|
-
}
|
|
933
|
+
|
|
934
|
+
regExp: {
|
|
935
|
+
escape: /[\s#$()*+,.:=?@[\\\]^{|}-]/g,
|
|
794
936
|
},
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
else {
|
|
801
|
-
module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
|
|
802
|
-
module.verbose.apply(console, arguments);
|
|
803
|
-
}
|
|
804
|
-
}
|
|
937
|
+
|
|
938
|
+
metadata: {
|
|
939
|
+
tab: 'tab',
|
|
940
|
+
loaded: 'loaded',
|
|
941
|
+
promise: 'promise',
|
|
805
942
|
},
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
}
|
|
943
|
+
|
|
944
|
+
className: {
|
|
945
|
+
loading: 'loading',
|
|
946
|
+
active: 'active',
|
|
811
947
|
},
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
executionTime,
|
|
817
|
-
previousTime
|
|
818
|
-
;
|
|
819
|
-
if(settings.performance) {
|
|
820
|
-
currentTime = new Date().getTime();
|
|
821
|
-
previousTime = time || currentTime;
|
|
822
|
-
executionTime = currentTime - previousTime;
|
|
823
|
-
time = currentTime;
|
|
824
|
-
performance.push({
|
|
825
|
-
'Name' : message[0],
|
|
826
|
-
'Arguments' : [].slice.call(message, 1) || '',
|
|
827
|
-
'Element' : element,
|
|
828
|
-
'Execution Time' : executionTime
|
|
829
|
-
});
|
|
830
|
-
}
|
|
831
|
-
clearTimeout(module.performance.timer);
|
|
832
|
-
module.performance.timer = setTimeout(module.performance.display, 500);
|
|
833
|
-
},
|
|
834
|
-
display: function() {
|
|
835
|
-
var
|
|
836
|
-
title = settings.name + ':',
|
|
837
|
-
totalTime = 0
|
|
838
|
-
;
|
|
839
|
-
time = false;
|
|
840
|
-
clearTimeout(module.performance.timer);
|
|
841
|
-
$.each(performance, function(index, data) {
|
|
842
|
-
totalTime += data['Execution Time'];
|
|
843
|
-
});
|
|
844
|
-
title += ' ' + totalTime + 'ms';
|
|
845
|
-
if(moduleSelector) {
|
|
846
|
-
title += ' \'' + moduleSelector + '\'';
|
|
847
|
-
}
|
|
848
|
-
if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
|
|
849
|
-
console.groupCollapsed(title);
|
|
850
|
-
if(console.table) {
|
|
851
|
-
console.table(performance);
|
|
852
|
-
}
|
|
853
|
-
else {
|
|
854
|
-
$.each(performance, function(index, data) {
|
|
855
|
-
console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
|
|
856
|
-
});
|
|
857
|
-
}
|
|
858
|
-
console.groupEnd();
|
|
859
|
-
}
|
|
860
|
-
performance = [];
|
|
861
|
-
}
|
|
948
|
+
|
|
949
|
+
selector: {
|
|
950
|
+
tabs: '.ui.tab',
|
|
951
|
+
ui: '.ui',
|
|
862
952
|
},
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
maxDepth,
|
|
867
|
-
found,
|
|
868
|
-
response
|
|
869
|
-
;
|
|
870
|
-
passedArguments = passedArguments || queryArguments;
|
|
871
|
-
context = context || element;
|
|
872
|
-
if(typeof query == 'string' && object !== undefined) {
|
|
873
|
-
query = query.split(/[\. ]/);
|
|
874
|
-
maxDepth = query.length - 1;
|
|
875
|
-
$.each(query, function(depth, value) {
|
|
876
|
-
var camelCaseValue = (depth != maxDepth)
|
|
877
|
-
? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
|
|
878
|
-
: query
|
|
879
|
-
;
|
|
880
|
-
if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
|
|
881
|
-
object = object[camelCaseValue];
|
|
882
|
-
}
|
|
883
|
-
else if( object[camelCaseValue] !== undefined ) {
|
|
884
|
-
found = object[camelCaseValue];
|
|
885
|
-
return false;
|
|
886
|
-
}
|
|
887
|
-
else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
|
|
888
|
-
object = object[value];
|
|
889
|
-
}
|
|
890
|
-
else if( object[value] !== undefined ) {
|
|
891
|
-
found = object[value];
|
|
892
|
-
return false;
|
|
893
|
-
}
|
|
894
|
-
else {
|
|
895
|
-
module.error(error.method, query);
|
|
896
|
-
return false;
|
|
897
|
-
}
|
|
898
|
-
});
|
|
899
|
-
}
|
|
900
|
-
if ( $.isFunction( found ) ) {
|
|
901
|
-
response = found.apply(context, passedArguments);
|
|
902
|
-
}
|
|
903
|
-
else if(found !== undefined) {
|
|
904
|
-
response = found;
|
|
905
|
-
}
|
|
906
|
-
if(Array.isArray(returnedValue)) {
|
|
907
|
-
returnedValue.push(response);
|
|
908
|
-
}
|
|
909
|
-
else if(returnedValue !== undefined) {
|
|
910
|
-
returnedValue = [returnedValue, response];
|
|
911
|
-
}
|
|
912
|
-
else if(response !== undefined) {
|
|
913
|
-
returnedValue = response;
|
|
914
|
-
}
|
|
915
|
-
return found;
|
|
916
|
-
}
|
|
917
|
-
};
|
|
918
|
-
if(methodInvoked) {
|
|
919
|
-
if(instance === undefined) {
|
|
920
|
-
module.initialize();
|
|
921
|
-
}
|
|
922
|
-
module.invoke(query);
|
|
923
|
-
}
|
|
924
|
-
else {
|
|
925
|
-
if(instance !== undefined) {
|
|
926
|
-
instance.invoke('destroy');
|
|
927
|
-
}
|
|
928
|
-
module.initialize();
|
|
929
|
-
}
|
|
930
|
-
})
|
|
931
|
-
;
|
|
932
|
-
return (returnedValue !== undefined)
|
|
933
|
-
? returnedValue
|
|
934
|
-
: this
|
|
935
|
-
;
|
|
936
|
-
|
|
937
|
-
};
|
|
938
|
-
|
|
939
|
-
// shortcut for tabbed content with no defined navigation
|
|
940
|
-
$.tab = function() {
|
|
941
|
-
$(window).tab.apply(this, arguments);
|
|
942
|
-
};
|
|
943
|
-
|
|
944
|
-
$.fn.tab.settings = {
|
|
945
|
-
|
|
946
|
-
name : 'Tab',
|
|
947
|
-
namespace : 'tab',
|
|
948
|
-
|
|
949
|
-
silent : false,
|
|
950
|
-
debug : false,
|
|
951
|
-
verbose : false,
|
|
952
|
-
performance : true,
|
|
953
|
-
|
|
954
|
-
auto : false, // uses pjax style endpoints fetching content from same url with remote-content headers
|
|
955
|
-
history : false, // use browser history
|
|
956
|
-
historyType : 'hash', // #/ or html5 state
|
|
957
|
-
path : false, // base path of url
|
|
958
|
-
|
|
959
|
-
context : false, // specify a context that tabs must appear inside
|
|
960
|
-
childrenOnly : false, // use only tabs that are children of context
|
|
961
|
-
maxDepth : 25, // max depth a tab can be nested
|
|
962
|
-
|
|
963
|
-
deactivate : 'siblings', // whether tabs should deactivate sibling menu elements or all elements initialized together
|
|
964
|
-
|
|
965
|
-
alwaysRefresh : false, // load tab content new every tab click
|
|
966
|
-
cache : true, // cache the content requests to pull locally
|
|
967
|
-
loadOnce : false, // Whether tab data should only be loaded once when using remote content
|
|
968
|
-
cacheType : 'response', // Whether to cache exact response, or to html cache contents after scripts execute
|
|
969
|
-
ignoreFirstLoad : false, // don't load remote content on first load
|
|
970
|
-
|
|
971
|
-
apiSettings : false, // settings for api call
|
|
972
|
-
evaluateScripts : 'once', // whether inline scripts should be parsed (true/false/once). Once will not re-evaluate on cached content
|
|
973
|
-
autoTabActivation: true, // whether a non existing active tab will auto activate the first available tab
|
|
974
|
-
|
|
975
|
-
onFirstLoad : function(tabPath, parameterArray, historyEvent) {}, // called first time loaded
|
|
976
|
-
onLoad : function(tabPath, parameterArray, historyEvent) {}, // called on every load
|
|
977
|
-
onVisible : function(tabPath, parameterArray, historyEvent) {}, // called every time tab visible
|
|
978
|
-
onRequest : function(tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content
|
|
979
|
-
onBeforeChange: function(tabPath) {}, // called before a tab is about to be changed. Returning false will cancel the tab change
|
|
980
|
-
|
|
981
|
-
templates : {
|
|
982
|
-
determineTitle: function(tabArray) {} // returns page title for path
|
|
983
|
-
},
|
|
984
|
-
|
|
985
|
-
error: {
|
|
986
|
-
api : 'You attempted to load content without API module',
|
|
987
|
-
method : 'The method you called is not defined',
|
|
988
|
-
missingTab : 'Activated tab cannot be found. Tabs are case-sensitive.',
|
|
989
|
-
noContent : 'The tab you specified is missing a content url.',
|
|
990
|
-
path : 'History enabled, but no path was specified',
|
|
991
|
-
recursion : 'Max recursive depth reached',
|
|
992
|
-
legacyInit : 'onTabInit has been renamed to onFirstLoad in 2.0, please adjust your code.',
|
|
993
|
-
legacyLoad : 'onTabLoad has been renamed to onLoad in 2.0. Please adjust your code',
|
|
994
|
-
state : 'History requires Asual\'s Address library <https://github.com/asual/jquery-address>'
|
|
995
|
-
},
|
|
996
|
-
|
|
997
|
-
regExp : {
|
|
998
|
-
escape : /[-[\]{}()*+?.,\\^$|#\s:=@]/g
|
|
999
|
-
},
|
|
1000
|
-
|
|
1001
|
-
metadata : {
|
|
1002
|
-
tab : 'tab',
|
|
1003
|
-
loaded : 'loaded',
|
|
1004
|
-
promise: 'promise'
|
|
1005
|
-
},
|
|
1006
|
-
|
|
1007
|
-
className : {
|
|
1008
|
-
loading : 'loading',
|
|
1009
|
-
active : 'active'
|
|
1010
|
-
},
|
|
1011
|
-
|
|
1012
|
-
selector : {
|
|
1013
|
-
tabs : '.ui.tab',
|
|
1014
|
-
ui : '.ui'
|
|
1015
|
-
}
|
|
1016
|
-
|
|
1017
|
-
};
|
|
1018
|
-
|
|
1019
|
-
})( jQuery, window, document );
|
|
953
|
+
|
|
954
|
+
};
|
|
955
|
+
})(jQuery, window, document);
|