interview 0.1.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 FormErrors < Control
|
3
|
+
|
4
|
+
def build(b)
|
5
|
+
object = find_attribute!(:object)
|
6
|
+
|
7
|
+
if object.errors.any?
|
8
|
+
b.section html_class: 'alert alert-danger' do
|
9
|
+
b.text text: h.translate("errors.template.header", count: object.errors.count, model: object.class.model_name.human), style: 'h4'
|
10
|
+
b.section style: 'ul' do
|
11
|
+
object.errors.full_messages.each do |msg|
|
12
|
+
b.text text: msg, style: 'li'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Interview
|
2
|
+
class Glyphicon < Control
|
3
|
+
|
4
|
+
include HasHtmlOptions
|
5
|
+
|
6
|
+
attr_accessor :image
|
7
|
+
|
8
|
+
def build(b)
|
9
|
+
html_class = @html_class
|
10
|
+
if @image == 'caret'
|
11
|
+
html_class << 'caret'
|
12
|
+
else
|
13
|
+
html_class += ["glyphicon", "glyphicon-#{@image}"]
|
14
|
+
end
|
15
|
+
b.section style: 'span', html_class: html_class, html_options: @html_options
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Interview
|
2
|
+
class Grid < Control
|
3
|
+
|
4
|
+
attr_accessor :objects, :sortable
|
5
|
+
attr_reader :object
|
6
|
+
|
7
|
+
def build(b)
|
8
|
+
objects = @objects || find_attribute!(:objects)
|
9
|
+
@object = find_attribute!(:object)
|
10
|
+
|
11
|
+
sortable_id = "sortable_#{@object.class.model_name.plural}" if @sortable
|
12
|
+
b.section style: 'table', html_class: 'table' do
|
13
|
+
b.section style: 'thead' do
|
14
|
+
b.section style: 'tr' do
|
15
|
+
b.section style: 'th' if @sortable
|
16
|
+
@build_captions = true
|
17
|
+
b.meta_control pointer: self do
|
18
|
+
yield if block_given?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
html_opts = {}
|
23
|
+
html_opts[:id] = sortable_id if @sortable
|
24
|
+
b.section style: 'tbody', html_options: html_opts do
|
25
|
+
objects.each do |object|
|
26
|
+
@object = object
|
27
|
+
html_opts = {}
|
28
|
+
html_opts[:id] = "#{sortable_id}_#{object.id}" if @sortable
|
29
|
+
b.section style: 'tr', htl_options: html_opts do
|
30
|
+
if @sortable
|
31
|
+
b.section style: 'td' do
|
32
|
+
b.glyphicon style: 'resize-vertical', html_class: 'handle'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
@build_captions = false
|
36
|
+
b.meta_control pointer: self do
|
37
|
+
yield if block_given?
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
if objects.empty?
|
44
|
+
b.text text: "Keine #{@object.class.human_name(count: 2)} vorhanden.", style: 'p',
|
45
|
+
html_class: 'text-center text-muted'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def build_child(b, control, &block)
|
50
|
+
if @build_captions
|
51
|
+
b.section style: 'th' do
|
52
|
+
control.build_caption(b)
|
53
|
+
end
|
54
|
+
else
|
55
|
+
b.section style: 'td' do
|
56
|
+
super
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Interview
|
2
|
+
class HtmlHeaders < Control
|
3
|
+
|
4
|
+
def build(b)
|
5
|
+
b << h.stylesheet_link_tag("application", media: "all", "data-turbolinks-track" => true)
|
6
|
+
b << h.javascript_include_tag("application", "data-turbolinks-track" => true)
|
7
|
+
b << h.csrf_meta_tags
|
8
|
+
b.section style: 'meta', html_options: { name: 'viewport', content: "width=device-width, initial-scale=1, maximum-scale=1" }
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
@@ -1,18 +1,22 @@
|
|
1
1
|
module Interview
|
2
2
|
class HtmlTextAttribute < Attribute
|
3
3
|
|
4
|
+
# todo: in eigenes gem auslagern?
|
5
|
+
|
4
6
|
attr_accessor :plain_text, :cut
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
+
protected
|
9
|
+
|
10
|
+
def build_read(b)
|
11
|
+
return if value.nil?
|
8
12
|
val = value
|
9
13
|
val.gsub! /<.+?>/, ' ' if @plain_text
|
10
14
|
val = val[0..29] + '...' if @cut and val.size > 30
|
11
|
-
|
15
|
+
b << val.html_safe
|
12
16
|
end
|
13
17
|
|
14
|
-
def
|
15
|
-
form_builder.cktext_area
|
18
|
+
def build_write(b)
|
19
|
+
b << form_builder.cktext_area(@method, class: 'form-control')
|
16
20
|
end
|
17
21
|
|
18
22
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Interview
|
2
|
+
class ImageAttribute < Attribute
|
3
|
+
|
4
|
+
# - Modul UploadBuffer muss für write vorhanden sein
|
5
|
+
# - json ansicht auf bild muss vorhanden sein
|
6
|
+
|
7
|
+
# todo: in eigenes gem auslagern?
|
8
|
+
|
9
|
+
include HasHtmlOptions
|
10
|
+
|
11
|
+
attr_accessor :image_style, :hide_if_not_exists, :object
|
12
|
+
|
13
|
+
protected
|
14
|
+
|
15
|
+
def build_read(b)
|
16
|
+
image_style = @image_style || :thumb
|
17
|
+
html_class = @html_class
|
18
|
+
html_class << "image_#{image_style}"
|
19
|
+
|
20
|
+
return if value.nil? and @hide_if_not_exists
|
21
|
+
|
22
|
+
b.section html_class: html_class, html_options: @html_options do
|
23
|
+
if value
|
24
|
+
b << h.image_tag(value.url(image_style), class: 'image img-responsive')
|
25
|
+
else
|
26
|
+
b << h.image_tag('missing_thumb.png', class: 'image img-responsive')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def build_write(b)
|
32
|
+
image_style = @image_style || :thumb
|
33
|
+
|
34
|
+
b.section html_class: 'image_attribute_container' do
|
35
|
+
unless value.nil? and @hide_if_not_exists
|
36
|
+
b.section html_class: 'inline-block' do
|
37
|
+
b << h.image_tag(value.url(image_style), class: 'image img-responsive')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
b.section html_class: 'inline-block' do
|
42
|
+
b.section html_class: "clearfix" do
|
43
|
+
b.section style: 'span', html_class: "btn btn-default fileinput-button" do
|
44
|
+
b.text text: "Bild hochladen", style: 'span' # todo
|
45
|
+
b << h.file_field_tag("upload_buffer[attachment]", class: 'upload_image',
|
46
|
+
data: {url: "/upload_buffers.json", type: 'POST'})
|
47
|
+
end
|
48
|
+
end
|
49
|
+
b.progress_bar hidden: true
|
50
|
+
b << form_builder.hidden_field(:upload_buffer_id, class: 'upload_buffer_id')
|
51
|
+
|
52
|
+
# if attachment.exists?
|
53
|
+
# b << form_builder.check_box("destroy_#{@method}")
|
54
|
+
# b.text text: ' Datei löschen'
|
55
|
+
# end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Interview
|
2
|
+
class ImageGalleryAttribute < Attribute
|
3
|
+
|
4
|
+
attr_accessor :object, :submethod, :image_style, :light_box_image_style
|
5
|
+
|
6
|
+
protected
|
7
|
+
|
8
|
+
def build_read(b)
|
9
|
+
submethod = @submethod || 'attachment'
|
10
|
+
image_style = @image_style || :thumb
|
11
|
+
images = value
|
12
|
+
|
13
|
+
b.section html_class: 'image-gallery' do
|
14
|
+
images.each do |image|
|
15
|
+
b.link url: image.send(submethod).url(@light_box_image_style), html_class: 'img-link' do
|
16
|
+
b << h.image_tag(image.send(submethod).url(image_style), class: 'img-thumb')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def build_write(b)
|
23
|
+
object = @object || find_attribute(:object)
|
24
|
+
submethod = @submethod || 'attachment'
|
25
|
+
image_style = @image_style || :thumb
|
26
|
+
images = object.send @method
|
27
|
+
model = images.klass.model_name.singular
|
28
|
+
|
29
|
+
b.section html_class: 'image-upload-group' do
|
30
|
+
|
31
|
+
b << form_builder.hidden_field("#{@method.singularize}_ids", class: 'image-ids')
|
32
|
+
|
33
|
+
# render_gallery(html, images, submethod, image_style, @light_box_image_style)
|
34
|
+
#
|
35
|
+
# light_box_image_url = @light_box_image_style ? "#{@light_box_image_style}_url" : 'url'
|
36
|
+
# html.script id: 'image-thumb-script', type: 'text/x-tmpl' do
|
37
|
+
# html.a href: "{%=o.#{light_box_image_url}%}", class: 'img-link' do
|
38
|
+
# html.img class: 'img-thumb', src: "{%=o.thumb_url%}"
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
|
42
|
+
b.section html_class: "clearfix" do
|
43
|
+
b.section style: 'span', html_class: "btn btn-default fileinput-button" do
|
44
|
+
b.text text: "Bilder hinzufügen", style: 'span' # todo
|
45
|
+
b << h.file_field_tag("#{model}[#{submethod}]", class: 'multiple-image-upload', multiple: true,
|
46
|
+
data: {url: "/#{model.pluralize}.json", type: 'POST'})
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
b.section class: 'upload-progress' do
|
51
|
+
end
|
52
|
+
|
53
|
+
b.section style: 'script', html_options: { id: 'upload-progress-script', type: 'text/x-tmpl' } do
|
54
|
+
b.section do
|
55
|
+
b.section html_class: 'inline-block' do
|
56
|
+
b << h.image_tag('missing_180x180.png', class: 'img-thumb')
|
57
|
+
end
|
58
|
+
b.section html_class: 'inline-block' do
|
59
|
+
b.text text: "{%=o.name%}"
|
60
|
+
b.section html_class: 'progress' do
|
61
|
+
b.section html_class: 'progress-bar bar', html_options: { style: 'width: 0%' }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
return html.target!
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Interview
|
2
|
+
class ImageLightBox < Control
|
3
|
+
|
4
|
+
def build(b)
|
5
|
+
b.section html_class: 'blueimp-gallery', html_options: { id: 'blueimp-gallery' } do
|
6
|
+
b.section html_class: "slides"
|
7
|
+
b.section html_class: "title"
|
8
|
+
b.text text: '‹', style: 'a', html_class: "prev"
|
9
|
+
b.text text: '›', style: 'a', html_class: "next"
|
10
|
+
b.text text: '×', style: 'a', html_class: "close"
|
11
|
+
b.text style: 'a', html_class: "play-pause"
|
12
|
+
b.section style: 'ol', html_class: "indicator"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
File without changes
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Interview
|
2
|
+
class Link < Control
|
3
|
+
|
4
|
+
include HasHtmlOptions, NestedBuildable
|
5
|
+
|
6
|
+
attr_accessor :image, :caption, :style, :active, :hint,
|
7
|
+
:url, :object, :assoc_object, :action, :options, :http_method,
|
8
|
+
:nested_resource, :new_site
|
9
|
+
attr_reader :url_params
|
10
|
+
|
11
|
+
def initialize(params={})
|
12
|
+
@options = {}
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def build(b)
|
17
|
+
html_options = @html_options.dup
|
18
|
+
html_class = @html_class.dup
|
19
|
+
|
20
|
+
url = get_url
|
21
|
+
|
22
|
+
if @action == 'destroy'
|
23
|
+
html_options[:method] = :delete
|
24
|
+
html_options[:data] = {} unless html_options[:data]
|
25
|
+
html_options[:data][:confim] = 'Are you sure?' # todo
|
26
|
+
end
|
27
|
+
|
28
|
+
if @http_method
|
29
|
+
html_options[:method] = @http_method.to_sym
|
30
|
+
end
|
31
|
+
|
32
|
+
if @hint
|
33
|
+
html_options[:title] = @hint
|
34
|
+
end
|
35
|
+
|
36
|
+
if @style == 'button'
|
37
|
+
html_class += %w(btn btn-default)
|
38
|
+
elsif @style == 'primary_button'
|
39
|
+
html_class += %w(btn btn-primary)
|
40
|
+
end
|
41
|
+
|
42
|
+
if @new_site
|
43
|
+
html_options[:target] = 'blank'
|
44
|
+
end
|
45
|
+
|
46
|
+
add_list_item(b) do
|
47
|
+
b << h.link_to(url, options_to_html(html_options, html_class)) do
|
48
|
+
create_nested_builder(b)
|
49
|
+
b.glyphicon image: @image if @image
|
50
|
+
b.space if @image and @caption
|
51
|
+
b.text text: @caption if @caption
|
52
|
+
yield if block_given?
|
53
|
+
render_nested_builder(b)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
|
60
|
+
def get_url
|
61
|
+
options = @options.dup
|
62
|
+
if @url
|
63
|
+
url = @url
|
64
|
+
url = "/#{url}" if url[0..3] != 'http' and url[0] != '/' and url[0] != '#'
|
65
|
+
else
|
66
|
+
options[:action] = @action if @action and not %w(index show create update destroy).include? @action
|
67
|
+
object = @object || find_attribute!(:object)
|
68
|
+
if @nested_resource or @assoc_object
|
69
|
+
assoc_object = @assoc_object || find_attribute!(:assoc_object)
|
70
|
+
url = h.polymorphic_path [assoc_object, object], options
|
71
|
+
else
|
72
|
+
url = h.polymorphic_path object, options
|
73
|
+
end
|
74
|
+
end
|
75
|
+
return url
|
76
|
+
end
|
77
|
+
|
78
|
+
def add_list_item(b) # todo: wird das gebraucht?
|
79
|
+
if @style == 'list'
|
80
|
+
li_class = @active ? 'active' : ''
|
81
|
+
b.section style: 'li', html_class: li_class do
|
82
|
+
yield
|
83
|
+
end
|
84
|
+
else
|
85
|
+
yield
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|