interview 0.1.0 → 0.3.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 (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