reactive_graph_table_model/instances/
relations.rs

1use crate::container::TableInlineFormat;
2use crate::container::TableInlineFormatSetter;
3use crate::container::TableOptions;
4use crate::instances::properties::PropertyInstance;
5use crate::instances::properties::PropertyInstances;
6use crate::instances::properties::display_property_instances_html_inline;
7use crate::instances::properties::display_property_instances_inline_str;
8use crate::styles::modern_inline::modern_inline;
9use crate::types::component::ComponentTypeId;
10use crate::types::component::ComponentTypeIds;
11use crate::types::component::display_component_type_ids_html_inline;
12use crate::types::component::display_component_type_ids_inline_str;
13use crate::types::extension::Extension;
14use crate::types::extension::Extensions;
15use crate::types::extension::display_extensions_html_inline;
16use crate::types::extension::display_extensions_inline_str;
17use reactive_graph_graph::NamespacedTypeGetter;
18use table_to_html::HtmlTable;
19use tabled::Table;
20use tabled::Tabled;
21use tabled::settings::Modify;
22use tabled::settings::Style;
23use tabled::settings::Width;
24use tabled::settings::object::Columns;
25use tabled::settings::object::Segment;
26use uuid::Uuid;
27
28#[derive(Clone, Debug, Tabled)]
29pub struct RelationInstance {
30    /// The id of the outbound entity instance.
31    pub outbound_id: Uuid,
32
33    /// The type namespace.
34    pub namespace: String,
35
36    /// The type name.
37    pub name: String,
38
39    /// The relation type instance id.
40    pub instance_id: String,
41
42    /// The id of the inbound entity instance.
43    pub inbound_id: Uuid,
44
45    /// Textual description of the entity instance.
46    pub description: String,
47
48    /// The components.
49    #[tabled(display("display_component_type_ids", self))]
50    pub components: Vec<ComponentTypeId>,
51
52    /// The property instances.
53    #[tabled(display("display_property_instances", self))]
54    pub properties: Vec<PropertyInstance>,
55
56    /// The extensions.
57    #[tabled(display("display_extensions", self))]
58    pub extensions: Vec<Extension>,
59
60    #[tabled(skip)]
61    inline_format: TableInlineFormat,
62}
63
64fn display_component_type_ids(components: &[ComponentTypeId], relation_instance: &RelationInstance) -> String {
65    match relation_instance.inline_format {
66        TableInlineFormat::Table => display_component_type_ids_inline_str(components),
67        TableInlineFormat::Html => display_component_type_ids_html_inline(components),
68    }
69}
70
71fn display_property_instances(properties: &[PropertyInstance], relation_instance: &RelationInstance) -> String {
72    match relation_instance.inline_format {
73        TableInlineFormat::Table => display_property_instances_inline_str(properties),
74        TableInlineFormat::Html => display_property_instances_html_inline(properties),
75    }
76}
77
78fn display_extensions(extensions: &[Extension], relation_instance: &RelationInstance) -> String {
79    match relation_instance.inline_format {
80        TableInlineFormat::Table => display_extensions_inline_str(extensions),
81        TableInlineFormat::Html => display_extensions_html_inline(extensions),
82    }
83}
84
85impl TableInlineFormatSetter for RelationInstance {
86    fn set_table_inline_format(&mut self, table_inline_format: TableInlineFormat) {
87        self.inline_format = table_inline_format;
88    }
89}
90
91impl From<reactive_graph_graph::RelationInstance> for RelationInstance {
92    fn from(relation_instance: reactive_graph_graph::RelationInstance) -> Self {
93        RelationInstance {
94            outbound_id: relation_instance.outbound_id,
95            namespace: relation_instance.namespace(),
96            name: relation_instance.relation_type_id().type_name(),
97            instance_id: relation_instance.instance_id(),
98            inbound_id: relation_instance.inbound_id,
99            description: relation_instance.description,
100            properties: PropertyInstances::from(relation_instance.properties).0,
101            components: ComponentTypeIds::from(relation_instance.components).0,
102            extensions: Extensions::from(relation_instance.extensions).0,
103            inline_format: Default::default(),
104        }
105    }
106}
107
108pub struct RelationInstancesTableOptions;
109
110impl TableOptions for RelationInstancesTableOptions {
111    fn options(table: &mut Table) -> &mut Table {
112        table.with(Style::extended()).with(
113            Modify::new(Segment::new(0.., 0..3))
114                .with(Width::increase(22))
115                .with(Width::increase(22))
116                .with(Width::wrap(40).keep_words(true)),
117        )
118    }
119}
120
121pub fn display_relation_instances_inline_str(relation_instances: &[RelationInstance]) -> String {
122    if relation_instances.is_empty() {
123        String::new()
124    } else {
125        display_relation_instances_inline(relation_instances).to_string()
126    }
127}
128
129pub fn display_relation_instances_inline(relation_instances: &[RelationInstance]) -> Table {
130    let relation_instances = relation_instances.to_vec();
131    Table::new(relation_instances)
132        .with(modern_inline())
133        .with(Modify::new(Columns::new(0..1)).with(Width::increase(22)))
134        // .with(Modify::new(Columns::new(1..2)).with(Width::increase(22)))
135        // .with(Modify::new(Columns::new(2..3)).with(Width::wrap(40)))
136        // .with(Modify::new(Columns::new(3..4)).with(Width::wrap(80)))
137        .to_owned()
138}
139
140pub fn display_relation_instances_html_inline(relation_instances: &[RelationInstance]) -> String {
141    let relation_instances = relation_instances.to_vec();
142    if relation_instances.is_empty() {
143        return String::new();
144    }
145    HtmlTable::with_header(Vec::<Vec<String>>::from(Table::builder(&relation_instances)))
146        .to_string()
147        .split_whitespace()
148        .collect()
149}