Warning: session_start(): open(/var/lib/php/sessions/sess_5f3oduv8hr7ttbq6dd2skltb0m, 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
!7
concept CalendarEntry {
int year, month, day;
S text;
}
module Calendar > DynSCP {
int year = localYear(), month = localMonth();
transient SimpleCRUD crud;
start {
dbIndexing(CalendarEntry, 'year);
onChange(r revisualize2);
crud = new SimpleCRUD(CalendarEntry);
}
visualize {
ret withMargin(jBottomTabs("Month",
withBottomMargin(northAndCenter(rightAlignedLine(
jlabel("Month:"),
dm_fieldSpinner('month, 1, 12),
jlabel("Year:"),
jspinner_disableDigitGrouping(dm_fieldSpinner('year, 1970, 2030))),
super.visualize())),
"All Entries", withBottomMargin(crud.makePanel()));
}
visualize2 {
setModuleName("Calendar (" + month + "/" + year + ")");
int days = daysInMonth(year, month);
int weekDay = dayOfWeek_nr(calendarFromYMD(year, month, 1))-1;
print("Weekday " + year + "/" + month + "/" + 1 + ": " + weekDay);
new LL rows;
rows.add(map(intRangeList(7), func(int i) -> Component {
jcenteredlabel(shortEnglishWeekdays().get(i)) }));
rows.add(new L);
Map entries = indexByField day(conceptsWhere(CalendarEntry, +year, +month));
for (int i = 1; i <= days; i++) {
if (l(last(rows)) > weekDay) rows.add(new L);
while (weekDay > l(last(rows))) last(rows).add(jlabel());
JLabel lbl = jcenteredlabel(str(i));
if (entries.containsKey(i)) {
setOpaqueBackground(Color.GREEN, lbl);
toolTip(lbl, lines_rtrim(collect text(entries)));
}
last(rows).add(lbl);
weekDay = (weekDay+1) % 7;
}
while (l(last(rows)) < 7) last(rows).add(jlabel());
ret hvgrid(rows);
}
// API
void addEntry(S ymd, S text) {
if (uniq_sync_returnIfNew(CalendarEntry,
year := ymd_year(ymd),
month := ymd_month(ymd),
day := ymd_day(ymd),
+text) != null && month == ymd_month(ymd))
revisualize2();
}
}