Project

kono_utils

0.0
No release in over a year
Gemma per che raccoglie varie tipologie di classi di utilità varia che possono servire al funzionamento delle applicazioni e semplificare la vita al programmatore Rails
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
 Dependencies
 Project Readme

KonoUtils¶ ↑

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.