sclass HCRUD_Concepts extends HCRUD_Data { Concepts cc = db_mainConcepts(); Class cClass; new L> onCreateOrUpdate; MapSO filters; // fields to filter by/add to new objects *(Class *cClass) {} S itemName() { ret shortName(cClass); } //LS fields() { ret conceptFields(cClass); } L> list() { ret lambdaMap itemToMap(defaultSort(conceptsWhere(cc, cClass, mapToParams(filters)))); } Cl defaultSort(Cl l) { ret l; } Map emptyObject() { A c = unlisted(cClass); print("fieldOrder", getFieldOrder(c)); ret printStruct("emptyObject", itemToMap(c)); } Map itemToMap(A c) { ret c == null ? null : putKeysFirst(getFieldOrder(c), conceptToMap_gen_withNullValues(c)); } Map getObject(O id) { ret itemToMap(getConcept(cc, cClass, toLong(id))); } O createObject(SS map) { A c = cnew(cc, cClass); cset(c, mapToParams(filters)); cSmartSet(c, mapToParams(map)); pcallFAll(onCreateOrUpdate, c); ret c.id; } S updateObject(O id, SS map) { A c = getConcept(cc, cClass, toLong(id)); if (c == null) ret "Object " + id + " not found"; cSmartSet(c, mapToParams(map)); pcallFAll(onCreateOrUpdate, c); ret "Object " + id + " updated"; } S deleteObject(O id) { A c = getConcept(cc, cClass, toLong(id)); if (c == null) ret "Object not found"; deleteConcept(c); ret "Object deleted"; } HCRUD_Concepts addFilter(S field, O value) { filters = orderedMapPutOrCreate(filters, field, value); this; } }