Skip to content

Instantly share code, notes, and snippets.

@seancoyne
Created September 20, 2011 21:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save seancoyne/1230366 to your computer and use it in GitHub Desktop.
Save seancoyne/1230366 to your computer and use it in GitHub Desktop.
FarCry Slider Formtool
<cfcomponent extends="farcry.core.packages.formtools.numeric" name="slider" displayname="slider" hint="Field component to display a slider">
<cfproperty name="ftMin" required="false" type="numeric" default="0" hint="The minimum value of the slider." />
<cfproperty name="ftMax" required="false" type="numeric" default="10" hint="The maximum value of the slider." />
<cfproperty name="ftStep" required="false" type="numeric" default="1" hint="Determines the size or amount of each interval or step the slider takes between min and max. The full specified value range of the slider (max - min) needs to be evenly divisible by the step." />
<cfproperty name="ftOrientation" required="false" type="string" default="horizontal" options="horizontal,vertical" hint="This option determines whether the slider has the min at the left, the max at the right or the min at the bottom, the max at the top. Possible values: 'horizontal', 'vertical'." />
<cffunction name="edit" access="public" output="true" returntype="string" hint="his will return a string of formatted HTML text to enable the user to edit the data">
<cfargument name="typename" required="true" type="string" hint="The name of the type that this field is part of.">
<cfargument name="stObject" required="true" type="struct" hint="The object of the record that this field is part of.">
<cfargument name="stMetadata" required="true" type="struct" hint="This is the metadata that is either setup as part of the type.cfc or overridden when calling ft:object by using the stMetadata argument.">
<cfargument name="fieldname" required="true" type="string" hint="This is the name that will be used for the form field. It includes the prefix that will be used by ft:processform.">
<cfset var html = "" />
<cfparam name="arguments.stMetadata.ftMin" default="0" />
<cfparam name="arguments.stMetadata.ftMax" default="10" />
<cfparam name="arguments.stMetadata.ftStep" default="1" />
<cfparam name="arguments.stMetadata.ftOrientation" default="horizontal" />
<!--- metadata inherited from numeric formtool --->
<cfparam name="arguments.stMetadata.ftIncludeDecimal" default="false">
<cfparam name="arguments.stMetadata.ftCurrencySymbol" default="">
<cfparam name="arguments.stMetadata.ftPrefix" default="">
<cfparam name="arguments.stMetadata.ftSuffix" default="">
<cfparam name="arguments.stMetadata.ftMask" default="">
<!--- format the value (same as numeric formtool) --->
<cfif len(arguments.stMetadata.ftMask)>
<cfset arguments.stMetadata.value = trim(NumberFormat(arguments.stMetadata.value, arguments.stMetadata.ftMask))>
<cfelse>
<!--- This is for legacy. You should use just ftPrefix and ftSuffix --->
<cfif len(arguments.stMetadata.ftCurrencySymbol)>
<cfset arguments.stMetadata.ftPrefix = arguments.stMetadata.ftCurrencySymbol />
</cfif>
<cfif stMetadata.ftIncludeDecimal>
<cfset arguments.stMetadata.value = DecimalFormat(arguments.stMetadata.value)>
<cfelse>
<cfset arguments.stMetadata.value = NumberFormat(arguments.stMetadata.value)>
</cfif>
</cfif>
<cfimport taglib="/farcry/core/tags/webskin" prefix="skin" />
<skin:loadJs id="jquery" />
<skin:loadJs id="jquery-ui" />
<skin:loadCss id="jquery-ui" />
<skin:onReady>
<cfoutput>
jQuery("###arguments.fieldname#-slider").slider({
min: #arguments.stMetadata.ftMin#,
max: #arguments.stMetadata.ftMax#,
step: #arguments.stMetadata.ftStep#,
value: #reReplace(arguments.stMetadata.value, "[^0-9.\-]", "", "ALL")#,
orientation: '#arguments.stMetadata.ftOrientation#',
slide: function (event, ui) {
jQuery("###arguments.fieldname#").val('#jsStringFormat(arguments.stMetadata.ftPrefix)#' + ui.value + '#jsStringFormat(arguments.stMetadata.ftSuffix)#');
}
});
jQuery("###arguments.fieldname#").keyup(function(event){
var thisVal = jQuery(this).val().replace(/[^0-9.\-]/g,'');
var thisFormattedVal = '#jsStringFormat(arguments.stMetadata.ftPrefix)#' + thisVal + '#jsStringFormat(arguments.stMetadata.ftSuffix)#';
var maxFormattedVal = '#jsStringFormat(arguments.stMetadata.ftPrefix)#' + #arguments.stMetadata.ftMax# + '#jsStringFormat(arguments.stMetadata.ftSuffix)#';
var minFormattedVal = '#jsStringFormat(arguments.stMetadata.ftPrefix)#' + #arguments.stMetadata.ftMin# + '#jsStringFormat(arguments.stMetadata.ftSuffix)#';
jQuery(this).val(thisFormattedVal);
if (thisVal >= #arguments.stMetadata.ftMin# && thisVal <= #arguments.stMetadata.ftMax#) {
// good value, set the slider value
jQuery("###arguments.fieldname#-slider").slider("value", thisVal);
} else if (thisVal > #arguments.stMetadata.ftMax#) {
// too high, set it to the maximum value
jQuery("###arguments.fieldname#-slider").slider("value", thisVal);
jQuery(this).val(maxFormattedVal);
} else if (thisVal < #arguments.stMetadata.ftMin#) {
// too low, set it to the minimum value
jQuery("###arguments.fieldname#-slider").slider("value", thisVal);
jQuery(this).val(minFormattedVal);
}
});
</cfoutput>
</skin:onReady>
<cfsavecontent variable="html">
<cfoutput>
<div class="multiField">
<div class="sliderInput" style="margin-bottom: 10px;">
<div id="#arguments.fieldname#-slider"></div>
</div>
#super.edit(argumentCollection = arguments)#
</div>
</cfoutput>
</cfsavecontent>
<cfreturn html />
</cffunction>
<cffunction name="validate" access="public" output="true" returntype="struct" hint="This will return a struct with bSuccess and stError">
<cfargument name="objectid" required="true" type="string" hint="The objectid of the object that this field is part of.">
<cfargument name="typename" required="true" type="string" hint="The name of the type that this field is part of.">
<cfargument name="stFieldPost" required="true" type="struct" hint="The fields that are relevent to this field type.">
<cfargument name="stMetadata" required="true" type="struct" hint="This is the metadata that is either setup as part of the type.cfc or overridden when calling ft:object by using the stMetadata argument.">
<cfset var stResult = super.validate(argumentCollection = arguments) />
<cfparam name="arguments.stMetadata.ftMin" default="0" />
<cfparam name="arguments.stMetadata.ftMax" default="10" />
<!--- if its required, make sure we have a value --->
<cfif structKeyExists(arguments.stMetadata, "ftValidation") AND listFindNoCase(arguments.stMetadata.ftValidation, "required") AND NOT len(trim(stFieldPost.Value))>
<cfset stResult = failed(value = stResult.value, message = "This is a required field.") />
</cfif>
<!--- ensure value is within range --->
<cfif stResult.value lt arguments.stMetadata.ftMin>
<cfset stResult = failed(value = stResult.value, message = "Value must be greater than #arguments.stMetadata.ftMin#") />
</cfif>
<cfif stResult.value gt arguments.stMetadata.ftMax>
<cfset stResult = failed(value = stResult.value, message = "Value must be less than #arguments.stMetadata.ftMax#") />
</cfif>
<cfreturn stResult />
</cffunction>
</cfcomponent>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment