135 lines
4.5 KiB
Rust
Raw Normal View History

use crate::services::cell::{
2022-08-14 15:15:56 +08:00
insert_checkbox_cell, insert_date_cell, insert_number_cell, insert_select_option_cell, insert_text_cell,
insert_url_cell,
};
2022-08-14 15:15:56 +08:00
use flowy_grid_data_model::revision::{gen_row_id, CellRevision, FieldRevision, RowRevision, DEFAULT_ROW_HEIGHT};
use indexmap::IndexMap;
2022-03-14 17:24:25 +08:00
use std::collections::HashMap;
2022-07-14 09:29:05 +08:00
use std::sync::Arc;
2022-03-13 11:06:28 +08:00
2022-07-12 15:49:14 +08:00
pub struct RowRevisionBuilder<'a> {
2022-08-10 17:59:28 +08:00
block_id: String,
2022-07-14 09:29:05 +08:00
field_rev_map: HashMap<&'a String, Arc<FieldRevision>>,
payload: CreateRowRevisionPayload,
2022-03-13 11:06:28 +08:00
}
2022-07-12 15:49:14 +08:00
impl<'a> RowRevisionBuilder<'a> {
2022-08-10 17:59:28 +08:00
pub fn new(block_id: &str, fields: &'a [Arc<FieldRevision>]) -> Self {
let field_rev_map = fields
2022-03-16 10:02:37 +08:00
.iter()
2022-07-14 09:29:05 +08:00
.map(|field| (&field.id, field.clone()))
.collect::<HashMap<&String, Arc<FieldRevision>>>();
2022-03-16 10:02:37 +08:00
let payload = CreateRowRevisionPayload {
2022-04-11 15:27:03 +08:00
row_id: gen_row_id(),
2022-03-14 17:24:25 +08:00
cell_by_field_id: Default::default(),
height: DEFAULT_ROW_HEIGHT,
visibility: true,
};
2022-03-16 10:02:37 +08:00
2022-08-10 17:59:28 +08:00
let block_id = block_id.to_string();
Self {
block_id,
field_rev_map,
payload,
}
2022-03-13 11:06:28 +08:00
}
pub fn insert_text_cell(&mut self, field_id: &str, data: String) {
match self.field_rev_map.get(&field_id.to_owned()) {
None => tracing::warn!("Can't find the text field with id: {}", field_id),
Some(field_rev) => {
self.payload
.cell_by_field_id
.insert(field_id.to_owned(), insert_text_cell(data, field_rev));
2022-03-16 10:02:37 +08:00
}
}
}
pub fn insert_url_cell(&mut self, field_id: &str, data: String) {
match self.field_rev_map.get(&field_id.to_owned()) {
None => tracing::warn!("Can't find the url field with id: {}", field_id),
Some(field_rev) => {
self.payload
.cell_by_field_id
.insert(field_id.to_owned(), insert_url_cell(data, field_rev));
}
}
}
pub fn insert_number_cell(&mut self, field_id: &str, num: i64) {
match self.field_rev_map.get(&field_id.to_owned()) {
None => tracing::warn!("Can't find the number field with id: {}", field_id),
Some(field_rev) => {
self.payload
.cell_by_field_id
.insert(field_id.to_owned(), insert_number_cell(num, field_rev));
}
}
}
pub fn insert_checkbox_cell(&mut self, field_id: &str, is_check: bool) {
match self.field_rev_map.get(&field_id.to_owned()) {
None => tracing::warn!("Can't find the checkbox field with id: {}", field_id),
Some(field_rev) => {
self.payload
.cell_by_field_id
.insert(field_id.to_owned(), insert_checkbox_cell(is_check, field_rev));
2022-04-07 15:34:00 +08:00
}
}
}
pub fn insert_date_cell(&mut self, field_id: &str, timestamp: i64) {
match self.field_rev_map.get(&field_id.to_owned()) {
None => tracing::warn!("Can't find the date field with id: {}", field_id),
Some(field_rev) => {
self.payload
.cell_by_field_id
.insert(field_id.to_owned(), insert_date_cell(timestamp, field_rev));
2022-04-07 15:34:00 +08:00
}
}
}
pub fn insert_select_option_cell(&mut self, field_id: &str, data: String) {
match self.field_rev_map.get(&field_id.to_owned()) {
None => tracing::warn!("Can't find the select option field with id: {}", field_id),
Some(field_rev) => {
self.payload
.cell_by_field_id
.insert(field_id.to_owned(), insert_select_option_cell(data, field_rev));
2022-03-16 10:02:37 +08:00
}
}
2022-03-14 17:24:25 +08:00
}
#[allow(dead_code)]
pub fn height(mut self, height: i32) -> Self {
2022-03-18 21:04:01 +08:00
self.payload.height = height;
2022-03-14 17:24:25 +08:00
self
}
#[allow(dead_code)]
pub fn visibility(mut self, visibility: bool) -> Self {
2022-03-18 21:04:01 +08:00
self.payload.visibility = visibility;
2022-03-13 11:06:28 +08:00
self
}
2022-08-10 17:59:28 +08:00
pub fn build(self) -> RowRevision {
2022-07-12 15:49:14 +08:00
RowRevision {
id: self.payload.row_id,
2022-08-10 17:59:28 +08:00
block_id: self.block_id,
2022-07-12 15:49:14 +08:00
cells: self.payload.cell_by_field_id,
height: self.payload.height,
visibility: self.payload.visibility,
}
2022-03-14 17:24:25 +08:00
}
}
pub struct CreateRowRevisionPayload {
2022-03-14 17:24:25 +08:00
pub row_id: String,
pub cell_by_field_id: IndexMap<String, CellRevision>,
2022-03-14 17:24:25 +08:00
pub height: i32,
pub visibility: bool,
}