// now a concept to allow for persistence of selected item
abstract concept G22CRUDAndDetailPanel extends Concept {
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
abstract JComponent makeDetailView(A a);
cachedVisualize {
crud = makeCRUD();
scpDetail = singleComponentPanel();
selectAfterUpdate(selected!);
var crudVis = crud.visualize();
crudVisualized();
crud.onSelectionChangedAndNow(-> {
var selected = crud.selected();
this.selected.set(selected);
if (selected == null)
scpDetail.set(emptyDetailView());
else {
var view = makeDetailView(selected);
var lvTitle = liveValue_hasChangeListeners(
selected,
-> crud.entityName() + " " + selected.id + ": " + selected);
scpDetail.set(jCenteredRaisedBoldLiveValueSection(lvTitle, view));
}
});
/*ret jvsplit(
jCenteredSection(crud.entityNamePlural(), crudVis),
scpDetail);*/
collapsiblePanel.init(
crud.entityName() + " List",
jCenteredSection(crud.entityNamePlural(), crudVis),
scpDetail);
collapsiblePanel.onChange(l0 change);
ret collapsiblePanel.visualize();
}
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);
}
}