Skip to content

Commit c707cee

Browse files
committed
feat: add person field type
1 parent ad7c317 commit c707cee

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

collab-database/src/entity.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::fields::checklist_type_option::ChecklistTypeOption;
66
use crate::fields::date_type_option::{DateTypeOption, TimeTypeOption};
77
use crate::fields::media_type_option::MediaTypeOption;
88
use crate::fields::number_type_option::NumberTypeOption;
9+
use crate::fields::person_type_option::PersonTypeOption;
910
use crate::fields::relation_type_option::RelationTypeOption;
1011
use crate::fields::select_type_option::{MultiSelectTypeOption, SingleSelectTypeOption};
1112
use crate::fields::summary_type_option::SummarizationTypeOption;
@@ -293,6 +294,7 @@ pub enum FieldType {
293294
Translate = 12,
294295
Time = 13,
295296
Media = 14,
297+
Person = 15,
296298
}
297299

298300
impl FieldType {
@@ -365,6 +367,7 @@ impl FieldType {
365367
FieldType::Translate => "Translate",
366368
FieldType::Time => "Time",
367369
FieldType::Media => "Media",
370+
FieldType::Person => "Person",
368371
};
369372
s.to_string()
370373
}
@@ -456,6 +459,7 @@ impl From<i64> for FieldType {
456459
12 => FieldType::Translate,
457460
13 => FieldType::Time,
458461
14 => FieldType::Media,
462+
15 => FieldType::Person,
459463
_ => {
460464
error!("Unknown field type: {}, fallback to text", index);
461465
FieldType::RichText
@@ -484,6 +488,7 @@ pub fn default_type_option_data_from_type(field_type: FieldType) -> TypeOptionDa
484488
FieldType::Relation => RelationTypeOption::default().into(),
485489
FieldType::Summary => SummarizationTypeOption::default().into(),
486490
FieldType::Translate => TranslateTypeOption::default().into(),
491+
FieldType::Person => PersonTypeOption::default().into(),
487492
}
488493
}
489494

collab-database/src/fields/type_option/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ pub mod checklist_type_option;
33
pub mod date_type_option;
44
pub mod media_type_option;
55
pub mod number_type_option;
6+
pub mod person_type_option;
67
pub mod relation_type_option;
78
pub mod select_type_option;
89
pub mod summary_type_option;
@@ -19,6 +20,7 @@ use crate::fields::checklist_type_option::ChecklistTypeOption;
1920
use crate::fields::date_type_option::{DateTypeOption, TimeTypeOption};
2021
use crate::fields::media_type_option::MediaTypeOption;
2122
use crate::fields::number_type_option::NumberTypeOption;
23+
use crate::fields::person_type_option::PersonTypeOption;
2224
use crate::fields::relation_type_option::RelationTypeOption;
2325
use crate::fields::select_type_option::{MultiSelectTypeOption, SingleSelectTypeOption};
2426
use crate::fields::summary_type_option::SummarizationTypeOption;
@@ -178,6 +180,7 @@ pub fn type_option_cell_writer(
178180
FieldType::Relation => Box::new(RelationTypeOption::from(type_option_data)),
179181
FieldType::Summary => Box::new(SummarizationTypeOption::from(type_option_data)),
180182
FieldType::Translate => Box::new(TranslateTypeOption::from(type_option_data)),
183+
FieldType::Person => Box::new(PersonTypeOption::from(type_option_data)),
181184
}
182185
}
183186

@@ -201,5 +204,6 @@ pub fn type_option_cell_reader(
201204
FieldType::Relation => Box::new(RelationTypeOption::from(type_option_data)),
202205
FieldType::Summary => Box::new(SummarizationTypeOption::from(type_option_data)),
203206
FieldType::Translate => Box::new(TranslateTypeOption::from(type_option_data)),
207+
FieldType::Person => Box::new(PersonTypeOption::from(type_option_data)),
204208
}
205209
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
use collab::util::AnyMapExt;
2+
use serde::{Deserialize, Serialize};
3+
use serde_json::Value;
4+
5+
use crate::{
6+
fields::{TypeOptionCellReader, TypeOptionCellWriter, TypeOptionData, TypeOptionDataBuilder},
7+
rows::Cell,
8+
};
9+
10+
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
11+
pub struct PersonTypeOption {
12+
pub is_single_select: bool,
13+
pub fill_with_creator: bool,
14+
pub disable_notification: bool,
15+
}
16+
17+
impl TypeOptionCellReader for PersonTypeOption {
18+
fn json_cell(&self, cell: &Cell) -> Value {
19+
serde_json::to_value(self.stringify_cell(cell)).unwrap_or(Value::Null)
20+
}
21+
22+
fn stringify_cell(&self, cell_data: &Cell) -> String {
23+
serde_json::to_string(cell_data).unwrap_or_default()
24+
}
25+
26+
fn numeric_cell(&self, _cell: &Cell) -> Option<f64> {
27+
None
28+
}
29+
30+
fn convert_raw_cell_data(&self, text: &str) -> String {
31+
text.to_string()
32+
}
33+
}
34+
35+
impl TypeOptionCellWriter for PersonTypeOption {
36+
fn convert_json_to_cell(&self, _json_value: Value) -> Cell {
37+
Cell::new()
38+
}
39+
}
40+
41+
impl From<TypeOptionData> for PersonTypeOption {
42+
fn from(data: TypeOptionData) -> Self {
43+
data
44+
.get_as::<String>("content")
45+
.map(|s| serde_json::from_str::<PersonTypeOption>(&s).unwrap_or_default())
46+
.unwrap_or_default()
47+
}
48+
}
49+
50+
impl From<PersonTypeOption> for TypeOptionData {
51+
fn from(data: PersonTypeOption) -> Self {
52+
let content = serde_json::to_string(&data).unwrap_or_default();
53+
TypeOptionDataBuilder::from([("content".into(), content.into())])
54+
}
55+
}

0 commit comments

Comments
 (0)