Skip to content

Commit 807348d

Browse files
committed
Add ability to change field content before sending form tracking (close snowplow#465)
1 parent 864d4a0 commit 807348d

3 files changed

Lines changed: 29 additions & 3 deletions

File tree

src/js/forms.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ object.getFormTrackingManager = function (core, trackerId, contextAdder) {
5858
// Filter to determine which form fields should be tracked
5959
var fieldFilter = function () { return true };
6060

61+
// Default function applied to all elements, optionally overridden by transform field
62+
var fieldTransform = function (x) { return x };
63+
6164
/*
6265
* Get an identifier for a form, input, textarea, or select element
6366
*/
@@ -123,7 +126,7 @@ object.getFormTrackingManager = function (core, trackerId, contextAdder) {
123126
return function (e) {
124127
var elt = e.target;
125128
var type = (elt.nodeName && elt.nodeName.toUpperCase() === 'INPUT') ? elt.type : null;
126-
var value = (elt.type === 'checkbox' && !elt.checked) ? null : elt.value;
129+
var value = (elt.type === 'checkbox' && !elt.checked) ? null : fieldTransform(elt.value);
127130
core.trackFormChange(getParentFormName(elt), getFormElementName(elt), elt.nodeName, type, helpers.getCssClasses(elt), value, contextAdder(context));
128131
};
129132
}
@@ -135,6 +138,9 @@ object.getFormTrackingManager = function (core, trackerId, contextAdder) {
135138
return function (e) {
136139
var elt = e.target;
137140
var innerElements = getInnerFormElements(elt);
141+
lodash.forEach(innerElements, function (innerElement) {
142+
innerElement.value = fieldTransform(innerElement.value);
143+
});
138144
core.trackFormSubmission(getFormElementName(elt), helpers.getCssClasses(elt), innerElements, contextAdder(context));
139145
};
140146
}
@@ -148,6 +154,7 @@ object.getFormTrackingManager = function (core, trackerId, contextAdder) {
148154
if (config) {
149155
formFilter = helpers.getFilter(config.forms, true);
150156
fieldFilter = helpers.getFilter(config.fields, false);
157+
fieldTransform = helpers.getTransform(config.fields);
151158
}
152159
},
153160

src/js/lib/helpers.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@
186186
*
187187
* @param object criterion Either {whitelist: [array of allowable strings]}
188188
* or {blacklist: [array of allowable strings]}
189-
* or {filter: function (elt) {return whether to track the element}}
189+
* or {filter: function (elt) {return whether to track the element}
190190
* @param boolean byClass Whether to whitelist/blacklist based on an element's classes (for forms)
191191
* or name attribute (for fields)
192192
*/
@@ -226,6 +226,25 @@
226226
}
227227
};
228228

229+
/**
230+
* Convert a criterion object to a transform function
231+
*
232+
* @param object criterion {transform: function (elt) {return the result of transform function applied to element}
233+
*/
234+
object.getTransform = function (criterion) {
235+
if (!lodash.isObject(criterion)) {
236+
return function(x) { return x };
237+
}
238+
239+
if (criterion.hasOwnProperty('transform')) {
240+
return criterion.transform;
241+
} else {
242+
return function(x) { return x };
243+
}
244+
245+
return function(x) { return x };
246+
};
247+
229248
/**
230249
* Add a name-value pair to the querystring of a URL
231250
*

tests/pages/integration-template.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383

8484
// track unhandled exception
8585
window.snowplow("enableErrorTracking");
86-
function raiseException() { notExiststentObject.notExistentProperty(); }
86+
function raiseException() { notExistentObject.notExistentProperty(); }
8787
setTimeout(raiseException, 2500);
8888

8989
</script>

0 commit comments

Comments
 (0)