Compare commits
6 commits
7834dd7188
...
0a2f26684b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a2f26684b | ||
|
|
a9f72b60af | ||
|
|
46e6014fea | ||
|
|
d6fba7e6e8 | ||
|
|
560a9442a7 | ||
|
|
93b578c3cf |
8 changed files with 202 additions and 32 deletions
|
|
@ -1,6 +1,9 @@
|
||||||
class DayLogsController < ApplicationController
|
class DayLogsController < ApplicationController
|
||||||
def new
|
before_action :set_day_log, only: [ :update ]
|
||||||
@day_log = DayLog.new
|
|
||||||
|
def edit
|
||||||
|
@day_log = Current.user.day_logs.find_or_initialize_by(day: params[:day])
|
||||||
|
@mood = Current.user.moods.find_by(recorded_at: params[:day].to_date.beginning_of_day..params[:day].to_date.end_of_day)
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
|
@ -10,12 +13,25 @@ class DayLogsController < ApplicationController
|
||||||
handle_mood(@day_log.day, params[:day_log][:mode_id])
|
handle_mood(@day_log.day, params[:day_log][:mode_id])
|
||||||
redirect_to root_path
|
redirect_to root_path
|
||||||
else
|
else
|
||||||
render :new, status: :unprocessable_entity
|
render :new, status: :unprocessable_content
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
if @day_log.update(day_log_params)
|
||||||
|
handle_mood(@day_log.day, params[:day_log][:mode_id])
|
||||||
|
redirect_to dashboard_path
|
||||||
|
else
|
||||||
|
render :edit, status: :unprocessable_content
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def set_day_log
|
||||||
|
@day_log = Current.user.day_logs.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
def handle_mood(day, mode_id)
|
def handle_mood(day, mode_id)
|
||||||
return if mode_id.blank?
|
return if mode_id.blank?
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,19 @@
|
||||||
import { Controller } from '@hotwired/stimulus'
|
import { Controller } from '@hotwired/stimulus'
|
||||||
|
|
||||||
export default class extends Controller {
|
export default class extends Controller {
|
||||||
static targets = [ "image", "modeDay" ];
|
static targets = [ "image", "modeDay", "dayLogLink" ];
|
||||||
|
|
||||||
updateDayInfo(event) {
|
updateDayInfo(event) {
|
||||||
const image = this.imageTarget;
|
const image = this.imageTarget;
|
||||||
const modeDay = this.modeDayTarget;
|
const modeDay = this.modeDayTarget;
|
||||||
const modeDayContent = event.target.dataset.day + ' : ' + event.target.dataset.mode;
|
const day = event.target.dataset.day;
|
||||||
|
const modeDayContent = day + ' : ' + event.target.dataset.mode;
|
||||||
image.src = event.target.dataset.image;
|
image.src = event.target.dataset.image;
|
||||||
modeDay.textContent = modeDayContent;
|
modeDay.textContent = modeDayContent;
|
||||||
event.target.className = "selected-day " + event.target.dataset.mode;
|
event.target.className = "selected-day " + event.target.dataset.mode;
|
||||||
|
|
||||||
|
this.dayLogLinkTarget.href = `/day_logs/edit?day=${day}`
|
||||||
|
|
||||||
if (this.lastTarget) {
|
if (this.lastTarget) {
|
||||||
this.lastTarget.className = "day " + this.lastTarget.dataset.mode;
|
this.lastTarget.className = "day " + this.lastTarget.dataset.mode;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
20
app/views/day_logs/_form.html.haml
Normal file
20
app/views/day_logs/_form.html.haml
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
= form_with model: day_log do |f|
|
||||||
|
- @day_log.errors.full_messages.each do |msg|
|
||||||
|
%p= msg
|
||||||
|
|
||||||
|
.field
|
||||||
|
= f.label :day
|
||||||
|
= f.date_field :day
|
||||||
|
|
||||||
|
.field
|
||||||
|
= f.label :info
|
||||||
|
= f.text_area :info
|
||||||
|
|
||||||
|
.field
|
||||||
|
= label_tag :mode_id, "Mode"
|
||||||
|
= select_tag "day_log[mode_id]",
|
||||||
|
options_from_collection_for_select(Current.user.modes, :id, :label, @mood&.mode_id),
|
||||||
|
include_blank: true
|
||||||
|
|
||||||
|
= f.submit
|
||||||
|
|
||||||
3
app/views/day_logs/edit.html.haml
Normal file
3
app/views/day_logs/edit.html.haml
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
%h1 Modifier le journal
|
||||||
|
|
||||||
|
= render 'form', day_log: @day_log
|
||||||
|
|
@ -1,21 +1,3 @@
|
||||||
%h1 Nouveau journal
|
%h1 Nouveau journal
|
||||||
|
|
||||||
= form_with model: @day_log do |f|
|
= render 'form', day_log: @day_log
|
||||||
- @day_log.errors.full_messages.each do |msg|
|
|
||||||
%p= msg
|
|
||||||
|
|
||||||
.field
|
|
||||||
= f.label :day
|
|
||||||
= f.date_field :day
|
|
||||||
|
|
||||||
.field
|
|
||||||
= f.label :info
|
|
||||||
= f.text_area :info
|
|
||||||
|
|
||||||
.field
|
|
||||||
= label_tag :mode_id, "Mode"
|
|
||||||
= select_tag "day_log[mode_id]",
|
|
||||||
options_from_collection_for_select(Current.user.modes, :id, :label),
|
|
||||||
include_blank: true
|
|
||||||
|
|
||||||
= f.submit
|
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,10 @@
|
||||||
<div class="title is-4">
|
<div class="title is-4">
|
||||||
<span class="icon"><i class="fa-regular fa-calendar"></i></span>
|
<span class="icon"><i class="fa-regular fa-calendar"></i></span>
|
||||||
<span data-mood-target="modeDay">Aujourd'hui : <%= @user.current_mode.label %></span>
|
<span data-mood-target="modeDay">Aujourd'hui : <%= @user.current_mode.label %></span>
|
||||||
|
<%= link_to "Journal", edit_day_log_for_day_path(day: Date.today), "data-mood-target": "dayLogLink" %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="logs">
|
<div class="logs">
|
||||||
<div class="is-flex is-flex-direction-row is-flex-wrap-wrap mb-3">
|
<div class="is-flex is-flex-direction-row is-flex-wrap-wrap mb-3">
|
||||||
<% @user.history.each do |month| %>
|
<% @user.history.each do |month| %>
|
||||||
|
|
|
||||||
|
|
@ -22,5 +22,6 @@ Rails.application.routes.draw do
|
||||||
|
|
||||||
get "/moods", to: "moods#index", as: :dashboard
|
get "/moods", to: "moods#index", as: :dashboard
|
||||||
|
|
||||||
resources :day_logs, only: [ :new, :create ]
|
get "/day_logs/edit", to: "day_logs#edit", as: :edit_day_log_for_day
|
||||||
|
resources :day_logs, only: [ :create, :update ]
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,10 @@ describe "DayLogs", type: :request do
|
||||||
let(:mode) { create(:mode, user: user) }
|
let(:mode) { create(:mode, user: user) }
|
||||||
let(:day) { Date.parse("2026-01-15") }
|
let(:day) { Date.parse("2026-01-15") }
|
||||||
|
|
||||||
describe "GET /day_logs/new" do
|
describe "GET /day_logs/edit" do
|
||||||
context "when not authenticated" do
|
context "when not authenticated" do
|
||||||
it "redirects to the login page" do
|
it "redirects to the login page" do
|
||||||
get new_day_log_path
|
get edit_day_log_for_day_path(day: day)
|
||||||
expect(response).to redirect_to(new_session_path)
|
expect(response).to redirect_to(new_session_path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -16,11 +16,28 @@ describe "DayLogs", type: :request do
|
||||||
context "when authenticated" do
|
context "when authenticated" do
|
||||||
before { login_as(user) }
|
before { login_as(user) }
|
||||||
|
|
||||||
|
context "with an existing day_log for the day" do
|
||||||
|
let!(:day_log) { create(:day_log, user: user, day: day) }
|
||||||
|
|
||||||
it "returns http success" do
|
it "returns http success" do
|
||||||
get new_day_log_path
|
get edit_day_log_for_day_path(day: day)
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "without an existing day_log for the day" do
|
||||||
|
it "returns http success" do
|
||||||
|
get edit_day_log_for_day_path(day: day)
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "does not persist a day_log" do
|
||||||
|
expect {
|
||||||
|
get edit_day_log_for_day_path(day: day)
|
||||||
|
}.not_to change(DayLog, :count)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "POST /day_logs" do
|
describe "POST /day_logs" do
|
||||||
|
|
@ -98,9 +115,135 @@ describe "DayLogs", type: :request do
|
||||||
}.not_to change(DayLog, :count)
|
}.not_to change(DayLog, :count)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns unprocessable entity" do
|
it "returns unprocessable content" do
|
||||||
post day_logs_path, params: { day_log: { day: nil, info: nil } }
|
post day_logs_path, params: { day_log: { day: nil, info: nil } }
|
||||||
expect(response).to have_http_status(:unprocessable_entity)
|
expect(response).to have_http_status(:unprocessable_content)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "GET /day_logs/:id/edit" do
|
||||||
|
let!(:day_log) { create(:day_log, user: user, day: day) }
|
||||||
|
|
||||||
|
context "when not authenticated" do
|
||||||
|
it "redirects to the login page" do
|
||||||
|
get edit_day_log_path(day_log)
|
||||||
|
expect(response).to redirect_to(new_session_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when authenticated" do
|
||||||
|
before { login_as(user) }
|
||||||
|
|
||||||
|
it "returns http success" do
|
||||||
|
get edit_day_log_path(day_log)
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "GET /day_logs/edit" do
|
||||||
|
context "when not authenticated" do
|
||||||
|
it "redirects to the login page" do
|
||||||
|
get edit_day_log_for_day_path(day: day)
|
||||||
|
expect(response).to redirect_to(new_session_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when authenticated" do
|
||||||
|
before { login_as(user) }
|
||||||
|
|
||||||
|
context "with an existing day_log for the day" do
|
||||||
|
let!(:day_log) { create(:day_log, user: user, day: day) }
|
||||||
|
|
||||||
|
it "returns http success" do
|
||||||
|
get edit_day_log_for_day_path(day: day)
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "without an existing day_log for the day" do
|
||||||
|
it "returns http success" do
|
||||||
|
get edit_day_log_for_day_path(day: day)
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "does not persist a day_log" do
|
||||||
|
expect {
|
||||||
|
get edit_day_log_for_day_path(day: day)
|
||||||
|
}.not_to change(DayLog, :count)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "PATCH /day_logs/:id" do
|
||||||
|
let!(:day_log) { create(:day_log, user: user, day: day) }
|
||||||
|
|
||||||
|
context "when not authenticated" do
|
||||||
|
it "redirects to the login page" do
|
||||||
|
patch day_log_path(day_log), params: { day_log: { info: "Nouvelle info" } }
|
||||||
|
expect(response).to redirect_to(new_session_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when authenticated" do
|
||||||
|
before { login_as(user) }
|
||||||
|
|
||||||
|
context "with valid params" do
|
||||||
|
context "without mode" do
|
||||||
|
it "updates the day_log" do
|
||||||
|
patch day_log_path(day_log), params: { day_log: { info: "Nouvelle info" } }
|
||||||
|
expect(day_log.reload.info).to eq("Nouvelle info")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "does not create a mood" do
|
||||||
|
expect {
|
||||||
|
patch day_log_path(day_log), params: { day_log: { info: "Nouvelle info" } }
|
||||||
|
}.not_to change(Mood, :count)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "redirects to dashboard" do
|
||||||
|
patch day_log_path(day_log), params: { day_log: { info: "Nouvelle info" } }
|
||||||
|
expect(response).to redirect_to(dashboard_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with mode, no existing mood" do
|
||||||
|
it "creates a mood" do
|
||||||
|
expect {
|
||||||
|
patch day_log_path(day_log), params: { day_log: { info: "Nouvelle info", mode_id: mode.id } }
|
||||||
|
}.to change(Mood, :count).by(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with mode, existing mood" do
|
||||||
|
let!(:existing_mood) { create(:mood, user: user, mode: mode, recorded_at: DateTime.parse("2026-01-15 08:00:00")) }
|
||||||
|
let(:other_mode) { create(:mode, user: user) }
|
||||||
|
|
||||||
|
it "does not create a new mood" do
|
||||||
|
expect {
|
||||||
|
patch day_log_path(day_log), params: { day_log: { info: "Nouvelle info", mode_id: other_mode.id } }
|
||||||
|
}.not_to change(Mood, :count)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "updates the existing mood mode" do
|
||||||
|
patch day_log_path(day_log), params: { day_log: { info: "Nouvelle info", mode_id: other_mode.id } }
|
||||||
|
expect(existing_mood.reload.mode).to eq(other_mode)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with invalid params" do
|
||||||
|
it "does not update the day_log" do
|
||||||
|
patch day_log_path(day_log), params: { day_log: { info: nil } }
|
||||||
|
expect(day_log.reload.info).not_to be_nil
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns unprocessable content" do
|
||||||
|
patch day_log_path(day_log), params: { day_log: { info: nil } }
|
||||||
|
expect(response).to have_http_status(:unprocessable_content)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue