Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 159 additions & 3 deletions collab-database/src/entity.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
#![allow(clippy::upper_case_acronyms)]
use crate::database::{gen_database_id, gen_database_view_id, gen_row_id, timestamp, DatabaseData};
use crate::error::DatabaseError;
use crate::fields::Field;
use crate::fields::checkbox_type_option::CheckboxTypeOption;
use crate::fields::checklist_type_option::ChecklistTypeOption;
use crate::fields::date_type_option::{DateTypeOption, TimeTypeOption};
use crate::fields::media_type_option::MediaTypeOption;
use crate::fields::number_type_option::NumberTypeOption;
use crate::fields::relation_type_option::RelationTypeOption;
use crate::fields::select_type_option::{MultiSelectTypeOption, SingleSelectTypeOption};
use crate::fields::summary_type_option::SummarizationTypeOption;
use crate::fields::text_type_option::RichTextTypeOption;
use crate::fields::timestamp_type_option::TimestampTypeOption;
use crate::fields::translate_type_option::TranslateTypeOption;
use crate::fields::url_type_option::URLTypeOption;
use crate::fields::{Field, TypeOptionData};
use crate::rows::CreateRowParams;
use crate::views::{
DatabaseLayout, FieldOrder, FieldSettingsByFieldIdMap, FieldSettingsMap, FilterMap,
Expand All @@ -13,6 +25,7 @@ use collab_entity::CollabType;
use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr};
use std::collections::HashMap;
use std::fmt::{Display, Formatter};
use tracing::error;
use yrs::{Any, Out};

Expand Down Expand Up @@ -254,7 +267,7 @@ impl CreateDatabaseParams {
}
}

#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize_repr, Deserialize_repr)]
#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq, Serialize_repr, Deserialize_repr)]
#[repr(u8)]
pub enum FieldType {
RichText = 0,
Expand All @@ -276,7 +289,7 @@ pub enum FieldType {

impl FieldType {
pub fn type_id(&self) -> String {
(self.clone() as i64).to_string()
(*self as i64).to_string()
}
}

Expand All @@ -286,6 +299,12 @@ impl From<FieldType> for i64 {
}
}

impl From<&FieldType> for i64 {
fn from(field_type: &FieldType) -> Self {
*field_type as i64
}
}

impl TryFrom<yrs::Out> for FieldType {
type Error = yrs::Out;

Expand All @@ -297,6 +316,120 @@ impl TryFrom<yrs::Out> for FieldType {
}
}

impl Display for FieldType {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
let value: i64 = (*self).into();
f.write_fmt(format_args!("{}", value))
}
}

impl AsRef<FieldType> for FieldType {
fn as_ref(&self) -> &FieldType {
self
}
}

impl From<&FieldType> for FieldType {
fn from(field_type: &FieldType) -> Self {
*field_type
}
}

impl FieldType {
pub fn value(&self) -> i64 {
(*self).into()
}

pub fn default_name(&self) -> String {
let s = match self {
FieldType::RichText => "Text",
FieldType::Number => "Number",
FieldType::DateTime => "Date",
FieldType::SingleSelect => "Single Select",
FieldType::MultiSelect => "Multi Select",
FieldType::Checkbox => "Checkbox",
FieldType::URL => "URL",
FieldType::Checklist => "Checklist",
FieldType::LastEditedTime => "Last modified",
FieldType::CreatedTime => "Created time",
FieldType::Relation => "Relation",
FieldType::Summary => "Summarize",
FieldType::Translate => "Translate",
FieldType::Time => "Time",
FieldType::Media => "Media",
};
s.to_string()
}

pub fn is_ai_field(&self) -> bool {
matches!(self, FieldType::Summary | FieldType::Translate)
}

pub fn is_number(&self) -> bool {
matches!(self, FieldType::Number)
}

pub fn is_text(&self) -> bool {
matches!(self, FieldType::RichText)
}

pub fn is_checkbox(&self) -> bool {
matches!(self, FieldType::Checkbox)
}

pub fn is_date(&self) -> bool {
matches!(self, FieldType::DateTime)
}

pub fn is_single_select(&self) -> bool {
matches!(self, FieldType::SingleSelect)
}

pub fn is_multi_select(&self) -> bool {
matches!(self, FieldType::MultiSelect)
}

pub fn is_last_edited_time(&self) -> bool {
matches!(self, FieldType::LastEditedTime)
}

pub fn is_created_time(&self) -> bool {
matches!(self, FieldType::CreatedTime)
}

pub fn is_url(&self) -> bool {
matches!(self, FieldType::URL)
}

pub fn is_select_option(&self) -> bool {
self.is_single_select() || self.is_multi_select()
}

pub fn is_checklist(&self) -> bool {
matches!(self, FieldType::Checklist)
}

pub fn is_relation(&self) -> bool {
matches!(self, FieldType::Relation)
}

pub fn is_time(&self) -> bool {
matches!(self, FieldType::Time)
}

pub fn is_media(&self) -> bool {
matches!(self, FieldType::Media)
}

pub fn can_be_group(&self) -> bool {
self.is_select_option() || self.is_checkbox() || self.is_url()
}

pub fn is_auto_update(&self) -> bool {
self.is_last_edited_time()
}
}

impl From<i64> for FieldType {
fn from(index: i64) -> Self {
match index {
Expand All @@ -323,6 +456,29 @@ impl From<i64> for FieldType {
}
}

pub fn default_type_option_data_from_type(field_type: FieldType) -> TypeOptionData {
match field_type {
FieldType::RichText => RichTextTypeOption.into(),
FieldType::Number => NumberTypeOption::default().into(),
FieldType::DateTime => DateTypeOption::default().into(),
FieldType::LastEditedTime | FieldType::CreatedTime => TimestampTypeOption {
field_type: field_type.into(),
..Default::default()
}
.into(),
FieldType::SingleSelect => SingleSelectTypeOption::default().into(),
FieldType::MultiSelect => MultiSelectTypeOption::default().into(),
FieldType::Checkbox => CheckboxTypeOption.into(),
FieldType::URL => URLTypeOption::default().into(),
FieldType::Time => TimeTypeOption.into(),
FieldType::Media => MediaTypeOption::default().into(),
FieldType::Checklist => ChecklistTypeOption.into(),
FieldType::Relation => RelationTypeOption::default().into(),
FieldType::Summary => SummarizationTypeOption::default().into(),
FieldType::Translate => TranslateTypeOption::default().into(),
}
}

#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
#[repr(u8)]
pub enum FileUploadType {
Expand Down
13 changes: 13 additions & 0 deletions collab-database/src/fields/field.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ use serde::{Deserialize, Serialize};

use collab::preclude::{Any, Map, MapExt, MapRef, ReadTxn, TransactionMut, YrsValue};

use crate::database::gen_field_id;
use crate::entity::{default_type_option_data_from_type, FieldType};
use crate::fields::{TypeOptionData, TypeOptions, TypeOptionsUpdate};
use crate::{impl_bool_update, impl_i64_update, impl_str_update};

Expand Down Expand Up @@ -37,6 +39,17 @@ impl Field {
self
}

pub fn from_field_type(name: &str, field_type: FieldType, is_primary: bool) -> Self {
let new_field = Self {
id: gen_field_id(),
name: name.to_string(),
field_type: field_type.into(),
is_primary,
..Default::default()
};
new_field.with_type_option_data(field_type, default_type_option_data_from_type(field_type))
}

pub fn get_type_option<T: From<TypeOptionData>>(&self, type_id: impl ToString) -> Option<T> {
let type_option_data = self.type_options.get(&type_id.to_string())?.clone();
Some(T::from(type_option_data))
Expand Down
Loading
Loading