diff --git a/.jshintrc b/.jshintrc index f73b569..9d62bb9 100644 --- a/.jshintrc +++ b/.jshintrc @@ -10,7 +10,8 @@ "globals" : { "mendix" : false, "mx" : false, - "logger" : false + "logger" : false, + "ga" : false }, // Relaxing diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 6716b6a..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,233 +0,0 @@ -// Generated on 2016-05-23 using generator-mendix 1.3.5 :: git+https://github.com/mendix/generator-mendix.git -/*jshint -W069*/ -/*global module*/ -"use strict"; - -// In case you seem to have trouble starting Mendix through `grunt start-mendix`, you might have to set the path to the Mendix application. -// If it works, leave MODELER_PATH at null -var MODELER_PATH = null; -var MODELER_ARGS = "/file:{path}"; - -/******************************************************************************** - * Do not edit anything below, unless you know what you are doing - ********************************************************************************/ - -var path = require("path"), - mendixApp = require("node-mendix-modeler-path"), - base64 = require("node-base64-image"), - semver = require("semver"), - xml2js = require("xml2js"), - parser = new xml2js.Parser(), - builder = new xml2js.Builder({ - renderOpts: { pretty: true, indent: " ", newline: "\n" }, - xmldec: { standalone: null, encoding: "utf-8" } - }), - shelljs = require("shelljs"), - pkg = require("./package.json"), - currentFolder = shelljs.pwd().toString(); - -var TEST_PATH = path.join(currentFolder, "/test/Test.mpr"); -var WIDGET_XML = path.join(currentFolder, "/src/", pkg.name, "/", pkg.name + ".xml"); -var PACKAGE_XML = path.join(currentFolder, "/src/package.xml"); -var TEST_WIDGETS_FOLDER = path.join(currentFolder, "./test/widgets"); -var TEST_WIDGETS_DEPLOYMENT_FOLDER = path.join(currentFolder, "./test/deployment/web/widgets"); - -/** - * If you want to use a custom folder for the test project, make sure these are added to package.json: - * "paths": { - * "testProjectFolder": "./test/", - * "testProjectFileName": "Test.mpr" - * }, - * You can test it by running: `grunt folders` - **/ - -if (pkg.paths && pkg.paths.testProjectFolder && pkg.paths.testProjectFileName) { - var folder = pkg.paths.testProjectFolder; - if (folder.indexOf(".") === 0) { - folder = path.join(currentFolder, folder); - } - TEST_PATH = path.join(folder, pkg.paths.testProjectFileName); - TEST_WIDGETS_FOLDER = path.join(folder, "/widgets"); - TEST_WIDGETS_DEPLOYMENT_FOLDER = path.join(folder, "/deployment/web/widgets"); -} - -module.exports = function (grunt) { - grunt.initConfig({ - watch: { - autoDeployUpdate: { - "files": [ "./src/**/*" ], - "tasks": [ "compress", "newer:copy" ], - options: { - debounceDelay: 250, - livereload: true - } - } - }, - compress: { - makezip: { - options: { - archive: "./dist/" + pkg.name + ".mpk", - mode: "zip" - }, - files: [{ - expand: true, - date: new Date(), - store: false, - cwd: "./src", - src: ["**/*"] - }] - } - }, - copy: { - deployment: { - files: [ - { dest: TEST_WIDGETS_DEPLOYMENT_FOLDER, cwd: "./src/", src: ["**/*"], expand: true } - ] - }, - mpks: { - files: [ - { dest: TEST_WIDGETS_FOLDER, cwd: "./dist/", src: [ pkg.name + ".mpk"], expand: true } - ] - } - }, - clean: { - build: [ - path.join(currentFolder, "dist", pkg.name, "/*") - ] - }, - csslint: { - strict: { - options: { - import: 2 - }, - src: ["src/" + pkg.name + "/widget/ui/*.css"] - } - } - }); - - grunt.loadNpmTasks("grunt-contrib-compress"); - grunt.loadNpmTasks("grunt-contrib-clean"); - grunt.loadNpmTasks("grunt-contrib-watch"); - grunt.loadNpmTasks("grunt-contrib-copy"); - grunt.loadNpmTasks("grunt-newer"); - grunt.loadNpmTasks("grunt-contrib-csslint"); - - grunt.registerTask("start-modeler", function () { - var done = this.async(); - if (MODELER_PATH !== null || (mendixApp.err === null && mendixApp.output !== null && mendixApp.output.cmd && mendixApp.output.arg)) { - grunt.util.spawn({ - cmd: MODELER_PATH || mendixApp.output.cmd, - args: [ - (MODELER_PATH !== null ? MODELER_ARGS : mendixApp.output.arg).replace("{path}", TEST_PATH) - ] - }, function () { - done(); - }); - } else { - console.error("Cannot start Modeler, see error:"); - console.log(mendixApp.err); - done(); - } - }); - - grunt.registerTask("version", function (version) { - var done = this.async(); - if (!grunt.file.exists(PACKAGE_XML)) { - grunt.log.error("Cannot find " + PACKAGE_XML); - return done(); - } - - var xml = grunt.file.read(PACKAGE_XML); - parser.parseString(xml, function (err, res) { - if (err) { - grunt.log.error(err); - return done(); - } - if (res.package.clientModule[0]["$"]["version"]) { - var currentVersion = res.package.clientModule[0]["$"]["version"]; - if (!version) { - grunt.log.writeln("\nCurrent version is " + currentVersion); - grunt.log.writeln("Set new version by running 'grunt version:x.y.z'"); - done(); - } else { - if (!semver.valid(version) || !semver.satisfies(version, ">= 1.0.0")) { - grunt.log.error("\nPlease provide a valid version that is higher than 1.0.0. Current version: " + currentVersion); - done(); - } else { - res.package.clientModule[0]["$"]["version"] = version; - pkg.version = version; - var xmlString = builder.buildObject(res); - grunt.file.write(PACKAGE_XML, xmlString); - grunt.file.write("package.json", JSON.stringify(pkg, null, 2)); - done(); - } - } - } else { - grunt.log.error("Cannot find current version number"); - } - }); - - }); - - grunt.registerTask("generate-icon", function () { - var iconPath = path.join(currentFolder, "/icon.png"), - options = {localFile: true, string: true}, - done = this.async(); - - grunt.log.writeln("Processing icon"); - - if (!grunt.file.exists(iconPath) || !grunt.file.exists(WIDGET_XML)) { - grunt.log.error("can\'t generate icon"); - return done(); - } - - base64.base64encoder(iconPath, options, function (err, image) { - if (!err) { - var xmlOld = grunt.file.read(WIDGET_XML); - parser.parseString(xmlOld, function (err, result) { - if (!err) { - if (result && result.widget && result.widget.icon) { - result.widget.icon[0] = image; - } - var xmlString = builder.buildObject(result); - grunt.file.write(WIDGET_XML, xmlString); - done(); - } - }); - } else { - grunt.log.error("can\'t generate icon"); - return done(); - } - }); - }); - - grunt.registerTask("folders", function () { - var done = this.async(); - grunt.log.writeln("\nShowing file paths that Grunt will use. You can edit the package.json accordingly\n"); - grunt.log.writeln("TEST_PATH: ", TEST_PATH); - grunt.log.writeln("WIDGET_XML: ", WIDGET_XML); - grunt.log.writeln("PACKAGE_XML: ", PACKAGE_XML); - grunt.log.writeln("TEST_WIDGETS_FOLDER: ", TEST_WIDGETS_FOLDER); - grunt.log.writeln("TEST_WIDGETS_DEPLOYMENT_FOLDER: ", TEST_WIDGETS_DEPLOYMENT_FOLDER); - return done(); - }); - - grunt.registerTask("start-mendix", [ "start-modeler" ]); - - grunt.registerTask( - "default", - "Watches for changes and automatically creates an MPK file, as well as copying the changes to your deployment folder", - [ "watch" ] - ); - - grunt.registerTask( - "clean build", - "Compiles all the assets and copies the files to the build directory.", - [ "clean", "compress", "copy" ] - ); - - grunt.registerTask( - "build", - [ "clean build" ] - ); -}; diff --git a/Gulpfile.js b/Gulpfile.js new file mode 100644 index 0000000..eca9680 --- /dev/null +++ b/Gulpfile.js @@ -0,0 +1,86 @@ +// Generated on 2016-11-08 using generator-mendix 2.0.1 :: git+https://github.com/mendix/generator-mendix.git +/*jshint -W069,-W097*/ +"use strict"; + +// In case you seem to have trouble starting Mendix through `gulp modeler`, you might have to set the path to the Mendix application, otherwise leave both values as they are +var MODELER_PATH = null; +var MODELER_ARGS = "/file:{path}"; + +/******************************************************************************** + * Do not edit anything below, unless you know what you are doing + ********************************************************************************/ +var gulp = require("gulp"), + zip = require("gulp-zip"), + del = require("del"), + newer = require("gulp-newer"), + gutil = require("gulp-util"), + gulpif = require("gulp-if"), + jsonTransform = require("gulp-json-transform"), + intercept = require("gulp-intercept"), + argv = require("yargs").argv, + widgetBuilderHelper = require("widgetbuilder-gulp-helper"); + +var pkg = require("./package.json"), + paths = widgetBuilderHelper.generatePaths(pkg), + xmlversion = widgetBuilderHelper.xmlversion; + +gulp.task("default", function() { + gulp.watch("./src/**/*", ["compress"]); + gulp.watch("./src/**/*.js", ["copy:js"]); +}); + +gulp.task("clean", function () { + return del([ + paths.WIDGET_TEST_DEST, + paths.WIDGET_DIST_DEST + ], { force: true }); +}); + +gulp.task("compress", ["clean"], function () { + return gulp.src("src/**/*") + .pipe(zip(pkg.name + ".mpk")) + .pipe(gulp.dest(paths.TEST_WIDGETS_FOLDER)) + .pipe(gulp.dest("dist")); +}); + +gulp.task("copy:js", function () { + return gulp.src(["./src/**/*.js"]) + .pipe(newer(paths.TEST_WIDGETS_DEPLOYMENT_FOLDER)) + .pipe(gulp.dest(paths.TEST_WIDGETS_DEPLOYMENT_FOLDER)); +}); + +gulp.task("version:xml", function () { + return gulp.src(paths.PACKAGE_XML) + .pipe(xmlversion(argv.n)) + .pipe(gulp.dest("./src/")); +}); + +gulp.task("version:json", function () { + return gulp.src("./package.json") + .pipe(gulpif(typeof argv.n !== "undefined", jsonTransform(function(data) { + data.version = argv.n; + return data; + }, 2))) + .pipe(gulp.dest("./")); +}); + +gulp.task("icon", function (cb) { + var icon = (typeof argv.file !== "undefined") ? argv.file : "./icon.png"; + console.log("\nUsing this file to create a base64 string: " + gutil.colors.cyan(icon)); + gulp.src(icon) + .pipe(intercept(function (file) { + console.log("\nCopy the following to your " + pkg.name + ".xml (after description):\n\n" + gutil.colors.cyan("") + file.contents.toString("base64") + gutil.colors.cyan("<\\icon>") + "\n"); + cb(); + })); +}); + +gulp.task("folders", function () { + paths.showPaths(); return; +}); + +gulp.task("modeler", function (cb) { + widgetBuilderHelper.runmodeler(MODELER_PATH, MODELER_ARGS, paths.TEST_PATH, cb); +}); + +gulp.task("build", ["compress"]); +gulp.task("version", ["version:xml", "version:json"]); diff --git a/package.json b/package.json index 2e96b84..3bdf4ef 100644 --- a/package.json +++ b/package.json @@ -1,34 +1,36 @@ { "name": "GoogleAnalytics", - "version": "3.3.2", + "version": "3.3.3", "description": "", "license": "", "author": "", "private": true, "dependencies": {}, "devDependencies": { - "grunt": "1.0.1", - "grunt-contrib-clean": "^1.0.0", - "grunt-contrib-compress": "^1.2.0", - "grunt-contrib-copy": "^1.0.0", - "grunt-contrib-watch": "^1.0.0", - "grunt-contrib-csslint": "^1.0.0", - "grunt-newer": "^1.1.1", - "node-base64-image": "^0.1.0", - "shelljs": "^0.7.0", - "xml2js": "^0.4.15", - "semver": "^5.1.0", - "node-mendix-modeler-path": "https://github.com/JelteMX/node-mendix-modeler-path/archive/v1.0.0.tar.gz" + "del": "^2.2.2", + "gulp": "^3.9.1", + "gulp-if": "^2.0.1", + "gulp-intercept": "^0.1.0", + "gulp-json-transform": "^0.4.2", + "gulp-newer": "^1.3.0", + "gulp-util": "^3.0.7", + "gulp-zip": "^3.2.0", + "widgetbuilder-gulp-helper": "https://github.com/JelteMX/widgetbuilder-gulp-helper/archive/1.0.1.tar.gz", + "yargs": "^6.0.0" }, "engines": { - "node": ">=0.12.0" + "node": ">=5" }, - "generatorVersion": "1.3.5", + "generatorVersion": "2.0.1", "paths": { "testProjectFolder": "./test/", "testProjectFileName": "Test.mpr" }, "scripts": { - "test": "grunt test" + "build": "node ./node_modules/gulp/bin/gulp build", + "version": "node ./node_modules/gulp/bin/gulp version", + "icon": "node ./node_modules/gulp/bin/gulp icon", + "folders": "node ./node_modules/gulp/bin/gulp folders", + "modeler": "node ./node_modules/gulp/bin/gulp modeler" } } \ No newline at end of file diff --git a/src/GoogleAnalytics/widget/AdvancedPageTracker.js b/src/GoogleAnalytics/widget/AdvancedPageTracker.js index 1afb793..cc533e4 100644 --- a/src/GoogleAnalytics/widget/AdvancedPageTracker.js +++ b/src/GoogleAnalytics/widget/AdvancedPageTracker.js @@ -70,6 +70,4 @@ define("GoogleAnalytics/widget/AdvancedPageTracker", [ }); }); -require(["GoogleAnalytics/widget/AdvancedPageTracker"], function () { - "use strict"; -}); +require(["GoogleAnalytics/widget/AdvancedPageTracker"]); diff --git a/src/GoogleAnalytics/widget/EventTracker.js b/src/GoogleAnalytics/widget/EventTracker.js index a5c56a1..09a30b3 100644 --- a/src/GoogleAnalytics/widget/EventTracker.js +++ b/src/GoogleAnalytics/widget/EventTracker.js @@ -29,6 +29,4 @@ define("GoogleAnalytics/widget/EventTracker", [ }); }); -require(["GoogleAnalytics/widget/EventTracker"], function () { - "use strict"; -}); +require(["GoogleAnalytics/widget/EventTracker"]); diff --git a/src/GoogleAnalytics/widget/EventTrackerButton.js b/src/GoogleAnalytics/widget/EventTrackerButton.js index 8a6b561..cc665a7 100644 --- a/src/GoogleAnalytics/widget/EventTrackerButton.js +++ b/src/GoogleAnalytics/widget/EventTrackerButton.js @@ -42,22 +42,37 @@ define("GoogleAnalytics/widget/EventTrackerButton", [ logger.debug(this.id + ".onClick"); if (this._contextObj) { - mx.data.action({ - params : { - actionname : this.onclickmf, - applyto : "selection", - guids : [this._contextObj.getGuid()] - }, - store: { - caller: this.mxform - }, - callback: lang.hitch(this, function (objs) { - this._addEvent(); - }), - error: function () { - console.error(this.id + ".click: Microflow invocation failed"); - } - }); + var sequenceHandlers = []; + + // We're saving the form (ticket 53351) before we handle the microflow + sequenceHandlers.push(lang.hitch(this, function(callback) { + this.mxform.save(callback, function(err) { + if (!(err instanceof mendix.lib.ValidationError)) { + window.mx.onError(err); + } + }); + })); + + sequenceHandlers.push(lang.hitch(this, function() { + mx.data.action({ + params : { + actionname : this.onclickmf, + applyto : "selection", + guids : [this._contextObj.getGuid()] + }, + store: { + caller: this.mxform + }, + callback: lang.hitch(this, function (objs) { + this._addEvent(); + }), + error: function () { + console.error(this.id + ".click: Microflow invocation failed"); + } + }); + })); + + this.sequence(sequenceHandlers); } else { console.error(this.id + ".click: no object in context"); } @@ -66,6 +81,4 @@ define("GoogleAnalytics/widget/EventTrackerButton", [ }); }); -require(["GoogleAnalytics/widget/EventTrackerButton"], function () { - "use strict"; -}); +require(["GoogleAnalytics/widget/EventTrackerButton"]); diff --git a/src/GoogleAnalytics/widget/MasterPageTracker.js b/src/GoogleAnalytics/widget/MasterPageTracker.js index 16a80a6..1eef8eb 100644 --- a/src/GoogleAnalytics/widget/MasterPageTracker.js +++ b/src/GoogleAnalytics/widget/MasterPageTracker.js @@ -108,6 +108,4 @@ define("GoogleAnalytics/widget/MasterPageTracker", [ }); }); -require(["GoogleAnalytics/widget/MasterPageTracker"], function () { - "use strict"; -}); +require(["GoogleAnalytics/widget/MasterPageTracker"]); diff --git a/src/GoogleAnalytics/widget/PageTracker.js b/src/GoogleAnalytics/widget/PageTracker.js index 1929189..94ef6ff 100644 --- a/src/GoogleAnalytics/widget/PageTracker.js +++ b/src/GoogleAnalytics/widget/PageTracker.js @@ -30,6 +30,4 @@ define("GoogleAnalytics/widget/PageTracker", [ }); }); -require(["GoogleAnalytics/widget/PageTracker"], function () { - "use strict"; -}); +require(["GoogleAnalytics/widget/PageTracker"]); diff --git a/src/GoogleAnalytics/widget/WebmasterTools.js b/src/GoogleAnalytics/widget/WebmasterTools.js index b26eca7..2ca99f7 100644 --- a/src/GoogleAnalytics/widget/WebmasterTools.js +++ b/src/GoogleAnalytics/widget/WebmasterTools.js @@ -32,6 +32,4 @@ define("GoogleAnalytics/widget/WebmasterTools", [ }); }); -require(["GoogleAnalytics/widget/WebmasterTools"], function () { - "use strict"; -}); +require(["GoogleAnalytics/widget/WebmasterTools"]); diff --git a/src/GoogleAnalytics/widget/template/GoogleAnalytics.html b/src/GoogleAnalytics/widget/template/GoogleAnalytics.html deleted file mode 100644 index b342dc3..0000000 --- a/src/GoogleAnalytics/widget/template/GoogleAnalytics.html +++ /dev/null @@ -1,10 +0,0 @@ -
-
-
- -
-
-
-
-
- diff --git a/src/GoogleAnalytics/widget/ui/GoogleAnalytics.css b/src/GoogleAnalytics/widget/ui/GoogleAnalytics.css deleted file mode 100644 index c59f82b..0000000 --- a/src/GoogleAnalytics/widget/ui/GoogleAnalytics.css +++ /dev/null @@ -1,17 +0,0 @@ -.googleanalytics { - -} - -.googleanalytics-message { - -} - -.input-group-addon { - clear: both; - padding: 2px 6px; -} - -.googleanalytics-infoTextNode { - padding: 0.8em 1em; - margin-top: 10px; -} \ No newline at end of file diff --git a/src/package.xml b/src/package.xml index 965cd32..e676597 100644 --- a/src/package.xml +++ b/src/package.xml @@ -1,6 +1,6 @@ - + diff --git a/test/widgets/GoogleAnalytics.mpk b/test/widgets/GoogleAnalytics.mpk index 937014a..c8cc965 100644 Binary files a/test/widgets/GoogleAnalytics.mpk and b/test/widgets/GoogleAnalytics.mpk differ