// now a concept to allow for persistence of selected item
abstract concept G22CRUDAndDetailPanel /*is Swingable*/ {
new Ref selected;
CollapsibleNorthPanel collapsiblePanel = new(true);
transient settable G22Utils g22utils;
transient SimpleCRUD_v2 crud;
transient SingleComponentPanel scpDetail;
abstract SimpleCRUD_v2 makeCRUD();
// create detail view in background thread
transient RSTVar handleSelectionVar = new(l1 handleSelection_impl);
// a is not null
// override me
JComponent makeDetailView(A a) {
ret jTodo();
}
cachedVisualize {
crud = makeCRUD();
scpDetail = singleComponentPanel();
if (collapsiblePanel.expanded)
selectAfterUpdate(selected!);
var crudVis = crud.visualize();
crudVisualized();
handleSelectionVar.forceUpdate();
crud.onSelectionChanged(-> {
var selected = crud.selected();
this.selected.set(selected);
handleSelectionVar.set(selected);
});
/*ret jvsplit(
jCenteredSection(crud.entityNamePlural(), crudVis),
scpDetail);*/
collapsiblePanel.init(
crud.entityName() + " List",
jCenteredSection(crud.entityNamePlural(), crudVis),
scpDetail);
collapsiblePanel.onChange(l0 change);
handleSelectionVar.trigger();
ret collapsiblePanel.visualize();
}
void handleSelection_impl(A selected) {
if (selected == null)
scpDetail.set(emptyDetailView());
else {
var view = makeDetailView(selected);
var lvTitle = liveValue_hasChangeListeners(
selected,
-> detailTitle(selected));
scpDetail.set(jCenteredRaisedBoldLiveValueSection(lvTitle, view));
}
}
// item is not null
swappable S detailTitle(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 aka setSelected(A A) {
crud().setSelected(A);
}
void selectAfterUpdate(A A) {
crud.selectAfterUpdate(A);
}
SimpleCRUD_v2 crud() {
visualize();
ret crud;
}
}