flexa_lib 0.1.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.
data/LICENSE ADDED
@@ -0,0 +1,45 @@
1
+ Copyright (c) 2012 FlexaIT Team
2
+ www.flexait.com.br
3
+ http://github.com/flexait
4
+
5
+ --------------------------------- EN ------------------------------------
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ "Software"), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be
15
+ included in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+
26
+
27
+ --------------------------------- pt-BR ------------------------------------
28
+ A permissão é concedida, a título gratuito, para qualquer pessoa que obtenha
29
+ uma cópia deste software e arquivos de documentação associados (o
30
+ "Software"), para lidar com o Software sem restrição, incluindo
31
+ sem limitação, os direitos para usar, copiar, modificar, mesclar, publicar,
32
+ distribuir, sublicenciar, e / ou vender cópias do Software, e para
33
+ permitir a pessoas a quem o Software é fornecido façam isso, sujeitas a
34
+ as seguintes condições:
35
+
36
+ O aviso de copyright acima e este aviso de permissão devem ser
37
+ incluído em todas as cópias ou partes substanciais do Software.
38
+
39
+ O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO,
40
+ EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO LIMITADO ÀS GARANTIAS DE
41
+ ADEQUAÇÃO COMERCIALIZAÇÃO, PARA UMA FINALIDADE ESPECÍFICA E
42
+ LEGALIDADE. EM NENHUM CASO OS AUTORES OU TITULARES DE DIREITOS AUTORAIS BE
43
+ RESPONSÁVEL POR QUALQUER RECLAMAÇÃO, DANOS OU RESPONSABILIDADE, SEJA EM UMA AÇÃO
44
+ DE CONTRATO, OU DE OUTRA FORMA, DECORRENTES DE, OU EM CONEXÃO
45
+ COM O SOFTWARE OU O USO OU OUTROS NO SOFTWARE.
data/README.txt ADDED
@@ -0,0 +1,18 @@
1
+
2
+
3
+ ===== No arquivo application.js
4
+ Deixar dessa forma:
5
+
6
+ //= require jquery
7
+ //= require jquery_ujs
8
+ //= require flexa
9
+
10
+ ===== No arquivo application.css
11
+ Deixar dessa forma:
12
+
13
+ /*
14
+ *= require_self
15
+ *= require flexa
16
+ */
17
+
18
+ ##
@@ -0,0 +1,46 @@
1
+ # -*- encoding : utf-8 -*-
2
+ # Representa um numero de CNPJ. Objetos da classe Cnpj recebem strings representando numeros de cnpj e verificam a validade destes numeros usando dois criterios:
3
+ # 1. O formato da string, que deve seguir o padrao xx.xxx.xxx/xxxx-xx, onde 'x' pode ser qualquer digito de 0 a 9 e os tracos (-), barra (/) e pontos (.) *sao opcionais*.
4
+ # 2. O conteudo numerico desta string, que eh validado atraves do calculo do 'modulo 11' dos digitos que compoe a string.
5
+ #
6
+ # Caso o conteudo da string obedeca ao formato especificado acima, o mesmo sera formatado para obedecer ao padrao xx.xxx.xxx/xxxx-xx
7
+ #
8
+ # Eh importante observar que caso voce associe um valor de cnpj invalido ao seu model, o mesmo passara automaticamente a ser invalido, o que impede que valores de cpf incorretos sejam salvos no banco de dados.
9
+ #
10
+ # Como usar a classe Cnpj no seu ActiveRecord:
11
+ #
12
+ # Suponha que temos um model Empresa, com um atributo 'cnpj'
13
+ # que voce quer usar como um numero de documento para cnpj. Basta usar o
14
+ # metodo <tt>usar_como_cnpj</tt>, assim:
15
+ #
16
+ # class Empresa < ActiveRecord::Base
17
+ # usar_como_cnpj :cnpj
18
+ # end
19
+ #
20
+ # Agora voce pode usar o atributo para cnpj da seguinte forma:
21
+ #
22
+ # e = Empresa.new
23
+ # e.cnpj = "69103604000160"
24
+ # puts e.cnpj # ==> 69.103.604/0001-60
25
+ # e.cnpj.valido? # ==> true
26
+ # e.cnpj_valido? # ==> true
27
+ #
28
+ # e = Empresa.new(:cnpj => "69.103.604/0001-60")
29
+ # puts e.cnpj # ==> 69.103.604/0001-60
30
+ #
31
+ # e = Empresa.new
32
+ # e.cnpj = Cnpj.new("691036040001-60")
33
+ # puts e.cnpj # ==> 69.103.604/0001-60
34
+ #
35
+ # e = Empresa.new
36
+ # e.cnpj = "12343" # ==> um cnpj invalido
37
+ # puts e.valid? # ==> false
38
+ # e.save # ==> false
39
+ # e.errors.on(:cnpj) # ==> 'não é válido' # de acordo com a I18n
40
+ #
41
+ # c = Cnpj.new("69103604000160")
42
+ # e.cnpj = "69.103.604/0001-60"
43
+ # c == e.cnpj # ==> true
44
+ class Cnpj
45
+ include CpfCnpj
46
+ end
@@ -0,0 +1,6 @@
1
+ class CnpjValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ return if value.nil?
4
+ record.errors.add attribute, :invalid unless Cnpj.new(value).valido?
5
+ end
6
+ end
@@ -0,0 +1,52 @@
1
+ # -*- encoding : utf-8 -*-
2
+ # Representa um numero de CPF. Objetos da classe Cpf recebem strings representando
3
+ # numeros de cpf e verificam a validade destes numeros usando dois criterios:
4
+ # 1. O formato da string, que deve seguir o padrao xxx.xxx.xxx-xx, onde 'x' pode ser qualquer digito de 0 a 9 e os tracos (-) e pontos (.) *sao opcionais*.
5
+ # 2. O conteudo numerico desta string, que eh validado atraves do calculo do 'modulo 11' dos digitos que compoe a string.
6
+ #
7
+ # Caso o conteudo da string obedeca ao formato especificado acima, o mesmo sera formatado para obedecer ao padrao xxx.xxx.xxx-xx
8
+ #
9
+ # Eh importante observar que caso voce associe um valor de cpf invalido ao seu model, o mesmo passara automaticamente a ser invalido, o que impede que valores de cpf incorretos sejam salvos no banco de dados.
10
+ #
11
+ # Como usar a classe Cpf no seu ActiveRecord:
12
+ #
13
+ # Suponha que temos um model Pessoa, com um atributo 'cpf'
14
+ # que voce quer usar como um numero de documento para cpf. Basta usar o
15
+ # metodo <tt>usar_como_cpf</tt>, assim:
16
+ #
17
+ # class Pessoa < ActiveRecord::Base
18
+ # usar_como_cpf :cpf
19
+ # end
20
+ #
21
+ # O atributo que sera usado como cpf pode ter qualquer nome e nao apenas 'cpf'
22
+ #
23
+ # Agora voce pode usar o atributo para cpf da seguinte forma:
24
+ #
25
+ # p = Pessoa.new
26
+ # p.cpf = "11144477735"
27
+ # puts p.cpf # ==> 111.444.777-35
28
+ # p.cpf.valido? # ==> true
29
+ # p.cpf_valido? # ==> true
30
+ #
31
+ # p = Pessoa.new(:cpf => "111.444.777-35")
32
+ # puts p.cpf # ==> 111.444.777-35
33
+ #
34
+ # p = Pessoa.new
35
+ # p.cpf = Cpf.new("111444777-35")
36
+ # puts p.cpf # ==> 111.444.777-35
37
+ #
38
+ # p = Pessoa.new
39
+ # p.cpf = "12345" # ==> um cpf invalido
40
+ # puts p.valid? # ==> false
41
+ # p.save # ==> false
42
+ # p.errors.on(:cpf) # ==> 'não é válido' # de acordo com o I18n
43
+ #
44
+ # c = Cpf.new("11144477735")
45
+ # p.cpf = "111.444.777-35"
46
+ # c == p.cpf # ==> true
47
+ #
48
+ class Cpf
49
+ include CpfCnpj
50
+ end
51
+
52
+
@@ -0,0 +1,90 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module CpfCnpj
3
+ attr_reader :numero
4
+
5
+ def initialize(numero)
6
+ @numero = numero
7
+ @match = self.instance_of?(Cpf) ? @numero =~ CPF_REGEX : @numero =~ CNPJ_REGEX
8
+ @numero_puro = $1
9
+ @para_verificacao = $2
10
+ @numero = (@match ? format_number! : nil)
11
+ end
12
+
13
+ def to_s
14
+ @numero || ""
15
+ end
16
+
17
+ def ==(outro_doc)
18
+ self.numero == outro_doc.numero
19
+ end
20
+
21
+ # Verifica se o numero possui o formato correto e se
22
+ # constitui um numero de documento valido, dependendo do seu
23
+ # tipo (Cpf ou Cnpj).
24
+ def valido?
25
+ return false unless @match
26
+ verifica_numero
27
+ end
28
+
29
+ private
30
+ DIVISOR = 11
31
+
32
+ CPF_LENGTH = 11
33
+ CPF_REGEX = /^(\d{3}\.?\d{3}\.?\d{3})-?(\d{2})$/
34
+ CPF_ALGS_1 = [10, 9, 8, 7, 6, 5, 4, 3, 2]
35
+ CPF_ALGS_2 = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2]
36
+
37
+ CNPJ_LENGTH = 14
38
+ CNPJ_REGEX = /^(\d{2}\.?\d{3}\.?\d{3}\/?\d{4})-?(\d{2})$/ # <= 11.222.333/0001-XX
39
+ CNPJ_ALGS_1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
40
+ CNPJ_ALGS_2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
41
+
42
+
43
+ def verifica_numero
44
+ limpo = @numero.gsub(/[\.\/-]/, "")
45
+ if self.instance_of? Cpf
46
+ return false if limpo.length != 11
47
+ elsif self.instance_of? Cnpj
48
+ return false if limpo.length != 14
49
+ end
50
+ return false if limpo.scan(/\d/).uniq.length == 1
51
+ primeiro_verificador = primeiro_digito_verificador
52
+ segundo_verificador = segundo_digito_verificador(primeiro_verificador)
53
+ verif = primeiro_verificador + segundo_verificador
54
+ verif == @para_verificacao
55
+ end
56
+
57
+ def multiplica_e_soma(algs, numero_str)
58
+ multiplicados = []
59
+ numero_str.scan(/\d{1}/).each_with_index { |e, i| multiplicados[i] = e.to_i * algs[i] }
60
+ multiplicados.inject { |s,e| s + e }
61
+ end
62
+
63
+ def digito_verificador(resto)
64
+ resto < 2 ? 0 : DIVISOR - resto
65
+ end
66
+
67
+ def primeiro_digito_verificador
68
+ array = self.instance_of?(Cpf) ? CPF_ALGS_1 : CNPJ_ALGS_1
69
+ soma = multiplica_e_soma(array, @numero_puro)
70
+ digito_verificador(soma%DIVISOR).to_s
71
+ end
72
+
73
+ def segundo_digito_verificador(primeiro_verificador)
74
+ array = self.instance_of?(Cpf) ? CPF_ALGS_2 : CNPJ_ALGS_2
75
+ soma = multiplica_e_soma(array, @numero_puro + primeiro_verificador)
76
+ digito_verificador(soma%DIVISOR).to_s
77
+ end
78
+
79
+ def format_number!
80
+ if self.instance_of? Cpf
81
+ @numero =~ /(\d{3})\.?(\d{3})\.?(\d{3})-?(\d{2})/
82
+ @numero = "#{$1}.#{$2}.#{$3}-#{$4}"
83
+ else
84
+ @numero =~ /(\d{2})\.?(\d{3})\.?(\d{3})\/?(\d{4})-?(\d{2})/
85
+ @numero = "#{$1}.#{$2}.#{$3}/#{$4}-#{$5}"
86
+ end
87
+ end
88
+
89
+ end
90
+
@@ -0,0 +1,61 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module CpfCnpjActiveRecord #:nodoc:
3
+ def self.included(base) #:nodoc:
4
+ base.extend ClassMethods
5
+ end
6
+ module ClassMethods #:nodoc:
7
+ def usar_como_cpf(*args) #:nodoc:
8
+ init(args, 'Cpf')
9
+ end
10
+
11
+ def usar_como_cnpj(*args) #:nodoc:
12
+ init(args, 'Cnpj')
13
+ end
14
+
15
+ def init(args, klass)
16
+ unless args.size.zero?
17
+ args.each do |name|
18
+ add_composed_class(name, klass)
19
+ module_eval create_code(name.to_s, klass)
20
+ end
21
+ end
22
+ end
23
+
24
+ def add_composed_class(name, klass)
25
+ options = {:class_name => klass, :mapping => [name.to_s, "numero"], :allow_nil => true}
26
+ constructor = Proc.new { |numero| eval(klass).new(numero) }
27
+ converter = Proc.new { |value| eval(klass).new(value) }
28
+ begin
29
+ composed_of name, options.merge( { :constructor => constructor, :converter => converter } )
30
+ rescue Exception
31
+ composed_of name, options { eval(klass).new(name[:numero]) }
32
+ end
33
+ end
34
+
35
+ def create_code(name, klass)
36
+ str = <<-CODE
37
+ validate :#{name}_valido?
38
+ def #{name}_valido?
39
+ value = read_attribute('#{name}')
40
+ if !value.nil? && value.strip != '' && !#{name}.nil? && !#{name}.valido?
41
+ self.errors.add('#{name}', :invalid)
42
+ end
43
+ end
44
+ def #{name}=(value)
45
+ if value.blank?
46
+ write_attribute('#{name}', nil)
47
+ elsif value.kind_of?(#{eval(klass)})
48
+ write_attribute('#{name}', value.numero)
49
+ else
50
+ begin
51
+ c = #{eval(klass)}.new(value)
52
+ c.valido? ? write_attribute('#{name}', c.numero) : write_attribute('#{name}', value)
53
+ rescue
54
+ @#{name} = value
55
+ end
56
+ end
57
+ end
58
+ CODE
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,6 @@
1
+ class CpfValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ return if value.nil?
4
+ record.errors.add attribute, :invalid unless Cpf.new(value).valido?
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ module BrCpfCnpj
2
+ module VERSION #:nodoc:
3
+ MAJOR = 3
4
+ MINOR = 1
5
+ TINY = 0
6
+
7
+ STRING = "#{MAJOR}.#{MINOR}.#{TINY}"
8
+ end
9
+ end
10
+
@@ -0,0 +1,14 @@
1
+ # -*- encoding : utf-8 -*-
2
+ $:.unshift(File.dirname(__FILE__)) unless
3
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
4
+
5
+ %w(cpf_cnpj cnpj cpf cpf_cnpj_activerecord cnpj_validator cpf_validator).each {|req| require File.dirname(__FILE__) + "/brcpfcnpj/#{req}"}
6
+
7
+ %w(rubygems active_record active_support).each {|req| require req }
8
+
9
+ ActiveRecord::Base.send :include, CpfCnpjActiveRecord
10
+
11
+ module FlexaLib
12
+ module BrCpfCnpj
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ module FlexaLib
2
+ class Engine < Rails::Engine
3
+
4
+ end
5
+ end
@@ -0,0 +1,43 @@
1
+ module FlexaLib
2
+ module Helpers
3
+ module ButtonGridHelpers
4
+
5
+
6
+ #BUTTON_GRID_HELPERS
7
+ def flexa_grid_button_show_to(obj)
8
+ link_to content_tag("i", "",:class=>"icon-search icon-white"), obj, :class=>"btn btn-smallest btn-info"
9
+ end
10
+
11
+ #BUTTON_GRID_HELPERS
12
+ def flexa_grid_button_edit_to(obj)
13
+ model_name = obj.class.to_s.underscore
14
+ link_to content_tag("i", "",:class=>"icon-pencil icon-white"), send("edit_#{model_name}_path",obj), :class=>"btn btn-smallest btn-warning"
15
+ end
16
+
17
+ #BUTTON_GRID_HELPERS
18
+ def flexa_grid_button_delete_to(obj)
19
+ link_to content_tag("i", "",:class=>"icon-minus icon-white"), obj, :confirm => 'Are you sure?', :method => :delete, :class=>"btn btn-smallest btn-danger"
20
+ end
21
+
22
+ #BUTTON_GRID_HELPERS
23
+ def flexa_grid_button_select_to(obj,fill)
24
+ afill=fill.split(",")
25
+ fill = ""
26
+ afill.each do |f|
27
+ fill << "window.parent.$('##{f}').attr('value','"+obj.send(f).to_s+"');"
28
+ end
29
+ link_to content_tag("i", "",:class=>"icon-ok icon-white"), "#", :class=>"btn btn-smallest btn-success",:onclick=>fill+"window.parent.$('#div_"+afill.first.to_s+"').modal('hide');"
30
+ #flexa_grid_button_generic("success","ok","#",:onclick=>fill+"window.parent.$('#lookup').modal('hide');")
31
+ end
32
+
33
+ #BUTTON_GRID_HELPERS
34
+ def flexa_grid_button_generic(button,icon,path,*args)
35
+ options = args.extract_options!
36
+ options[:class]= "btn btn-smallest btn-"+button
37
+ concat(link_to content_tag("i", "",:class=>"icon-"+icon+" icon-white"), path, options)
38
+ end
39
+
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,58 @@
1
+ module FlexaLib
2
+ module Helpers
3
+ module ButtonHelpers
4
+
5
+ #BUUTTON_HELPERS
6
+ def flexa_cancel_button_to(model)
7
+ model_name = model.class.to_s.underscore
8
+ content_tag :li do
9
+ link_to content_tag("i", "",:class=>"icon-backward")<<' Cancelar', send("#{model_name.pluralize}_path"),:id=>"cancel"
10
+ end
11
+ end
12
+
13
+ #BUUTTON_HELPERS
14
+ def flexa_edit_button_to(model)
15
+ model_name = model.class.to_s.underscore
16
+ content_tag :li do
17
+ link_to content_tag("i", "",:class=>"icon-pencil")<<' Editar', send("edit_#{model_name}_path",model)
18
+ end
19
+ end
20
+
21
+
22
+ #BUUTTON_HELPERS
23
+ def flexa_delete_button_to(model)
24
+ content_tag :li do
25
+ link_to content_tag("i", "",:class=>"icon-minus")<<' Excluir', model, :confirm => 'Deseja realmente excluir?', :method => :delete
26
+ end
27
+ end
28
+
29
+ #BUUTTON_HELPERS
30
+ def flexa_add_button_to(class_ref)
31
+ class_name = class_ref.name.to_s.underscore
32
+ content_tag :li do
33
+ link_to content_tag("i", "",:class=>"icon-plus")<<" Adicionar", send("new_#{class_name}_path"), :id=>"add"
34
+ end
35
+ end
36
+
37
+ #BUUTTON_HELPERS
38
+ # para criar botôes genéricos
39
+ def flexa_generic_button_to(text,link,icon="",*args)
40
+ options = args.extract_options!
41
+ if !icon.nil?
42
+ text = raw content_tag("i", "",:class=>"icon-"+icon.to_s)<<" "+text
43
+ end
44
+ content_tag :li do
45
+ link_to text, link, options
46
+ end
47
+ end
48
+
49
+ #BUUTTON_HELPERS
50
+ def flexa_submit_button(text="Salvar")
51
+ content_tag :li do
52
+ flexa_link_to_submit content_tag("i", "",:class=>"icon-ok")<<" "<<text,:id=>"submit"
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,12 @@
1
+ module FlexaLib
2
+ module Helpers
3
+ module LinkHelpers
4
+
5
+ #LINK_HELPERS
6
+ def flexa_link_to_submit(name, html_options={})
7
+ link_to_function name, ";$(this).closest('form').submit()",html_options
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ module FlexaLib
2
+ module Helpers
3
+ module LookupHelpers
4
+
5
+ #LOOKUP_HELPERS
6
+ def flexa_lookup_search_tool(class_ref)
7
+ class_name = class_ref.name.to_s.underscore
8
+ content_tag :li do
9
+ form_tag(send("lookups_#{class_name.pluralize}_path"), :method=>"get", :id=>"formsearch", :style=>"padding-top:4px;padding-left:50px;",:class=>"form-search") do
10
+ concat(hidden_field_tag :fill, params[:fill])
11
+ concat(text_field_tag :search, params[:search], :class=>"input-medium search-query")
12
+ concat(content_tag("button",:type=>"submit",:class=>"btn btn-info",:style=>"margin-left:4px;",:id=>"search") do
13
+ content_tag("i", "",:class=>"icon-search icon-white")
14
+ end)
15
+ end
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,66 @@
1
+ module FlexaLib
2
+ module Helpers
3
+ module OtherHelpers
4
+
5
+
6
+ #OTHER_HELPERS
7
+ def flexa_search_tool(class_ref)
8
+ class_name = class_ref.name.to_s.underscore
9
+ content_tag :li do
10
+ form_tag(send("#{class_name.pluralize}_path"), :method=>"get", :id=>"formsearch", :style=>"padding-top:4px;padding-left:50px;",:class=>"form-search") do
11
+ concat(hidden_field_tag :fill, params[:fill])
12
+ concat(text_field_tag :search, params[:search], :class=>"input-medium search-query")
13
+ concat(content_tag("button",:type=>"submit",:class=>"btn btn-info",:style=>"margin-left:4px;",:id=>"search") do
14
+ content_tag("i", "",:class=>"icon-search icon-white")
15
+ end)
16
+ end
17
+ end
18
+ end
19
+
20
+ #OTHER_HELPERS
21
+ def flexa_page_title(title, path)
22
+ content_tag :li do
23
+ link_to(content_tag("b", title), path)
24
+ end
25
+ end
26
+
27
+ #OTHER_HELPERS
28
+ def flexa_icon_text(icon,text)
29
+ content_tag("i", "",:class=>"icon-"+icon)<<text
30
+ end
31
+
32
+ #OTHER_HELPERS
33
+ def flexa_flash_message
34
+ messages = ""
35
+ css_class = {:notice => "success", :info => "info", :warning => "info", :error => "error"}
36
+ [:notice, :info, :warning, :error].each {|type|
37
+ if flash[type]
38
+ messages += content_tag('div',flash[type],:class=>'alert alert-'<<css_class[type.to_sym])
39
+ end
40
+ }
41
+ raw messages
42
+ end
43
+
44
+ #OTHER_HELPERS
45
+ def flexa_fixed_toolbar(title="",path="",&block)
46
+ content_tag :header,:class=>"jumbotron subhead" do
47
+ content_tag :div,:class=>"subnav subnav-fixed" do
48
+ content_tag :ul,:class=>"nav nav-pills", :id=>"overview" do
49
+ concat(flexa_page_title(title, path))
50
+ block.call
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ #OTHER_HELPERS
57
+ def flexa_column(size="3",&block)
58
+ content_tag :div, :class=>"span"+size.to_s do
59
+ block.call
60
+ end
61
+ end
62
+
63
+
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,43 @@
1
+ module FlexaLib
2
+ module Helpers
3
+ module PaginateHelpers
4
+
5
+ #PAGINATE_HELPERS
6
+ def flexa_will_paginate(resource,*args)
7
+ options = args.extract_options!
8
+ options[:page_links] = true if options[:page_links].present?
9
+ options[:previous_label] = content_tag("i"," ",:class=>"icon-arrow-left")
10
+ options[:next_label] = content_tag("i"," ",:class=>"icon-arrow-right")
11
+ new_options = options
12
+ begin
13
+ flexa_wp = will_paginate resource, new_options
14
+ rescue
15
+ ""
16
+ end
17
+ begin
18
+ flexa_wp["<ul>"]= ""
19
+ rescue
20
+ ""
21
+ end
22
+ begin
23
+ flexa_wp["</ul>"]= ""
24
+ rescue
25
+ ""
26
+ end
27
+ begin
28
+ flexa_wp['<div class="pagination">']= ""
29
+ rescue
30
+ ""
31
+ end
32
+ begin
33
+ flexa_wp["</div>"]= ""
34
+ rescue
35
+ ""
36
+ end
37
+ flexa_wp
38
+ end
39
+
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,39 @@
1
+ module FlexaLib
2
+ module Helpers
3
+ module TabHelpers
4
+
5
+ #TABS_HELPER
6
+ def flexa_tabs(&block)
7
+ content_tag :ul,:class=>"nav nav-tabs" do
8
+ block.call
9
+ end
10
+ end
11
+
12
+ #TABS_HELPER
13
+ def flexa_tab_link(tab,title,active="")
14
+ content_tag :li, :class=>active.to_s do
15
+ content_tag :a, :href=>"#"+tab.to_s, "data-toggle"=>"tab" do
16
+ title
17
+ end
18
+ end
19
+ end
20
+
21
+ #TABS_HELPER
22
+ def flexa_tabs_area(&block)
23
+ content_tag :div,:class=>"tab-content" do
24
+ block.call
25
+ end
26
+ end
27
+
28
+ #TABS_HELPER
29
+ def flexa_tab_frame(tab,active="",&block)
30
+ content_tag :div, :class=>"tab-pane "+active.to_s, :id=>tab do
31
+ block.call
32
+ end
33
+ end
34
+
35
+
36
+
37
+ end
38
+ end
39
+ end