diff --git a/ShowByCondition/.gitignore b/ShowByCondition/.gitignore new file mode 100644 index 0000000..4f4740d --- /dev/null +++ b/ShowByCondition/.gitignore @@ -0,0 +1,20 @@ +test/javasource/ +test/deployment/ +test/.classpath +test/.project +test/theme/ +test/userlib/ +test/.classpath +test/.project +*.launch +*.tmp +*.lock +.idea/ + +dist/ + +node_modules/ +.editorconfig +*DS_Store* +.vscode/ +*.bak diff --git a/ShowByCondition/.jshintrc b/ShowByCondition/.jshintrc new file mode 100644 index 0000000..f73b569 --- /dev/null +++ b/ShowByCondition/.jshintrc @@ -0,0 +1,23 @@ +{ + // Enforcing + "curly" : false, + "forin" : false, + "latedef" : "nofunc", + "newcap" : true, + "quotmark" : "double", + "eqeqeq" : true, + "undef" : true, + "globals" : { + "mendix" : false, + "mx" : false, + "logger" : false + }, + + // Relaxing + "laxbreak" : true, + + // Environments + "browser" : true, + "devel" : true, + "dojo" : true +} diff --git a/ShowByCondition/Gruntfile.js b/ShowByCondition/Gruntfile.js new file mode 100644 index 0000000..b7c5ef4 --- /dev/null +++ b/ShowByCondition/Gruntfile.js @@ -0,0 +1,233 @@ +// Generated on 2016-10-22 using generator-mendix 1.3.7 :: 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/ShowByCondition/package.json b/ShowByCondition/package.json new file mode 100644 index 0000000..dceee02 --- /dev/null +++ b/ShowByCondition/package.json @@ -0,0 +1,35 @@ +{ + "name": "ShowByCondition", + "version": "1.1.0", + "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" + }, + "engines": { + "node": ">=0.12.0" + }, + "generatorVersion": "1.3.7", + "paths": { + "testProjectFolder": "./test/", + "testProjectFileName": "Test.mpr" + }, + "scripts": { + "test": "grunt test" + } +} diff --git a/ShowByCondition/src/ShowByCondition/ShowByCondition.xml b/ShowByCondition/src/ShowByCondition/ShowByCondition.xml index 94e268d..21c6322 100644 --- a/ShowByCondition/src/ShowByCondition/ShowByCondition.xml +++ b/ShowByCondition/src/ShowByCondition/ShowByCondition.xml @@ -1,22 +1,47 @@ - ShowByCondition - This widget will hide or show its parent, based on the result of a Microflow. - -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 + ShowByCondition + This widget will hide or show its parent, based on the result of a Microflow. + + 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 - - - Boolean Microflow - Data source - Select the Microflow that determines whether the element should be shown. - - - - Show on true? - Data source - 'Yes' shows the parent element on a true outcome, 'No' on a false outcome. - - + + + Evaluation Type + Data source + Defines whether conditional visibility is controlled by existance of a reference or by a boolean microflow. + + + Microflow + Reference + + + + Apply To + Data source + Defines whether conditional visibility is controlled by existance of a reference or by a boolean microflow. + + + Parent Element + Previous Sibling + + + + Boolean Microflow + Data source + Select the Microflow that determines whether the element should be shown. + + + + Reference To Check + Data source + Select a referenced entity to check for its presence instead of using a microflow. + + + Show on true? + Data source + 'Yes' shows the parent element on a true outcome, 'No' on a false outcome. + + diff --git a/ShowByCondition/src/ShowByCondition/widget/ShowByCondition.js b/ShowByCondition/src/ShowByCondition/widget/ShowByCondition.js index 1cf2312..4925c58 100644 --- a/ShowByCondition/src/ShowByCondition/widget/ShowByCondition.js +++ b/ShowByCondition/src/ShowByCondition/widget/ShowByCondition.js @@ -30,40 +30,61 @@ define([ // Parameters configured in the Modeler. microflowName: "", - returnValue: "", + returnValue: "", + checktype: "microflow", + referenceEntity: "", + applyto: "parent", + + _referenceName: "", + _targetNode: "", // dojo.declare.constructor is called to construct the widget instance. Implement to initialize non-primitive properties. constructor: function() { // Uncomment the following line to enable debug messages - logger.level(logger.DEBUG); + //logger.level(logger.DEBUG); logger.debug(this.id + ".constructor"); }, // dijit._WidgetBase.postCreate is called after constructing the widget. Implement to do extra setup work. postCreate: function() { logger.debug(this.id + ".postCreate"); - this.domNode.parentElement.style.display = "none"; + + if (this.applyto === "parent") { + this._targetNode = this.domNode.parentElement; + } else { + this._targetNode = this.domNode.previousSibling; + } + + this._targetNode.style.display = "none"; + + if (this.referenceEntity) { + this._referenceName = this.referenceEntity.split("/")[0]; + } }, setParentDisplay : function(display) { - console.log(display); if (display == this.returnValue){ - this.domNode.parentElement.style.display = "block"; + this._targetNode.style.display = ""; + } else { + this._targetNode.style.display = "none"; } }, // mxui.widget._WidgetBase.update is called when context is changed or initialized. Implement to re-render and / or fetch data. update: function(obj, callback) { logger.debug(this.id + ".update"); - this._contextObj = obj; - this._resetSubscriptions(); - this._updateRendering(); + + if(obj) { + this._contextObj = obj; + this._resetSubscriptions(); + this._updateRendering(); + } callback(); }, - + // Rerender the interface.         _updateRendering: function () { - if (this.microflowName != '') { + if (this.checktype === "microflow" && this.microflowName != '') { mx.data.action({ params: { applyto: "selection", @@ -77,11 +98,19 @@ define([ alert(error.description); } }, this); + } else if (this.checktype === "reference") { + if (this._contextObj.get(this._referenceName)) { + this.setParentDisplay(true); + } else { + this.setParentDisplay(false); + } }         },         // Reset subscriptions.         _resetSubscriptions: function () {             var _objectHandle = null; + var _attrHandle = null; +             // Release handles on previous object, if any.             if (this._handles) {                 this._handles.forEach(function (handle, i) { @@ -89,7 +118,7 @@ define([                 });                 this._handles = [];             } -            // When a mendix object exists create subscribtions. +            // When a mendix object exists create subscribtions.             if (this._contextObj) {                 _objectHandle = this.subscribe({                     guid: this._contextObj.getGuid(), @@ -97,7 +126,24 @@ define([                         this._updateRendering();                     })                 }); -                this._handles = [_objectHandle]; + + if (this.referenceEntity) { + _attrHandle = this.subscribe({ + guid: this._contextObj.getGuid(), + attr: this._referenceName, + callback: lang.hitch(this, function (guid, attr, attrValue) { + this._updateRendering(); + }) + }); + + } + + if (this.referenceEntity) { + this._handles = [_objectHandle, _attrHandle]; + + } else { + this._handles = [_objectHandle]; + }             }         }, diff --git a/ShowByCondition/test/ShowByCondition_TestProject.mpk b/ShowByCondition/test/ShowByCondition_TestProject.mpk deleted file mode 100644 index 9007a1c..0000000 Binary files a/ShowByCondition/test/ShowByCondition_TestProject.mpk and /dev/null differ diff --git a/ShowByCondition/test/Test.mpr b/ShowByCondition/test/Test.mpr new file mode 100644 index 0000000..32a2e56 Binary files /dev/null and b/ShowByCondition/test/Test.mpr differ diff --git a/ShowByCondition/test/Widget/ShowByCondition.mpk b/ShowByCondition/test/Widget/ShowByCondition.mpk deleted file mode 100644 index 31ced26..0000000 Binary files a/ShowByCondition/test/Widget/ShowByCondition.mpk and /dev/null differ diff --git a/ShowByCondition/test/widgets/ShowByCondition.mpk b/ShowByCondition/test/widgets/ShowByCondition.mpk new file mode 100644 index 0000000..fcc15e9 Binary files /dev/null and b/ShowByCondition/test/widgets/ShowByCondition.mpk differ