Add typed data contract editing and bounded dictionary views
This commit is contained in:
@@ -703,69 +703,7 @@ fn inspector(app: &App) -> View<'_, Message> {
|
||||
}
|
||||
|
||||
fn data_catalog(app: &App) -> View<'_, Message> {
|
||||
let p = app.project();
|
||||
let mut content = column![heading(
|
||||
"Data & interfaces",
|
||||
"Define information, material and energy at the system boundary."
|
||||
)]
|
||||
.spacing(15);
|
||||
for kind in Kind::ALL {
|
||||
let is_data = matches!(
|
||||
kind,
|
||||
Kind::ExchangeItem | Kind::DataType | Kind::DataField | Kind::Interface | Kind::Port
|
||||
);
|
||||
if !is_data {
|
||||
continue;
|
||||
}
|
||||
let elements = p
|
||||
.elements
|
||||
.values()
|
||||
.filter(|e| e.layer() == app.layer && e.kind() == kind)
|
||||
.collect::<Vec<_>>();
|
||||
if elements.is_empty() {
|
||||
continue;
|
||||
}
|
||||
content = content.push(
|
||||
text(format!("{} · {}", kind.label(), elements.len()))
|
||||
.size(15)
|
||||
.color(style::kind_color(kind)),
|
||||
);
|
||||
for e in elements {
|
||||
content = content.push(crate::context_menu::Area::new(
|
||||
button(
|
||||
row![
|
||||
column![
|
||||
text(&e.name).size(14),
|
||||
label(format!(
|
||||
"@{}{}",
|
||||
e.alias,
|
||||
e.parent
|
||||
.map(|id| format!(" · in {}", p.named(id)))
|
||||
.unwrap_or_default()
|
||||
)),
|
||||
text(short(&e.description, 125))
|
||||
.size(12)
|
||||
.color(style::MUTED)
|
||||
]
|
||||
.spacing(5)
|
||||
.width(Fill),
|
||||
text("→").size(17)
|
||||
]
|
||||
.align_y(iced::Center),
|
||||
)
|
||||
.padding(14)
|
||||
.width(Fill)
|
||||
.style(if e.id == app.selected {
|
||||
style::selected
|
||||
} else {
|
||||
style::nav
|
||||
})
|
||||
.on_press(Message::Select(e.id)),
|
||||
move |anchor| crate::model_menu::open(e.id, anchor),
|
||||
));
|
||||
}
|
||||
}
|
||||
scrollable(content.padding(24)).into()
|
||||
crate::data_view::view(app)
|
||||
}
|
||||
|
||||
fn traces(app: &App) -> View<'_, Message> {
|
||||
@@ -1099,6 +1037,51 @@ fn checks(app: &App) -> View<'_, Message> {
|
||||
app.project().named(endpoint.exchange)
|
||||
)));
|
||||
}
|
||||
card=card.push(label(format!("Data migration: {} semantic defaults · {} interface allocations · {} unresolved value addresses",report.semantic_defaults.len(),report.generated_interface_allocations.len(),report.unresolved_message_values.len())));
|
||||
for default in report.semantic_defaults.iter().take(6) {
|
||||
card = card
|
||||
.push(action(
|
||||
&format!(
|
||||
"{} · {}",
|
||||
app.project().named(default.object),
|
||||
default.field
|
||||
),
|
||||
Message::Select(default.object),
|
||||
))
|
||||
.push(label(&default.description));
|
||||
}
|
||||
for allocation in report.generated_interface_allocations.iter().take(6) {
|
||||
card = card
|
||||
.push(action(
|
||||
&format!(
|
||||
"Created item allocation · @{} · order {}",
|
||||
allocation.alias, allocation.order
|
||||
),
|
||||
Message::Select(allocation.id),
|
||||
))
|
||||
.push(label(format!(
|
||||
"{} → {}",
|
||||
app.project().named(allocation.source),
|
||||
app.project().named(allocation.target)
|
||||
)));
|
||||
}
|
||||
for value in report.unresolved_message_values.iter().take(6) {
|
||||
card = card
|
||||
.push(action(
|
||||
&format!(
|
||||
"Review qualified value · {}",
|
||||
app.project().named(value.occurrence)
|
||||
),
|
||||
Message::EditProperties(value.occurrence),
|
||||
))
|
||||
.push(label(&value.reason));
|
||||
}
|
||||
if report.semantic_defaults.len() > 6
|
||||
|| report.generated_interface_allocations.len() > 6
|
||||
|| report.unresolved_message_values.len() > 6
|
||||
{
|
||||
card=card.push(label("Showing the first six entries in each data migration category. Model checks below link remaining unresolved contracts."));
|
||||
}
|
||||
for boundary in &report.orientation_defaults {
|
||||
card = card.push(action(
|
||||
&format!(
|
||||
|
||||
Reference in New Issue
Block a user