Added add column button

This commit is contained in:
Johannes Randerath 2024-08-28 22:18:53 +02:00
parent 6133499e98
commit 0c2c428ce4
5 changed files with 94 additions and 13 deletions

View File

@ -4,7 +4,7 @@ use crate::models;
use crate::schema; use crate::schema;
use crate::jrtables; use crate::jrtables;
use models::{ Jrcolumn, NewJrcolumn }; use models::{ Jrcolumn, NewJrcolumn };
use schema::jrcolumns::dsl::{ jrcolumns, id, name, jrtable_id, id_in_table }; use schema::jrcolumns::dsl::{ jrcolumns, id, name, jrtable_id, id_in_table, column_type };
pub fn create_jrcolumn(conn: &mut MysqlConnection, tblid: i32, clmnname: String, clmtype: crate::FIELDTYPE) -> Result<usize, diesel::result::Error> { pub fn create_jrcolumn(conn: &mut MysqlConnection, tblid: i32, clmnname: String, clmtype: crate::FIELDTYPE) -> Result<usize, diesel::result::Error> {
@ -78,17 +78,17 @@ pub fn get_clmid_relative(conn: &mut MysqlConnection, tblid: i32, idintbl: i32)
.first::<i32>(conn) .first::<i32>(conn)
} }
pub fn rename_column_relative(conn: &mut MysqlConnection, tblid: i32, id_in_tbl: i32, new_name: String) -> Result<usize, diesel::result::Error> { pub fn edit_column_relative(conn: &mut MysqlConnection, tblid: i32, id_in_tbl: i32, new_name: &String, clmtype: crate::FIELDTYPE) -> Result<usize, diesel::result::Error> {
let clmid = get_clmid_relative(conn, tblid, id_in_tbl); let clmid = get_clmid_relative(conn, tblid, id_in_tbl);
if clmid.is_err() { if clmid.is_err() {
return Err(clmid.err().unwrap()); return Err(clmid.err().unwrap());
} }
rename_column(conn, clmid.unwrap(), new_name) edit_column(conn, clmid.unwrap(), new_name, clmtype)
} }
pub fn rename_column(conn: &mut MysqlConnection, clmnid: i32, new_name: String) -> Result<usize, diesel::result::Error> { pub fn edit_column(conn: &mut MysqlConnection, clmnid: i32, new_name: &String, clmtype: crate::FIELDTYPE) -> Result<usize, diesel::result::Error> {
diesel::update(jrcolumns.find(clmnid)) diesel::update(jrcolumns.find(clmnid))
.set(name.eq(new_name)) .set((name.eq(new_name), column_type.eq(clmtype as i32)))
.execute(conn) .execute(conn)
} }

View File

@ -185,7 +185,7 @@ pub fn search_table(tbl: Tbl, search_fields: Vec<i32>, search_value: String) ->
let mut field_sets = HashSet::new(); let mut field_sets = HashSet::new();
for field in search_fields { for field in search_fields {
for row in &rows { for row in &rows {
if row.cells[field as usize].to_lowercase().contains(&search_value) { if row.cells[field as usize].to_lowercase().contains(&search_value.to_lowercase()) {
field_sets.insert(row.clone()); field_sets.insert(row.clone());
} }
} }
@ -405,11 +405,11 @@ pub fn delete_column(conn: &mut MysqlConnection, tblid: i32, column_pos: i32, ui
Some(true) Some(true)
} }
pub fn rename_column(conn: &mut MysqlConnection, tblid: i32, column_pos: i32, new_name: String, uid: i32) -> Option<bool> { pub fn edit_column(conn: &mut MysqlConnection, tblid: i32, column_pos: i32, new_name: &String, new_type: FIELDTYPE, uid: i32) -> Option<bool> {
let owner = jrtables::get_owner_id(conn, tblid); let owner = jrtables::get_owner_id(conn, tblid);
if owner.is_err() || if owner.is_err() ||
owner.unwrap() != uid || owner.unwrap() != uid ||
jrcolumns::rename_column_relative(conn, tblid, column_pos, new_name).is_err() jrcolumns::edit_column_relative(conn, tblid, column_pos, new_name, new_type).is_err()
{ {
return None; return None;
} }

View File

@ -67,7 +67,7 @@ async fn rocket() -> _ {
.mount("/", routes![auth::oauth_login, auth::oauth_callback, home, login_home]) .mount("/", routes![auth::oauth_login, auth::oauth_callback, home, login_home])
.mount("/table", routes![table::table, table::table_sec, table::edit_tname, table::create, table::import_table, table::delete_table]) .mount("/table", routes![table::table, table::table_sec, table::edit_tname, table::create, table::import_table, table::delete_table])
.mount("/row", routes![table::new_entry, table::edit_entry, table::delete_entry]) .mount("/row", routes![table::new_entry, table::edit_entry, table::delete_entry])
.mount("/column", routes![table::delete_column]) .mount("/column", routes![table::delete_column, table::edit_column])
.register("/", catchers![auth::redirect_to_login]) .register("/", catchers![auth::redirect_to_login])
.mount("/static", FileServer::from(relative!("static"))) .mount("/static", FileServer::from(relative!("static")))

View File

@ -17,6 +17,21 @@ struct DeleteColumn {
id_in_table: i32, id_in_table: i32,
} }
#[derive(FromForm)]
struct EditColumn {
tblid: i32,
id_in_table: i32,
name: String,
column_type: isize,
}
#[derive(FromForm)]
struct NewColumn {
tblid: i32,
name: String,
column_type: isize,
}
#[derive(FromForm)] #[derive(FromForm)]
struct NewEntry { struct NewEntry {
tblid: i32, tblid: i32,
@ -201,6 +216,29 @@ pub async fn delete_entry(conn: Db, data: Form<DeleteEntry>, user: AuthUser) ->
Ok(Redirect::to(uri!("/table", table_sec(tblid)))) Ok(Redirect::to(uri!("/table", table_sec(tblid))))
} }
#[post("/create", data="<data>")]
pub async fn create_column(conn: Db, data: Form<NewColumn>, user: AuthUser) -> Result<Redirect, Status> {
let uid = user.uid;
let tblid = data.tblid;
let coltype = FIELDTYPE::from(data.column_type);
if conn.run(move |c| inventur_db::add_column(c, tblid, data.name.clone(), coltype, uid)).await.is_none() {
return Err(Status::Forbidden);
}
Ok(Redirect::to(uri!("/table", table_sec(tblid))))
}
#[post("/edit", data="<data>")]
pub async fn edit_column(conn: Db, data: Form<EditColumn>, user: AuthUser) -> Result<Redirect, Status> {
let uid = user.uid;
let tblid = data.tblid;
let idintbl = data.id_in_table;
let clmtype = FIELDTYPE::from(data.column_type);
if conn.run(move |c| inventur_db::edit_column(c, tblid, idintbl, &data.name, clmtype, uid)).await.is_none() {
return Err(Status::Forbidden);
}
Ok(Redirect::to(uri!("/table", table_sec(tblid))))
}
#[post("/delete", data="<data>")] #[post("/delete", data="<data>")]
pub async fn delete_column(conn: Db, data: Form<DeleteColumn>, user: AuthUser) -> Result<Redirect, Status> { pub async fn delete_column(conn: Db, data: Form<DeleteColumn>, user: AuthUser) -> Result<Redirect, Status> {
let uid = user.uid; let uid = user.uid;

View File

@ -73,6 +73,7 @@
document.getElementById('form_edit_column_type').value = column_types[clmn_index]; document.getElementById('form_edit_column_type').value = column_types[clmn_index];
document.getElementById('modal_caller').innerHTML = column_names[clmn_index]; document.getElementById('modal_caller').innerHTML = column_names[clmn_index];
document.getElementById('form_delete_column_idintbl').value = clmn_index + 1; document.getElementById('form_delete_column_idintbl').value = clmn_index + 1;
document.getElementById('form_edit_column_idintbl').value = clmn_index + 1;
} }
</script> </script>
{% endblock script %} {% endblock script %}
@ -84,7 +85,7 @@
<div class="col-auto"> <div class="col-auto">
<div class="btn-toolbar mt-2" role="toolbar"> <div class="btn-toolbar mt-2" role="toolbar">
<div class="btn-group me-2"> <div class="btn-group me-2">
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#new_item"><i class="bi bi-plus-lg"></i></button> <button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#create_entry_modal"><i class="bi bi-plus-lg"></i></button>
</div> </div>
<form method="get" action="/table/{{ tblid }}"> <form method="get" action="/table/{{ tblid }}">
<div class="input-group"> <div class="input-group">
@ -116,6 +117,7 @@
</div> </div>
<div class="col-auto"> <div class="col-auto">
<div class="btn-toolbar"> <div class="btn-toolbar">
<button class="btn" data-bs-toggle="modal" data-bs-target="#create_column_modal" type="button" onclick=""><i class="bi bi-bookmark-plus"></i></button>
<form method="GET" action="/table/{{ tblid }}"> <form method="GET" action="/table/{{ tblid }}">
<input value="0" name="sort_field" hidden /> <input value="0" name="sort_field" hidden />
<input value="{% if sort_field == 0 %}{{ (sort_dir + 1) % 2}}{% else %}0{% endif %}" name="sort_dir" hidden /> <input value="{% if sort_field == 0 %}{{ (sort_dir + 1) % 2}}{% else %}0{% endif %}" name="sort_dir" hidden />
@ -170,12 +172,12 @@
{% block more_modals %} {% block more_modals %}
<!-- Add new item --> <!-- Add new item -->
<div class="modal fade" id="new_item" tabindex="-1" aria-hidden="true"> <div class="modal fade" id="create_entry_modal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h1 class="modal-title fs-5">Add entry</h1> <h1 class="modal-title fs-5">Add entry</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" onclick="document.getElementById('form_edit_entry').reset();"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<h5>Cell values:</h5> <h5>Cell values:</h5>
@ -216,7 +218,7 @@
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h1 class="modal-title fs-5"><div class="row"><div class="col-auto">Row <span id="modal_caller"></span></div><div class="col-auto"><i class="bi bi-pencil-fill"></i></div></div></h1> <h1 class="modal-title fs-5"><div class="row"><div class="col-auto">Row <span id="modal_caller"></span></div><div class="col-auto"><i class="bi bi-pencil-fill"></i></div></div></h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" onclick="document.getElementById('form_edit_entry').reset();"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form action="/row/edit" method="post" id="form_edit_entry"> <form action="/row/edit" method="post" id="form_edit_entry">
@ -255,6 +257,44 @@
</div> </div>
</div> </div>
<!-- Add column -->
<div class="modal fade" id="create_column_modal" tabindex="-1" aria-hidden="true" onclick="document.getElementById('form_edit_entry').reset();">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5">New column</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="/column/create" method="post" id="form_create_column">
<input name="tblid" value="{{ tblid }}" hidden>
<div class="mb-3">
<div class="row">
<div class="col-auto">
<label for="form_create_column_name" class="form-label">Name:</label>
<input type="text" class="form-control" name="name" id="form_create_column_name" />
</div>
<div class="col-auto">
<label for="form_create_column_type" class="form-label">Type</label>
<select class="form-select" name="column_type" id="form_create_column_type">
<option value="0">Text</option>
<option value="1">Number</option>
</select>
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<div class="col-auto">
<button class="btn btn-secondary" data-bs-dismiss="modal" type="button" onclick="document.getElementById('form_create_column').reset();"><i class="bi bi-x"></i></button>
<button class="btn btn-primary" type="button" onclick="document.getElementById('form_create_column').submit().reset();"><i class="bi bi-check-lg"></i></button>
</div>
</div>
</div>
</div>
</div>
<!-- Edit column --> <!-- Edit column -->
<div class="modal fade" id="edit_column_modal" tabindex="-1" aria-hidden="true"> <div class="modal fade" id="edit_column_modal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
@ -266,6 +306,7 @@
<div class="modal-body"> <div class="modal-body">
<form action="/column/edit" method="post" id="form_edit_column"> <form action="/column/edit" method="post" id="form_edit_column">
<input name="tblid" value="{{ tblid }}" hidden> <input name="tblid" value="{{ tblid }}" hidden>
<input name="id_in_table" id="form_edit_column_idintbl" hidden>
<div class="mb-3"> <div class="mb-3">
<div class="row"> <div class="row">
<div class="col-auto"> <div class="col-auto">
@ -301,4 +342,6 @@
</div> </div>
</div> </div>
</div> </div>
{% endblock more_modals %} {% endblock more_modals %}