// now a concept to allow for persistence of selected item
abstract concept G22CRUDAndDetailPanel {
new Ref selected;
CollapsibleNorthPanel collapsiblePanel = new(true);
transient settable G22Utils g22utils;
transient gettable SimpleCRUD_v2 crud;
transient SingleComponentPanel scpDetail;
abstract SimpleCRUD_v2 makeCRUD();
// a is not null
// override me
JComponent makeDetailView(A a) {
ret jTodo();
}
cachedVisualize {
crud = makeCRUD();
scpDetail = singleComponentPanel();
handleSelection();
selectAfterUpdate(selected!);
var crudVis = crud.visualize();
crudVisualized();
crud.onSelectionChanged(-> {
this.selected.set(crud.selected());
handleSelection();
});
/*ret jvsplit(
jCenteredSection(crud.entityNamePlural(), crudVis),
scpDetail);*/
collapsiblePanel.init(
crud.entityName() + " List",
jCenteredSection(crud.entityNamePlural(), crudVis),
scpDetail);
collapsiblePanel.onChange(l0 change);
ret collapsiblePanel.visualize();
}
void handleSelection {
var selected = this.selected!;
if (selected == null)
scpDetail.set(emptyDetailView());
else {
var view = makeDetailView(selected);
var lvTitle = liveValue_hasChangeListeners(
selected,
-> detailTitle(selected));
scpDetail.set(jCenteredRaisedBoldLiveValueSection(lvTitle, view));
}
}
swappable S detailTitle(@NotNull A item) {
ret crud.entityName() + " " + item.id + ": " + item;
}
JComponent emptyDetailView() {
ret jGazelleLogo();
}
// override me
void crudVisualized {}
void addCountToEnclosingTab(bool b) {
crud.addCountToEnclosingTab(b);
}
void updateCount {
crud.update();
}
void edit(A A) {
crud.setSelected(A);
}
void setSelected(A A) {
crud.setSelected(A);
}
void selectAfterUpdate(A A) {
crud.selectAfterUpdate(A);
}
}