Initial commit

This commit is contained in:
Isaac Parenteau committed 2018-07-07 20:43:51 -05:00
commit 880e39de2e
511 files changed
+38363

No files matched your search

@@ -0,0 +1,91 @@
<md-dialog flex="40">
<form name="credForm" ng-submit="credForm.$valid && ok()">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{header}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="Close dialog">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content layout-padding flex>
<div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label>Credential Name</label>
<input ng-model="credentials.name" name="credName" id="credName" required>
<div ng-messages="credForm.credName.$error" ng-show="credForm.credName.$invalid && submitted || credForm.credName.$touched">
<div ng-message="required">Credentials name is required</div>
</div>
</md-input-container>
</div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label>Credential Type</label>
<md-select ng-model="credentials.credentialType" required name="type" id="type">
<md-option ng-repeat="cred in credentialTypes" ng-value="cred.name">{{cred.value}}</md-option>
</md-select>
<div ng-messages="credForm.type.$error" ng-show="credForm.type.$invalid && submitted || credForm.type.$touched">
<div ng-message="required">Credential type is required</div>
</div>
</md-input-container>
</div>
</div>
<div layout-gt-xs="row" layout-align="start center" ng-if="credentials.credentialType === 'PASSWD'">
<md-input-container class="md-block" flex-gt-sm>
<label>User Name</label>
<input ng-model="credentials.username" required name="username" id="username">
<div ng-messages="credForm.username.$error" ng-show="credForm.username.$invalid && submitted || credForm.username.$touched">
<div ng-message="required">Username is required</div>
</div>
</md-input-container>
<md-input-container class="md-block" flex-gt-xs>
<label>Password</label>
<input ng-model="credentials.password" type="{{passwordType}}" name="password" id="password" ng-required="requirePassword">
<div ng-messages="credForm.password.$error" ng-show="credForm.password.$invalid && submitted || credForm.password.$touched">
<div ng-message="required">Password is required</div>
</div>
</md-input-container>
<md-button class="md-icon-button" style="margin-bottom: 25px;" ng-mousedown="passwordType='text'" ng-mouseup="passwordType='password'">
<md-icon>remove_red_eye</md-icon>
<md-tooltip>View password</md-tooltip>
</md-button>
</div>
<div layout="column" ng-if="credentials.credentialType === 'SSH'" flex>
<md-input-container class="md-block" flex-gt-sm>
<label>User Identity</label>
<input ng-model="credentials.username" required name="username" id="username">
<div ng-messages="credForm.username.$error" ng-show="credForm.username.$invalid && submitted || credForm.username.$touched">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="bottom">Username on the remote system the ssh key belongs to</md-tooltip>
<div ng-message="required">User identity is required</div>
</div>
</md-input-container>
<md-input-container class="md-block" flex>
<label>SSH Private Key</label>
<textarea ng-model="credentials.key" name="sshKey" id="sshKey" required rows="3" cols="50"></textarea>
<div ng-messages="credForm.sshKey.$error" ng-show="credForm.sshKey.$invalid && submitted || credForm.sshKey.$touched">
<div ng-message="required">SSH Key is required</div>
</div>
</md-input-container>
<md-input-container class="md-block" flex>
<label>Passphrase</label>
<input ng-model="credentials.passphrase" name="passphrase" id="passphrase">
</md-input-container>
</div>
<div ng-show="loadingBlock" class="loadingFade"></div>
<div class="loadingModal" ng-show="loadingBlock">
<md-progress-circular md-mode="indeterminate" md-diameter="80" class="md-hue-2"></md-progress-circular>
</div>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="okButton" type="submit" class="md-raised md-primary" >OK</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</form>
</md-dialog>
@@ -0,0 +1,60 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.addCreds', ['ui.router']).controller('AddCredsCtrl', AddUserCtrlController);
function AddUserCtrlController($scope, modalInstance, $state, cache, $mdDialog, Account, Credentials, credentialStores, credentialProvider, portalUtils) {
$scope.header = modalInstance.header;
$scope.passwordType = 'password';
$scope.submitted = false;
$scope.loadingBlock = false;
$scope.isNew = modalInstance.credentials === undefined ? true : false;
$scope.credentials = $scope.isNew ? new Credentials() : modalInstance.credentials;
$scope.valid = false;
$scope.mCache = cache.request([new credentialStores.CredentialTypes()]).then(function(){
$scope.credentialTypes = $scope.mCache.credentialTypes.data.values;
});
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
$scope.loadingBlock = true;
var status = $scope.isNew ? 'added': 'edited';
$scope.submitted = true;
credentialProvider.addCredentials($scope.credentials).then(function(data){
$scope.loadingBlock = false;
portalUtils.toast('Credentials ' + status + ' successfully', ['top', 'left'], 2000);
$mdDialog.hide();
}).catch(function(err){
$scope.loadingBlock = false;
$scope.error = err.message;
});
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
} //end AddUserCtrlController function
})();
@@ -0,0 +1,32 @@
<md-dialog flex="25">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{header}} to {{currentDir}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="Close dialog">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content flex>
<div layout="row" flex="100" class="md-dialog-content">
<md-input-container flex>
<label>File Directory Location</label>
<input type="text" id="fileName" ng-model="model.fileDir" required>
</md-input-container>
</div>
<div ng-show="loadingBlock" class="loadingFade"></div>
<div class="loadingModal" ng-show="loadingBlock">
<md-progress-circular md-mode="indeterminate" md-diameter="80" class="md-hue-2"></md-progress-circular>
</div>
</md-dialog-content>
<div ng-show="loadingBlock" class="loadingFade"></div>
<div class="loadingModal" ng-show="loadingBlock">
<md-progress-circular md-mode="indeterminate" md-diameter="80" class="md-hue-2"></md-progress-circular>
</div>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger text-center">{{error}}</div>
<md-button id="okButton" class="md-raised md-primary" ng-click="ok()" ng-disabled="!valid">OK</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</md-dialog>
@@ -0,0 +1,67 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.addDirectory', ['ui.router'])
.controller('AddDirectoryCtrl', AddDirectoryCtrlController);
function AddDirectoryCtrlController($scope, modalInstance, $state, cache, $mdDialog, fileProvider, UploadFile, portalUtils) {
$scope.header = modalInstance.header;
$scope.currentDir = modalInstance.currentDir;
$scope.loadingBlock = false;
$scope.model = { };
$scope.valid = false;
$scope.$watch('model', function(){
if ($scope.model.fileDir === undefined) {
$scope.valid = false;
return;
}
$scope.valid = true;
}, true);
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
$scope.loadingBlock = true;
fileProvider.makeDirectory($scope.currentDir, $scope.model.fileDir).then(function(data) {
$scope.loadingBlock = false;
portalUtils.toast('Directory added successfully', ['top', 'left'], 2000);
$mdDialog.hide();
}).catch(function(err) {
$scope.loadingBlock = false;
$scope.error = err.message;
});
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
$scope.$on('$destroy', function () {
if ($scope.mCache !== undefined) {
$scope.mCache.unlisten();
}
});
} //end AddDirectoryCtrlController function
})();
@@ -0,0 +1,39 @@
<md-dialog>
<form name="emailTmplForm" ng-submit="emailTmplForm.$valid && ok()">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{header}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="Close dialog">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content layout-padding flex>
<div layout="column" layout-align="start start" flex>
<md-input-container class="md-block" flex-gt-sm>
<label>Email Template Name</label>
<input ng-model="emailTmpl.emailName" required id="emailTmpl" name="emailTmpl">
<div ng-messages="emailTmplForm.emailTmpl.$error" ng-show="emailTmplForm.emailTmpl.$invalid && submitted || emailTmplForm.emailTmpl.$touched">
<div ng-message="required">Email template name is required</div>
</div>
</md-input-container>
<md-input-container class="md-block" flex-gt-sm>
<label>Email Subject</label>
<input ng-model="emailTmpl.emailSubject" required id="emailSubject" name="emailSubject">
<div ng-messages="emailTmplForm.emailSubject.$error" ng-show="emailTmplForm.emailSubject.$invalid && submitted || emailTmplForm.emailSubject.$touched">
<div ng-message="required">Email subject is required</div>
</div>
</md-input-container>
<span><strong>Email Body</strong></span>
<textarea ui-tinymce="tinymceOptions" ng-model="emailTmpl.emailMessage"></textarea>
</div>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="okButton" type="submit" class="md-raised md-primary" >OK</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</form>
</md-dialog>
@@ -0,0 +1,67 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.addEmailTmpl', ['ui.router']).controller('AddEmailTmplCtrl', addEmailTmplCtrlController);
function addEmailTmplCtrlController($scope, modalInstance, $state, cache, $mdDialog, EmailTemplate,
systemProvider, scriptStores, portalUtils, $timeout) {
$scope.trustAsHtml = portalUtils.trustAsHtml;
$scope.header = modalInstance.header;
$scope.submitted = false;
$scope.loadingBlock = false;
$scope.isNew = modalInstance.template === undefined;
$scope.emailTmpl = $scope.isNew ? new EmailTemplate() : new EmailTemplate(modalInstance.template);
/*jshint ignore:start*/
$scope.tinymceOptions = {
inline: false,
skin: 'lightgray',
theme : 'modern',
branding: false,
height: 300,
max_height: 300,
width: 600,
max_width: 600,
resize: false
};
/*jshint ignore:end*/
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
$scope.loadingBlock = true;
var status = $scope.isNew ? 'Added': 'Edited';
systemProvider.addEmailTemplate($scope.emailTmpl).then(function(data){
portalUtils.toast('Email Template ' + status + ' Successfully', ['top', 'left'], 2000);
$mdDialog.hide();
}).catch(function(err) {
$scope.loadingBlock = false;
$scope.error = err.message;
});
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
} //end addEmailTmplCtrlController function
})();
@@ -0,0 +1,50 @@
<md-dialog flex="40">
<form name="envForm" ng-submit="envForm.$valid && ok()">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{header}}</span>
<md-button class="md-icon-button" ng-click="addEnvVar()">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">New Environment Variable</md-tooltip>
<md-icon class="md-icon-default-color">note_add</md-icon>
</md-button>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="Close dialog">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content flex>
<md-list flex>
<md-list-item ng-repeat="param in envVars" class="secondary-button-padding">
<div layout="row" flex="100" style="background: {{$index % 2 === 0 ? 'white' : '#DCDCDC'}}; padding-left:5px; padding-right:5px;">
<div layout="row" flex>
<md-input-container flex>
<label>Variable Name</label>
<input type="text" ng-model="param.name" class="answerInput" required/>
</md-input-container>
<span flex="5"></span>
<md-input-container flex>
<label>Variable Value</label>
<input type="text" ng-model="param.value" class="answerInput" required/>
</md-input-container>
</div>
<div layout="column" flex="10">
<div layout="row" layout-align="end center" flex>
<md-button class="md-icon-button" ng-click="delete($index, envVars)" >
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Remove Environment Variable</md-tooltip>
<md-icon>delete</md-icon>
</md-button>
</div>
</div>
</div>
</md-list-item>
</md-list>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="okButton" type="submit" class="md-raised md-primary" >OK</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</form>
</md-dialog>
@@ -0,0 +1,86 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.addEnvVars', ['ui.router']).controller('AddEnvVarCtrl', addEnvVarCtrlController);
function addEnvVarCtrlController($scope, modalInstance, cache, $mdDialog, scriptObjects,
systemProvider, systemStores, portalUtils) {
$scope.header = modalInstance.header;
$scope.submitted = false;
$scope.loadingBlock = false;
$scope.isNew = modalInstance.envVars.length === 0;
$scope.envVars = [];
if (!$scope.isNew) {
for (var i = 0; i < modalInstance.envVars.length; i++) {
$scope.envVars.push( new scriptObjects.ScriptEnvironmentVariable(modalInstance.envVars[i]) );
}
}
$scope.valid = false;
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
$scope.loadingBlock = true;
var status = $scope.isNew ? 'added': 'edited';
$scope.submitted = true;
systemProvider.addEnvVars($scope.envVars).then(function(data) {
$scope.loadingBlock = false;
portalUtils.toast('Script ' + status + ' successfully', ['top', 'left'], 2000);
$mdDialog.hide();
}).catch(function(err) {
$scope.loadingBlock = false;
$scope.error = err.message;
});
};
$scope.addEnvVar = function() {
var env = new scriptObjects.ScriptEnvironmentVariable();
$scope.envVars.push(env);
};
$scope.moveUp = function(index, array) {
var ent1 = array[index];
var ent2 = array[index-1];
array[index] = ent2;
array[index-1] = ent1;
};
$scope.moveDown = function(index, array) {
var ent1 = array[index];
var ent2 = array[index+1];
array[index] = ent2;
array[index+1] = ent1;
};
$scope.delete = function (id, array) {
array.splice(id, 1);
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
} //end addEnvVarCtrlController function
})();
@@ -0,0 +1,74 @@
<md-dialog flex="40">
<form name="gitForm" ng-submit="gitForm.$valid && ok()">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{header}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="Close dialog">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content layout-padding flex>
<div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label>Name</label>
<input ng-model="git.name" name="name" id="name" required>
<div ng-messages="gitForm.name.$error" ng-show="gitForm.name.$invalid && submitted || gitForm.name.$touched">
<div ng-message="required">Name is required</div>
</div>
</md-input-container>
</div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label>Git SCM Url</label>
<input ng-model="git.scm" name="scm" id="scm" required>
<div ng-messages="gitForm.scm.$error" ng-show="gitForm.scm.$invalid && submitted || gitForm.scm.$touched">
<div ng-message="required">Git SCM url is required</div>
</div>
</md-input-container>
</div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label>Git Branch</label>
<input ng-model="git.branch" name="branch" id="branch" required>
<div ng-messages="gitForm.branch.$error" ng-show="gitForm.branch.$invalid && submitted || gitForm.branch.$touched">
<div ng-message="required">Git SCM url is required</div>
</div>
</md-input-container>
</div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label>Local Checkout Directory</label>
<input ng-model="git.directory" name="directory" id="directory" required>
<div ng-messages="gitForm.directory.$error" ng-show="gitForm.directory.$invalid && submitted || gitForm.directory.$touched">
<div ng-message="required">Checkout directory is required</div>
</div>
</md-input-container>
</div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label>Credentials</label>
<md-select ng-model="git.credentials" required name="creds" id="creds" ng-model-options="{trackBy: '$value.uid'}">
<md-option ng-repeat="cred in credentials" ng-value="cred">{{displayKey(cred)}}</md-option>
</md-select>
<div ng-messages="credForm.creds.$error" ng-show="credForm.creds.$invalid && submitted || credForm.creds.$touched">
<div ng-message="required">Credentials are required</div>
</div>
</md-input-container>
</div>
</div>
<div ng-show="loadingBlock" class="loadingFade"></div>
<div class="loadingModal" ng-show="loadingBlock">
<md-progress-circular md-mode="indeterminate" md-diameter="80" class="md-hue-2"></md-progress-circular>
</div>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="okButton" type="submit" class="md-raised md-primary" >OK</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</form>
</md-dialog>
@@ -0,0 +1,67 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.addGit', ['ui.router']).controller('AddGitCtrl', addGitCtrlController);
function addGitCtrlController($scope, modalInstance, $state, cache, $mdDialog, GitInfo, Account, accountProvider, gitProvider, credentialStores, portalUtils) {
$scope.trustAsHtml = portalUtils.trustAsHtml;
$scope.header = modalInstance.header;
$scope.submitted = false;
$scope.loadingBlock = false;
$scope.isNew = modalInstance.gitInfo === undefined ? true : false;
$scope.git = $scope.isNew ? new GitInfo() : modalInstance.gitInfo;
$scope.valid = false;
$scope.mCache = cache.request([new credentialStores.Credentials()]).then(function(){
$scope.credentials = $scope.mCache.credentials.data.values;
});
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
$scope.loadingBlock = true;
var status = $scope.isNew ? 'added': 'edited';
$scope.submitted = true;
gitProvider.addGitRepo($scope.git).then(function(data){
$scope.loadingBlock = false;
portalUtils.toast('Git ' + status + ' successfully', ['top', 'left'], 2000);
$mdDialog.hide();
}).catch(function(err){
$scope.loadingBlock = false;
$scope.error = err.message;
});
};
$scope.displayKey = function(cred) {
if (cred === undefined) {
return '';
}
return cred.name + (cred.credentialType === 'SSH' ? ' (SSH Key)' : ' (Username/Password)');
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
} //end addGitCtrlController function
})();
@@ -0,0 +1,67 @@
<md-dialog flex>
<form name="permForm" ng-submit="permForm.$valid && ok()">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{header}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="Close dialog">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content layout-padding flex>
<div>
<div layout="row">
<md-input-container class="md-block" flex-gt-xs ng-if="isNew">
<label>Permission Group Unique Name</label>
<input ng-model="permission.name" name="name" id="name" required>
<div ng-messages="permForm.name.$error" ng-show="permForm.name.$invalid && submitted || permForm.name.$touched">
<div ng-message="required">Unique name required</div>
</div>
</md-input-container>
<md-input-container class="md-block" flex-gt-xs>
<label>Permission Group Display Name</label>
<input ng-model="permission.displayName" name="displayName" id="displayName" required>
<div ng-messages="permForm.displayName.$error" ng-show="permForm.displayName.$invalid && submitted || permForm.displayName.$touched">
<div ng-message="required">Display name required</div>
</div>
</md-input-container>
</div>
<div layout="row" flex>
<md-list>
<md-list-item>
<p flex>Permission Group Enabled</p>
<span flex="5"></span>
<md-switch md-invert ng-model="permission.enabled" class="md-primary">{{permission.enabled ? 'True' : 'False'}}</md-switch>
</md-list-item>
</md-list>
</div>
</div>
<div layout="row" flex>
<md-tabs md-dynamic-height flex>
<md-tab ng-repeat="cat in permissionCategories" label="{{cat.displayName}}">
<md-content class="md-padding" flex>
<md-list>
<md-list-item ng-repeat="perm in cat.permissions">
<p>{{perm.displayName}}</p>
<span flex="5"></span>
<md-switch ng-model="perm.allowed" class="md-primary">{{perm.allowed ? 'Enabled' : 'Disabled'}}</md-switch>
</md-list-item>
</md-list>
</md-content>
</md-tab>
</md-tabs>
</div>
<div ng-show="loadingBlock" class="loadingFade"></div>
<div class="loadingModal" ng-show="loadingBlock">
<md-progress-circular md-mode="indeterminate" md-diameter="80" class="md-hue-2"></md-progress-circular>
</div>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="okButton" type="submit" class="md-raised md-primary" >OK</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</form>
</md-dialog>
@@ -0,0 +1,92 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.addPermission', ['ui.router']).controller('AddPermissionCtrl', AddPermissionCtrlController);
function AddPermissionCtrlController($scope, modalInstance, $state, cache, $mdDialog, permissionObjects,
permissionStores, permissionProvider, portalUtils) {
$scope.header = modalInstance.header;
$scope.submitted = false;
$scope.loadingBlock = false;
$scope.isNew = modalInstance.permission === undefined ? true : false;
$scope.permission = $scope.isNew ? new permissionObjects.PermissionGroup() : new permissionObjects.PermissionGroup(modalInstance.permission);
$scope.valid = false;
$scope.permissionCategories = [];
$scope.mCache = cache.request([new permissionStores.PermissionCategories()]).then(function(){
$scope.permissionCategories = $scope.mCache.permissionCategories.data.values;
if (!$scope.isNew) {
$.each($scope.permission.permissions, function(key, value) {
for (var i = 0; i < $scope.permissionCategories.length; i++) {
var cat = $scope.permissionCategories[i];
if (cat.name !== value.permissionCategory) {
continue;
}
for (var j = 0; j < cat.permissions.length; j++) {
var perm = cat.permissions[j];
if (value.permissionId === perm.id) {
perm.allowed = value.allowed;
}
}
}
});
}
}).catch(function(err){
portalUtils.toast('Unable to get permission categories: ' + err.message, ['top', 'left'], 2000);
});
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
$scope.loadingBlock = true;
var status = $scope.isNew ? 'added': 'edited';
$scope.submitted = true;
$scope.permission.permissions = [];
$.each($scope.permissionCategories, function(key, cat) {
$.each(cat.permissions, function(key2, perm) {
var newPerm = new permissionObjects.PermissionGroupPermission({
permissionId: perm.id,
permissionGroupId: $scope.permission.id,
name: perm.name,
displayName: perm.displayName,
allowed: perm.allowed === undefined ? false : perm.allowed
});
$scope.permission.permissions.push(newPerm);
});
});
permissionProvider.updatePermissions($scope.isNew, $scope.permission).then(function(results) {
$scope.loadingBlock = false;
portalUtils.toast('Permission ' + status + ' successfully', ['top', 'left'], 2000);
$mdDialog.hide();
}).catch(function(err){
$scope.loadingBlock = false;
$scope.error = err.message;
});
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
} //end AddPermissionCtrlController function
})();
@@ -0,0 +1,63 @@
<md-card>
<md-card-content>
<div layout="row" flex="100">
<md-toolbar class="md-padding md-portal-grey">
<div layout="row" layout-align="center center" flex="100">
<span><strong>Schedule</strong></span>
<span flex></span>
<md-button class="md-icon-button" ng-click="addSchedule()">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">New Schedule</md-tooltip>
<md-icon class="md-icon-default-color">note_add</md-icon>
</md-button>
</div>
</md-toolbar>
</div>
<div layout="row" flex="100">
<md-list flex>
<md-list-item ng-repeat="sched in script.schedule" class="secondary-button-padding" ng-if="sched.frequency !== 'NOW' && sched.frequency !== 'TRIGGERED'">
<div layout="row" flex="100" style="background: {{$index % 2 === 0 ? 'white' : '#DCDCDC'}}; padding-left:5px; padding-right:5px;">
<md-input-container flex>
<label>Frequency</label>
<md-select ng-model="sched.frequency" required>
<md-option ng-repeat="sched in schedFreq" ng-value="sched.name" ng-if="sched.name !== 'NOW' && sched.name !== 'TRIGGERED'">{{sched.value}}</md-option>
</md-select>
</md-input-container>
<md-input-container flex>
<label >Start Date/Time</label>
<input mdc-datetime-picker="" date="true" time="true" type="text" id="startdatetime"
show-todays-date="" minutes="true" min-date="date" show-icon="true" format='MMM D, YYYY h:mm:ss A'
ng-model="sched.startDatetime" class=" dtp-no-msclear dtp-input">
</md-input-container>
<md-input-container flex ng-if="sched.frequency !== 'SPECIFIC'" >
<label style="padding-left: 35px;">End Date/Time</label>
<input mdc-datetime-picker="" date="true" time="true" type="text" id="enddatetime"
show-todays-date="" minutes="true" min-date="date" show-icon="true" format='MMM D, YYYY h:mm:ss A'
ng-model="sched.endDatetime" class=" dtp-no-msclear dtp-input md-input">
</md-input-container>
<md-input-container ng-if="sched.frequency !== 'SPECIFIC'">
<label>Number of Executions</label>
<input type="number" min="0" ng-model="sched.maxExecutions"/>
</md-input-container>
<div layout="row" layout-align="end center" flex>
<md-button class="md-icon-button" ng-click="moveUp($index, script.schedule)" ng-if="($index > 0)">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Move Up</md-tooltip>
<md-icon>arrow_upward</md-icon>
</md-button>
<md-button class="md-icon-button" ng-if="($index < script.schedule.length-1) &&
(script.schedule[$index + 1] !== undefined &&
script.schedule[$index + 1].frequency != 'NOW' &&
script.schedule[$index + 1].frequency != 'TRIGGERED')" ng-click="moveDown($index, script.schedule)">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Move Down</md-tooltip>
<md-icon>arrow_downward</md-icon>
</md-button>
<md-button class="md-icon-button" ng-click="delete($index,script.schedule)" >
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Remove Parameter</md-tooltip>
<md-icon>delete</md-icon>
</md-button>
</div>
</div>
</md-list-item>
</md-list>
</div>
</md-card-content>
</md-card>
@@ -0,0 +1,9 @@
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label>Command</label>
<input ng-model="script.command" name="scm" id="scm" required>
<div ng-messages="scriptForm.scm.$error" ng-show="scriptForm.scm.$invalid && submitted || scriptForm.scm.$touched">
<div ng-message="required">Script command is required</div>
</div>
</md-input-container>
</div>
@@ -0,0 +1,27 @@
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label><strong>Credentials</strong></label>
<md-select ng-model="script.remote.scriptCredentials" required name="creds" id="creds" ng-model-options="{trackBy: '$value.uid'}">
<md-option ng-repeat="cred in credentials" ng-value="cred">{{displayKey(cred)}}</md-option>
</md-select>
<div ng-messages="scriptForm.creds.$error" ng-show="scriptForm.creds.$invalid && submitted || scriptForm.creds.$touched">
<div ng-message="required">Credentials are required</div>
</div>
</md-input-container>
</div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label><strong>SSH URL</strong></label>
<input ng-model="script.remote.url" name="url" id="url" required>
<div ng-messages="scriptForm.url.$error" ng-show="scriptForm.url.$invalid && submitted || scriptForm.url.$touched">
<div ng-message="required">SSH URL is required</div>
</div>
</md-input-container>
<md-input-container class="md-block" flex-gt-xs>
<label><strong>SSH Port</strong></label>
<input ng-model="script.remote.port" type="number" min="0" max="65535" name="port" id="port" required>
<div ng-messages="scriptForm.port.$error" ng-show="scriptForm.port.$invalid && submitted || scriptForm.port.$touched">
<div ng-message="required">SSH URL is required</div>
</div>
</md-input-container>
</div>
@@ -0,0 +1,78 @@
<div layout-gt-xs="row">
<md-checkbox ng-model="model.fromLocal" ng-change="fromLocalChange()" class="md-primary">
From Local
</md-checkbox>
</div>
<div layout-gt-xs="row" ng-if="!model.fromLocal">
<md-input-container class="md-block" flex-gt-xs>
<label><strong>From Host</strong></label>
<input ng-model="script.scp.fromHost" name="fromHost" id="fromHost" required>
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="bottom">Host name of the machine script is copying from. For local type 'LOCAL'</md-tooltip>
<div ng-messages="scriptForm.fromHost.$error" ng-show="scriptForm.fromHost.$invalid && submitted || scriptForm.fromHost.$touched">
<div ng-message="required">From host address is required</div>
</div>
</md-input-container>
<md-input-container class="md-block" flex-gt-xs>
<label><strong>From Port</strong></label>
<input ng-model="script.scp.fromPort" type="number" min="0" max="65535" name="fromPort" id="fromPort" required>
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="bottom">Host port of the machine script is copying from. For local type '0'</md-tooltip>
<div ng-messages="scriptForm.fromPort.$error" ng-show="scriptForm.fromPort.$invalid && submitted || scriptForm.fromPort.$touched">
<div ng-message="required">From Port is required</div>
</div>
</md-input-container>
</div>
<div layout-gt-xs="row" ng-if="!model.fromLocal">
<md-input-container class="md-block" flex-gt-xs>
<label><strong>From Credentials</strong></label>
<md-select ng-model="script.scp.fromCredentials" required name="fromCredentials" id="fromCredentials" ng-model-options="{trackBy: '$value.uid'}">
<md-option ng-repeat="cred in credentials" ng-value="cred">{{displayKey(cred)}}</md-option>
</md-select>
<div ng-messages="scriptForm.fromCredentials.$error" ng-show="scriptForm.fromCredentials.$invalid && submitted || scriptForm.fromCredentials.$touched">
<div ng-message="required">From credentials are required</div>
</div>
</md-input-container>
</div>
<div layout-gt-xs="row">
<md-checkbox ng-model="model.toLocal" ng-change="toLocalChange()" class="md-primary">
To Local
</md-checkbox>
</div>
<div layout-gt-xs="row" ng-if="!model.toLocal">
<md-input-container class="md-block" flex-gt-xs>
<label><strong>To Host</strong></label>
<input ng-model="script.scp.toHost" name="toHost" id="toHost" required>
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="bottom">Host name of the machine script is copying to. For local type 'LOCAL'</md-tooltip>
<div ng-messages="scriptForm.toHost.$error" ng-show="scriptForm.toHost.$invalid && submitted || scriptForm.toHost.$touched">
<div ng-message="required">To host address is required</div>
</div>
</md-input-container>
<md-input-container class="md-block" flex-gt-xs>
<label><strong>SSH Port</strong></label>
<input ng-model="script.scp.toPort" type="number" min="0" max="65535" name="toPort" id="toPort" required>
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="bottom">Host port of the machine script is copying to. For local type '0'</md-tooltip>
<div ng-messages="scriptForm.toPort.$error" ng-show="scriptForm.toPort.$invalid && submitted || scriptForm.toPort.$touched">
<div ng-message="required">To Port is required</div>
</div>
</md-input-container>
</div>
<div layout-gt-xs="row" ng-if="!model.toLocal">
<md-input-container class="md-block" flex-gt-xs>
<label><strong>To Credentials</strong></label>
<md-select ng-model="script.scp.toCredentials" required name="toCredentials" id="toCredentials" ng-model-options="{trackBy: '$value.uid'}">
<md-option ng-repeat="cred in credentials" ng-value="cred">{{displayKey(cred)}}</md-option>
</md-select>
<div ng-messages="scriptForm.toCredentials.$error" ng-show="scriptForm.toCredentials.$invalid && submitted || scriptForm.toCredentials.$touched">
<div ng-message="required">From credentials are required</div>
</div>
</md-input-container>
</div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label><strong>File name or regex for file</strong></label>
<input ng-model="script.scp.dataRegex" name="dataRegex" id="dataRegex" required>
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="bottom">File name or regular expression for file to send'</md-tooltip>
<div ng-messages="scriptForm.dataRegex.$error" ng-show="scriptForm.dataRegex.$invalid && submitted || scriptForm.dataRegex.$touched">
<div ng-message="required">File name or regular expression required</div>
</div>
</md-input-container>
</div>
@@ -0,0 +1,55 @@
<md-card>
<md-card-content>
<div layout="row" flex="100">
<md-toolbar class="md-padding md-portal-grey">
<div layout="row" layout-align="center center" flex="100">
<span><strong>Script</strong></span>
<span flex></span>
</div>
</md-toolbar>
</div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label><strong>Script Name</strong></label>
<input ng-model="script.name" name="name" id="name" required>
<div ng-messages="scriptForm.name.$error" ng-show="scriptForm.name.$invalid && submitted || scriptForm.name.$touched">
<div ng-message="required">Name is required</div>
</div>
</md-input-container>
</div>
<md-input-container class="md-block" flex-gt-xs>
<label><strong>Script Type</strong></label>
<md-select ng-model="script.scriptType" required name="scriptType" id="scriptType">
<md-option ng-repeat="st in scriptTypes" ng-value="st.name">{{st.value}}</md-option>
</md-select>
<div ng-messages="scriptForm.scriptType.$error" ng-show="scriptForm.scriptType.$invalid && submitted || scriptForm.scriptType.$touched">
<div ng-message="required">Script type is required</div>
</div>
</md-input-container>
<div layout-gt-xs="column" ng-switch="script.scriptType">
<div ng-switch-when="LOCAL">
<div ng-include src ="'common/partials/add-script/add-script-left-local.html'" flex></div>
</div>
<div ng-switch-when="REMOTE">
<div ng-include src ="'common/partials/add-script/add-script-left-remote.html'" flex></div>
</div>
<div ng-switch-when="SCP">
<div ng-include src ="'common/partials/add-script/add-script-left-scp.html'" flex></div>
</div>
</div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label>Base Directory</label>
<input ng-model="script.baseDirectory" name="bd" id="bd">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="bottom">Base directory to find files in</md-tooltip>
</md-input-container>
</div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label>Output Directory</label>
<input ng-model="script.outputDirectory" name="od" id="od">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Directory to send/save the files to</md-tooltip>
</md-input-container>
</div>
</md-card-content>
</md-card>
@@ -0,0 +1,60 @@
<div layout="row" flex="100">
<md-toolbar class="md-padding md-portal-grey">
<div layout="row" layout-align="center center" flex="100">
<span><strong>Script Chain</strong></span>
<span flex></span>
<md-button class="md-icon-button" ng-click="addScriptChain()">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">New Script Chain</md-tooltip>
<md-icon class="md-icon-default-color">note_add</md-icon>
</md-button>
</div>
</md-toolbar>
</div>
<div layout="row" flex="100">
<md-list flex>
<md-list-item ng-repeat="chain in script.scriptChain" class="secondary-button-padding">
<div layout="row" flex="100" style="background: {{$index % 2 === 0 ? 'white' : '#DCDCDC'}}; padding-left:5px; padding-right:5px;">
<div layout="row" flex>
<md-input-container class="md-block" flex>
<label>Scripts</label>
<md-select ng-model="chain.childScript" required name="chain_{{$index}}" id="chain_{{$index}}" ng-model-options="{trackBy: '$value'}" flex>
<md-option ng-repeat="s in availScripts" ng-value="s.id" ng-if="s.name !== script.name">{{s.name}}</md-option>
</md-select>
<div ng-messages="scriptForm['chain_' + $index].$error" ng-show="scriptForm['chain_' + $index].$invalid && submitted || scriptForm['chain_' + $index].$touched">
<div ng-message="required">Script Required</div>
</div>
</md-input-container>
<md-input-container flex>
<label>Exit Status</label>
<input type="number" ng-model="chain.exitStatus" class="answerInput" required name="exitStatus_{{$index}}" id="exitStatus_{{$index}}"/>
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Exit status of the parent script to execute this script</md-tooltip>
<div ng-messages="scriptForm['exitStatus_' + $index].$error" ng-show="scriptForm['exitStatus_' + $index].$invalid && submitted || scriptForm['exitStatus_' + $index].$touched">
<div ng-message="required">Exit Status is Required</div>
</div>
</md-input-container>
<md-input-container flex>
<label>Exec After N Mins</label>
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">(Optional) How many minutes after the parent script ends should this script execute</md-tooltip>
<input type="number" ng-model="chain.executeAfterMin" class="answerInput"/>
</md-input-container>
</div>
<div layout="column" flex="25">
<div layout="row" layout-align="end center" flex>
<md-button class="md-icon-button" ng-click="moveUp($index, script.scriptChain" ng-if="($index > 0)">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Move Up</md-tooltip>
<md-icon>arrow_upward</md-icon>
</md-button>
<md-button class="md-icon-button" ng-if="($index < script.scriptChain.length-1)" ng-click="moveDown($index, script.scriptChain)">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Move Down</md-tooltip>
<md-icon>arrow_downward</md-icon>
</md-button>
<md-button class="md-icon-button" ng-click="delete($index, script.scriptChain)" >
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Remove Parameter</md-tooltip>
<md-icon>delete</md-icon>
</md-button>
</div>
</div>
</div>
</md-list-item>
</md-list>
</div>
@@ -0,0 +1,89 @@
<div layout="row" flex="100">
<md-toolbar class="md-padding md-portal-grey">
<div layout="row" layout-align="center center" flex="100">
<span><strong>Script Email</strong></span>
<span flex></span>
<md-button class="md-icon-button" ng-click="addScriptEmail()">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">New Script Email</md-tooltip>
<md-icon class="md-icon-default-color">note_add</md-icon>
</md-button>
</div>
</md-toolbar>
</div>
<div layout="column" flex="100">
<div layout="row" ng-if="model.addEmail" flex>
<div layout="row" layout-align="start center" flex>
<md-input-container class="md-block" flex>
<label>Email Template</label>
<md-select ng-model="model.email" required name="email_{{$index}}" id="email_{{$index}}" flex>
<md-option ng-repeat="tmpl in emails" ng-value="tmpl">{{tmpl.emailName}}</md-option>
</md-select>
<div ng-messages="scriptForm['email_' + $index].$error" ng-show="scriptForm['email_' + $index].$invalid && submitted || scriptForm['email_' + $index].$touched">
<div ng-message="required">Email Template Required</div>
</div>
</md-input-container>
<md-button class="md-icon-button" ng-click="addRecipient(model)">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Add Recipient</md-tooltip>
<md-icon>add</md-icon>
</md-button>
</div>
<md-list flex>
<md-list-item ng-repeat="recip in model.recipients track by $index">
<div layout="row" layout-align="start start" flex>
<md-input-container class="md-block" flex>
<label>Recipient</label>
<md-select ng-model="recip" required name="recip_{{$index}}_{{$parent.$index}}" id="recip_{{$index}}_{{$parent.$index}}" ng-change="userUpdate(model, recip, $index)" flex>
<md-option ng-repeat="u in users track by $index" ng-value="u">{{u.username}}</md-option>
</md-select>
<div ng-messages="scriptForm['recip_' + $index + '_' + $parent.$index].$error"
ng-show="scriptForm['recip_' + $index + '_' + $parent.$index].$invalid && submitted || scriptForm['recip_' + $index + '_' + $parent.$index].$touched">
<div ng-message="required">Recipient Required</div>
</div>
</md-input-container>
</div>
</md-list-item>
</md-list>
<div layout="column" flex="25">
<div layout="row" layout-align="end center" flex>
<md-button class="md-icon-button" ng-click="confirmTemplate()" >
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Confirm Email Template</md-tooltip>
<md-icon>check</md-icon>
</md-button>
<md-button class="md-icon-button" ng-click="removeTmpl()" >
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Remove Email Template</md-tooltip>
<md-icon>delete</md-icon>
</md-button>
</div>
</div>
</div>
<md-list flex>
<md-list-item ng-repeat="email in script.scriptEmails track by $index" class="secondary-button-padding">
<div layout="row" flex="100" style="background: {{$index % 2 === 0 ? 'white' : '#DCDCDC'}}; padding-left:5px; padding-right:5px;">
<div layout="row" layout-align="start center" flex>
<md-input-container class="md-block" flex>
<label>Email Template</label>
<input ng-value="email.emailName" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
</div>
<md-list flex>
<md-list-item ng-repeat="recip in email.recipients track by $index">
<div layout="row" layout-align="start start" flex>
<md-input-container class="md-block" flex>
<label>Recipient</label>
<input ng-value="recip.username" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
</div>
</md-list-item>
</md-list>
<div layout="column" flex="25">
<div layout="row" layout-align="end center" flex>
<md-button class="md-icon-button" ng-click="delete($index, script.scriptEmails)" >
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Remove Email Template</md-tooltip>
<md-icon>delete</md-icon>
</md-button>
</div>
</div>
</div>
</md-list-item>
</md-list>
</div>
@@ -0,0 +1,47 @@
<div layout="row" flex="100">
<md-toolbar class="md-padding md-portal-grey">
<div layout="row" layout-align="center center" flex="100">
<span><strong>Script Environment Variables</strong></span>
<span flex></span>
<md-button class="md-icon-button" ng-click="addEnvVar()">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">New Script Environment Variable</md-tooltip>
<md-icon class="md-icon-default-color">note_add</md-icon>
</md-button>
</div>
</md-toolbar>
</div>
<div layout="row" flex="100">
<md-list flex>
<md-list-item ng-repeat="param in script.scriptVariables" class="secondary-button-padding">
<div layout="row" flex="100" style="background: {{$index % 2 === 0 ? 'white' : '#DCDCDC'}}; padding-left:5px; padding-right:5px;">
<div layout="row" flex>
<md-input-container flex>
<label>Variable Name</label>
<input type="text" ng-model="param.name" class="answerInput"/>
</md-input-container>
<span flex="5"></span>
<md-input-container flex>
<label>Variable Value</label>
<input type="text" ng-model="param.value" class="answerInput"/>
</md-input-container>
</div>
<div layout="column" flex="25">
<div layout="row" layout-align="end center" flex>
<md-button class="md-icon-button" ng-click="moveUp($index, script.scriptVariables)" ng-if="($index > 0)">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Move Up</md-tooltip>
<md-icon>arrow_upward</md-icon>
</md-button>
<md-button class="md-icon-button" ng-if="($index < script.scriptVariables.length-1)" ng-click="moveDown($index, script.scriptVariables)">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Move Down</md-tooltip>
<md-icon>arrow_downward</md-icon>
</md-button>
<md-button class="md-icon-button" ng-click="delete($index, script.scriptVariables)" >
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Remove Parameter</md-tooltip>
<md-icon>delete</md-icon>
</md-button>
</div>
</div>
</div>
</md-list-item>
</md-list>
</div>
@@ -0,0 +1,41 @@
<div layout="row" flex="100">
<md-toolbar class="md-padding md-portal-grey">
<div layout="row" layout-align="center center" flex="100">
<span><strong>{{script.scriptType !== 'LOCAL' ? 'Commands' : 'Parameters'}}</strong></span>
<span flex></span>
<md-button class="md-icon-button" ng-click="addParameter()">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">{{script.scriptType !== 'LOCAL' ? 'New Command' : 'New Parameter'}}</md-tooltip>
<md-icon class="md-icon-default-color">note_add</md-icon>
</md-button>
</div>
</md-toolbar>
</div>
<div layout="row" flex="100">
<md-list flex>
<md-list-item ng-repeat="param in script.parameters" class="secondary-button-padding">
<div layout="row" flex="100" style="background: {{$index % 2 === 0 ? 'white' : '#DCDCDC'}}; padding-left:5px; padding-right:5px;">
<div layout="column" flex>
<md-input-container flex md-no-float>
<input type="text" ng-model="param.parameter" class="answerInput"/>
</md-input-container>
</div>
<div layout="column" flex="25">
<div layout="row" layout-align="end center" flex>
<md-button class="md-icon-button" ng-click="moveUp($index, script.parameters)" ng-if="($index > 0)">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Move Up</md-tooltip>
<md-icon>arrow_upward</md-icon>
</md-button>
<md-button class="md-icon-button" ng-if="($index < script.parameters.length-1)" ng-click="moveDown($index, script.parameters)">
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Move Down</md-tooltip>
<md-icon>arrow_downward</md-icon>
</md-button>
<md-button class="md-icon-button" ng-click="delete($index,script.parameters)" >
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Remove Parameter</md-tooltip>
<md-icon>delete</md-icon>
</md-button>
</div>
</div>
</div>
</md-list-item>
</md-list>
</div>
@@ -0,0 +1,21 @@
<md-card ng-if="script.scriptType !== 'SCP'">
<md-card-content>
<div ng-include src ="'common/partials/add-script/add-script-right-parameters.html'"flex></div>
</md-card-content>
</md-card>
<md-card>
<md-card-content>
<div ng-include src ="'common/partials/add-script/add-script-right-chain.html'" flex></div>
</md-card-content>
</md-card>
<md-card>
<md-card-content ng-if="script.scriptType !== 'SCP'">
<div ng-include src ="'common/partials/add-script/add-script-right-env-vars.html'" flex></div>
</md-card-content>
</md-card>
<md-card ng-if="model.smtpEnabled">
<md-card-content>
<div ng-include src ="'common/partials/add-script/add-script-right-email.html'" flex></div>
</md-card-content>
</md-card>
<md-card>
@@ -0,0 +1,19 @@
.add-script-even {
background-color: #f3f3f3;
}
answerInput.md-input-container.md-input {
height: 65px !important;
}
.md-parameter-toolbar {
background-color: rgb(219, 233, 240) !important;
color: black !important;
padding-left: 5px !important;
padding-right: 5px !important;
}
.md-icon-default-color {
color: grey !important;
color: rgba(0, 0, 0, 0.54) !important;
}
@@ -0,0 +1,31 @@
<md-dialog flex="95">
<form name="scriptForm" ng-submit="scriptForm.$valid && ok()">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{header}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="Close dialog">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content layout-padding flex>
<div layout="row" flex>
<div layout="column" flex="50" ng-include src="'common/partials/add-script/add-script-left.html'"></div>
<div layout="column" flex="50" ng-include src="'common/partials/add-script/add-script-right.html'"></div>
</div>
<div ng-include src="'common/partials/add-script/add-script-bottom.html'"></div>
<div ng-show="loadingBlock" class="loadingFade"></div>
<div class="loadingModal" ng-show="loadingBlock">
<md-progress-circular md-mode="indeterminate" md-diameter="80" class="md-hue-2"></md-progress-circular>
</div>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="okButton" type="submit" class="md-raised md-primary" >OK</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</form>
</md-dialog>
@@ -0,0 +1,218 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.addScript', ['ui.router']).controller('AddScriptCtrl', addScriptCtrlController);
function addScriptCtrlController($scope, modalInstance, $state, cache, $mdDialog, scriptObjects, EmailTemplate, Account,
scriptProvider, scriptStores, credentialStores, portalUtils, systemStores, accountStores) {
$scope.trustAsHtml = portalUtils.trustAsHtml;
$scope.header = modalInstance.header;
$scope.submitted = false;
$scope.loadingBlock = false;
$scope.isNew = modalInstance.script === undefined ? true : false;
$scope.script = $scope.isNew ? new scriptObjects.Script() : new scriptObjects.Script(modalInstance.script);
$scope.model = {
fromLocal: $scope.isNew || $scope.script.scriptType !== 'SCP' ? false : $scope.script.scp.fromHost === 'LOCAL',
toLocal: $scope.isNew || $scope.script.scriptType !== 'SCP' ? false : $scope.script.scp.toHost === 'LOCAL',
addEmail : false,
recipients: []
};
$scope.valid = false;
$scope.mCache = cache.request([
new scriptStores.ScriptTypes(),
new scriptStores.ScheduleFrequencies(),
new credentialStores.Credentials(),
new scriptStores.Scripts(),
new systemStores.EmailTemplates(),
new systemStores.SMTPConfig(),
new accountStores.UserPool()
]).then(function(){
$scope.scriptTypes = $scope.mCache.scriptTypes.data.values;
$scope.schedFreq = $scope.mCache.scheduleFrequencies.data.values;
$scope.credentials = $scope.mCache.credentials.data.values;
$scope.availScripts = $scope.mCache.scripts.data.values;
$scope.users = $scope.mCache.userPool.data.values;
$scope.emails = $scope.mCache.emailTmpls.data.values;
$.each($scope.mCache.smtpConfig.data.values, function(key, value){
if (value.name === 'smtp.enabled') {
$scope.model.smtpEnabled = value.value === 'true' || value.value === true;
return;
}
});
});
$scope.fromLocalChange = function() {
if ($scope.model.fromLocal) {
$scope.script.scp.fromHost = 'LOCAL';
$scope.script.scp.fromPort = 0;
$scope.script.scp.fromCredentials = $scope.credentials[0];
} else {
$scope.script.scp.fromHost = undefined;
$scope.script.scp.fromPort = undefined;
$scope.script.scp.fromCredentials = undefined;
}
};
$scope.toLocalChange = function() {
if ($scope.model.toLocal) {
$scope.script.scp.toHost = 'LOCAL';
$scope.script.scp.toPort = 0;
$scope.script.scp.toCredentials = $scope.credentials[0];
} else {
$scope.script.scp.toHost = undefined;
$scope.script.scp.toPort = undefined;
$scope.script.scp.toCredentials = undefined;
}
};
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
$scope.loadingBlock = true;
var status = $scope.isNew ? 'added': 'edited';
$scope.submitted = true;
$.each($scope.script.schedule, function(index, value) {
$scope.script.schedule[index].startDatetime = convertTime(value.startDatetime);
$scope.script.schedule[index].endDatetime = convertTime(value.endDatetime);
$scope.script.schedule[index].lastRun = convertTime(value.lastRun);
});
scriptProvider.addScript($scope.script).then(function(data) {
$scope.loadingBlock = false;
portalUtils.toast('Script ' + status + ' successfully', ['top', 'left'], 2000);
$mdDialog.hide();
}).catch(function(err) {
$scope.loadingBlock = false;
$scope.error = err.message;
});
};
function convertTime(value) {
if (value === null || value === undefined) {
return undefined;
}
var dte;
if(moment.isMoment(value)) {
dte = value.unix();
} else if ($.isNumeric(value)) {
dte = value;
} else if (typeof value.getTime === 'function'){
dte = value.getTime();
} else {
//When adding a new file the return date comes back like this format Nov 2, 2017 10:53:19 AM
//We need to parse it back to a moment object to parse it to the correct format
dte = moment(value, 'MMM D, YYY h:mm:ss A').unix();
}
return dte;
}
$scope.displayKey = function(cred) {
if (cred === undefined) {
return '';
}
return cred.name + (cred.credentialType === 'SSH' ? ' (SSH Key)' : ' (Username/Password)');
};
$scope.addParameter = function() {
var param = new scriptObjects.ScriptParameter();
$scope.script.parameters.push(param);
};
$scope.addSchedule = function() {
var sched = new scriptObjects.ScriptSchedule();
$scope.script.schedule.unshift(sched);
};
$scope.addScriptChain = function() {
var chain = new scriptObjects.ScriptChain();
chain.parentScript = $scope.script.id;
$scope.script.scriptChain.push(chain);
};
$scope.addEnvVar = function() {
var env = new scriptObjects.ScriptEnvironmentVariable();
$scope.script.scriptVariables.push(env);
};
$scope.addScriptEmail = function() {
$scope.model.addEmail = true;
};
$scope.removeTmpl = function() {
$scope.model.email = undefined;
$scope.model.recipients = [];
$scope.model.addEmail = false;
};
$scope.confirmTemplate = function() {
var email = new EmailTemplate($scope.model.email);
$.each($scope.model.recipients, function(key, value) {
email.recipients.push(new Account(value));
});
$scope.script.scriptEmails.push(email);
$scope.removeTmpl();
};
$scope.emailTmpl = function(email, index) {
$scope.script.scriptEmails[index] = email;
};
$scope.userUpdate = function(email, recip, index) {
email.recipients[index] = recip;
};
$scope.addRecipient = function(email) {
var user = new Account();
email.recipients.push(user);
};
$scope.moveUp = function(index, array) {
var ent1 = array[index];
var ent2 = array[index-1];
array[index] = ent2;
array[index-1] = ent1;
};
$scope.moveDown = function(index, array) {
var ent1 = array[index];
var ent2 = array[index+1];
array[index] = ent2;
array[index+1] = ent1;
};
$scope.delete = function (id, array) {
array.splice(id, 1);
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
} //end addScriptCtrlController function
})();
@@ -0,0 +1,102 @@
<md-dialog flex="40">
<form name="userForm" ng-submit="userForm.$valid && ok()">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{header}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="Close dialog">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content layout-padding flex>
<div>
<div layout-gt-xs="row">
<md-input-container class="md-block" flex-gt-xs>
<label>Email Address <small>(This will be their user name)</small></label>
<input ng-model="account.email" name="email" id="email" required ng-pattern="/^.+@.+\..+$/">
<div ng-messages="userForm.email.$error" ng-show="userForm.email.$invalid && submitted || userForm.email.$touched">
<div ng-message="required">Email is required</div>
<div ng-message="pattern">Email is not in correct format</div>
</div>
</md-input-container>
</div>
<div layout-gt-xs="row" layout-align="start center">
<md-input-container class="md-block" flex-gt-xs>
<label>Password</label>
<input ng-model="account.password" type="{{passwordType}}" name="password" id="password" ng-required="requirePassword">
<div ng-messages="userForm.password.$error" ng-show="userForm.password.$invalid && submitted || userForm.password.$touched">
<div ng-message="required">Password is required</div>
</div>
</md-input-container>
<md-button class="md-icon-button" style="margin-bottom: 25px;" ng-mousedown="passwordType='text'" ng-mouseup="passwordType='password'">
<md-icon>remove_red_eye</md-icon>
<md-tooltip>View password</md-tooltip>
</md-button>
<md-input-container class="md-block" flex-gt-xs>
<label>Confirm Password</label>
<input ng-model="account.confPassword" type="{{confPasswordType}}" name="confPassword" id="confPassword"
ng-required="requirePassword" compare-to="account.password">
<div ng-messages="userForm.confPassword.$error" ng-show="userForm.confPassword.$invalid && submitted || userForm.confPassword.$touched">
<div ng-message="compareTo">Passwords do not match</div>
<div ng-message="required">Must confirm password</div>
</div>
</md-input-container>
<md-button class="md-icon-button" style="margin-bottom: 25px;" ng-mousedown="confPasswordType='text'" ng-mouseup="confPasswordType='password'">
<md-icon>remove_red_eye</md-icon>
<md-tooltip>View password</md-tooltip>
</md-button>
</div>
<div layout-gt-sm="row">
<md-input-container class="md-block" flex-gt-sm>
<label>First name</label>
<input ng-model="account.firstName">
</md-input-container>
<md-input-container class="md-block" flex-gt-sm>
<label>Last Name</label>
<input ng-model="account.lastName">
</md-input-container>
</div>
<div layout-gt-sm="row">
<md-input-container class="md-block" flex-gt-sm>
<label>Role</label>
<md-select ng-model="account.role" id="role" name="role" required>
<md-option value="USER">User</md-option>
<md-option value="ADMIN">Administrator</md-option>
</md-select>
<div ng-messages="userForm.role.$error" ng-show="userForm.role.$invalid && submitted || userForm.role.$touched">
<div ng-message="required">Role is required</div>
</div>
</md-input-container>
</div>
<div layout-gt-sm="row">
<md-input-container class="md-block" flex-gt-sm>
<label>Effective Date</label>
<md-datepicker ng-model="account.effectiveDate"></md-datepicker>
</md-input-container>
<md-input-container class="md-block" flex-gt-sm>
<label>Expiration Date</label>
<md-datepicker ng-model="account.expirationDate"></md-datepicker>
</md-input-container>
</div>
</div>
<div ng-show="loadingBlock" class="loadingFade"></div>
<div class="loadingModal" ng-show="loadingBlock">
<md-progress-circular md-mode="indeterminate" md-diameter="80" class="md-hue-2"></md-progress-circular>
</div>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="okButton" type="submit" class="md-raised md-primary" >OK</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</form>
</md-dialog>
@@ -0,0 +1,85 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.addUser', ['ui.router']).controller('AddUserCtrl', AddUserCtrlController);
function AddUserCtrlController($scope, modalInstance, $state, cache, $mdDialog, Account, accountProvider, portalUtils,
permissionStores, configStores, Triggers) {
$scope.header = modalInstance.header;
$scope.passwordType = 'password';
$scope.confPasswordType = 'password';
$scope.requirePassword = modalInstance.requirePassword;
$scope.submitted = false;
$scope.loadingBlock = false;
$scope.isNew = modalInstance.account === undefined ? true : false;
$scope.account = $scope.isNew ? new Account() : modalInstance.account;
$scope.valid = false;
$scope.mCache = cache.request([new configStores.Config('userExpirationDays'),
new permissionStores.AllPermissionGroups()]).then(function(){
$scope.expirationDays = parseInt($scope.mCache.config.data.userExpirationDays);
$scope.permissionGroups = $scope.mCache.allPermissionGroups.data.values;
}).catch(function(err){
portalUtils.toast('Unable to get expiration days: ' + err.message, ['top', 'left'], 4000);
});
if ($scope.isNew) {
$scope.account.effectiveDate = new Date();
} else {
$scope.account.effectiveDate = moment($scope.account.effectiveDate);
$scope.account.expirationDate = moment($scope.account.expirationDate);
}
$scope.$watch('expirationDays', function(value){
if ($scope.isNew) {
$scope.account.expirationDate = moment().add($scope.expirationDays, 'days');
}
});
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
$scope.loadingBlock = true;
var status = $scope.isNew ? 'added': 'edited';
$scope.submitted = true;
accountProvider.addUser($scope.account).then(function(data){
$scope.loadingBlock = false;
portalUtils.toast('User ' + status + ' successfully', ['top', 'left'], 2000);
$mdDialog.hide();
}).catch(function(err){
$scope.loadingBlock = false;
$scope.error = err.message;
});
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
Triggers.listen([Triggers.PERMISSIONS_ADDED, Triggers.PERMISSIONS_DELETED], function(trigger, payload){
new permissionStores.AllPermissionGroups().refresh();
});
} //end AddUserCtrlController function
})();
@@ -0,0 +1,146 @@
<md-dialog flex="60">
<form name="configForm">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>Configuration</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon>close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content flex>
<md-tabs md-dynamic-height md-border-bottom>
<md-tab label="General Configuration">
<md-content class="md-padding" flex>
<md-list>
<md-list-item>
<md-input-container flex>
<input value="File Path" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
<span flex="5"></span>
<md-input-container flex>
<label>File Path Value</label>
<input ng-model="config.filepath" ng-disabled="saving || !canEdit"/>
</md-input-container>
</md-list-item>
<md-list-item>
<md-input-container flex>
<input value="Default Log Level" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
<span flex="5"></span>
<md-input-container flex>
<label>Default Log Level</label>
<md-select ng-model="config.logLevel" ng-disabled="!canEdit">
<md-option ng-value="ll.id" ng-repeat="ll in logLevels">{{ll.name}}</md-option>
</md-select>
</md-input-container>
</md-list-item>
<md-list-item>
<md-input-container flex>
<input value="User Expiration Days" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
<span flex="5"></span>
<md-input-container flex>
<label>User Expiration Days Value</label>
<input ng-model="config.userExpirationDays" ng-disabled="saving || !canEdit" type="number"/>
</md-input-container>
</md-list-item>
</md-list>
</md-content>
</md-tab>
<md-tab label="Database General Configuration">
<md-content class="md-padding" flex>
<md-list>
<md-list-item>
<md-input-container flex>
<input value="Database Host" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
<span flex="5"></span>
<md-input-container flex>
<label>Database Host Value</label>
<input ng-model="config.dbHost" ng-disabled="saving || !canEdit"/>
</md-input-container>
</md-list-item>
<md-list-item>
<md-input-container flex>
<input value="Database Port" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
<span flex="5"></span>
<md-input-container flex>
<label>Database Port Value</label>
<input ng-model="config.dbPort" ng-disabled="saving || !canEdit" type="number"/>
</md-input-container>
</md-list-item>
<md-list-item>
<md-input-container flex>
<input value="Database User Name" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
<span flex="5"></span>
<md-input-container flex>
<label>Database User Name Value</label>
<input ng-model="config.dbUsername" ng-disabled="saving || !canEdit"/>
</md-input-container>
</md-list-item>
<md-list-item>
<md-input-container flex>
<input value="Database Password" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
<span flex="5"></span>
<div layout="row" flex layout-align="center center">
<md-input-container flex>
<label>Database Password Value</label>
<input ng-model="config.dbPassword" ng-disabled="saving || !canEdit" type="{{dbPasswordType}}"/>
</md-input-container>
<md-button class="md-icon-button" style="margin-bottom: 25px;" ng-mousedown="dbPasswordType='text'" ng-mouseup="dbPasswordType='password'">
<md-icon>remove_red_eye</md-icon>
<md-tooltip>View password</md-tooltip>
</md-button>
</div>
</md-list-item>
</md-list>
</md-content>
</md-tab>
<md-tab label="Database Root Configuration">
<md-content class="md-padding" flex>
<md-list>
<md-list-item>
<md-input-container flex>
<input value="Database Root User" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
<span flex="5"></span>
<md-input-container flex>
<label>Database Root User Value</label>
<input ng-model="config.dbRootUser" ng-disabled="saving || !canEdit"/>
</md-input-container>
</md-list-item>
<md-list-item>
<md-input-container flex>
<input value="Database Root Password" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
<span flex="5"></span>
<div layout="row" flex layout-align="center center">
<md-input-container flex>
<label>Database Root Password Value</label>
<input ng-model="config.dbRootPassword" ng-disabled="saving || !canEdit" type="{{dbRootPasswordType}}"/>
</md-input-container>
<md-button class="md-icon-button" style="margin-bottom: 25px;" ng-mousedown="dbRootPasswordType='text'" ng-mouseup="dbRootPasswordType='password'">
<md-icon>remove_red_eye</md-icon>
<md-tooltip>View password</md-tooltip>
</md-button>
</div>
</md-list-item>
</md-list>
</md-content>
</md-tab>
</md-tabs>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="okButton" type="submit" class="md-raised md-primary" ng-click="ok()">Save</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</form>
</md-dialog>
@@ -0,0 +1,73 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.configuration', ['ui.router']).controller('ConfigurationCtrl', configurationCtrlController);
function configurationCtrlController($scope, account, $state, cache, $mdDialog, configStores, configProvider,
portalUtils, Constants, permissions) {
$scope.logLevels= [
{id:'OFF', name: 'Off'},
{id:'FATAL', name: 'Fatal'},
{id:'ERROR', name:'Error'},
{id:'WARN', name:'Warn'},
{id:'INFO', name:'Info'},
{id:'DEBUG', name:'Debug'},
{id:'TRACE', name:'Trace'},
{id:'ALL', name: 'All'}
];
$scope.saving = false;
$scope.dbPasswordType = 'password';
$scope.dbRootPasswordType = 'password';
$scope.canEdit = false;
$scope.mCache = cache.request([new configStores.Configs()]).then(function(){
$scope.config = $scope.mCache.configs.data;
});
permissions.canView({permission: Constants.Permissions.CHANGE_CONFIG}).then(function(allowed){
$scope.canEdit = allowed;
});
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
portalUtils.confirmBox('saveConfig', 'Save Configuration',
['Are you sure you want to save the configuration values?', 'New values will not take effect until server restart'],
false, function(value) {
if (value.confirm) {
$scope.saveConfig();
}
});
};
$scope.saveConfig = function() {
configProvider.saveConfiguration($scope.config).then(function(value){
portalUtils.toast('Configuration values saved successfully', ['top', 'left'], 2000);
new configStores.Configs().refresh();
$mdDialog.hide();
}).catch(function(err){
portalUtils.toast('Failed to save configuration: ' + err.message, ['top', 'left'], 4000);
new configStores.Configs().refresh();
});
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
} //end configurationCtrlController function
})();
@@ -0,0 +1,87 @@
<md-dialog flex>
<form name="fileInfoForm" ng-submit="fileInfoForm.$valid && (moveFile ? relocate(): validate())">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{header}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon>close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content flex>
<md-content class="md-padding" flex>
<md-list>
<md-list-item ng-if="!file.valid">
<div layout="row" layout-align="center start">
<p class="text-danger">Please enter hash value and file location to validate the file</p>
</div>
</md-list-item>
<md-list-item ng-if="file.valid && moveFile">
<div layout="row" layout-align="center start">
<p class="text-danger">Please enter new file location to move the file to</p>
</div>
</md-list-item>
<md-list-item>
<div layout="row" layout-align="center start" flex>
<md-input-container flex>
<label>File Name</label>
<input ng-model="file.fileName" ng-disabled="true" class="md-disabled-input"/>
</md-input-container>
<md-input-container flex>
<label>File Location</label>
<input ng-model="file.fileLocation" name="location" id="location" ng-required="!file.valid || moveFile" ng-disabled="file.valid && !moveFile" class="md-disabled-input"/>
<div ng-messages="fileInfoForm.location.$error" ng-show="fileInfoForm.location.$invalid && submitted || fileInfoForm.location.$touched">
<div ng-message="required">File location is required</div>
</div>
</md-input-container>
<md-input-container flex>
<label>Date Created</label>
<input ng-model="file.dateCreated" ng-disabled="true" class="md-disabled-input"/>
</md-input-container>
</div>
</md-list-item>
<md-list-item ng-if="!file.valid">
<md-input-container flex>
<label>Hash Value</label>
<input ng-model="file.newHash" name="newHash" id="newHash" class="md-disabled-input" ng-required="!file.valid"/>
<div ng-messages="fileInfoForm.newHash.$error" ng-show="fileInfoForm.newHash.$invalid && submitted || fileInfoForm.newHash.$touched">
<div ng-message="required">Hash value required</div>
</div>
</md-input-container>
</md-list-item>
<md-list-item ng-if="file.valid && !moveFile">
<md-input-container flex>
<label>MD5</label>
<input ng-model="file.md5" ng-readonly="file.valid" class="md-disabled-input"/>
</md-input-container>
</md-list-item>
<md-list-item ng-if="file.valid && !moveFile">
<md-input-container flex>
<label>SHA1</label>
<input ng-model="file.sha1" ng-readonly="file.valid" class="md-disabled-input"/>
</md-input-container>
</md-list-item>
<md-list-item ng-if="file.valid && !moveFile">
<md-input-container flex>
<label>SHA512</label>
<input ng-model="file.sha512" ng-readonly="file.valid" class="md-disabled-input"/>
</md-input-container>
</md-list-item>
</md-list>
</md-content>
<div ng-show="loadingBlock" class="loadingFade"></div>
<div class="loadingModal" ng-show="loadingBlock">
<md-progress-circular md-mode="indeterminate" md-diameter="80" class="md-hue-2"></md-progress-circular>
</div>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="verifButton" type="submit" class="md-raised md-primary" ng-if="!file.valid">Validate</md-button>
<md-button id="verifButton" type="submit" class="md-raised md-primary" ng-if="moveFile">Move</md-button>
<md-button id="downloadButton" class="md-raised md-primary" ng-click="download()" ng-if="file.valid && !moveFile">Download</md-button>
<md-button id="okButton" class="md-raised md-warn" ng-click="ok()">Close</md-button>
</md-dialog-actions>
</form>
</md-dialog>
@@ -0,0 +1,111 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.fileinfo', ['ui.router']).controller('FileInfoCtrl', fileInfoController);
function fileInfoController($scope, modalInstance, $state, cache, $mdDialog, PatchFile, portalUtils, fileProvider) {
$scope.submitted = false;
$scope.loadingBlock = false;
$scope.moveFile = modalInstance.moveFile;
$scope.header = modalInstance.header;
$scope.originalFile = modalInstance.file;
$scope.file = new PatchFile(modalInstance.file);
if (!$scope.file.valid) {
$scope.file.md5 = '';
$scope.file.sha1 = '';
$scope.file.sha512 = '';
$scope.file.fileLocation = '';
}
$scope.ok = function () {
$mdDialog.hide();
};
$scope.download = function() {
var url = '/portal/file/download.do?hashValue=' + $scope.file.sha512;
window.open(url, '');
};
$scope.relocate = function() {
portalUtils.confirmBox('relocateFile', 'Relocate File', ['Are you sure you want to relocate file:', $scope.file.fileName, 'To directory:', $scope.file.fileLocation],
false, function(value) {
if (value.confirm) {
$scope.loadingBlock = true;
fileProvider.moveFile($scope.file).then(function() {
$scope.loadingBlock = false;
portalUtils.toast('File ' + $scope.file.fileName + ' update successfully', ['top', 'left'], 2000);
}).catch(function(err) {
$scope.loadingBlock = false;
$scope.error = err.message;
});
}
});
};
$scope.validate = function() {
$scope.submitted = true;
if ($scope.file.valid) {
$mdDialog.hide();
return true;
}
$scope.error = '';
if ($scope.file.fileLocation.trim() === '') {
$scope.error = 'File location needed to validate';
return false;
}
if ($scope.file.newHash.trim() === '') {
$scope.error = 'Hash value needed';
return false;
}
if ($scope.file.newHash.trim().length === 32) {
$scope.file.md5 = $scope.file.newHash;
$scope.file.sha1 = $scope.originalFile.sha1;
$scope.file.sha512 = $scope.originalFile.sha512;
} else if ($scope.file.newHash.trim().length === 40) {
$scope.file.sha1 = $scope.file.newHash;
$scope.file.sha512 = $scope.originalFile.sha512;
$scope.file.md5 = $scope.originalFile.md5;
} else if ($scope.file.newHash.trim().length === 128) {
$scope.file.sha512 = $scope.file.newHash;
$scope.file.md5 = $scope.originalFile.md5;
$scope.file.sha512 = $scope.originalFile.sha512;
} else {
$scope.error = 'Invalid hash provided';
return false;
}
$scope.loadingBlock = true;
fileProvider.validate($scope.file).then(function(data) {
$scope.loadingBlock = false;
portalUtils.toast('File ' + $scope.file.fileName + ' update successfully', ['top', 'left'], 2000);
$scope.ok();
return true;
}).catch(function(err) {
$scope.loadingBlock = false;
$scope.error = err.message;
return false;
});
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
} //end fileInfoController function
})();
@@ -0,0 +1,22 @@
<md-dialog flex>
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{header}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon>close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content flex>
<div class="modal-body-preview md-dialog-content">
<div class="previewInfoPane pad-sm">
<div ng-bind-html="trustAsHtml(content)" id="previewPopOut" name="previewPopOut"></div>
</div>
</div>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<md-button id="okButton" class="md-raised md-primary" ng-click="ok()">Ok</md-button>
</md-dialog-actions>
</md-dialog>
@@ -0,0 +1,41 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.filevalidate', ['ui.router']).controller('FileValidateCtrl', fileValidateController);
function fileValidateController($scope, modalInstance, $state, $mdDialog, $sce) {
$scope.header = modalInstance.header;
$scope.getContent = function() {
var content = '';
$.each(modalInstance.results, function(key, value) {
content += '<p><b>' + key + ':</b></p>';
for (var i = 0; i < value.length; i++) {
content += '<span class="text-danger">' + value[i] + '</span><br/><br/>';
}
});
$scope.content = content;
};
$scope.getContent();
$scope.trustAsHtml = function (string){
return $sce.trustAsHtml(string);
};
$scope.ok = function () {
$mdDialog.hide();
};
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
} //end fileValidateController function
})();
@@ -0,0 +1,46 @@
<md-dialog flex="40">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>Loggers</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon>close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content flex>
<md-card class="md-padding">
<md-list flex>
<md-list-item ng-if="canEdit">
<p><strong>All Loggers</strong></p>
<span style="width: 50px;">&nbsp;</span>
<md-select ng-model="model.alllevel" ng-change="setAllLoggers()" >
<md-option ng-value="ll.id" ng-repeat="ll in model.logLevels" >{{ll.name}}</md-option>
</md-select>
</md-list-item>
</md-list>
</md-card>
<md-card class="md-padding">
<md-tabs md-dynamic-height>
<md-tab ng-repeat="tab in tabs" layout="column" layout-fill>
<md-tab-label>{{tab.title}}</md-tab-label>
<md-tab-body>
<md-list-item ng-repeat="log in tab.loggers" flex>
<p>{{log.logger}}</p>
<span style="width: 50px;">&nbsp;</span>
<md-select ng-model="log.level" ng-disabled="!canEdit">
<md-option ng-value="ll.id" ng-repeat="ll in model.logLevels">{{ll.name}}</md-option>
</md-select>
</md-list-item>
</md-tab-body>
</md-tab>
</md-tabs>
</md-card>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="okButton" type="submit" class="md-raised md-primary" ng-click="ok()">Save</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</md-dialog>
@@ -0,0 +1,94 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.loggerinfo', ['ui.router']).controller('LoggerInfoCtrl', loggerInfoCtrlController);
function loggerInfoCtrlController($scope, $state, cache, $mdDialog, loggerStores, loggerProvider, portalUtils, permissions, Constants) {
$scope.saving = false;
permissions.canView({permission: Constants.Permissions.CHANGE_LOG_LEVELS}).then(function(allowed) {
$scope.canEdit = allowed;
});
$scope.tabs = [];
$scope.model = {
logLevels: [
{id:'OFF', name: 'Off'},
{id:'FATAL', name: 'Fatal'},
{id:'ERROR', name:'Error'},
{id:'WARN', name:'Warn'},
{id:'INFO', name:'Info'},
{id:'DEBUG', name:'Debug'},
{id:'TRACE', name:'Trace'},
{id:'ALL', name: 'All'}
]
};
$scope.mCache = cache.request([new loggerStores.Loggers()]).then(function(){
$scope.loggers = $scope.mCache.loggers.data.values;
var tabIndex = -1;
for (var i = 0; i < $scope.loggers.length; i++) {
if (i % 5 === 0) {
tabIndex += 1;
$scope.tabs.push({
title: 'Page' + (tabIndex + 1),
loggers: []
});
}
$scope.tabs[tabIndex].loggers.push($scope.loggers[i]);
}
});
$scope.setAllLoggers = function() {
$.each($scope.loggers, function(key, value) {
value.level = $scope.model.alllevel;
});
};
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
portalUtils.confirmBox('saveLoggers', 'Update Log Levels',
['Are you sure you want to change the logging level?'],
false, function(value) {
if (value.confirm) {
$scope.saveLoggingLevel();
}
});
};
$scope.saveLoggingLevel = function() {
loggerProvider.setLoggers($scope.loggers).then(function(value){
portalUtils.toast('Log levels set successfully', ['top', 'left'], 2000);
new loggerStores.Loggers().refresh();
$mdDialog.hide();
}).catch(function(err){
portalUtils.toast('Failed to set log levels: ' + err.message, ['top', 'left'], 4000);
new loggerStores.Loggers().refresh();
});
};
$scope.saveConfig = function() {
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
} //end loggerInfoCtrlController function
})();
@@ -0,0 +1,68 @@
<md-dialog flex>
<form>
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{header}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="Close dialog">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content layout-padding flex>
<div layout="row" ng-repeat="status in scriptStatus" ng-if="scriptStatus.length > 0">
<md-card flex>
<md-card-title class="md-portal-grey" flex>
<div layout="row" flex>
<strong>Run {{scriptStatus.length - $index}}</strong>
<span flex></span>
<strong>Status:&nbsp;</strong>
<strong ng-class="{'text-danger': status.exitStatus !== 0,'play-green': status.exitStatus === 0}">{{status.exitStatus !== 0 ? 'Failed' : 'Success'}}</strong>
<span flex></span>
<strong>Start: {{formatTime(status.startTime)}}</strong>
<span flex></span>
<strong>End: {{formatTime(status.endTime)}}</strong>
<span flex></span>
<md-button class="md-icon-button" ng-click="status.expanded = !status.expanded">
<md-icon>{{ status.expanded ? 'expand_less' : 'expand_more' }}</md-icon>
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">{{status.expanded ? 'Collapse' : 'Expand'}}</md-tooltip>
</md-button>
</div>
</md-card-title>
<pre ng-if="status.expanded">{{status.results}}</pre>
<md-card-content class="md-padding" ng-if="status.expanded && status.resourceFiles.length > 0">
<p><strong>Files available for download</strong></p>
<md-list>
<md-list-item>
<b>File Name</b>
</md-list-item>
<md-list-item ng-repeat="file in status.resourceFiles">
<div layout="row" layout-align="start center" flex>
<p>{{file.fileName}}</p>
<span flex></span>
<div layout="row" layout-align="end center">
<md-button class="md-icon-button" ng-click="download(file)">
<md-icon class="md-16">file_download</md-icon>
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Download File</md-tooltip>
</md-button>
<md-button class="md-icon-button" ng-click="delete(file)" has-permission="{{Constants.Permissions.DELETE_FILE}}">
<md-icon class="md-16">delete</md-icon>
<md-tooltip md-delay="500" class="mediaTileToolTip" md-direction="left">Delete File</md-tooltip>
</md-button>
</div>
</div>
</md-list-item>
</md-list>
</md-card-content>
</md-card>
</div>
<div layout="row" ng-if="scriptStatus.length === 0">
<strong class="text-warn">No script job status found for select script job</strong>
</div>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</form>
</md-dialog>
@@ -0,0 +1,84 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.viewScriptStatus', ['ui.router']).controller('ScriptStatusCtrl', ScriptStatusCtrl);
function ScriptStatusCtrl($scope, modalInstance, cache, $mdDialog, scriptObjects, scriptProvider, fileProvider, portalUtils,
Triggers, Constants) {
$scope.header = modalInstance.header;
$scope.scriptStatus = [];
$scope.Constants = Constants;
$scope.confirmQuestionBox = true;
$scope.init = function() {
scriptProvider.getScriptStatus(modalInstance.jobId).then(function(data){
$scope.scriptStatus = [];
for (var i = 0; i < data.length; i++) {
$scope.scriptStatus.push(new scriptObjects.ScriptStatus(data[i]));
}
});
};
$scope.init();
$scope.formatTime = function(value) {
if (value === null || value === undefined) {
return 'None';
}
return moment(value).format('MM/DD/Y HH:mm:ss');
};
$scope.delete = function(entity) {
if ($scope.confirmQuestionBox) {
portalUtils.confirmBox('deleteFile', 'Delete File', ['Are you sure you want to delete the file', entity.fileName],
true, function(value) {
if (value.confirm) {
$scope.confirmQuestionBox = !value.checkbox;
$scope.deleteFile(entity);
}
});
} else {
$scope.deleteFile(entity);
}
};
$scope.deleteFile = function(entity) {
fileProvider.deleteFile(entity).then(function() {
portalUtils.toast('File deleted successfully', ['top', 'left'], 2000);
}).catch(function(err){
portalUtils.toast('File failed to delete: ' + err.message, ['top', 'left'], 4000);
});
};
$scope.ok = function () {
};
$scope.download = function(row) {
var url = '/portal/file/download.do?id=' + row.id;
window.open(url, '');
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
Triggers.listen([Triggers.FILE_DELETED], function(trigger, payload){
$scope.init();
});
} //end addEnvVarCtrlController function
})();
@@ -0,0 +1,26 @@
<md-dialog flex="40">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>AES Seed</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon>close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content flex>
<md-card class="md-padding">
<md-input-container flex>
<label>Seed Value</label>
<input ng-model="model.seed" ng-disabled="saving || !canEdit"/>
</md-input-container>
</md-list-item>
</md-card>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="okButton" type="submit" class="md-raised md-primary" ng-click="ok()">Save</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</md-dialog>
@@ -0,0 +1,56 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.seedinfo', ['ui.router']).controller('SeedInfoCtrl', seedInfoCtrlController);
function seedInfoCtrlController($scope, $state, cache, $mdDialog, systemProvider, portalUtils, permissions, Constants) {
$scope.saving = false;
permissions.canView({permission: Constants.Permissions.UPDATE_SEED_VALUE}).then(function(allowed) {
$scope.canEdit = allowed;
});
$scope.model = {};
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
portalUtils.confirmBox('updateSeed', 'Update AES Seed',
['Are you sure you want to update the AES Seed',
'This will go through and update all the saved encrypted values',
'and cannot be undone once performed'],
false, function(value) {
if (value.confirm) {
$scope.updateSeed();
}
});
};
$scope.updateSeed = function() {
systemProvider.updateSeed($scope.model.seed).then(function(){
portalUtils.toast('Seed updated successfully', ['top', 'left'], 2000);
$mdDialog.hide();
}, function(err){
$scope.error = err.message;
});
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
} //end SeedInfoCtrlController function
})();
@@ -0,0 +1,20 @@
<md-dialog>
<form>
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>Alert!</span>
<span flex></span>
</div>
</md-toolbar>
<md-dialog-content layout-padding flex>
<div layout="row">
<div ng-bind-html="message"></div>
</div>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="okButton" type="submit" class="md-raised md-warn" ng-if="btnCnlText !== undefined" ng-click="onCancel()">{{btnCnlText}}</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="onOkay()">{{btnText}}</md-button>
</md-dialog-actions>
</form>
</md-dialog>
@@ -0,0 +1,16 @@
(function () {
'use strict';
angular.module('portal.common.partials.sessionEnd', ['ui.router'])
.controller('SessionEndCtrl', SessionEndCtrlController);
function SessionEndCtrlController($scope, modalInstance, $state, cache) {
$scope.onOkay = modalInstance.onOkay;
$scope.message = modalInstance.message;
$scope.btnText = modalInstance.btnText;
$scope.btnCnlText = modalInstance.btnCnlText;
$scope.onCancel = modalInstance.onCancel;
} //end SessionEndCtrlController function
})();
@@ -0,0 +1,93 @@
<md-dialog flex="40">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>SMTP Configuration</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon>close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content flex>
<md-tabs md-dynamic-height md-border-bottom>
<md-tab label="General Configuration">
<md-content class="md-padding" flex>
<md-list>
<md-list-item ng-repeat="conf in smtpConfig | limitTo: 5">
<div layout="row" layout-align="center start" flex>
<md-input-container>
<input ng-model="conf.displayValue" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
<span flex="5"></span>
<md-switch flex ng-model="conf.value" ng-if="conf.type === 'boolean'" class="md-primary" ng-disabled="!canEdit">{{conf.value ? 'Yes' : 'No'}}</md-switch>
<div layout="row" layout-align="start center" flex ng-if="conf.type !== 'boolean'">
<md-input-container flex>
<input ng-model="conf.value" ng-disabled="!canEdit" type="{{conf.type}}" />
</md-input-container>
<md-button class="md-icon-button" ng-if="conf.meta === 'password'" style="margin-bottom: 25px;" ng-mousedown="conf.type='text'" ng-mouseup="conf.type='password'">
<md-icon>remove_red_eye</md-icon>
<md-tooltip>View password</md-tooltip>
</md-button>
</div>
</div>
</md-list-item>
</md-list>
</md-content>
</md-tab>
<md-tab label="Start TLS Configuration">
<md-content class="md-padding" flex>
<md-list>
<md-list-item ng-repeat="conf in smtpConfig | limitTo: 3:5">
<div layout="row" layout-align="center start" flex>
<md-input-container>
<input ng-model="conf.displayValue" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
<span flex="5"></span>
<md-switch flex ng-model="conf.value" ng-if="conf.type === 'boolean'" class="md-primary" ng-disabled="!canEdit">{{conf.value ? 'Yes' : 'No'}}</md-switch>
<div layout="row" layout-align="start center" flex ng-if="conf.type !== 'boolean'">
<md-input-container flex>
<input ng-model="conf.value" ng-disabled="!canEdit" type="{{conf.type}}" />
</md-input-container>
<md-button class="md-icon-button" ng-if="conf.meta === 'password'" style="margin-bottom: 25px;" ng-mousedown="conf.type='text'" ng-mouseup="conf.type='password'">
<md-icon>remove_red_eye</md-icon>
<md-tooltip>View password</md-tooltip>
</md-button>
</div>
</div>
</md-list-item>
</md-list>
</md-content>
</md-tab>
<md-tab label="Auth Configuration">
<md-content class="md-padding" flex>
<md-list>
<md-list-item ng-repeat="conf in smtpConfig | limitTo: 4:8">
<div layout="row" layout-align="center start" flex>
<md-input-container>
<input ng-model="conf.displayValue" ng-disabled="true" style="color: rgba(0,0,0,1) !important; background: none !important;"/>
</md-input-container>
<span flex="5"></span>
<md-switch flex ng-model="conf.value" ng-if="conf.type === 'boolean'" class="md-primary" ng-disabled="!canEdit">{{conf.value ? 'Yes' : 'No'}}</md-switch>
<div layout="row" layout-align="start center" flex ng-if="conf.type !== 'boolean'">
<md-input-container flex>
<input ng-model="conf.value" ng-disabled="!canEdit" type="{{conf.type}}" />
</md-input-container>
<md-button class="md-icon-button" ng-if="conf.meta === 'password'" style="margin-bottom: 25px;" ng-mousedown="conf.type='text'" ng-mouseup="conf.type='password'">
<md-icon>remove_red_eye</md-icon>
<md-tooltip>View password</md-tooltip>
</md-button>
</div>
</div>
</md-list-item>
</md-list>
</md-content>
</md-tab>
</md-tabs>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger">{{error}}</div>
<md-button id="okButton" type="submit" class="md-raised md-primary" ng-click="ok()">Save</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</md-dialog>
@@ -0,0 +1,140 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.smtpinfo', ['ui.router']).controller('SMTPInfoCtrl', smtpInfoCtrlController);
function smtpInfoCtrlController($scope, $state, cache, $mdDialog, systemProvider, systemStores,
portalUtils, permissions, Constants, Triggers) {
$scope.saving = false;
permissions.canView({permission: Constants.Permissions.EDIT_SMTP_CONFIG}).then(function(allowed){
$scope.canEdit = allowed;
});
$scope.smtpConfig = [
{
name: 'smtp.enabled',
displayValue: 'SMTP Enabled',
value: false,
type: 'boolean'
},{
name: 'mail.transport.protocol',
displayValue: 'Transport Protocol',
value: 'smtp',
type: 'text'
},{
name: 'mail.smtp.host',
displayValue: 'SMTP Server Url',
value: '',
type: 'text'
},{
name: 'mail.smtp.port',
displayValue: 'SMTP Server Port',
value: 0,
type: 'number'
},{
name: 'mail.debug',
displayValue: 'Enable Mail Debug Logging',
value: false,
type: 'boolean'
},{
name: 'mail.smtp.starttls.enable',
displayValue: 'Enable Start TLS',
value: false,
type: 'boolean'
},{
name: 'mail.smtp.starttls.required',
displayValue: 'Require Start TLS',
value: false,
type: 'boolean'
},{
name: 'mail.smtp.ssl.trust',
displayValue: 'SSL Trust Certificate',
value: '*',
type: 'text'
},{
name: 'mail.smtp.auth',
displayValue: 'Require Authentication',
value: false,
type: 'boolean'
},{
name: 'smtp.from.user',
displayValue: 'From User',
value: '',
type: 'text'
},{
name: 'smtp.username',
displayValue: 'SMTP Username',
value: '',
type: 'text'
},{
name: 'smtp.password',
displayValue: 'SMTP Password',
value: '',
type: 'password',
meta: 'password'
},
];
$scope.mCache = cache.request([new systemStores.SMTPConfig()]).then(function(){
var conf = $scope.mCache.smtpConfig.data.values;
$.each($scope.smtpConfig, function(key, value) {
$.each(conf, function(key2, value2) {
if (value.name === value2.name) {
if (value.type === 'number') {
value.value = parseInt(value2.value);
} else if (value.type === 'boolean') {
value.value = value2.value === 'true' || value2.value === true;
} else {
value.value = value2.value;
}
return;
}
});
});
});
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
portalUtils.confirmBox('saveSmtpConfig', 'Update SMTP Configuration',
['Are you sure you want to update the smtp configuration?'],
false, function(value) {
if (value.confirm) {
$scope.saveSMTPConf();
}
});
};
$scope.saveSMTPConf = function() {
systemProvider.updateSmtpConfig($scope.smtpConfig).then(function() {
$mdDialog.hide();
}).catch(function(err) {
$scope.error = err.message;
portalUtils.toast('Failed to save configuration: ' + err.message, ['top', 'left'], 4000);
});
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
Triggers.listen([Triggers.SMTP_CONFIG_UPDATED], function(trigger, payload) {
new systemStores.SMTPConfig().refresh();
});
} //end smtpInfoCtrlController function
})();
@@ -0,0 +1,25 @@
<md-dialog>
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{confirmTitle}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="Close dialog">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content>
<div layout="column" class="md-padding">
<ng-repeat ng-repeat="message in confirmMessage">
<p>{{message}}</p>
</ng-repeat>
<div layout="row">
<md-checkbox class="md-primary" ng-if="showConfirmMessage" ng-model="data.checkbox">Do not show this message again</md-checkbox>
</div>
</div>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<md-button id="{{btnId}}-confirm" class="md-raised md-primary" ng-click="confirm()">Yes</md-button>
<md-button id="{{btnId}}-cancel" class="md-raised md-warn" ng-click="cancel()">No</md-button>
</md-dialog-actions>
</md-dialog>
@@ -0,0 +1,39 @@
<md-dialog flex="15">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{title}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="Close dialog">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content flex>
<div layout="column" class="md-padding" flex>
<p class="text-danger">{{message}}</p>
<md-input-container flex>
<label style="padding-left: 35px;">Purge Start Date</label>
<input mdc-datetime-picker="" date="true" time="false" type="text" id="startdatetime"
show-todays-date="" minutes="true" min-date="date" show-icon="true" format='MMM D, YYYY'
ng-model="model.purgeStartDate" class=" dtp-no-msclear dtp-input">
</md-input-container>
<md-input-container flex>
<label style="padding-left: 35px;">Purge End Date</label>
<input mdc-datetime-picker="" date="true" time="false" type="text" id="startdatetime"
show-todays-date="" minutes="true" min-date="date" show-icon="true" format='MMM D, YYYY'
ng-model="model.purgeEndDate" class=" dtp-no-msclear dtp-input">
</md-input-container>
</div>
</md-dialog-content>
<div ng-show="loadingBlock" class="loadingFade"></div>
<div class="loadingModal" ng-show="loadingBlock">
<md-progress-circular md-mode="indeterminate" md-diameter="80" class="md-hue-2"></md-progress-circular>
</div>
<md-dialog-actions layout="column" class="modal-footer" flex>
<div class="text-danger">{{error}}</div>
<div layout="row" layout-align="end center">
<md-button id="purge-confirm" class="md-raised md-primary" ng-click="confirm()">Ok</md-button>
<md-button id="purge-cancel" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</div>
</md-dialog-actions>
</md-dialog>
@@ -0,0 +1,31 @@
<md-dialog flex="50">
<md-toolbar>
<div class="md-toolbar-tools md-portal">
<span>{{header}} to {{currentDir}}</span>
<span flex></span>
<md-button class="md-icon-button" ng-click="cancel()">
<md-icon aria-label="Close dialog">close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content flex>
<div layout="row" flex="100" class="md-dialog-content" id="fileInputDiv">
<repo-file-input id="fileInput" name="file" ng-model="uploadFile" accepts="false" flex></repo-file-input>
</div>
<div layout="row" flex="100" class="md-dialog-content">
<md-input-container flex>
<label>Hash Value</label>
<input type="text" id="fileName" ng-model="model.hashValue" required>
</md-input-container>
</div>
<div ng-show="loadingBlock" class="loadingFade"></div>
<div class="loadingModal" ng-show="loadingBlock">
<md-progress-circular md-mode="indeterminate" md-diameter="80" class="md-hue-2"></md-progress-circular>
</div>
</md-dialog-content>
<md-dialog-actions layout="row" class="modal-footer">
<div class="text-danger text-center">{{error}}</div>
<md-button id="okButton" class="md-raised md-primary" ng-click="ok()" ng-disabled="!valid">OK</md-button>
<md-button id="cancelButton" class="md-raised md-warn" ng-click="cancel()">Cancel</md-button>
</md-dialog-actions>
</md-dialog>
@@ -0,0 +1,73 @@
(function () {
'use strict';
/**
* MODULE DESCRIPTION:
*
* TODO: Write description here.
*/
angular.module('portal.common.partials.uploadpatchfile', ['ui.router'])
.controller('UploadPatchFileCtrl', UploadPatchFileCtrlController);
function UploadPatchFileCtrlController($scope, modalInstance, $state, cache, $mdDialog, fileProvider, UploadFile, portalUtils) {
$scope.header = modalInstance.header;
$scope.currentDir = modalInstance.currentDir;
$scope.uploadFile = undefined;
$scope.loadingBlock = false;
$scope.model = { };
$scope.valid = false;
$scope.$watch('model', function(){
if ($scope.model.hashValue === undefined || $scope.model.hashValue.trim() === '') {
$scope.valid = false;
return;
}
if ($scope.uploadFile === undefined) {
$scope.valid = false;
return;
}
$scope.valid = true;
}, true);
/**
* OK button handler
* @returns {undefined}
*/
$scope.ok = function () {
$scope.loadingBlock = true;
fileProvider.uploadFile([new UploadFile().init($scope.uploadFile)], $scope.model.hashValue, $scope.currentDir).then(function(data) {
$scope.loadingBlock = false;
portalUtils.toast('File uploaded successfully', ['top', 'left'], 2000);
$mdDialog.hide();
}).catch(function(err) {
$scope.loadingBlock = false;
$scope.error = err.message;
});
};
/**
* Cancel button handler.
* @returns {undefined}
*/
$scope.cancel = function () {
//Dismiss the modal
$mdDialog.cancel();
};
$scope.$on('$destroy', function () {
if ($scope.mCache !== undefined) {
$scope.mCache.unlisten();
}
});
} //end UploadPatchFileCtrlController function
})();