Skip to content

Commit 0673d57

Browse files
committed
PRESIDECMS-3017 Add formbuilder submission preview page.
1 parent 407f12a commit 0673d57

File tree

6 files changed

+92
-44
lines changed

6 files changed

+92
-44
lines changed

system/handlers/formbuilder/Core.cfc

+61-23
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
*/
44
component {
55

6-
property name="formBuilderService" inject="formBuilderService";
7-
property name="formBuilderValidationService" inject="formBuilderValidationService";
8-
property name="validationEngine" inject="validationEngine";
6+
property name="formBuilderService" inject="FormBuilderService";
7+
property name="formBuilderValidationService" inject="FormBuilderValidationService";
8+
property name="formBuilderRenderingService" inject="FormBuilderRenderingService";
9+
property name="validationEngine" inject="ValidationEngine";
910
property name="rulesEngineWebRequestService" inject="RulesEngineWebRequestService";
1011
property name="websiteLoginService" inject="featureInjector:websiteUsers:websiteLoginService";
1112

@@ -24,6 +25,7 @@ component {
2425
var checkAccess = formbuilderService.checkAccessAllowed( formId );
2526
if ( !checkAccess.allowed ) {
2627
if ( checkAccess.reason == "login" ) {
28+
submission.checkAccess = true;
2729
formBuilderService.setTempStoredSubmission( formId, submission );
2830
if ( event.isAjax() ) {
2931
event.renderData( data={ success=false, response=checkAccess.message }, type="json" );
@@ -47,32 +49,38 @@ component {
4749
}
4850

4951
var validationResult = validationEngine.newValidationResult();
52+
var persistStruct = {}
53+
var formItemsInPage = [];
5054

5155
if ( submission.formPageNumber ?: 0 ) {
52-
var validationResult = formBuilderValidationService.validateFormSubmission(
53-
formItems = formBuilderService.getFormItems( id=formId, pageNumber=submission.formPageNumber )
56+
StructAppend( submission, formBuilderService.getTempStoredSubmission( formId ) );
57+
58+
formItemsInPage = formBuilderService.getFormItems( id=formId, pageNumber=submission.formPageNumber );
59+
}
60+
61+
if ( ArrayLen( formItemsInPage ) ) {
62+
validationResult = formBuilderValidationService.validateFormSubmission(
63+
formItems = formItemsInPage
5464
, submissionData = submission
5565
);
5666

5767
if ( validationResult.validated() ) {
58-
var savedData = formBuilderService.getTempStoredSubmission( formId );
59-
6068
submission.formPageNumber += submission._formNextPage ?: 1;
6169

62-
StructAppend( savedData, submission );
63-
64-
formBuilderService.setTempStoredSubmission( formId, savedData );
65-
66-
setNextEvent( url=cgi.http_referer );
70+
formBuilderService.setTempStoredSubmission( formId, submission );
6771
}
6872
} else {
73+
formBuilderService.clearTempStoredSubmission( formId );
74+
6975
validationResult = formBuilderService.saveFormSubmission(
7076
formId = formId
7177
, requestData = submission
7278
, instanceId = ( rc.instanceId ?: "" )
7379
, instanceSite = ( rc.instanceSite ?: "" )
7480
, instanceUrl = ( rc.instanceUrl ?: "" )
7581
);
82+
83+
persistStruct.formBuilderFormSubmitted = formId;
7684
}
7785

7886
if ( event.isAjax() ) {
@@ -83,27 +91,27 @@ component {
8391
} else {
8492
var errors = {};
8593
var messages = validationResult.getMessages();
86-
for( var fieldName in messages ) {
94+
for ( var fieldName in messages ) {
8795
var message = messages[ fieldName ];
8896
errors[ fieldName ] = translateResource( uri=message.message, data=message.params );
8997
}
9098
event.renderData( data={ success=false, errors=errors }, type="json" );
9199
}
92100
} else {
93-
if ( validationResult.validated() ) {
94-
setNextEvent( url=cgi.http_referer, persistStruct={
95-
formBuilderFormSubmitted = formId
96-
} );
97-
} else {
98-
submission.validationResult = validationResult;
99-
setNextEvent( url=cgi.http_referer, persistStruct=submission );
101+
if ( !validationResult.validated() ) {
102+
persistStruct = submission;
103+
persistStruct.validationResult = validationResult;
100104
}
105+
106+
setNextEvent( url=cgi.http_referer, persistStruct=persistStruct );
101107
}
102108
}
103109

104110
private string function formLayout( event, rc, prc, args={} ) {
105-
if ( ( rc.formBuilderFormSubmitted ?: "" ) == ( args.form ?: "" ) ) {
106-
return renderViewlet( event="formbuilder.core.successMessage", args={ formId=args.form } )
111+
var formId = args.form ?: "";
112+
113+
if ( ( rc.formBuilderFormSubmitted ?: "" ) == formId ) {
114+
return renderViewlet( event="formbuilder.core.successMessage", args={ formId=formId } )
107115
}
108116

109117
var validationRulesetName = formBuilderValidationService.getRulesetForFormItems( args.formItems ?: [] );
@@ -114,6 +122,36 @@ component {
114122
);
115123
}
116124

125+
args.renderedResponses = "";
126+
if ( isEmptyString( args.renderedItems ) ) {
127+
var formItems = formBuilderService.getFormItems( id=formId );
128+
var savedData = formBuilderService.getTempStoredSubmission( formId );
129+
130+
for ( var formItem in formItems ) {
131+
formItem.configuration.renderedItem = renderViewlet(
132+
event = formBuilderRenderingService.getItemTypeViewlet( itemType=formItem.item_type, context="response")
133+
, args={
134+
response = savedData[ formItem.configuration.name ?: "" ] ?: ""
135+
, itemConfiguration = formItem.configuration
136+
}
137+
);
138+
139+
formItem.configuration.id = formItem.configuration.id ?: CreateUUID();
140+
141+
if ( StructKeyExists( formItem.configuration, "layout" ) ) {
142+
formItem.configuration.renderedItem = renderViewlet(
143+
event = formBuilderRenderingService.getFormFieldLayoutViewlet(
144+
itemType = formItem.item_type
145+
, layout = formItem.configuration.layout
146+
)
147+
, args = formItem.configuration
148+
);
149+
}
150+
151+
args.renderedResponses &= formItem.configuration.renderedItem;
152+
}
153+
}
154+
117155
args.renderedButtons = renderViewlet( event="formbuilder.core.formButtons", args=args );
118156

119157
event.include( assetId="/js/frontend/formbuilder/" );
@@ -127,7 +165,7 @@ component {
127165

128166
args.isFormPage = formPageNumber > 0;
129167
args.isFirstPage = formPageNumber == 1;
130-
args.isLastPage = formPagesTotal == formPagesTotal;
168+
args.isLastPage = formPageNumber > formPagesTotal;
131169

132170
return renderView( view="/formbuilder/layouts/core/formButtons", args=args );
133171
}

system/handlers/widgets/FormBuilderForm.cfc

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ component {
5959
return checkAccess.content;
6060
}
6161

62-
if ( !StructIsEmpty( savedData ) ) {
62+
if ( isTrue( savedData.checkAccess ?: "" ) ) {
6363
var resubmitMessage = formbuilderService.formHasFileUploadFields( formId ) ? "resubmit.after.login.with.files" : "resubmit.after.login";
6464
rendered &= '<div class="alert alert-info"><p>' & translateResource( "formbuilder:#resubmitMessage#") & '</p></div>';
6565
}

system/services/formbuilder/FormBuilderService.cfc

+8-4
Original file line numberDiff line numberDiff line change
@@ -704,12 +704,16 @@ component {
704704
var submission = _getSessionStorage().getVar( tempStorageKey, StructNew() );
705705

706706
if ( arguments.clearSubmission ) {
707-
_getSessionStorage().deleteVar( tempStorageKey );
707+
clearTempStoredSubmission( formId=arguments.formId );
708708
}
709709

710710
return submission;
711711
}
712712

713+
public void function clearTempStoredSubmission( required string formId ) {
714+
_getSessionStorage().deleteVar( "temp_formbuilder_submission_#formId#" );
715+
}
716+
713717
/**
714718
* Renders the given form within a passed layout
715719
* and using any passed custom configuration data.
@@ -725,10 +729,10 @@ component {
725729
, string layout = "default"
726730
, struct configuration = {}
727731
, any validationResult = ""
732+
, struct savedData = $getRequestContext().getCollectionWithoutSystemVars()
728733
) {
729-
var formPersistData = $getRequestContext().getCollectionWithoutSystemVars();
730-
arguments.configuration.formPagesCount = countFormPages( formId=arguments.formId );
731-
arguments.configuration.formPageNumber = arguments.configuration.formPagesCount ? ( formPersistData.formPageNumber ?: 1 ) : 0;
734+
arguments.configuration.formPagesTotal = countFormPages( formId=arguments.formId );
735+
arguments.configuration.formPageNumber = arguments.configuration.formPagesTotal ? ( savedData.formPageNumber ?: 1 ) : 0;
732736

733737
var formConfiguration = getForm( id=arguments.formId );
734738
var items = getFormItems( id=arguments.formId, pageNumber=arguments.configuration.formPageNumber );

system/views/formbuilder/layouts/core/formButtons.cfm

+7-6
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@
44
backLabel = args.configuration.back_label ?: translateResource( uri="formbuilder:button.back.label" );
55
continueLabel = args.configuration.continue_label ?: translateResource( uri="formbuilder:button.continue.label" );
66
7-
isFormPage = args.isFormPage ?: false;
7+
isFormPage = args.isFormPage ?: false;
88
isFirstPage = args.isFirstPage ?: false;
9-
isLastPage = args.isFirstPage ?: false;
9+
isLastPage = args.isLastPage ?: false;
1010
</cfscript>
1111

1212
<cfoutput>
1313
<div class="form-group">
1414
<div class="col-md-offset-3 col-md-12">
15-
<cfif isFormPage>
16-
<cfif not isFirstPage>
17-
<button tabindex="#getNextTabIndex()#" class="btn btn-bordered" type="submit" name="_formNextPage" value="-1">#backLabel#</button>
18-
</cfif>
15+
<cfif isFormPage and not isFirstPage>
16+
<button tabindex="#getNextTabIndex()#" class="btn btn-bordered" type="submit" name="_formNextPage" value="-1">#backLabel#</button>
17+
</cfif>
18+
19+
<cfif isFormPage and not isLastPage>
1920
<button tabindex="#getNextTabIndex()#" class="btn" type="submit" name="_formNextPage" value="1">#continueLabel#</button>
2021
<cfelse>
2122
<button tabindex="#getNextTabIndex()#" class="btn" type="submit">#submitLabel#</button>

system/views/formbuilder/layouts/core/formLayout.cfm

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
<!---@feature formbuilder--->
2-
<cfparam name="args.renderedItems" type="string" />
3-
<cfparam name="args.renderedButtons" type="string" />
4-
<cfparam name="args.id" type="string" />
5-
<cfparam name="args.validationJs" type="string" default="" />
6-
<cfparam name="args.configuration" type="struct" />
2+
<cfparam name="args.renderedItems" type="string" />
3+
<cfparam name="args.renderedButtons" type="string" />
4+
<cfparam name="args.renderedResponses" type="string" />
5+
<cfparam name="args.id" type="string" />
6+
<cfparam name="args.validationJs" type="string" default="" />
7+
<cfparam name="args.configuration" type="struct" />
78

89
<cfoutput>
910
<cfif Len( Trim( rc.errorMessage ?: "" ) ) >
@@ -19,6 +20,7 @@
1920
</cfloop>
2021

2122
#args.renderedItems#
23+
#args.renderedResponses#
2224

2325
<cfif IsTrue( args.configuration.use_captcha ?: "" )>
2426
#renderView( '/formbuilder/general/captcha' )#

system/views/formbuilder/layouts/formfield/default.cfm

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<!---@feature formbuilder--->
2-
<cfparam name="args.renderedItem" type="string" />
3-
<cfparam name="args.label" type="string" />
4-
<cfparam name="args.id" type="string" />
5-
<cfparam name="args.error" type="string" default="" />
2+
<cfparam name="args.renderedItem" type="string" />
3+
<cfparam name="args.label" type="string" />
4+
<cfparam name="args.id" type="string" />
5+
<cfparam name="args.error" type="string" default="" />
66
<cfparam name="args.mandatory" type="boolean" default="false" />
7-
<cfparam name="args.help" type="string" default="" />
7+
<cfparam name="args.help" type="string" default="" />
88

99
<cfscript>
1010
hasError = Len( Trim( args.error ) );
@@ -15,6 +15,7 @@
1515
<div class="form-group<cfif hasError> has-error</cfif>">
1616
<label class="col-sm-3 control-label no-padding-right" for="#args.id#">
1717
#args.label#
18+
1819
<cfif isTrue( args.mandatory )>
1920
<em class="required" role="presentation">
2021
<sup>*</sup>
@@ -26,9 +27,11 @@
2627
<div class="col-sm-9">
2728
<div class="clearfix">
2829
#args.renderedItem#
30+
2931
<cfif hasError>
3032
<label for="#args.id#" class="error">#args.error#</label>
3133
</cfif>
34+
3235
<cfif hasHelp>
3336
<span class="help-block">#args.help#</span>
3437
</cfif>

0 commit comments

Comments
 (0)