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.
- checksums.yaml +4 -4
- data/interview.gemspec +1 -0
- data/lib/{generators/interview/install/templates → assets/javascripts}/interview.js.coffee +17 -25
- data/lib/{generators/interview/install/templates/bootstrap_interview.css.scss → assets/stylesheets/interview.css.scss} +3 -2
- data/lib/generators/interview/install/install_generator.rb +0 -2
- data/lib/generators/interview/install/templates/interview.rb +1 -1
- data/lib/interview.rb +65 -51
- data/lib/interview/association_methods.rb +2 -0
- data/lib/interview/builder.rb +32 -24
- data/lib/interview/control.rb +25 -7
- data/lib/interview/controls/actionbar.rb +41 -0
- data/lib/interview/controls/alert.rb +15 -0
- data/lib/interview/{association_attribute.rb → controls/association_attribute.rb} +8 -8
- data/lib/interview/{association_list_attribute.rb → controls/association_list_attribute.rb} +10 -9
- data/lib/interview/controls/attribute.rb +80 -0
- data/lib/interview/controls/auto_attribute.rb +16 -0
- data/lib/interview/controls/boolean_attribute.rb +20 -0
- data/lib/interview/controls/breadcrumbs.rb +15 -0
- data/lib/interview/controls/button.rb +25 -0
- data/lib/interview/controls/caret.rb +9 -0
- data/lib/interview/controls/collapse_container.rb +16 -0
- data/lib/interview/controls/container.rb +5 -0
- data/lib/interview/controls/container_attribute.rb +28 -0
- data/lib/interview/controls/date_attribute.rb +23 -0
- data/lib/interview/controls/datetime_attribute.rb +22 -0
- data/lib/interview/controls/decimal_attribute.rb +12 -0
- data/lib/interview/controls/dropdown.rb +35 -0
- data/lib/interview/controls/form.rb +35 -0
- data/lib/interview/controls/form_errors.rb +20 -0
- data/lib/interview/controls/glyphicon.rb +19 -0
- data/lib/interview/controls/grid.rb +62 -0
- data/lib/interview/controls/hidden_attribute.rb +11 -0
- data/lib/interview/controls/horizontal_form_container.rb +13 -0
- data/lib/interview/controls/html_control.rb +13 -0
- data/lib/interview/controls/html_doctype.rb +9 -0
- data/lib/interview/controls/html_headers.rb +12 -0
- data/lib/interview/{html_text_attribute.rb → controls/html_text_attribute.rb} +9 -5
- data/lib/interview/controls/image_attribute.rb +61 -0
- data/lib/interview/controls/image_gallery_attribute.rb +72 -0
- data/lib/interview/controls/image_light_box.rb +17 -0
- data/lib/interview/{integer_attribute.rb → controls/integer_attribute.rb} +0 -0
- data/lib/interview/controls/link.rb +90 -0
- data/lib/interview/controls/list.rb +20 -0
- data/lib/interview/controls/media_object.rb +37 -0
- data/lib/interview/controls/navigation.rb +11 -0
- data/lib/interview/controls/navigation_item.rb +33 -0
- data/lib/interview/controls/nested_form.rb +45 -0
- data/lib/interview/controls/nested_form_add_images.rb +15 -0
- data/lib/interview/controls/nested_form_add_link.rb +29 -0
- data/lib/interview/controls/nested_form_remove_link.rb +12 -0
- data/lib/interview/{option_attribute.rb → controls/option_attribute.rb} +19 -19
- data/lib/interview/controls/pagination.rb +12 -0
- data/lib/interview/controls/panel.rb +13 -0
- data/lib/interview/{polymorphic_add_link.rb → controls/polymorphic_add_link.rb} +1 -1
- data/lib/interview/controls/polymorphic_nested_form.rb +17 -0
- data/lib/interview/{nested_form_add_link.rb → controls/polymorphic_nested_form_add_link.rb} +12 -28
- data/lib/interview/controls/progress_bar.rb +18 -0
- data/lib/interview/controls/scaffold_card.rb +27 -0
- data/lib/interview/controls/scaffold_form.rb +108 -0
- data/lib/interview/controls/search_form.rb +25 -0
- data/lib/interview/controls/section.rb +16 -0
- data/lib/interview/{space.rb → controls/space.rb} +5 -6
- data/lib/interview/{string_attribute.rb → controls/string_attribute.rb} +0 -0
- data/lib/interview/controls/submit.rb +14 -0
- data/lib/interview/controls/tab.rb +27 -0
- data/lib/interview/controls/tab_box.rb +21 -0
- data/lib/interview/controls/text.rb +33 -0
- data/lib/interview/{text_attribute.rb → controls/text_attribute.rb} +7 -5
- data/lib/interview/controls/tooltip.rb +21 -0
- data/lib/interview/{tree.rb → controls/tree.rb} +2 -3
- data/lib/interview/{view.rb → controls/view.rb} +4 -6
- data/lib/interview/engine.rb +4 -0
- data/lib/interview/handler.rb +15 -0
- data/lib/interview/has_html_options.rb +29 -0
- data/lib/interview/meta_control.rb +18 -0
- data/lib/interview/nested_buildable.rb +17 -0
- data/lib/interview/version.rb +1 -1
- metadata +84 -54
- data/lib/interview/actionbar.rb +0 -39
- data/lib/interview/attribute.rb +0 -166
- data/lib/interview/boolean_attribute.rb +0 -59
- data/lib/interview/breadcrumbs.rb +0 -21
- data/lib/interview/button.rb +0 -29
- data/lib/interview/collapse_container.rb +0 -31
- data/lib/interview/condition_container.rb +0 -19
- data/lib/interview/container.rb +0 -13
- data/lib/interview/container_attribute.rb +0 -30
- data/lib/interview/date_attribute.rb +0 -20
- data/lib/interview/datetime_attribute.rb +0 -20
- data/lib/interview/decimal_attribute.rb +0 -10
- data/lib/interview/dropdown.rb +0 -39
- data/lib/interview/form.rb +0 -64
- data/lib/interview/form_errors.rb +0 -22
- data/lib/interview/grid.rb +0 -54
- data/lib/interview/has_controls.rb +0 -40
- data/lib/interview/hidden_attribute.rb +0 -15
- data/lib/interview/html_control.rb +0 -21
- data/lib/interview/image_attribute.rb +0 -59
- data/lib/interview/image_gallery_attribute.rb +0 -79
- data/lib/interview/image_light_box.rb +0 -19
- data/lib/interview/link.rb +0 -134
- data/lib/interview/list.rb +0 -26
- data/lib/interview/media_object.rb +0 -27
- data/lib/interview/navigation.rb +0 -55
- data/lib/interview/navigation_item.rb +0 -41
- data/lib/interview/navigation_item_old.rb +0 -26
- data/lib/interview/nested_form.rb +0 -66
- data/lib/interview/nested_form_add_images.rb +0 -33
- data/lib/interview/nested_form_remove_link.rb +0 -28
- data/lib/interview/panel.rb +0 -18
- data/lib/interview/progress_bar.rb +0 -25
- data/lib/interview/search_form.rb +0 -21
- data/lib/interview/tab.rb +0 -21
- data/lib/interview/tab_box.rb +0 -30
- data/lib/interview/text.rb +0 -45
- data/lib/interview/tooltip.rb +0 -38
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Interview
|
|
2
|
+
class List < Control
|
|
3
|
+
|
|
4
|
+
attr_accessor :object, :objects, :empty_message
|
|
5
|
+
|
|
6
|
+
def build(b)
|
|
7
|
+
objects = @objects || find_attribute!(:objects)
|
|
8
|
+
objects.each do |object|
|
|
9
|
+
@object = object
|
|
10
|
+
yield if block_given?
|
|
11
|
+
end
|
|
12
|
+
if objects.empty? and @empty_message != :hide
|
|
13
|
+
object = @object || find_attribute!(:object)
|
|
14
|
+
empty_message = @empty_message || "Keine #{object.class.human_name(count: 2)} vorhanden." # todo
|
|
15
|
+
b.text text: empty_message, style: 'p', html_class: 'text-center text-muted'
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Interview
|
|
2
|
+
class MediaObject < Control
|
|
3
|
+
|
|
4
|
+
def build(b)
|
|
5
|
+
b.section html_class: 'media' do
|
|
6
|
+
b.meta_control pointer: self do
|
|
7
|
+
@child_no = 0
|
|
8
|
+
yield if block_given?
|
|
9
|
+
end
|
|
10
|
+
b << '</div>' if @child_no >= 2
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def build_child(b, control, &block)
|
|
15
|
+
@child_no += 1
|
|
16
|
+
if @child_no == 1
|
|
17
|
+
if control.respond_to? :html_class
|
|
18
|
+
control.html_class = 'pull-left'
|
|
19
|
+
super
|
|
20
|
+
else
|
|
21
|
+
b.section html_class: 'pull-left' do
|
|
22
|
+
super
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
elsif @child_no == 2
|
|
27
|
+
b << '<div class="media-body">'
|
|
28
|
+
control.html_class = 'media-heading' if control.respond_to? :html_class
|
|
29
|
+
super
|
|
30
|
+
|
|
31
|
+
else
|
|
32
|
+
super
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Interview
|
|
2
|
+
class NavigationItem < Link
|
|
3
|
+
|
|
4
|
+
attr_accessor :active, :level, :badge_formula
|
|
5
|
+
|
|
6
|
+
def build(b)
|
|
7
|
+
set_level
|
|
8
|
+
html_class = ["level#{@level}"]
|
|
9
|
+
html_class << 'active' if @active
|
|
10
|
+
b.section style: 'li', html_class: html_class do
|
|
11
|
+
super(b) do
|
|
12
|
+
badge = @badge_formula.call if @badge_formula
|
|
13
|
+
unless badge.nil? or badge == 0 or badge == ''
|
|
14
|
+
b.text text: badge.to_s, style: 'span', html_class: 'badge pull-right'
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
yield if block_given?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
protected
|
|
22
|
+
|
|
23
|
+
def set_level
|
|
24
|
+
return if @level
|
|
25
|
+
if level = find_attribute(:level)
|
|
26
|
+
@level = level + 1
|
|
27
|
+
else
|
|
28
|
+
@level = 0
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Interview
|
|
2
|
+
class NestedForm < Control
|
|
3
|
+
|
|
4
|
+
include NestedBuildable
|
|
5
|
+
|
|
6
|
+
attr_accessor :image_based # todo: move to an other control?
|
|
7
|
+
attr_reader :form_builder, :object
|
|
8
|
+
|
|
9
|
+
def build(b, &block)
|
|
10
|
+
assoc_form_builder = find_attribute! :form_builder
|
|
11
|
+
assoc_method = find_attribute! :assoc_method
|
|
12
|
+
|
|
13
|
+
b.section html_class: 'nested_form_container' do # todo: class überarbeiten
|
|
14
|
+
if @image_based
|
|
15
|
+
b.nested_form_add_images
|
|
16
|
+
end
|
|
17
|
+
b << assoc_form_builder.fields_for(assoc_method.to_sym) do |form_builder|
|
|
18
|
+
render_nested_form(b, form_builder, &block)
|
|
19
|
+
end
|
|
20
|
+
b.section style: 'script', html_class: 'nested_form_script', html_options: { type: 'text/x-tmpl' } do
|
|
21
|
+
new_object = assoc_form_builder.object.association(assoc_method.to_sym).build # todo: polymorphic add link
|
|
22
|
+
b << assoc_form_builder.fields_for(assoc_method.to_sym, new_object, :child_index => "${index}") do |form_builder|
|
|
23
|
+
render_nested_form(b, form_builder, &block)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def render_nested_form(b, form_builder)
|
|
30
|
+
create_nested_builder(b)
|
|
31
|
+
@form_builder = form_builder
|
|
32
|
+
@object = form_builder.object
|
|
33
|
+
b.section html_class: 'nested_form collapse in' do
|
|
34
|
+
yield if block_given?
|
|
35
|
+
b << form_builder.hidden_field(:id)
|
|
36
|
+
b << form_builder.hidden_field(:_destroy, class: 'nested_form_destroy')
|
|
37
|
+
if @image_based
|
|
38
|
+
b << form_builder.hidden_field(:upload_buffer_id, class: 'upload_buffer_id')
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
return render_nested_builder(b)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Interview
|
|
2
|
+
class NestedFormAddImages < Control
|
|
3
|
+
|
|
4
|
+
def build(b)
|
|
5
|
+
b.section html_class: "clearfix" do
|
|
6
|
+
b.section style: 'span', html_class: "btn btn-default fileinput-button" do
|
|
7
|
+
b.text text: "Bilder hinzufügen", style: 'span' # todo
|
|
8
|
+
b << h.file_field_tag("upload_buffer[attachment]", class: 'nested_form_add_images',
|
|
9
|
+
multiple: true, data: {url: "/upload_buffers.json", type: 'POST'})
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Interview
|
|
2
|
+
class NestedFormAddLink < Control
|
|
3
|
+
|
|
4
|
+
def build(b)
|
|
5
|
+
form_builder = find_attribute! :form_builder
|
|
6
|
+
assoc_method = find_attribute!(:assoc_method).to_sym
|
|
7
|
+
text = h.t('views.nested_form_add', association: find_attribute!(:singular_title))
|
|
8
|
+
html = render_form(b, form_builder, assoc_method)
|
|
9
|
+
b.link capion: text, html_options: { href: '#', class: 'nested_form_add_link', data: { content: CGI::escapeHTML(html) } }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
protected
|
|
13
|
+
|
|
14
|
+
def render_form(b, form_builder, assoc_method, new_object=nil)
|
|
15
|
+
new_object ||= form_builder.object.association(assoc_method.to_sym).build
|
|
16
|
+
new_object.assign_attributes(new_object.class.defaults)
|
|
17
|
+
if new_object_assoc = new_object.class.reflect_on_all_associations.find { |a|
|
|
18
|
+
a.foreign_key == form_builder.object.association(assoc_method.to_sym).reflection.foreign_key }
|
|
19
|
+
new_object.association(new_object_assoc.name).target ||= form_builder.object
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
nested_form = find_attribute! :nested_form
|
|
23
|
+
return form_builder.fields_for(assoc_method, new_object, :child_index => "new_association") do |builder|
|
|
24
|
+
nested_form.render_nested_form(b, builder)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module Interview
|
|
2
|
+
class NestedFormRemoveLink < Control
|
|
3
|
+
|
|
4
|
+
def build(b)
|
|
5
|
+
assoc_object = find_attribute! :assoc_object
|
|
6
|
+
assoc_method = find_attribute!(:assoc_method).to_s
|
|
7
|
+
text = h.t('views.nested_form_remove', association: assoc_object.class.human_attribute_name(assoc_method.singularize)) # todo: in view auslagern
|
|
8
|
+
b.link caption: text, url: '#', class: 'nested_form_remove_link'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -3,48 +3,48 @@ module Interview
|
|
|
3
3
|
|
|
4
4
|
attr_accessor :html_class, :use_radios
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
protected
|
|
7
|
+
|
|
8
|
+
def build_read(b)
|
|
9
|
+
return if value.nil? or value == ''
|
|
10
|
+
object = @object || find_attribute!(:object)
|
|
9
11
|
if object.class.superclass.name == 'ActiveRecord::Base'
|
|
10
12
|
model = object.class.name.underscore
|
|
11
13
|
else
|
|
12
14
|
model = object.class.superclass.name.underscore
|
|
13
15
|
end
|
|
14
|
-
|
|
16
|
+
b << h.t("activerecord.options.#{model}.#{@method}.#{value}")
|
|
15
17
|
end
|
|
16
18
|
|
|
17
|
-
def
|
|
19
|
+
def build_write(b)
|
|
18
20
|
if @use_radios
|
|
19
|
-
|
|
21
|
+
build_radios(b)
|
|
20
22
|
else
|
|
21
|
-
|
|
23
|
+
build_select(b)
|
|
22
24
|
end
|
|
23
25
|
end
|
|
24
26
|
|
|
25
|
-
def
|
|
26
|
-
object = find_attribute!(:object)
|
|
27
|
+
def build_select(b)
|
|
28
|
+
object = @object || find_attribute!(:object)
|
|
27
29
|
options = [[h.t('helpers.select.prompt'), nil]]
|
|
28
30
|
options += get_options(object)
|
|
29
31
|
|
|
30
32
|
html_class = 'form-control'
|
|
31
33
|
html_class += " #{@html_class}" if @html_class
|
|
32
|
-
form_builder.select
|
|
34
|
+
b << form_builder.select(@method, options, {}, {class: html_class})
|
|
33
35
|
end
|
|
34
36
|
|
|
35
|
-
def
|
|
36
|
-
object = find_attribute!(:object)
|
|
37
|
-
html = ::Builder::XmlMarkup.new
|
|
37
|
+
def build_radios(b)
|
|
38
|
+
object = @object || find_attribute!(:object)
|
|
38
39
|
get_options(object).each do |option|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
b.section html_class: 'radio' do
|
|
41
|
+
b.section style: 'label' do
|
|
42
|
+
b << form_builder.radio_button(@method, option[1])
|
|
43
|
+
b.space
|
|
44
|
+
b.text text: option[0]
|
|
44
45
|
end
|
|
45
46
|
end
|
|
46
47
|
end
|
|
47
|
-
return html.target!
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
def get_options(object)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Interview
|
|
2
|
+
class PolymorphicNestedForm < NestedForm
|
|
3
|
+
|
|
4
|
+
def render_nested_form(b, form_builder)
|
|
5
|
+
create_nested_builder(b)
|
|
6
|
+
object = form_builder.object
|
|
7
|
+
if klass = "#{object.class.name}NestedForm".safe_constantize
|
|
8
|
+
nested_form = klass.new(parent: self)
|
|
9
|
+
b << nested_form.render_nested_form(b, form_builder, &block)
|
|
10
|
+
else
|
|
11
|
+
super
|
|
12
|
+
end
|
|
13
|
+
return render_nested_builder(b)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -1,37 +1,23 @@
|
|
|
1
1
|
module Interview
|
|
2
|
-
class
|
|
2
|
+
class PolymorphicNestedFormAddLink < Control # todo
|
|
3
3
|
|
|
4
|
-
attr_accessor :
|
|
4
|
+
attr_accessor :polymorphic_classes # todo
|
|
5
5
|
|
|
6
|
-
def
|
|
7
|
-
if @style and @style.to_sym == :horizontal_form
|
|
8
|
-
html = ::Builder::XmlMarkup.new # todo: in eigenes Objekt auslagern?
|
|
9
|
-
html.div class: 'row' do
|
|
10
|
-
html.div class: 'col-xs-9 col-xs-offset-3' do
|
|
11
|
-
html << render_link
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
return html.target!
|
|
15
|
-
else
|
|
16
|
-
return render_link
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def render_link
|
|
6
|
+
def build(b)
|
|
21
7
|
form_builder = find_attribute! :form_builder
|
|
22
8
|
assoc_method = find_attribute!(:assoc_method).to_sym
|
|
23
9
|
if @polymorphic_classes
|
|
24
|
-
|
|
10
|
+
build_polymorphic_link(b, form_builder, assoc_method)
|
|
25
11
|
else
|
|
26
|
-
html = render_form(form_builder, assoc_method)
|
|
27
12
|
text = h.t('views.nested_form_add', association: find_attribute!(:singular_title))
|
|
28
|
-
|
|
13
|
+
html = render_form(form_builder, assoc_method)
|
|
14
|
+
b.link capion: text, html_options: { href: '#', class: 'nested_form_add_link', data: { content: CGI::escapeHTML(html) } }
|
|
29
15
|
end
|
|
30
16
|
end
|
|
31
17
|
|
|
32
18
|
protected
|
|
33
19
|
|
|
34
|
-
def
|
|
20
|
+
def build_polymorphic_link(b, form_builder, assoc_method)
|
|
35
21
|
poly_classes = @polymorphic_classes.map do |poly_class|
|
|
36
22
|
poly_class.is_a?(String) ? poly_class.camelcase.constantize : poly_class
|
|
37
23
|
end
|
|
@@ -48,14 +34,12 @@ module Interview
|
|
|
48
34
|
data_content[poly_class.model_name.singular] = html
|
|
49
35
|
end
|
|
50
36
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
data: { content: CGI::escapeHTML(data_content.to_json) } }, false)
|
|
37
|
+
b.section do
|
|
38
|
+
b << h.select_tag("add_link_class", h.options_for_select(select_options), class: 'form-control', style: 'display: inline; width: auto;')
|
|
39
|
+
b.space
|
|
40
|
+
b << h.content_tag(:a, h.t('views.add'), {href: '#', class: 'nested_form_polymorphic_add_link btn btn-default',
|
|
41
|
+
data: { content: CGI::escapeHTML(data_content.to_json) } }, false)
|
|
57
42
|
end
|
|
58
|
-
return html.target!
|
|
59
43
|
end
|
|
60
44
|
|
|
61
45
|
def render_form(form_builder, assoc_method, new_object=nil)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Interview
|
|
2
|
+
class ProgressBar < Control
|
|
3
|
+
|
|
4
|
+
include HasHtmlOptions
|
|
5
|
+
|
|
6
|
+
attr_accessor :hidden # todo: löschen?
|
|
7
|
+
|
|
8
|
+
def build(b)
|
|
9
|
+
html_class = @html_class
|
|
10
|
+
html_class << 'progress'
|
|
11
|
+
html_class << 'collapse' if @hidden
|
|
12
|
+
b.section html_class: html_class, html_options: @html_options do
|
|
13
|
+
b.section html_class: 'progress-bar bar', html_options: { style: 'width: 0%' }
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Interview
|
|
2
|
+
class ScaffoldCard < Control
|
|
3
|
+
|
|
4
|
+
def build(b)
|
|
5
|
+
b.meta_control pointer: self do
|
|
6
|
+
yield if block_given?
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def build_child(b, control, &block)
|
|
11
|
+
control.parent = self
|
|
12
|
+
b.section html_class: 'row' do
|
|
13
|
+
b.section style: 'p', html_class: 'col-xs-3' do
|
|
14
|
+
b.text text: control.caption, style: 'b' unless control.caption == :hide
|
|
15
|
+
if control.tooltip != :hide
|
|
16
|
+
b.tooltip tooltip: control.tooltip, style: :popover
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
b.section style: 'p', html_class: 'col-xs-9' do
|
|
20
|
+
control.style = 'read' unless control.style
|
|
21
|
+
super
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|