Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 20 additions & 5 deletions src/MoManI.Api/Controllers/ModelCloningController.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
Expand All @@ -16,16 +18,29 @@ public ModelCloningController(IModelRepository modelRepository)
_modelRepository = modelRepository;
}

public async Task<HttpResponseMessage> PostClone(Guid modelId, Guid scenarioId, string name)
public async Task<HttpResponseMessage> PostClone(CloningParameters parameters) //ICloneElement scenarios
{
var model = await _modelRepository.GetComposedModel(modelId);
var scenario = await _modelRepository.GetScenario(scenarioId);
if (model == null || scenario == null || scenario.ModelId != modelId)

var model = await _modelRepository.GetComposedModel(parameters.ModelId);

var modelScenarios = await _modelRepository.GetScenarios(parameters.ModelId);
var scenariosToClone = modelScenarios.Where(s => parameters.ScenarioIds.Any(x => x == s.Id));

if (model == null || !scenariosToClone.Any()) //|| scenario.ModelId != parameters.ModelId nebereik, nes traukiam pagal model id
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid parameters");
}
await _modelRepository.CloneComposedModel(modelId, scenarioId, name);
await _modelRepository.CloneComposedModel(parameters);
return Request.CreateResponse(HttpStatusCode.OK);
}
}

public class CloningParameters
{
public Guid ModelId { get; set; }
public IEnumerable<Guid> ScenarioIds { get; set; }//[] paziuret kad butu consistent tipas
public string Name { get; set; }
}


}
3 changes: 2 additions & 1 deletion src/MoManI.Api/Services/IModelRepository.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using MoManI.Api.Controllers;
using MoManI.Api.Models;

namespace MoManI.Api.Services
Expand All @@ -11,7 +12,7 @@ public interface IModelRepository
Task<ComposedModel> GetComposedModel(Guid id);
Task SaveComposedModel(ComposedModel composedModel);
Task DeleteComposedModel(Guid id);
Task CloneComposedModel(Guid modelId, Guid scenarioId, string name);
Task CloneComposedModel(CloningParameters parameters);

Task<IEnumerable<Scenario>> GetScenarios(Guid modelId);
Task<Scenario> GetScenario(Guid scenarioId);
Expand Down
21 changes: 14 additions & 7 deletions src/MoManI.Api/Services/MongoModelRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using MoManI.Api.Controllers;
using MoManI.Api.Models;
using MongoDB.Bson;
using MongoDB.Driver;
Expand Down Expand Up @@ -52,17 +53,23 @@ public async Task DeleteComposedModel(Guid id)
await _composedModelsCollection.DeleteOneAsync(x => x.Id == id);
}

public async Task CloneComposedModel(Guid modelId, Guid scenarioId, string name)
public async Task CloneComposedModel(CloningParameters parameters)
{
var model = await CreateClonedModel(modelId, name);
var scenario = await CreateClonedScenario(scenarioId, model);
var sourceSetData = await GetAllModelSetData(modelId);
var setData = sourceSetData.Select(s => s.CloneToModel(model.Id));
var model = await CreateClonedModel(parameters.ModelId, parameters.Name);
var sourceSetData = await GetAllModelSetData(parameters.ModelId);
var setData = sourceSetData.Select(s => s.CloneToModel(model.Id));//model specific
foreach (var setDataValue in setData)
{
await SaveSetData(setDataValue);
}
await CloneParameterData(scenarioId, scenario.Id);

foreach (var scenarioId in parameters.ScenarioIds)
{
var scenario = await CreateClonedScenario(scenarioId, model);//
await CloneParameterData(scenarioId, scenario.Id);
}

//KITAS VARIANTAS //var scenarios = await CreateClonedScenarios(parameters.ScenarioIds, model);
}

private async Task<ComposedModel> CreateClonedModel(Guid modelId, string name)
Expand All @@ -77,7 +84,7 @@ private async Task<ComposedModel> CreateClonedModel(Guid modelId, string name)
private async Task<Scenario> CreateClonedScenario(Guid scenarioId, ComposedModel model)
{
var sourceScenario = await GetScenario(scenarioId);
var scenario = sourceScenario.Clone(1);
var scenario = sourceScenario.Clone(sourceScenario.Revision);//paziuret // manau kad ok, nes klonuoji scenarijus pagal skirtingus ID
scenario.ModelId = model.Id;
scenario.ParentScenarioId = null;
await SaveScenario(scenario);
Expand Down
2 changes: 2 additions & 0 deletions src/MoManI.Ui/MoManI.Ui.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<IISExpressWindowsAuthentication />
<IISExpressUseClassicPipelineMode />
<UseGlobalApplicationHostFile />
<Use64BitIISExpress />
</PropertyGroup>
<ItemGroup>
<Service Include="{4A0DDDB5-7A95-4FBF-97CC-616D07737A77}" />
Expand Down Expand Up @@ -176,6 +177,7 @@
<TypeScriptCompile Include="scripts\routes.ts" />
<TypeScriptCompile Include="scripts\services\constraintGroupService.ts" />
<TypeScriptCompile Include="scripts\services\constraintService.ts" />
<TypeScriptCompile Include="scripts\services\modelCloningService.ts" />
<TypeScriptCompile Include="scripts\services\scenarioService.ts" />
<TypeScriptCompile Include="scripts\services\objectiveFunctionService.ts" />
<TypeScriptCompile Include="scripts\services\modelService.ts" />
Expand Down
80 changes: 41 additions & 39 deletions src/MoManI.Ui/index.html
Original file line number Diff line number Diff line change
@@ -1,39 +1,41 @@
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="utf-8">
<meta itemprop="momani-settings-api" content="http://localhost/MoManI.Api/" />
<title>Model Management Infrastructure (OSEMOSyS)</title>
<link rel="stylesheet" href="styles/bootstrap.css">
<link rel="stylesheet" href="styles/handsontable.full.css">
<link rel="stylesheet" href="styles/nv.d3.css">
<link rel="stylesheet" href="styles/treeGrid.css">
<link rel="stylesheet" href="styles/app.css">
<link rel="stylesheet" href="styles/angularjs-color-picker.css">
<link rel="stylesheet" href="styles/angularjs-color-picker-bootstrap.css">
<script src="scripts/lib/require.js" data-main="scripts/requireMain"></script>
</head>

<body>

<nav class="navbar navbar-default" role="navigation" bs-navbar>
<ul class="nav navbar-nav">
<li data-match-route="/$"><a class="logo-link" href="http://www.optimus.community/"><img alt="OpTIMUS" src="images/optimus-logo.png"></a></li>
<li data-match-route="/sets"><a href="#/sets">Sets</a></li>
<li data-match-route="/parameters"><a href="#/parameters">Parameters</a></li>
<li data-match-route="/variables"><a href="#/variables">Variables</a></li>
<li data-match-route="/functions"><a href="#/functions">Objective functions</a></li>
<li data-match-route="/(constraints|constraintGroups)"><a href="#/constraints">Constraints</a></li>
<li data-match-route="/models"><a href="#/models">Models</a></li>
<li data-match-route="/results"><a href="#/results">Results</a></li>
</ul>
</nav>

<div class="view-container">
<div ng-view class="view-frame"></div>
</div>

</body>

</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta itemprop="momani-settings-api" content="http://localhost/MoManI.Api/" />
<meta id="jsVersion" itemprop="momani-settings-jsVersion" content="11" />
<title>Model Management Infrastructure (OSEMOSyS)</title>
<link rel="stylesheet" href="styles/bootstrap.css">
<link rel="stylesheet" href="styles/handsontable.full.css">
<link rel="stylesheet" href="styles/nv.d3.css">
<link rel="stylesheet" href="styles/treeGrid.css">
<link rel="stylesheet" href="styles/app.css">
<link rel="stylesheet" href="styles/angularjs-color-picker.css">
<link rel="stylesheet" href="styles/angularjs-color-picker-bootstrap.css">
<script src="scripts/lib/require.js" data-main="scripts/requireMain"></script>
</head>

<body>
<nav class="navbar navbar-default" role="navigation" bs-navbar>
<ul class="nav navbar-nav">
<li data-match-route="/$"><a class="logo-link" href="http://www.optimus.community/"><img alt="OpTIMUS" src="images/optimus-logo.png"></a></li>
<li data-match-route="/sets"><a href="#/sets">Sets</a></li>
<li data-match-route="/parameters"><a href="#/parameters">Parameters</a></li>
<li data-match-route="/variables"><a href="#/variables">Variables</a></li>
<li data-match-route="/functions"><a href="#/functions">Objective functions</a></li>
<li data-match-route="/(constraints|constraintGroups)"><a href="#/constraints">Constraints</a></li>
<li data-match-route="/models"><a href="#/models">Models</a></li>
<li data-match-route="/results"><a href="#/results">Results</a></li>
</ul>
<div class="version">
Version <span id="versionDisplay"></span>
</div>
</nav>

<div class="view-container">
<div ng-view class="view-frame"></div>
</div>
</body>
</html>

<script>document.getElementById("versionDisplay").innerHTML = document.getElementById("jsVersion").content</script>
11 changes: 6 additions & 5 deletions src/MoManI.Ui/partials/clone-model-scenario-dialog.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ <h3 class="modal-title">Select scenario to clone</h3>
<form name="cloneScenarioForm">
<div class="modal-body">
<div class="form-group">
<div class="radio" ng-repeat="scenario in scenarios | orderBy: orderProp">
<label>
<input type="radio" ng-model="$parent.selectedScenario" name="scenarioRadio" ng-value="scenario" required>
<span>{{scenario.name}} (rev. {{scenario.revision}})</span>
<br />
<div class="checkbox" ng-repeat="scenario in scenarios | orderBy: orderProp">
<label>
<input type="checkbox" ng-model="$parent.selectedScenarios[scenario.id]">
<!--<input type="radio" ng-model="$parent.selectedScenario" name="scenarioRadio" ng-value="scenario" required>-->
<span>{{scenario.name}} (rev. {{scenario.revision}})</span>
<br />
</label>
</div>
</div>
Expand Down
38 changes: 25 additions & 13 deletions src/MoManI.Ui/scripts/controllers/modelCloningControllers.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,31 @@
import application = require('application');

import $ = require('jquery');
import application = require('application');
import _ = require('lodash');
import urls = require('urls');
import scenarioService = require('services/scenarioService');
import modelCloningService = require('services/modelCloningService');

var forceLoad = [scenarioService];
var forceLoad = [scenarioService, modelCloningService];

export interface IExecutableRenderingModalScope extends ng.IScope {
scenarios: IScenario[];
orderProp: string;
selectedScenario: IScenario;
selectedScenarios: string[];
scenarioIds: string[];
newName: string;
clone: () => void;
cancel: () => void;
loading: boolean;
cloneScenarioForm: angular.IFormController;
cloningParameters: ICloningParameters;
}

export class ModelCloningModalController {
constructor(
$scope: IExecutableRenderingModalScope, $q: angular.IQService, $modalInstance: angular.ui.bootstrap.IModalServiceInstance, $http: angular.IHttpService,
ScenarioService: ng.resource.IResourceClass<IScenarioResource>,
ScenarioService: ng.resource.IResourceClass<IScenarioResource>, ModelCloningService: angular.resource.IResourceClass<ISetDataResource>, $window: angular.IWindowService,
model: IModel
) {
$scope.loading = true;
Expand All @@ -34,20 +40,26 @@ export class ModelCloningModalController {
if ($scope.cloneScenarioForm.$invalid)
return;
$scope.loading = true;
var cloneReq = $http({
url: urls.modelCloning,
method: 'POST',
params: { modelId: model.id, scenarioId: $scope.selectedScenario.id, name: $scope.newName },
});
$q.when(cloneReq).finally(() => {

var selectedScenarioIds = Object.keys($scope.selectedScenarios).filter(s => {
return $scope.selectedScenarios[s] !== false;
});

var cloningParameters = { modelId: model.id, scenarioIds: selectedScenarioIds, name: $scope.newName } as ICloningParameters;

ModelCloningService.save(JSON.stringify(cloningParameters)).$promise.then(() => {
$window.location.href = '#/models';
}).catch(() => {
alert('An error occured');
}).finally(() => {
$scope.loading = false;
}).then(() => {
$modalInstance.close();
});

}

$scope.cancel = () => {
$modalInstance.dismiss();
$scope.cancel = () => {
$modalInstance.dismiss();
}
}
}
}
6 changes: 6 additions & 0 deletions src/MoManI.Ui/scripts/models/model.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
interface IModelResource extends IModel, ng.resource.IResource<IModelResource> {
}

interface ICloningParameters {
modelId: string;
scenarioIds: string[];
name: string;
}

interface ISelectableEntry<T> {
selected: boolean;
data: T;
Expand Down
2 changes: 1 addition & 1 deletion src/MoManI.Ui/scripts/requireMain.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
declare var require: any;
var version = (<HTMLMetaElement>document.getElementById('jsVersion')).content;

var version = 11;
require.config({
baseUrl: 'scripts',
paths: {
Expand Down
7 changes: 7 additions & 0 deletions src/MoManI.Ui/scripts/services/modelCloningService.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import application = require('application');
import angularResource = require('angular-resource');
import urls = require('urls');

application.factory('ModelCloningService', ($resource: ng.resource.IResourceService): ng.resource.IResourceClass<IModelResource> => (
<ng.resource.IResourceClass<IModelResource>> $resource(urls.modelCloning)
));
5 changes: 5 additions & 0 deletions src/MoManI.Ui/styles/app.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
.version {
text-align: right;
padding: 15px;
}

.view-container {
margin-left: 10px;
margin-right: 10px;
Expand Down