- drop Bulma and Font Awesome, plain CSS built on charte.css - dashboard: GitHub-like calendar grouped by year, selected day panel (sticky side column on desktop, bottom bar on mobile), keyboard navigation - public page: today's mood and last months fit in one screen, journal hidden - day log page: mode picker as pills, illustration follows the chosen mode - login, password and invitation screens in French, global flash messages - add User#current_mode_since Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
80 lines
2.6 KiB
Ruby
80 lines
2.6 KiB
Ruby
module MoodsHelper
|
|
# État d'un jour du calendrier :
|
|
# :filled une tasse a été posée ce jour-là
|
|
# :guessed pas de tasse posée, on suppose que le mode de la veille continue
|
|
# :unknown pas de tasse posée, et l'utilisateur ne veut pas de supposition
|
|
# :empty avant le premier enregistrement
|
|
# :future après aujourd'hui
|
|
def day_status(mood, user)
|
|
return :future if mood[:recorded_at].to_date > Date.current
|
|
return :filled if mood[:mode].present?
|
|
return :guessed if mood[:guess].present? && user.guess?
|
|
return :unknown if mood[:guess].present? && !user.guess?
|
|
:empty
|
|
end
|
|
|
|
def mode_for(mood, user)
|
|
case day_status(mood, user)
|
|
when :filled then mood[:mode]
|
|
when :guessed then mood[:guess]
|
|
end
|
|
end
|
|
|
|
# Les années du calendrier, la plus récente d'abord ; les mois dans l'ordre à l'intérieur.
|
|
def history_by_year(history)
|
|
history.group_by { |month| month[:month].year }.sort_by { |year, _| -year }
|
|
end
|
|
|
|
def find_day(history, date)
|
|
history.each do |month|
|
|
month[:weeks].each do |week|
|
|
week.each { |mood| return mood if mood[:recorded_at].to_date == date }
|
|
end
|
|
end
|
|
nil
|
|
end
|
|
|
|
def date_longue(date)
|
|
l(date, format: "%A %-d %B %Y")
|
|
end
|
|
|
|
def libelle_statut(status)
|
|
case status
|
|
when :guessed then "supposé"
|
|
when :unknown then "pas de tasse posée"
|
|
end
|
|
end
|
|
|
|
# Un jour du calendrier : un bouton pour le propriétaire, une simple case pour les visiteurs.
|
|
def case_jour(mood, user, interactive:, selected: false)
|
|
date = mood[:recorded_at].to_date
|
|
status = day_status(mood, user)
|
|
mode = mode_for(mood, user)
|
|
day_log = mood[:day_log] if interactive
|
|
|
|
description = [ date_longue(date), mode&.label, libelle_statut(status), ("journal écrit" if day_log) ].compact.join(", ")
|
|
classes = [ "jour", "jour-#{status}" ]
|
|
classes << "jour-journal" if day_log
|
|
classes << "jour-aujourdhui" if date == Date.current
|
|
options = { class: classes, style: ("--humeur: #{mode.color}" if mode), title: description }
|
|
|
|
if interactive && status != :future
|
|
tag.button(type: "button", **options,
|
|
tabindex: selected ? 0 : -1,
|
|
"aria-label": description,
|
|
"aria-pressed": selected.to_s,
|
|
data: {
|
|
day: date.iso8601,
|
|
date: date_longue(date),
|
|
mode: mode&.label,
|
|
statut: libelle_statut(status),
|
|
couleur: mode&.color,
|
|
image: (mode || Mode.new).image_url,
|
|
info: day_log&.info,
|
|
action: "calendrier#choisir keydown->calendrier#naviguer"
|
|
})
|
|
else
|
|
tag.span(**options, "aria-hidden": true)
|
|
end
|
|
end
|
|
end
|