interview 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/interview.gemspec +1 -0
  3. data/lib/{generators/interview/install/templates → assets/javascripts}/interview.js.coffee +17 -25
  4. data/lib/{generators/interview/install/templates/bootstrap_interview.css.scss → assets/stylesheets/interview.css.scss} +3 -2
  5. data/lib/generators/interview/install/install_generator.rb +0 -2
  6. data/lib/generators/interview/install/templates/interview.rb +1 -1
  7. data/lib/interview.rb +65 -51
  8. data/lib/interview/association_methods.rb +2 -0
  9. data/lib/interview/builder.rb +32 -24
  10. data/lib/interview/control.rb +25 -7
  11. data/lib/interview/controls/actionbar.rb +41 -0
  12. data/lib/interview/controls/alert.rb +15 -0
  13. data/lib/interview/{association_attribute.rb → controls/association_attribute.rb} +8 -8
  14. data/lib/interview/{association_list_attribute.rb → controls/association_list_attribute.rb} +10 -9
  15. data/lib/interview/controls/attribute.rb +80 -0
  16. data/lib/interview/controls/auto_attribute.rb +16 -0
  17. data/lib/interview/controls/boolean_attribute.rb +20 -0
  18. data/lib/interview/controls/breadcrumbs.rb +15 -0
  19. data/lib/interview/controls/button.rb +25 -0
  20. data/lib/interview/controls/caret.rb +9 -0
  21. data/lib/interview/controls/collapse_container.rb +16 -0
  22. data/lib/interview/controls/container.rb +5 -0
  23. data/lib/interview/controls/container_attribute.rb +28 -0
  24. data/lib/interview/controls/date_attribute.rb +23 -0
  25. data/lib/interview/controls/datetime_attribute.rb +22 -0
  26. data/lib/interview/controls/decimal_attribute.rb +12 -0
  27. data/lib/interview/controls/dropdown.rb +35 -0
  28. data/lib/interview/controls/form.rb +35 -0
  29. data/lib/interview/controls/form_errors.rb +20 -0
  30. data/lib/interview/controls/glyphicon.rb +19 -0
  31. data/lib/interview/controls/grid.rb +62 -0
  32. data/lib/interview/controls/hidden_attribute.rb +11 -0
  33. data/lib/interview/controls/horizontal_form_container.rb +13 -0
  34. data/lib/interview/controls/html_control.rb +13 -0
  35. data/lib/interview/controls/html_doctype.rb +9 -0
  36. data/lib/interview/controls/html_headers.rb +12 -0
  37. data/lib/interview/{html_text_attribute.rb → controls/html_text_attribute.rb} +9 -5
  38. data/lib/interview/controls/image_attribute.rb +61 -0
  39. data/lib/interview/controls/image_gallery_attribute.rb +72 -0
  40. data/lib/interview/controls/image_light_box.rb +17 -0
  41. data/lib/interview/{integer_attribute.rb → controls/integer_attribute.rb} +0 -0
  42. data/lib/interview/controls/link.rb +90 -0
  43. data/lib/interview/controls/list.rb +20 -0
  44. data/lib/interview/controls/media_object.rb +37 -0
  45. data/lib/interview/controls/navigation.rb +11 -0
  46. data/lib/interview/controls/navigation_item.rb +33 -0
  47. data/lib/interview/controls/nested_form.rb +45 -0
  48. data/lib/interview/controls/nested_form_add_images.rb +15 -0
  49. data/lib/interview/controls/nested_form_add_link.rb +29 -0
  50. data/lib/interview/controls/nested_form_remove_link.rb +12 -0
  51. data/lib/interview/{option_attribute.rb → controls/option_attribute.rb} +19 -19
  52. data/lib/interview/controls/pagination.rb +12 -0
  53. data/lib/interview/controls/panel.rb +13 -0
  54. data/lib/interview/{polymorphic_add_link.rb → controls/polymorphic_add_link.rb} +1 -1
  55. data/lib/interview/controls/polymorphic_nested_form.rb +17 -0
  56. data/lib/interview/{nested_form_add_link.rb → controls/polymorphic_nested_form_add_link.rb} +12 -28
  57. data/lib/interview/controls/progress_bar.rb +18 -0
  58. data/lib/interview/controls/scaffold_card.rb +27 -0
  59. data/lib/interview/controls/scaffold_form.rb +108 -0
  60. data/lib/interview/controls/search_form.rb +25 -0
  61. data/lib/interview/controls/section.rb +16 -0
  62. data/lib/interview/{space.rb → controls/space.rb} +5 -6
  63. data/lib/interview/{string_attribute.rb → controls/string_attribute.rb} +0 -0
  64. data/lib/interview/controls/submit.rb +14 -0
  65. data/lib/interview/controls/tab.rb +27 -0
  66. data/lib/interview/controls/tab_box.rb +21 -0
  67. data/lib/interview/controls/text.rb +33 -0
  68. data/lib/interview/{text_attribute.rb → controls/text_attribute.rb} +7 -5
  69. data/lib/interview/controls/tooltip.rb +21 -0
  70. data/lib/interview/{tree.rb → controls/tree.rb} +2 -3
  71. data/lib/interview/{view.rb → controls/view.rb} +4 -6
  72. data/lib/interview/engine.rb +4 -0
  73. data/lib/interview/handler.rb +15 -0
  74. data/lib/interview/has_html_options.rb +29 -0
  75. data/lib/interview/meta_control.rb +18 -0
  76. data/lib/interview/nested_buildable.rb +17 -0
  77. data/lib/interview/version.rb +1 -1
  78. metadata +84 -54
  79. data/lib/interview/actionbar.rb +0 -39
  80. data/lib/interview/attribute.rb +0 -166
  81. data/lib/interview/boolean_attribute.rb +0 -59
  82. data/lib/interview/breadcrumbs.rb +0 -21
  83. data/lib/interview/button.rb +0 -29
  84. data/lib/interview/collapse_container.rb +0 -31
  85. data/lib/interview/condition_container.rb +0 -19
  86. data/lib/interview/container.rb +0 -13
  87. data/lib/interview/container_attribute.rb +0 -30
  88. data/lib/interview/date_attribute.rb +0 -20
  89. data/lib/interview/datetime_attribute.rb +0 -20
  90. data/lib/interview/decimal_attribute.rb +0 -10
  91. data/lib/interview/dropdown.rb +0 -39
  92. data/lib/interview/form.rb +0 -64
  93. data/lib/interview/form_errors.rb +0 -22
  94. data/lib/interview/grid.rb +0 -54
  95. data/lib/interview/has_controls.rb +0 -40
  96. data/lib/interview/hidden_attribute.rb +0 -15
  97. data/lib/interview/html_control.rb +0 -21
  98. data/lib/interview/image_attribute.rb +0 -59
  99. data/lib/interview/image_gallery_attribute.rb +0 -79
  100. data/lib/interview/image_light_box.rb +0 -19
  101. data/lib/interview/link.rb +0 -134
  102. data/lib/interview/list.rb +0 -26
  103. data/lib/interview/media_object.rb +0 -27
  104. data/lib/interview/navigation.rb +0 -55
  105. data/lib/interview/navigation_item.rb +0 -41
  106. data/lib/interview/navigation_item_old.rb +0 -26
  107. data/lib/interview/nested_form.rb +0 -66
  108. data/lib/interview/nested_form_add_images.rb +0 -33
  109. data/lib/interview/nested_form_remove_link.rb +0 -28
  110. data/lib/interview/panel.rb +0 -18
  111. data/lib/interview/progress_bar.rb +0 -25
  112. data/lib/interview/search_form.rb +0 -21
  113. data/lib/interview/tab.rb +0 -21
  114. data/lib/interview/tab_box.rb +0 -30
  115. data/lib/interview/text.rb +0 -45
  116. data/lib/interview/tooltip.rb +0 -38
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c086485085f2eb7fa260a71e20dc4ada0005abd7
4
- data.tar.gz: 65f36b1b39de18b9bd330ab4467254b4b1a24c37
3
+ metadata.gz: d507579cd98098a01a96c41b05d2438c6901c516
4
+ data.tar.gz: 1552d050ca6ce66b9776bf88fc51a874dc491856
5
5
  SHA512:
6
- metadata.gz: e65be2cb25eea128a5f19da3624aea3816bb03f9f2d8979031e461e7cf83be18be9b5e5a5f7bdcb283e0dcd601e33e2c062095e030ce5d1a2c5d26e2d6ce9c29
7
- data.tar.gz: 2c610a979c4efe97cb05514b515216cba453d58765e603e7b5e95285607a962558e31c8ddec24c01f5a5116f48a46ee20a5c6d8a248e2fe7444d01462c6b3a6a
6
+ metadata.gz: ec3a5e48eaa89103f27a7a7fafa8140a8f08cfc721af7c621d22575882ec80f1245906f115eb11f35b8655197e20dc552afe76b9ae1fc36f8d24c900417c5443
7
+ data.tar.gz: 8b3c16d387a7e887f890c258d86d78cc015f7eba5e627ae35adf3b48af02a814132e1d5f5df4da01d466984bad57cd02d1bd144c9b642856847228a74f65edd7
data/interview.gemspec CHANGED
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
24
24
  spec.add_runtime_dependency "activesupport"
25
25
  spec.add_runtime_dependency "draper"
26
26
  spec.add_runtime_dependency "builder"
27
+ spec.add_runtime_dependency "bootstrap-sass"
27
28
  end
@@ -1,33 +1,27 @@
1
1
  jQuery ->
2
2
 
3
- $(".tip").popover(placement: 'top auto')
3
+ # $(".tip").popover(placement: 'top auto')
4
4
 
5
- $(".tip").on 'click', (event) ->
5
+ $(document).on 'click', '.tip', (e) ->
6
6
  event.preventDefault()
7
7
 
8
- $(".action_hint").tooltip(placement: 'top auto')
9
-
10
- $('.tab_box a').click (e) ->
8
+ $(document).on 'click', '.tab_box a', (e) ->
11
9
  e.preventDefault()
12
10
  $(this).tab('show')
13
11
 
14
- bind_remove_links = ->
15
- $('.nested_form_remove_link').click (e) ->
16
- e.preventDefault()
17
- $(this).closest(".nested_form").find(".nested_form_destroy").val("1")
18
- $(this).closest(".nested_form").collapse('hide')
19
-
20
- bind_remove_links()
12
+ $(document).on 'click', '.nested_form_remove_link', (e) ->
13
+ e.preventDefault()
14
+ $(this).closest(".nested_form").find(".nested_form_destroy").val("1")
15
+ $(this).closest(".nested_form").collapse('hide')
21
16
 
22
- $('.nested_form_add_link').click (e) ->
17
+ $(document).on 'click', '.nested_form_add_link', (e) ->
23
18
  e.preventDefault()
24
19
  new_id = new Date().getTime()
25
20
  regexp = new RegExp("new_association", "g")
26
21
  html = $(this).data('content').replace(regexp, new_id)
27
22
  $(".nested_forms").append(html)
28
- bind_remove_links()
29
23
 
30
- $('.nested_form_polymorphic_add_link').click (e) ->
24
+ $(document).on 'click', '.nested_form_polymorphic_add_link', (e) ->
31
25
  e.preventDefault()
32
26
  object_class = $('#add_link_class').children('option:selected').val()
33
27
  if object_class != ''
@@ -36,9 +30,8 @@ jQuery ->
36
30
  regexp = new RegExp("new_association", "g")
37
31
  html = data[object_class].replace(regexp, new_id)
38
32
  $(".nested_forms").append(html)
39
- bind_remove_links()
40
33
 
41
- $('.polymorphic_add_link').click (e) ->
34
+ $(document).on 'click', '.polymorphic_add_link', (e) ->
42
35
  e.preventDefault()
43
36
  object_class = $('#add_link_class').children('option:selected').val()
44
37
  if object_class != ''
@@ -70,19 +63,19 @@ jQuery ->
70
63
  error: (data) ->
71
64
  tree.jstree('refresh')
72
65
  $(tree).before("<div class=\"alert alert-danger\">#{data.responseText}</div>")
73
-
74
- $('.collapse_link').click (e) ->
66
+
67
+ $(document).on 'click', '.collapse_link', (e) ->
75
68
  e.preventDefault()
76
69
  $($(this).data('target')).collapse('toggle')
77
70
 
78
- $('.img-link').click (e) ->
71
+ $(document).on 'click', '.img-link', (e) ->
79
72
  e.preventDefault()
80
73
  links = $(this).closest('.image-gallery').find('.img-link')
81
- target = event.target || event.srcElement
74
+ target = e.target || e.srcElement
82
75
  link = if target.src then target.parentNode else target
83
76
  options = { index: link, event: e }
84
77
  blueimp.Gallery(links, options)
85
-
78
+
86
79
  $('.upload_image').fileupload
87
80
  add: (e, data) ->
88
81
  types = /(\.|\/)(gif|jpe?g|png|mov|mpeg|mpeg4|avi)$/i
@@ -100,7 +93,7 @@ jQuery ->
100
93
  done: (e, data) ->
101
94
  $(this).closest('.image_attribute_container').find('.upload_buffer_id').attr('value', data.result.id)
102
95
  $(this).closest('.image_attribute_container').find('.image').attr('src', data.result.thumb_url)
103
-
96
+
104
97
  $('.nested_form_add_images').fileupload
105
98
  add: (e, data) ->
106
99
  types = /(\.|\/)(gif|jpe?g|png|mov|mpeg|mpeg4|avi)$/i
@@ -110,7 +103,6 @@ jQuery ->
110
103
  data.context = $(this).closest('.nested_form_container').find('.nested_form_script').tmpl(tmpl_data)
111
104
  $(this).closest('.nested_form_container').append(data.context)
112
105
  data.context.find('.progress').collapse('show')
113
- bind_remove_links()
114
106
  $("input[name='_method']").attr('name', '__method')
115
107
  data.submit()
116
108
  $("input[name='__method']").attr('name', '_method')
@@ -123,7 +115,7 @@ jQuery ->
123
115
  done: (e, data) ->
124
116
  data.context.find('.upload_buffer_id').attr('value', data.result.id)
125
117
  data.context.find('.image').attr('src', data.result.thumb_url)
126
-
118
+
127
119
  $('.nested_form').each ->
128
120
  nested_form = $(this)
129
121
  upload_buffer_id = $(this).find('.upload_buffer_id').attr('value')
@@ -1,4 +1,4 @@
1
- @import 'font-awesome';
1
+ /* @import 'font-awesome'; */
2
2
 
3
3
  @import 'colors';
4
4
 
@@ -10,6 +10,7 @@ $navbar-inverse-color: #ffffff;
10
10
  $navbar-inverse-link-color: $brand-primary-lighten;
11
11
  $navbar-inverse-link-hover-color: #ffffff;
12
12
 
13
+ @import 'bootstrap-sprockets';
13
14
  @import 'bootstrap';
14
15
 
15
16
  $actionbar-padding: 5px !default;
@@ -74,7 +75,7 @@ $nav-stacked-link-padding-level2: 5px 15px 5px 45px !default;
74
75
  padding: $nav-stacked-link-padding-level1;
75
76
  }
76
77
  > li.level2 > a {
77
- padding: $nav-stacked-link-padding-level1;
78
+ padding: $nav-stacked-link-padding-level2;
78
79
  }
79
80
  }
80
81
 
@@ -13,10 +13,8 @@ module Interview
13
13
 
14
14
  def add_assets
15
15
  copy_file "application.css", "app/assets/stylesheets/application.css" # todo: überdenken
16
- copy_file "bootstrap_interview.css.scss", "app/assets/stylesheets/bootstrap_interview.css.scss"
17
16
  copy_file "colors.css.scss", "app/assets/stylesheets/colors.css.scss"
18
17
  copy_file "application.js", "app/assets/javascripts/application.js" # todo: überdenken
19
- copy_file "interview.js.coffee", "app/assets/javascripts/interview.js.coffee"
20
18
  copy_file "missing_thumb.png", "app/assets/images/missing_thumb.png"
21
19
  copy_file "missing_medium.png", "app/assets/images/missing_medium.png"
22
20
  copy_file "missing_large.png", "app/assets/images/missing_large.png"
@@ -1,4 +1,4 @@
1
1
  Rails.application.config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
2
2
  Rails.application.config.i18n.default_locale = :de
3
3
 
4
- Rails.application.config.generators.stylesheets false
4
+ ActionView::Template.register_template_handler(:iview, ::Interview::Handler)
data/lib/interview.rb CHANGED
@@ -1,66 +1,80 @@
1
1
  require "active_support/inflector"
2
2
  require "draper"
3
3
  require "builder"
4
+ require "bootstrap-sass"
4
5
 
5
6
  require "interview/version"
6
7
 
7
8
  require "interview/control"
8
- require "interview/has_controls"
9
- require "interview/container"
9
+ require "interview/meta_control"
10
+ require "interview/has_html_options"
10
11
  require "interview/builder"
12
+ require "interview/nested_buildable"
13
+ require "interview/handler"
14
+ require "interview/engine"
11
15
  require "interview/object_context"
16
+ require "interview/association_methods"
12
17
 
13
- require "interview/text"
14
- require "interview/link"
15
- require "interview/dropdown"
16
- require "interview/space"
17
- require "interview/tooltip"
18
- require "interview/html_control"
19
- require "interview/actionbar"
20
- require "interview/grid"
21
- require "interview/list"
22
- require "interview/tree"
23
- require "interview/navigation"
24
- require "interview/navigation_item"
25
- require "interview/tab_box"
26
- require "interview/tab"
27
- require "interview/breadcrumbs"
28
- require "interview/media_object"
29
- require "interview/panel"
30
- require "interview/collapse_container"
31
- require "interview/condition_container"
32
-
33
- require "interview/attribute"
34
- require "interview/string_attribute"
35
- require "interview/text_attribute"
36
- require "interview/integer_attribute"
37
- require "interview/decimal_attribute"
38
- require "interview/boolean_attribute"
39
- require "interview/date_attribute"
40
- require "interview/datetime_attribute"
41
- require "interview/option_attribute"
42
- require "interview/html_text_attribute"
43
- require "interview/image_attribute"
44
- require "interview/image_gallery_attribute"
45
- require "interview/image_light_box"
46
- require "interview/association_attribute"
47
- require "interview/association_list_attribute"
48
- require "interview/hidden_attribute"
49
- require "interview/container_attribute"
18
+ require "interview/controls/section"
19
+ require "interview/controls/text"
20
+ require "interview/controls/html_headers"
21
+ require "interview/controls/container"
22
+ require "interview/controls/link"
23
+ require "interview/controls/dropdown"
24
+ require "interview/controls/space"
25
+ require "interview/controls/glyphicon"
26
+ require "interview/controls/tooltip"
27
+ require "interview/controls/html_control"
28
+ require "interview/controls/actionbar"
29
+ require "interview/controls/grid"
30
+ require "interview/controls/list"
31
+ require "interview/controls/tree"
32
+ require "interview/controls/navigation"
33
+ require "interview/controls/navigation_item"
34
+ require "interview/controls/tab_box"
35
+ require "interview/controls/tab"
36
+ require "interview/controls/breadcrumbs"
37
+ require "interview/controls/media_object"
38
+ require "interview/controls/panel"
39
+ require "interview/controls/collapse_container"
40
+ require "interview/controls/pagination"
41
+ require "interview/controls/html_doctype"
42
+ require "interview/controls/alert"
50
43
 
51
- require "interview/view"
52
- require "interview/form"
53
- require "interview/nested_form"
54
- require "interview/nested_form_remove_link"
55
- require "interview/nested_form_add_link"
56
- require "interview/nested_form_add_images"
57
- require "interview/form_errors"
58
- require "interview/polymorphic_add_link"
59
- require "interview/search_form"
60
- require "interview/button"
61
- require "interview/progress_bar"
44
+ require "interview/controls/attribute"
45
+ require "interview/controls/string_attribute"
46
+ require "interview/controls/text_attribute"
47
+ require "interview/controls/integer_attribute"
48
+ require "interview/controls/decimal_attribute"
49
+ require "interview/controls/boolean_attribute"
50
+ require "interview/controls/date_attribute"
51
+ require "interview/controls/datetime_attribute"
52
+ require "interview/controls/option_attribute"
53
+ require "interview/controls/html_text_attribute"
54
+ require "interview/controls/image_attribute"
55
+ require "interview/controls/image_gallery_attribute"
56
+ require "interview/controls/image_light_box"
57
+ require "interview/controls/association_attribute"
58
+ require "interview/controls/association_list_attribute"
59
+ require "interview/controls/hidden_attribute"
60
+ require "interview/controls/container_attribute"
62
61
 
63
- require "interview/association_methods"
62
+ require "interview/controls/view"
63
+ require "interview/controls/form"
64
+ require "interview/controls/nested_form"
65
+ require "interview/controls/nested_form_remove_link"
66
+ require "interview/controls/nested_form_add_link"
67
+ require "interview/controls/nested_form_add_images"
68
+ require "interview/controls/form_errors"
69
+ require "interview/controls/polymorphic_nested_form"
70
+ require "interview/controls/polymorphic_add_link"
71
+ require "interview/controls/search_form"
72
+ require "interview/controls/submit"
73
+ require "interview/controls/button"
74
+ require "interview/controls/progress_bar"
75
+ require "interview/controls/horizontal_form_container"
76
+ require "interview/controls/scaffold_card"
77
+ require "interview/controls/scaffold_form"
64
78
 
65
79
  module Interview
66
80
  # Your code goes here...
@@ -1,5 +1,7 @@
1
1
  module AssociationMethods
2
2
 
3
+ # todo: überarbeiten
4
+
3
5
  def define_readers
4
6
  super
5
7
  mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
@@ -1,49 +1,57 @@
1
1
  module Interview
2
2
  class Builder
3
3
 
4
+ attr_accessor :html, :curr_parent
5
+
4
6
  def initialize(options={})
5
- @target = Interview::Container.new
7
+ @html = ::Builder::XmlMarkup.new
6
8
  end
7
9
 
8
- def controls!
9
- @target.controls
10
+ def render!
11
+ @html.target!
10
12
  end
11
13
 
12
- def render!
13
- @target.render
14
+ def add!(control, &block)
15
+ if @curr_parent.is_a? MetaControl and not @curr_parent.skip
16
+ @curr_parent.build_child self, control, &block
17
+ else
18
+ control.parent = @curr_parent
19
+ @curr_parent = control
20
+ control.build self, &block
21
+ @curr_parent = control.parent
22
+ end
14
23
  end
15
24
 
16
- def add!(sym, *args, &block)
25
+ def add_abstract!(sym, *args, &block)
17
26
  if Object.const_defined?(sym.to_s.camelcase) and
18
27
  Object.const_get(sym.to_s.camelcase) <= Interview::Control
19
28
  control = Object.const_get(sym.to_s.camelcase).new(*args)
20
29
  else
30
+ # todo: prüfen, ob Control vorhanden
21
31
  control = Object.const_get("Interview::#{sym.to_s.camelcase}").new(*args)
22
32
  end
23
- @target.add_control control
24
- if block and control.respond_to? :add_block
25
- control.add_block(&block)
26
- elsif block
27
- temp_target = @target
28
- @target = control
29
- yield
30
- @target = temp_target
31
- end
33
+ add! control, &block
32
34
  end
33
35
 
34
- def <<(control_or_array)
35
- if control_or_array.kind_of? Array
36
- @target.add_controls control_or_array
37
- else
38
- @target.add_control control_or_array
39
- end
36
+ def tag!(sym, *args, &block)
37
+ @html.tag!(sym, *args, &block)
40
38
  end
41
39
 
42
- def method_missing(sym, *args, &block)
43
- add!(sym, *args, &block)
40
+ def text!(text)
41
+ @html.text!(text)
42
+ end
43
+
44
+ def <<(text)
45
+ @html << text
44
46
  end
45
47
 
46
- protected
48
+ def lookup!(attr_name)
49
+ @curr_parent.find_attribute!(attr_name)
50
+ end
51
+
52
+ def method_missing(sym, *args, &block)
53
+ add_abstract!(sym, *args, &block)
54
+ end
47
55
 
48
56
  end
49
57
  end
@@ -18,7 +18,7 @@ module Interview
18
18
  end
19
19
  end
20
20
 
21
- def set_defaults
21
+ def set_defaults # todo: löschen?
22
22
  if self.class.const_defined? 'DEFAULTS'
23
23
  self.class::DEFAULTS.each do |key, value|
24
24
  self.send("#{key}=".to_sym, value)
@@ -35,12 +35,21 @@ module Interview
35
35
  end
36
36
 
37
37
  def find_attribute(attribute)
38
- return nil if @parent.nil?
39
- if @parent.respond_to? attribute
40
- return @parent.send attribute
38
+ if respond_to? attribute
39
+ value = send attribute
40
+ return value if value
41
+ end
42
+ if @parent
43
+ return @parent.find_attribute(attribute)
41
44
  else
42
- return @parent.find_attribute attribute
45
+ return nil
43
46
  end
47
+ # return nil if @parent.nil?
48
+ # if @parent.respond_to? attribute
49
+ # return @parent.send attribute
50
+ # else
51
+ # return @parent.find_attribute attribute
52
+ # end
44
53
  end
45
54
 
46
55
  def find_attribute!(attr_name)
@@ -49,8 +58,17 @@ module Interview
49
58
  return attribute
50
59
  end
51
60
 
52
- def render
53
- return ''
61
+ def build(b)
62
+ yield if block_given?
63
+ end
64
+
65
+ def build_with_params(b, params={})
66
+ set_attributes(params)
67
+ build(b)
68
+ end
69
+
70
+ def build_child(b, control, &block)
71
+ b.add! control, &block
54
72
  end
55
73
 
56
74
  end
@@ -0,0 +1,41 @@
1
+ module Interview
2
+ class Actionbar < Control
3
+
4
+ attr_accessor :title, :icon
5
+
6
+ def build(b)
7
+ title = @title || find_attribute(:title)
8
+ icon = @icon
9
+ if icon == :polymorphic
10
+ object = find_attribute! :object
11
+ icon = object.icon
12
+ end
13
+
14
+ b.section html_class: 'clearfix' do
15
+ if block_given?
16
+ b.section style: 'ul', html_class: 'list-inline pull-right' do
17
+ b.meta_class pointer: self do
18
+ yield
19
+ end
20
+ end
21
+ end
22
+ if title
23
+ b.section style: 'p', html_class: 'h3' do
24
+ if icon
25
+ b.section style: 'span', html_class: icon
26
+ b.space
27
+ end
28
+ b.text text: title
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ def build_child(b, control, &block)
35
+ b.section style: 'li' do
36
+ super
37
+ end
38
+ end
39
+
40
+ end
41
+ end