"use strict"; /** * Profile_Photo_Input * * Profile photo upload widget with thumbnail display and upload handling. * See profile_photo_input.jqhtml for full documentation. * * JavaScript Responsibilities: * - Handle file selection and upload * - Update thumbnail on successful upload * - Manage loading state with spinner * - Provide val() getter/setter for attachment key * - Handle remove button functionality */ class Profile_Photo_Input extends Form_Input_Abstract { on_create() { // Initialize data this.data.attachment_key = ''; this.data.thumbnail_url = ''; } on_render() { // Handle upload button click - trigger hidden file input this.$sid('upload_btn').on('click', () => { this.$sid('file_input').click(); }); // Handle file selection this.$sid('file_input').on('change', () => { const file = this.$sid('file_input')[0].files[0]; if (!file) return; this.upload_photo(file); }); // Handle remove button if (this.args.show_remove) { this.$sid('remove_btn').on('click', () => { this.remove_photo(); }); } } /** * val() - Get or set the attachment key * @param {string} [key] - If provided, sets the attachment key and updates thumbnail * @returns {string} The current attachment key when called as getter */ val(key) { if (arguments.length === 0) { // Getter - return attachment key return this.data.attachment_key || ''; } else { // Setter - set attachment key and update thumbnail this.data.attachment_key = key || ''; if (this.data.attachment_key) { // Generate thumbnail URL from attachment key const width = this.args.width || 96; const height = this.args.height || 96; this.data.thumbnail_url = `/_thumbnail/${this.data.attachment_key}/cover/${width}/${height}`; } else { // No key - clear thumbnail this.data.thumbnail_url = ''; } console.log('Rerender'); // Re-render to switch between icon and image this.render(); } } upload_photo(file) { // Validate file size const max_size = (this.args.max_size || 2) * 1024 * 1024; // Convert MB to bytes if (file.size > max_size) { alert(`File size must be less than ${this.args.max_size || 2}MB`); this.$sid('file_input').val(''); // Clear selection return; } // Show spinner, dim image this.$sid('spinner').removeClass('d-none'); this.$sid('photo').css('opacity', '0.3'); // Create FormData for file upload const form_data = new FormData(); form_data.append('file', file); form_data.append('site_id', '1'); // TODO: Get from session/config // Do NOT set fileable_type/fileable_category - file uploads unattached // The parent form will assign it via attach_to() on save // Upload file via AJAX $.ajax({ url: '/_upload', type: 'POST', data: form_data, processData: false, contentType: false, success: response => { console.log('Profile photo upload successful:', response); // Update attachment key (this will also update thumbnail) this.val(response.attachment.key); // Hide spinner, restore opacity this.$sid('spinner').addClass('d-none'); this.$sid('photo').css('opacity', '1'); // Clear file input for future uploads this.$sid('file_input').val(''); // Trigger change event for form tracking this.$.trigger('change'); }, error: (xhr, status, error) => { var _xhr$responseJSON; console.error('Profile photo upload failed:', error); console.error('Response:', xhr.responseJSON); // Hide spinner, restore opacity this.$sid('spinner').addClass('d-none'); this.$sid('photo').css('opacity', '1'); // Clear file input this.$sid('file_input').val(''); // Show error to user alert('Upload failed: ' + (((_xhr$responseJSON = xhr.responseJSON) === null || _xhr$responseJSON === void 0 ? void 0 : _xhr$responseJSON.error) || error)); } }); } update_photo() { // <% if (this.args.show_remove && this.data.attachment_key) { %> } remove_photo() { // Clear attachment key (sets to placeholder) this.val(''); // Trigger change event for form tracking this.$.trigger('change'); } async seed() { // For testing - set a placeholder key // In production, this would use actual test data this.val(''); } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9maWxlX1Bob3RvX0lucHV0IiwiRm9ybV9JbnB1dF9BYnN0cmFjdCIsIm9uX2NyZWF0ZSIsImRhdGEiLCJhdHRhY2htZW50X2tleSIsInRodW1ibmFpbF91cmwiLCJvbl9yZW5kZXIiLCIkaWQiLCJvbiIsImNsaWNrIiwiZmlsZSIsImZpbGVzIiwidXBsb2FkX3Bob3RvIiwiYXJncyIsInNob3dfcmVtb3ZlIiwicmVtb3ZlX3Bob3RvIiwidmFsIiwia2V5IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwid2lkdGgiLCJoZWlnaHQiLCJjb25zb2xlIiwibG9nIiwicmVuZGVyIiwibWF4X3NpemUiLCJzaXplIiwiYWxlcnQiLCJyZW1vdmVDbGFzcyIsImNzcyIsImZvcm1fZGF0YSIsIkZvcm1EYXRhIiwiYXBwZW5kIiwiJCIsImFqYXgiLCJ1cmwiLCJ0eXBlIiwicHJvY2Vzc0RhdGEiLCJjb250ZW50VHlwZSIsInN1Y2Nlc3MiLCJyZXNwb25zZSIsImF0dGFjaG1lbnQiLCJhZGRDbGFzcyIsInRyaWdnZXIiLCJlcnJvciIsInhociIsInN0YXR1cyIsIl94aHIkcmVzcG9uc2VKU09OIiwicmVzcG9uc2VKU09OIiwidXBkYXRlX3Bob3RvIiwic2VlZCJdLCJzb3VyY2VzIjpbInJzeC90aGVtZS9jb21wb25lbnRzL2lucHV0cy9wcm9maWxlX3Bob3RvX2lucHV0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvZmlsZV9QaG90b19JbnB1dFxuICpcbiAqIFByb2ZpbGUgcGhvdG8gdXBsb2FkIHdpZGdldCB3aXRoIHRodW1ibmFpbCBkaXNwbGF5IGFuZCB1cGxvYWQgaGFuZGxpbmcuXG4gKiBTZWUgcHJvZmlsZV9waG90b19pbnB1dC5qcWh0bWwgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi5cbiAqXG4gKiBKYXZhU2NyaXB0IFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIEhhbmRsZSBmaWxlIHNlbGVjdGlvbiBhbmQgdXBsb2FkXG4gKiAtIFVwZGF0ZSB0aHVtYm5haWwgb24gc3VjY2Vzc2Z1bCB1cGxvYWRcbiAqIC0gTWFuYWdlIGxvYWRpbmcgc3RhdGUgd2l0aCBzcGlubmVyXG4gKiAtIFByb3ZpZGUgdmFsKCkgZ2V0dGVyL3NldHRlciBmb3IgYXR0YWNobWVudCBrZXlcbiAqIC0gSGFuZGxlIHJlbW92ZSBidXR0b24gZnVuY3Rpb25hbGl0eVxuICovXG5jbGFzcyBQcm9maWxlX1Bob3RvX0lucHV0IGV4dGVuZHMgRm9ybV9JbnB1dF9BYnN0cmFjdCB7XG4gICAgb25fY3JlYXRlKCkge1xuICAgICAgICAvLyBJbml0aWFsaXplIGRhdGFcbiAgICAgICAgdGhpcy5kYXRhLmF0dGFjaG1lbnRfa2V5ID0gJyc7XG4gICAgICAgIHRoaXMuZGF0YS50aHVtYm5haWxfdXJsID0gJyc7XG4gICAgfVxuXG4gICAgb25fcmVuZGVyKCkge1xuICAgICAgICAvLyBIYW5kbGUgdXBsb2FkIGJ1dHRvbiBjbGljayAtIHRyaWdnZXIgaGlkZGVuIGZpbGUgaW5wdXRcbiAgICAgICAgdGhpcy4kaWQoJ3VwbG9hZF9idG4nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiRpZCgnZmlsZV9pbnB1dCcpLmNsaWNrKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhhbmRsZSBmaWxlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLiRpZCgnZmlsZV9pbnB1dCcpLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gdGhpcy4kaWQoJ2ZpbGVfaW5wdXQnKVswXS5maWxlc1swXTtcbiAgICAgICAgICAgIGlmICghZmlsZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICB0aGlzLnVwbG9hZF9waG90byhmaWxlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSGFuZGxlIHJlbW92ZSBidXR0b25cbiAgICAgICAgaWYgKHRoaXMuYXJncy5zaG93X3JlbW92ZSkge1xuICAgICAgICAgICAgdGhpcy4kaWQoJ3JlbW92ZV9idG4nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVfcGhvdG8oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdmFsKCkgLSBHZXQgb3Igc2V0IHRoZSBhdHRhY2htZW50IGtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSAtIElmIHByb3ZpZGVkLCBzZXRzIHRoZSBhdHRhY2htZW50IGtleSBhbmQgdXBkYXRlcyB0aHVtYm5haWxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY3VycmVudCBhdHRhY2htZW50IGtleSB3aGVuIGNhbGxlZCBhcyBnZXR0ZXJcbiAgICAgKi9cbiAgICB2YWwoa2V5KSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBHZXR0ZXIgLSByZXR1cm4gYXR0YWNobWVudCBrZXlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuYXR0YWNobWVudF9rZXkgfHwgJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZXR0ZXIgLSBzZXQgYXR0YWNobWVudCBrZXkgYW5kIHVwZGF0ZSB0aHVtYm5haWxcbiAgICAgICAgICAgIHRoaXMuZGF0YS5hdHRhY2htZW50X2tleSA9IGtleSB8fCAnJztcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5hdHRhY2htZW50X2tleSkge1xuICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIHRodW1ibmFpbCBVUkwgZnJvbSBhdHRhY2htZW50IGtleVxuICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5hcmdzLndpZHRoIHx8IDk2O1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuYXJncy5oZWlnaHQgfHwgOTY7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLnRodW1ibmFpbF91cmwgPSBgL190aHVtYm5haWwvJHt0aGlzLmRhdGEuYXR0YWNobWVudF9rZXl9L2NvdmVyLyR7d2lkdGh9LyR7aGVpZ2h0fWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vIGtleSAtIGNsZWFyIHRodW1ibmFpbFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS50aHVtYm5haWxfdXJsID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXJlbmRlcicpO1xuICAgICAgICAgICAgLy8gUmUtcmVuZGVyIHRvIHN3aXRjaCBiZXR3ZWVuIGljb24gYW5kIGltYWdlXG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBsb2FkX3Bob3RvKGZpbGUpIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgZmlsZSBzaXplXG4gICAgICAgIGNvbnN0IG1heF9zaXplID0gKHRoaXMuYXJncy5tYXhfc2l6ZSB8fCAyKSAqIDEwMjQgKiAxMDI0OyAvLyBDb252ZXJ0IE1CIHRvIGJ5dGVzXG4gICAgICAgIGlmIChmaWxlLnNpemUgPiBtYXhfc2l6ZSkge1xuICAgICAgICAgICAgYWxlcnQoYEZpbGUgc2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiAke3RoaXMuYXJncy5tYXhfc2l6ZSB8fCAyfU1CYCk7XG4gICAgICAgICAgICB0aGlzLiRpZCgnZmlsZV9pbnB1dCcpLnZhbCgnJyk7IC8vIENsZWFyIHNlbGVjdGlvblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvdyBzcGlubmVyLCBkaW0gaW1hZ2VcbiAgICAgICAgdGhpcy4kaWQoJ3NwaW5uZXInKS5yZW1vdmVDbGFzcygnZC1ub25lJyk7XG4gICAgICAgIHRoaXMuJGlkKCdwaG90bycpLmNzcygnb3BhY2l0eScsICcwLjMnKTtcblxuICAgICAgICAvLyBDcmVhdGUgRm9ybURhdGEgZm9yIGZpbGUgdXBsb2FkXG4gICAgICAgIGNvbnN0IGZvcm1fZGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3JtX2RhdGEuYXBwZW5kKCdmaWxlJywgZmlsZSk7XG4gICAgICAgIGZvcm1fZGF0YS5hcHBlbmQoJ3NpdGVfaWQnLCAnMScpOyAvLyBUT0RPOiBHZXQgZnJvbSBzZXNzaW9uL2NvbmZpZ1xuICAgICAgICAvLyBEbyBOT1Qgc2V0IGZpbGVhYmxlX3R5cGUvZmlsZWFibGVfY2F0ZWdvcnkgLSBmaWxlIHVwbG9hZHMgdW5hdHRhY2hlZFxuICAgICAgICAvLyBUaGUgcGFyZW50IGZvcm0gd2lsbCBhc3NpZ24gaXQgdmlhIGF0dGFjaF90bygpIG9uIHNhdmVcblxuICAgICAgICAvLyBVcGxvYWQgZmlsZSB2aWEgQUpBWFxuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiAnL191cGxvYWQnLFxuICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxuICAgICAgICAgICAgZGF0YTogZm9ybV9kYXRhLFxuICAgICAgICAgICAgcHJvY2Vzc0RhdGE6IGZhbHNlLFxuICAgICAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLFxuICAgICAgICAgICAgc3VjY2VzczogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1Byb2ZpbGUgcGhvdG8gdXBsb2FkIHN1Y2Nlc3NmdWw6JywgcmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGF0dGFjaG1lbnQga2V5ICh0aGlzIHdpbGwgYWxzbyB1cGRhdGUgdGh1bWJuYWlsKVxuICAgICAgICAgICAgICAgIHRoaXMudmFsKHJlc3BvbnNlLmF0dGFjaG1lbnQua2V5KTtcblxuICAgICAgICAgICAgICAgIC8vIEhpZGUgc3Bpbm5lciwgcmVzdG9yZSBvcGFjaXR5XG4gICAgICAgICAgICAgICAgdGhpcy4kaWQoJ3NwaW5uZXInKS5hZGRDbGFzcygnZC1ub25lJyk7XG4gICAgICAgICAgICAgICAgdGhpcy4kaWQoJ3Bob3RvJykuY3NzKCdvcGFjaXR5JywgJzEnKTtcblxuICAgICAgICAgICAgICAgIC8vIENsZWFyIGZpbGUgaW5wdXQgZm9yIGZ1dHVyZSB1cGxvYWRzXG4gICAgICAgICAgICAgICAgdGhpcy4kaWQoJ2ZpbGVfaW5wdXQnKS52YWwoJycpO1xuXG4gICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZXZlbnQgZm9yIGZvcm0gdHJhY2tpbmdcbiAgICAgICAgICAgICAgICB0aGlzLiQudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6ICh4aHIsIHN0YXR1cywgZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQcm9maWxlIHBob3RvIHVwbG9hZCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Jlc3BvbnNlOicsIHhoci5yZXNwb25zZUpTT04pO1xuXG4gICAgICAgICAgICAgICAgLy8gSGlkZSBzcGlubmVyLCByZXN0b3JlIG9wYWNpdHlcbiAgICAgICAgICAgICAgICB0aGlzLiRpZCgnc3Bpbm5lcicpLmFkZENsYXNzKCdkLW5vbmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLiRpZCgncGhvdG8nKS5jc3MoJ29wYWNpdHknLCAnMScpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgZmlsZSBpbnB1dFxuICAgICAgICAgICAgICAgIHRoaXMuJGlkKCdmaWxlX2lucHV0JykudmFsKCcnKTtcblxuICAgICAgICAgICAgICAgIC8vIFNob3cgZXJyb3IgdG8gdXNlclxuICAgICAgICAgICAgICAgIGFsZXJ0KCdVcGxvYWQgZmFpbGVkOiAnICsgKHhoci5yZXNwb25zZUpTT04/LmVycm9yIHx8IGVycm9yKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cGRhdGVfcGhvdG8oKSB7XG4gICAgICAgIC8vIDwlIGlmICh0aGlzLmFyZ3Muc2hvd19yZW1vdmUgJiYgdGhpcy5kYXRhLmF0dGFjaG1lbnRfa2V5KSB7ICU+XG4gICAgfVxuXG4gICAgcmVtb3ZlX3Bob3RvKCkge1xuICAgICAgICAvLyBDbGVhciBhdHRhY2htZW50IGtleSAoc2V0cyB0byBwbGFjZWhvbGRlcilcbiAgICAgICAgdGhpcy52YWwoJycpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGV2ZW50IGZvciBmb3JtIHRyYWNraW5nXG4gICAgICAgIHRoaXMuJC50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZWVkKCkge1xuICAgICAgICAvLyBGb3IgdGVzdGluZyAtIHNldCBhIHBsYWNlaG9sZGVyIGtleVxuICAgICAgICAvLyBJbiBwcm9kdWN0aW9uLCB0aGlzIHdvdWxkIHVzZSBhY3R1YWwgdGVzdCBkYXRhXG4gICAgICAgIHRoaXMudmFsKCcnKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSxtQkFBbUIsU0FBU0MsbUJBQW1CLENBQUM7RUFDbERDLFNBQVNBLENBQUEsRUFBRztJQUNSO0lBQ0EsSUFBSSxDQUFDQyxJQUFJLENBQUNDLGNBQWMsR0FBRyxFQUFFO0lBQzdCLElBQUksQ0FBQ0QsSUFBSSxDQUFDRSxhQUFhLEdBQUcsRUFBRTtFQUNoQztFQUVBQyxTQUFTQSxDQUFBLEVBQUc7SUFDUjtJQUNBLElBQUksQ0FBQ0MsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDQyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU07TUFDckMsSUFBSSxDQUFDRCxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUNFLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQzs7SUFFRjtJQUNBLElBQUksQ0FBQ0YsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDQyxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU07TUFDdEMsTUFBTUUsSUFBSSxHQUFHLElBQUksQ0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FB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