Changeset 12425


Ignore:
Timestamp:
06/10/15 14:05:24 (7 years ago)
Author:
dglaser
Message:

#2388: Added PluginManager and updated WebApp project

Location:
branches/HiveStatistics/sources
Files:
6 added
2 deleted
27 edited

Legend:

Unmodified
Added
Removed
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/HeuristicLab.Services.WebApp.Status.csproj

    r12419 r12425  
    9797      <Project>{9fac0b23-2730-452a-9ba0-d7ca1746c541}</Project>
    9898      <Name>HeuristicLab.Services.Access-3.3</Name>
     99      <Private>False</Private>
    99100    </ProjectReference>
    100101    <ProjectReference Include="..\HeuristicLab.Services.Hive.DataAccess\3.3\HeuristicLab.Services.Hive.DataAccess-3.3.csproj">
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/history/history.cshtml

    r12419 r12425  
    3434
    3535
    36 <div id="history">
     36<div class="default-view-container">
    3737    <div class="row">
    3838        <div class="col-lg-12">
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/history/historyCtrl.js

    r12419 r12425  
    11(function () {
    2     var module = appStatusModule.getAngularModule();
     2    var module = appStatusPlugin.getAngularModule();
    33    module.controller('app.status.historyCtrl',
    44        ['$scope', '$interval', 'app.status.data.service',
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/services/statusService.js

    r12419 r12425  
    11(function () {
    2     var module = appStatusModule.getAngularModule();
     2    var module = appStatusPlugin.getAngularModule();
    33    var apiUrl = 'api/Status/Data/';
    44    module.factory('app.status.data.service',
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/status.css

    r12419 r12425  
    1 #status {
    2   padding: 30px;
    3 }
    4 
    5 #history-header {
     1#history-header {
    62  padding: 30px;
    73  background: #F5F5F5;
    84  border-bottom: 1px solid #D3D3D3;
    95}
    10 
    11 #history {
    12   padding: 30px;
    13 }
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/status/status.cshtml

    r12419 r12425  
    1010</header>
    1111
    12 <div id="status">
     12<div class="default-view-container">
    1313    <div class="row">
    1414        <div class="col-lg-3 col-md-6">
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/status/statusCtrl.js

    r12419 r12425  
    11(function () {
    2     var module = appStatusModule.getAngularModule();
     2    var module = appStatusPlugin.getAngularModule();
    33    module.controller('app.status.ctrl',
    44        ['$scope', '$interval', 'app.status.data.service',
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/status.js

    r12419 r12425  
    1 var appStatusModule = app.registerModule('status');
     1var appStatusPlugin = app.registerPlugin('status');
    22(function () {
    3     var module = appStatusModule;
    4     module.dependencies = ['ngResource', 'ui.knob', 'ui.bootstrap'];
    5     module.files = [
     3    var plugin = appStatusPlugin;
     4    plugin.dependencies = ['ngResource', 'ui.knob', 'ui.bootstrap'];
     5    plugin.files = [
    66        'WebApp/status.css',
    77        'WebApp/services/statusService.js',
     
    99        'WebApp/history/historyCtrl.js'
    1010    ];
    11     module.view = 'WebApp/status/status.cshtml';
    12     module.controller = 'app.status.ctrl';
    13     module.routes = [
     11    plugin.view = 'WebApp/status/status.cshtml';
     12    plugin.controller = 'app.status.ctrl';
     13    plugin.routes = [
    1414        new Route('history', 'WebApp/history/history.cshtml', 'app.status.historyCtrl')
    1515    ];
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Configs/BundleConfig.cs

    r12419 r12425  
    6161        "~/WebApp/app.css"
    6262      ));
     63      AddOrUpdateWebAppBundle();
     64    }
    6365
     66    public static void AddOrUpdateWebAppBundle() {
     67      var jsBundle = BundleTable.Bundles.GetBundleFor("~/Bundles/WebApp/js");
     68      if (jsBundle != null) {
     69        BundleTable.Bundles.Remove(jsBundle);
     70      }
    6471      var jsFiles = new List<string> {
    6572        "~/WebApp/helper.js",
    66         "~/WebApp/module.js"
     73        "~/WebApp/app.js"
    6774      };
    6875      var directories = Directory.GetDirectories(string.Format(@"{0}WebApp\plugins", HttpRuntime.AppDomainAppPath));
    6976      jsFiles.AddRange(directories.Select(Path.GetFileName).Select(directory => string.Format("~/WebApp/plugins/{0}/{0}.js", directory)));
    70       jsFiles.Add("~/WebApp/app.js");
    71 
    72       var jsBundle = new ScriptBundle("~/Bundles/WebApp/js");
     77      jsFiles.Add("~/WebApp/main.js");
     78      jsBundle = new ScriptBundle("~/Bundles/WebApp/js");
    7379      jsBundle.Include(jsFiles.ToArray());
    7480      jsBundle.IncludeDirectory("~/WebApp/shared/", "*.js", true);
    75       bundles.Add(jsBundle);
     81      BundleTable.Bundles.Add(jsBundle);
    7682    }
    7783  }
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/AppController.cs

    r12419 r12425  
    11using System.Web.Mvc;
     2using HeuristicLab.Services.WebApp.Configs;
    23
    34namespace HeuristicLab.Services.WebApp.Controllers {
     
    910        return RedirectPermanent(Request.Url + "/");
    1011      }
     12      BundleConfig.AddOrUpdateWebAppBundle();
    1113      return View("~/WebApp/shared/layout/layout.cshtml");
    1214    }
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/AuthenticationController.cs

    r12419 r12425  
    2323      return true;
    2424    }
    25 
    2625  }
    2726}
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/WebAppControllerSelector.cs

    r12419 r12425  
    22using System.Collections.Concurrent;
    33using System.Collections.Generic;
    4 using System.IO;
    54using System.Linq;
    65using System.Net.Http;
    76using System.Reflection;
    8 using System.Web;
    97using System.Web.Http;
    108using System.Web.Http.Controllers;
     
    1412  public class WebAppHttpControllerSelector : DefaultHttpControllerSelector {
    1513    private readonly HttpConfiguration configuration;
    16     private readonly IDictionary<string, IDictionary<string, HttpControllerDescriptor>> plugins;
     14    private readonly IDictionary<string, HttpControllerDescriptor> controllers;
     15    private readonly PluginManager pluginManager = PluginManager.Instance;
    1716
    1817    public WebAppHttpControllerSelector(HttpConfiguration configuration)
    1918      : base(configuration) {
    2019      this.configuration = configuration;
    21       plugins = new ConcurrentDictionary<string, IDictionary<string, HttpControllerDescriptor>>();
     20      pluginManager.Configuration = configuration;
     21      controllers = new ConcurrentDictionary<string, HttpControllerDescriptor>();
     22      LoadAppControllers();
     23    }
     24
     25    private void LoadAppControllers() {
     26      var assembly = Assembly.GetExecutingAssembly();
     27      var assemblyTypes = assembly.GetTypes();
     28      var apiControllers = assemblyTypes.Where(c => typeof(ApiController).IsAssignableFrom(c)).ToList();
     29      foreach (var apiController in apiControllers) {
     30        var apiControllerName = apiController.Name.Remove(apiController.Name.Length - 10).ToLower();
     31        controllers.Add(apiControllerName, new HttpControllerDescriptor(configuration, apiControllerName, apiController));
     32      }
    2233    }
    2334
     
    3142        throw new ArgumentException("invalid request path");
    3243      }
    33       string pluginName = parts[startIndex + 1];
     44      string pluginName = parts[startIndex + 1].ToLower();
    3445      string controllerName = parts[startIndex + 2].ToLower();
    35       IDictionary<string, HttpControllerDescriptor> controllers;
    36       if (!plugins.TryGetValue(pluginName, out controllers)) {
    37         var assembly = Assembly.GetExecutingAssembly();
    38         try {
    39           if (pluginName != "App") {
    40             string directory = string.Format(@"{0}WebApp\plugins\{1}\", HttpRuntime.AppDomainAppPath, pluginName);
    41             string[] assemblies = Directory.GetFiles(directory, string.Format("HeuristicLab.Services.WebApp.{0}*.dll", pluginName));
    42             if (assemblies.Length < 1) {
    43               throw new ArgumentException("invalid plugin '{0}'", pluginName);
    44             }
    45             assembly = Assembly.Load(File.ReadAllBytes(assemblies.First()));
    46           }
    47           var assemblyTypes = assembly.GetTypes();
    48           var apiControllers = assemblyTypes.Where(c => typeof(ApiController).IsAssignableFrom(c)).ToList();
    49           if (apiControllers.Any()) {
    50             controllers = new ConcurrentDictionary<string, HttpControllerDescriptor>();
    51             foreach (var apiController in apiControllers) {
    52               var apiControllerName = apiController.Name.Remove(apiController.Name.Length - 10).ToLower();
    53               controllers.Add(apiControllerName, new HttpControllerDescriptor(configuration, apiControllerName, apiController));
    54             }
    55             plugins.Add(pluginName, controllers);
    56           }
    57         }
    58         catch (Exception) {
    59           throw new ArgumentException("error loading plugin '{0}'", pluginName);
    60         }
     46      // load controller
     47      if (pluginName == "app") {
     48        // from main app
     49        HttpControllerDescriptor controller;
     50        controllers.TryGetValue(controllerName, out controller);
     51        return controller;
    6152      }
    62       if (controllers == null) {
    63         throw new ArgumentException("invalid plugin '{0}'", pluginName);
     53      // from plugin
     54      var plugin = pluginManager.GetPlugin(pluginName);
     55      if (plugin == null) {
     56        throw new ArgumentException(string.Format("invalid plugin '{0}'", pluginName));
    6457      }
    65       HttpControllerDescriptor controller;
    66       controllers.TryGetValue(controllerName, out controller);
    67       return controller;
     58      return plugin.GetController(controllerName);
    6859    }
    6960  }
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/HeuristicLab.Services.WebApp.csproj

    r12419 r12425  
    129129    <Compile Include="Controllers\AppController.cs" />
    130130    <Compile Include="Controllers\AuthenticationController.cs" />
     131    <Compile Include="Controllers\DataTransfer\Plugin.cs" />
    131132    <Compile Include="Controllers\DataTransfer\User.cs" />
     133    <Compile Include="Controllers\PluginController.cs" />
    132134    <Compile Include="Controllers\WebAppControllerSelector.cs" />
    133135    <Compile Include="Global.asax.cs">
    134136      <DependentUpon>Global.asax</DependentUpon>
    135137    </Compile>
     138    <Compile Include="Plugin.cs" />
     139    <Compile Include="PluginManager.cs" />
    136140    <Compile Include="Properties\AssemblyInfo.cs" />
    137141  </ItemGroup>
    138142  <ItemGroup>
    139143    <Content Include="WebApp\app.css" />
    140     <Content Include="WebApp\app.js" />
    141144    <Content Include="favicon.ico" />
    142145    <Content Include="Global.asax" />
     146    <Content Include="WebApp\main.js" />
    143147    <Content Include="WebApp\helper.js" />
    144148    <Content Include="WebApp\HeuristicLab.ico" />
     
    163167    <Content Include="WebApp\libs\misc\respond.min.js" />
    164168    <Content Include="WebApp\libs\smoothScroll\smoothScroll.js" />
    165     <Content Include="WebApp\module.js" />
     169    <Content Include="WebApp\app.js" />
    166170    <Content Include="WebApp\plugins\login\login.css">
    167171      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     
    179183      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    180184    </Content>
     185    <Content Include="WebApp\plugins\plugins\pluginsService.js" />
    181186    <Content Include="WebApp\shared\directives\flot.js" />
    182187    <Content Include="WebApp\libs\angularjs\angular-ui\ui-bootstrap-tpls-0.13.0.min.js" />
     
    240245  </ItemGroup>
    241246  <ItemGroup>
     247    <ProjectReference Include="..\HeuristicLab.Services.Access\3.3\HeuristicLab.Services.Access-3.3.csproj">
     248      <Project>{9fac0b23-2730-452a-9ba0-d7ca1746c541}</Project>
     249      <Name>HeuristicLab.Services.Access-3.3</Name>
     250    </ProjectReference>
    242251    <ProjectReference Include="..\HeuristicLab.Services.Hive.DataAccess\3.3\HeuristicLab.Services.Hive.DataAccess-3.3.csproj">
    243252      <Project>{ec2c8109-6e1e-4c88-9a2b-908cff2ef4ac}</Project>
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/app.css

    r12419 r12425  
    314314  text-shadow: none !important;
    315315}
     316
     317
     318.default-view-container {
     319  padding: 30px;
     320}
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/app.js

    r12419 r12425  
    1 var appMainModule = app.registerModule(appName);
    2 appMainModule.dependencies = ['oc.lazyLoad', 'ui.router', 'angular-loading-bar', 'ngResource'];
    3 appMainModule.loadModule();
    4 (function () {
    5     'use strict';
    6     var module = appMainModule.getAngularModule();
     1// app configuration
     2var appName = 'app';
     3var appPath = 'WebApp';
    74
    8     module.config(['$ocLazyLoadProvider', function ($ocLazyLoadProvider) {
    9         app.modules.forEach(function (module) {
    10             $ocLazyLoadProvider.config({
    11                 modules: [{
    12                     name: module.getFullModuleName(),
    13                     files: module.getFiles()
    14                 }]
     5// route, plugin, menu, section and main app
     6var Route = function (name, view, controller) {
     7    this.name = name;
     8    this.view = view;
     9    this.controller = controller;
     10};
     11
     12var Plugin = function (pluginName) {
     13    this.name = pluginName;
     14    this.parent = appName;
     15    this.view = '';
     16    this.controller = '';
     17    this.dependencies = [];
     18    this.routes = [];
     19    this.files = [];
     20
     21    this.getPluginDirectory = function () {
     22        return appPath + '/plugins/' + this.name + '/';
     23    };
     24
     25    this.getFullPluginName = function() {
     26        if (this.name.localeCompare(appName) == 0) {
     27            return this.name;
     28        }
     29        return this.parent + '.' + this.name;
     30    };
     31
     32    this.getRouteName = function() {
     33        return '/' + this.name;
     34    };
     35
     36    this.getAngularModule = function() {
     37        return angular.module(this.getFullPluginName());
     38    };
     39
     40    this.getFilePath = function (file) {
     41        return this.getPluginDirectory() + file;
     42    };
     43
     44    this.getViewUrl = function (view) {
     45        return 'plugin=' + this.name + '&view=' + view;
     46    };
     47
     48    // getFiles is used in the lazy loading provider
     49    this.getFiles = function () {
     50        var plugin = this;
     51        var filesToLoad = [];
     52        plugin.files.forEach(function (file) {
     53            filesToLoad.push(plugin.getFilePath(file));
     54        });
     55        return filesToLoad;
     56    };
     57
     58    this.configureRoutes = function ($stateProvider) {
     59        var plugin = this;
     60        this.routes.forEach(function (route) {
     61            $stateProvider.state(plugin.name + route.name, {
     62                url: '/' + plugin.name + '/' + route.name,
     63                controller: route.controller,
     64                templateUrl: plugin.getViewUrl(route.view),
     65                cache: false,
     66                resolve: {
     67                    loadPlugin: ['$ocLazyLoad', 'cfpLoadingBar', function ($ocLazyLoad, cfpLoadingBar) {
     68                        cfpLoadingBar.start();
     69                        var retVal = plugin.load($ocLazyLoad);
     70                        cfpLoadingBar.complete();
     71                        return retVal;
     72                    }]
     73                }
    1574            });
    1675        });
    17     }]);
     76    };
    1877
    19     module.config([
    20         '$stateProvider', '$urlRouterProvider',
    21         function ($stateProvider, $urlRouterProvider) {
    22             $urlRouterProvider.otherwise('/status');
    23             // load module routes
    24             app.modules.forEach(function (module) {
    25                 // home route
    26                 $stateProvider.state(module.name, {
    27                     url: module.getRouteName(),
    28                     controller: module.getController(),
    29                     templateUrl: module.getViewUrl(module.getView()),
    30                     cache: false,
    31                     resolve: {
    32                         loadModule: ['$ocLazyLoad', 'cfpLoadingBar', function ($ocLazyLoad, cfpLoadingBar) {
    33                             cfpLoadingBar.start();
    34                             var retVal = module.loadModule($ocLazyLoad);
    35                             cfpLoadingBar.complete();
    36                             return retVal;
    37                         }]
    38                     }
    39                 });
    40                 // sub-routes
    41                 module.configureRoutes($stateProvider);
     78    this.load = function ($ocLazyLoad) {
     79        var plugin = this;
     80        var params = [];
     81        var lazyLoadingFiles = [];
     82        plugin.dependencies.forEach(function (dependency) {
     83            params.push(dependency);
     84        });
     85        plugin.files.forEach(function (file) {
     86            lazyLoadingFiles.push(plugin.getFilePath(file));
     87        });
     88        // load required files
     89        var lazyLoaded = null;
     90        if (!($ocLazyLoad === undefined || $ocLazyLoad === null)) {
     91            lazyLoaded = $ocLazyLoad.load(plugin.getFullPluginName());
     92        }
     93        // load angular module
     94        angular.module(this.getFullPluginName(), params);
     95        return lazyLoaded;
     96    };
     97};
     98
     99var Section = function (name, index) {
     100    this.name = name;
     101    this.index = index;
     102    this.entries = [];
     103
     104    this.addEntry = function (entry) {
     105        this.entries.push(entry);
     106    };
     107};
     108
     109var Menu = function () {
     110    this.sections = [];
     111    this.nextIndex = 0;
     112
     113    this.getSection = function (name, index) {
     114        var length = this.sections.length;
     115        for (var i = 0; i < length; ++i) {
     116            var section = this.sections[i];
     117            if (section.name == name) {
     118                return section;
     119            }
     120        }
     121        if (index === undefined || index === null) {
     122            this.nextIndex++;
     123            index = this.nextIndex;
     124        } else {
     125            if (index > this.nextIndex) {
     126                this.nextIndex = index;
     127            }
     128        }
     129        var newSection = new Section(name, index);
     130        this.sections.push(newSection);
     131        return newSection;
     132    };
     133
     134    this.getMenuEntries = function () {
     135        var entries = [];
     136        this.sections.sort(function (a, b) {
     137            return parseFloat(a.index) - parseFloat(b.index);
     138        });
     139        this.sections.forEach(function (section) {
     140            entries.push({ name: section.name, isCategory: true, route: '?' });
     141            section.entries.sort(function(a, b) {
     142                return parseFloat(a.index) - parseFloat(b.index);
    42143            });
     144            section.entries.forEach(function (entry) {
     145                entries.push(entry);
     146            });
     147        });
     148        return entries;
     149    };
     150};
     151
     152// app that holds references to plugins and menu
     153var app = new function () {
     154    this.plugins = [];
     155    this.registerPlugin = function (name) {
     156        var plugin = new Plugin(name);
     157        if (name.localeCompare(appName) != 0) {
     158            this.plugins.push(plugin);
    43159        }
    44     ]);
     160        return plugin;
     161    };
    45162
    46     module.config([
    47         '$httpProvider', function ($httpProvider) {
    48             $httpProvider.interceptors.push(['$q', function ($q) {
    49                 return {
    50                     'request': function (config) {
    51                         if (endsWith(config.url, '.cshtml')) {
    52                             config.url = 'App/LoadPluginView?' + config.url + "&dateTime=" + Date.now().toString();
    53                         }
    54                         return config;
    55                     }
    56                 };
    57             }]);
    58         }
    59     ]);
    60 
    61     function endsWith(str, suffix) {
    62         if (suffix.length > str.length) {
    63             return false;
    64         }
    65         return str.indexOf(suffix, str.length - suffix.length) !== -1;
    66     }
    67 
    68 })();
     163    this.menu = new Menu();
     164    this.getMenu = function () {
     165        return this.menu;
     166    };
     167};
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/helper.js

    r12419 r12425  
    3232    return year + '-' + month + '-' + day + 'T23:59:59.000Z';
    3333};
     34
     35
     36var CSharpDateToString = function (datetime) {
     37    var date = new Date(Date.parse(datetime));
     38    var day = date.getDate().zeropad(2);
     39    var month = (1 + date.getMonth()).zeropad(2);
     40    var year = date.getFullYear();
     41    var hour = date.getHours().zeropad(2);
     42    var minute = date.getMinutes().zeropad(2);
     43    var second = date.getSeconds().zeropad(2);
     44    return day + '.' + month + '.' + year + ' ' + hour + ':' + minute + ':' + second;
     45};
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/login.cshtml

    r12419 r12425  
    1 @using System.Web.Security
    2 <div id="login">
     1<div class="default-view-container">
    32    <div class="row">
    43        <div class="col-md-6 center-block" style="float: none">
     
    2726                        </div>
    2827                        <div class="form-group">
    29                             <input type="submit" value="Login" href="#" class="btn btn-default pull-right" data-ng-click="login()"/>
     28                            <input type="submit" value="Login" href="#" class="btn btn-default pull-right" data-ng-click="login()" />
    3029                        </div>
    3130                    </form>
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/login.css

    r12419 r12425  
    1 #login {
    2   padding: 30px;
    3 }
    4 
    5 .loginError {
     1.loginError {
    62  padding: 15px; 
    73}
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/login.js

    r12419 r12425  
    1 var appLoginModule = app.registerModule('login');
     1var appLoginPlugin = app.registerPlugin('login');
    22(function () {
    3     var module = appLoginModule;
    4     module.dependencies = ['ngResource', 'ui.bootstrap'];
    5     module.files = [
     3    var plugin = appLoginPlugin;
     4    plugin.dependencies = ['ngResource', 'ui.bootstrap'];
     5    plugin.files = [
    66        'loginCtrl.js',
    77        'login.css'
    88    ];
    9     module.view = 'login.cshtml';
    10     module.controller = appLoginModule.getControllerName();
    11     module.routes = [];
     9    plugin.view = 'login.cshtml';
     10    plugin.controller = 'app.login.ctrl';
     11    plugin.routes = [];
    1212})();
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/loginCtrl.js

    r12419 r12425  
    11(function () {
    2     var moduleName = appLoginModule.getFullModuleName();
    3     var module = appLoginModule.getAngularModule();
    4     module.controller(appLoginModule.getControllerName(),
     2    var module = appLoginPlugin.getAngularModule();
     3    module.controller('app.login.ctrl',
    54        ['$scope', '$window', 'app.authentication.service', function ($scope, $window, authService) {
    65            $scope.login = function () {
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/plugins.cshtml

    r12419 r12425  
    1 <h1>{{test}}</h1>
     1<div class="default-view-container">
     2    <div class="row">
     3        <div class="col-lg-12">
     4            <div class="panel panel-default">
     5                <div class="panel-heading">
     6                    <h3 class="panel-title">WebApp Plugins</h3>
     7                </div>
     8                <div class="panel-body">
     9                    <table class="table table-hover table-condensed">
     10                        <thead>
     11                            <tr>
     12                                <th>#</th>
     13                                <th>Name</th>
     14                                <th>Assembly</th>
     15                                <th>Last reload</th>
     16                                <th></th>
     17                            </tr>
     18                        </thead>
     19                        <tr ng-repeat="plugin in plugins">
     20                            <td>{{$index + 1}}</td>
     21                            <td>{{plugin.Name}}</td>
     22                            <td>{{plugin.AssemblyName}}</td>
     23                            <td>{{plugin.LastReload}}</td>
     24                            <td>
     25                                <a ng-href="" data-ng-click="reloadPlugin(plugin.Name)">Reload</a>
     26                            </td>
     27                        </tr>
     28                    </table>
     29                </div>
     30            </div>
     31        </div>
     32    </div>
     33</div>
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/plugins.js

    r12419 r12425  
    1 var appPluginsModule = app.registerModule('plugins');
     1var appPluginsPlugin = app.registerPlugin('plugins');
    22(function () {
    3     var module = appPluginsModule;
    4     module.dependencies = ['ngResource', 'ui.bootstrap'];
    5     module.files = ['pluginsCtrl.js'];
    6     module.view = 'plugins.cshtml';
    7     module.controller = 'app.plugins.ctrl';
    8     module.routes = [];
     3    var plugin = appPluginsPlugin;
     4    plugin.dependencies = ['ngResource', 'ui.bootstrap'];
     5    plugin.files = [
     6        'pluginsService.js',
     7        'pluginsCtrl.js'
     8    ];
     9    plugin.view = 'plugins.cshtml';
     10    plugin.controller = 'app.plugins.ctrl';
     11    plugin.routes = [];
    912
    1013    var menu = app.getMenu();
    1114    var section = menu.getSection('Administration', -1);
    1215    section.addEntry({
     16        index: 10,
    1317        name: 'Plugins',
    1418        route: '#/plugins',
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/pluginsCtrl.js

    r12419 r12425  
    11(function () {
    2     var module = appPluginsModule.getAngularModule();
     2    var module = appPluginsPlugin.getAngularModule();
    33    module.controller('app.plugins.ctrl',
    4         ['$scope', function ($scope) {
    5             $scope.test = "a test message";
     4        ['$scope', 'app.plugins.service', function ($scope, pluginService) {
     5            var getPlugins = function () {
     6                pluginService.getPlugins({}, function (plugins) {
     7                    $scope.plugins = plugins;
     8                    var length = $scope.plugins.length;
     9                    for (var i = 0; i < length; ++i) {
     10                        if (!isDefined($scope.plugins[i].AssemblyName)) {
     11                            $scope.plugins[i].AssemblyName = 'Not found';
     12                        }
     13                        var datetime = $scope.plugins[i].LastReload;
     14                        if (isDefined(datetime)) {
     15                            $scope.plugins[i].LastReload = CSharpDateToString(datetime);
     16                        } else {
     17                            $scope.plugins[i].LastReload = 'Never';
     18                        }
     19                    }
     20                });
     21            };
     22
     23            $scope.reloadPlugin = function (name) {
     24                pluginService.reloadPlugin({ name: name }, function() {
     25                    getPlugins();
     26                });
     27            };
     28
     29            getPlugins();
    630        }]
    731    );
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/directives/flot.js

    r12419 r12425  
    11(function () {
    2     var module = appMainModule.getAngularModule();
     2    var module = appMainPlugin.getAngularModule();
    33    module.directive('flot', function () {
    44        return {
     
    4141                        chart.setupGrid();
    4242                        chart.draw();
    43 
    4443                    }
    4544                });
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/layout/layout.cshtml

    r12419 r12425  
    1 <!DOCTYPE html>
     1@using HeuristicLab.Services.WebApp.Configs
     2<!DOCTYPE html>
    23<html lang="en" ng-app="app">
    34<head>
     
    2526    <div id="app">
    2627        <header id="toolbar" class="navbar navbar-default navbar-static-top no-border no-padding-margin"
    27                 ng-controller="app.menu">
     28                ng-controller="app.menu.ctrl">
    2829            <nav>
    2930                <div class="container-fluid">
     
    6162        </header>
    6263
    63         <aside id="menu" ng-controller="app.menu">
     64        <aside id="menu" ng-controller="app.menu.ctrl">
    6465            <ul class="nav nav-sidebar"
    6566                ng-include="'App/LoadSharedView?directory=menu&view=menu.cshtml&dateTime=@DateTime.Now'"
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/menu/menuCtrl.js

    r12419 r12425  
    11(function () {
    2     var module = appMainModule.getAngularModule();
    3     module.controller('app.menu',
     2    var module = appMainPlugin.getAngularModule();
     3    module.controller('app.menu.ctrl',
    44        ['$scope', '$timeout', '$location', '$window', 'app.authentication.service',
    55        function ($scope, $timeout, $location, $window, authService) {
  • branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/services/authenticationService.js

    r12419 r12425  
    11(function () {
    22    var apiUrl = 'api/App/Authentication/';
    3     var module = appMainModule.getAngularModule();
     3    var module = appMainPlugin.getAngularModule();
    44    module.factory('app.authentication.service',
    55        ['$resource', function ($resource) {
Note: See TracChangeset for help on using the changeset viewer.