reactive_graph_table_model/instances/
relations.rs1use 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 pub outbound_id: Uuid,
32
33 pub namespace: String,
35
36 pub name: String,
38
39 pub instance_id: String,
41
42 pub inbound_id: Uuid,
44
45 pub description: String,
47
48 #[tabled(display("display_component_type_ids", self))]
50 pub components: Vec<ComponentTypeId>,
51
52 #[tabled(display("display_property_instances", self))]
54 pub properties: Vec<PropertyInstance>,
55
56 #[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 .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}