diff --git a/src/admin/bundles/bundle-install.directive.js b/src/admin/bundles/bundle-install.directive.js new file mode 100644 index 0000000..5e9255e --- /dev/null +++ b/src/admin/bundles/bundle-install.directive.js @@ -0,0 +1,139 @@ +(function () { + 'use-strict'; + + angular.module('motech-admin') + .directive('installModules', moduleInstall); + + moduleInstall.$inject = ['ServerService']; + function moduleInstall(ServerService) { + return { + restrict: 'E', + templateUrl: '/admin/bundles/install-modules.html', + controller: controller, + link: function (scope) { + scope.startOnUpload = function () { + if (scope.startUpload !== true) { + scope.startUpload = true; + $('.start-on-upload').find('i').removeClass("fa-square-o").addClass('fa-check-square-o'); + } else { + scope.startUpload = false; + $('.start-on-upload').find('i').removeClass("fa-check-square-o").addClass('fa-square-o'); + } + }; + } + }; + } + + controller.$inject = ['$scope', '$rootScope', '$timeout', '$state', 'BundlesFactory', 'LoadingModal', 'ModalFactory', 'ModalWindow', 'ServerService']; + function controller($scope, $rootScope, $timeout, $state, BundlesFactory, LoadingModal, ModalFactory, ModalWindow, ServerService) { + $scope.moduleSources = [ + 'Repository', + 'File' + ]; + $scope.startUpload = true; + $scope.moduleSource = $scope.moduleSources[0]; + var MODULE_LIST_REFRESH_TIMEOUT = 6000; + + $scope.mavenStr = function (artifactId) { + return 'org.motechproject:'.concat(artifactId).concat(':').concat($rootScope.msg('server.version')); + }; + + $scope.modules = {}; + $scope.modules[$scope.mavenStr('alerts')] = 'Alerts'; + $scope.modules[$scope.mavenStr('appointments')] = 'Appointments'; + $scope.modules[$scope.mavenStr('atom-client')] = 'Atom Client'; + $scope.modules[$scope.mavenStr('csd')] = 'Care Services Directory'; + $scope.modules[$scope.mavenStr('cms-lite')] = 'CMS Lite'; + $scope.modules[$scope.mavenStr('commcare')] = 'Commcare'; + $scope.modules[$scope.mavenStr('dhis2')] = 'DHIS2'; + $scope.modules[$scope.mavenStr('event-logging')] = 'Event Logging'; + $scope.modules[$scope.mavenStr('http-agent')] = 'Http Agent'; + $scope.modules[$scope.mavenStr('ihe-interop')] = 'IHE Interop'; + $scope.modules[$scope.mavenStr('ivr')] = 'IVR'; + $scope.modules[$scope.mavenStr('message-campaign')] = 'Message Campaign'; + $scope.modules[$scope.mavenStr('metrics')] = 'Metrics'; + $scope.modules[$scope.mavenStr('mtraining')] = 'mTraining'; + $scope.modules[$scope.mavenStr('motech-tasks')] = 'Tasks'; + $scope.modules[$scope.mavenStr('odk')] = 'Open Data Kit'; + $scope.modules[$scope.mavenStr('openmrs')] = 'OpenMRS'; + $scope.modules[$scope.mavenStr('pill-reminder')] = 'Pill Reminder'; + $scope.modules[$scope.mavenStr('motech-scheduler')] = 'Scheduler'; + $scope.modules[$scope.mavenStr('schedule-tracking')] = 'Schedule Tracking'; + $scope.modules[$scope.mavenStr('sms')] = 'SMS'; + + $scope.module = ""; + + $scope.submitBundle = function () { + $("#bundleUploadForm").submit(function(event){ + if (!$scope.isNoModuleOrFileSelected()) { + LoadingModal.open(); + + var formData = { + moduleSource: $scope.moduleSource, + moduleId: $scope.module, + file: $('#bundleUploadForm input[name=file]').val(), + startBundle: $scope.startBundle + }, + url = "/module/admin/api/bundles/upload"; + + url = ServerService.formatURL(url); + + $.ajax({ + type: 'POST', + data: formData, + url: url + }).done(function (data, status, xhr) { + if (xhr.status === 0 && data) { + ModalFactory.showErrorWithStackTrace('admin.error', 'admin.bundles.error.start', data); + LoadingModal.close(); + } else { + $scope.bundles = BundlesFactory.query(function () { + if ($scope.startUpload) { + $timeout(function () { + $scope.$emit('lang.refresh'); + $scope.refreshModuleList(); + LoadingModal.close(); + }, MODULE_LIST_REFRESH_TIMEOUT); + } else { + $state.reload(); + LoadingModal.close(); + } + $scope.module = ""; + $('#bundleUploadForm .fileinput').fileinput('clear'); + ModalFactory.showSuccessAlert('admin.bundles.successInstall', 'admin.bundles.installNewModule'); + }); + } + $scope.hideInstallModulesModal(); + }) + .fail(function (response) { + ModalFactory.showErrorWithStackTrace('admin.error', 'admin.bundles.error.start', response); + LoadingModal.close(); + $scope.hideInstallModulesModal(); + }); + } else if ($scope.moduleSource === 'Repository') { + ModalFactory.showErrorAlert('admin.bundles.error.moduleNotSelected', 'admin.error'); + } else { + ModalFactory.showErrorAlert('admin.bundles.error.fileNotSelected', 'admin.error'); + } + $scope.hideInstallModulesModal(); + event.preventDefault(); + }); + }; + + $scope.isNoModuleOrFileSelected = function () { + if ($scope.moduleSource === 'Repository') { + return !$scope.module; + } else if ($scope.moduleSource === 'File') { + if ($("#bundleUploadForm #fileInput").val() === '') { + return true; + } else { + return false; + } + } + }; + + $scope.refreshModuleList = function () { + $scope.$emit('module.list.refresh'); + }; + } +})(); diff --git a/src/admin/bundles/bundles-list.controller.js b/src/admin/bundles/bundles-list.controller.js index 841a8b4..e17bb0f 100644 --- a/src/admin/bundles/bundles-list.controller.js +++ b/src/admin/bundles/bundles-list.controller.js @@ -4,23 +4,23 @@ angular.module('motech-admin') .controller('BundlesListController', bundlesListController); - bundlesListController.$inject = ['$scope', '$rootScope', '$state', '$http', 'BundlesFactory', 'LoadingModal', 'ServerService']; - function bundlesListController ($scope, $rootScope, $state, $http, BundlesFactory, LoadingModal, ServerService) { + bundlesListController.$inject = ['$scope', '$compile', '$state', '$http', 'BundlesFactory', 'LoadingModal', 'ServerService', 'ModalWindow']; + function bundlesListController($scope, $compile, $state, $http, BundlesFactory, LoadingModal, ServerService, ModalWindow) { - BundlesFactory.query(function(bundles){ + BundlesFactory.query(function (bundles) { $scope.bundles = bundles; }); $scope.bundlesWithSettings = []; - $http({method:'GET', url:ServerService.formatURL('/module/admin/api/settings/bundles/list')}). + $http({method: 'GET', url: ServerService.formatURL('/module/admin/api/settings/bundles/list')}). success(function (data) { $scope.bundlesWithSettings = data; }); $scope.showSettings = function (bundle) { return $.inArray(bundle.symbolicName, $scope.bundlesWithSettings) >= 0 || - (bundle.settingsURL && bundle.settingsURL.length !== 0); + (bundle.settingsURL && bundle.settingsURL.length !== 0); }; $scope.loadBundleSettingsPage = function loadBundleSettingsPage(bundle) { @@ -35,9 +35,15 @@ $scope.goToSettingsURL = function (moduleName, url) { var convertUrl = function (urlParam) { - if(urlParam.indexOf('/') === 0) {urlParam = urlParam.replace('/', '');} - if(urlParam.indexOf('/') > 0) {urlParam = urlParam.replace('/', '.');} - if(urlParam.indexOf('/') > 0) {urlParam = urlParam.replace(/(\/)\w+((\/)\w*)*/i, '');} + if (urlParam.indexOf('/') === 0) { + urlParam = urlParam.replace('/', ''); + } + if (urlParam.indexOf('/') > 0) { + urlParam = urlParam.replace('/', '.'); + } + if (urlParam.indexOf('/') > 0) { + urlParam = urlParam.replace(/(\/)\w+((\/)\w*)*/i, ''); + } return urlParam; }; @@ -51,13 +57,22 @@ } }); if (url.indexOf('admin/bundleSettings/') > 0) { - $state.go('admin.bundleSettings', {'bundleId': url.substring(url.lastIndexOf("/")+1)}); + $state.go('admin.bundleSettings', {'bundleId': url.substring(url.lastIndexOf("/") + 1)}); } else { $state.go(convertUrl(url), $state.params); } LoadingModal.close(); } }; - } + var installModal; + $scope.openInstallModulesModal = function () { + installModal = ModalWindow($compile('')($scope), "Install Modules"); + installModal.open(); + }; + + $scope.hideInstallModulesModal = function () { + installModal.close(); + }; + } })(); \ No newline at end of file diff --git a/src/admin/bundles/bundles-list.html b/src/admin/bundles/bundles-list.html index 165a616..e304064 100644 --- a/src/admin/bundles/bundles-list.html +++ b/src/admin/bundles/bundles-list.html @@ -1,3 +1,5 @@ + +
diff --git a/src/admin/bundles/bundles.scss b/src/admin/bundles/bundles.scss index 212662e..ee2a020 100644 --- a/src/admin/bundles/bundles.scss +++ b/src/admin/bundles/bundles.scss @@ -20,4 +20,14 @@ right: 0.5em; top: -0.25em; } +} + +form{ + padding: 0.5em; +} +.form-inline .form-group label{ + position: static !important; +} +#bundleUploadForm .fileinput { + margin-bottom: 0; } \ No newline at end of file diff --git a/src/admin/bundles/install-modules.html b/src/admin/bundles/install-modules.html new file mode 100644 index 0000000..7e2a63b --- /dev/null +++ b/src/admin/bundles/install-modules.html @@ -0,0 +1,27 @@ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+ + +
\ No newline at end of file diff --git a/src/common/base/base.icons.scss b/src/common/base/base.icons.scss index d777768..95b7c57 100644 --- a/src/common/base/base.icons.scss +++ b/src/common/base/base.icons.scss @@ -110,7 +110,6 @@ Styleguide 1.3 .icon-arrow-down{ @include icon(caret-down); } - .icon-pause{ @include icon(pause); } @@ -128,4 +127,4 @@ Styleguide 1.3 } .icon-file{ @include icon(file); - } \ No newline at end of file +}