Commit d60f986d authored by Christopher Keim's avatar Christopher Keim
Browse files

[TOB-218] feat: Add department selection to workflow data form



 * Add SelectGroupComponent and a common control class
 * Reorganize shared modules
 * Add a collapsible container component
 * Add back end calls for workflow data
 * Add typed builder for form groups
 * Add debug site for edit page
 * Add component for workflow data
 * Add workflow form to edit page portal
 * Add translations

[TOB-190] fix: Use proper lazy loading

 * Use more direct import paths
 * Preload all modules on application start

[TOB-134, TOB-195] feat: Add process diagram and history to details

 * Install bpmn.js
 * Add component to display bpmn diagram
 * Add a component to display process history table
 * Add global styling to mat-table
 * Add back end calls for process information
 * Integrate process information into store
 * Integrate process information into details view

[TOB-28] feat: Add comments to workflow data form

 * Add UI component to display and write comments
 * Add back end calls for comments
 * Integrate comments into store
 * Add output to collapsible component
 * Integrate comments into main pages
 * Use constant for displayed time format
 * Add translations

[TOB-163] test: Increase test coverage

 * Adjust util functions for better testing
 * Reorganize store structure for better testing
 * Reorganize effects in statements store
 * Send proper body when submitting workflow form
 * Add tests for statement reducers
 * Add tests for statement selectors
 * Add tests for CommentEffect
 * Add tests for SubmitWorkflowFormEffect
Signed-off-by: Christopher Keim's avatarChristopher Keim <keim@develop-group.de>
parent 4c9248e5
......@@ -103,6 +103,10 @@ The project maintains the following source code repositories:
* License: MIT
* Source: https://github.com/ngx-translate/http-loader
bpmn-js (6.5.1)
* License: bpmn.io License (https://bpmn.io/license)
* Source: https://github.com/bpmn-io/bpmn-js
leaflet (1.6.0)
* License: BSD-2-Clause
* Source: https://github.com/Leaflet/Leaflet
......
......@@ -4590,6 +4590,33 @@
}
}
},
"bpmn-js": {
"version": "6.5.1",
"resolved": "https://registry.npmjs.org/bpmn-js/-/bpmn-js-6.5.1.tgz",
"integrity": "sha512-qmxY+vaFndUa4e65WMjSMUVPDz0qAc79JHODJoLXJBklSS5XatUfqzKR6UGfeT7s0IGA7qje1afMVKMz4YJsEw==",
"requires": {
"bpmn-moddle": "^6.0.6",
"css.escape": "^1.5.1",
"diagram-js": "^6.6.1",
"diagram-js-direct-editing": "^1.6.1",
"ids": "^1.0.0",
"inherits": "^2.0.1",
"min-dash": "^3.5.1",
"min-dom": "^3.1.2",
"object-refs": "^0.3.0",
"tiny-svg": "^2.2.1"
}
},
"bpmn-moddle": {
"version": "6.0.7",
"resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-6.0.7.tgz",
"integrity": "sha512-MD649c7/I7+AKl3OGLs8ed8guzKuIRIJhOvLeVBSyCHtd41iB8ZRi+NL2UeC8pNgpqcjMsZG3ye++x3fh6MQ+g==",
"requires": {
"min-dash": "^3.0.0",
"moddle": "^5.0.1",
"moddle-xml": "^8.0.8"
}
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
......@@ -5405,6 +5432,11 @@
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
"dev": true
},
"component-event": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/component-event/-/component-event-0.1.4.tgz",
"integrity": "sha1-PeePwoeCOBeH4kvyp8U2vwFCybQ="
},
"component-inherit": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
......@@ -6012,6 +6044,11 @@
"integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==",
"dev": true
},
"css.escape": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
"integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s="
},
"cssauron": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz",
......@@ -6476,6 +6513,36 @@
"integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
"dev": true
},
"diagram-js": {
"version": "6.6.1",
"resolved": "https://registry.npmjs.org/diagram-js/-/diagram-js-6.6.1.tgz",
"integrity": "sha512-3SlXwT2ieXCZkQn8dVZWfNry9+6d4R+0Q57Oz9t/SfIyNIrRPg0c9IlsaTHpGUhPE3fossXPDjmvqjJD0lmBLw==",
"requires": {
"css.escape": "^1.5.1",
"didi": "^4.0.0",
"hammerjs": "^2.0.1",
"inherits": "^2.0.1",
"min-dash": "^3.5.0",
"min-dom": "^3.1.2",
"object-refs": "^0.3.0",
"path-intersection": "^2.2.0",
"tiny-svg": "^2.2.1"
}
},
"diagram-js-direct-editing": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/diagram-js-direct-editing/-/diagram-js-direct-editing-1.6.1.tgz",
"integrity": "sha512-FOW2qp7yT/L3Go/YfBOfnWrV2pc2PPoTSSRIg2nnld8pQDTnMaqKPva9GZEoCtcTJzPV4ctZX52ZdkJ3C7aWaA==",
"requires": {
"min-dash": "^3.0.0",
"min-dom": "^3.0.0"
}
},
"didi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/didi/-/didi-4.0.0.tgz",
"integrity": "sha512-AzMElh8mCHOPWPCWfGjoJRla31fMXUT6+287W5ef3IPmtuBcyG9+MkFS7uPP6v3t2Cl086KwWfRB9mESa0OsHQ=="
},
"diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
......@@ -6603,6 +6670,11 @@
"domelementtype": "1"
}
},
"domify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/domify/-/domify-1.4.0.tgz",
"integrity": "sha1-EUg2F/dk+GlZdbS9x5sU8IA7Yps="
},
"domutils": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
......@@ -8211,6 +8283,11 @@
"pify": "^4.0.1"
}
},
"hammerjs": {
"version": "2.0.8",
"resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz",
"integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE="
},
"handle-thing": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
......@@ -8902,6 +8979,11 @@
"postcss": "^7.0.14"
}
},
"ids": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ids/-/ids-1.0.0.tgz",
"integrity": "sha512-Zvtq1xUto4LttpstyOlFum8lKx+i1OmRfg+6A9drFS9iSZsDPMHG4Sof/qwNR4kCU7jBeWFPrY2ocHxiz7cCRw=="
},
"ieee754": {
"version": "1.1.13",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
......@@ -9013,8 +9095,7 @@
"indexof": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
"integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
"dev": true
"integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
},
"infer-owner": {
"version": "1.0.4",
......@@ -9035,8 +9116,7 @@
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ini": {
"version": "1.3.5",
......@@ -10544,6 +10624,11 @@
"unquote": "^1.1.0"
}
},
"matches-selector": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/matches-selector/-/matches-selector-1.2.0.tgz",
"integrity": "sha512-c4vLwYWyl+Ji+U43eU/G5FwxWd4ZH0ePUsFs5y0uwD9HUEFBXUQ1zUUan+78IpRD+y4pUfG0nAzNM292K7ItvA=="
},
"material-colors": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz",
......@@ -10860,6 +10945,11 @@
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true
},
"min-dash": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/min-dash/-/min-dash-3.5.2.tgz",
"integrity": "sha512-YVbJZUtnzT5QsgJUp9H9uyJTW6NJgswFqI27RI/+MSox860uIjaGMbSQBftEzbMXiJVRG24hpoIh3SG666SHgA=="
},
"min-document": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
......@@ -10869,6 +10959,17 @@
"dom-walk": "^0.1.0"
}
},
"min-dom": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/min-dom/-/min-dom-3.1.3.tgz",
"integrity": "sha512-Lbi1NZjLV9Hg6/bEe2Lfk2Fzsv1MwheR61whqTLP+FxLndYo9TxpksEgM5Kr1khjfCtFTMr0waeEfwIpStkRdw==",
"requires": {
"component-event": "^0.1.4",
"domify": "^1.3.1",
"indexof": "0.0.1",
"matches-selector": "^1.2.0"
}
},
"min-indent": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz",
......@@ -11101,6 +11202,24 @@
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
"dev": true
},
"moddle": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/moddle/-/moddle-5.0.1.tgz",
"integrity": "sha512-RB9NCYxbnQLiY1ZJ8Y61+I8TBEmmyaMr8Tj0+fJHN8Fm6l5NqojDy1s4LNDxq+omvug4gnzERMgT8uwNsADDvw==",
"requires": {
"min-dash": "^3.0.0"
}
},
"moddle-xml": {
"version": "8.0.8",
"resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-8.0.8.tgz",
"integrity": "sha512-JzW8wUCH7Qze7eh0T8A1exi7QJg6hRgq+uw8goHNP5Q7pWTGrLj83S+NgA/94M2I0JmqnK9hw3sCbyiKVOjc4Q==",
"requires": {
"min-dash": "^3.0.0",
"moddle": "^5.0.1",
"saxen": "^8.1.2"
}
},
"moment": {
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
......@@ -11513,6 +11632,11 @@
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true
},
"object-refs": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/object-refs/-/object-refs-0.3.0.tgz",
"integrity": "sha512-eP0ywuoWOaDoiake/6kTJlPJhs+k0qNm4nYRzXLNHj6vh+5M3i9R1epJTdxIPGlhWc4fNRQ7a6XJNCX+/L4FOQ=="
},
"object-visit": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
......@@ -12079,6 +12203,11 @@
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
"dev": true
},
"path-intersection": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/path-intersection/-/path-intersection-2.2.0.tgz",
"integrity": "sha512-1qchRuLKhRt3qYePf9CU/74fLrBo9OTiKYNn5fxfuHJW6kTThEk04ql7w8JwOgZjNANAGp1052tWGpwZ7ItNRA=="
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
......@@ -15651,6 +15780,11 @@
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true
},
"saxen": {
"version": "8.1.2",
"resolved": "https://registry.npmjs.org/saxen/-/saxen-8.1.2.tgz",
"integrity": "sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw=="
},
"scheduler": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
......@@ -17833,6 +17967,11 @@
"dev": true,
"optional": true
},
"tiny-svg": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-2.2.2.tgz",
"integrity": "sha512-u6zCuMkDR/3VAh83X7hDRn/pi0XhwG2ycuNS0cTFtQjGdOG2tSvEb8ds65VeGWc3H6PUjJKeunueXqgkZqtMsg=="
},
"tinycolor2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz",
......
{
"name": "openkonsequenz-statement-public-affairs",
"version": "0.3.0",
"version": "0.4.0",
"description": "Statement Public Affairs",
"license": "Eclipse Public License - v 2.0",
"routes": {
......@@ -10,9 +10,9 @@
},
"scripts": {
"-- Build ----------------": "",
"build": "ng build --prod --base-href $npm_package_routes_spaFrontend/",
"build": "ng build --prod --base-href /statementpaFE/",
"build:archive": "jar -cvf ./dist/statement-public-affairs-frontend.war -C ./dist/statement-public-affairs .",
"build:stats": "ng build --prod --base-href $npm_package_routes_spaFrontend/ --statsJson true",
"build:stats": "npm run build -- --statsJson true",
"build:stats:analyze": "webpack-bundle-analyzer ./dist/statement-public-affairs/stats-es2015.json",
"-- Development ----------": "",
"start": "ng serve",
......@@ -50,6 +50,7 @@
"@ngrx/store": "^9.0.0",
"@ngx-translate/core": "^12.1.2",
"@ngx-translate/http-loader": "^4.0.0",
"bpmn-js": "^6.5.1",
"leaflet": "^1.6.0",
"material-design-icons": "^3.0.1",
"moment": "2.24.0",
......
......@@ -12,7 +12,7 @@
********************************************************************************/
import {NgModule} from "@angular/core";
import {RouterModule, Routes} from "@angular/router";
import {PreloadAllModules, RouterModule, Routes} from "@angular/router";
export const appRoutes: Routes = [
{
......@@ -20,16 +20,16 @@ export const appRoutes: Routes = [
loadChildren: () => import("./features/dashboard")
.then((m) => m.DashboardModule)
},
{
path: "new",
loadChildren: () => import("./features/new")
.then((m) => m.NewStatementModule)
},
{
path: "details",
loadChildren: () => import("./features/details")
.then((m) => m.StatementDetailsModule)
},
{
path: "new",
loadChildren: () => import("./features/new")
.then((m) => m.NewStatementModule)
},
{
path: "edit",
loadChildren: () => import("./features/edit")
......@@ -43,7 +43,7 @@ export const appRoutes: Routes = [
];
@NgModule({
imports: [RouterModule.forRoot(appRoutes)],
imports: [RouterModule.forRoot(appRoutes, {preloadingStrategy: PreloadAllModules})],
exports: [RouterModule]
})
export class AppRoutingModule {
......
......@@ -19,7 +19,7 @@ import {environment} from "../environments/environment";
import {AppRoutingModule} from "./app-routing.module";
import {AppComponent} from "./app.component";
import {CoreModule} from "./core";
import {AppNavigationFrameModule} from "./features";
import {AppNavigationFrameModule} from "./features/navigation";
import {AppStoreModule} from "./store";
@NgModule({
......
......@@ -19,3 +19,10 @@ export interface IAPIProcessObject {
| { type: "Number", value: number };
}
export type _IAPIProcessObject =
| { [key: string]: IAPIProcessObject }
| { [key: string]: { type: "Boolean", value: boolean } }
| { [key: string]: { type: "String", value: string } }
| { [key: string]: { type: "Number", value: number } };
/********************************************************************************
* Copyright (c) 2020 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
/********************************************************************************
* Copyright (c) 2020 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
export interface IAPIStatementHistory {
processName: string;
processVersion: number;
finishedProcessActivities: IAPIProcessActivity[];
currentProcessActivities: IAPIProcessActivity[];
}
export interface IAPIProcessActivity {
id: string;
activityId: string;
activityName: string;
activityType: string;
assignee: string;
startTime: string;
endTime: string;
durationInMillis: number;
processDefinitionKey: string;
processDefinitionId: string;
canceled: boolean;
completeScope: boolean;
tenantId: string;
}
......@@ -11,6 +11,8 @@
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
export * from "./IAPIStatementHistory";
export * from "./IAPIProcessTask";
export * from "./IAPIProcessObject";
export * from "./process-api.service";
......@@ -17,6 +17,7 @@ import {urlJoin} from "../../../util";
import {SPA_BACKEND_ROUTE} from "../../external-routes";
import {IAPIProcessObject} from "./IAPIProcessObject";
import {IAPIProcessTask} from "./IAPIProcessTask";
import {IAPIStatementHistory} from "./IAPIStatementHistory";
@Injectable({
providedIn: "root"
......@@ -69,4 +70,14 @@ export class ProcessApiService {
return this.httpClient.post<void>(urlJoin(this.baseUrl, endPoint), body);
}
public getStatementHistory(statementId: number) {
const endPoint = `/process/statements/${statementId}/history`;
return this.httpClient.get<IAPIStatementHistory>(urlJoin(this.baseUrl, endPoint));
}
public getStatementProcessDiagram(statementId: number) {
const endPoint = `/process/statements/${statementId}/workflowmodel`;
return this.httpClient.get(urlJoin(this.baseUrl, endPoint), {responseType: "text"});
}
}
/********************************************************************************
* Copyright (c) 2020 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
/**
* Interface which models the configuration object of all departments assignable to a statement.
*/
export interface IAPIDepartmentsConfiguration {
/**
* Object which contains all available department groups.
*/
allDepartments: IAPIDepartmentGroups;
/**
* Object which contains the preselection of the department groups.
*/
suggestedDepartments: IAPIDepartmentGroups;
}
/**
* Interface which models a set of department groups.
* Each key represents a group of departments and references a string array with the names of the
* departments contained in the group. The values in such an array are unique per group, but not
* necessarily unique in the overall structure.
*/
export interface IAPIDepartmentGroups {
[groupName: string]: string[];
}
......@@ -11,10 +11,18 @@
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
/**
* Interface which models a statement type.
*/
export interface IAPIStatementType {
/**
* Unique ID of a specific satement type in the back end data base.
*/
id: number;
/**
* Name of a specific statement type which is used for display.
*/
name: string;
}
......@@ -11,5 +11,7 @@
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
export * from "./IAPIDepartmentsConfiguration";
export * from "./IAPIStatementType";
export * from "./settings-api.service";
......@@ -15,6 +15,7 @@ import {HttpClient} from "@angular/common/http";
import {Inject, Injectable} from "@angular/core";
import {urlJoin} from "../../../util";
import {SPA_BACKEND_ROUTE} from "../../external-routes";
import {IAPIDepartmentsConfiguration} from "./IAPIDepartmentsConfiguration";
import {IAPIStatementType} from "./IAPIStatementType";
@Injectable({
......@@ -30,12 +31,19 @@ export class SettingsApiService {
}
/**
* Fetches the version info from back end.
* Fetches the list of different statement types from the back end.
*/
public getStatementTypes() {
const endPoint = `statement-data/types`;
return this.httpClient.get<IAPIStatementType[]>(urlJoin(this.baseUrl, endPoint));
}
/**
* Fetches the configuration of departments specific to a statement from the back end.
*/
public getDepartmentsConfiguration(statementId: number) {
const endPoint = `/process/statements/${statementId}/departmentconfig`;
return this.httpClient.get<IAPIDepartmentsConfiguration>(urlJoin(this.baseUrl, endPoint));
}
}
......@@ -11,14 +11,29 @@
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
/**
* Interface which represents the model of an uploaded attachment in the back end data base.
*/
export interface IAPIAttachmentModel {
/**
* Unique ID of a specifcic attachment.
*/
id: number;
/**
* Name which is used for display in the app.
*/
name: string;
/**
* Type of the attachment, e.g. a PDF or text file.
*/
type: string;
/**
* Size of a specific attachment in bytes.
*/
size: number;
timestamp: string;
......
/********************************************************************************
* Copyright (c) 2020 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
/**
* Model for a user comment in the back end data base
*/
export interface IAPICommentModel {
id: number;
text: string;
userName: string;
firstName: string;
lastName: string;
timestamp: string;
editable: boolean;
}
......@@ -11,6 +11,9 @@
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
/**
* Interface which represents the model of all basic information of a specific statement in the back end data base.
*/
export interface IAPIStatementModel {
id: number;
......
/********************************************************************************
* Copyright (c) 2020 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional