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>
76 lines
9.4 KiB
JavaScript
Executable File
76 lines
9.4 KiB
JavaScript
Executable File
"use strict";
|
|
|
|
class Comment_Thread extends Component {
|
|
async on_load() {
|
|
if (this.args.data_source) {
|
|
const response = await fetch(this.args.data_source);
|
|
this.data.comments = await response.json();
|
|
} else if (this.args.comments) {
|
|
this.data.comments = this.args.comments;
|
|
}
|
|
}
|
|
on_ready() {
|
|
// Submit new comment
|
|
this.$sid('submit_btn').on('click', () => {
|
|
this.submit_comment();
|
|
});
|
|
|
|
// Reply buttons
|
|
this.$.find('.reply-btn').on('click', e => {
|
|
const $comment = $(e.target).closest('[data-comment-id]');
|
|
const comment_id = $comment.attr('data-comment-id');
|
|
this.show_reply_form(comment_id);
|
|
});
|
|
|
|
// Edit buttons
|
|
this.$.find('.edit-btn').on('click', e => {
|
|
const $comment = $(e.target).closest('[data-comment-id]');
|
|
const comment_id = $comment.attr('data-comment-id');
|
|
this.edit_comment(comment_id);
|
|
});
|
|
|
|
// Delete buttons
|
|
this.$.find('.delete-btn').on('click', e => {
|
|
const $comment = $(e.target).closest('[data-comment-id]');
|
|
const comment_id = $comment.attr('data-comment-id');
|
|
this.delete_comment(comment_id);
|
|
});
|
|
}
|
|
async submit_comment() {
|
|
const text = this.$sid('comment_input').val().trim();
|
|
if (!text) return;
|
|
if (this.args.on_submit) {
|
|
const result = await this.args.on_submit(text);
|
|
if (result) {
|
|
this.$sid('comment_input').val('');
|
|
await this.reload_data();
|
|
}
|
|
}
|
|
}
|
|
show_reply_form(comment_id) {
|
|
// TODO: Implement reply form UI
|
|
console.log('Reply to comment:', comment_id);
|
|
}
|
|
edit_comment(comment_id) {
|
|
if (this.args.on_edit) {
|
|
this.args.on_edit(comment_id);
|
|
}
|
|
}
|
|
async delete_comment(comment_id) {
|
|
if (!confirm('Delete this comment?')) return;
|
|
if (this.args.on_delete) {
|
|
const result = await this.args.on_delete(comment_id);
|
|
if (result) {
|
|
await this.reload_data();
|
|
}
|
|
}
|
|
}
|
|
async reload_data() {
|
|
if (this.args.data_source) {
|
|
const response = await fetch(this.args.data_source);
|
|
this.data.comments = await response.json();
|
|
this.render();
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb21tZW50X1RocmVhZCIsIkpxaHRtbF9Db21wb25lbnQiLCJvbl9sb2FkIiwiYXJncyIsImRhdGFfc291cmNlIiwicmVzcG9uc2UiLCJmZXRjaCIsImRhdGEiLCJjb21tZW50cyIsImpzb24iLCJvbl9yZWFkeSIsIiRpZCIsIm9uIiwic3VibWl0X2NvbW1lbnQiLCIkIiwiZmluZCIsImUiLCIkY29tbWVudCIsInRhcmdldCIsImNsb3Nlc3QiLCJjb21tZW50X2lkIiwiYXR0ciIsInNob3dfcmVwbHlfZm9ybSIsImVkaXRfY29tbWVudCIsImRlbGV0ZV9jb21tZW50IiwidGV4dCIsInZhbCIsInRyaW0iLCJvbl9zdWJtaXQiLCJyZXN1bHQiLCJyZWxvYWRfZGF0YSIsImNvbnNvbGUiLCJsb2ciLCJvbl9lZGl0IiwiY29uZmlybSIsIm9uX2RlbGV0ZSIsInJlbmRlciJdLCJzb3VyY2VzIjpbInJzeC90aGVtZS9jb21wb25lbnRzL19hcmNoaXZlZC91bmZpbmlzaGVkL0NvbW1lbnRfVGhyZWFkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIENvbW1lbnRfVGhyZWFkIGV4dGVuZHMgSnFodG1sX0NvbXBvbmVudCB7XG4gICAgYXN5bmMgb25fbG9hZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYXJncy5kYXRhX3NvdXJjZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLmFyZ3MuZGF0YV9zb3VyY2UpO1xuICAgICAgICAgICAgdGhpcy5kYXRhLmNvbW1lbnRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXJncy5jb21tZW50cykge1xuICAgICAgICAgICAgdGhpcy5kYXRhLmNvbW1lbnRzID0gdGhpcy5hcmdzLmNvbW1lbnRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25fcmVhZHkoKSB7XG4gICAgICAgIC8vIFN1Ym1pdCBuZXcgY29tbWVudFxuICAgICAgICB0aGlzLiRpZCgnc3VibWl0X2J0bicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0X2NvbW1lbnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVwbHkgYnV0dG9uc1xuICAgICAgICB0aGlzLiQuZmluZCgnLnJlcGx5LWJ0bicpLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkY29tbWVudCA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ1tkYXRhLWNvbW1lbnQtaWRdJyk7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50X2lkID0gJGNvbW1lbnQuYXR0cignZGF0YS1jb21tZW50LWlkJyk7XG4gICAgICAgICAgICB0aGlzLnNob3dfcmVwbHlfZm9ybShjb21tZW50X2lkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRWRpdCBidXR0b25zXG4gICAgICAgIHRoaXMuJC5maW5kKCcuZWRpdC1idG4nKS5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJGNvbW1lbnQgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1jb21tZW50LWlkXScpO1xuICAgICAgICAgICAgY29uc3QgY29tbWVudF9pZCA9ICRjb21tZW50LmF0dHIoJ2RhdGEtY29tbWVudC1pZCcpO1xuICAgICAgICAgICAgdGhpcy5lZGl0X2NvbW1lbnQoY29tbWVudF9pZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlbGV0ZSBidXR0b25zXG4gICAgICAgIHRoaXMuJC5maW5kKCcuZGVsZXRlLWJ0bicpLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkY29tbWVudCA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ1tkYXRhLWNvbW1lbnQtaWRdJyk7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50X2lkID0gJGNvbW1lbnQuYXR0cignZGF0YS1jb21tZW50LWlkJyk7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZV9jb21tZW50KGNvbW1lbnRfaWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBzdWJtaXRfY29tbWVudCgpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuJGlkKCdjb21tZW50X2lucHV0JykudmFsKCkudHJpbSgpO1xuICAgICAgICBpZiAoIXRleHQpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5hcmdzLm9uX3N1Ym1pdCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hcmdzLm9uX3N1Ym1pdCh0ZXh0KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRpZCgnY29tbWVudF9pbnB1dCcpLnZhbCgnJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWxvYWRfZGF0YSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd19yZXBseV9mb3JtKGNvbW1lbnRfaWQpIHtcbiAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHJlcGx5IGZvcm0gVUlcbiAgICAgICAgY29uc29sZS5sb2coJ1JlcGx5IHRvIGNvbW1lbnQ6JywgY29tbWVudF9pZCk7XG4gICAgfVxuXG4gICAgZWRpdF9jb21tZW50KGNvbW1lbnRfaWQpIHtcbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9lZGl0KSB7XG4gICAgICAgICAgICB0aGlzLmFyZ3Mub25fZWRpdChjb21tZW50X2lkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZV9jb21tZW50KGNvbW1lbnRfaWQpIHtcbiAgICAgICAgaWYgKCFjb25maXJtKCdEZWxldGUgdGhpcyBjb21tZW50PycpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9kZWxldGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXJncy5vbl9kZWxldGUoY29tbWVudF9pZCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWxvYWRfZGF0YSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcmVsb2FkX2RhdGEoKSB7XG4gICAgICAgIGlmICh0aGlzLmFyZ3MuZGF0YV9zb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5hcmdzLmRhdGFfc291cmNlKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5jb21tZW50cyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBTUEsY0FBYyxTQUFTQyxnQkFBZ0IsQ0FBQztFQUMxQyxNQUFNQyxPQUFPQSxDQUFBLEVBQUc7SUFDWixJQUFJLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxXQUFXLEVBQUU7TUFDdkIsTUFBTUMsUUFBUSxHQUFHLE1BQU1DLEtBQUssQ0FBQyxJQUFJLENBQUNILElBQUksQ0FBQ0MsV0FBVyxDQUFDO01BQ25ELElBQUksQ0FBQ0csSUFBSSxDQUFDQyxRQUFRLEdBQUcsTUFBTUgsUUFBUSxDQUFDSSxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUNOLElBQUksQ0FBQ0ssUUFBUSxFQUFFO01BQzNCLElBQUksQ0FBQ0QsSUFBSSxDQUFDQyxRQUFRLEdBQUcsSUFBSSxDQUFDTCxJQUFJLENBQUNLLFFBQVE7SUFDM0M7RUFDSjtFQUVBRSxRQUFRQSxDQUFBLEVBQUc7SUFDUDtJQUNBLElBQUksQ0FBQ0MsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDQyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU07TUFDckMsSUFBSSxDQUFDQyxjQUFjLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUM7O0lBRUY7SUFDQSxJQUFJLENBQUNDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDSCxFQUFFLENBQUMsT0FBTyxFQUFHSSxDQUFDLElBQUs7TUFDekMsTUFBTUMsUUFBUSxHQUFHSCxDQUFDLENBQUNFLENBQUMsQ0FBQ0UsTUFBTSxDQUFDLENBQUNDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztNQUN6RCxNQUFNQyxVQUFVLEdBQUdILFFBQVEsQ0FBQ0ksSUFBSSxDQUFDLGlCQUFpQixDQUFDO01BQ25ELElBQUksQ0FBQ0MsZUFBZSxDQUFDRixVQUFVLENBQUM7SUFDcEMsQ0FBQyxDQUFDOztJQUVGO0lBQ0EsSUFBSSxDQUFDTixDQUFDLENBQUNDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQ0gsRUFBRSxDQUFDLE9BQU8sRUFBR0ksQ0FBQyxJQUFLO01BQ3hDLE1BQU1DLFFBQVEsR0FBR0gsQ0FBQyxDQUFDRSxDQUFDLENBQUNFLE1BQU0sQ0FBQyxDQUFDQyxPQUFPLENBQUMsbUJBQW1CLENBQUM7TUFDekQsTUFBTUMsVUFBVSxHQUFHSCxRQUFRLENBQUNJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztNQUNuRCxJQUFJLENBQUNFLFlBQVksQ0FBQ0gsVUFBVSxDQUFDO0lBQ2pDLENBQUMsQ0FBQzs7SUFFRjtJQUNBLElBQUksQ0FBQ04sQ0FBQyxDQUFDQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUNILEVBQUUsQ0FBQyxPQUFPLEVBQUdJLENBQUMsSUFBSztNQUMxQyxNQUFNQyxRQUFRLEdBQUdILENBQUMsQ0FBQ0UsQ0FBQyxDQUFDRSxNQUFNLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLG1CQUFtQixDQUFDO01BQ3pELE1BQU1DLFVBQVUsR0FBR0gsUUFBUSxDQUFDSSxJQUFJLENBQUMsaUJBQWlCLENBQUM7TUFDbkQsSUFBSSxDQUFDRyxjQUFjLENBQUNKLFVBQVUsQ0FBQztJQUNuQyxDQUFDLENBQUM7RUFDTjtFQUVBLE1BQU1QLGNBQWNBLENBQUEsRUFBRztJQUNuQixNQUFNWSxJQUFJLEdBQUcsSUFBSSxDQUFDZCxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUNlLEdBQUcsQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxDQUFDO0lBQ25ELElBQUksQ0FBQ0YsSUFBSSxFQUFFO0lBRVgsSUFBSSxJQUFJLENBQUN0QixJQUFJLENBQUN5QixTQUFTLEVBQUU7TUFDckIsTUFBTUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDMUIsSUFBSSxDQUFDeUIsU0FBUyxDQUFDSCxJQUFJLENBQUM7TUFDOUMsSUFBSUksTUFBTSxFQUFFO1FBQ1IsSUFBSSxDQUFDbEIsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDZSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxDQUFDSSxXQUFXLENBQUMsQ0FBQztNQUM1QjtJQUNKO0VBQ0o7RUFFQVIsZUFBZUEsQ0FBQ0YsVUFBVSxFQUFFO0lBQ3hCO0lBQ0FXLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLG1CQUFtQixFQUFFWixVQUFVLENBQUM7RUFDaEQ7RUFFQUcsWUFBWUEsQ0FBQ0gsVUFBVSxFQUFFO0lBQ3JCLElBQUksSUFBSSxDQUFDakIsSUFBSSxDQUFDOEIsT0FBTyxFQUFFO01BQ25CLElBQUksQ0FBQzlCLElBQUksQ0FBQzhCLE9BQU8sQ0FBQ2IsVUFBVSxDQUFDO0lBQ2pDO0VBQ0o7RUFFQSxNQUFNSSxjQUFjQSxDQUFDSixVQUFVLEVBQUU7SUFDN0IsSUFBSSxDQUFDYyxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFBRTtJQUV0QyxJQUFJLElBQUksQ0FBQy9CLElBQUksQ0FBQ2dDLFNBQVMsRUFBRTtNQUNyQixNQUFNTixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMxQixJQUFJLENBQUNnQyxTQUFTLENBQUNmLFVBQVUsQ0FBQztNQUNwRCxJQUFJUyxNQUFNLEVBQUU7UUFDUixNQUFNLElBQUksQ0FBQ0MsV0FBVyxDQUFDLENBQUM7TUFDNUI7SUFDSjtFQUNKO0VBRUEsTUFBTUEsV0FBV0EsQ0FBQSxFQUFHO0lBQ2hCLElBQUksSUFBSSxDQUFDM0IsSUFBSSxDQUFDQyxXQUFXLEVBQUU7TUFDdkIsTUFBTUMsUUFBUSxHQUFHLE1BQU1DLEtBQUssQ0FBQyxJQUFJLENBQUNILElBQUksQ0FBQ0MsV0FBVyxDQUFDO01BQ25ELElBQUksQ0FBQ0csSUFBSSxDQUFDQyxRQUFRLEdBQUcsTUFBTUgsUUFBUSxDQUFDSSxJQUFJLENBQUMsQ0FBQztNQUMxQyxJQUFJLENBQUMyQixNQUFNLENBQUMsQ0FBQztJQUNqQjtFQUNKO0FBQ0oiLCJpZ25vcmVMaXN0IjpbXX0=
|