'use strict'; /* global angular:false */ /* global $:false */ angular.module('Application').controller('AppsController', ['$scope', '$translate', '$interval', '$location', 'Client', function ($scope, $translate, $interval, $location, Client) { var ALL_DOMAINS_DOMAIN = { _alldomains: true, domain: 'All Domains' }; // dummy record for the single select filter var GROUP_ACCESS_UNSET = { _unset: true, name: 'Select Group' }; // dummy record for the single select filter $scope.installedApps = Client.getInstalledApps(); $scope.tags = Client.getAppTags(); $scope.states = [ { state: '', label: 'All States' }, { state: 'running', label: 'Running' }, { state: 'stopped', label: 'Stopped' }, { state: 'update_available', label: 'Update Available' }, { state: 'not_responding', label: 'Not Responding' } ]; $scope.selectedState = $scope.states[0]; $scope.selectedTags = []; $scope.selectedGroup = GROUP_ACCESS_UNSET; $scope.selectedDomain = ALL_DOMAINS_DOMAIN; $scope.filterDomains = [ ALL_DOMAINS_DOMAIN ]; $scope.config = Client.getConfig(); $scope.user = Client.getUserInfo(); $scope.domains = []; $scope.appSearch = ''; $scope.groups = [ GROUP_ACCESS_UNSET ]; $translate(['apps.stateFilterHeader', 'apps.domainsFilterHeader', 'apps.groupsFilterHeader', 'app.states.running', 'app.states.stopped', 'app.states.notResponding', 'app.states.updateAvailable']).then(function (tr) { if (tr['apps.domainsFilterHeader']) ALL_DOMAINS_DOMAIN.domain = tr['apps.domainsFilterHeader']; if (tr['apps.groupsFilterHeader']) GROUP_ACCESS_UNSET.name = tr['apps.groupsFilterHeader']; if (tr['apps.stateFilterHeader']) $scope.states[0].label = tr['apps.stateFilterHeader']; if (tr['app.states.running']) $scope.states[1].label = tr['app.states.running']; if (tr['app.states.stopped']) $scope.states[2].label = tr['app.states.stopped']; if (tr['app.states.notResponding']) $scope.states[4].label = tr['app.states.notResponding']; if (tr['app.states.updateAvailable']) $scope.states[3].label = tr['app.states.updateAvailable']; }); $scope.$watch('selectedTags', function (newVal, oldVal) { if (newVal === oldVal) return; localStorage.selectedTags = newVal.join(','); }); $scope.$watch('selectedState', function (newVal, oldVal) { if (newVal === oldVal) return; if (newVal === $scope.states[0]) localStorage.removeItem('selectedState'); else localStorage.selectedState = newVal.state; }); $scope.$watch('selectedGroup', function (newVal, oldVal) { if (newVal === oldVal) return; if (newVal === GROUP_ACCESS_UNSET) localStorage.removeItem('selectedGroup'); else localStorage.selectedGroup = newVal.id; }); $scope.$watch('selectedDomain', function (newVal, oldVal) { if (newVal === oldVal) return; if (newVal._alldomains) localStorage.removeItem('selectedDomain'); else localStorage.selectedDomain = newVal.domain; }); $scope.appPostInstallConfirm = { app: {}, message: '', confirmed: false, show: function (app) { $scope.appPostInstallConfirm.app = app; $scope.appPostInstallConfirm.message = app.manifest.postInstallMessage; $scope.appPostInstallConfirm.confirmed = false; $('#appPostInstallConfirmModal').modal('show'); return false; // prevent propagation and default }, submit: function () { if (!$scope.appPostInstallConfirm.confirmed) return; $scope.appPostInstallConfirm.app.pendingPostInstallConfirmation = false; delete localStorage['confirmPostInstall_' + $scope.appPostInstallConfirm.app.id]; $('#appPostInstallConfirmModal').modal('hide'); } }; $scope.applinksAdd = { error: {}, busy: false, upstreamUri: '', show: function () { $scope.applinksAdd.error = {}; $scope.applinksAdd.busy = false; $scope.applinksAdd.upstreamUri = ''; $('#applinksAddModal').modal('show'); return false; // prevent propagation and default }, submit: function () { if (!$scope.applinksAdd.upstreamUri) return; Client.addApplink({ upstreamUri: $scope.applinksAdd.upstreamUri }, function (error, result) { if (error) return console.error('Failed to add applink', error); $('#applinksAddModal').modal('hide'); }); } }; $scope.applinksEdit = { error: {}, busy: false, id: '', upstreamUri: '', show: function (applink) { $scope.applinksEdit.error = {}; $scope.applinksEdit.busy = false; $scope.applinksEdit.id = applink.id; $scope.applinksEdit.upstreamUri = applink.upstreamUri; $('#applinksEditModal').modal('show'); return false; // prevent propagation and default }, submit: function () { $('#applinksEditModal').modal('hide'); }, remove: function () { Client.removeApplink($scope.applinksEdit.id, function (error) { if (error) return console.error('Failed to remove applink', error); Client.refreshInstalledApps(); $('#applinksEditModal').modal('hide'); }); } }; $scope.showAppConfigure = function (app, view) { $location.path('/app/' + app.id + '/' + view); }; $scope.isOperator = function (app) { return app.accessLevel === 'operator' || app.accessLevel === 'admin'; }; Client.onReady(function () { setTimeout(function () { $('#appSearch').focus(); }, 1); // refresh the new list immediately when switching from another view (appstore) Client.refreshInstalledApps(function () { var refreshAppsTimer = $interval(Client.refreshInstalledApps.bind(Client, function () {}), 5000); $scope.$on('$destroy', function () { $interval.cancel(refreshAppsTimer); }); }); if (!$scope.user.isAtLeastAdmin) return; // load local settings and apply tag filter if (localStorage.selectedTags) { if (!$scope.tags.length) localStorage.removeItem('selectedTags'); else $scope.selectedTags = localStorage.selectedTags.split(','); } if (localStorage.selectedState) $scope.selectedState = $scope.states.find(function (s) { return s.state === localStorage.selectedState; }) || $scope.states[0]; Client.getGroups(function (error, result) { if (error) Client.error(error); $scope.groups = [ GROUP_ACCESS_UNSET ].concat(result); if (localStorage.selectedGroup) $scope.selectedGroup = $scope.groups.find(function (g) { return g.id === localStorage.selectedGroup; }) || GROUP_ACCESS_UNSET; }); Client.getDomains(function (error, result) { if (error) Client.error(error); $scope.domains = result; $scope.filterDomains = [ALL_DOMAINS_DOMAIN].concat(result); if (localStorage.selectedDomain) $scope.selectedDomain = $scope.filterDomains.find(function (d) { return d.domain === localStorage.selectedDomain; }) || ALL_DOMAINS_DOMAIN; }); }); // setup all the dialog focus handling ['applinksAddModal'].forEach(function (id) { $('#' + id).on('shown.bs.modal', function () { $(this).find("[autofocus]:first").focus(); }); }); $('.collapse').on('shown.bs.collapse', function(){ $(this).parent().find('.fa-angle-right').removeClass('fa-angle-right').addClass('fa-angle-down'); }).on('hidden.bs.collapse', function(){ $(this).parent().find('.fa-angle-down').removeClass('fa-angle-down').addClass('fa-angle-right'); }); $('.modal-backdrop').remove(); }]);