Files
rspade_system/storage-working/rsx-tmp/babel_4635609362f48178f8c434ea9114f742.js
root 78553d4edf Fix code quality violations for publish
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>
2025-11-21 04:35:01 +00:00

126 lines
15 KiB
JavaScript
Executable File

"use strict";
class File_Upload extends Component {
on_ready() {
const $input = this.$sid('file_input');
const $drop_zone = this.$sid('drop_zone');
if (this.args.accept) {
$input.attr('accept', this.args.accept);
}
if (this.args.multiple) {
$input.attr('multiple', true);
}
// Click to upload
$drop_zone.on('click', () => {
$input.click();
});
// File selected
$input.on('change', e => {
const files = e.target.files;
if (files.length > 0) {
this.handle_files(files);
}
});
// Drag and drop
$drop_zone.on('dragover', e => {
e.preventDefault();
e.stopPropagation();
$drop_zone.addClass('border-primary bg-light');
});
$drop_zone.on('dragleave', e => {
e.preventDefault();
e.stopPropagation();
$drop_zone.removeClass('border-primary bg-light');
});
$drop_zone.on('drop', e => {
e.preventDefault();
e.stopPropagation();
$drop_zone.removeClass('border-primary bg-light');
const files = e.originalEvent.dataTransfer.files;
if (files.length > 0) {
this.handle_files(files);
}
});
// Remove button
this.$sid('remove_btn').on('click', e => {
e.stopPropagation();
this.clear();
});
}
handle_files(files) {
const file = files[0]; // Single file for now
// Validate file size
if (this.args.max_size_bytes && file.size > this.args.max_size_bytes) {
alert(`File is too large. Max size is ${this.format_size(this.args.max_size_bytes)}`);
return;
}
this.selected_file = file;
// Show file info
this.$sid('placeholder').hide();
this.$sid('file_info').show();
this.$sid('file_name').text(file.name);
this.$sid('file_size').text(this.format_size(file.size));
// Auto-upload if endpoint provided
if (this.args.upload_url) {
this.upload();
}
// Trigger callback
if (this.args.on_select) {
this.args.on_select(file);
}
}
async upload() {
if (!this.selected_file || !this.args.upload_url) return;
// Show progress
this.$sid('file_info').hide();
this.$sid('progress').show();
const form_data = new FormData();
form_data.append('file', this.selected_file);
try {
const response = await fetch(this.args.upload_url, {
method: 'POST',
body: form_data
});
const result = await response.json();
// Hide progress
this.$sid('progress').hide();
this.$sid('file_info').show();
if (this.args.on_upload) {
this.args.on_upload(result);
}
} catch (error) {
alert('Upload failed: ' + error.message);
this.$sid('progress').hide();
this.$sid('placeholder').show();
}
}
clear() {
this.selected_file = null;
this.$sid('file_input').val('');
this.$sid('file_info').hide();
this.$sid('progress').hide();
this.$sid('placeholder').show();
if (this.args.on_clear) {
this.args.on_clear();
}
}
get_file() {
return this.selected_file;
}
format_size(bytes) {
if (bytes < 1024) return bytes + ' B';
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGaWxlX1VwbG9hZCIsIkpxaHRtbF9Db21wb25lbnQiLCJvbl9yZWFkeSIsIiRpbnB1dCIsIiRpZCIsIiRkcm9wX3pvbmUiLCJhcmdzIiwiYWNjZXB0IiwiYXR0ciIsIm11bHRpcGxlIiwib24iLCJjbGljayIsImUiLCJmaWxlcyIsInRhcmdldCIsImxlbmd0aCIsImhhbmRsZV9maWxlcyIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsIm9yaWdpbmFsRXZlbnQiLCJkYXRhVHJhbnNmZXIiLCJjbGVhciIsImZpbGUiLCJtYXhfc2l6ZV9ieXRlcyIsInNpemUiLCJhbGVydCIsImZvcm1hdF9zaXplIiwic2VsZWN0ZWRfZmlsZSIsImhpZGUiLCJzaG93IiwidGV4dCIsIm5hbWUiLCJ1cGxvYWRfdXJsIiwidXBsb2FkIiwib25fc2VsZWN0IiwiZm9ybV9kYXRhIiwiRm9ybURhdGEiLCJhcHBlbmQiLCJyZXNwb25zZSIsImZldGNoIiwibWV0aG9kIiwiYm9keSIsInJlc3VsdCIsImpzb24iLCJvbl91cGxvYWQiLCJlcnJvciIsIm1lc3NhZ2UiLCJ2YWwiLCJvbl9jbGVhciIsImdldF9maWxlIiwiYnl0ZXMiLCJ0b0ZpeGVkIl0sInNvdXJjZXMiOlsicnN4L3RoZW1lL2NvbXBvbmVudHMvX2FyY2hpdmVkL3VuZmluaXNoZWQvRmlsZV9VcGxvYWQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgRmlsZV9VcGxvYWQgZXh0ZW5kcyBKcWh0bWxfQ29tcG9uZW50IHtcbiAgICBvbl9yZWFkeSgpIHtcbiAgICAgICAgY29uc3QgJGlucHV0ID0gdGhpcy4kaWQoJ2ZpbGVfaW5wdXQnKTtcbiAgICAgICAgY29uc3QgJGRyb3Bfem9uZSA9IHRoaXMuJGlkKCdkcm9wX3pvbmUnKTtcblxuICAgICAgICBpZiAodGhpcy5hcmdzLmFjY2VwdCkge1xuICAgICAgICAgICAgJGlucHV0LmF0dHIoJ2FjY2VwdCcsIHRoaXMuYXJncy5hY2NlcHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgJGlucHV0LmF0dHIoJ211bHRpcGxlJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGljayB0byB1cGxvYWRcbiAgICAgICAgJGRyb3Bfem9uZS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAkaW5wdXQuY2xpY2soKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRmlsZSBzZWxlY3RlZFxuICAgICAgICAkaW5wdXQub24oJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGUudGFyZ2V0LmZpbGVzO1xuICAgICAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZV9maWxlcyhmaWxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERyYWcgYW5kIGRyb3BcbiAgICAgICAgJGRyb3Bfem9uZS5vbignZHJhZ292ZXInLCAoZSkgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICRkcm9wX3pvbmUuYWRkQ2xhc3MoJ2JvcmRlci1wcmltYXJ5IGJnLWxpZ2h0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICRkcm9wX3pvbmUub24oJ2RyYWdsZWF2ZScsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgJGRyb3Bfem9uZS5yZW1vdmVDbGFzcygnYm9yZGVyLXByaW1hcnkgYmctbGlnaHQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJGRyb3Bfem9uZS5vbignZHJvcCcsIChlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgJGRyb3Bfem9uZS5yZW1vdmVDbGFzcygnYm9yZGVyLXByaW1hcnkgYmctbGlnaHQnKTtcblxuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzO1xuICAgICAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZV9maWxlcyhmaWxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlbW92ZSBidXR0b25cbiAgICAgICAgdGhpcy4kaWQoJ3JlbW92ZV9idG4nKS5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFuZGxlX2ZpbGVzKGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc1swXTsgLy8gU2luZ2xlIGZpbGUgZm9yIG5vd1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIGZpbGUgc2l6ZVxuICAgICAgICBpZiAodGhpcy5hcmdzLm1heF9zaXplX2J5dGVzICYmIGZpbGUuc2l6ZSA+IHRoaXMuYXJncy5tYXhfc2l6ZV9ieXRlcykge1xuICAgICAgICAgICAgYWxlcnQoYEZpbGUgaXMgdG9vIGxhcmdlLiBNYXggc2l6ZSBpcyAke3RoaXMuZm9ybWF0X3NpemUodGhpcy5hcmdzLm1heF9zaXplX2J5dGVzKX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfZmlsZSA9IGZpbGU7XG5cbiAgICAgICAgLy8gU2hvdyBmaWxlIGluZm9cbiAgICAgICAgdGhpcy4kaWQoJ3BsYWNlaG9sZGVyJykuaGlkZSgpO1xuICAgICAgICB0aGlzLiRpZCgnZmlsZV9pbmZvJykuc2hvdygpO1xuICAgICAgICB0aGlzLiRpZCgnZmlsZV9uYW1lJykudGV4dChmaWxlLm5hbWUpO1xuICAgICAgICB0aGlzLiRpZCgnZmlsZV9zaXplJykudGV4dCh0aGlzLmZvcm1hdF9zaXplKGZpbGUuc2l6ZSkpO1xuXG4gICAgICAgIC8vIEF1dG8tdXBsb2FkIGlmIGVuZHBvaW50IHByb3ZpZGVkXG4gICAgICAgIGlmICh0aGlzLmFyZ3MudXBsb2FkX3VybCkge1xuICAgICAgICAgICAgdGhpcy51cGxvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgY2FsbGJhY2tcbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9zZWxlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYXJncy5vbl9zZWxlY3QoZmlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB1cGxvYWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZF9maWxlIHx8ICF0aGlzLmFyZ3MudXBsb2FkX3VybCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFNob3cgcHJvZ3Jlc3NcbiAgICAgICAgdGhpcy4kaWQoJ2ZpbGVfaW5mbycpLmhpZGUoKTtcbiAgICAgICAgdGhpcy4kaWQoJ3Byb2dyZXNzJykuc2hvdygpO1xuXG4gICAgICAgIGNvbnN0IGZvcm1fZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3JtX2RhdGEuYXBwZW5kKCdmaWxlJywgdGhpcy5zZWxlY3RlZF9maWxlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLmFyZ3MudXBsb2FkX3VybCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGJvZHk6IGZvcm1fZGF0YVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgICAgICAgLy8gSGlkZSBwcm9ncmVzc1xuICAgICAgICAgICAgdGhpcy4kaWQoJ3Byb2dyZXNzJykuaGlkZSgpO1xuICAgICAgICAgICAgdGhpcy4kaWQoJ2ZpbGVfaW5mbycpLnNob3coKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuYXJncy5vbl91cGxvYWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFyZ3Mub25fdXBsb2FkKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhbGVydCgnVXBsb2FkIGZhaWxlZDogJyArIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy4kaWQoJ3Byb2dyZXNzJykuaGlkZSgpO1xuICAgICAgICAgICAgdGhpcy4kaWQoJ3BsYWNlaG9sZGVyJykuc2hvdygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfZmlsZSA9IG51bGw7XG4gICAgICAgIHRoaXMuJGlkKCdmaWxlX2lucHV0JykudmFsKCcnKTtcbiAgICAgICAgdGhpcy4kaWQoJ2ZpbGVfaW5mbycpLmhpZGUoKTtcbiAgICAgICAgdGhpcy4kaWQoJ3Byb2dyZXNzJykuaGlkZSgpO1xuICAgICAgICB0aGlzLiRpZCgncGxhY2Vob2xkZXInKS5zaG93KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXJncy5vbl9jbGVhcikge1xuICAgICAgICAgICAgdGhpcy5hcmdzLm9uX2NsZWFyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRfZmlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRfZmlsZTtcbiAgICB9XG5cbiAgICBmb3JtYXRfc2l6ZShieXRlcykge1xuICAgICAgICBpZiAoYnl0ZXMgPCAxMDI0KSByZXR1cm4gYnl0ZXMgKyAnIEInO1xuICAgICAgICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkgcmV0dXJuIChieXRlcyAvIDEwMjQpLnRvRml4ZWQoMSkgKyAnIEtCJztcbiAgICAgICAgcmV0dXJuIChieXRlcyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSkgKyAnIE1CJztcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBTUEsV0FBVyxTQUFTQyxnQkFBZ0IsQ0FBQztFQUN2Q0MsUUFBUUEsQ0FBQSxFQUFHO0lBQ1AsTUFBTUMsTUFBTSxHQUFHLElBQUksQ0FBQ0MsR0FBRyxDQUFDLFlBQVksQ0FBQztJQUNyQyxNQUFNQyxVQUFVLEdBQUcsSUFBSSxDQUFDRCxHQUFHLENBQUMsV0FBVyxDQUFDO0lBRXhDLElBQUksSUFBSSxDQUFDRSxJQUFJLENBQUNDLE1BQU0sRUFBRTtNQUNsQkosTUFBTSxDQUFDSyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQ0YsSUFBSSxDQUFDQyxNQUFNLENBQUM7SUFDM0M7SUFFQSxJQUFJLElBQUksQ0FBQ0QsSUFBSSxDQUFDRyxRQUFRLEVBQUU7TUFDcEJOLE1BQU0sQ0FBQ0ssSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUM7SUFDakM7O0lBRUE7SUFDQUgsVUFBVSxDQUFDSyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU07TUFDekJQLE1BQU0sQ0FBQ1EsS0FBSyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDOztJQUVGO0lBQ0FSLE1BQU0sQ0FBQ08sRUFBRSxDQUFDLFFBQVEsRUFBR0UsQ0FBQyxJQUFLO01BQ3ZCLE1BQU1DLEtBQUssR0FBR0QsQ0FBQyxDQUFDRSxNQUFNLENBQUNELEtBQUs7TUFDNUIsSUFBSUEsS0FBSyxDQUFDRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ2xCLElBQUksQ0FBQ0MsWUFBWSxDQUFDSCxLQUFLLENBQUM7TUFDNUI7SUFDSixDQUFDLENBQUM7O0lBRUY7SUFDQVIsVUFBVSxDQUFDSyxFQUFFLENBQUMsVUFBVSxFQUFHRSxDQUFDLElBQUs7TUFDN0JBLENBQUMsQ0FBQ0ssY0FBYyxDQUFDLENBQUM7TUFDbEJM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