bhf 0.4.4 → 0.4.5
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.
- data/app/controllers/bhf/entries_controller.rb +1 -1
- data/app/views/bhf/entries/form/column/_date.haml +1 -1
- data/app/views/bhf/pages/_platform.haml +1 -1
- data/config/locales/en.yml +7 -1
- data/vendor/assets/javascripts/bhf/application.js +9 -23
- data/vendor/assets/javascripts/bhf/classes/Locale.de-DE.DatePicker.js +16 -0
- data/vendor/assets/javascripts/bhf/classes/Locale.en-US.DatePicker.js +19 -0
- data/vendor/assets/javascripts/bhf/classes/Picker.js +344 -0
- data/vendor/assets/javascripts/bhf/classes/Picker_Attach.js +161 -0
- data/vendor/assets/javascripts/bhf/classes/Picker_Date.js +668 -0
- data/vendor/assets/javascripts/bhf/mootools-more-1.4.0.1.js +1316 -178
- data/vendor/assets/stylesheets/bhf/application.css.sass +1 -1
- metadata +17 -13
- data/vendor/assets/javascripts/bhf/classes/Datepicker.js +0 -38
@@ -74,7 +74,7 @@ class Bhf::EntriesController < Bhf::ApplicationController
|
|
74
74
|
def object_to_bhf_display_hash
|
75
75
|
@platform.columns.each_with_object({to_bhf_s: @object.to_bhf_s}) do |column, hash|
|
76
76
|
unless column.field.macro == :column && @object.send(column.name).blank?
|
77
|
-
p = "bhf/pages/macro/#{column.field.macro}/#{column.field.display_type}"
|
77
|
+
p = "bhf/pages/macro/#{column.field.macro}/#{column.field.display_type}.html"
|
78
78
|
hash[column.name] = render_to_string partial: p, locals: {column: column, object: @object}
|
79
79
|
end
|
80
80
|
end
|
@@ -1,2 +1,2 @@
|
|
1
1
|
= node f, field do
|
2
|
-
= f.text_field field.name, class: "picker #{field.type}", value: f.object.send(field.name) ? l(f.object.send(field.name), format:
|
2
|
+
= f.text_field field.name, class: "picker #{field.type}", value: f.object.send(field.name) ? l(f.object.send(field.name), format: t("bhf.helpers.input.date_format.#{field.type}")) : nil
|
@@ -1,5 +1,5 @@
|
|
1
1
|
- platform.pagination.template = self
|
2
|
-
%table{id: "#{platform.name}_platform", class: (platform.custom_columns? ? :custom_columns : :default_columns)}
|
2
|
+
%table.data_table{id: "#{platform.name}_platform", class: (platform.custom_columns? ? :custom_columns : :default_columns)}
|
3
3
|
%caption
|
4
4
|
%h4= platform.title
|
5
5
|
%p.info= platform.pagination.info platform
|
data/config/locales/en.yml
CHANGED
@@ -33,7 +33,13 @@ en:
|
|
33
33
|
file:
|
34
34
|
delete: Delete file
|
35
35
|
reselect: Please reselect the file
|
36
|
-
|
36
|
+
input:
|
37
|
+
date_format:
|
38
|
+
timestamp: '%Y-%m-%d %H:%M'
|
39
|
+
datetime: '%Y-%m-%d %H:%M'
|
40
|
+
date: '%Y-%m-%d'
|
41
|
+
time: '%H:%M'
|
42
|
+
|
37
43
|
quick_edit:
|
38
44
|
buttons:
|
39
45
|
cancel: Cancel
|
@@ -26,32 +26,18 @@ window.addEvent('domready', function(){
|
|
26
26
|
new ArrayFields(elem);
|
27
27
|
});
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
var dateMonths = Locale.get('Date.months');
|
32
|
-
var dateDays = Locale.get('Date.days');
|
33
|
-
new DatePicker(scope.getElements('.picker.datetime, .picker.timestamp'), {
|
34
|
-
allowEmpty: true,
|
35
|
-
inputOutputFormat: 'Y-m-d H:i',
|
36
|
-
months: dateMonths,
|
37
|
-
days: dateDays,
|
29
|
+
// TODO: i18n datepicker
|
30
|
+
new Picker.Date(scope.getElements('.picker.datetime, .picker.timestamp'), {
|
38
31
|
timePicker: true,
|
39
|
-
format:
|
32
|
+
format: '%Y-%m-%d %H:%M'
|
40
33
|
});
|
41
|
-
new
|
42
|
-
|
43
|
-
|
44
|
-
months: dateMonths,
|
45
|
-
days: dateDays,
|
46
|
-
format: dateFormat
|
34
|
+
new Picker.Date(scope.getElements('.picker.date'), {
|
35
|
+
timePicker: false,
|
36
|
+
format: '%Y-%m-%d'
|
47
37
|
});
|
48
|
-
new
|
49
|
-
|
50
|
-
|
51
|
-
months: dateMonths,
|
52
|
-
days: dateDays,
|
53
|
-
timePickerOnly: true,
|
54
|
-
format: timeFormat
|
38
|
+
new Picker.Date(scope.getElements('.picker.time'), {
|
39
|
+
pickOnly: 'time',
|
40
|
+
format: '%H:%M'
|
55
41
|
});
|
56
42
|
};
|
57
43
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
/*
|
2
|
+
---
|
3
|
+
name: Locale.de-DE.DatePicker
|
4
|
+
description: German Language File for DatePicker
|
5
|
+
authors: Bastian Bringenberg
|
6
|
+
requires: [More/Locale]
|
7
|
+
provides: Locale.de-DE.DatePicker
|
8
|
+
...
|
9
|
+
*/
|
10
|
+
|
11
|
+
|
12
|
+
Locale.define('de-DE', 'DatePicker', {
|
13
|
+
select_a_time: 'Wähle eine Zeit',
|
14
|
+
use_mouse_wheel: 'Mit dem Mausrad kannst du schneller die Werte ändern',
|
15
|
+
time_confirm_button: 'OK'
|
16
|
+
});
|
@@ -0,0 +1,19 @@
|
|
1
|
+
/*
|
2
|
+
---
|
3
|
+
name: Locale.en-US.DatePicker
|
4
|
+
description: English Language File for DatePicker
|
5
|
+
authors: Arian Stolwijk
|
6
|
+
requires: [More/Locale]
|
7
|
+
provides: Locale.en-US.DatePicker
|
8
|
+
...
|
9
|
+
*/
|
10
|
+
|
11
|
+
|
12
|
+
Locale.define('en-US', 'DatePicker', {
|
13
|
+
select_a_time: 'Select a time',
|
14
|
+
use_mouse_wheel: 'Use the mouse wheel to quickly change value',
|
15
|
+
time_confirm_button: 'OK',
|
16
|
+
apply_range: 'Apply',
|
17
|
+
cancel: 'Cancel',
|
18
|
+
week: 'Wk'
|
19
|
+
});
|
@@ -0,0 +1,344 @@
|
|
1
|
+
/*
|
2
|
+
---
|
3
|
+
name: Picker
|
4
|
+
description: Creates a Picker, which can be used for anything
|
5
|
+
authors: Arian Stolwijk
|
6
|
+
requires: [Core/Element.Dimensions, Core/Fx.Tween, Core/Fx.Transitions]
|
7
|
+
provides: Picker
|
8
|
+
...
|
9
|
+
*/
|
10
|
+
|
11
|
+
|
12
|
+
var Picker = new Class({
|
13
|
+
|
14
|
+
Implements: [Options, Events],
|
15
|
+
|
16
|
+
options: {/*
|
17
|
+
onShow: function(){},
|
18
|
+
onOpen: function(){},
|
19
|
+
onHide: function(){},
|
20
|
+
onClose: function(){},*/
|
21
|
+
|
22
|
+
pickerClass: 'datepicker',
|
23
|
+
inject: null,
|
24
|
+
animationDuration: 400,
|
25
|
+
useFadeInOut: true,
|
26
|
+
positionOffset: {x: 0, y: 0},
|
27
|
+
pickerPosition: 'bottom',
|
28
|
+
draggable: true,
|
29
|
+
showOnInit: true,
|
30
|
+
columns: 1,
|
31
|
+
footer: false
|
32
|
+
},
|
33
|
+
|
34
|
+
initialize: function(options){
|
35
|
+
this.setOptions(options);
|
36
|
+
this.constructPicker();
|
37
|
+
if (this.options.showOnInit) this.show();
|
38
|
+
},
|
39
|
+
|
40
|
+
constructPicker: function(){
|
41
|
+
var options = this.options;
|
42
|
+
|
43
|
+
var picker = this.picker = new Element('div', {
|
44
|
+
'class': options.pickerClass,
|
45
|
+
styles: {
|
46
|
+
left: 0,
|
47
|
+
top: 0,
|
48
|
+
display: 'none',
|
49
|
+
opacity: 0
|
50
|
+
}
|
51
|
+
}).inject(options.inject || document.body);
|
52
|
+
picker.addClass('column_' + options.columns);
|
53
|
+
|
54
|
+
if (options.useFadeInOut){
|
55
|
+
picker.set('tween', {
|
56
|
+
duration: options.animationDuration,
|
57
|
+
link: 'cancel'
|
58
|
+
});
|
59
|
+
}
|
60
|
+
|
61
|
+
// Build the header
|
62
|
+
var header = this.header = new Element('div.header').inject(picker);
|
63
|
+
|
64
|
+
var title = this.title = new Element('div.title').inject(header);
|
65
|
+
var titleID = this.titleID = 'pickertitle-' + String.uniqueID();
|
66
|
+
this.titleText = new Element('div', {
|
67
|
+
'role': 'heading',
|
68
|
+
'class': 'titleText',
|
69
|
+
'id': titleID,
|
70
|
+
'aria-live': 'assertive',
|
71
|
+
'aria-atomic': 'true'
|
72
|
+
}).inject(title);
|
73
|
+
|
74
|
+
this.closeButton = new Element('div.closeButton[text=x][role=button]')
|
75
|
+
.addEvent('click', this.close.pass(false, this))
|
76
|
+
.inject(header);
|
77
|
+
|
78
|
+
// Build the body of the picker
|
79
|
+
var body = this.body = new Element('div.body').inject(picker);
|
80
|
+
|
81
|
+
if (options.footer){
|
82
|
+
this.footer = new Element('div.footer').inject(picker);
|
83
|
+
picker.addClass('footer');
|
84
|
+
}
|
85
|
+
|
86
|
+
// oldContents and newContents are used to slide from the old content to a new one.
|
87
|
+
var slider = this.slider = new Element('div.slider', {
|
88
|
+
styles: {
|
89
|
+
position: 'absolute',
|
90
|
+
top: 0,
|
91
|
+
left: 0
|
92
|
+
}
|
93
|
+
}).set('tween', {
|
94
|
+
duration: options.animationDuration,
|
95
|
+
transition: Fx.Transitions.Quad.easeInOut
|
96
|
+
}).inject(body);
|
97
|
+
|
98
|
+
this.newContents = new Element('div', {
|
99
|
+
styles: {
|
100
|
+
position: 'absolute',
|
101
|
+
top: 0,
|
102
|
+
left: 0
|
103
|
+
}
|
104
|
+
}).inject(slider);
|
105
|
+
|
106
|
+
this.oldContents = new Element('div', {
|
107
|
+
styles: {
|
108
|
+
position: 'absolute',
|
109
|
+
top: 0
|
110
|
+
}
|
111
|
+
}).inject(slider);
|
112
|
+
|
113
|
+
this.originalColumns = options.columns;
|
114
|
+
this.setColumns(options.columns);
|
115
|
+
|
116
|
+
// IFrameShim for select fields in IE
|
117
|
+
var shim = this.shim = window['IframeShim'] ? new IframeShim(picker) : null;
|
118
|
+
|
119
|
+
// Dragging
|
120
|
+
if (options.draggable && typeOf(picker.makeDraggable) == 'function'){
|
121
|
+
this.dragger = picker.makeDraggable(shim ? {
|
122
|
+
onDrag: shim.position.bind(shim)
|
123
|
+
} : null);
|
124
|
+
picker.setStyle('cursor', 'move');
|
125
|
+
}
|
126
|
+
},
|
127
|
+
|
128
|
+
open: function(noFx){
|
129
|
+
if (this.opened == true) return this;
|
130
|
+
this.opened = true;
|
131
|
+
var self = this,
|
132
|
+
picker = this.picker.setStyle('display', 'block').set('aria-hidden', 'false')
|
133
|
+
if (this.shim) this.shim.show();
|
134
|
+
this.fireEvent('open');
|
135
|
+
if (this.options.useFadeInOut && !noFx){
|
136
|
+
picker.get('tween').start('opacity', 1).chain(function(){
|
137
|
+
self.fireEvent('show');
|
138
|
+
this.callChain();
|
139
|
+
});
|
140
|
+
} else {
|
141
|
+
picker.setStyle('opacity', 1);
|
142
|
+
this.fireEvent('show');
|
143
|
+
}
|
144
|
+
return this;
|
145
|
+
},
|
146
|
+
|
147
|
+
show: function(){
|
148
|
+
return this.open(true);
|
149
|
+
},
|
150
|
+
|
151
|
+
close: function(noFx){
|
152
|
+
if (this.opened == false) return this;
|
153
|
+
this.opened = false;
|
154
|
+
this.fireEvent('close');
|
155
|
+
var self = this, picker = this.picker, hide = function(){
|
156
|
+
picker.setStyle('display', 'none').set('aria-hidden', 'true');
|
157
|
+
if (self.shim) self.shim.hide();
|
158
|
+
self.fireEvent('hide');
|
159
|
+
};
|
160
|
+
if (this.options.useFadeInOut && !noFx){
|
161
|
+
picker.get('tween').start('opacity', 0).chain(hide);
|
162
|
+
} else {
|
163
|
+
picker.setStyle('opacity', 0);
|
164
|
+
hide();
|
165
|
+
}
|
166
|
+
return this;
|
167
|
+
},
|
168
|
+
|
169
|
+
hide: function(){
|
170
|
+
return this.close(true);
|
171
|
+
},
|
172
|
+
|
173
|
+
toggle: function(){
|
174
|
+
return this[this.opened == true ? 'close' : 'open']();
|
175
|
+
},
|
176
|
+
|
177
|
+
destroy: function(){
|
178
|
+
this.picker.destroy();
|
179
|
+
if (this.shim) this.shim.destroy();
|
180
|
+
},
|
181
|
+
|
182
|
+
position: function(x, y){
|
183
|
+
var offset = this.options.positionOffset,
|
184
|
+
scroll = document.getScroll(),
|
185
|
+
size = document.getSize(),
|
186
|
+
pickersize = this.picker.getSize();
|
187
|
+
|
188
|
+
if (typeOf(x) == 'element'){
|
189
|
+
var element = x,
|
190
|
+
where = y || this.options.pickerPosition;
|
191
|
+
|
192
|
+
var elementCoords = element.getCoordinates();
|
193
|
+
|
194
|
+
x = (where == 'left') ? elementCoords.left - pickersize.x
|
195
|
+
: (where == 'bottom' || where == 'top') ? elementCoords.left
|
196
|
+
: elementCoords.right
|
197
|
+
y = (where == 'bottom') ? elementCoords.bottom
|
198
|
+
: (where == 'top') ? elementCoords.top - pickersize.y
|
199
|
+
: elementCoords.top;
|
200
|
+
}
|
201
|
+
|
202
|
+
x += offset.x * ((where && where == 'left') ? -1 : 1);
|
203
|
+
y += offset.y * ((where && where == 'top') ? -1: 1);
|
204
|
+
|
205
|
+
if ((x + pickersize.x) > (size.x + scroll.x)) x = (size.x + scroll.x) - pickersize.x;
|
206
|
+
if ((y + pickersize.y) > (size.y + scroll.y)) y = (size.y + scroll.y) - pickersize.y;
|
207
|
+
if (x < 0) x = 0;
|
208
|
+
if (y < 0) y = 0;
|
209
|
+
|
210
|
+
this.picker.setStyles({
|
211
|
+
left: x,
|
212
|
+
top: y
|
213
|
+
});
|
214
|
+
if (this.shim) this.shim.position();
|
215
|
+
return this;
|
216
|
+
},
|
217
|
+
|
218
|
+
setBodySize: function(){
|
219
|
+
var bodysize = this.bodysize = this.body.getSize();
|
220
|
+
|
221
|
+
this.slider.setStyles({
|
222
|
+
width: 2 * bodysize.x,
|
223
|
+
height: bodysize.y
|
224
|
+
});
|
225
|
+
this.oldContents.setStyles({
|
226
|
+
left: bodysize.x,
|
227
|
+
width: bodysize.x,
|
228
|
+
height: bodysize.y
|
229
|
+
});
|
230
|
+
this.newContents.setStyles({
|
231
|
+
width: bodysize.x,
|
232
|
+
height: bodysize.y
|
233
|
+
});
|
234
|
+
},
|
235
|
+
|
236
|
+
setColumnContent: function(column, content){
|
237
|
+
var columnElement = this.columns[column];
|
238
|
+
if (!columnElement) return this;
|
239
|
+
|
240
|
+
var type = typeOf(content);
|
241
|
+
if (['string', 'number'].contains(type)) columnElement.set('text', content);
|
242
|
+
else columnElement.empty().adopt(content);
|
243
|
+
|
244
|
+
return this;
|
245
|
+
},
|
246
|
+
|
247
|
+
setColumnsContent: function(content, fx){
|
248
|
+
var old = this.columns;
|
249
|
+
this.columns = this.newColumns;
|
250
|
+
this.newColumns = old;
|
251
|
+
|
252
|
+
content.forEach(function(_content, i){
|
253
|
+
this.setColumnContent(i, _content);
|
254
|
+
}, this);
|
255
|
+
return this.setContent(null, fx);
|
256
|
+
},
|
257
|
+
|
258
|
+
setColumns: function(columns){
|
259
|
+
var _columns = this.columns = new Elements, _newColumns = this.newColumns = new Elements;
|
260
|
+
for (var i = columns; i--;){
|
261
|
+
_columns.push(new Element('div.column').addClass('column_' + (columns - i)));
|
262
|
+
_newColumns.push(new Element('div.column').addClass('column_' + (columns - i)));
|
263
|
+
}
|
264
|
+
|
265
|
+
var oldClass = 'column_' + this.options.columns, newClass = 'column_' + columns;
|
266
|
+
this.picker.removeClass(oldClass).addClass(newClass);
|
267
|
+
|
268
|
+
this.options.columns = columns;
|
269
|
+
return this;
|
270
|
+
},
|
271
|
+
|
272
|
+
setContent: function(content, fx){
|
273
|
+
if (content) return this.setColumnsContent([content], fx);
|
274
|
+
|
275
|
+
// swap contents so we can fill the newContents again and animate
|
276
|
+
var old = this.oldContents;
|
277
|
+
this.oldContents = this.newContents;
|
278
|
+
this.newContents = old;
|
279
|
+
this.newContents.empty();
|
280
|
+
|
281
|
+
this.newContents.adopt(this.columns);
|
282
|
+
|
283
|
+
this.setBodySize();
|
284
|
+
|
285
|
+
if (fx){
|
286
|
+
this.fx(fx);
|
287
|
+
} else {
|
288
|
+
this.slider.setStyle('left', 0);
|
289
|
+
this.oldContents.setStyles({left: 0, opacity: 0});
|
290
|
+
this.newContents.setStyles({left: 0, opacity: 1});
|
291
|
+
}
|
292
|
+
return this;
|
293
|
+
},
|
294
|
+
|
295
|
+
fx: function(fx){
|
296
|
+
var oldContents = this.oldContents,
|
297
|
+
newContents = this.newContents,
|
298
|
+
slider = this.slider,
|
299
|
+
bodysize = this.bodysize;
|
300
|
+
if (fx == 'right'){
|
301
|
+
oldContents.setStyles({left: 0, opacity: 1});
|
302
|
+
newContents.setStyles({left: bodysize.x, opacity: 1});
|
303
|
+
slider.setStyle('left', 0).tween('left', 0, -bodysize.x);
|
304
|
+
} else if (fx == 'left'){
|
305
|
+
oldContents.setStyles({left: bodysize.x, opacity: 1});
|
306
|
+
newContents.setStyles({left: 0, opacity: 1});
|
307
|
+
slider.setStyle('left', -bodysize.x).tween('left', -bodysize.x, 0);
|
308
|
+
} else if (fx == 'fade'){
|
309
|
+
slider.setStyle('left', 0);
|
310
|
+
oldContents.setStyle('left', 0).set('tween', {
|
311
|
+
duration: this.options.animationDuration / 2
|
312
|
+
}).tween('opacity', 1, 0).get('tween').chain(function(){
|
313
|
+
oldContents.setStyle('left', bodysize.x);
|
314
|
+
});
|
315
|
+
newContents.setStyles({opacity: 0, left: 0}).set('tween', {
|
316
|
+
duration: this.options.animationDuration
|
317
|
+
}).tween('opacity', 0, 1);
|
318
|
+
}
|
319
|
+
},
|
320
|
+
|
321
|
+
toElement: function(){
|
322
|
+
return this.picker;
|
323
|
+
},
|
324
|
+
|
325
|
+
setTitle: function(content, fn){
|
326
|
+
if (!fn) fn = Function.from;
|
327
|
+
this.titleText.empty().adopt(
|
328
|
+
Array.from(content).map(function(item, i){
|
329
|
+
return typeOf(item) == 'element'
|
330
|
+
? item
|
331
|
+
: new Element('div.column', {text: fn(item, this.options)}).addClass('column_' + (i + 1));
|
332
|
+
}, this)
|
333
|
+
);
|
334
|
+
return this;
|
335
|
+
},
|
336
|
+
|
337
|
+
setTitleEvent: function(fn){
|
338
|
+
this.titleText.removeEvents('click');
|
339
|
+
if (fn) this.titleText.addEvent('click', fn);
|
340
|
+
this.titleText.setStyle('cursor', fn ? 'pointer' : '');
|
341
|
+
return this;
|
342
|
+
}
|
343
|
+
|
344
|
+
});
|