diff --git a/js/apps/system/aardvark/aardvark.js b/js/apps/system/aardvark/aardvark.js
index e53fa441a8..6a1f1ca487 100644
--- a/js/apps/system/aardvark/aardvark.js
+++ b/js/apps/system/aardvark/aardvark.js
@@ -123,7 +123,9 @@ controller.post("/foxxes/gitinstall", function (req, res) {
res.json({
error: false,
configuration: app.manifest.configuration || {},
- app: appID
+ app: appID,
+ name: app.name,
+ version: app.version
});
}).summary("Installs a foxx or update existing")
.notes("This function is used to install or update a (new) foxx.");
diff --git a/js/apps/system/aardvark/frontend/js/collections/foxxCollection.js b/js/apps/system/aardvark/frontend/js/collections/foxxCollection.js
index e584aafe8a..b93988a14e 100644
--- a/js/apps/system/aardvark/frontend/js/collections/foxxCollection.js
+++ b/js/apps/system/aardvark/frontend/js/collections/foxxCollection.js
@@ -45,13 +45,13 @@
contentType: "application/json",
processData: false,
success: function(data) {
- result = true;
+ result = data;
},
error: function(data) {
- if (data.responseText.indexOf() !== -1) {
- alert("Already newest app version installed.");
- }
- result = false;
+ console.log(data);
+ result = {
+ error: true
+ };
}
});
return result;
diff --git a/js/apps/system/aardvark/frontend/js/templates/modalApplicationMount.ejs b/js/apps/system/aardvark/frontend/js/templates/modalApplicationMount.ejs
index c6255d2267..8ff0401dd1 100644
--- a/js/apps/system/aardvark/frontend/js/templates/modalApplicationMount.ejs
+++ b/js/apps/system/aardvark/frontend/js/templates/modalApplicationMount.ejs
@@ -32,14 +32,6 @@
-
-
- Mount*:
- |
-
-
- |
-
@@ -57,14 +49,6 @@
-
-
- Mount*:
- |
-
-
- |
-
diff --git a/js/apps/system/aardvark/frontend/js/views/applicationsView.js b/js/apps/system/aardvark/frontend/js/views/applicationsView.js
index 8870d3bbc4..ef7154a8e0 100644
--- a/js/apps/system/aardvark/frontend/js/views/applicationsView.js
+++ b/js/apps/system/aardvark/frontend/js/views/applicationsView.js
@@ -1,367 +1,636 @@
/*jshint browser: true */
/*jshint strict: false, unused: false */
/*global Backbone, $, window, arangoHelper, templateEngine, Joi, _*/
+(function() {
+ "use strict";
-window.ApplicationsView = Backbone.View.extend({
- el: '#content',
+ var splitSnakeCase = function(snakeCase) {
+ var str = snakeCase.replace(/([a-z])([A-Z])/g, "$1 $2");
+ str = str.replace(/([a-z])([0-9])/gi, "$1 $2");
+ str = str.replace(/_+/, " ");
+ return _.map(str.split(/\s+/), function(s) {
+ return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();
+ }).join(" ");
+ };
- template: templateEngine.createTemplate("applicationsView.ejs"),
+ window.ApplicationsView = Backbone.View.extend({
+ el: '#content',
- events: {
- "click #addApp" : "createInstallModal",
- "click #checkDevel" : "toggleDevel",
- "click #checkActive" : "toggleActive",
- "click .checkSystem" : "toggleSystem",
- "click #foxxToggle" : "slideToggle",
- "click #importFoxxToggle" : "slideToggleImport",
- "change #importFoxx" : "uploadSetup",
- "click #confirmFoxxImport" : "importFoxx",
- "click #installFoxxFromGithub" : "createGithubModal",
- "click .css-label" : "checkBoxes",
- "change #appsDesc" : "sorting"
- },
+ template: templateEngine.createTemplate("applicationsView.ejs"),
- checkBoxes: function (e) {
- //chrome bugfix
- var clicked = e.currentTarget.id;
- $('#'+clicked).click();
- },
+ events: {
+ "click #addApp" : "createInstallModal",
+ "change #zip-file" : "uploadSetup",
- uploadSetup: function (e) {
- var files = e.target.files || e.dataTransfer.files;
- this.file = files[0];
- this.allowUpload = true;
- },
+ "click #checkDevel" : "toggleDevel",
+ "click #checkActive" : "toggleActive",
+ "click .checkSystem" : "toggleSystem",
+ "click #foxxToggle" : "slideToggle",
+ "click #importFoxxToggle" : "slideToggleImport",
+ "change #importFoxx" : "uploadSetup",
+ "click #confirmFoxxImport" : "importFoxx",
+ "click #installFoxxFromGithub" : "createGithubModal",
+ "click .css-label" : "checkBoxes",
+ "change #appsDesc" : "sorting"
+ },
- sorting: function() {
- if ($('#appsDesc').is(":checked")) {
- this.collection.setSortingDesc(true);
- }
- else {
- this.collection.setSortingDesc(false);
- }
- this.render();
- },
+ checkBoxes: function (e) {
+ //chrome bugfix
+ var clicked = e.currentTarget.id;
+ $('#'+clicked).click();
+ },
- createGithubModal: function() {
- var buttons = [], tableContent = [];
- tableContent.push(
- window.modalView.createTextEntry(
- 'github-url',
- 'Github information',
- '',
- 'Your Github link comes here: username/application-name',
- "username/application-name",
- false,
- [
- {
- rule: Joi.string().regex(/^[a-zA-Z0-9]+[\/]/),
- msg: "No valid github link given."
- },
- {
- rule: Joi.string().required(),
- msg: "No github link given."
- }
- ]
- ));
- tableContent.push(
- window.modalView.createTextEntry(
- 'github-version',
- 'Version (optional)',
- '',
- 'Example: v1.1.2 for version 1.1.2 - if no version is commited, master is used',
- 'master',
- false,
- /[<>&'"]/
- ));
- buttons.push(
- window.modalView.createSuccessButton('Install', this.submitGithubFoxx.bind(this))
- );
- window.modalView.show(
- 'modalTable.ejs', 'Install Foxx from Github', buttons, tableContent, undefined, undefined
- );
- },
+ uploadSetup: function (e) {
+ var files = e.target.files || e.dataTransfer.files;
+ this.file = files[0];
+ this.allowUpload = true;
+ },
- closeGithubModal: function() {
- window.modalView.hide();
- },
+ sorting: function() {
+ if ($('#appsDesc').is(":checked")) {
+ this.collection.setSortingDesc(true);
+ }
+ else {
+ this.collection.setSortingDesc(false);
+ }
- submitGithubFoxx: function() {
- var name, url, version, result;
+ this.render();
+ },
- //fetch needed information, need client side verification
- //remove name handling on server side because not needed
- name = "";
- url = $('#github-url').val();
- version = $('#github-version').val();
+ createGithubModal: function() {
+ var buttons = [], tableContent = [];
+ tableContent.push(
+ window.modalView.createTextEntry(
+ 'github-url',
+ 'Github information',
+ '',
+ 'Your Github link comes here: username/application-name',
+ "username/application-name",
+ false,
+ [
+ {
+ rule: Joi.string().regex(/^[a-zA-Z0-9]+[\/]/),
+ msg: "No valid github link given."
+ },
+ {
+ rule: Joi.string().required(),
+ msg: "No github link given."
+ }
+ ]
+ ));
+ tableContent.push(
+ window.modalView.createTextEntry(
+ 'github-version',
+ 'Version (optional)',
+ '',
+ 'Example: v1.1.2 for version 1.1.2 - if no version is commited, master is used',
+ 'master',
+ false,
+ /[<>&'"]/
+ ));
+ buttons.push(
+ window.modalView.createSuccessButton('Install', this.submitGithubFoxx.bind(this))
+ );
+ window.modalView.show(
+ 'modalTable.ejs', 'Install Foxx from Github', buttons, tableContent, undefined, undefined
+ );
+ },
- if (version === '') {
- version = "master";
- }
+ closeGithubModal: function() {
+ window.modalView.hide();
+ },
- //send server req through collection
- result = this.collection.installFoxxFromGithub(url, name, version);
- if (result === true) {
- this.closeGithubModal();
- this.reload();
- }
- },
+ submitGithubFoxx: function() {
+ var name, url, version, result;
- importFoxx: function() {
- var self = this;
- if (this.allowUpload) {
- this.showSpinner();
- $.ajax({
- type: "POST",
- async: false,
- url: '/_api/upload',
- data: self.file,
- processData: false,
- contentType: 'application/octet-stream',
- complete: function(res) {
- if (res.readyState === 4) {
- if (res.status === 201) {
- $.ajax({
- type: "POST",
- async: false,
- url: "/_admin/aardvark/foxxes/inspect",
- data: res.responseText,
- contentType: "application/json"
- }).done(function(res) {
+ //fetch needed information, need client side verification
+ //remove name handling on server side because not needed
+ name = "";
+ url = $('#repository').val();
+ version = $('#tag').val();
+
+ if (version === '') {
+ version = "master";
+ }
+
+ //send server req through collection
+ result = this.collection.installFoxxFromGithub(url, name, version);
+ if (result === true) {
+ window.modalView.hide();
+ this.reload();
+ }
+ },
+
+ importFoxx: function() {
+ var self = this;
+ if (this.allowUpload) {
+ this.showSpinner();
+ $.ajax({
+ type: "POST",
+ async: false,
+ url: '/_api/upload',
+ data: self.file,
+ processData: false,
+ contentType: 'application/octet-stream',
+ complete: function(res) {
+ if (res.readyState === 4) {
+ if (res.status === 201) {
$.ajax({
type: "POST",
async: false,
- url: '/_admin/foxx/fetch',
- data: JSON.stringify({
- name: res.name,
- version: res.version,
- filename: res.filename
- }),
- processData: false
- }).done(function () {
- self.reload();
- }).fail(function (err) {
+ url: "/_admin/aardvark/foxxes/inspect",
+ data: res.responseText,
+ contentType: "application/json"
+ }).done(function(res) {
+ $.ajax({
+ type: "POST",
+ async: false,
+ url: '/_admin/foxx/fetch',
+ data: JSON.stringify({
+ name: res.name,
+ version: res.version,
+ filename: res.filename
+ }),
+ processData: false
+ }).done(function () {
+ self.reload();
+ }).fail(function (err) {
+ self.hideSpinner();
+ var error = JSON.parse(err.responseText);
+ arangoHelper.arangoError("Error: " + error.errorMessage);
+ });
+ }).fail(function(err) {
self.hideSpinner();
var error = JSON.parse(err.responseText);
- arangoHelper.arangoError("Error: " + error.errorMessage);
+ arangoHelper.arangoError("Error: " + error.error);
});
- }).fail(function(err) {
+ delete self.file;
+ self.allowUpload = false;
self.hideSpinner();
- var error = JSON.parse(err.responseText);
- arangoHelper.arangoError("Error: " + error.error);
- });
- delete self.file;
- self.allowUpload = false;
- self.hideSpinner();
- self.hideImportModal();
- return;
+ self.hideImportModal();
+ return;
+ }
}
+ self.hideSpinner();
+ arangoHelper.arangoError("Upload error");
}
- self.hideSpinner();
- arangoHelper.arangoError("Upload error");
+ });
+ }
+ },
+
+ showSpinner: function() {
+ $('#uploadIndicator').show();
+ },
+
+ hideSpinner: function() {
+ $('#uploadIndicator').hide();
+ },
+
+ toggleDevel: function() {
+ var self = this;
+ this._showDevel = !this._showDevel;
+ _.each(this._installedSubViews, function(v) {
+ v.toggle("devel", self._showDevel);
+ });
+ },
+
+ toggleActive: function() {
+ var self = this;
+ this._showActive = !this._showActive;
+ _.each(this._installedSubViews, function(v) {
+ v.toggle("active", self._showActive);
+ });
+ },
+
+ toggleSystem: function() {
+ this._showSystem = !this._showSystem;
+ var self = this;
+ _.each(this._installedSubViews, function(v) {
+ v.toggle("system", self._showSystem);
+ });
+ this.createSubViews();
+ this.renderSubViews();
+ },
+
+ hideImportModal: function() {
+ $('#foxxDropdownImport').hide();
+ },
+
+ hideSettingsModal: function() {
+ $('#foxxDropdownOut').hide();
+ },
+
+ slideToggleImport: function() {
+ $('#foxxToggle').removeClass('activated');
+ $('#importFoxxToggle').toggleClass('activated');
+ $('#foxxDropdownImport').slideToggle(200);
+ this.hideSettingsModal();
+ },
+
+ slideToggle: function() {
+ //apply sorting to checkboxes
+ $('#appsDesc').attr('checked', this.collection.sortOptions.desc);
+
+ $('#importFoxxToggle').removeClass('activated');
+ $('#foxxToggle').toggleClass('activated');
+ $('#foxxDropdownOut').slideToggle(200);
+ this.hideImportModal();
+ },
+
+ reload: function() {
+ var self = this;
+
+ // unbind and remove any unused views
+ _.each(this._installedSubViews, function (v) {
+ v.undelegateEvents();
+ });
+ _.each(this._availableSubViews, function (v) {
+ v.undelegateEvents();
+ });
+
+ this.collection.fetch({
+ success: function() {
+ self.createSubViews();
+ self.render();
}
});
- }
- },
+ },
- showSpinner: function() {
- $('#uploadIndicator').show();
- },
+ createSubViews: function() {
+ var self = this;
+ this._installedSubViews = { };
+ this._availableSubViews = { };
- hideSpinner: function() {
- $('#uploadIndicator').hide();
- },
-
- toggleDevel: function() {
- var self = this;
- this._showDevel = !this._showDevel;
- _.each(this._installedSubViews, function(v) {
- v.toggle("devel", self._showDevel);
- });
- },
-
- toggleActive: function() {
- var self = this;
- this._showActive = !this._showActive;
- _.each(this._installedSubViews, function(v) {
- v.toggle("active", self._showActive);
- });
- },
-
- toggleSystem: function() {
- this._showSystem = !this._showSystem;
- var self = this;
- _.each(this._installedSubViews, function(v) {
- v.toggle("system", self._showSystem);
- });
- this.createSubViews();
- this.renderSubViews();
- },
-
- hideImportModal: function() {
- $('#foxxDropdownImport').hide();
- },
-
- hideSettingsModal: function() {
- $('#foxxDropdownOut').hide();
- },
-
- slideToggleImport: function() {
- $('#foxxToggle').removeClass('activated');
- $('#importFoxxToggle').toggleClass('activated');
- $('#foxxDropdownImport').slideToggle(200);
- this.hideSettingsModal();
- },
-
- slideToggle: function() {
- //apply sorting to checkboxes
- $('#appsDesc').attr('checked', this.collection.sortOptions.desc);
-
- $('#importFoxxToggle').removeClass('activated');
- $('#foxxToggle').toggleClass('activated');
- $('#foxxDropdownOut').slideToggle(200);
- this.hideImportModal();
- },
-
- reload: function() {
- var self = this;
-
- // unbind and remove any unused views
- _.each(this._installedSubViews, function (v) {
- v.undelegateEvents();
- });
- _.each(this._availableSubViews, function (v) {
- v.undelegateEvents();
- });
-
- this.collection.fetch({
- success: function() {
- self.createSubViews();
- self.render();
- }
- });
- },
-
- createSubViews: function() {
- var self = this;
- this._installedSubViews = { };
- this._availableSubViews = { };
-
- self.collection.each(function (foxx) {
- if (foxx.get('isSystem') && ! self._showSystem) {
- return;
- }
- var subView;
- if (foxx.get("type") === "app") {
- subView = new window.FoxxInstalledView({
- model: foxx,
- appsView: self
- });
- self._availableSubViews[foxx.get('_id')] = subView;
- } else if (foxx.get("type") === "mount") {
- subView = new window.FoxxActiveView({
- model: foxx,
- appsView: self
- });
- self._installedSubViews[foxx.get('_id')] = subView;
- }
- });
- },
-
- initialize: function() {
- this._installedSubViews = {};
- this._availableSubViews = {};
- this._showDevel = true;
- this._showActive = true;
- this._showSystem = true;
- this.reload();
- },
-
- render: function() {
- this.collection.sort();
-
- $(this.el).html(this.template.render({}));
- this.renderSubViews();
- this.delegateEvents();
- $('#checkActive').attr('checked', this._showActive);
- $('#checkDevel').attr('checked', this._showDevel);
- $('.checkSystem').attr('checked', this._showSystem);
-
- var self = this;
- _.each(this._installedSubViews, function(v) {
- v.toggle("devel", self._showDevel);
- v.toggle("active", self._showActive);
- v.toggle("system", self._showSystem);
- });
-
- arangoHelper.fixTooltips("icon_arangodb", "left");
- return this;
- },
-
- renderSubViews: function () {
- _.each(this._installedSubViews, function (v) {
- $("#installedList").append(v.render());
- });
-
- var versions = { };
- _.each(this._availableSubViews, function (v) {
- var name = v.model.get("name");
-
- //look which installed apps have multiple versions
- if (versions[name]) {
- versions[name].counter++;
- versions[name].versions.push(v.model.get("version"));
- }
- else {
- versions[name] = {
- counter: 1,
- versions: [v.model.get("version")]
- };
- }
- });
-
- _.each(this._availableSubViews, function (v) {
- var name = v.model.get("name"),
- version = v.model.get("version");
- if (versions[name].counter > 1 ) {
- //here comes special render for multiple versions view
-
- var highestVersion = "0.0.0";
- var selectOptions = [];
-
- _.each(versions[name].versions, function(x) {
- selectOptions.push({
- value: x,
- label: x
+ self.collection.each(function (foxx) {
+ if (foxx.get('isSystem') && ! self._showSystem) {
+ return;
+ }
+ var subView;
+ if (foxx.get("type") === "app") {
+ subView = new window.FoxxInstalledView({
+ model: foxx,
+ appsView: self
});
- if (x > highestVersion) {
- highestVersion = x;
+ self._availableSubViews[foxx.get('_id')] = subView;
+ } else if (foxx.get("type") === "mount") {
+ subView = new window.FoxxActiveView({
+ model: foxx,
+ appsView: self
+ });
+ self._installedSubViews[foxx.get('_id')] = subView;
+ }
+ });
+ },
+
+ initialize: function() {
+ this._installedSubViews = {};
+ this._availableSubViews = {};
+ this._showDevel = true;
+ this._showActive = true;
+ this._showSystem = true;
+ this.reload();
+ },
+
+ render: function() {
+ this.collection.sort();
+
+ $(this.el).html(this.template.render({}));
+ this.renderSubViews();
+ this.delegateEvents();
+ $('#checkActive').attr('checked', this._showActive);
+ $('#checkDevel').attr('checked', this._showDevel);
+ $('.checkSystem').attr('checked', this._showSystem);
+
+ var self = this;
+ _.each(this._installedSubViews, function(v) {
+ v.toggle("devel", self._showDevel);
+ v.toggle("active", self._showActive);
+ v.toggle("system", self._showSystem);
+ });
+
+ arangoHelper.fixTooltips("icon_arangodb", "left");
+ return this;
+ },
+
+ renderSubViews: function () {
+ _.each(this._installedSubViews, function (v) {
+ $("#installedList").append(v.render());
+ });
+
+ var versions = { };
+ _.each(this._availableSubViews, function (v) {
+ var name = v.model.get("name");
+
+ //look which installed apps have multiple versions
+ if (versions[name]) {
+ versions[name].counter++;
+ versions[name].versions.push(v.model.get("version"));
+ }
+ else {
+ versions[name] = {
+ counter: 1,
+ versions: [v.model.get("version")]
+ };
+ }
+ });
+
+ _.each(this._availableSubViews, function (v) {
+ var name = v.model.get("name"),
+ version = v.model.get("version");
+ if (versions[name].counter > 1 ) {
+ //here comes special render for multiple versions view
+
+ var highestVersion = "0.0.0";
+ var selectOptions = [];
+
+ _.each(versions[name].versions, function(x) {
+ selectOptions.push({
+ value: x,
+ label: x
+ });
+ if (x > highestVersion) {
+ highestVersion = x;
+ }
+ });
+
+ if (version === highestVersion) {
+ v.model.set("highestVersion", highestVersion);
+ v.model.set("versions", versions[name].versions);
+ v.model.set("selectOptions", selectOptions);
+
+ $("#availableList").append(v.render());
}
- });
-
- if (version === highestVersion) {
- v.model.set("highestVersion", highestVersion);
- v.model.set("versions", versions[name].versions);
- v.model.set("selectOptions", selectOptions);
-
+ }
+ else {
$("#availableList").append(v.render());
}
- }
- else {
- $("#availableList").append(v.render());
- }
- });
- },
+ });
+ },
- createInstallModal: function(event) {
- event.preventDefault();
- var buttons = [];
- window.modalView.show(
- "modalApplicationMount.ejs",
- "Pijotr",
- buttons
- );
- }
+ installFoxxFromZip: function() {
+ var self = this;
+ if (this.allowUpload) {
+ this.showSpinner();
+ $.ajax({
+ type: "POST",
+ async: false,
+ url: '/_api/upload',
+ data: self.file,
+ processData: false,
+ contentType: 'application/octet-stream',
+ complete: function(res) {
+ if (res.readyState === 4) {
+ if (res.status === 201) {
+ $.ajax({
+ type: "POST",
+ async: false,
+ url: "/_admin/aardvark/foxxes/inspect",
+ data: res.responseText,
+ contentType: "application/json"
+ }).done(function(res) {
+ $.ajax({
+ type: "POST",
+ async: false,
+ url: '/_admin/foxx/fetch',
+ data: JSON.stringify({
+ name: res.name,
+ version: res.version,
+ filename: res.filename
+ }),
+ processData: false
+ }).done(function () {
+ self.reload();
+ }).fail(function (err) {
+ self.hideSpinner();
+ var error = JSON.parse(err.responseText);
+ arangoHelper.arangoError("Error: " + error.errorMessage);
+ });
+ }).fail(function(err) {
+ self.hideSpinner();
+ var error = JSON.parse(err.responseText);
+ arangoHelper.arangoError("Error: " + error.error);
+ });
+ delete self.file;
+ self.allowUpload = false;
+ self.hideSpinner();
+ self.hideImportModal();
+ return;
+ }
+ }
+ self.hideSpinner();
+ arangoHelper.arangoError("Upload error");
+ }
+ });
+ }
+ },
-});
+ installFoxxFromStore: function() {
+ //Todo
+ },
+
+ installFoxxFromGithub: function() {
+ var name, url, version, result;
+
+ //fetch needed information, need client side verification
+ //remove name handling on server side because not needed
+ name = "";
+ url = $('#repository').val();
+ version = $('#tag').val();
+
+ if (version === '') {
+ version = "master";
+ }
+
+ //send server req through collection
+ result = this.collection.installFoxxFromGithub(url, name, version);
+ console.log(result);
+ if (result.error === false) {
+ window.modalView.hide();
+ this.showConfigureDialog(result.configuration, result.name, result.version);
+ }
+ },
+
+ showConfigureDialog: function(config, name, version) {
+ var buttons = [],
+ tableContent = [],
+ entry;
+ tableContent.push(
+ window.modalView.createTextEntry(
+ "mount-point",
+ "Mount",
+ "",
+ "The path the App will be mounted. Has to start with /. Is not allowed to start with /_",
+ "/my/app",
+ true,
+ //TODO nochmal schauen
+ [
+ {
+ rule: Joi.string().required(),
+ msg: "No mountpoint given."
+ },
+ {
+ rule: Joi.string().regex(/^\/[^_]/),
+ msg: "Mountpoints with _ are reserved for internal use."
+ },
+ {
+ rule: Joi.string().regex(/^(\/[a-zA-Z0-9_\-%]+)+$/),
+ msg: "Mountpoints have to start with / and can only contain [a-zA-Z0-9_-%]"
+ }
+ ]
+ )
+ );
+ _.each(config, function(obj, name) {
+ var def;
+ var check;
+ switch (obj.type) {
+ case "boolean":
+ case "bool":
+ def = obj.default || false;
+ entry = window.modalView.createCheckboxEntry(
+ "app_config_" + name,
+ name,
+ def,
+ obj.description,
+ def
+ );
+ break;
+ case "integer":
+ check = [{
+ rule: Joi.number().integer(),
+ msg: "Has to be an integer."
+ }];
+ default:
+ if (check === undefined) {
+ check = [{
+ rule: Joi.string(),
+ msg: "Has to be non-empty."
+ }];
+ }
+ if (obj.default === undefined) {
+ def = "";
+ } else {
+ def = String(obj.default);
+ }
+ entry = window.modalView.createTextEntry(
+ "app_config_" + name,
+ name,
+ def,
+ obj.description,
+ def,
+ true,
+ check
+ );
+ }
+ tableContent.push(entry);
+ });
+ buttons.push(
+ window.modalView.createSuccessButton("Configure", this.mountFoxx.bind(this, config, name, version))
+ );
+ window.modalView.show(
+ "modalTable.ejs", "Configure Application", buttons, tableContent
+ );
+
+ },
+
+ mountFoxx: function(config, name, version) {
+ var cfg = {};
+ try {
+ _.each(config, function(opt, key) {
+ var $el = $("#app_config_" + key);
+ var val = $el.val();
+ if (opt.type === "boolean") {
+ cfg[key] = $el.is(":checked");
+ return;
+ }
+ if (val === "" && !opt.hasOwnProperty("default")) {
+ throw new SyntaxError(
+ "Must specify value for field \"" +
+ (opt.label || splitSnakeCase(key)) +
+ "\"!"
+ );
+ }
+ if (opt.type === "number") {
+ cfg[key] = parseFloat(val);
+ } else if (opt.type === "integer") {
+ cfg[key] = parseInt(val, 10);
+ } else {
+ cfg[key] = val;
+ return;
+ }
+ if (_.isNaN(cfg[key])) {
+ throw new SyntaxError(
+ "Invalid value for field \"" +
+ (opt.label || splitSnakeCase(key)) +
+ "\"!"
+ );
+ }
+ if (opt.type === "integer" && cfg[key] !== Math.floor(parseFloat(val))) {
+ throw new SyntaxError(
+ "Expected non-decimal value in field \"" +
+ (opt.label || splitSnakeCase(key)) +
+ "\"!"
+ );
+ }
+ });
+ } catch (err) {
+ if (err instanceof SyntaxError) {
+ alert(err.message);
+ return false;
+ }
+ throw err;
+ }
+ var self = this;
+ this.collection.create({
+ mount: $("#mount-point").val(),
+ name: name,
+ version: version,
+ options: {
+ configuration: cfg
+ }
+ },
+ {
+ success: function() {
+ window.modalView.hide();
+ self.reload();
+ },
+ error: function(e, info) {
+ if (info.responseText.indexOf("already used by") > -1) {
+ alert("Mount-Path already in use.");
+ } else if (info.responseText.indexOf("app is not defined") > -1) {
+ //temp ignore this message, fix needs to be server-side
+ window.modalView.hide();
+ self.reload();
+ } else {
+ alert(info.statusText);
+ }
+ }
+ });
+ },
+
+ installFoxx: function() {
+
+ this.reload();
+ },
+
+ createInstallModal: function(event) {
+ event.preventDefault();
+ var buttons = [];
+ var modalEvents = {
+ "click #installGithub" : this.installFoxxFromGithub.bind(this),
+ "click #installZip" : this.submitGithubFoxx.bind(this),
+ "click .install-app" : this.submitGithubFoxx.bind(this),
+ };
+ window.modalView.show(
+ "modalApplicationMount.ejs",
+ "Install Application",
+ buttons,
+ undefined,
+ undefined,
+ modalEvents
+ );
+ }
+
+ });
+
+}());
diff --git a/js/apps/system/aardvark/frontend/js/views/foxxInstalledView.js b/js/apps/system/aardvark/frontend/js/views/foxxInstalledView.js
index 48df0158ff..f2ddd8d661 100644
--- a/js/apps/system/aardvark/frontend/js/views/foxxInstalledView.js
+++ b/js/apps/system/aardvark/frontend/js/views/foxxInstalledView.js
@@ -400,8 +400,7 @@
var opts = this.model.get("manifest").configuration;
if (opts && _.keys(opts).length) {
try {
- _.each(_.keys(opts), function(key) {
- var opt = opts[key];
+ _.each(opts, function(opt, key) {
var $el = $("#foxx_configs_" + key);
var val = $el.val();
if (opt.type === "boolean") {
@@ -453,7 +452,6 @@
version: version
});
- //this.model.collection.create({
toCreate.collection.create({
mount: mountPoint,
name: toCreate.get("name"),
diff --git a/js/apps/system/aardvark/frontend/js/views/modalView.js b/js/apps/system/aardvark/frontend/js/views/modalView.js
index f82a8b4707..14016cbc08 100644
--- a/js/apps/system/aardvark/frontend/js/views/modalView.js
+++ b/js/apps/system/aardvark/frontend/js/views/modalView.js
@@ -14,22 +14,22 @@
};
};
- var createTextStub = function(type, label, value, info, placeholder, mandatory, regexp,
+ var createTextStub = function(type, label, value, info, placeholder, mandatory, joiObj,
addDelete, addAdd, maxEntrySize, tags) {
var obj = {
type: type,
label: label
};
- if (value) {
+ if (value !== undefined) {
obj.value = value;
}
- if (info) {
+ if (info !== undefined) {
obj.info = info;
}
- if (placeholder) {
+ if (placeholder !== undefined) {
obj.placeholder = placeholder;
}
- if (mandatory) {
+ if (mandatory !== undefined) {
obj.mandatory = mandatory;
}
if (addDelete !== undefined) {
@@ -44,11 +44,11 @@
if (tags !== undefined) {
obj.tags = tags;
}
- if (regexp){
+ if (joiObj){
// returns true if the string contains the match
- obj.validateInput = function(el){
- //return regexp.test(el.val());
- return regexp;
+ obj.validateInput = function() {
+ // return regexp.test(el.val());
+ return joiObj;
};
}
return obj;
@@ -311,14 +311,14 @@
self.testInput = (function(){
_.each(completeTableContent,function(r){
- if(r.validateInput) {
+ if(r.validateInput !== undefined) {
//catch result of validation and act
$('#' + r.id).on('keyup focusout', function(e){
var validation = r.validateInput($('#' + r.id));
var error = false, msg;
- _.each(validation, function(validator, key) {
+ _.each(validation, function(validator) {
var schema = Joi.object().keys({
toCheck: validator.rule
@@ -334,8 +334,7 @@
toCheck: valueToCheck
},
schema,
- function (err, value) {
-
+ function (err) {
if (err) {
msg = validator.msg;
error = true;