Warning: session_start(): open(/var/lib/php/sessions/sess_siq30jet4kou7lscf9hbofsfks, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
sclass HCRUD extends HAbstractRenderable {
HCRUD_Data data;
int defaultTextFieldCols = 80;
bool mutationRights = true;
S tableClass; // CSS class for table
*() {}
*(HCRUD_Data *data) {}
*(S *baseLink, HCRUD_Data *data) {}
S newLink() { ret appendQueryToURL(baseLink, cmd := "new"); }
S deleteLink(O id) { ret appendQueryToURL(baseLink, "delete_" + id, 1); }
S editLink(O id) { ret appendQueryToURL(baseLink, edit := id); }
S duplicateLink(O id) { ret appendQueryToURL(baseLink, duplicate := id); }
// also handles commands if withCmds=true
S render(bool withCmds, SS params) {
if (!withCmds) ret renderTable(false);
try answer handleCommands(params);
ret renderMsgs(params)
+ p(ahref(newLink(), "New " + itemName()))
+ renderTable(withCmds);
}
S handleCommands(SS params) {
new LS msgs;
if (eqGet(params, "action", "create")) {
O id = data.createObject(subMapStartingWith_dropPrefix(params, "f_"));
msgs.add(itemName() + " created (ID: " + id + ")");
}
if (eqGet(params, "action", "update"))
msgs.add(data.updateObject(params.get("id"),
subMapStartingWith_dropPrefix(params, "f_")));
for (S toDelete : keysDeprefixNemptyValue(params, "delete_"))
msgs.add(data.deleteObject(toDelete));
ret nempty(msgs) ? refreshWithMsgs(msgs) : "";
}
S encodeField(S s) {
ret or(data.fieldNameToHTML(s), s);
}
// in table
S renderValue(S field, O value) {
if (value cast HTML) ret value.html;
ret htmlEncode_nlToBr_withIndents(strOrEmpty(value));
}
S renderTable(bool withCmds) {
ret renderTable(withCmds, data.list());
}
S renderTable(bool withCmds, L l) {
if (empty(l)) ret p("No entries");
//LS fields = data.fields();
//if (fields == null) fields = allKeysFromList_inOrder();
l = map(l, map -> {
MapSO map2 = postProcessTableRow(map, mapToMap(
(key, value) -> pair(encodeField(key), renderValue(key, value)),
map));
if (withCmds)
map2.put(cmdsKey(), renderCmds(map));
ret map2;
});
ret htmlTable2_noHtmlEncode(l, tableParams());
}
/*swappable*/ O[] tableParams() {
ret litparams(
tdParams := litparams(valign := "top"),
tableParams := litparams(class := tableClass));
}
S renderForm(Map map) {
map = mapMinusKeys(map, uneditableFields);
ret htableRaw_valignTop(
map(map, (field, value) -> {
S help = data.fieldHelp(field);
ret ll(
encodeField(field),
renderInput(field, value)
+ (empty(help) ? "" : "
" + small(help))
);
})
, border := 1, cellpadding := 4);
}
S renderInput(S field, O value) {
S name = "f_" + field;
HCRUD_Data.Renderer r = data.getRenderer(field);
if (r cast HCRUD_Data.TextArea)
ret htextarea(strOrEmpty(value), +name, cols := r.cols, rows := r.rows);
if (r cast HCRUD_Data.TextField)
ret htextfield(name, strOrEmpty(value), size := r.cols, style := "font-family: monospace");
if (r cast HCRUD_Data.ComboBox)
ret hselect_list(r.entries, strOrEmpty(value), +name);
ret renderInput_default(field, value);
}
S renderInput_default(S field, O value) {
S name = "f_" + field;
ret htextfield(name, strOrEmpty(value), size := defaultTextFieldCols);
}
S renderNewForm() {
ret renderNewForm(data.emptyObject());
}
S renderNewForm(MapSO map1) {
//printStruct("renderNewForm", map1);
Map map = mapWithoutKey(map1, data.idField());
//printStruct("renderNewForm", map);
ret hpostform(
hhidden("action", "create") +
renderForm(map)
+ p(hsubmit("Create")),
action := baseLink);
}
S renderEditForm(S id) {
Map map = mapWithoutKey(data.getObject(id), data.idField());
if (map == null) ret htmlEncode2("Entry " + id + " not found");
ret hpostform(
hhidden("action", "update") +
hhidden(+id) +
renderForm(map)
+ p(hsubmit("Save changes")),
action := baseLink);
}
S renderPage(SS params) {
if (eqGet(params, "cmd", "new"))
ret frame("New " + itemName(), renderNewForm());
if (nempty(params.get("edit")))
ret frame("Edit " + itemName(), renderEditForm(params.get("edit")));
if (nempty(params.get("duplicate")))
ret frame("New " + itemName(), renderNewForm(data.getObject(params.get("duplicate"))));
ret frame(ahref(baseLink, firstToUpper(data.itemNamePlural())), render(mutationRights, params));
}
HCRUD makeFrame(MakeFrame makeFrame) { super.makeFrame(makeFrame); this; }
S cmdsKey() { ret ""; }
S itemName() { ret data.itemName(); }
swappable MapSO postProcessTableRow(MapSO data, MapSO rendered) { ret rendered; }
swappable S renderCmds(MapSO item) {
O id = item.get(data.idField());
ret joinWithVBar(
ahref(editLink(id), "edit"),
ahrefWithConfirm(
"Really delete item " + id + "?", deleteLink(id), htmlEncode2(unicode_DEL())),
ahref(duplicateLink(id), "dup", title := "duplicate")
);
}
}