Remove unused blade settings pages not linked from UI Convert remaining frontend pages to SPA actions Convert settings user_settings and general to SPA actions Convert settings profile pages to SPA actions Convert contacts and projects add/edit pages to SPA actions Convert clients add/edit page to SPA action with loading pattern Refactor component scoped IDs from $id to $sid Fix jqhtml comment syntax and implement universal error component system Update all application code to use new unified error system Remove all backwards compatibility - unified error system complete Phase 5: Remove old response classes Phase 3-4: Ajax response handler sends new format, old helpers deprecated Phase 2: Add client-side unified error foundation Phase 1: Add server-side unified error foundation Add unified Ajax error response system with constants 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
99 lines
15 KiB
JavaScript
Executable File
99 lines
15 KiB
JavaScript
Executable File
"use strict";
|
|
|
|
class Calendar_Grid extends Component {
|
|
on_ready() {
|
|
this.current_date = new Date();
|
|
this.render_calendar();
|
|
this.$sid('prev_btn').on('click', () => {
|
|
this.current_date.setMonth(this.current_date.getMonth() - 1);
|
|
this.render_calendar();
|
|
});
|
|
this.$sid('next_btn').on('click', () => {
|
|
this.current_date.setMonth(this.current_date.getMonth() + 1);
|
|
this.render_calendar();
|
|
});
|
|
this.$sid('today_btn').on('click', () => {
|
|
this.current_date = new Date();
|
|
this.render_calendar();
|
|
});
|
|
}
|
|
render_calendar() {
|
|
const year = this.current_date.getFullYear();
|
|
const month = this.current_date.getMonth();
|
|
|
|
// Update title
|
|
const month_names = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
|
|
this.$sid('month_title').text(`${month_names[month]} ${year}`);
|
|
|
|
// Get first day of month and total days
|
|
const first_day = new Date(year, month, 1).getDay();
|
|
const days_in_month = new Date(year, month + 1, 0).getDate();
|
|
const $tbody = this.$sid('calendar_body');
|
|
$tbody.empty();
|
|
let day = 1;
|
|
let $tr = null;
|
|
|
|
// Build calendar grid
|
|
for (let i = 0; i < 6; i++) {
|
|
$tr = $('<tr>');
|
|
for (let j = 0; j < 7; j++) {
|
|
const $td = $('<td>').css({
|
|
'height': '100px',
|
|
'vertical-align': 'top',
|
|
'padding': '8px'
|
|
});
|
|
if (i === 0 && j < first_day) {
|
|
// Empty cell before month starts
|
|
$td.addClass('bg-light');
|
|
} else if (day > days_in_month) {
|
|
// Empty cell after month ends
|
|
$td.addClass('bg-light');
|
|
} else {
|
|
// Day cell
|
|
const $day_num = $('<div>').addClass('fw-bold mb-2').text(day);
|
|
|
|
// Highlight today
|
|
const today = new Date();
|
|
if (day === today.getDate() && month === today.getMonth() && year === today.getFullYear()) {
|
|
$day_num.addClass('text-primary');
|
|
$td.addClass('border-primary');
|
|
}
|
|
$td.append($day_num);
|
|
|
|
// Add events for this day if provided
|
|
if (this.args.events) {
|
|
const events = this.get_events_for_date(year, month, day);
|
|
events.forEach(event => {
|
|
const $event = $('<div>').addClass('badge bg-primary text-truncate w-100 mb-1 text-start').css('cursor', 'pointer').text(event.title);
|
|
$event.on('click', () => {
|
|
if (this.args.on_event_click) {
|
|
this.args.on_event_click(event);
|
|
}
|
|
});
|
|
$td.append($event);
|
|
});
|
|
}
|
|
$td.attr('data-date', `${year}-${str(month + 1).padStart(2, '0')}-${str(day).padStart(2, '0')}`);
|
|
$td.css('cursor', 'pointer');
|
|
$td.on('click', e => {
|
|
if (this.args.on_date_click && !$(e.target).hasClass('badge')) {
|
|
this.args.on_date_click($td.attr('data-date'));
|
|
}
|
|
});
|
|
day++;
|
|
}
|
|
$tr.append($td);
|
|
}
|
|
$tbody.append($tr);
|
|
if (day > days_in_month) break;
|
|
}
|
|
}
|
|
get_events_for_date(year, month, day) {
|
|
if (!this.args.events) return [];
|
|
const date_str = `${year}-${str(month + 1).padStart(2, '0')}-${str(day).padStart(2, '0')}`;
|
|
return this.args.events.filter(event => {
|
|
return event.date === date_str;
|
|
});
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDYWxlbmRhcl9HcmlkIiwiSnFodG1sX0NvbXBvbmVudCIsIm9uX3JlYWR5IiwiY3VycmVudF9kYXRlIiwiRGF0ZSIsInJlbmRlcl9jYWxlbmRhciIsIiRpZCIsIm9uIiwic2V0TW9udGgiLCJnZXRNb250aCIsInllYXIiLCJnZXRGdWxsWWVhciIsIm1vbnRoIiwibW9udGhfbmFtZXMiLCJ0ZXh0IiwiZmlyc3RfZGF5IiwiZ2V0RGF5IiwiZGF5c19pbl9tb250aCIsImdldERhdGUiLCIkdGJvZHkiLCJlbXB0eSIsImRheSIsIiR0ciIsImkiLCIkIiwiaiIsIiR0ZCIsImNzcyIsImFkZENsYXNzIiwiJGRheV9udW0iLCJ0b2RheSIsImFwcGVuZCIsImFyZ3MiLCJldmVudHMiLCJnZXRfZXZlbnRzX2Zvcl9kYXRlIiwiZm9yRWFjaCIsImV2ZW50IiwiJGV2ZW50IiwidGl0bGUiLCJvbl9ldmVudF9jbGljayIsImF0dHIiLCJzdHIiLCJwYWRTdGFydCIsImUiLCJvbl9kYXRlX2NsaWNrIiwidGFyZ2V0IiwiaGFzQ2xhc3MiLCJkYXRlX3N0ciIsImZpbHRlciIsImRhdGUiXSwic291cmNlcyI6WyJyc3gvdGhlbWUvY29tcG9uZW50cy9fYXJjaGl2ZWQvdW5maW5pc2hlZC9DYWxlbmRhcl9HcmlkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIENhbGVuZGFyX0dyaWQgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50X2RhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLnJlbmRlcl9jYWxlbmRhcigpO1xuXG4gICAgICAgIHRoaXMuJGlkKCdwcmV2X2J0bicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudF9kYXRlLnNldE1vbnRoKHRoaXMuY3VycmVudF9kYXRlLmdldE1vbnRoKCkgLSAxKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2NhbGVuZGFyKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuJGlkKCduZXh0X2J0bicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudF9kYXRlLnNldE1vbnRoKHRoaXMuY3VycmVudF9kYXRlLmdldE1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2NhbGVuZGFyKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuJGlkKCd0b2RheV9idG4nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRfZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcl9jYWxlbmRhcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXJfY2FsZW5kYXIoKSB7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRfZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudF9kYXRlLmdldE1vbnRoKCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRpdGxlXG4gICAgICAgIGNvbnN0IG1vbnRoX25hbWVzID0gWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJyxcbiAgICAgICAgICAgICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddO1xuICAgICAgICB0aGlzLiRpZCgnbW9udGhfdGl0bGUnKS50ZXh0KGAke21vbnRoX25hbWVzW21vbnRoXX0gJHt5ZWFyfWApO1xuXG4gICAgICAgIC8vIEdldCBmaXJzdCBkYXkgb2YgbW9udGggYW5kIHRvdGFsIGRheXNcbiAgICAgICAgY29uc3QgZmlyc3RfZGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpLmdldERheSgpO1xuICAgICAgICBjb25zdCBkYXlzX2luX21vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKCk7XG5cbiAgICAgICAgY29uc3QgJHRib2R5ID0gdGhpcy4kaWQoJ2NhbGVuZGFyX2JvZHknKTtcbiAgICAgICAgJHRib2R5LmVtcHR5KCk7XG5cbiAgICAgICAgbGV0IGRheSA9IDE7XG4gICAgICAgIGxldCAkdHIgPSBudWxsO1xuXG4gICAgICAgIC8vIEJ1aWxkIGNhbGVuZGFyIGdyaWRcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgICR0ciA9ICQoJzx0cj4nKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA3OyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCAkdGQgPSAkKCc8dGQ+JykuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgJ2hlaWdodCc6ICcxMDBweCcsXG4gICAgICAgICAgICAgICAgICAgICd2ZXJ0aWNhbC1hbGlnbic6ICd0b3AnLFxuICAgICAgICAgICAgICAgICAgICAncGFkZGluZyc6ICc4cHgnXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiBqIDwgZmlyc3RfZGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVtcHR5IGNlbGwgYmVmb3JlIG1vbnRoIHN0YXJ0c1xuICAgICAgICAgICAgICAgICAgICAkdGQuYWRkQ2xhc3MoJ2JnLWxpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXkgPiBkYXlzX2luX21vbnRoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVtcHR5IGNlbGwgYWZ0ZXIgbW9udGggZW5kc1xuICAgICAgICAgICAgICAgICAgICAkdGQuYWRkQ2xhc3MoJ2JnLWxpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGF5IGNlbGxcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgJGRheV9udW0gPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdmdy1ib2xkIG1iLTInKS50ZXh0KGRheSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSGlnaGxpZ2h0IHRvZGF5XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRheSA9PT0gdG9kYXkuZ2V0RGF0ZSgpICYmIG1vbnRoID09PSB0b2RheS5nZXRNb250aCgpICYmIHllYXIgPT09IHRvZGF5LmdldEZ1bGxZZWFyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRkYXlfbnVtLmFkZENsYXNzKCd0ZXh0LXByaW1hcnknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICR0ZC5hZGRDbGFzcygnYm9yZGVyLXByaW1hcnknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICR0ZC5hcHBlbmQoJGRheV9udW0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBldmVudHMgZm9yIHRoaXMgZGF5IGlmIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFyZ3MuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLmdldF9ldmVudHNfZm9yX2RhdGUoeWVhciwgbW9udGgsIGRheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMuZm9yRWFjaChldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJGV2ZW50ID0gJCgnPGRpdj4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2JhZGdlIGJnLXByaW1hcnkgdGV4dC10cnVuY2F0ZSB3LTEwMCBtYi0xIHRleHQtc3RhcnQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3NzKCdjdXJzb3InLCAncG9pbnRlcicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KGV2ZW50LnRpdGxlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFyZ3Mub25fZXZlbnRfY2xpY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJncy5vbl9ldmVudF9jbGljayhldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0ZC5hcHBlbmQoJGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgJHRkLmF0dHIoJ2RhdGEtZGF0ZScsIGAke3llYXJ9LSR7c3RyKG1vbnRoICsgMSkucGFkU3RhcnQoMiwgJzAnKX0tJHtzdHIoZGF5KS5wYWRTdGFydCgyLCAnMCcpfWApO1xuICAgICAgICAgICAgICAgICAgICAkdGQuY3NzKCdjdXJzb3InLCAncG9pbnRlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgICR0ZC5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9kYXRlX2NsaWNrICYmICEkKGUudGFyZ2V0KS5oYXNDbGFzcygnYmFkZ2UnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJncy5vbl9kYXRlX2NsaWNrKCR0ZC5hdHRyKCdkYXRhLWRhdGUnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGRheSsrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICR0ci5hcHBlbmQoJHRkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJHRib2R5LmFwcGVuZCgkdHIpO1xuXG4gICAgICAgICAgICBpZiAoZGF5ID4gZGF5c19pbl9tb250aCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRfZXZlbnRzX2Zvcl9kYXRlKHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFyZ3MuZXZlbnRzKSByZXR1cm4gW107XG5cbiAgICAgICAgY29uc3QgZGF0ZV9zdHIgPSBgJHt5ZWFyfS0ke3N0cihtb250aCArIDEpLnBhZFN0YXJ0KDIsICcwJyl9LSR7c3RyKGRheSkucGFkU3RhcnQoMiwgJzAnKX1gO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3MuZXZlbnRzLmZpbHRlcihldmVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnQuZGF0ZSA9PT0gZGF0ZV9zdHI7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNQSxhQUFhLFNBQVNDLGdCQUFnQixDQUFDO0VBQ3pDQyxRQUFRQSxDQUFBLEVBQUc7SUFDUCxJQUFJLENBQUNDLFlBQVksR0FBRyxJQUFJQyxJQUFJLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUNDLGVBQWUsQ0FBQyxDQUFDO0lBRXRCLElBQUksQ0FBQ0MsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDQyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU07TUFDbkMsSUFBSSxDQUFDSixZQUFZLENBQUNLLFFBQVEsQ0FBQyxJQUFJLENBQUNMLFlBQVksQ0FBQ00sUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDNUQsSUFBSSxDQUFDSixlQUFlLENBQUMsQ0FBQztJQUMxQixDQUFDLENBQUM7SUFFRixJQUFJLENBQUNDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQ0MsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNO01BQ25DLElBQUks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
|