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.