kiss 1.8.2 → 1.8.3
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/Rakefile +1 -1
- data/VERSION +1 -1
- data/data/scaffold.tgz +0 -0
- data/lib/kiss/form/field.rb +0 -4
- data/lib/kiss/form.rb +173 -116
- metadata +3 -3
data/Rakefile
CHANGED
@@ -7,7 +7,7 @@ spec = Gem::Specification.new do |s|
|
|
7
7
|
s.name = 'kiss'
|
8
8
|
s.version = File.read('VERSION').chomp
|
9
9
|
s.author = 'Shawn Van Ittersum'
|
10
|
-
s.email = 'shawn @nospam@
|
10
|
+
s.email = 'shawn @nospam@ appjudo.com'
|
11
11
|
s.homepage = 'http://www.rubykiss.org'
|
12
12
|
s.rubyforge_project = 'kiss'
|
13
13
|
s.summary = 'An MVC web application framework using Rack, Sequel, and Erubis.'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.8.
|
1
|
+
1.8.3
|
data/data/scaffold.tgz
CHANGED
Binary file
|
data/lib/kiss/form/field.rb
CHANGED
@@ -194,10 +194,6 @@ class Kiss
|
|
194
194
|
@_currency.to_s + input_tag_html(attrs) + tip_html(attrs)
|
195
195
|
end
|
196
196
|
|
197
|
-
def table_row_html
|
198
|
-
form.component_html(self)
|
199
|
-
end
|
200
|
-
|
201
197
|
def tip_html(attrs)
|
202
198
|
(tip = attrs.has_key?(:tip) ? attrs[:tip] : @_tip) ? " <small>#{tip}</small>" : ''
|
203
199
|
end
|
data/lib/kiss/form.rb
CHANGED
@@ -42,24 +42,54 @@ class Kiss
|
|
42
42
|
@_form = form
|
43
43
|
@_components = []
|
44
44
|
end
|
45
|
+
|
46
|
+
# Renders HTML for specified form field.
|
47
|
+
def component_table_row_html(field)
|
48
|
+
field = fields[field.to_s] if (field.is_a?(Symbol) || field.is_a?(String))
|
49
|
+
return field.element_html if field.is_a?(HiddenField)
|
50
|
+
|
51
|
+
type = field.class.type
|
52
|
+
prompt = field.prompt
|
53
|
+
label = field.label
|
54
|
+
errors = field.errors_html
|
55
|
+
required = field.required ? %Q(<span class="kiss_form_required">#{@_form.mark_required}</span> ) : ''
|
56
|
+
|
57
|
+
parts = [
|
58
|
+
prompt ? %Q(<tr class="kiss_form_prompt"><td class="kiss_form_label">#{required}</td><td>#{prompt.to_s}</td></tr>) : '',
|
59
|
+
%Q(<tr class="kiss_form_#{type}"><td class="kiss_form_label#{errors ? ' error' : ''}">),
|
60
|
+
!prompt ? (required + (label.blank? ? '' : label.to_s + ':' )) : '',
|
61
|
+
%Q(</td><td class="kiss_form_#{type}">),
|
62
|
+
field.element_html, "</td></tr>"
|
63
|
+
]
|
64
|
+
if errors
|
65
|
+
parts += [
|
66
|
+
'<tr class="kiss_form_error_row"><td class="kiss_form_required"></td><td>',
|
67
|
+
errors,
|
68
|
+
'</td></tr>'
|
69
|
+
]
|
70
|
+
end
|
71
|
+
parts.join
|
72
|
+
end
|
45
73
|
|
46
74
|
# Renders HTML for form fields.
|
47
75
|
def components_html
|
48
76
|
@_components.map do |component|
|
49
|
-
|
77
|
+
component_table_row_html(component)
|
50
78
|
end.join
|
51
79
|
end
|
52
80
|
alias_method :fields_html, :components_html
|
53
81
|
|
54
82
|
# Renders open of form table.
|
55
|
-
def
|
83
|
+
def table_opening_html
|
56
84
|
%Q(<table class="kiss_form_column" border=0 cellspacing=0><tbody>)
|
57
85
|
end
|
86
|
+
alias_method :table_html_open, :table_opening_html
|
58
87
|
|
59
88
|
# Renders close of form table.
|
60
|
-
def
|
89
|
+
def table_closing_html
|
61
90
|
'</tbody></table>'
|
62
91
|
end
|
92
|
+
alias_method :table_html_close, :table_closing_html
|
63
93
|
|
64
94
|
def html
|
65
95
|
[
|
@@ -314,23 +344,61 @@ class Kiss
|
|
314
344
|
end
|
315
345
|
|
316
346
|
def validate_uniqueness_of(column_set)
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
347
|
+
conditions = column_set.last.is_a?(Hash) ? column_set.pop : {}
|
348
|
+
|
349
|
+
nouns = []
|
350
|
+
true_adjectives = []
|
351
|
+
false_adjectives = []
|
352
|
+
|
353
|
+
column_set.each do |column_name|
|
354
|
+
key = column_name.to_sym
|
355
|
+
column_name = column_name.to_s
|
356
|
+
|
357
|
+
field = fields[column_name]
|
358
|
+
label, value = field ?
|
359
|
+
[field.label.downcase, field.value] :
|
360
|
+
[column_name.sub(/_id\Z/, '').downcase, object[column_name.to_sym]]
|
361
|
+
conditions[key] = value
|
362
|
+
|
363
|
+
if column_name =~ /\Ais_/ || column_name =~ /_at\Z/
|
364
|
+
if value.zero? || value.nil?
|
365
|
+
false_adjectives
|
366
|
+
else
|
367
|
+
true_adjectives
|
368
|
+
end
|
369
|
+
else
|
370
|
+
nouns
|
371
|
+
end << label
|
321
372
|
end
|
322
|
-
conditions = column_set.zip column_set_labels_values.map {|lv| lv[1] }
|
323
373
|
|
324
374
|
dataset = @_object.model.filter(conditions)
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
375
|
+
dataset = dataset.exclude(@_object.pk_hash) unless @_object.new?
|
376
|
+
return nil if dataset.empty?
|
377
|
+
|
378
|
+
true_adjective_string = true_adjectives.empty? ? '' :
|
379
|
+
(true_adjectives.join(', ') + ' ')
|
380
|
+
humanized_object_class_name = @_object.model.name.singularize.gsub('_', ' ')
|
381
|
+
false_adjective_string = false_adjectives.empty? ? '' :
|
382
|
+
", not #{false_adjectives.conjoin('or')},"
|
383
|
+
with_clause = nouns.empty? ? '' : " with the same #{nouns.conjoin}"
|
384
|
+
message = [
|
385
|
+
'There is already another ',
|
386
|
+
true_adjective_string,
|
387
|
+
humanized_object_class_name,
|
388
|
+
false_adjective_string,
|
389
|
+
with_clause,
|
390
|
+
'.'
|
391
|
+
].join
|
392
|
+
|
393
|
+
# Add error to a single field if appropriate.
|
394
|
+
if column_set.length == 1
|
395
|
+
field_name = column_set[0].to_str
|
396
|
+
if field_name && fields[field_name]
|
397
|
+
return add_error(field_name, message)
|
398
|
+
end
|
333
399
|
end
|
400
|
+
# Else add to top of form.
|
401
|
+
return add_error(message)
|
334
402
|
end
|
335
403
|
|
336
404
|
# Checks whether form was submitted and accepted by user and, if so,
|
@@ -467,6 +535,11 @@ class Kiss
|
|
467
535
|
end
|
468
536
|
alias_method :accepted, :accepted?
|
469
537
|
|
538
|
+
# Renders current action using form's HTML as action render content.
|
539
|
+
def render(options = {})
|
540
|
+
@_delegate.render options.merge(:content => html)
|
541
|
+
end
|
542
|
+
|
470
543
|
# Renders error HTML block for top of form, and returns as string.
|
471
544
|
def errors_html
|
472
545
|
return nil unless has_errors?
|
@@ -485,35 +558,64 @@ class Kiss
|
|
485
558
|
%Q(<table class="kiss_form_errors"><tr><td>#{content}</td></tr></table>)
|
486
559
|
end
|
487
560
|
|
488
|
-
# Renders current action using form's HTML as action render content.
|
489
|
-
def render(options = {})
|
490
|
-
@_delegate.render options.merge(:content => html)
|
491
|
-
end
|
492
|
-
|
493
561
|
def form_name_hidden_tag_html
|
494
562
|
%Q(<input type=hidden name="form" value="#{@_name}">)
|
495
563
|
end
|
496
564
|
|
497
|
-
# Renders
|
498
|
-
def
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
565
|
+
# Renders HTML for form sections.
|
566
|
+
def sections_html
|
567
|
+
sections.map do |section|
|
568
|
+
section.html
|
569
|
+
end.join
|
570
|
+
end
|
571
|
+
alias_method :components_html, :sections_html
|
572
|
+
alias_method :fields_html, :sections_html
|
573
|
+
|
574
|
+
def required_legend_html
|
575
|
+
(@_has_required_fields && @_mark_required) ?
|
576
|
+
%Q( <tr><td class="kiss_form_help">Required fields marked by <span class="kiss_form_required">*</span></td></tr> ) : ''
|
577
|
+
end
|
578
|
+
|
579
|
+
# Renders form submit buttons.
|
580
|
+
def submit_html
|
581
|
+
if @_submit
|
582
|
+
prompt = @_submit.prompt ? (@_submit.prompt + '<br/>') : ''
|
583
|
+
[
|
584
|
+
'<tr class="kiss_form_submit"><td>',
|
585
|
+
prompt,
|
586
|
+
@_submit.element_html,
|
587
|
+
'<br/></td></tr>'
|
588
|
+
].join
|
589
|
+
else
|
590
|
+
''
|
511
591
|
end
|
512
|
-
|
513
|
-
|
514
|
-
|
592
|
+
end
|
593
|
+
|
594
|
+
# Renders open of form table.
|
595
|
+
def table_opening_html
|
596
|
+
%Q(<table class="kiss_form" border=0 cellspacing=0><tbody>)
|
597
|
+
end
|
598
|
+
alias_method :table_html_open, :table_opening_html
|
599
|
+
|
600
|
+
# Renders close of form table.
|
601
|
+
def table_closing_html
|
602
|
+
'</tbody></table>'
|
603
|
+
end
|
604
|
+
alias_method :table_html_close, :table_closing_html
|
605
|
+
|
606
|
+
def table_html
|
607
|
+
[
|
608
|
+
table_opening_html,
|
609
|
+
required_legend_html,
|
610
|
+
sections_html,
|
611
|
+
submit_html,
|
612
|
+
table_closing_html
|
613
|
+
].flatten.join
|
614
|
+
end
|
615
|
+
|
616
|
+
def style_html
|
515
617
|
styles = []
|
516
|
-
styles
|
618
|
+
styles << <<-EOT
|
517
619
|
table.kiss_form {
|
518
620
|
border: 0;
|
519
621
|
border-collapse: collapse;
|
@@ -610,10 +712,9 @@ table.kiss_form_column > tbody > tr > td {
|
|
610
712
|
text-align: center;
|
611
713
|
}
|
612
714
|
EOT
|
613
|
-
)
|
614
715
|
|
615
716
|
if @_error_class == 'kiss_form_error_message'
|
616
|
-
styles
|
717
|
+
styles << <<-EOT
|
617
718
|
.kiss_form_error_message {
|
618
719
|
padding: 1px 4px;
|
619
720
|
border: 1px solid #db4;
|
@@ -643,91 +744,47 @@ tr.kiss_form_error_row .kiss_form_error_message {
|
|
643
744
|
margin-bottom: 0;
|
644
745
|
}
|
645
746
|
EOT
|
646
|
-
)
|
647
747
|
end
|
648
|
-
|
748
|
+
styles.empty? ? '' : ["<style>", styles, "</style>"].flatten.join
|
749
|
+
end
|
750
|
+
|
751
|
+
# Renders beginning of form (form open tag and form/field/error styles).
|
752
|
+
def opening_html
|
753
|
+
@_error_class ||= 'kiss_form_error_message'
|
754
|
+
@_field_error_class ||= @_error_class
|
755
|
+
|
756
|
+
# form tag
|
757
|
+
form_attrs = ['id', 'method', 'enctype', 'class', 'style'].map do |attr|
|
758
|
+
next if (value = send attr).blank?
|
759
|
+
"#{attr}=\"#{send attr}\""
|
760
|
+
end
|
761
|
+
if @_html
|
762
|
+
@_html.each_pair do |k, v|
|
763
|
+
form_attrs.push("#{k}=\"#{v}\"")
|
764
|
+
end
|
765
|
+
end
|
766
|
+
form_tag = %Q(<form action="#{@_action}" #{form_attrs.join(' ')}>#{form_name_hidden_tag_html})
|
649
767
|
|
650
768
|
# combine
|
651
|
-
|
769
|
+
[
|
770
|
+
style_html,
|
771
|
+
@_prepend_html,
|
772
|
+
form_tag,
|
773
|
+
'<div class="kiss_form">',
|
774
|
+
errors_html
|
775
|
+
].join
|
652
776
|
end
|
777
|
+
alias_method :html_open, :opening_html
|
653
778
|
|
654
779
|
# Renders end of form (form close tag).
|
655
|
-
def
|
656
|
-
|
657
|
-
end
|
658
|
-
|
659
|
-
# Renders HTML for form sections.
|
660
|
-
def sections_html
|
661
|
-
sections.map do |section|
|
662
|
-
section.html
|
663
|
-
end.join
|
664
|
-
end
|
665
|
-
|
666
|
-
# Renders HTML for form fields.
|
667
|
-
def components_html
|
668
|
-
@_components.map do |component|
|
669
|
-
component_html(component)
|
670
|
-
end.join
|
671
|
-
end
|
672
|
-
alias_method :fields_html, :components_html
|
673
|
-
|
674
|
-
# Renders open of form table.
|
675
|
-
def table_html_open
|
676
|
-
%Q(<table class="kiss_form" border=0 cellspacing=0><tbody>)
|
677
|
-
end
|
678
|
-
|
679
|
-
def required_legend_html
|
680
|
-
(@_has_required_fields && @_mark_required) ?
|
681
|
-
%Q( <tr><td class="kiss_form_help">Required fields marked by <span class="kiss_form_required">*</span></td></tr> ) : ''
|
682
|
-
end
|
683
|
-
|
684
|
-
# Renders close of form table.
|
685
|
-
def table_html_close
|
686
|
-
'</tbody></table>'
|
687
|
-
end
|
688
|
-
|
689
|
-
# Renders form submit buttons.
|
690
|
-
def submit_html
|
691
|
-
@_submit ? %Q(<tr class="kiss_form_submit"><td>#{@_submit.element_html}</td></tr>) : ''
|
780
|
+
def closing_html
|
781
|
+
'</div></form>' + @_append_html
|
692
782
|
end
|
783
|
+
alias_method :html_close, :closing_html
|
693
784
|
|
694
785
|
# Renders complete form HTML.
|
695
786
|
def html
|
696
|
-
|
697
|
-
html_open,
|
698
|
-
table_html_open,
|
699
|
-
required_legend_html,
|
700
|
-
sections_html,
|
701
|
-
submit_html,
|
702
|
-
table_html_close,
|
703
|
-
html_close
|
704
|
-
].flatten.join
|
787
|
+
[opening_html, table_html, closing_html].join
|
705
788
|
end
|
706
|
-
|
707
|
-
# Renders HTML for specified form field.
|
708
|
-
def component_html(field)
|
709
|
-
field = fields[field.to_s] if (field.is_a?(Symbol) || field.is_a?(String))
|
710
|
-
return field.element_html if field.is_a?(HiddenField)
|
711
|
-
|
712
|
-
type = field.class.type
|
713
|
-
prompt = field.prompt
|
714
|
-
label = field.label
|
715
|
-
errors = field.errors_html
|
716
|
-
required = field.required ? %Q(<span class="kiss_form_required">#{@_mark_required}</span> ) : ''
|
717
|
-
|
718
|
-
([
|
719
|
-
prompt ? %Q(<tr class="kiss_form_prompt"><td class="kiss_form_label">#{required}</td><td>#{prompt.to_s}</td></tr>) : '',
|
720
|
-
|
721
|
-
%Q(<tr class="kiss_form_#{type}"><td class="kiss_form_label#{errors ? ' error' : ''}">),
|
722
|
-
!prompt ? (required + (label.blank? ? '' : label.to_s + ':' )) : '',
|
723
|
-
%Q(</td><td class="kiss_form_#{type}">),
|
724
|
-
field.element_html, "</td></tr>"
|
725
|
-
] + (errors ? [
|
726
|
-
'<tr class="kiss_form_error_row"><td class="kiss_form_required"></td><td>',
|
727
|
-
errors,
|
728
|
-
'</td></tr>'
|
729
|
-
] : [])).join
|
730
|
-
end
|
731
|
-
alias_method :field_html, :component_html
|
732
789
|
end
|
733
790
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 8
|
8
|
-
-
|
9
|
-
version: 1.8.
|
8
|
+
- 3
|
9
|
+
version: 1.8.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Shawn Van Ittersum
|
@@ -82,7 +82,7 @@ dependencies:
|
|
82
82
|
type: :runtime
|
83
83
|
version_requirements: *id005
|
84
84
|
description:
|
85
|
-
email: shawn @nospam@
|
85
|
+
email: shawn @nospam@ appjudo.com
|
86
86
|
executables:
|
87
87
|
- kiss
|
88
88
|
extensions: []
|