aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app/app.rs4
-rw-r--r--src/app/calendar.rs23
-rw-r--r--src/app/form.rs5
-rw-r--r--src/app/update.rs29
-rw-r--r--src/db/migrations/1-init.sql2
-rw-r--r--src/db/mod.rs17
-rw-r--r--src/model/event.rs5
7 files changed, 46 insertions, 39 deletions
diff --git a/src/app/app.rs b/src/app/app.rs
index 45904a9..d93b544 100644
--- a/src/app/app.rs
+++ b/src/app/app.rs
@@ -17,6 +17,7 @@ pub struct App {
pub events: Vec<Event>,
pub today: NaiveDate,
pub start_date: NaiveDate,
+ pub tx: Sender<Msg>,
}
impl App {
@@ -35,7 +36,7 @@ impl App {
let start_date =
NaiveDate::from_isoywd(today.year(), today.iso_week().week(), Weekday::Mon);
let events = db::list(&conn).unwrap_or(vec![]);
- let grid = calendar::grid(tx, &today, &start_date, &events);
+ let grid = calendar::create(tx.clone(), &today, &start_date, &events);
window.set_child(Some(&grid));
@@ -52,6 +53,7 @@ impl App {
events,
today,
start_date,
+ tx,
}
}
}
diff --git a/src/app/calendar.rs b/src/app/calendar.rs
index 847ea71..250101f 100644
--- a/src/app/calendar.rs
+++ b/src/app/calendar.rs
@@ -5,14 +5,14 @@ use chrono::{Datelike, NaiveDate};
use gtk::glib;
use gtk::prelude::*;
-use crate::{app::update, app::update::Msg, model::event::Event};
+use crate::{app::update, app::update::Msg, app::App, model::event::Event};
static DAYS: [&str; 7] = ["LUN", "MAR", "MER", "JEU", "VEN", "SAM", "DIM"];
static MONTHES: [&str; 12] = [
"Jan", "Fév", "Mar", "Avr", "Mai", "Juin", "Juil", "Aoû", "Sep", "Oct", "Nov", "Déc",
];
-pub fn grid(
+pub fn create(
tx: Sender<Msg>,
today: &NaiveDate,
start_date: &NaiveDate,
@@ -24,12 +24,12 @@ pub fn grid(
grid.attach(&day_title(col), col, 0, 1, 1);
}
- show_days(tx, &grid, &start_date, &today, &events);
+ attach_days(tx, &grid, &start_date, &today, &events);
grid
}
-fn show_days(
+fn attach_days(
tx: Sender<Msg>,
grid: &gtk::Grid,
start_date: &NaiveDate,
@@ -45,6 +45,21 @@ fn show_days(
}
}
+pub fn refresh_date(app: &App, date: NaiveDate) {
+ let d = date.signed_duration_since(app.start_date).num_days();
+
+ let col = (d % 7) as i32;
+ let row = 1 + (d / 7) as i32;
+
+ app.grid.attach(
+ &day_entry(app.tx.clone(), &date, &app.today, &app.events),
+ col,
+ row,
+ 1,
+ 1,
+ )
+}
+
fn day_title(col: i32) -> gtk::Box {
let vbox = gtk::Box::builder()
.orientation(gtk::Orientation::Vertical)
diff --git a/src/app/form.rs b/src/app/form.rs
index fc3dc83..08a2af1 100644
--- a/src/app/form.rs
+++ b/src/app/form.rs
@@ -6,10 +6,11 @@ use gtk::glib;
use gtk::prelude::*;
use rusqlite::Connection;
use std::rc::Rc;
+use uuid::Uuid;
use crate::{app::update, app::update::Msg, db, model::event};
-pub async fn dialog(
+pub async fn show(
conn: Rc<Connection>,
tx: Sender<Msg>,
window: Rc<gtk::ApplicationWindow>,
@@ -49,7 +50,7 @@ pub async fn dialog(
let button = gtk::Button::with_label("Créer");
vbox.append(&button);
button.connect_clicked(glib::clone!(@weak dialog => move |_| {
- match event::validate(date.buffer().text(), name.buffer().text(), start.buffer().text(), end.buffer().text()) {
+ match event::validate(Uuid::new_v4(), date.buffer().text(), name.buffer().text(), start.buffer().text(), end.buffer().text()) {
Some(event) => {
match db::insert(&conn, &event) {
Ok(_) => {
diff --git a/src/app/update.rs b/src/app/update.rs
index 288ec51..e7bf7af 100644
--- a/src/app/update.rs
+++ b/src/app/update.rs
@@ -1,16 +1,12 @@
-use gtk4 as gtk;
-
use async_channel::{Receiver, Sender};
use chrono::NaiveDate;
-use gtk::prelude::*;
use rusqlite::Connection;
use std::rc::Rc;
-use crate::app::calendar;
-use crate::app::form;
-use crate::app::utils;
-use crate::app::App;
-use crate::model::event::Event;
+use crate::{
+ app::{calendar, form, utils, App},
+ model::event::Event,
+};
pub fn send(tx: Sender<Msg>, msg: Msg) {
utils::spawn(async move {
@@ -27,25 +23,12 @@ pub async fn event_handler(conn: Rc<Connection>, rx: Receiver<Msg>, tx: Sender<M
while let Ok(msg) = rx.recv().await {
match msg {
Msg::ShowAddForm { date } => {
- form::dialog(Rc::clone(&conn), tx.clone(), Rc::clone(&app.window), date).await;
+ form::show(Rc::clone(&conn), tx.clone(), Rc::clone(&app.window), date).await;
}
Msg::AddEvent { event } => {
let date = event.date.clone();
-
- let d = date.signed_duration_since(app.start_date).num_days();
-
app.events.push(event);
-
- let col = (d % 7) as i32;
- let row = 1 + (d / 7) as i32;
-
- app.grid.attach(
- &calendar::day_entry(tx.clone(), &date, &app.today, &app.events),
- col,
- row,
- 1,
- 1,
- );
+ calendar::refresh_date(&app, date);
}
}
}
diff --git a/src/db/migrations/1-init.sql b/src/db/migrations/1-init.sql
index 72fab80..39b845b 100644
--- a/src/db/migrations/1-init.sql
+++ b/src/db/migrations/1-init.sql
@@ -1,5 +1,5 @@
CREATE TABLE IF NOT EXISTS "events" (
- "id" INTEGER PRIMARY KEY,
+ "id" VARCHAR PRIMARY KEY,
"date" VARCHAR NOT NULL,
"start" VARCHAR NULL,
"end" VARCHAR NULL,
diff --git a/src/db/mod.rs b/src/db/mod.rs
index 6cfa2eb..23cec7e 100644
--- a/src/db/mod.rs
+++ b/src/db/mod.rs
@@ -1,6 +1,7 @@
use anyhow::Result;
use rusqlite::{params, Connection};
use rusqlite_migration::{Migrations, M};
+use uuid::Uuid;
use crate::model::event::Event;
@@ -13,22 +14,24 @@ pub fn init() -> Result<Connection> {
pub fn insert(conn: &Connection, event: &Event) -> Result<()> {
conn.execute(
- "INSERT INTO events (date, start, end, name, created, updated) VALUES (?, ?, ?, ?, datetime(), datetime())",
- params![event.date, event.start, event.end, event.name]
+ "INSERT INTO events (id, date, start, end, name, created, updated) VALUES (?, ?, ?, ?, ?, datetime(), datetime())",
+ params![event.id.to_hyphenated().to_string(), event.date, event.start, event.end, event.name]
)?;
Ok(())
}
pub fn list(conn: &Connection) -> Result<Vec<Event>> {
- let mut stmt = conn.prepare("SELECT date, start, end, name FROM events")?;
+ let mut stmt = conn.prepare("SELECT id, date, start, end, name FROM events")?;
let iter = stmt.query_map([], |row| {
+ let uuid: String = row.get(0)?;
Ok(Event {
- date: row.get(0)?,
- start: row.get(1)?,
- end: row.get(2)?,
- name: row.get(3)?,
+ id: Uuid::parse_str(&uuid).unwrap(),
+ date: row.get(1)?,
+ start: row.get(2)?,
+ end: row.get(3)?,
+ name: row.get(4)?,
})
})?;
diff --git a/src/model/event.rs b/src/model/event.rs
index a0bdc85..27587bc 100644
--- a/src/model/event.rs
+++ b/src/model/event.rs
@@ -1,10 +1,12 @@
use chrono::Timelike;
use chrono::{NaiveDate, NaiveTime};
+use uuid::Uuid;
pub static DATE_FORMAT: &str = "%d/%m/%Y";
#[derive(Debug, Clone)]
pub struct Event {
+ pub id: Uuid,
pub date: NaiveDate,
pub start: Option<NaiveTime>,
pub end: Option<NaiveTime>,
@@ -50,7 +52,7 @@ fn parse_time(t: &str) -> Option<NaiveTime> {
// Validation
-pub fn validate(date: String, name: String, start: String, end: String) -> Option<Event> {
+pub fn validate(id: Uuid, date: String, name: String, start: String, end: String) -> Option<Event> {
let start = validate_time(start)?;
let end = validate_time(end)?;
@@ -60,6 +62,7 @@ pub fn validate(date: String, name: String, start: String, end: String) -> Optio
}
Some(Event {
+ id,
date: NaiveDate::parse_from_str(&date, DATE_FORMAT).ok()?,
name: validate_name(name)?,
start,