scaffold_markup 0.0.1

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 (47) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +4 -0
  3. data/README.md +41 -0
  4. data/Rakefile +2 -0
  5. data/app/helpers/scaffold_markup_helper.rb +15 -0
  6. data/app/views/application/_form.html.haml +5 -0
  7. data/app/views/application/_form_actions.html.haml +3 -0
  8. data/app/views/application/_form_attributes.html.haml +5 -0
  9. data/app/views/application/_index_actions.html.haml +2 -0
  10. data/app/views/application/_index_table.html.haml +3 -0
  11. data/app/views/application/_page_title.html.haml +2 -0
  12. data/app/views/application/_show_actions.html.haml +3 -0
  13. data/app/views/application/_show_attributes.html.haml +2 -0
  14. data/app/views/application/edit.html.haml +3 -0
  15. data/app/views/application/index.html.haml +4 -0
  16. data/app/views/application/new.html.haml +3 -0
  17. data/app/views/application/show.html.haml +7 -0
  18. data/app/views/kaminari/twitter_bootstrap/_first_page.html.haml +15 -0
  19. data/app/views/kaminari/twitter_bootstrap/_gap.html.haml +9 -0
  20. data/app/views/kaminari/twitter_bootstrap/_last_page.html.haml +13 -0
  21. data/app/views/kaminari/twitter_bootstrap/_next_page.html.haml +13 -0
  22. data/app/views/kaminari/twitter_bootstrap/_page.html.haml +15 -0
  23. data/app/views/kaminari/twitter_bootstrap/_paginator.html.haml +20 -0
  24. data/app/views/kaminari/twitter_bootstrap/_prev_page.html.haml +13 -0
  25. data/lib/scaffold_markup.rb +21 -0
  26. data/lib/scaffold_markup/builders/base_builder.rb +22 -0
  27. data/lib/scaffold_markup/builders/form_builder.rb +77 -0
  28. data/lib/scaffold_markup/builders/nav_bar_builder.rb +26 -0
  29. data/lib/scaffold_markup/builders/nav_container_builder.rb +25 -0
  30. data/lib/scaffold_markup/builders/page_builder.rb +63 -0
  31. data/lib/scaffold_markup/controllers/base.rb +70 -0
  32. data/lib/scaffold_markup/engine.rb +4 -0
  33. data/lib/scaffold_markup/extensions/active_model_extension.rb +6 -0
  34. data/lib/scaffold_markup/extensions/active_record_extension.rb +14 -0
  35. data/lib/scaffold_markup/extensions/twitter_bootstrap_markup_extension.rb +5 -0
  36. data/lib/scaffold_markup/helpers/link_button_helper.rb +32 -0
  37. data/lib/scaffold_markup/helpers/table_helper.rb +83 -0
  38. data/lib/scaffold_markup/helpers/url_helper.rb +28 -0
  39. data/lib/scaffold_markup/version.rb +3 -0
  40. data/scaffold_markup.gemspec +26 -0
  41. data/vendor/assets/images/glyphicons-halflings-white.png +0 -0
  42. data/vendor/assets/images/glyphicons-halflings.png +0 -0
  43. data/vendor/assets/javascripts/bootstrap.js +1792 -0
  44. data/vendor/assets/javascripts/jquery.livequery.js +226 -0
  45. data/vendor/assets/stylesheets/bootstrap.css +5580 -0
  46. data/vendor/assets/stylesheets/scaffold_markup.css +24 -0
  47. metadata +146 -0
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .idea
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in scaffold_markup.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # scaffold_markup
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'scaffold_markup'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install scaffold_markup
18
+
19
+ ## Usage
20
+
21
+ Put into aplication.js file
22
+
23
+ //= require jquery.livequery
24
+ //= require bootstrap
25
+
26
+ Put into application.css file
27
+
28
+ *= require bootstrap
29
+ *= require scaffold_markup
30
+
31
+ All scaffold controller must include
32
+
33
+ include ScaffoldMarkup::Controllers::Base
34
+
35
+ ## Contributing
36
+
37
+ 1. Fork it
38
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
39
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
40
+ 4. Push to the branch (`git push origin my-new-feature`)
41
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,15 @@
1
+ module ScaffoldMarkupHelper
2
+
3
+ def page_builder(&block)
4
+ ScaffoldMarkup::Builders::PageBuilder.new(self, &block)
5
+ end
6
+
7
+ def url_helper
8
+ ScaffoldMarkup::Helpers::UrlHelper.new(self)
9
+ end
10
+
11
+ def resource_class
12
+ params[:controller].classify.constantize
13
+ end
14
+
15
+ end
@@ -0,0 +1,5 @@
1
+ = page_builder do |page|
2
+ = page.form_for @model do |form|
3
+ = render 'form_attributes', :page => page, :form => form
4
+ = form.actions do
5
+ = render 'form_actions', :page => page, :form => form
@@ -0,0 +1,3 @@
1
+ = page.submit_primary 'Save', :name => :save
2
+ = page.submit_primary 'Save and New', :name => :save_and_new if @model.new_record?
3
+ = page.link_button 'Cancel', url_helper.list_resource(@model.class)
@@ -0,0 +1,5 @@
1
+ - @model.class.accessible_attribute_names.each do |attribute|
2
+ - if @model.class.reflected_association(attribute)
3
+ = form.association @model.class.reflected_association(attribute).name, :required => @model.class.validates_presence?(attribute)
4
+ - else
5
+ = form.text attribute, :required => @model.class.validates_presence?(attribute)
@@ -0,0 +1,2 @@
1
+ = page.well_small do
2
+ = page.link_button_primary 'New', url_helper.new_resource(params[:controller].singularize.classify.constantize)
@@ -0,0 +1,3 @@
1
+ = page.table @collection,
2
+ resource_class.accessible_attribute_names.map { |a| resource_class.reflected_association(a) ? resource_class.reflected_association(a).name : a },
3
+ :actions => [:show, :edit, :remove]
@@ -0,0 +1,2 @@
1
+ - page.title resource_class.model_name.human_plural
2
+ - page.header resource_class.model_name.human_plural, params[:action].capitalize
@@ -0,0 +1,3 @@
1
+ = page.link_button_primary 'Edit', url_helper.edit_resource(@model)
2
+ = page.link_button_danger 'Remove', url_helper.resource(@model), 'data-method' => :delete, 'data-confirm' => 'Are you sure?'
3
+ = page.link_button 'Cancel', url_helper.list_resource(@model.class)
@@ -0,0 +1,2 @@
1
+ - @model.class.accessible_attribute_names.each do |attribute|
2
+ = form.display attribute
@@ -0,0 +1,3 @@
1
+ = page_builder do |page|
2
+ = render 'page_title', :page => page
3
+ = render 'form', :page => page
@@ -0,0 +1,4 @@
1
+ = page_builder do |page|
2
+ = render 'page_title', :page => page
3
+ = render 'index_actions', :page => page
4
+ = render 'index_table', :page => page
@@ -0,0 +1,3 @@
1
+ = page_builder do |page|
2
+ = render 'page_title', :page => page
3
+ = render 'form', :page => page
@@ -0,0 +1,7 @@
1
+ = page_builder do |page|
2
+ = render 'page_title', :page => page
3
+
4
+ = page.form_for @model do |form|
5
+ = render 'show_attributes', :page => page, :form => form
6
+ = form.actions do
7
+ = render 'show_actions', :page => page, :form => form
@@ -0,0 +1,15 @@
1
+ -# Link to the "First" page
2
+ - available local variables
3
+ url: url to the first page
4
+ current_page: a page object for the currently displayed page
5
+ num_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -
9
+ %li{:class => '.first' + (current_page.first? ? ' active' : '')}
10
+ - if current_page.first?
11
+ %a= raw(t 'views.pagination.first')
12
+ - else
13
+ = link_to raw(t 'views.pagination.first'), url, :remote => remote
14
+
15
+
@@ -0,0 +1,9 @@
1
+ -# Non-link tag that stands for skipped pages...
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ num_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ -
8
+ %li.page.gap
9
+ %a= raw(t 'views.pagination.truncate')
@@ -0,0 +1,13 @@
1
+ -# Link to the "Last" page
2
+ - available local variables
3
+ url: url to the last page
4
+ current_page: a page object for the currently displayed page
5
+ num_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -
9
+ %li{:class => 'last' + (current_page.last? ? ' active' : '')}
10
+ - if current_page.last?
11
+ %a= raw(t 'views.pagination.last')
12
+ - else
13
+ = link_to raw(t 'views.pagination.last'), url, {:remote => remote}
@@ -0,0 +1,13 @@
1
+ -# Link to the "Next" page
2
+ - available local variables
3
+ url: url to the next page
4
+ current_page: a page object for the currently displayed page
5
+ num_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -
9
+ %li{:class => 'next' + (current_page.last? ? ' active' : '')}
10
+ - if current_page.last?
11
+ %a= raw(t 'views.pagination.next')
12
+ - else
13
+ = link_to raw(t 'views.pagination.next'), url, :rel => 'next', :remote => remote
@@ -0,0 +1,15 @@
1
+ -# Link showing page number
2
+ - available local variables
3
+ page: a page object for "this" page
4
+ url: url to this page
5
+ current_page: a page object for the currently displayed page
6
+ num_pages: total number of pages
7
+ per_page: number of items to fetch per page
8
+ remote: data-remote
9
+ -
10
+ %li{:class => 'page' + (page.current? ? ' active' : '')}
11
+ - if page.current?
12
+ %a= page
13
+ - else
14
+ = link_to page, url, opts = {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil}
15
+
@@ -0,0 +1,20 @@
1
+ -# The container tag
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ num_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ paginator: the paginator that renders the pagination tags inside
8
+ -
9
+ = paginator.render do
10
+ %nav.pagination
11
+ %ul
12
+ = first_page_tag
13
+ = prev_page_tag
14
+ - each_page do |page|
15
+ - if page.left_outer? || page.right_outer? || page.inside_window?
16
+ = page_tag page
17
+ - elsif !page.was_truncated?
18
+ = gap_tag
19
+ = next_page_tag
20
+ = last_page_tag
@@ -0,0 +1,13 @@
1
+ -# Link to the "Previous" page
2
+ - available local variables
3
+ url: url to the previous page
4
+ current_page: a page object for the currently displayed page
5
+ num_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -
9
+ %li{:class => 'prev' + (current_page.first? ? ' active' : '')}
10
+ - if current_page.first?
11
+ %a= raw(t 'views.pagination.previous')
12
+ - else
13
+ = link_to raw(t 'views.pagination.previous'), url, :rel => 'prev', :remote => remote
@@ -0,0 +1,21 @@
1
+ require 'scaffold_markup/version'
2
+ require 'scaffold_markup/engine'
3
+
4
+ require 'twitter_bootstrap_markup'
5
+ require 'kaminari'
6
+
7
+ require 'scaffold_markup/extensions/active_model_extension'
8
+ require 'scaffold_markup/extensions/active_record_extension'
9
+ require 'scaffold_markup/extensions/twitter_bootstrap_markup_extension'
10
+
11
+ require 'scaffold_markup/helpers/link_button_helper'
12
+ require 'scaffold_markup/helpers/table_helper'
13
+ require 'scaffold_markup/helpers/url_helper'
14
+
15
+ require 'scaffold_markup/controllers/base'
16
+
17
+ require 'scaffold_markup/builders/base_builder'
18
+ require 'scaffold_markup/builders/nav_container_builder'
19
+ require 'scaffold_markup/builders/nav_bar_builder'
20
+ require 'scaffold_markup/builders/form_builder'
21
+ require 'scaffold_markup/builders/page_builder'
@@ -0,0 +1,22 @@
1
+ module ScaffoldMarkup
2
+ module Builders
3
+ class BaseBuilder
4
+ include TwitterBootstrapMarkup
5
+
6
+ attr_reader :template
7
+ attr_reader :block
8
+ attr_reader :url
9
+
10
+ def initialize(template, &block)
11
+ @template = template
12
+ @block = block
13
+ @url = Helpers::UrlHelper.new(template)
14
+ end
15
+
16
+ def html_safe
17
+ to_s.html_safe
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,77 @@
1
+ module ScaffoldMarkup
2
+ module Builders
3
+ class FormBuilder < BaseBuilder
4
+ attr_reader :model
5
+
6
+ def initialize(template, model, &block)
7
+ super(template, &block)
8
+ @model = model
9
+ end
10
+
11
+ def to_s
12
+ _self = self
13
+ html = Form.horizontal(:method => :post, :action => model.new_record? ? url.list_resource(model.class) : url.resource(model), 'accept-charset' => 'UTF-8') do
14
+ append Input.hidden :name => 'authenticity_token', :value => _self.template.form_authenticity_token
15
+ append Input.hidden :name => '_method', :value => :put unless _self.model.new_record?
16
+ append _self.template.capture(_self, &_self.block)
17
+ end.to_s
18
+ flash_errors
19
+ html
20
+ end
21
+
22
+ def display(attribute)
23
+ association = model.class.reflected_association(attribute)
24
+ display_value = association ? model.send(association.name).to_s : model.send(attribute)
25
+ ControlGroup.new(model.class.human_attribute_name(attribute), :class => 'bold') do
26
+ append Tag.block(:span, display_value, :class => 'display')
27
+ end.html_safe
28
+ end
29
+
30
+ def text(attribute, options={})
31
+ _self = self
32
+ ControlGroup.new("#{model.class.human_attribute_name(attribute)}#{options[:required] ? ' (*)' : ''}", :class => options[:required] ? 'bold' : '') do
33
+ text_box = append Input.text(:id => "#{_self.model.class.model_name.underscore}_#{attribute}", :name => "#{_self.model.class.model_name.underscore}[#{attribute}]", :value => _self.model.send(attribute))
34
+ text_box.attributes[:required] = :required if options[:required]
35
+ end.html_safe
36
+ end
37
+
38
+ def association(association_name, options={})
39
+ _self = self
40
+ attribute = model.class.reflections[association_name].foreign_key
41
+ ControlGroup.new("#{model.class.human_attribute_name(association_name)}#{options[:required] ? ' (*)' : ''}", :class => options[:required] ? 'bold' : '') do
42
+ html_attributes = {
43
+ :prompt => '[Select]',
44
+ :selected_value => _self.model.send(attribute),
45
+ :id => "#{_self.model.class.model_name.underscore}_#{attribute}",
46
+ :name => "#{_self.model.class.model_name.underscore}[#{attribute}]"
47
+ }
48
+ select = append Select.new(Hash[_self.model.class.reflections[association_name].klass.all.map { |e| [e.to_s, e.id] }], html_attributes)
49
+ select.attributes[:required] = :required if options[:required]
50
+ end.html_safe
51
+ end
52
+
53
+ def actions(&block)
54
+ #TODO: FormActions tiene que ser una clase de TwitterBootstrapMarkup
55
+ Tag.block(:div, template.capture(self, &block), :class => 'form-actions').html_safe
56
+ end
57
+
58
+ def flash_errors
59
+ _self = self
60
+ if model.errors.any?
61
+ errors = Alert.danger_closable do
62
+ append Tag.block(:strong, 'Cant perform requested operation')
63
+ append do
64
+ Tag.block(:ul) do
65
+ _self.model.errors.full_messages.each do |msg|
66
+ append Tag.new(:li, msg.gsub(/\n/, '<br>'))
67
+ end
68
+ end
69
+ end
70
+ end
71
+ template.content_for(:flash, errors.html_safe)
72
+ end
73
+ end
74
+
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,26 @@
1
+ module ScaffoldMarkup
2
+ module Builders
3
+ class NavBarBuilder < BaseBuilder
4
+
5
+ def to_s
6
+ _self = self
7
+ NavBar.top do
8
+ append _self.template.capture(_self, &_self.block)
9
+ end.to_s
10
+ end
11
+
12
+ def brand(text, url)
13
+ Brand.new(text, url).html_safe
14
+ end
15
+
16
+ def container(&block)
17
+ NavContainerBuilder.new(template, &block).html_safe
18
+ end
19
+
20
+ def link(text, url)
21
+ Link.new(text, url).html_safe
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ module ScaffoldMarkup
2
+ module Builders
3
+ class NavContainerBuilder < BaseBuilder
4
+
5
+ def initialize(*args, &block)
6
+ super(*args, &block)
7
+ @container = NavContainer.new {}
8
+ end
9
+
10
+ def to_s
11
+ template.capture(self, &block)
12
+ @container.to_s
13
+ end
14
+
15
+ def link(text, url)
16
+ @container.append Link.new(text, url)
17
+ end
18
+
19
+ def pull_right
20
+ @container.pull_right
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,63 @@
1
+ module ScaffoldMarkup
2
+ module Builders
3
+ class PageBuilder < BaseBuilder
4
+ include Helpers::LinkButtonHelper
5
+ include Helpers::TableHelper
6
+
7
+ def to_s
8
+ html = template.capture(self, &block)
9
+ flash_messages
10
+ html
11
+ end
12
+
13
+ def container(&block)
14
+ #TODO: Container tiene que ser un tag de TwitterBootstrapMarkup
15
+ Tag.new(:div, template.capture(self, &block), :class => 'container').html_safe
16
+ end
17
+
18
+ def title(text)
19
+ template.content_for(:page_title, text)
20
+ end
21
+
22
+ def header(title, subtitle=nil)
23
+ template.content_for(:page_header, PageHeader.new(title, subtitle).html_safe)
24
+ end
25
+
26
+ def well_small(&block)
27
+ Well.small(template.capture(self, &block)).html_safe
28
+ end
29
+
30
+ def submit_primary(*args)
31
+ Submit.primary(*args).html_safe
32
+ end
33
+
34
+ def form_for(model, &block)
35
+ FormBuilder.new(template, model, &block).html_safe
36
+ end
37
+
38
+ def nav_bar(&block)
39
+ NavBarBuilder.new(template, &block).html_safe
40
+ end
41
+
42
+ def flash_messages
43
+ unless template.content_for?(:flash)
44
+ template.flash.keys.each do |key|
45
+ if template.flash[key].is_a? Array
46
+ flash_text = template.flash[key].join('<br>')
47
+ else
48
+ flash_text = template.flash[key]
49
+ end
50
+ template.content_for(:flash, self.send("alert_#{key}", flash_text))
51
+ end
52
+ end
53
+ end
54
+
55
+ Alert::TYPES.each do |type|
56
+ define_method "alert_#{type}" do |content=nil, &block|
57
+ Alert.send("#{type}_closable", content, &block).html_safe
58
+ end
59
+ end
60
+
61
+ end
62
+ end
63
+ end