beautiful_scaffold 0.1.5 → 0.1.7

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.
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "beautiful_scaffold"
6
- s.version = "0.1.5"
6
+ s.version = "0.1.7"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.summary = "Beautiful Scaffold generate fully customizable scaffold"
9
9
  s.email = "claudel.sylvain@gmail.com"
@@ -0,0 +1,43 @@
1
+ # encoding : utf-8
2
+ class BeautifulJointableGenerator < Rails::Generators::Base
3
+ require 'beautiful_scaffold_common_methods'
4
+ include BeautifulScaffoldCommonMethods
5
+
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ argument :join_models, :type => :array, :default => [], :banner => "model model"
9
+
10
+ def create_join_table
11
+ if join_models.length != 2 then
12
+ puts "Error need two singular models : example : user product"
13
+ else
14
+ sorted_model = join_models.sort
15
+
16
+ # Generate migration
17
+ migration_content_up = "
18
+ create_table :#{sorted_model[0].pluralize}_#{sorted_model[1].pluralize}, :id => false do |t|
19
+ t.references :#{sorted_model[0]}, :#{sorted_model[1]}
20
+ end
21
+
22
+ add_index :#{sorted_model[0].pluralize}_#{sorted_model[1].pluralize}, [:#{sorted_model[0]}, :#{sorted_model[1]}]
23
+ "
24
+
25
+ migration_content_down = "\n drop_table :#{sorted_model[0].pluralize}_#{sorted_model[1].pluralize} "
26
+
27
+ migration_name = "create_join_table_for_#{sorted_model[0]}_and_#{sorted_model[1]}"
28
+ generate("migration", migration_name)
29
+
30
+ filename = Dir.glob("db/migrate/*#{migration_name}.rb")[0]
31
+
32
+ inject_into_file(filename, migration_content_up, :after => "def up")
33
+ inject_into_file(filename, migration_content_down, :after => "def down")
34
+
35
+ # Add habtm relation
36
+ inject_into_file("app/models/#{sorted_model[0]}.rb", "\n has_and_belongs_to_many :#{sorted_model[1].pluralize}", :after => "ActiveRecord::Base")
37
+ inject_into_file("app/models/#{sorted_model[1]}.rb", "\n has_and_belongs_to_many :#{sorted_model[0].pluralize}", :after => "ActiveRecord::Base")
38
+ inject_into_file("app/models/#{sorted_model[0]}.rb", ":#{sorted_model[1]}_ids, ", :after => "attr_accessible ")
39
+ inject_into_file("app/models/#{sorted_model[1]}.rb", ":#{sorted_model[0]}_ids, ", :after => "attr_accessible ")
40
+ end
41
+ end
42
+
43
+ end
@@ -39,6 +39,7 @@ class BeautifulMigrationGenerator < Rails::Generators::Base
39
39
  if ['references', 'reference'].include?(t) then
40
40
  inject_into_file("app/models/#{model}.rb", "\n belongs_to :#{a}", :after => "ActiveRecord::Base")
41
41
  inject_into_file("app/models/#{a}.rb", "\n has_many :#{model_pluralize}, :dependent => :nullify", :after => "ActiveRecord::Base")
42
+ inject_into_file("app/models/#{a}.rb", ":#{model}_ids, ", :after => "attr_accessible ")
42
43
  a += "_id"
43
44
  end
44
45
  inject_into_file("app/models/#{model}.rb", ":#{a}, ", :after => "attr_accessible ")
@@ -81,6 +81,8 @@ module BeautifulScaffoldCommonMethods
81
81
  elsif ['references', 'reference'].include?(t) and for_migration then
82
82
  a = a + '_id'
83
83
  newt = 'integer:index'
84
+ elsif t == 'color' then
85
+ newt = 'string'
84
86
  end
85
87
 
86
88
  newmyattributes << [a, newt].join(':')
@@ -55,7 +55,8 @@ class BeautifulScaffoldGenerator < Rails::Generators::Base
55
55
  "#{stylesheetspath}datepicker.css",
56
56
  "#{stylesheetspath}timepicker.css",
57
57
  "#{stylesheetspath}beautiful-scaffold.css.scss",
58
- "#{stylesheetspath}tagit-dark-grey.css"
58
+ "#{stylesheetspath}tagit-dark-grey.css",
59
+ "#{stylesheetspath}colorpicker.css"
59
60
  ]
60
61
 
61
62
  javascriptspath = "app/assets/javascripts/"
@@ -74,7 +75,8 @@ class BeautifulScaffoldGenerator < Rails::Generators::Base
74
75
  "#{javascriptspath}bootstrap-timepicker.js",
75
76
  "#{javascriptspath}jquery.livequery.js",
76
77
  "#{javascriptspath}jquery.jstree.js",
77
- "#{javascriptspath}tagit.js"
78
+ "#{javascriptspath}tagit.js",
79
+ "#{javascriptspath}bootstrap-colorpicker.js"
78
80
  ]
79
81
  pjax_js = "#{javascriptspath}jquery.pjax.js"
80
82
 
@@ -165,6 +167,7 @@ class BeautifulScaffoldGenerator < Rails::Generators::Base
165
167
  inject_into_file("app/models/#{model}.rb", ":#{a}_id, ", :after => "attr_accessible ")
166
168
  begin
167
169
  inject_into_file("app/models/#{a}.rb", "\n has_many :#{model_pluralize}, :dependent => :nullify", :after => "ActiveRecord::Base")
170
+ inject_into_file("app/models/#{a}.rb", ":#{model}_ids, ", :after => "attr_accessible ")
168
171
  rescue
169
172
  end
170
173
  end
@@ -0,0 +1,520 @@
1
+ /* =========================================================
2
+ * bootstrap-colorpicker.js
3
+ * http://www.eyecon.ro/bootstrap-colorpicker
4
+ * =========================================================
5
+ * Copyright 2012 Stefan Petre
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ========================================================= */
19
+
20
+ !function( $ ) {
21
+
22
+ // Color object
23
+
24
+ var Color = function(val) {
25
+ this.value = {
26
+ h: 1,
27
+ s: 1,
28
+ b: 1,
29
+ a: 1
30
+ };
31
+ this.setColor(val);
32
+ };
33
+
34
+ Color.prototype = {
35
+ constructor: Color,
36
+
37
+ //parse a string to HSB
38
+ setColor: function(val){
39
+ val = val.toLowerCase();
40
+ var that = this;
41
+ $.each( CPGlobal.stringParsers, function( i, parser ) {
42
+ var match = parser.re.exec( val ),
43
+ values = match && parser.parse( match ),
44
+ space = parser.space||'rgba';
45
+ if ( values ) {
46
+ if (space == 'hsla') {
47
+ that.value = CPGlobal.RGBtoHSB.apply(null, CPGlobal.HSLtoRGB.apply(null, values));
48
+ } else {
49
+ that.value = CPGlobal.RGBtoHSB.apply(null, values);
50
+ }
51
+ return false;
52
+ }
53
+ });
54
+ },
55
+
56
+ setHue: function(h) {
57
+ this.value.h = 1- h;
58
+ },
59
+
60
+ setSaturation: function(s) {
61
+ this.value.s = s;
62
+ },
63
+
64
+ setLightness: function(b) {
65
+ this.value.b = 1- b;
66
+ },
67
+
68
+ setAlpha: function(a) {
69
+ this.value.a = parseInt((1 - a)*100, 10)/100;
70
+ },
71
+
72
+ // HSBtoRGB from RaphaelJS
73
+ // https://github.com/DmitryBaranovskiy/raphael/
74
+ toRGB: function(h, s, b, a) {
75
+ if (!h) {
76
+ h = this.value.h;
77
+ s = this.value.s;
78
+ b = this.value.b;
79
+ }
80
+ h *= 360;
81
+ var R, G, B, X, C;
82
+ h = (h % 360) / 60;
83
+ C = b * s;
84
+ X = C * (1 - Math.abs(h % 2 - 1));
85
+ R = G = B = b - C;
86
+
87
+ h = ~~h;
88
+ R += [C, X, 0, 0, X, C][h];
89
+ G += [X, C, C, X, 0, 0][h];
90
+ B += [0, 0, X, C, C, X][h];
91
+ return {
92
+ r: Math.round(R*255),
93
+ g: Math.round(G*255),
94
+ b: Math.round(B*255),
95
+ a: a||this.value.a
96
+ };
97
+ },
98
+
99
+ toHex: function(h, s, b, a){
100
+ var rgb = this.toRGB(h, s, b, a);
101
+ return '#'+((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);
102
+ },
103
+
104
+ toHSL: function(h, s, b, a){
105
+ if (!h) {
106
+ h = this.value.h;
107
+ s = this.value.s;
108
+ b = this.value.b;
109
+ }
110
+ var H = h,
111
+ L = (2 - s) * b,
112
+ S = s * b;
113
+ if (L > 0 && L <= 1) {
114
+ S /= L;
115
+ } else {
116
+ S /= 2 - L;
117
+ }
118
+ L /= 2;
119
+ if (S > 1) {
120
+ S = 1;
121
+ }
122
+ return {
123
+ h: H,
124
+ s: S,
125
+ l: L,
126
+ a: a||this.value.a
127
+ };
128
+ }
129
+ };
130
+
131
+ // Picker object
132
+
133
+ var Colorpicker = function(element, options){
134
+ this.element = $(element);
135
+ var format = options.format||this.element.data('color-format')||'hex';
136
+ this.format = CPGlobal.translateFormats[format];
137
+ this.isInput = this.element.is('input');
138
+ this.component = this.element.is('.color') ? this.element.find('.add-on') : false;
139
+
140
+ this.picker = $(CPGlobal.template)
141
+ .appendTo('body')
142
+ .on('mousedown', $.proxy(this.mousedown, this));
143
+
144
+ if (this.isInput) {
145
+ this.element.on({
146
+ 'focus': $.proxy(this.show, this),
147
+ 'keyup': $.proxy(this.update, this)
148
+ });
149
+ } else if (this.component){
150
+ this.component.on({
151
+ 'click': $.proxy(this.show, this)
152
+ });
153
+ } else {
154
+ this.element.on({
155
+ 'click': $.proxy(this.show, this)
156
+ });
157
+ }
158
+ if (format == 'rgba' || format == 'hsla') {
159
+ this.picker.addClass('alpha');
160
+ this.alpha = this.picker.find('.colorpicker-alpha')[0].style;
161
+ }
162
+
163
+ if (this.component){
164
+ this.picker.find('.colorpicker-color').hide();
165
+ this.preview = this.element.find('i')[0].style;
166
+ } else {
167
+ this.preview = this.picker.find('div:last')[0].style;
168
+ }
169
+
170
+ this.base = this.picker.find('div:first')[0].style;
171
+ this.update();
172
+ };
173
+
174
+ Colorpicker.prototype = {
175
+ constructor: Colorpicker,
176
+
177
+ show: function(e) {
178
+ this.picker.show();
179
+ this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();
180
+ this.place();
181
+ $(window).on('resize', $.proxy(this.place, this));
182
+ if (!this.isInput) {
183
+ if (e) {
184
+ e.stopPropagation();
185
+ e.preventDefault();
186
+ }
187
+ }
188
+ $(document).on({
189
+ 'mousedown': $.proxy(this.hide, this)
190
+ });
191
+ this.element.trigger({
192
+ type: 'show',
193
+ color: this.color
194
+ });
195
+ },
196
+
197
+ update: function(){
198
+ this.color = new Color(this.isInput ? this.element.prop('value') : this.element.data('color'));
199
+ this.picker.find('i')
200
+ .eq(0).css({left: this.color.value.s*100, top: 100 - this.color.value.b*100}).end()
201
+ .eq(1).css('top', 100 * (1 - this.color.value.h)).end()
202
+ .eq(2).css('top', 100 * (1 - this.color.value.a));
203
+ this.previewColor();
204
+ },
205
+
206
+ hide: function(){
207
+ this.picker.hide();
208
+ $(window).off('resize', this.place);
209
+ if (!this.isInput) {
210
+ $(document).off({
211
+ 'mousedown': this.hide
212
+ });
213
+ if (this.component){
214
+ this.element.find('input').prop('value', this.format.call(this));
215
+ }
216
+ this.element.data('color', this.format.call(this));
217
+ } else {
218
+ this.element.prop('value', this.format.call(this));
219
+ }
220
+ this.element.trigger({
221
+ type: 'hide',
222
+ color: this.color
223
+ });
224
+ },
225
+
226
+ place: function(){
227
+ var offset = this.component ? this.component.offset() : this.element.offset();
228
+ this.picker.css({
229
+ top: offset.top + this.height,
230
+ left: offset.left
231
+ });
232
+ },
233
+
234
+ //preview color change
235
+ previewColor: function(){
236
+ this.preview.backgroundColor = this.format.call(this);
237
+ //set the color for brightness/saturation slider
238
+ this.base.backgroundColor = this.color.toHex(this.color.value.h, 1, 1, 1);
239
+ //set te color for alpha slider
240
+ if (this.alpha) {
241
+ this.alpha.backgroundColor = this.color.toHex();
242
+ }
243
+ },
244
+
245
+ pointer: null,
246
+
247
+ slider: null,
248
+
249
+ mousedown: function(e){
250
+ e.stopPropagation();
251
+ e.preventDefault();
252
+
253
+ var target = $(e.target);
254
+
255
+ //detect the slider and set the limits and callbacks
256
+ var zone = target.closest('div');
257
+ if (!zone.is('.colorpicker')) {
258
+ if (zone.is('.colorpicker-saturation')) {
259
+ this.slider = $.extend({}, CPGlobal.sliders['saturation']);
260
+ }
261
+ else if (zone.is('.colorpicker-hue')) {
262
+ this.slider = $.extend({}, CPGlobal.sliders['hue']);
263
+ }
264
+ else if (zone.is('.colorpicker-alpha')) {
265
+ this.slider = $.extend({}, CPGlobal.sliders['alpha']);
266
+ }
267
+ var offset = zone.offset();
268
+ //reference to knob's style
269
+ this.slider.knob = zone.find('i')[0].style;
270
+ this.slider.left = e.pageX - offset.left;
271
+ this.slider.top = e.pageY - offset.top;
272
+ this.pointer = {
273
+ left: e.pageX,
274
+ top: e.pageY
275
+ };
276
+ //trigger mousemove to move the knob to the current position
277
+ $(document).on({
278
+ mousemove: $.proxy(this.mousemove, this),
279
+ mouseup: $.proxy(this.mouseup, this)
280
+ }).trigger('mousemove');
281
+ }
282
+ return false;
283
+ },
284
+
285
+ mousemove: function(e){
286
+ e.stopPropagation();
287
+ e.preventDefault();
288
+ var left = Math.max(
289
+ 0,
290
+ Math.min(
291
+ this.slider.maxLeft,
292
+ this.slider.left + ((e.pageX||this.pointer.left) - this.pointer.left)
293
+ )
294
+ );
295
+ var top = Math.max(
296
+ 0,
297
+ Math.min(
298
+ this.slider.maxTop,
299
+ this.slider.top + ((e.pageY||this.pointer.top) - this.pointer.top)
300
+ )
301
+ );
302
+ this.slider.knob.left = left + 'px';
303
+ this.slider.knob.top = top + 'px';
304
+ if (this.slider.callLeft) {
305
+ this.color[this.slider.callLeft].call(this.color, left/100);
306
+ }
307
+ if (this.slider.callTop) {
308
+ this.color[this.slider.callTop].call(this.color, top/100);
309
+ }
310
+ this.previewColor();
311
+ this.element.trigger({
312
+ type: 'changeColor',
313
+ color: this.color
314
+ });
315
+ return false;
316
+ },
317
+
318
+ mouseup: function(e){
319
+ e.stopPropagation();
320
+ e.preventDefault();
321
+ $(document).off({
322
+ mousemove: this.mousemove,
323
+ mouseup: this.mouseup
324
+ });
325
+ return false;
326
+ }
327
+ }
328
+
329
+ $.fn.colorpicker = function ( option ) {
330
+ return this.each(function () {
331
+ var $this = $(this),
332
+ data = $this.data('colorpicker'),
333
+ options = typeof option == 'object' && option;
334
+ if (!data) {
335
+ $this.data('colorpicker', (data = new Colorpicker(this, $.extend({}, $.fn.colorpicker.defaults,options))));
336
+ }
337
+ if (typeof option == 'string') data[option]();
338
+ });
339
+ };
340
+
341
+ $.fn.colorpicker.defaults = {
342
+ };
343
+
344
+ $.fn.colorpicker.Constructor = Colorpicker;
345
+
346
+ var CPGlobal = {
347
+
348
+ // translate a format from Color object to a string
349
+ translateFormats: {
350
+ 'rgb': function(){
351
+ var rgb = this.color.toRGB();
352
+ return 'rgb('+rgb.r+','+rgb.g+','+rgb.b+')';
353
+ },
354
+
355
+ 'rgba': function(){
356
+ var rgb = this.color.toRGB();
357
+ return 'rgba('+rgb.r+','+rgb.g+','+rgb.b+','+rgb.a+')';
358
+ },
359
+
360
+ 'hsl': function(){
361
+ var hsl = this.color.toHSL();
362
+ return 'hsl('+Math.round(hsl.h*360)+','+Math.round(hsl.s*100)+'%,'+Math.round(hsl.l*100)+'%)';
363
+ },
364
+
365
+ 'hsla': function(){
366
+ var hsl = this.color.toHSL();
367
+ return 'hsla('+Math.round(hsl.h*360)+','+Math.round(hsl.s*100)+'%,'+Math.round(hsl.l*100)+'%,'+hsl.a+')';
368
+ },
369
+
370
+ 'hex': function(){
371
+ return this.color.toHex();
372
+ }
373
+ },
374
+
375
+ sliders: {
376
+ saturation: {
377
+ maxLeft: 100,
378
+ maxTop: 100,
379
+ callLeft: 'setSaturation',
380
+ callTop: 'setLightness'
381
+ },
382
+
383
+ hue: {
384
+ maxLeft: 0,
385
+ maxTop: 100,
386
+ callLeft: false,
387
+ callTop: 'setHue'
388
+ },
389
+
390
+ alpha: {
391
+ maxLeft: 0,
392
+ maxTop: 100,
393
+ callLeft: false,
394
+ callTop: 'setAlpha'
395
+ }
396
+ },
397
+
398
+ // HSBtoRGB from RaphaelJS
399
+ // https://github.com/DmitryBaranovskiy/raphael/
400
+ RGBtoHSB: function (r, g, b, a){
401
+ r /= 255;
402
+ g /= 255;
403
+ b /= 255;
404
+
405
+ var H, S, V, C;
406
+ V = Math.max(r, g, b);
407
+ C = V - Math.min(r, g, b);
408
+ H = (C == 0 ? null :
409
+ V == r ? (g - b) / C :
410
+ V == g ? (b - r) / C + 2 :
411
+ (r - g) / C + 4
412
+ );
413
+ H = ((H + 360) % 6) * 60 / 360;
414
+ S = C == 0 ? 0 : C / V;
415
+ return {h: H||1, s: S, b: V, a: a||1};
416
+ },
417
+
418
+ HueToRGB: function (p, q, h) {
419
+ if (h < 0)
420
+ h += 1;
421
+ else if (h > 1)
422
+ h -= 1;
423
+
424
+ if ((h * 6) < 1)
425
+ return p + (q - p) * h * 6;
426
+ else if ((h * 2) < 1)
427
+ return q;
428
+ else if ((h * 3) < 2)
429
+ return p + (q - p) * ((2 / 3) - h) * 6;
430
+ else
431
+ return p;
432
+ },
433
+
434
+ HSLtoRGB: function (h, s, l, a)
435
+ {
436
+
437
+ if (s < 0)
438
+ s = 0;
439
+
440
+ if (l <= 0.5)
441
+ var q = l * (1 + s);
442
+ else
443
+ var q = l + s - (l * s);
444
+
445
+ var p = 2 * l - q;
446
+
447
+ var tr = h + (1 / 3);
448
+ var tg = h;
449
+ var tb = h - (1 / 3);
450
+
451
+ var r = Math.round(CPGlobal.HueToRGB(p, q, tr) * 255);
452
+ var g = Math.round(CPGlobal.HueToRGB(p, q, tg) * 255);
453
+ var b = Math.round(CPGlobal.HueToRGB(p, q, tb) * 255);
454
+ return [r, g, b, a||1];
455
+ },
456
+
457
+ // a set of RE's that can match strings and generate color tuples.
458
+ // from John Resig color plugin
459
+ // https://github.com/jquery/jquery-color/
460
+ stringParsers: [
461
+ {
462
+ re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
463
+ parse: function( execResult ) {
464
+ return [
465
+ execResult[ 1 ],
466
+ execResult[ 2 ],
467
+ execResult[ 3 ],
468
+ execResult[ 4 ]
469
+ ];
470
+ }
471
+ }, {
472
+ re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
473
+ parse: function( execResult ) {
474
+ return [
475
+ 2.55 * execResult[1],
476
+ 2.55 * execResult[2],
477
+ 2.55 * execResult[3],
478
+ execResult[ 4 ]
479
+ ];
480
+ }
481
+ }, {
482
+ re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,
483
+ parse: function( execResult ) {
484
+ return [
485
+ parseInt( execResult[ 1 ], 16 ),
486
+ parseInt( execResult[ 2 ], 16 ),
487
+ parseInt( execResult[ 3 ], 16 )
488
+ ];
489
+ }
490
+ }, {
491
+ re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,
492
+ parse: function( execResult ) {
493
+ return [
494
+ parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
495
+ parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
496
+ parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
497
+ ];
498
+ }
499
+ }, {
500
+ re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
501
+ space: 'hsla',
502
+ parse: function( execResult ) {
503
+ return [
504
+ execResult[1]/360,
505
+ execResult[2] / 100,
506
+ execResult[3] / 100,
507
+ execResult[4]
508
+ ];
509
+ }
510
+ }
511
+ ],
512
+ template: '<div class="colorpicker dropdown-menu">'+
513
+ '<div class="colorpicker-saturation"><i><b></b></i></div>'+
514
+ '<div class="colorpicker-hue"><i></i></div>'+
515
+ '<div class="colorpicker-alpha"><i></i></div>'+
516
+ '<div class="colorpicker-color"><div /></div>'+
517
+ '</div>'
518
+ };
519
+
520
+ }( window.jQuery )
@@ -0,0 +1,127 @@
1
+ /*!
2
+ * Colorpicker for Bootstrap
3
+ *
4
+ * Copyright 2012 Stefan Petre
5
+ * Licensed under the Apache License v2.0
6
+ * http://www.apache.org/licenses/LICENSE-2.0
7
+ *
8
+ */
9
+ .colorpicker-saturation {
10
+ width: 100px;
11
+ height: 100px;
12
+ background-image: url(/assets/saturation.png);
13
+ cursor: crosshair;
14
+ float: left;
15
+ }
16
+ .colorpicker-saturation i {
17
+ display: block;
18
+ height: 5px;
19
+ width: 5px;
20
+ border: 1px solid #000;
21
+ -webkit-border-radius: 5px;
22
+ -moz-border-radius: 5px;
23
+ border-radius: 5px;
24
+ position: absolute;
25
+ top: 0;
26
+ left: 0;
27
+ margin: -4px 0 0 -4px;
28
+ }
29
+ .colorpicker-saturation i b {
30
+ display: block;
31
+ height: 5px;
32
+ width: 5px;
33
+ border: 1px solid #fff;
34
+ -webkit-border-radius: 5px;
35
+ -moz-border-radius: 5px;
36
+ border-radius: 5px;
37
+ }
38
+ .colorpicker-hue, .colorpicker-alpha {
39
+ width: 15px;
40
+ height: 100px;
41
+ float: left;
42
+ cursor: row-resize;
43
+ margin-left: 4px;
44
+ margin-bottom: 4px;
45
+ }
46
+ .colorpicker-hue i, .colorpicker-alpha i {
47
+ display: block;
48
+ height: 1px;
49
+ background: #000;
50
+ border-top: 1px solid #fff;
51
+ position: absolute;
52
+ top: 0;
53
+ left: 0;
54
+ width: 100%;
55
+ margin-top: -1px;
56
+ }
57
+ .colorpicker-hue {
58
+ background-image: url(/assets/hue.png);
59
+ }
60
+ .colorpicker-alpha {
61
+ background-image: url(/assets/alpha.png);
62
+ display: none;
63
+ }
64
+ .colorpicker {
65
+ *zoom: 1;
66
+ top: 0;
67
+ left: 0;
68
+ padding: 4px;
69
+ min-width: 120px;
70
+ margin-top: 1px;
71
+ -webkit-border-radius: 4px;
72
+ -moz-border-radius: 4px;
73
+ border-radius: 4px;
74
+ }
75
+ .colorpicker:before, .colorpicker:after {
76
+ display: table;
77
+ content: "";
78
+ }
79
+ .colorpicker:after {
80
+ clear: both;
81
+ }
82
+ .colorpicker:before {
83
+ content: '';
84
+ display: inline-block;
85
+ border-left: 7px solid transparent;
86
+ border-right: 7px solid transparent;
87
+ border-bottom: 7px solid #ccc;
88
+ border-bottom-color: rgba(0, 0, 0, 0.2);
89
+ position: absolute;
90
+ top: -7px;
91
+ left: 6px;
92
+ }
93
+ .colorpicker:after {
94
+ content: '';
95
+ display: inline-block;
96
+ border-left: 6px solid transparent;
97
+ border-right: 6px solid transparent;
98
+ border-bottom: 6px solid #ffffff;
99
+ position: absolute;
100
+ top: -6px;
101
+ left: 7px;
102
+ }
103
+ .colorpicker div {
104
+ position: relative;
105
+ }
106
+ .colorpicker.alpha {
107
+ min-width: 140px;
108
+ }
109
+ .colorpicker.alpha .colorpicker-alpha {
110
+ display: block;
111
+ }
112
+ .colorpicker-color {
113
+ height: 10px;
114
+ margin-top: 5px;
115
+ clear: both;
116
+ background-image: url(/assets/alpha.png);
117
+ background-position: 0 100%;
118
+ }
119
+ .colorpicker-color div {
120
+ height: 10px;
121
+ }
122
+ .input-append.color .add-on i, .input-prepend.color .add-on i {
123
+ display: block;
124
+ cursor: pointer;
125
+ width: 16px;
126
+ height: 16px;
127
+ }
@@ -25,12 +25,6 @@ class BeautifulController < ApplicationController
25
25
  end
26
26
 
27
27
  def do_sort_and_paginate(model_sym)
28
- # Paginate
29
- session[:paginate] ||= {}
30
- session[:paginate][model_sym] ||= nil
31
- params[:page] ||= session[:paginate][model_sym]
32
- session[:paginate][model_sym] = params[:page]
33
-
34
28
  # Sort
35
29
  session[:sorting] ||= {}
36
30
  session[:sorting][model_sym] ||= { :attribute => "id", :sorting => "DESC" }
@@ -40,14 +34,22 @@ class BeautifulController < ApplicationController
40
34
  # Search and Filter
41
35
  session[:search] ||= {}
42
36
  session[:search][model_sym] = nil if not params[:nosearch].blank?
37
+ params[:page] = 1 if not params[:q].nil?
43
38
  params[:q] ||= session[:search][model_sym]
44
- session[:search][model_sym] = params[:q]
39
+ session[:search][model_sym] = params[:q] if not params[:skip_save_search].blank?
45
40
 
46
41
  # Scope
47
42
  session[:scope] ||= {}
48
43
  session[:scope][model_sym] ||= nil
44
+ params[:page] = 1 if not params[:scope].nil?
49
45
  params[:scope] ||= session[:scope][model_sym]
50
46
  session[:scope][model_sym] = params[:scope]
47
+
48
+ # Paginate
49
+ session[:paginate] ||= {}
50
+ session[:paginate][model_sym] ||= nil
51
+ params[:page] ||= session[:paginate][model_sym]
52
+ session[:paginate][model_sym] = params[:page]
51
53
  end
52
54
 
53
55
  def boolean(string)
@@ -30,7 +30,8 @@
30
30
  url: "<%= path_namespace %>/<%= plural_linked_model_name %>/search_and_filter.json",
31
31
  type: "POST",
32
32
  data: {
33
- "q[<%= field_to_search_for_linked_model %>_cont]" : request.term
33
+ "q[<%= field_to_search_for_linked_model %>_cont]" : request.term,
34
+ "skip_save_search" : true
34
35
  },
35
36
  dataType: "json",
36
37
  success: function( data ) {
@@ -8,7 +8,7 @@
8
8
  case ar.type
9
9
  when 'integer' then
10
10
  if col =~ /.*_id/ then
11
- f.collection_select((col).to_sym, col.classify.constantize.all, :id, :caption, {}, { :class => "input-small", :placeholder => col.capitalize })
11
+ f.collection_select((col).to_sym, col.classify.constantize.all, :id, :caption, { :include_blank => true }, { :class => "input-small", :placeholder => col.capitalize })
12
12
  else
13
13
  f.text_field(col.to_sym, :class => "input-small", :placeholder => col.capitalize)
14
14
  end
@@ -23,7 +23,7 @@
23
23
  f.text_field(col.to_sym, :class => "input-small", :placeholder => col.capitalize)
24
24
  end
25
25
  else
26
- f.collection_select((col + '_id').to_sym, col.classify.constantize.all, :id, :caption, {}, { :class => "input-small", :placeholder => col.capitalize })
26
+ f.collection_select((col + '_id').to_sym, col.classify.constantize.all, :id, :caption, { :include_blank => true }, { :class => "input-small", :placeholder => col.capitalize })
27
27
  end
28
28
  %>
29
29
  </div>
@@ -7,7 +7,7 @@
7
7
  <meta name="description" content="Beautiful Scaffold">
8
8
  <meta name="author" content="You or me Sylvain Claudel (http://blog.escarworld.com)">
9
9
 
10
- <%%= stylesheet_link_tag "reset", "bootstrap.min", "bootstrap-responsive.min", "datepicker", "timepicker", "beautiful-scaffold", "tagit-dark-grey" %>
10
+ <%%= stylesheet_link_tag "reset", "bootstrap.min", "bootstrap-responsive.min", "datepicker", "timepicker", "beautiful-scaffold", "tagit-dark-grey", "colorpicker" %>
11
11
  <style>
12
12
  body {
13
13
  padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */
@@ -91,7 +91,7 @@
91
91
  <div class="circle1"></div>
92
92
  </div>
93
93
 
94
- <%%= javascript_include_tag "bootstrap.min", "bootstrap-alert", "bootstrap-datepicker" ,"bootstrap-timepicker", "bootstrap-dropdown", "bootstrap-modal", "bootstrap-tooltip" %>
94
+ <%%= javascript_include_tag "bootstrap.min", "bootstrap-alert", "bootstrap-datepicker" ,"bootstrap-timepicker", "bootstrap-dropdown", "bootstrap-modal", "bootstrap-tooltip", "bootstrap-colorpicker" %>
95
95
  <script type="text/javascript">
96
96
  ;(function($){
97
97
  $.fn.datepicker.dates['<%= I18n.locale.to_s %>'] = {
@@ -34,7 +34,7 @@
34
34
  <div class="control-group">
35
35
  <%%= f.label :<%= attribute.name %>, t(:<%= attribute.name %>, :default => "<%= attribute.name.capitalize %>"), :class => "control-label" %>
36
36
  <div class="controls">
37
- <%%= f.collection_select :<%= attribute.name %>_id, <%= attribute.name.camelcase %>.all, :id, :caption %>
37
+ <%%= f.collection_select :<%= attribute.name %>_id, <%= attribute.name.camelcase %>.all, :id, :caption, :include_blank => true %>
38
38
  </div>
39
39
  </div>
40
40
  <%- elsif @beautiful_attributes.include?(attribute.name + ':price') then -%>
@@ -75,6 +75,18 @@
75
75
  </div>
76
76
  </div>
77
77
  </div>
78
+ <%- elsif @beautiful_attributes.include?(attribute.name + ':color') then -%>
79
+ <div class="control-group">
80
+ <%%= f.label :<%= attribute.name %>, t(:<%= attribute.name %>, :default => "<%= attribute.name.capitalize %>"), :class => "control-label" %>
81
+ <div class="controls">
82
+ <div class="input-append color" data-color="rgb(0, 0, 0)" data-color-format="rgb">
83
+ <%%= f.<%= attribute.field_type %> :<%= attribute.name %> %><span class="add-on"><i style="background-color: rgb(0, 0, 0)"></i></span>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ <script type="text/javascript">
88
+ $('.color').colorpicker();
89
+ </script>
78
90
  <%- else -%>
79
91
  <div class="control-group">
80
92
  <%%= f.label :<%= attribute.name %>, t(:<%= attribute.name %>, :default => "<%= attribute.name.capitalize %>"), :class => "control-label" %>
@@ -1,4 +1,5 @@
1
1
  <%- attributes.each do |a| -%>
2
+ <%- next if @beautiful_attributes.include?(a.name + ':color') -%>
2
3
  <%- attribute = "" -%>
3
4
  <%- caption = a.name.capitalize -%>
4
5
  <%- if @beautiful_attributes.include?(a.name + ':references') then -%>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beautiful_scaffold
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-14 00:00:00.000000000Z
12
+ date: 2012-08-17 00:00:00.000000000Z
13
13
  dependencies: []
14
14
  description: Beautiful Scaffold generate a complete scaffold (sort, export, paginate
15
15
  and filter data)
@@ -23,15 +23,20 @@ files:
23
23
  - README.rdoc
24
24
  - beautiful_scaffold.gemspec
25
25
  - lib/generators/USAGE
26
+ - lib/generators/beautiful_jointable_generator.rb
26
27
  - lib/generators/beautiful_locale_generator.rb
27
28
  - lib/generators/beautiful_migration_generator.rb
28
29
  - lib/generators/beautiful_scaffold_common_methods.rb
29
30
  - lib/generators/beautiful_scaffold_generator.rb
31
+ - lib/generators/templates/app/assets/images/alpha.png
30
32
  - lib/generators/templates/app/assets/images/glyphicons-halflings-white.png
31
33
  - lib/generators/templates/app/assets/images/glyphicons-halflings.png
34
+ - lib/generators/templates/app/assets/images/hue.png
35
+ - lib/generators/templates/app/assets/images/saturation.png
32
36
  - lib/generators/templates/app/assets/images/ui-anim_basic_16x16.gif
33
37
  - lib/generators/templates/app/assets/javascripts/beautiful_scaffold.js
34
38
  - lib/generators/templates/app/assets/javascripts/bootstrap-alert.js
39
+ - lib/generators/templates/app/assets/javascripts/bootstrap-colorpicker.js
35
40
  - lib/generators/templates/app/assets/javascripts/bootstrap-datepicker.js
36
41
  - lib/generators/templates/app/assets/javascripts/bootstrap-datetimepicker-for-beautiful-scaffold.js
37
42
  - lib/generators/templates/app/assets/javascripts/bootstrap-dropdown.js
@@ -50,6 +55,7 @@ files:
50
55
  - lib/generators/templates/app/assets/stylesheets/bootstrap-responsive.min.css
51
56
  - lib/generators/templates/app/assets/stylesheets/bootstrap.css
52
57
  - lib/generators/templates/app/assets/stylesheets/bootstrap.min.css
58
+ - lib/generators/templates/app/assets/stylesheets/colorpicker.css
53
59
  - lib/generators/templates/app/assets/stylesheets/datepicker.css
54
60
  - lib/generators/templates/app/assets/stylesheets/reset.css
55
61
  - lib/generators/templates/app/assets/stylesheets/tagit-dark-grey.css
@@ -236,7 +242,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
236
242
  version: '0'
237
243
  requirements: []
238
244
  rubyforge_project: beautiful_scaffold
239
- rubygems_version: 1.8.17
245
+ rubygems_version: 1.8.10
240
246
  signing_key:
241
247
  specification_version: 3
242
248
  summary: Beautiful Scaffold generate fully customizable scaffold