Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions models/Component.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -924,6 +924,33 @@ component output="true" accessors="true" {
);
}

/**
* Method that is invoked when a file upload errors.
*
* @prop string | The property for the file input.
* @errors any | The errors that occurred during upload.
* @multiple boolean | Whether multiple files are being uploaded.
*
* @return void
*/
function _uploadErrored( prop, errors, multiple ) {
// Dispatch the upload errored event
dispatchSelf(
event="upload:errored",
params=[
"name"=arguments.prop
]
);
// Check if the component has an onUploadError method and invoke it
if ( structKeyExists( this, "onUploadError" ) ) {
invoke( this, "onUploadError", {
property: arguments.prop,
errors: arguments.errors,
multiple: arguments.multiple
} );
}
}

/**
* Fires when missing methods are called.
* Handles computed properties.
Expand Down
29 changes: 29 additions & 0 deletions test-harness/tests/specs/CBWIRESpec.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -1060,6 +1060,35 @@ component extends="coldbox.system.testing.BaseTestCase" {
expect( response.components[1].effects.html ).toInclude( "Hydrated Property: true" );
} );

it( "should call onUploadError() if it exists when _uploadErrored is called", function() {
var payload = incomingRequest(
memo = {
"name": "test.should_call_onuploaderror",
"id": "Z1Ruz1tGMPXSfw7osBW2",
"children": []
},
data = {
"uploadErrored": false,
"erroredPropertyName": "",
"errorInfo": "",
"isMultiple": false
},
calls = [
{
"path": "",
"method": "_uploadErrored",
"params": [ "photo", null, false ]
}
],
updates = {}
);
var response = cbwireController.handleRequest( payload, event );
expect( response.components[1].effects.html ).toInclude( "Upload Errored: true" );
expect( response.components[1].effects.html ).toInclude( "Errored Property Name: photo" );
expect( response.components[1].effects.html ).toInclude( "Error Info: null" );
expect( response.components[1].effects.html ).toInclude( "Is Multiple: false" );
} );

it( "should be able to return javascript to return", () => {
var payload = incomingRequest(
memo = {
Expand Down
17 changes: 17 additions & 0 deletions test-harness/wires/OnUploadError.cfc
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
component extends="cbwire.models.Component" {

data = {
"uploadErrored": false,
"erroredPropertyName": "",
"errorInfo": "",
"isMultiple": false
};

function onUploadError( property, errors, multiple ) {
data.uploadErrored = true;
data.erroredPropertyName = arguments.property;
data.errorInfo = isNull( arguments.errors ) ? "null" : "has errors";
data.isMultiple = arguments.multiple;
}

}
8 changes: 8 additions & 0 deletions test-harness/wires/OnUploadError.cfm
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<cfoutput>
<div>
<div>Upload Errored: #uploadErrored#</div>
<div>Errored Property Name: #erroredPropertyName#</div>
<div>Error Info: #errorInfo#</div>
<div>Is Multiple: #isMultiple#</div>
</div>
</cfoutput>
26 changes: 26 additions & 0 deletions test-harness/wires/test/should_call_onuploaderror.cfm
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<cfscript>
// @startWire
data = {
"uploadErrored": false,
"erroredPropertyName": "",
"errorInfo": "",
"isMultiple": false
};

function onUploadError( property, errors, multiple ) {
data.uploadErrored = true;
data.erroredPropertyName = arguments.property;
data.errorInfo = isNull( arguments.errors ) ? "null" : "has errors";
data.isMultiple = arguments.multiple;
}
// @endWire
</cfscript>

<cfoutput>
<div>
<div>Upload Errored: #uploadErrored#</div>
<div>Errored Property Name: #erroredPropertyName#</div>
<div>Error Info: #errorInfo#</div>
<div>Is Multiple: #isMultiple#</div>
</div>
</cfoutput>