|
@@ -34,9 +34,12 @@ pub trait GroupGenerator {
|
|
|
) -> Vec<Group>;
|
|
|
}
|
|
|
|
|
|
+const DEFAULT_GROUP_ID: &str = "default_group";
|
|
|
+
|
|
|
pub struct GroupController<C, T, G, CP> {
|
|
|
pub field_rev: Arc<FieldRevision>,
|
|
|
pub groups: IndexMap<String, Group>,
|
|
|
+ pub default_group: Group,
|
|
|
pub type_option: Option<T>,
|
|
|
pub configuration: Option<C>,
|
|
|
group_action_phantom: PhantomData<G>,
|
|
@@ -78,9 +81,18 @@ where
|
|
|
let field_type_rev = field_rev.field_type_rev;
|
|
|
let type_option = field_rev.get_type_option_entry::<T>(field_type_rev);
|
|
|
let groups = G::gen_groups(&configuration, &type_option, cell_content_provider);
|
|
|
+
|
|
|
+ let default_group = Group {
|
|
|
+ id: DEFAULT_GROUP_ID.to_owned(),
|
|
|
+ desc: format!("No {}", field_rev.name),
|
|
|
+ rows: vec![],
|
|
|
+ content: "".to_string(),
|
|
|
+ };
|
|
|
+
|
|
|
Ok(Self {
|
|
|
field_rev,
|
|
|
groups: groups.into_iter().map(|group| (group.id.clone(), group)).collect(),
|
|
|
+ default_group,
|
|
|
type_option,
|
|
|
configuration,
|
|
|
group_action_phantom: PhantomData,
|
|
@@ -89,7 +101,12 @@ where
|
|
|
}
|
|
|
|
|
|
pub fn take_groups(self) -> Vec<Group> {
|
|
|
- self.groups.into_values().collect()
|
|
|
+ let default_group = self.default_group;
|
|
|
+ let mut groups: Vec<Group> = self.groups.into_values().collect();
|
|
|
+ if !default_group.rows.is_empty() {
|
|
|
+ groups.push(default_group);
|
|
|
+ }
|
|
|
+ groups
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -102,6 +119,7 @@ where
|
|
|
if self.configuration.is_none() {
|
|
|
return Ok(());
|
|
|
}
|
|
|
+ tracing::debug!("group {} rows", rows.len());
|
|
|
|
|
|
for row in rows {
|
|
|
if let Some(cell_rev) = row.cells.get(&self.field_rev.id) {
|
|
@@ -115,15 +133,20 @@ where
|
|
|
row: row.into(),
|
|
|
group_id: group.id.clone(),
|
|
|
});
|
|
|
- break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- for record in records {
|
|
|
- if let Some(group) = self.groups.get_mut(&record.group_id) {
|
|
|
- group.rows.push(record.row);
|
|
|
+ if records.is_empty() {
|
|
|
+ self.default_group.rows.push(row.into());
|
|
|
+ } else {
|
|
|
+ for record in records {
|
|
|
+ if let Some(group) = self.groups.get_mut(&record.group_id) {
|
|
|
+ group.rows.push(record.row);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ } else {
|
|
|
+ self.default_group.rows.push(row.into());
|
|
|
}
|
|
|
}
|
|
|
|