KonoUtils¶ ↑
<img src=“https://badge.fury.io/rb/kono_utils.png” alt=“Gem Version” />
Progetto contenente una serie di classi, debitamente documentata che debbono servire da libreria di utilità per i vari progetti utilizzati da Archimedia.
Installazione¶ ↑
aggiungere nel proprio gemfile gem 'kono_utils' bundle Generatore: bin/rails g kono_utils:install che istalla le dipendenze con yarn e aggiunge il: require kono_utils/utilities
Upgrade From 0.x¶ ↑
After bundle update make bin/rails g kono_utils:install so you have the yarn packages appended
Controllers/Views¶ ↑
ChangeLog¶ ↑
Aggungere una rotta all'applicativo get '/changelog', to: 'kono_utils/change_log#index', as: :changelog Aggiungere un file nella root del progetto: CHANGELOG.md contenuto esempio: <code> ##Legenda: - Feature -> Novità - Bug -> Risoluzione problema - Improvement -> Migliorira ##Versioni ### XX.XX.XX - **Bug** lorem - **Improvement** lorem - **Feature** lorem </code>
BaseSearch¶ ↑
Classe per semplificare il sistema di organizzazione dei modelli di ricerca, unendo anche la configurazione della form di ricerca utilizzando l'helper search_form
Utilizzo¶ ↑
TODO completare spiegazione utilizzo(vedi commenti classe)
Creare una classe modello per gestire la ricerca partendo da BaseSearch
module Admin::PariteticEntities
class Search < KonoUtils::BaseSearch
set_search_model Admin::PariteticEntity -> settare il modello a cui si vuole eseguire effettivamente la ricerca
dovrà contenete uno scope: search che può ricevere un hash di campi da ricercare,
questo hash conterrà tutti i campi sotto definiti, volendo anche con casting passato
attraverso il set_search_attributes
set_search_attributes :name -> in questo modo settiamo i campi da ricercare, per maggiori
informazioni guardare i commenti di questo metodo
end
end
è possibile poi, una volta creata l'istanza della ricerca definirle uno scope preciso:
@search = PariteticEntities::Search.new
@search.scope = policy_scope(PariteticEntity)
o
@search.scope = PariteticEntity.where(:name=>10)
quando si devono settare i parametri provenienti dalla form li carichiamo in questo modo:
@search.update_attributes(params.require(:campo_della_ricerca).permit(:name))
Esempio di scope nel modello Admin::PariteticEntity
##
# Ricerca
#
# * *Args* :
# - search_query -> Hash of:
# name: ricerca libera sul nome %nome%
scope :search, ->(search_query) {
unless search_query[:name].blank?
where(self.arel_table[:name].matches("%#{search_query[:name]}%"))
end
}
Concerns¶ ↑
ActiveRecordTranslation¶ ↑
Serve per aggiungere ad Active Record funzioni corte per la traduzione, includere in un'inizializzatore
ActiveRecord::Base.include KonoUtils::Concerns::ActiveRecordTranslation
SuccessMessage¶ ↑
Include 3 funzioni da poter utilizzare per stampare il messaggio di default di conferma
salvataggio,cancellazione,aggiornamento di un modello come notice in un controller:
.., :notice=>success_create_message(model)
.., :notice=>success_update_message(model)
.., :notice=>success_destroy_message(model)
Base Modals¶ ↑
Un Concern per poter semplificare la vita al controller di salvataggio dati da modals
Utilizzo¶ ↑
class Buildings::FloorsController < ApplicationController include KonoUtils::Concerns::BaseModals def create @obj = @parent_model.floors.build(update_params) super end private def load_obj @obj = @parent_model.floors.find(params[:id]) end def update_params params.require(:floor).permit(:name) end def save_response respond_to do |f| if @obj.valid? @obj.save f.json do render_part_to_json('buildings/floors/panel.html', {:piano => @obj}) end else f.json do render_part_to_json('buildings/floors/modal_form.html', {:piano => @obj, :id => ''}, 400) end end end end def load_parent_assoc @parent_model = Building.find(params[:building_id]) end end #TODO inserire documentazione o generatori per creare codice velocemente, con javascript (Kn.utilities.BasePannel) # e viste con row modal ecc
Base Editing¶ ↑
Un Concern che racchiude tutte le funzionalità base generalizzate per la gestione di un modello
Utilizzo¶ ↑
Includere in un controller da cui derivare tutti i controller dei modelli da editare questo concern chiamandolo BaseEditingController include KonoUtils::Concerns::BaseEditing creare un helper per questo controller e inserirci il modulo degli helper include KonoUtils::BaseEditingHelper nelle policies poi creare una policy che includa KonoUtils::BaseEditingPolicyConcern da cui poi derivare tutte le altre
Application Helper¶ ↑
Modulo che include varie utilities da poter utilizzare:
Utilizzo¶ ↑
will_paginate_bst¶ ↑
esegue will_paginate con il renderer per bootstrap <%=will_paginate_bst(collection)%>
namespace_content¶ ↑
genera un div contenitore con la classi derivate da controller e azione
<%= namespace_content do %>
<%= yield %>
<% end %>
true_false_label¶ ↑
stampa un label per bootstrap con true o false rispetto al valore passato <%= true_false_label(true) %> =>
bootstrap_please_wait¶ ↑
Genera una modal da riutilizzare per far aspettare determinate operazioni al client
<%= bootstrap_please_wait %>
Ricordarsi di aggiungere nel JS:
$('#processing_wait').modal() -> per visualizzarlo
$('#processing_wait').modal('hide') -> per nasconderlo
search_form¶ ↑
Genera una form di ricerca con bootstrap, utilizzando la classe BaseSearch. TODO completare spiegazione utilizzo(vedi commenti classe)
print_rescue_date¶ ↑
Stampa la data standard se questa non è nil
title_mod(model)¶ ↑
Scrive il titolo per modifica del modello
title_new(model)¶ ↑
Scrive il titolo per new del modello
title_newa(model)¶ ↑
Scrive il titolo per il modello al femminile
enum_collection¶ ↑
Genera l'hash da passare come collection alle selectbox, esegue anche la traduzione con locale
enum_translation¶ ↑
Si occupa di tradurre un determinato valore di un enum
Le traduzioni dentro al locale devono essere fatte in questo modo:
it:
activerecord:
attributes:
estimate_before/value:
na: NA
very_insufficient: 1
insufficient: 2
sufficient: 3
excellent: 4
dove in questo caso estimate_before è il modello e value è il nome del campo enum
modal_form_generator¶ ↑
Si occupa di gnerare una modal di bootstrap con all'interno una form
ES:
<%= modal_form_generator(id: id, title: student.mn, form_cfgs: [[school_turn, student]]) do |f| %>
<%= f.input :person, as: :select, collection: school_turn.possible_students.collect { |p| [p.nominativo, p.id] } %>
<%= f.input :year, as: :bs_readonly, :display_field => :nome %>
<%= render 'tikal_dish_core/school_turns/turns_row.html', f: f %>
<% end %>
possibile anche passare una proc per generare i bottoni della modal in modo differente dallo standard, vedere documentazione
modal_edit_button¶ ↑
Genera il bottone per editazione con una modal del contenuto, gli viene passato un block contenente la modal da lanciare per l'editazione, solitamente generata con modal_form_generator. come parametri viene passato l'id del target che si aspetta di richiamare <code> ES: modal_edit_button do |id| render 'tikal_core/people/person_contacts/modal_form', :contact => contact, :id => id %> end Options: - align: left|rigth - updatable_content: elemento da rimpiazzare con il partial restituito - class: classi aggiuntive per selezionare meglio il bottone - bnt_icon: Symbol che identifica che icona utilizzare per il bottone </code>
modal_delete_button¶ ↑
Genera il bottone per la cancellazione di un record, viene creata una relativa modal
per la conferma
<code>
ES:
<%= modal_delete_button(cliente_referente_path(referente.cliente, referente, :json),
callback_remove: "##{id}",
:bnt_icon => 'times fw') %>
modal_delete_button(path, [options])
path -> resource to delete
options:
* confirm : Text to display in modal
* align : left|right
* callback_remove : id dell'elemento da rimuove una volta avuto successo il javascript di cancellazione
* bnt_icon : Symbol che identifica che icona utilizzare per il bottone [:times]
</code>
multiple_elements_table¶ ↑
Genera la struttura di una tabella per la gestione dei campi nested multipli.
multiple_elements_table( "form di formtastic","relazione nel modello nested","elenco campi da visualizzare")
possibile blocco: vedi docs
<code>
<%= f.inputs :name => PriceRange.mnp, class: 'form-inline CLASSE_CONTAINER' do %>
<%= multiple_elements_table(f, :price_ranges, [:from_val, :to_val, :price]) %>
<% end %>
</code>
Ricordarsi poi di aggiungere negli assets anche la funzione per duplicare le righe e per cancellarle
<code>
$('.CLASSE_CONTAINER').multiple_table()
</code>
Nel modello dobbiamo inserire i comandi per il nested:
<code>
has_many :price_ranges, :dependent => :destroy
accepts_nested_attributes_for :price_ranges, allow_destroy: true
validates_associated :price_ranges
</code>
Nella policy/controller dobbiamo preoccuparci di avere anche i permitted attributes corretti
<code>
:price_ranges_attributes => [:from_val, :to_val, :price, :id, :_destroy]
</code>
bs_tree¶ ↑
Genera un'albero con bootstrap-tree
deve ricevere un array di dati da trasformare in json.
per come scrivere il parametro data vedi
https://github.com/jonmiles/bootstrap-treeview
<code>
bs_tree(
[
{
:text => 'ciao',
state:
{
expanded: false
},
nodes:
[
{
text: 'pipo'
}
]
},
{
:text => 'marino'
}
]
)
</code>
Inputs Formtastic per bootstrap¶ ↑
Una serie di inputs per formtastic con bootstrap
Utilizzo¶ ↑
Ricordiamo di mettere kono_utils come gemma sucessivamente a formtastic.
se si vogliono anche gli input :
bs_aceeditor
bs_datetimepicker inject_js => True|False|Hash per ozioni js
- server_format: 'YYYY-MM-DD',
- server_match: '/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/',
- format: 'DD/MM/YYYY HH:mm'
bs_datepicker Come il bs_datetimepicker_input ma con già presenti i settaggi corretti
bs_readonly
bs_file_download visualizza un campo per il caricamento dei files e il relativo bottone di download
bs_image visualizza campo caricamento e in parte l'immagine caricata se caricata
bs_label_with_container Rende possibile inserire dentro al contenitore della input un qualsiasi
contenuto tramite una proc passata come opzione :content
<code>
content: Proc.new {
bf = ActiveSupport::SafeBuffer.new
bf<< f.file_field(:convenz_document)
bf
}
</code>
bs_timepicker
serve includere anche la gemma:
gem 'font-awesome-rails', '~> 4.3.0' #https://github.com/bokmann/font-awesome-rails
Utilities Style CSS¶ ↑
Spacer¶ ↑
classi per una spaziatura verticale , utilizzare passando la classe generale v-space e poi il valore scelto: space-x1 ogni valore dello spacer rappresente 0.2em da 1 a 20 come valore di moltiplicatore
Utilizzo¶ ↑
<div class="kono-v-spacer space-x2"></div> => 0.4em
Fiscal code¶ ↑
Classe KonoUtils::FiscalCode per verificare validità codice fiscale e partita iva dai rispettivi caratteri fi controllo
Utilizzo¶ ↑
KonoUtils::FiscalCode::ControllaCF(codice_fiscale, strict = false) Controllo dell'esattezza del codice fiscale verificando il carattere di controllo KonoUtils::FiscalCode::ControllaPI(partita_iva) Controllo dell'esattezza della partita iva dal carattere di controllo Inoltre rispetto a questo argomento è stata aggiunta anche la gemma codice-fiscale https://github.com/topac/codice_fiscale Che permette di calcolare il codice fiscale partendo dai dati anagrafici di una persona.