First Approach to Edit Template Gamesystems from Characters perspective
All checks were successful
E2E Testing / test (push) Successful in 1m33s
All checks were successful
E2E Testing / test (push) Successful in 1m33s
This commit is contained in:
parent
a54a652358
commit
b7ccfe5201
@ -70,6 +70,18 @@ import {
|
|||||||
} from "./editor/gamesystem-editor/scriptaccount-condition-editor/scriptaccount-condition-editor.component";
|
} from "./editor/gamesystem-editor/scriptaccount-condition-editor/scriptaccount-condition-editor.component";
|
||||||
import {CharacterOverviewComponent} from "./side-overviews/character-overview/character-overview.component";
|
import {CharacterOverviewComponent} from "./side-overviews/character-overview/character-overview.component";
|
||||||
import {CharacterEditorComponent} from "./editor/character-editor/character-editor.component";
|
import {CharacterEditorComponent} from "./editor/character-editor/character-editor.component";
|
||||||
|
import {
|
||||||
|
TemplateGamesystemEditorComponent
|
||||||
|
} from "./editor/gamesystem-editor/template-gamesystem-editor/template-gamesystem-editor.component";
|
||||||
|
import {
|
||||||
|
TemplateStateEditorComponent
|
||||||
|
} from "./editor/gamesystem-editor/template-gamesystem-editor/template-state-editor/template-state-editor.component";
|
||||||
|
import {
|
||||||
|
MatAccordion,
|
||||||
|
MatExpansionPanel,
|
||||||
|
MatExpansionPanelHeader,
|
||||||
|
MatExpansionPanelTitle
|
||||||
|
} from "@angular/material/expansion";
|
||||||
|
|
||||||
// AoT requires an exported function for factories
|
// AoT requires an exported function for factories
|
||||||
const httpLoaderFactory = (http: HttpClient): TranslateHttpLoader => new TranslateHttpLoader(http, './assets/i18n/', '.json');
|
const httpLoaderFactory = (http: HttpClient): TranslateHttpLoader => new TranslateHttpLoader(http, './assets/i18n/', '.json');
|
||||||
@ -93,7 +105,9 @@ const httpLoaderFactory = (http: HttpClient): TranslateHttpLoader => new Transl
|
|||||||
ScriptaccountActionEditorComponent,
|
ScriptaccountActionEditorComponent,
|
||||||
ScriptaccountConditionEditorComponent,
|
ScriptaccountConditionEditorComponent,
|
||||||
CharacterOverviewComponent,
|
CharacterOverviewComponent,
|
||||||
CharacterEditorComponent
|
CharacterEditorComponent,
|
||||||
|
TemplateGamesystemEditorComponent,
|
||||||
|
TemplateStateEditorComponent
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
BrowserModule,
|
BrowserModule,
|
||||||
@ -150,9 +164,16 @@ const httpLoaderFactory = (http: HttpClient): TranslateHttpLoader => new Transl
|
|||||||
MatHint,
|
MatHint,
|
||||||
MatTooltip,
|
MatTooltip,
|
||||||
MatCard,
|
MatCard,
|
||||||
MatCardContent
|
MatCardContent,
|
||||||
|
MatAccordion,
|
||||||
|
MatExpansionPanel,
|
||||||
|
MatExpansionPanelTitle,
|
||||||
|
MatExpansionPanelHeader
|
||||||
],
|
],
|
||||||
providers: [],
|
providers: [],
|
||||||
|
exports: [
|
||||||
|
ProductGamesystemEditorComponent
|
||||||
|
],
|
||||||
bootstrap: [AppComponent]
|
bootstrap: [AppComponent]
|
||||||
})
|
})
|
||||||
export class AppModule {}
|
export class AppModule {}
|
||||||
|
@ -1 +1,8 @@
|
|||||||
<p>character-editor works!</p>
|
<mat-accordion>
|
||||||
|
<mat-expansion-panel *ngFor="let templateGamesystem of templateSimpleGamesystems">
|
||||||
|
<mat-expansion-panel-header>
|
||||||
|
<mat-panel-title>{{templateGamesystem.referenceGamesystem.componentName}}</mat-panel-title>
|
||||||
|
</mat-expansion-panel-header>
|
||||||
|
<app-template-gamesystem-editor [gamesystem]="templateGamesystem"></app-template-gamesystem-editor>
|
||||||
|
</mat-expansion-panel>
|
||||||
|
</mat-accordion>
|
||||||
|
@ -1,10 +1,31 @@
|
|||||||
import { Component } from '@angular/core';
|
import {Component, Input, OnInit} from '@angular/core';
|
||||||
|
import {Character} from "../../project/game-model/characters/Character";
|
||||||
|
import {Gamesystem} from "../../project/game-model/gamesystems/Gamesystem";
|
||||||
|
import {TemplateGamesystem} from "../../project/game-model/gamesystems/TemplateGamesystem";
|
||||||
|
import {ProductGamesystem} from "../../project/game-model/gamesystems/ProductGamesystem";
|
||||||
|
import {SimpleGamesystem} from "../../project/game-model/gamesystems/SimpleGamesystem";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-character-editor',
|
selector: 'app-character-editor',
|
||||||
templateUrl: './character-editor.component.html',
|
templateUrl: './character-editor.component.html',
|
||||||
styleUrl: './character-editor.component.scss'
|
styleUrl: './character-editor.component.scss'
|
||||||
})
|
})
|
||||||
export class CharacterEditorComponent {
|
export class CharacterEditorComponent implements OnInit{
|
||||||
|
|
||||||
|
@Input() character: Character | undefined
|
||||||
|
@Input() referenceGamesystems: Gamesystem<any, any>[] = []
|
||||||
|
|
||||||
|
templateSimpleGamesystems: TemplateGamesystem[] = []
|
||||||
|
templateProductGamesystems: ProductGamesystem[] = []
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.referenceGamesystems.forEach(referenceGamesystem => {
|
||||||
|
if(referenceGamesystem instanceof SimpleGamesystem) {
|
||||||
|
this.templateSimpleGamesystems.push(new TemplateGamesystem(referenceGamesystem))
|
||||||
|
} else {
|
||||||
|
this.templateProductGamesystems.push(referenceGamesystem as ProductGamesystem)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,9 @@
|
|||||||
[gamesystem]="convertModelComponentToGamesystem(modelComponent)"
|
[gamesystem]="convertModelComponentToGamesystem(modelComponent)"
|
||||||
(onOpenGamesystemEditor)="openGameModelComponent($event)"
|
(onOpenGamesystemEditor)="openGameModelComponent($event)"
|
||||||
[scriptAccounts]="gameModel!.scriptAccounts"></app-gamesystem-editor>
|
[scriptAccounts]="gameModel!.scriptAccounts"></app-gamesystem-editor>
|
||||||
<app-character-editor *ngIf="modelComponent.type === ModelComponentType.CHARACTER">
|
<app-character-editor *ngIf="modelComponent.type === ModelComponentType.CHARACTER"
|
||||||
|
[referenceGamesystems]="loadCharacterSpecificGamesystems()"
|
||||||
|
[character]="convertModelComponentToCharacter(modelComponent)">
|
||||||
|
|
||||||
</app-character-editor>
|
</app-character-editor>
|
||||||
</mat-tab>
|
</mat-tab>
|
||||||
|
@ -6,6 +6,9 @@ import {Gamesystem} from "../project/game-model/gamesystems/Gamesystem";
|
|||||||
import {State} from "../project/game-model/gamesystems/states/State";
|
import {State} from "../project/game-model/gamesystems/states/State";
|
||||||
import {Transition} from "../project/game-model/gamesystems/transitions/Transition";
|
import {Transition} from "../project/game-model/gamesystems/transitions/Transition";
|
||||||
import {ModelComponentType} from "../project/game-model/ModelComponentType";
|
import {ModelComponentType} from "../project/game-model/ModelComponentType";
|
||||||
|
import {Character} from "../project/game-model/characters/Character";
|
||||||
|
import {TemplateType} from "../project/game-model/gamesystems/TemplateType";
|
||||||
|
import {load} from "@angular-devkit/build-angular/src/utils/server-rendering/esm-in-memory-loader/loader-hooks";
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@ -44,10 +47,20 @@ export class EditorComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
convertModelComponentToCharacter(modelComponent: ModelComponent) {
|
||||||
|
if(modelComponent instanceof Character) {
|
||||||
|
return modelComponent as Character
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
onModelNameUpdate() {
|
onModelNameUpdate() {
|
||||||
this.onModelNameUpdateEmitter.emit(true);
|
this.onModelNameUpdateEmitter.emit(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loadCharacterSpecificGamesystems() {
|
||||||
|
return this.gameModel!.gamesystems.filter(gamesystem => gamesystem.template == TemplateType.CHARACTER);
|
||||||
|
}
|
||||||
|
|
||||||
protected readonly ModelComponentType = ModelComponentType;
|
protected readonly ModelComponentType = ModelComponentType;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import {Component, Input, OnInit} from '@angular/core';
|
import {Component, EventEmitter, Input, OnChanges, OnInit, Output} from '@angular/core';
|
||||||
import {MatTableDataSource} from "@angular/material/table";
|
import {MatTableDataSource} from "@angular/material/table";
|
||||||
import {animate, state, style, transition, trigger} from "@angular/animations";
|
import {animate, state, style, transition, trigger} from "@angular/animations";
|
||||||
import {MatSnackBar} from "@angular/material/snack-bar";
|
import {MatSnackBar} from "@angular/material/snack-bar";
|
||||||
@ -6,6 +6,7 @@ import {SimpleState} from "../../../../project/game-model/gamesystems/states/Sim
|
|||||||
import {SimpleGamesystem} from "../../../../project/game-model/gamesystems/SimpleGamesystem";
|
import {SimpleGamesystem} from "../../../../project/game-model/gamesystems/SimpleGamesystem";
|
||||||
import {ScriptAccount} from "../../../../project/game-model/scriptAccounts/ScriptAccount";
|
import {ScriptAccount} from "../../../../project/game-model/scriptAccounts/ScriptAccount";
|
||||||
import {ScriptAccountCondition} from "../../../../project/game-model/gamesystems/conditions/ScriptAccountCondition";
|
import {ScriptAccountCondition} from "../../../../project/game-model/gamesystems/conditions/ScriptAccountCondition";
|
||||||
|
import {TemplateGamesystem} from "../../../../project/game-model/gamesystems/TemplateGamesystem";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-simple-state-editor',
|
selector: 'app-simple-state-editor',
|
||||||
@ -19,11 +20,12 @@ import {ScriptAccountCondition} from "../../../../project/game-model/gamesystems
|
|||||||
]),
|
]),
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
export class SimpleStateEditorComponent implements OnInit{
|
export class SimpleStateEditorComponent implements OnInit, OnChanges{
|
||||||
|
|
||||||
@Input() states: SimpleState[] = [];
|
@Input() states: SimpleState[] = [];
|
||||||
@Input() gamesystem: SimpleGamesystem | undefined
|
@Input() gamesystem: SimpleGamesystem | undefined
|
||||||
@Input() scriptAccounts: ScriptAccount[] = []
|
@Input() scriptAccounts: ScriptAccount[] = []
|
||||||
|
@Output() onExtractReferenceState = new EventEmitter<SimpleState>()
|
||||||
dataSource = new MatTableDataSource<SimpleState>();
|
dataSource = new MatTableDataSource<SimpleState>();
|
||||||
displayedColumns = ["name", "initial", "edit", "delete"];
|
displayedColumns = ["name", "initial", "edit", "delete"];
|
||||||
columnsToDisplayWithExpand = [...this.displayedColumns, 'expand'];
|
columnsToDisplayWithExpand = [...this.displayedColumns, 'expand'];
|
||||||
@ -40,13 +42,30 @@ export class SimpleStateEditorComponent implements OnInit{
|
|||||||
this.dataSource.filterPredicate = (data: SimpleState, filter: string) => {
|
this.dataSource.filterPredicate = (data: SimpleState, filter: string) => {
|
||||||
return data.stateLabel.toLowerCase().includes(filter);
|
return data.stateLabel.toLowerCase().includes(filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(this.gamesystem == undefined) {
|
||||||
|
this.displayedColumns = this.displayedColumns.slice(0, -1);
|
||||||
|
this.columnsToDisplayWithExpand = [... this.displayedColumns, 'expand']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnChanges() {
|
||||||
|
this.dataSource.data = this.states;
|
||||||
|
this.dataSource.filterPredicate = (data: SimpleState, filter: string) => {
|
||||||
|
return data.stateLabel.toLowerCase().includes(filter);
|
||||||
|
}
|
||||||
|
console.log(this.states.length)
|
||||||
}
|
}
|
||||||
|
|
||||||
editState(state: SimpleState) {
|
editState(state: SimpleState) {
|
||||||
if(this.editedElement === state) {
|
if(this.gamesystem == undefined) {
|
||||||
this.editedElement = null;
|
this.onExtractReferenceState.emit(state)
|
||||||
} else {
|
} else {
|
||||||
this.editedElement = state;
|
if(this.editedElement === state) {
|
||||||
|
this.editedElement = null;
|
||||||
|
} else {
|
||||||
|
this.editedElement = state;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
<app-template-state-editor [templateGamesystem]="gamesystem"></app-template-state-editor>
|
@ -0,0 +1,23 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { TemplateGamesystemEditorComponent } from './template-gamesystem-editor.component';
|
||||||
|
|
||||||
|
describe('TemplateGamesystemEditorComponent', () => {
|
||||||
|
let component: TemplateGamesystemEditorComponent;
|
||||||
|
let fixture: ComponentFixture<TemplateGamesystemEditorComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
imports: [TemplateGamesystemEditorComponent]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
|
||||||
|
fixture = TestBed.createComponent(TemplateGamesystemEditorComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,17 @@
|
|||||||
|
import {Component, Input} from '@angular/core';
|
||||||
|
import {SimpleGamesystem} from "../../../project/game-model/gamesystems/SimpleGamesystem";
|
||||||
|
import {ScriptAccount} from "../../../project/game-model/scriptAccounts/ScriptAccount";
|
||||||
|
import {Gamesystem} from "../../../project/game-model/gamesystems/Gamesystem";
|
||||||
|
import {ProductGamesystem} from "../../../project/game-model/gamesystems/ProductGamesystem";
|
||||||
|
import {TemplateGamesystem} from "../../../project/game-model/gamesystems/TemplateGamesystem";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-template-gamesystem-editor',
|
||||||
|
templateUrl: './template-gamesystem-editor.component.html',
|
||||||
|
styleUrl: './template-gamesystem-editor.component.scss'
|
||||||
|
})
|
||||||
|
export class TemplateGamesystemEditorComponent {
|
||||||
|
@Input() gamesystem: TemplateGamesystem | undefined
|
||||||
|
@Input() scriptAccunts: ScriptAccount[] = []
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,91 @@
|
|||||||
|
<div class="state-editor-container">
|
||||||
|
<div class="template-editor">
|
||||||
|
<mat-card>
|
||||||
|
<mat-card-content>
|
||||||
|
<mat-form-field appearance="fill" class="long-form">
|
||||||
|
<mat-label>Filter</mat-label>
|
||||||
|
<input matInput (keyup)="applyFilter($event)" placeholder="Filter" #input>
|
||||||
|
</mat-form-field>
|
||||||
|
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8" multiTemplateDataRows>
|
||||||
|
<ng-container matColumnDef="name">
|
||||||
|
<th mat-header-cell *matHeaderCellDef>Label</th>
|
||||||
|
<td mat-cell *matCellDef="let state">
|
||||||
|
{{state.stateLabel}}
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->
|
||||||
|
<ng-container matColumnDef="expandedDetail">
|
||||||
|
<td mat-cell *matCellDef="let element" [attr.colspan]="columnsToDisplayWithExpand.length">
|
||||||
|
<div class="example-element-detail" [@detailExpand]="element == expandedElement ? 'expanded' : 'collapsed'">
|
||||||
|
<p>{{element.stateDescription}}</p>
|
||||||
|
|
||||||
|
<div class="long-form">
|
||||||
|
<app-scriptaccount-condition-editor [conditions]="element.conditions" [scriptAccounts]="scriptAccounts" [enableEditiong]="true"
|
||||||
|
(onCreateCondition)="onCreateCondition(element, $event)" (onDeleteCondition)="deleteCondition(element, $event)"></app-scriptaccount-condition-editor>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<ng-container matColumnDef="initial">
|
||||||
|
<th mat-header-cell *matHeaderCellDef>Initial</th>
|
||||||
|
<td mat-cell *matCellDef="let state">
|
||||||
|
<div *ngIf="editedElement !== state">
|
||||||
|
<mat-icon *ngIf="state.initial">done</mat-icon>
|
||||||
|
<mat-icon *ngIf="!state.initial">close</mat-icon>
|
||||||
|
</div>
|
||||||
|
<mat-checkbox *ngIf="editedElement === state" [(ngModel)]="state.initial"></mat-checkbox>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="edit">
|
||||||
|
<th mat-header-cell *matHeaderCellDef></th>
|
||||||
|
<td mat-cell *matCellDef="let state">
|
||||||
|
<button mat-icon-button class="icon-btn-primary" *ngIf="editedElement !== state" [disabled]="editedElement !== null" (click)="onEditState(state)"><mat-icon>edit</mat-icon></button>
|
||||||
|
<button mat-icon-button class="icon-btn-primary" *ngIf="editedElement === state" (click)="onEditState(state)"><mat-icon>done</mat-icon></button>
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="delete">
|
||||||
|
<th mat-header-cell *matHeaderCellDef></th>
|
||||||
|
<td mat-cell *matCellDef="let state">
|
||||||
|
<button mat-icon-button color="warn" (click)="onDeleteState(state)"><mat-icon>delete</mat-icon></button>
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container matColumnDef="expand">
|
||||||
|
<th mat-header-cell *matHeaderCellDef aria-label="row actions">
|
||||||
|
</th>
|
||||||
|
<td mat-cell *matCellDef="let element">
|
||||||
|
<button mat-icon-button aria-label="expand row" (click)="(expandedElement = expandedElement === element ? null : element); $event.stopPropagation()">
|
||||||
|
@if (expandedElement === element) {
|
||||||
|
<mat-icon>keyboard_arrow_up</mat-icon>
|
||||||
|
} @else {
|
||||||
|
<mat-icon>keyboard_arrow_down</mat-icon>
|
||||||
|
}
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<tr mat-header-row *matHeaderRowDef="columnsToDisplayWithExpand"></tr>
|
||||||
|
<tr mat-row *matRowDef="let element; columns: columnsToDisplayWithExpand;"
|
||||||
|
class="example-element-row"
|
||||||
|
[class.example-expanded-row]="expandedElement === element"
|
||||||
|
(click)="expandedElement = expandedElement === element ? null : element">
|
||||||
|
</tr>
|
||||||
|
<tr mat-row *matRowDef="let row; columns: ['expandedDetail']" class="example-detail-row"></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</mat-card-content>
|
||||||
|
</mat-card>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="reference-editor">
|
||||||
|
<app-simple-state-editor [states]="templateGamesystem!.referenceGamesystem.states"
|
||||||
|
(onExtractReferenceState)="onExtractReferenceState($event)"></app-simple-state-editor>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -0,0 +1,65 @@
|
|||||||
|
.state-editor-container {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.example-detail-row {
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.example-element-row:not(.example-expanded-row):hover {
|
||||||
|
background: #545456
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.example-element-row:not(.example-expanded-row):active {
|
||||||
|
background: #545456;
|
||||||
|
}
|
||||||
|
|
||||||
|
.example-element-row td {
|
||||||
|
border-bottom-width: 0;
|
||||||
|
}
|
||||||
|
.example-element-diagram {
|
||||||
|
min-width: 80px;
|
||||||
|
border: 2px solid black;
|
||||||
|
padding: 8px;
|
||||||
|
font-weight: lighter;
|
||||||
|
margin: 8px 0;
|
||||||
|
height: 104px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.example-element-symbol {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 40px;
|
||||||
|
line-height: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.example-element-description {
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.example-element-description-attribution {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mat-column-edit, .mat-column-delete, .mat-column-expand {
|
||||||
|
width: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.long-form {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mat-error {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.warning-icon {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.reference-editor, .template-editor {
|
||||||
|
width: 50%;
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { TemplateStateEditorComponent } from './template-state-editor.component';
|
||||||
|
|
||||||
|
describe('TemplateStateEditorComponent', () => {
|
||||||
|
let component: TemplateStateEditorComponent;
|
||||||
|
let fixture: ComponentFixture<TemplateStateEditorComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
imports: [TemplateStateEditorComponent]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
|
||||||
|
fixture = TestBed.createComponent(TemplateStateEditorComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,65 @@
|
|||||||
|
import {Component, Input, ViewChild} from '@angular/core';
|
||||||
|
import {SimpleState} from "../../../../project/game-model/gamesystems/states/SimpleState";
|
||||||
|
import {TemplateGamesystem} from "../../../../project/game-model/gamesystems/TemplateGamesystem";
|
||||||
|
import {SimpleStateEditorComponent} from "../../state-editor/simple-state-editor/simple-state-editor.component";
|
||||||
|
import {animate, state, style, transition, trigger} from "@angular/animations";
|
||||||
|
import {ScriptAccount} from "../../../../project/game-model/scriptAccounts/ScriptAccount";
|
||||||
|
import {MatTableDataSource} from "@angular/material/table";
|
||||||
|
import {ScriptAccountCondition} from "../../../../project/game-model/gamesystems/conditions/ScriptAccountCondition";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-template-state-editor',
|
||||||
|
templateUrl: './template-state-editor.component.html',
|
||||||
|
styleUrl: './template-state-editor.component.scss',
|
||||||
|
animations: [
|
||||||
|
trigger('detailExpand', [
|
||||||
|
state('collapsed,void', style({height: '0px', minHeight: '0'})),
|
||||||
|
state('expanded', style({height: '*'})),
|
||||||
|
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
|
||||||
|
]),
|
||||||
|
],
|
||||||
|
})
|
||||||
|
export class TemplateStateEditorComponent {
|
||||||
|
|
||||||
|
@Input() templateGamesystem: TemplateGamesystem | undefined
|
||||||
|
@Input() scriptAccounts: ScriptAccount[] = []
|
||||||
|
|
||||||
|
dataSource = new MatTableDataSource<SimpleState>();
|
||||||
|
displayedColumns = ["name", "initial", "edit", "delete"];
|
||||||
|
columnsToDisplayWithExpand = [...this.displayedColumns, 'expand'];
|
||||||
|
expandedElement: SimpleState | null = null;
|
||||||
|
editedElement: SimpleState | null = null;
|
||||||
|
|
||||||
|
editedStateLabelError: boolean = false;
|
||||||
|
|
||||||
|
onExtractReferenceState(state: SimpleState) {
|
||||||
|
this.templateGamesystem!.addReferenceState(state)
|
||||||
|
this.dataSource.data = this.templateGamesystem!.templateStates
|
||||||
|
}
|
||||||
|
|
||||||
|
applyFilter(event: KeyboardEvent) {
|
||||||
|
const filterValue = (event.target as HTMLInputElement).value;
|
||||||
|
this.dataSource.filter = filterValue.trim().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
onCreateCondition(state: SimpleState, $event: ScriptAccountCondition) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
onEditState(state: SimpleState) {
|
||||||
|
if(this.editedElement == null) {
|
||||||
|
this.editedElement = state
|
||||||
|
} else {
|
||||||
|
this.editedElement = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onDeleteState(state: SimpleState) {
|
||||||
|
this.templateGamesystem!.templateStates = this.templateGamesystem!.templateStates.filter(templateState => templateState.stateLabel !== state.stateLabel)
|
||||||
|
this.dataSource.data = this.templateGamesystem!.templateStates
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteCondition(state: SimpleState, $event: ScriptAccountCondition) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
22
src/app/project/game-model/gamesystems/TemplateGamesystem.ts
Normal file
22
src/app/project/game-model/gamesystems/TemplateGamesystem.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import {SimpleGamesystem} from "./SimpleGamesystem";
|
||||||
|
import {TemplateState} from "./states/TemplateState";
|
||||||
|
import {SimpleState} from "./states/SimpleState";
|
||||||
|
import {ScriptAccountCondition} from "./conditions/ScriptAccountCondition";
|
||||||
|
|
||||||
|
export class TemplateGamesystem {
|
||||||
|
referenceGamesystem: SimpleGamesystem
|
||||||
|
|
||||||
|
templateStates: SimpleState[] = []
|
||||||
|
|
||||||
|
|
||||||
|
constructor(referenceGamesystem: SimpleGamesystem) {
|
||||||
|
this.referenceGamesystem = referenceGamesystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
addReferenceState(referenceState: SimpleState) {
|
||||||
|
const templateState = new SimpleState(referenceState.stateLabel, referenceState.stateDescription);
|
||||||
|
templateState.conditions = referenceState.conditions.map(condition =>
|
||||||
|
ScriptAccountCondition.constructScriptAccountCondition(condition.scriptAccount, condition.minValue, condition.maxValue)!)
|
||||||
|
this.templateStates.push(templateState)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
import {Transition} from "../transitions/Transition";
|
||||||
|
import {SimpleState} from "./SimpleState";
|
||||||
|
import {ScriptAccountCondition} from "../conditions/ScriptAccountCondition";
|
||||||
|
|
||||||
|
export class TemplateState {
|
||||||
|
referenceState: SimpleState
|
||||||
|
conditions: ScriptAccountCondition[]
|
||||||
|
|
||||||
|
|
||||||
|
constructor(referenceState: SimpleState, conditions: ScriptAccountCondition[]) {
|
||||||
|
this.referenceState = referenceState;
|
||||||
|
this.conditions = conditions;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user