megatron 0.1.89 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/megatron/index.js +34 -94
  3. data/app/assets/javascripts/megatron/utils/activate-nav-items.js +20 -0
  4. data/app/assets/javascripts/megatron/utils/auto-navigate.js +11 -14
  5. data/app/assets/javascripts/megatron/utils/clipboard.js +9 -1
  6. data/app/assets/javascripts/megatron/utils/form-flash.js +14 -0
  7. data/app/assets/javascripts/megatron/utils/form-notify.js +50 -38
  8. data/app/assets/javascripts/megatron/utils/highlight-code.js +46 -0
  9. data/app/assets/javascripts/megatron/utils/messages.js +10 -6
  10. data/app/assets/javascripts/megatron/utils/progress-bar.js +9 -0
  11. data/app/assets/javascripts/megatron/utils/text-helpers.js +17 -7
  12. data/app/assets/stylesheets/megatron/modules/forms/_range-input.scss +37 -37
  13. data/app/helpers/megatron/application_helper.rb +9 -7
  14. data/app/helpers/megatron/form_helper.rb +6 -4
  15. data/app/views/layouts/megatron/application.html.slim +1 -1
  16. data/lib/megatron/helper.rb +27 -29
  17. data/lib/megatron/version.rb +1 -1
  18. data/public/assets/megatron/{megatron-0.1.89.css → megatron-0.2.0.css} +2 -2
  19. data/public/assets/megatron/megatron-0.2.0.css.gz +0 -0
  20. data/public/assets/megatron/{megatron-0.1.89.css.map → megatron-0.2.0.css.map} +2 -2
  21. data/public/assets/megatron/{megatron-0.1.89.js → megatron-0.2.0.js} +105 -134
  22. data/public/assets/megatron/megatron-0.2.0.js.gz +0 -0
  23. data/public/assets/megatron/megatron-0.2.0.map.json +1 -0
  24. data/public/assets/megatron/{megatron-error-pages-0.1.89.css → megatron-error-pages-0.2.0.css} +0 -0
  25. data/public/assets/megatron/{megatron-error-pages-0.1.89.css.gz → megatron-error-pages-0.2.0.css.gz} +0 -0
  26. metadata +14 -22
  27. data/app/assets/javascripts/megatron/form.js +0 -36
  28. data/app/assets/javascripts/megatron/link.js +0 -58
  29. data/app/assets/javascripts/megatron/utils/index.js +0 -81
  30. data/app/assets/javascripts/megatron/utils/range-input-helper.js +0 -280
  31. data/app/assets/javascripts/megatron/utils/time/date-to-html.js +0 -59
  32. data/app/assets/javascripts/megatron/utils/time/time-switch.js +0 -84
  33. data/app/assets/javascripts/megatron/utils/time/timeago.js +0 -95
  34. data/app/assets/javascripts/megatron/utils/toggler.js +0 -274
  35. data/app/assets/stylesheets/_example.scss +0 -76
  36. data/app/assets/stylesheets/_grid.scss +0 -41
  37. data/app/assets/stylesheets/_typography.scss +0 -38
  38. data/app/assets/stylesheets/application.scss +0 -19
  39. data/public/assets/megatron/megatron-0.1.89.css.gz +0 -0
  40. data/public/assets/megatron/megatron-0.1.89.js.gz +0 -0
  41. data/public/assets/megatron/megatron-0.1.89.map.json +0 -1
@@ -1,81 +0,0 @@
1
- var bean = require('bean')
2
- var CodeMirror = require('codemirror')
3
- var Toggler = require('./toggler')
4
- var Messages = require('./messages')
5
- var AutoNavigate = require('./auto-navigate')
6
- var TextHelpers = require('./text-helpers')
7
- var RangeInputHelper = require('./range-input-helper')
8
- var Timeago = require('./time/timeago')
9
- var TimeSwitch = require('./time/time-switch')
10
- var notify = require('notify')
11
-
12
- require('codemirror/mode/htmlmixed/htmlmixed')
13
- require('codemirror/mode/slim/slim')
14
- require('codemirror/mode/javascript/javascript')
15
- require('codemirror/mode/css/css')
16
- require('codemirror/mode/sql/sql')
17
- require('codemirror/addon/runmode/runmode.js')
18
- require('codemirror/addon/edit/matchbrackets.js')
19
-
20
- module.exports = {
21
- Timeago: Timeago,
22
- TimeSwitch: TimeSwitch,
23
- CodeMirror: CodeMirror,
24
- Toggler: Toggler,
25
- Messages: Messages,
26
- AutoNavigate: AutoNavigate,
27
- TextHelpers: TextHelpers,
28
- RangeInputHelper: RangeInputHelper,
29
-
30
- toggleActiveNav: function toggleActiveNav(){
31
- Array.prototype.forEach.call(document.querySelectorAll('[data-match-url]'), function(node){
32
- var matcher = node.getAttribute('data-match-url')
33
- if (matcher && new RegExp(node.getAttribute('data-match-url'), "i").test(location.pathname)) {
34
- node.className += ' here'
35
- }
36
- })
37
- },
38
-
39
- highlightCode: function highlightCode(){
40
- var aliasLang = function(lang) {
41
- var aliases = {
42
- 'markup': 'htmlmixed',
43
- 'html': 'htmlmixed',
44
- 'json': 'javascript',
45
- }
46
-
47
- return(aliases[lang] || lang)
48
- }
49
- var elements = document.querySelectorAll('[class*="language-"], [class*="lang-"]');
50
- for (var i=0, element; element = elements[i++];) {
51
- var lang = element.className.match(/lang.*?-(\S+)/)[1]
52
-
53
- // Standardize classes: lang-[language]
54
- if (element.classList.contains('language-'+lang)) {
55
- element.classList.remove('language-'+lang)
56
- element.classList.add('lang-'+lang)
57
- }
58
- var code = element.textContent.trim()
59
-
60
- var options = {}
61
- if(lang == 'json') {
62
- options.json = true
63
- }
64
-
65
- CodeMirror.runMode(code, aliasLang(lang), element, options)
66
- element.innerHTML = "<code class='highlighted-code static-code cm-s-default'>" + element.innerHTML + "</code>"
67
- element.classList.add('highlighted')
68
- }
69
- },
70
-
71
- notifyFormFlash: function notifyFormFlash(){
72
- var flash = document.querySelector('.form-flash')
73
- if (flash) {
74
- var type = flash.dataset.type || 'error'
75
- if (type == 'info') type = 'action'
76
- notify[type](flash.textContent.trim())
77
- flash.classList.add('hidden')
78
- }
79
- }
80
-
81
- }
@@ -1,280 +0,0 @@
1
- var bean = require('bean')
2
-
3
- require('compose-tap-event')
4
-
5
- var RangeInputHelper = {
6
- listen: function(){
7
- bean.on(document, "input toggler:show", "[type=range]", RangeInputHelper.change)
8
- bean.on(document, "click change input", "[type=range]", RangeInputHelper.focus)
9
- },
10
-
11
- change: function(event) {
12
- RangeInputHelper.refresh(event.currentTarget)
13
- },
14
-
15
- refresh: function (slider) {
16
- RangeInputHelper.setLabels(slider)
17
- RangeInputHelper.setInput(slider)
18
- },
19
-
20
- focus: function(event){
21
- event.currentTarget.focus()
22
- },
23
-
24
- setup: function(){
25
- var ranges = document.querySelectorAll('[type=range]:not(.range-input)')
26
- Array.prototype.forEach.call(ranges, RangeInputHelper.initSlider)
27
- RangeInputHelper.listen()
28
- },
29
-
30
- initSlider: function(slider){
31
- slider.className += ' range-input'
32
- slider.dataset.id = String(parseInt(Math.random() * 10000))
33
- RangeInputHelper.cacheSet(slider)
34
-
35
- slider.insertAdjacentHTML('beforebegin', RangeInputHelper.template(slider))
36
- RangeInputHelper.refresh(slider)
37
-
38
- slider.remove()
39
- },
40
-
41
- cacheSet: function(slider) {
42
- var labels = RangeInputHelper.getLabels(slider)
43
- slider.dataset.cache = JSON.stringify({
44
- labels: labels,
45
- externalLabels: RangeInputHelper.extractLabels(slider, 'data-external-label-'),
46
- })
47
- },
48
-
49
- template: function(slider){
50
-
51
- var inputTemplate = RangeInputHelper.inputTemplate(slider)
52
- var rangeTemplate = RangeInputHelper.rangeTemplate(slider)
53
-
54
- return inputTemplate + rangeTemplate
55
- },
56
-
57
- rangeTemplate: function(slider){
58
- var html = ""
59
- var lineLabels = RangeInputHelper.lineLabels(slider)
60
-
61
- if (slider.dataset.mark || slider.dataset.lineLabels) {
62
- var segments = RangeInputHelper.segments(slider)
63
- var mark = []
64
-
65
- if (slider.dataset.mark) {
66
- mark = slider.dataset.mark.split(',').map(Number)
67
- }
68
-
69
- for(var i = 1; i <= segments; i++) {
70
- var markClass = ((mark.indexOf(i) != -1) ? ' mark' : '')
71
- var lineLabel = lineLabels[String(i)]
72
-
73
- html += "<div class='range-segment'><span class='range-segment-content'>"
74
- if (mark.indexOf(i) != -1){
75
- html += "<span class='range-segment-mark'></span>"
76
- }
77
- if (lineLabel) {
78
- html += "<span class='range-line-label'>"+lineLabel+"</span>"
79
- }
80
- html += "</span></div>"
81
- }
82
- }
83
-
84
- slider.className += ' range-input-slider'
85
- html = "<div class='range-input-container'>" + slider.outerHTML + "<div class='range-track'>" + html + "</div><div class='range-track-bg'></div></div>"
86
-
87
- var labelHTML = RangeInputHelper.labelTemplate(slider)
88
-
89
- return "<div class='slider-container"
90
- + (RangeInputHelper.objectSize(lineLabels) > 0 ? " line-labels" : "")
91
- + (labelHTML.length > 0 ? " with-label" : " without-label")
92
- + "' id='slider-"+ slider.dataset.id +"' >"
93
- + html
94
- + labelHTML
95
- + "</div>"
96
- },
97
-
98
- lineLabels: function(slider){
99
- var lineLabels = {}
100
- if(slider.dataset.lineLabels) {
101
- slider.dataset.lineLabels.split(';').map(function(labels){
102
- var l = labels.split(':')
103
- lineLabels[l[0]] = l[1]
104
- })
105
- }
106
- return lineLabels
107
- },
108
-
109
- labelTemplate: function(slider){
110
- var html = ""
111
- var labels = JSON.parse(slider.dataset.cache).labels
112
-
113
- for(var key in labels){
114
- var altKey = RangeInputHelper.camelCase(key)
115
- var before = slider.dataset.beforeLabel || slider.dataset[altKey+'BeforeLabel']
116
- var after = slider.dataset.afterLabel || slider.dataset[altKey+'AfterLabel']
117
-
118
- html += "<span class='range-label-"+key+"'>"
119
- if (before) { html += "<span class='before-label'>"+before+"</span>" }
120
- html += "<span data-label='"+key+"'></span>"
121
- if (after) { html += "<span class='after-label'>"+after+"</span>" }
122
- html += "</span> "
123
- }
124
-
125
- if (html.length > 0) {
126
- html = "<div class='range-label'>" + html + "</div>"
127
- }
128
-
129
- return html
130
- },
131
-
132
- inputTemplate: function(slider) {
133
- if (slider.dataset.input && slider.dataset.values) {
134
- // Generate a class name for querying later (because some name attributes contain illegal characters for queries)
135
- var classname = slider.dataset.input.replace(/\W/g,'-')
136
-
137
- var input = this.existingInput(slider)
138
-
139
- if (input) {
140
- input.classList.add(classname)
141
- return ""
142
- }
143
-
144
- return "<input class='"+classname+"' type='hidden' name='"+slider.dataset.input+"' value='"+slider.value+"'>"
145
- } else return ""
146
- },
147
-
148
- existingInput: function(slider) {
149
- return this.scope(slider).querySelector('input[name="'+slider.dataset.input+'"]')
150
- },
151
-
152
- scope: function(slider) {
153
- var el = slider
154
-
155
- while (el && el.tagName != "FORM") {
156
- el = el.parentNode
157
- }
158
-
159
- return el || document
160
- },
161
-
162
- getLabels: function(slider) {
163
- var labels = {}
164
-
165
- if (slider.dataset.label == 'false')
166
- return labels
167
-
168
- labels = RangeInputHelper.extractLabels(slider, 'data-label-')
169
-
170
- if (RangeInputHelper.objectSize(labels) == 0) {
171
- if (slider.dataset.label) {
172
- labels['default'] = slider.dataset.label.split(';')
173
- } else if(slider.dataset.values){
174
- labels['default'] = slider.dataset.values.split(',')
175
- } else {
176
- labels['default'] = RangeInputHelper.valueLabels(slider)
177
- }
178
- }
179
-
180
- return labels
181
- },
182
-
183
- extractLabels: function(slider, pattern) {
184
- var labels = {}
185
-
186
- for (var i = 0; i < slider.attributes.length; i++){
187
- var name = slider.attributes[i].nodeName
188
-
189
- if(new RegExp("^"+pattern).test(name)) {
190
- name = name.replace(pattern, '')
191
- labels[name] = slider.attributes[i].nodeValue.split(';')
192
- }
193
- }
194
- return labels
195
- },
196
-
197
- setLabels: function(slider) {
198
- var labels = JSON.parse(slider.dataset.cache).labels
199
- var externalLabels = JSON.parse(slider.dataset.cache).externalLabels
200
-
201
- RangeInputHelper.updateLabels(slider, labels)
202
- RangeInputHelper.updateLabels(slider, externalLabels, 'external')
203
- },
204
-
205
- updateLabels: function(slider, labels, type) {
206
- for (var key in labels) {
207
- var elements = RangeInputHelper.labelElements(slider, type, key)
208
-
209
- Array.prototype.forEach.call(elements, function(target) {
210
- var index = RangeInputHelper.rangeValueIndex(slider)
211
- target.innerHTML = RangeInputHelper.getLabelsAtIndex(labels, index)[key]
212
- })
213
- }
214
- },
215
-
216
- labelElements: function(slider, type, key) {
217
- var selector = ''
218
-
219
- if (type == 'external')
220
- selector = '[data-range-label='+key+']'
221
- else
222
- selector = '#slider-'+slider.dataset.id+' [data-label='+key+']'
223
-
224
- return document.querySelectorAll(selector)
225
- },
226
-
227
- setInput: function(slider) {
228
- if (slider.offsetParent === null) { return }
229
- if (slider.dataset.input && slider.dataset.values) {
230
- var value = slider.dataset.values.split(',')[RangeInputHelper.rangeValueIndex(slider)]
231
- var selector = "."+slider.dataset.input.replace(/\W/g,'-')
232
- var inputs = this.scope(slider).querySelectorAll(selector)
233
-
234
- Array.prototype.forEach.call(inputs, function(input){
235
- input.value = value
236
- })
237
- }
238
- },
239
-
240
- getLabelsAtIndex: function(labels, index){
241
- var set = {}
242
- for (var key in labels) {
243
- set[key] = labels[key][index]
244
- }
245
- return set
246
- },
247
-
248
- segments: function(slider){
249
- return Number(slider.getAttribute('max') || 100) - Number(slider.getAttribute('min') || 0) + 1
250
- },
251
-
252
- valueLabels: function(slider) {
253
- var values = []
254
- var start = Number(slider.getAttribute('min')) || 0
255
- var end = Number(slider.getAttribute('max')) || 100
256
-
257
- for (var i = start; i <= end; i++ ) {
258
- values[i] = i
259
- }
260
-
261
- return values
262
- },
263
-
264
- rangeValueIndex: function(slider){
265
- return Number(slider.value) - Number(slider.getAttribute('min'))
266
- },
267
-
268
- objectSize: function(object) {
269
- var length = 0; for(var i in object) { length++ }
270
- return length
271
- },
272
-
273
- camelCase: function(input) {
274
- return input.toLowerCase().replace(/-(.)/g, function(match, group) {
275
- return group.toUpperCase();
276
- });
277
- }
278
- }
279
-
280
- module.exports = RangeInputHelper
@@ -1,59 +0,0 @@
1
- // Converts a simple date string into Date + Time + Timezone wrapped in HTML
2
- //
3
- // Input:
4
- // - String, compatible with JS date parsing e.g. "2014-10-20" or "2014-05-21 10:63"
5
- // - String, timezone: "UTC", "CST", etc.
6
- //
7
- // Returns: HTML which is "2014-01-28 18:00:00 CST", separated and wrapped with spans
8
- // with classnames: date, time and timezone
9
- //
10
- var dateToHtml = function dateToHtml(dateString, zone) {
11
-
12
- if(isNaN(new Date("2014-01-29T18:14:29+00:00").getDate())) {
13
- return false
14
- }
15
-
16
- var date = new Date(dateString)
17
- var zone = zone || date.getTimezoneOffset()/-60
18
-
19
- if(zone === 'UTC') {
20
- var y = date.getUTCFullYear()
21
- var mo = pad(date.getUTCMonth() + 1)
22
- var d = pad(date.getUTCDate())
23
- var h = pad(date.getUTCHours())
24
- var m = pad(date.getUTCMinutes())
25
- var s = pad(date.getUTCSeconds())
26
- } else {
27
- var y = date.getFullYear()
28
- var mo = pad(date.getMonth() + 1)
29
- var d = pad(date.getDate())
30
- var h = pad(date.getHours())
31
- var m = pad(date.getMinutes())
32
- var s = pad(date.getSeconds())
33
-
34
- var tz = String(date).match(/\((.+)\)$/)
35
-
36
- if(tz) {
37
- var zone = tz[1]
38
- } else {
39
- var zone = "GMT "
40
- zone += ((zone > 0) ? '+' : '')
41
- zone += " "+ pad(zone*100, 4)
42
- }
43
- }
44
-
45
- var str = '<span class="date">'+y+'-'+mo+'-'+d+'</span>'
46
- str += ' <span class="time">'+h+':'+m+':'+s+'</span>'
47
- str += ' <span class="timezone">'+zone+'</span>'
48
- return str
49
- }
50
-
51
- var pad = function datePad(num, pad){
52
- pad = pad || 2
53
- while(String(num).length < pad) {
54
- num = '0' + num
55
- }
56
- return num
57
- }
58
-
59
- module.exports = dateToHtml
@@ -1,84 +0,0 @@
1
- var timeago = require('./timeago')
2
- var dateToHtml = require('./date-to-html')
3
- var bean = require('bean')
4
-
5
- var TimeSwitch = {
6
-
7
- // Attach listeners, setup HTML templates
8
- setup: function timeSwitchSetup() {
9
- if(!timeago.browserSupport()) return false
10
- if(!this.listening) this.listen()
11
-
12
- var timeEls = document.querySelectorAll('.time-switch[datetime]')
13
-
14
- Array.prototype.forEach.call(timeEls, function(el) {
15
- var datetime = el.getAttribute('datetime')
16
- var timeagoPosition = el.dataset.timeago
17
- var timeagoStyle = el.dataset.timeagoStyle
18
- el.innerHTML = TimeSwitch.template(datetime, timeagoPosition, timeagoStyle)
19
- el.classList.add('time-switch')
20
- el.setAttribute('title', 'toggle timezones')
21
- })
22
- },
23
-
24
- // Attach listeners to toggle time zones whine clicked
25
- listen: function timeSwitchListen() {
26
- bean.on(document, "click", ".time-switch", TimeSwitch.toggle)
27
- this.listening = true
28
- },
29
-
30
- // Switch between UTC and local time
31
- toggle: function timeSwitchToggle(event) {
32
- var timeEls = document.querySelectorAll('.time-switch')
33
-
34
- Array.prototype.forEach.call(timeEls, function(el) {
35
- el.classList.toggle('alt-zone')
36
- })
37
- },
38
-
39
- // Supply HTML for UTC and local datetime
40
- //
41
- // Input:
42
- // - date (a date object)
43
- // - timeagoPosition, String, either 'before' or 'after'
44
- //
45
- template: function timeSwitchTemplate(date, timeagoPosition, timeagoStyle) {
46
- var utc = dateToHtml(date, 'UTC')
47
- var local = dateToHtml(date)
48
- var t = '';
49
-
50
- if (timeagoPosition === 'before') {
51
- t += this.timeagoTemplate(date, timeagoPosition, timeagoStyle)
52
- }
53
-
54
- t += "<span class='utc'><span class='clock_line_icon'></span> "
55
- t += utc + "</span>"
56
- t += "<span class='local'><span class='clock_fill_icon'></span> "
57
- t += local + "</span>"
58
-
59
- if (timeagoPosition === 'after') {
60
- t += this.timeagoTemplate(date, timeagoPosition, timeagoStyle)
61
- }
62
-
63
- return t
64
- },
65
-
66
- // Converts a date to relative time string wrapped in a span
67
- timeagoTemplate: function timeSwitchTimeagoTemplate(date, position, style) {
68
- var relative = timeago.parse(date, style)
69
- var dash = "<span class='dash'>&nbsp;-&nbsp;</span>"
70
- var html = ''
71
-
72
- if(relative) {
73
- if (position === 'after') html += dash
74
- html += "<span class='timeago'>"+ relative +"</span> "
75
- return html
76
- } else {
77
- return ''
78
- }
79
- }
80
-
81
- }
82
-
83
- module.exports = TimeSwitch
84
-