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
@@ -0,0 +1,108 @@
1
+ module Interview
2
+ class ScaffoldForm < Form
3
+
4
+ attr_accessor :style, :submit_caption
5
+
6
+ def build(b)
7
+ case @style
8
+ when 'horizontal'
9
+ @html_class << 'form-horizontal'
10
+ when 'inline'
11
+ @html_class << 'form-inline'
12
+ end
13
+ super(b) do
14
+
15
+ b.meta_control pointer: self do
16
+ yield if block_given?
17
+ end
18
+
19
+ if @style == 'horizontal'
20
+ b.section html_class: 'form-group' do
21
+ b.section html_class: 'col-sm-offset-3 col-sm-9' do
22
+ b.submit caption: @submit_caption
23
+ end
24
+ end
25
+ else
26
+ b.submit caption: @submit_caption
27
+ end
28
+ end
29
+ end
30
+
31
+ def build_child(b, control, &block)
32
+ control.parent = self
33
+ control.style ||= 'write' if control.is_a? Attribute
34
+
35
+ if control.is_a? BooleanAttribute
36
+ build_boolean b, control, &block
37
+ elsif control.is_a? HiddenAttribute
38
+ build_hidden b, control, &block
39
+ elsif control.is_a? Attribute
40
+ build_default b, control, &block
41
+ else
42
+ super
43
+ end
44
+
45
+ b.space if @style == 'inline'
46
+ end
47
+
48
+ protected
49
+
50
+ def build_default(b, control, &block)
51
+ b.section html_class: 'form-group' do
52
+ b.section html_class: 'col-xs-3' if (control.caption == :hide or control.caption_as_placeholder) and @style == 'horizontal'
53
+ build_label(b, control)
54
+ if @style == 'horizontal'
55
+ b.section html_class: 'col-xs-9' do
56
+ b.add! control, &block
57
+ build_tooltip b, control
58
+ end
59
+ else
60
+ b.add! control, &block
61
+ build_tooltip b, control
62
+ end
63
+ end
64
+ end
65
+
66
+ def build_boolean(b, control, &block)
67
+ b.section html_class: "form-group attribute_#{control.method.to_s} collapse in" do # todo: html_class
68
+ if @style == 'horizontal'
69
+ b.section html_class: 'col-xs-9 col-xs-offset-3' do
70
+ build_checkbox b, control
71
+ end
72
+ else
73
+ build_checkbox b, control
74
+ end
75
+ end
76
+ end
77
+
78
+ def build_hidden(b, control)
79
+ b.add! control
80
+ end
81
+
82
+ def build_label(b, control)
83
+ return if control.caption == :hide
84
+ if control.caption_as_placeholder or @style == 'inline'
85
+ html_opts = { class: 'sr-only' }
86
+ elsif @style == 'horizontal'
87
+ html_opts = { class: 'col-xs-3 control-label' }
88
+ else
89
+ html_opts = {}
90
+ end
91
+ b << @form_builder.label(control.method, control.caption, html_opts)
92
+ end
93
+
94
+ def build_tooltip(b, control)
95
+ if control.tooltip != :hide
96
+ b.tooltip tooltip: control.tooltip
97
+ end
98
+ end
99
+
100
+ def build_checkbox(b, control)
101
+ b.add! control
102
+ b.space
103
+ b << @form_builder.label(control.method, control.caption)
104
+ build_tooltip(b, control)
105
+ end
106
+
107
+ end
108
+ end
@@ -0,0 +1,25 @@
1
+ module Interview
2
+ class SearchForm < Control
3
+
4
+ include NestedBuildable
5
+
6
+ attr_accessor :object
7
+
8
+ def build(b)
9
+ object = @object || find_attribute!(:object)
10
+ b << h.form_tag(h.polymorphic_path(object.class.model_name.plural, action: 'search'), method: :get, class: 'form-inline', role: 'form') do
11
+ create_nested_builder(b)
12
+ b.section do
13
+ b.section html_class: 'form-group' do
14
+ b << h.text_field_tag(:search, h.params[:search], class: 'form-control')
15
+ end
16
+ b.section html_class: 'form-group' do
17
+ b << h.submit_tag('Suchen', :name => nil, class: 'form-control btn btn-primary') # todo: 'Suchen' ändern
18
+ end
19
+ end
20
+ render_nested_builder(b)
21
+ end
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ module Interview
2
+ class Section < Control
3
+
4
+ include HasHtmlOptions
5
+
6
+ attr_accessor :style
7
+
8
+ def build(b)
9
+ style = @style || :div
10
+ b.html.tag! style.to_sym, options_to_html do
11
+ yield if block_given?
12
+ end
13
+ end
14
+
15
+ end
16
+ end
@@ -1,17 +1,16 @@
1
1
  module Interview
2
2
  class Space < Control
3
+
3
4
  attr_accessor :style
4
5
 
5
- def render
6
- html = ::Builder::XmlMarkup.new
6
+ def build(b)
7
7
  if @style and @style.to_sym == :line
8
- html.hr
8
+ b << '<hr />'
9
9
  elsif @style and @style.to_sym == :break
10
- html.br
10
+ b << '<br />'
11
11
  else
12
- html.text! ' '
12
+ b << ' '
13
13
  end
14
- return html.target!
15
14
  end
16
15
 
17
16
  end
@@ -0,0 +1,14 @@
1
+ module Interview
2
+ class Submit < Control
3
+
4
+ # todo: durch Button ersetzen?
5
+
6
+ attr_accessor :caption
7
+
8
+ def build(b)
9
+ form_builder = find_attribute! :form_builder
10
+ b << form_builder.submit(@caption, class: 'btn btn-primary')
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,27 @@
1
+ module Interview
2
+ class Tab < Control
3
+
4
+ include HasHtmlOptions
5
+
6
+ attr_accessor :caption, :active
7
+
8
+ def build(b)
9
+ html_class = @html_class.dup
10
+ html_options = @html_options.dup
11
+ html_class << 'tab-pane'
12
+ html_class << 'active' if @active
13
+ html_options[:id] = @caption if @caption
14
+ b.section html_class: html_class, html_options: html_options do
15
+ yield if block_given?
16
+ end
17
+ end
18
+
19
+ def build_caption(b)
20
+ html_class = control.active ? 'active' : ''
21
+ b.section style: 'li', html_class: html_class do
22
+ b.link caption: @caption, url: "##{@caption}", html_options: { data: { toogle: 'tab' } }
23
+ end
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,21 @@
1
+ module Interview
2
+ class TabBox < Control
3
+
4
+ def build(b)
5
+ # todo: set auto first active
6
+ b.section style: 'ul', html_class: 'nav nav-tabs tab_box' do
7
+ b.meta_control pointer: self do
8
+ yield if block_given?
9
+ end
10
+ end
11
+ b.section html_class: 'tab-content' do
12
+ yield if block_given?
13
+ end
14
+ end
15
+
16
+ def build_child(b, control, &block)
17
+ control.build_caption(b)
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,33 @@
1
+ module Interview
2
+ class Text < Control
3
+
4
+ include HasHtmlOptions
5
+
6
+ attr_accessor :text, :style, :html_safe
7
+
8
+ def build(b)
9
+ if @style
10
+ b.section style: @style, html_class: @html_class, html_options: @html_options do
11
+ build_text(b)
12
+ yield if block_given?
13
+ end
14
+ else
15
+ build_text(b)
16
+ yield if block_given?
17
+ end
18
+ end
19
+
20
+ protected
21
+
22
+ def build_text(b)
23
+ if @text
24
+ if @html_safe
25
+ b.html << @text
26
+ else
27
+ b.html.text! @text
28
+ end
29
+ end
30
+ end
31
+
32
+ end
33
+ end
@@ -3,18 +3,20 @@ module Interview
3
3
 
4
4
  attr_accessor :line_break, :cut, :rows
5
5
 
6
- def render_read
7
- return '' if value.nil?
6
+ protected
7
+
8
+ def build_read(b)
9
+ return if value.nil?
8
10
  line_break = @line_break || true
9
11
 
10
12
  value = self.value.gsub(/\n/, '<br/>') if line_break
11
13
  value = value[0..29] + '...' if @cut and value.size > 30
12
- return value.html_safe
14
+ b << value.html_safe
13
15
  end
14
16
 
15
- def render_write
17
+ def build_write(b)
16
18
  rows = @rows || 8
17
- form_builder.text_area @method, class: 'form-control', rows: rows
19
+ b << form_builder.text_area(@method, class: 'form-control', rows: rows)
18
20
  end
19
21
 
20
22
  end
@@ -0,0 +1,21 @@
1
+ module Interview
2
+ class Tooltip < Control
3
+
4
+ attr_accessor :tooltip, :style
5
+
6
+ def build(b)
7
+ tooltip = @tooltip || find_attribute(:tooltip)
8
+ if @style == 'box'
9
+ b.section html_class: 'alert alert-info' do
10
+ b.text text: tooltip
11
+ end
12
+ elsif @style == 'popover'
13
+ b.space
14
+ b.link image: 'question-sign', url: '#', html_class: 'tip', html_options: { data: { toogle: 'popover', content: tooltip } }
15
+ else
16
+ b.text text: tooltip, style: 'p', html_class: 'help-block'
17
+ end
18
+ end
19
+
20
+ end
21
+ end
@@ -3,7 +3,7 @@ module Interview
3
3
 
4
4
  attr_accessor :sortable, :icon
5
5
 
6
- def render
6
+ def build(b)
7
7
  defaults = {}
8
8
  defaults[:icon] = @icon if @icon and @icon != :polymorphic
9
9
  objects = find_attribute! :objects
@@ -25,8 +25,7 @@ module Interview
25
25
  data = { content: CGI::escapeHTML(data_content.to_json) }
26
26
  data[:sortable] = true if @sortable
27
27
 
28
- return h.content_tag(:div, '', { class: 'jstree', data: data }, false)
29
-
28
+ b.section html_class: 'jstree', html_options: { data: data }
30
29
  end
31
30
 
32
31
  end
@@ -1,6 +1,5 @@
1
1
  module Interview
2
2
  class View < Control
3
- include HasControls
4
3
 
5
4
  attr_accessor :object, :objects, :filter, :scope, :title, :auto_title_for
6
5
  attr_reader :assoc_object, :assoc_method
@@ -52,7 +51,7 @@ module Interview
52
51
  # todo: tooltip von Elternelement verwenden, falls nicht vorhanden.
53
52
  end
54
53
 
55
- def render
54
+ def build(b)
56
55
  tmp_object = @object
57
56
  tmp_objects = @objects
58
57
 
@@ -60,11 +59,11 @@ module Interview
60
59
  # if Object::const_defined?(@object.camelcase) # todo: Überdenken!
61
60
  # @object = @object.camelcase.constantize.new
62
61
  # else
63
- @assoc_object = find_attribute! :object
62
+ @assoc_object = @parent.find_attribute! :object
64
63
  @object = @object.split('.').inject(@assoc_object, :send)
65
64
  # end
66
65
  elsif @object.is_a? Proc
67
- @assoc_object = find_attribute! :object
66
+ @assoc_object = @parent.find_attribute! :object
68
67
  @object = @object.call(@assoc_object, self)
69
68
  elsif @object.is_a? Class
70
69
  @object = @object.new
@@ -98,11 +97,10 @@ module Interview
98
97
  end
99
98
  end
100
99
 
101
- html = add_parent(build_children).map { |c| c.render }.join
100
+ yield if block_given?
102
101
 
103
102
  @object = tmp_object
104
103
  @objects = tmp_objects
105
- return html
106
104
  end
107
105
 
108
106
  end
@@ -0,0 +1,4 @@
1
+ module Interview
2
+ class Engine < ::Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,15 @@
1
+ module Interview
2
+ class Handler
3
+
4
+ class_attribute :default_format
5
+ self.default_format = Mime::HTML
6
+
7
+ def self.call(template)
8
+ "builder = ::Interview::Builder.new; "+
9
+ "b = builder; "+
10
+ template.source +
11
+ "\nbuilder.render!"
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ module Interview
2
+ module HasHtmlOptions
3
+
4
+ attr_accessor :html_options, :html_class
5
+
6
+ def initialize(params={})
7
+ @html_options = {}
8
+ @html_class = []
9
+ super
10
+ end
11
+
12
+ def html_class=(html_class)
13
+ if html_class.is_a? Array
14
+ @html_class = html_class
15
+ elsif html_class.is_a? String
16
+ @html_class += html_class.split
17
+ end
18
+ end
19
+
20
+ protected
21
+
22
+ def options_to_html(html_options = @html_options, html_class = @html_class)
23
+ opts = html_options.dup
24
+ opts[:class] = html_class.join(' ') unless html_class.empty?
25
+ return opts
26
+ end
27
+
28
+ end
29
+ end