field_operation.rs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. use crate::entities::{FieldChangesetParams, FieldType};
  2. use crate::services::field::{select_option_operation, SelectOptionPB};
  3. use crate::services::grid_editor::GridRevisionEditor;
  4. use flowy_error::FlowyResult;
  5. use flowy_grid_data_model::revision::{FieldRevision, TypeOptionDataDeserializer, TypeOptionDataFormat};
  6. use std::sync::Arc;
  7. pub async fn edit_field<T>(
  8. field_id: &str,
  9. editor: Arc<GridRevisionEditor>,
  10. action: impl FnOnce(&mut T) -> bool,
  11. ) -> FlowyResult<()>
  12. where
  13. T: TypeOptionDataDeserializer + TypeOptionDataFormat,
  14. {
  15. let get_type_option = async {
  16. let field_rev = editor.get_field_rev(field_id).await?;
  17. field_rev.get_type_option::<T>(field_rev.ty)
  18. };
  19. if let Some(mut type_option) = get_type_option.await {
  20. if action(&mut type_option) {
  21. let changeset = FieldChangesetParams { ..Default::default() };
  22. let _ = editor.update_field(changeset).await?;
  23. }
  24. }
  25. Ok(())
  26. }
  27. pub fn insert_single_select_option(field_rev: &mut FieldRevision, options: Vec<SelectOptionPB>) -> FlowyResult<()> {
  28. if options.is_empty() {
  29. return Ok(());
  30. }
  31. let mut type_option = select_option_operation(field_rev)?;
  32. options.into_iter().for_each(|option| type_option.insert_option(option));
  33. Ok(())
  34. }
  35. pub fn insert_multi_select_option(field_rev: &mut FieldRevision, options: Vec<SelectOptionPB>) -> FlowyResult<()> {
  36. if options.is_empty() {
  37. return Ok(());
  38. }
  39. let mut type_option = select_option_operation(field_rev)?;
  40. options.into_iter().for_each(|option| type_option.insert_option(option));
  41. Ok(())
  42. }