products/userale/example/webpackUserAleExample/index.js (105 lines of code) (raw):

// Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import * as userale from "flagon-userale"; //or use require //const userale = require('flagon-userale'); /** Options API * * the 'options' API allows you to dynamically change UserALE params and set meta data values * pass in variables or properties into the options object, such as from sessionStorage or localStorage * NOTE1: if you are using userale in a package bundler, you will need to set options via this API, including * "url" to tell userale where to send your logs! * NOTE2: logDetails is set to true (default:false), this will log key strokes, inputs, and change events * (be careful of your form data and auth workflows!) */ const changeMe = "me"; userale.options({ userId: changeMe, url: "http://localhost:8000/", version: "2.3.0", logDetails: true, toolName: "Apache UserALE Example (Custom)", logCountThreshold: "1", transmitInterval: "1000", }); /**Filter API /**the 'filter' API allows you to eliminate logs you don't want * use as a global filter and add classes of events or log types to eliminate * or use in block scope to surgically eliminate logs from specific elements from an event handler * The filter below reduces logs to capture click, change, select, scroll and submit events on index.html * Note that for surgical filters, you may need to clear or reset back to a global filter callback * the same is true for the 'map' API. See examples below: */ userale.addCallbacks({ filter(log) { var type_array = [ "mouseup", "mouseover", "mousedown", "keydown", "dblclick", "blur", "focus", "input", "wheel", ]; var logType_array = ["interval"]; if (type_array.includes(log.type) || logType_array.includes(log.logType)) { return false; } return log; }, }); /**Log Mapping API * * the 'map' API allows you to add or modify new fields to your logs * this example works with the "Click Me!" button at the top of index.html */ document.addEventListener("click", function (e) { if (e.target.innerHTML === "Click Me!") { userale.addCallbacks({ map(log) { return Object.assign({}, log, { logType: "custom", customLabel: "map & packageLog Example", }); }, }); userale.packageLog(e, userale.details(userale.options(), e.type)); /**you'll want to reset the map callback function, or set a conditional (e.g., return log), else * the callback may be applied to other events of the same class (e.g., click) */ userale.removeCallbacks(["map"]); } else { return false; } }); /** Alternate Log Mapping API Example * Build a global mapping function with conditional logic to modify logs for similar events * this example works with the "Click Me!" button at the top of index.html * Also, note that specifying log as a return will keep the scope of this callback limited to only the events you want */ //userale.map(function (log, e) { // var targetsForLabels = ["button#test_button"]; // if (targetsForLabels.includes(log.target)) { // return Object.assign({}, log, { customLabel: e.target.innerHTML }); // } else { // return log; // } //}); /**'Log' API and Custom Log Functions * * the 'log' API generate custom events and add them to the log queue * pass in any keys:values for fully customized logs * utilize 'options' and other functions to streamline populating custom logs * type 'log' into the 'API Test Field' to see this custom log sent to our example server */ document.addEventListener("change", function (e) { if (e.target.value === "log") { userale.log({ target: userale.getSelector(e.target), path: userale.buildPath(e), clientTime: Date.now(), type: e.type, logType: "custom", userAction: false, details: { foo: "bar", bar: "foo" }, customField1: "I can make this log look like anything I want", customField2: "foo", userId: userale.options().userId, toolVersion: userale.options().version, toolName: userale.options().toolName, useraleVersion: userale.options().useraleVersion, sessionId: userale.options().sessionId, customLabel: "Custom Log Example", }); } }); /**you can also use UserALE' own packaging function for HTML events to strive for standardization * type 'packageLog into the 'API Test Field' to see this custom log sent to our example server */ document.addEventListener("change", function (e) { if (e.target.value === "packageLog") { /**You can then use the 'Mapping' API function to modify custom logs created with the packageLog function*/ userale.addCallbacks({ changeMap(log) { var targetsForLabels = ["change"]; if (targetsForLabels.includes(log.type)) { return Object.assign({}, log, { logType: "custom", customLabel: "packageLog Example", }); } else { return log; } }, }); /**You can also use the details function to package additional log meta data, or add custom details*/ userale.packageLog(e, userale.details(userale.options(), e.type)); } else { return false; } }); /**you can also just add boilerplate UserALE meta data to custom logs with the packageCustomLog function * type 'packageCustomLog into the 'API Test Field' to see this custom log sent to our example server */ document.addEventListener("change", function (e) { if (e.target.value === "packageCustomLog") { userale.packageCustomLog( { customLabel: "packageCustomLog Example", customField1: "foo", customField2: "bar", }, function () { return { foo: "bar", bar: "foo" }; }, true ); } else { return false; } });