Skip to content
Francesco Zaia edited this page Mar 8, 2021 · 5 revisions

I componenti principali dell'agenda del ministro sono:

  1. La sezione agenda, presente nella homepage e nella pagina del ministro
  2. La pagina agenda, con l'elenco degli eventi organizzati per mese a partire dal mese corrente
  3. La pagina archivio, con l'elenco degli eventi iniziando dal mese corrente e indietro nel tempo
  4. Le pagine dei singoli eventi

1. Sezione Agenda

Il codice per questa sezione si trova nel partial "partials/schedule". La parte in alto di questa sezione fa visualizzare dei tab con un massimo di 8 date facendo un loop sulla collezione dates_shown definita in config.rb.

  def dates_shown
    nearest = nearest_date.strftime("%d%B%Y")
    active_index = days_in_minister_schedule.index(nearest)
    start = active_index - 3
    finish = active_index + 4
    days_in_minister_schedule[start..finish]
  end

La collezione contiene fino a 8 elementi. Ognuno di essi è una stringa che rappresenta una data per la quale c'è almeno un evento nella agenda. All'indice 3 si trova la data più vicina al giorno corrente, i tre elementi precedenti hanno le tre date precedenti a quella centrale, e i 4 elementi successivi sono le quattro date successive a quella centrale.

Gli elementi nella collezione dates_shown sono stringhe create attraverso metodo strftime("%d%B%Y") su un oggetto DateTime. La data che viene visualizzata deve essere formattata per ogni elemento usando prima DateTime.parse per trasformare l'elemento di nuovo in un oggetto DateTime e poi usando il metodo strftime("%d") per il numero del giorno del mese o strftime("%#b") per il mese.

I tabs della sezione mostrano gli eventi per ogni data facendo un loop sulla collezione dates_shown e poi un altro loop sulla collezione schedule_events_by_day per ogni elemento in dates_shown.

2. Pagina Agenda

La pagina agenda è nel template schedule.html e riceve la collezione items che corresponde alla collezione events_by_month definita in config.rb, passata al metodo paginate_with_fallback per renderla accessibile al template schedule.html.

    events_by_month = months.each_with_object({}) do |month, h|
      h[month] = (events_by_day.select do |k, v|
        k.downcase.include?(month.downcase)
      end)
    end

    paginate_with_fallback(events_by_month,
                           dato.schedule_page,
                           dato.minister_page,
                           locale,
                           "schedule")

La collezione è un Ruby hash con key/value pairs dove ogni key corrisponde a un mese, mentre il value è a sua volta una collezione di key/value pairs. In questa collezione ogni key è un giorno e il value e un array di eventi. La collezione accessibile dentro il template schedule.html contiene come primo key il mese corrente e poi i mesi successivi nel tempo.

3. Pagina Archivio

La struttura è uguale a quella della pagina agenda ma la collezione accessibile at template archive.html contiene come primo key il mese corrente e poi i mesi precedenti andando indietro nel tempo.

    archive_events_by_month = months_in_archive.each_with_object({}) do |month, h|
      h[month] = (archive_events_by_day.select do |k, v|
        k.downcase.include?(month.downcase)
      end)
    end

    paginate_with_fallback(archive_events_by_month,
                           dato.schedule_archive_page,
                           dato.minister_page,
                           locale,
                           "archive")

4. Pagine dei singoli eventi

Il template per questa pagina è schedule_event.html e consiste in 2 partial, header-basic (hero) e page-content a cui vengono passati tutti i contenuti della pagina provenienti da Dato con la variabile locale page.

Clone this wiki locally