aboutsummaryrefslogtreecommitdiffstats
path: root/sdnr/wt/odlux/framework
diff options
context:
space:
mode:
Diffstat (limited to 'sdnr/wt/odlux/framework')
-rw-r--r--sdnr/wt/odlux/framework/README.md288
-rw-r--r--sdnr/wt/odlux/framework/package.json23
-rw-r--r--sdnr/wt/odlux/framework/pom.xml5
-rw-r--r--sdnr/wt/odlux/framework/src/components/material-table/columnModel.ts14
-rw-r--r--sdnr/wt/odlux/framework/src/components/material-table/index.tsx32
-rw-r--r--sdnr/wt/odlux/framework/src/components/material-table/tableFilter.tsx26
-rw-r--r--sdnr/wt/odlux/framework/src/components/titleBar.tsx3
-rw-r--r--sdnr/wt/odlux/framework/src/index.html2
-rw-r--r--sdnr/wt/odlux/framework/src/models/elasticSearch.ts21
9 files changed, 83 insertions, 331 deletions
diff --git a/sdnr/wt/odlux/framework/README.md b/sdnr/wt/odlux/framework/README.md
deleted file mode 100644
index 322450b34..000000000
--- a/sdnr/wt/odlux/framework/README.md
+++ /dev/null
@@ -1,288 +0,0 @@
-## Erste Schritte
-### Einrichtung der Arbeitsumgebung unter Linux
-1. NodeJS LTS installieren: [https://nodejs.org/en/](https://nodejs.org/en/)
-2. Yarn installieren: `sudo npm install -g yarn`
-3. Lerna installieren: `sudo yarn global add lerna`
-4. Arbeitsverzeichnis erstellen z.B. `~/work`
-5. In das Arbeitsverzeichnis wechseln cd `~/work`
-6. Repository klonen: `git clone https://adresse.des/reposerory`
-7. in der Verzeichnis `cd odlux` wechseln
-8. Lerna initialisieren npm parakete laden: `lerna bootstrap`
-
-### Einrichtung der Arbeitsumgebung unter Windows
-1. NodeJS LTS installieren: [https://nodejs.org/en/](https://nodejs.org/en/)
-2. Yarn installieren: `npm install -g yarn`
-3. Lerna installieren: `yarn global add lerna`
-4. Arbeitsverzeichnis erstellen z.B. `c:\work`
-5. In das Arbeitsverzeichnis wechseln cd `c:\work`
-6. Repository klonen: `git clone https://git-highstreet-technologies.com/highstreet/odlux.git`
-7. in der Verzeichnis `cd odlux` wechseln
-8. Lerna initialisieren npm parakete laden: `lerna bootstrap`
-
-### Anpassen an die Lokale Umgebung
-1. In das Framework Verzeichnis wechseln: `cd framework`
-2. Datei `webpack.config.js` bearbeiten
-3. Eintrag `devServer: { /* ... */ }` suchen
-4. Abschitt `proxy` suchen
-5. Alle Pfade, die von dem ODL-Backend verwendet werden sollen hinzufügen. Beispiel, wenn der Pfad `/api` auf `http://localhost:3001/api` zeigen soll ist folgen der Eintrag hinzuzufügen, wobei `http://localhost:3001` die Addresse des ODL Backends auf dem Computer ist:
- ```json
- devServer: {
- // ...
- proxy: {
- "/api": {
- target: "http://localhost:3001/api",
- secure: false
- }
- }
- }
- ```
-6. Diese Schritte sind für **ALLE** Anwendungen (App) im `apps`-Verzeichnis ebenfalls zu wiederholen.
-
-### Framework OHNE Anwendung starten
-1. In das Framework Verzeichnis wechseln: `cd framework`
-2. Project erstellen: `yarn run build` für Release oder `yarn run build:dev` für Entwicklungsversion
-3. Projekt sarten: `yarn start`
-4. Webbbrowser öffnen: `http://localhost:3100/
-
-H> **Hinweis:** Der Port kann in der Datei `webpack.config.js` im Abschitt `devServer` unter `public` ggf. angepaßt werden.
-
-### Anwendung einzeln starten
-1. Einmal das Framework erstellen (siehe vorheriger Abschitt)
-2. In das Verzeichnis der Anwendung wechseln: z.B. `cd apps/demoApp`
-3. Optional: Project erstellen: `yarn run build` für die Erstellung einer Release.
-4. Projekt sarten: `yarn start`
-5. Webbbrowser öffnen: `http://localhost:3100/
-
-H> **Hinweis:** Der Port kann in der Datei `webpack.config.js` im Abschitt `devServer` unter `public` ggf. angepaßt werden.
-
-T> **Profitip**: In der Datei `index.html` befindet sich der Aufruf zum laden der einzelnen Apps. Hier könnnen weitere Apps hinzugefügt werden. Dazu ist es allerdings erforderlich entsprechende Proxy Regeln für den Webpack-Dev-Server mit den jeweiligen Pfaden zu erstellen, so dass die Module gefunden werden können.
-
-## Eigene Anwendung erstellen
-### Kopieren der Schablone
-Zur Zeit gibt es noch keine automatisierte Schablone oder Maven Artefakt Vorlage, die automatisch eine neue Anwendung erstellt. Aus diesem Grund ist der einfachste Weg, die Muster App `demoApp` unter `apps` zu kopieren.
-
-Anschließend sind die folgenden Anpassungen vorzunehmen.
-
-1. Mindestens **Name**, **Version** und **Beschreibung** in der Datei `packages.json` anpassen : `"name": "@odlux/demo-app",`
- H> Hinweis: Anstelle von Großbuchstaben nur Bindestrich Buchstabe verwenden. demoApp wird zu demo-app.
-2. Datei `webpack.config.js` prüfen ob alle Backend Pfade koniguriert sind (siehe Anpassen der lokalen Umgebung)
-3. Name des Modules in der Webpack-Config anpassen (demoApp). Dieser wird gefolgt von dem Pfad zu der Einstiegsdatei (`./plugin.tsx`).
- ```js
- entry: {
- demoApp: ["./plugin.tsx"]
- },
- ```
- H> Hinweis: Keine Bindesriche oder Sonderzeichen verwenden.
-4. Optional kann in dem gleichen Eintrag festgelegt werden wie die Einstiegsdatei für dieses Module / diese App heißen soll. Default ist `plugin.tsx`.
-5. In der Datei `index.html` ist das zu ladende Module (`demoApp`) auszutauschen, gegen das eigene Modul:
- ```js
- // run the application
- require(["app","demoApp"], function (app) {
- app("./app.tsx")
- });
- ```
- H> Hinweis: Der Name dieses Modules wurde in Schritt 3. festgelgt.
-
-### Anpassen der Konfiguration der App
-Die Konfiguration der neuen App erfolgt innerhalb der Einstiegsdatei(default: `plugin.tsx`). Hier wird der eindeutige Name, das Icon, der Titel der Menueintrag usw. festgelegt.
-
-1. Icon aus der Bibliothek `fontawsome 5` auswählen.
- ```ts
- import { faAddressBook } from '@fortawesome/free-solid-svg-icons';
- ```
-
-2. Anpassen der Registration der App in der Einstiegsdatei.
-Der eindeutige Name wird vom Framework verwendet, um die Apps voneinander zu unterscheiden. Das Icon wird für die Navigation und die Title-Leiste genutzt. Die Root-Komponente ist die äußrste Komponente dieser App. Der Menu-Eintrag ist optional um einen Namen für dieser App in der Navigation darzustellen.
- ```js
- applicationManager.registerApplication({
- name: "demoApp", // eindeutiger Name der App
- icon: faAddressBook, // Icon der App
- rootComponent: FinalApp, // Wurzelkomponente der App
- menuEntry: "Demo App" // Menu Eintrag
- });
- ```
-
-3. Wenn diese Application einen eigenen Action-Handler enthällt, so ist dieser ebenfalls zu konfigurieren. Die Erstellung von Action Handlern wird ein einem Seperatem Abschitt genauer betrachtet.
- ```js
- applicationManager.registerApplication({
- // ...
- rootActionHandler: demoAppRootHandler,
- });
- ```
-
-4. Wenn diese Application eigene Komponenten für andere Apps bereit stellen soll, so sind diese auch zu konfigurieren. Dabei ist der Schlüssel der Name mit dem später auf die Komponete zugegriffen werden kann, sowie der Wert die zu exportierende Komponente.
- ```js
- applicationManager.registerApplication({
- // ...
- exportedComponents: { counter: Counter },
- });
- ```
-
-5. Optional kann ein Pfad angegeben werden unter dem die App ereicht werden soll. Wird dieser nicht festgelegt wird der Name als Pfad genutzt.
- ```js
- applicationManager.registerApplication({
- // ...
- path: "demoApp",
- });
- ```
-
-Hier können z.B. URL-Parameter spezififiert werden, die der App übergeben werden sollen.
- ```js
- applicationManager.registerApplication({
- // ...
- path: "demoApp/:param1",
- });
- ```
-
-6. Abhänig davon ob die App einen oder mehrere URL Prameter bekommen soll sind diese als generische TypeParameter für die `RouteComponentProps` der `AppProps` mit anzugeben.
- ```ts
- // Beispiel ohne Parameter
- type AppProps = RouteComponentProps & Connect;
-
- // Beispiel mit einem Parameter
- type AppProps = RouteComponentProps<{ param1: number }> & Connect;
- ```
-
- 7. Wenn Sub-Routen innerhalb der App verwendet werden sollen, sind diese innerhalb der Root-Komponente anzugeben. Sonst kann direkt mit der Programmierung der Hauptansicht begonnne werden.
- ```ts
- const App = (props: AppProps) => (
- <Switch>
- <Route exact path={ `${ props.match.path }/authors` }
- component={AuthorsList} />
- <Route path={ `${ props.match.path }/authors/:authorId` }
- component={EditAuthor } />
- <Redirect to={ `${ props.match.path }/authors` } />
- </Switch>
- );
- ```
-8. In jedem Fall ist die App unter Verwendung von `withRouter` mit dem Router zu verbinden.
- ```ts
- const FinalApp = withRouter(connect()(App));
- ```
-
-### Erstellen der Datenmodelle bzw Dienste
-Alle Datenmodelle, die innerhalb dieser App verwendet werden sollen werden innerhalb des Ordners `models` bzw. in einem Unterordner in diesem Ordner erstellt. Beispiel: `Author` für die Darstellen von Autoren.
- ```ts
- /**
- * Represents an author.
- */
- export interface IAuthor {
- /**
- * Defines the unique id of the autor.
- */
- id: number;
-
- /**
- * Defines the first name of this author.
- */
- firstName: string;
-
- /**
- * Defines the last name of this author.
- */
- lastName: string;
- }
- ```
-
-Alle Dienste die diese App verwenden soll liegen in dem Ordner `services` oder einem darin befindlichem Unterordner. In der Aktuellen Version werden Dienste als **Singleton** erstellt. Dazu exportiert die Datei mit der Implementierung eine einzelne Instanz als `default`.
- ```ts
- class AuthorService {
- // ...
- }
- // return as a singleton
- export const authorService = new AuthorService();
- export default authorService;
- ```
-
-### Erstellen / Anpassen eigener Action-Handler
-Jede Application kann einen `Root-State` definieren, der alle Zustände speziell für diese App repräsentiert. Dieser sollte als Schnittstelle definiert werden mit dem Namen der sich aus I**AppName**StoreState zusammensetzt. Für die `demoApp` würde dieser also `IDemoAppStoreState` heißen.
- ```ts
- export interface IDemoAppStoreState {
- listAuthors: IListAuthors;
- editAuthor: IEditAuthor;
- }
- ```
-
-Es bietet sich an, diesesn **StoreState** innerhalb der Datei mit dem `Root-Action-Handler` zu erstellen. Der Name sieser Datei sollte aich wie folgt zusammen setzen **appName**RootHandler.ts im Verzeichnis `handlers`. Für die `demoApp` wäre das `demoAppRootHandler.ts`.
-
-Um mit der Typesicherheit von TypeScript auf den Gesamt-Anwendugs-Zustand korreckt zugreifen zu können, ist es erforderlich diesen innerhalb dieser Datei, um den Anwendungszustand der App wie folgt zu erweitern.
- ```ts
- declare module '../../../../framework/src/store/applicationStore' {
- interface IApplicationStoreState {
- demoApp: IDemoAppStoreState
- }
- }
- ```
-
-Sollte sich der Zusatand der App aus mehreren ActionHandlern zusammensetzen, so sind diese vor dem exportieren zu verbinden mit der Funktion `combineActionHandler` des Frameworks.
- ```ts
- const actionHandlers = {
- listAuthors: listAuthorsHandler,
- editAuthor: editAuthorHandler,
- };
-
- export const demoAppRootHandler = combineActionHandler <IDemoAppStoreState>(actionHandlers);
- export default demoAppRootHandler;
- ```
-
-## Bibliotheken
-Das O-D-L-UX Framework unterscheidt in Bibliotheken, die nur einer einzelnen App zugeordnet werden. Diese können nicht mit anderen Apps geteilt werden und müssen in jeder App seperat installiert werden. Was zur Folge hat, dass diese auch in dem Bundle jeder App enthalten sind.
-
-Sowie Bibliotheken, die zwischen alle Apps geteilt werden. Diese müssen nicht in jeder App installiert werden und sind auch nur einmal in dem Bundle des Frameworks vorhanden.
-
-### Hinzufügen einer geteilte Bibliothek
-Beispiele für geteilte Bibliotheken sind `react`, `react-dom`, `jQuery` oder `lodash`. Diese Bibliothek wird zunächst den Abhägnigkeiten der übergeordneten `package.json` Datei (im Root-Verzeichnis von O-D-L-UX) im Abschnitt `dependencies` hinzugefügt.
- ```json
- "dependencies": {
- "@types/react": "16.4.14",
- "@types/react-dom": "16.0.8",
- "@types/react-router-dom": "4.3.1",
- "@material-ui/core": "3.1.1",
- "@material-ui/icons": "3.0.1",
- "@types/classnames": "2.2.6",
- "@types/flux": "3.1.8",
- "@types/jquery": "3.3.10",
- "jquery": "3.3.1",
- "react": "16.5.2",
- "react-dom": "16.5.2",
- "react-router-dom": "4.3.1",
- "@fortawesome/react-fontawesome": "0.1.3",
- "@fortawesome/fontawesome-svg-core": "1.2.4",
- "@fortawesome/free-solid-svg-icons": "5.3.1",
- "jsonwebtoken": "8.3.0",
- "@types/jsonwebtoken": "7.2.8"
- },
- ```
-
-Anschließend werden die Abhägigkeiten, die jeweils für das Framework und/oder die App erforderlich sind in die `package.json` Datei des Frameworks bzw. der App in den Abschitt `peerDependencies` übernommen, die jeweils von den geteilten Abhänigkeiten erforderlich sind.
- ```json
- "peerDependencies": {
- "@types/react": "16.4.14",
- "@types/react-dom": "16.0.8",
- "@types/react-router-dom": "4.3.1",
- "@material-ui/core": "3.1.1",
- "@material-ui/icons": "3.0.1",
- "@types/classnames": "2.2.6",
- "@types/flux": "3.1.8",
- "@types/jquery": "3.3.10",
- "jquery": "3.3.1",
- "react": "16.5.2",
- "react-dom": "16.5.2",
- "react-router-dom": "4.3.1"
- }
- ```
-
-Nachdem **ALLE** erforderlichen Apps und das Framework mit der neuen Abhägnigkeit konfiguiert wurden wird der Befehl: `lerna bootstrap` ausgeführt, um die Abhägigkeiten herunter zu laden und bereit zu stellen für die Apps sowie das Framework.
-
-### Hinzufügen einer exclusiven Bibliothek
-Wenn eine App eine Bibiotjek verwenden solle, diese aber nicht mit den anderen Apps teilen soll, so ist diese Abhägigkeit nur in die `package.json` Datei des App in dem Abschnitt `dependencies`einzufügen.
- ```json
- "dependencies": {
- "object-assign": "3.2.1"
- }
- ```
-
-Auch in diesem Fall ist `lerna bootstrap` im Root-Verzeichnis von O-D-L-UX auszuführen.
-
-## Eigene Bibliothklen
-Eigene Bibliotheken können in einem jeweils in einem seperatem Projekt-Ordner unterhalb des `lib` Ordners entwickelt werden.
diff --git a/sdnr/wt/odlux/framework/package.json b/sdnr/wt/odlux/framework/package.json
index e71cca0de..51449b6f7 100644
--- a/sdnr/wt/odlux/framework/package.json
+++ b/sdnr/wt/odlux/framework/package.json
@@ -1,6 +1,6 @@
{
"name": "@odlux/framework",
- "version": "0.1.3",
+ "version": "0.1.4",
"description": "A react based modular UI framework",
"main": "index.js",
"scripts": {
@@ -24,26 +24,25 @@
"author": "Matthias Fischer",
"license": "MIT",
"peerDependencies": {
- "@fortawesome/fontawesome-svg-core": "1.2.12",
- "@fortawesome/free-solid-svg-icons": "5.6.3",
- "@fortawesome/react-fontawesome": "0.1.3",
+ "@types/react": "16.4.14",
+ "@types/react-dom": "16.0.8",
+ "@types/react-router-dom": "4.3.1",
"@material-ui/core": "3.8.3",
"@material-ui/icons": "3.0.2",
"@types/classnames": "2.2.6",
"@types/flux": "3.1.8",
"@types/jquery": "3.3.10",
- "@types/jsonwebtoken": "7.2.8",
- "@types/react": "16.4.14",
- "@types/react-dom": "16.0.8",
- "@types/react-router-dom": "4.3.1",
"jquery": "3.3.1",
- "jsonwebtoken": "8.3.0",
"react": "16.5.2",
"react-dom": "16.5.2",
- "react-router-dom": "4.3.1"
+ "react-router-dom": "4.3.1",
+ "@fortawesome/react-fontawesome": "0.1.3",
+ "@fortawesome/fontawesome-svg-core": "1.2.12",
+ "@fortawesome/free-solid-svg-icons": "5.6.3",
+ "jsonwebtoken": "8.3.0",
+ "@types/jsonwebtoken": "7.2.8"
},
"dependencies": {
- "http-server": "^0.11.1",
- "lerna": "^3.10.7"
+ "http-server": "^0.11.1"
}
}
diff --git a/sdnr/wt/odlux/framework/pom.xml b/sdnr/wt/odlux/framework/pom.xml
index 1c6867343..e60b6986d 100644
--- a/sdnr/wt/odlux/framework/pom.xml
+++ b/sdnr/wt/odlux/framework/pom.xml
@@ -44,6 +44,11 @@
<directory>../node_modules</directory>
<followSymlinks>false</followSymlinks>
</fileset>
+ <!-- eclipse bug build bin folder in basedir -->
+ <fileset>
+ <directory>bin</directory>
+ <followSymlinks>false</followSymlinks>
+ </fileset>
</filesets>
</configuration>
</plugin>
diff --git a/sdnr/wt/odlux/framework/src/components/material-table/columnModel.ts b/sdnr/wt/odlux/framework/src/components/material-table/columnModel.ts
index 6acea01d5..42a0bb4d8 100644
--- a/sdnr/wt/odlux/framework/src/components/material-table/columnModel.ts
+++ b/sdnr/wt/odlux/framework/src/components/material-table/columnModel.ts
@@ -4,17 +4,23 @@ import * as React from 'react';
export enum ColumnType {
text,
numeric,
+ boolean,
custom
}
type CustomControl<TData> = {
- rowData: TData
+ className?: string;
+ style?: React.CSSProperties;
+ rowData: TData;
}
export type ColumnModel<TData> = {
title?: string;
disablePadding?: boolean;
width?: string | number;
+ className?: string;
+ style?: React.CSSProperties;
+ align?: 'inherit' | 'left' | 'center' | 'right' | 'justify';
disableSorting?: boolean;
disableFilter?: boolean;
} & ({
@@ -23,5 +29,9 @@ export type ColumnModel<TData> = {
customControl: React.ComponentType<CustomControl<TData>>;
} | {
property: keyof TData;
- type?: ColumnType.numeric | ColumnType.text;
+ type: ColumnType.boolean;
+ labels?: { "true": string, "false": string };
+} | {
+ property: keyof TData;
+ type?: ColumnType.numeric | ColumnType.text;
}); \ No newline at end of file
diff --git a/sdnr/wt/odlux/framework/src/components/material-table/index.tsx b/sdnr/wt/odlux/framework/src/components/material-table/index.tsx
index 3b906cfbb..61a990d81 100644
--- a/sdnr/wt/odlux/framework/src/components/material-table/index.tsx
+++ b/sdnr/wt/odlux/framework/src/components/material-table/index.tsx
@@ -84,7 +84,7 @@ type MaterialTableComponentBaseProps<TData> = WithStyles<typeof styles> & {
disableSorting?: boolean;
disableFilter?: boolean;
customActionButtons?: { icon: React.ComponentType<SvgIconProps>, tooltip?: string, onClick: () => void }[];
- onHandleClick?(event: React.MouseEvent<HTMLTableRowElement>, rowData: TData): void;
+ onHandleClick?(event: React.MouseEvent<HTMLTableRowElement>, rowData: TData): void;
};
type MaterialTableComponentPropsWithRows<TData={}> = MaterialTableComponentBaseProps<TData> & { rows: TData[]; asynchronus?: boolean; };
@@ -142,7 +142,7 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
if (isMaterialTableComponentPropsWithRequestData(this.props)) {
this.update();
-
+
if (this.props.tableApi) {
this.props.tableApi.forceRefresh = () => this.update();
}
@@ -168,11 +168,11 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
onSelectAllClick={ this.handleSelectAllClick }
onRequestSort={ this.onHandleRequestSort }
rowCount={ rows.length }
- enableSelection={ this.props.enableSelection }
+ enableSelection={ this.props.enableSelection }
/>
<TableBody>
{ showFilter && <EnhancedTableFilter columns={ columns } filter={ filter } onFilterChanged={ this.onFilterChanged } enableSelection={this.props.enableSelection} /> || null }
- { rows // may need ordering here
+ { rows // may need ordering here
.map((entry: TData & { [key: string]: any }) => {
const entryId = getId(entry);
const isSelected = this.isSelected(entryId);
@@ -186,21 +186,23 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
key={ entryId }
selected={ isSelected }
>
- { this.props.enableSelection
+ { this.props.enableSelection
? <TableCell padding="checkbox" style={ { width: "50px" } }>
<Checkbox checked={ isSelected } />
</TableCell>
: null
- }
+ }
{
this.props.columns.map(
col => {
- const style = col.width ? { width: col.width } : {};
+ const style = col.width ? { width: col.width } : { };
return (
- <TableCell key={ col.property } align={ col.type === ColumnType.numeric ? 'right' : 'left' } style={ style }>
+ <TableCell key={ col.property } align={ col.type === ColumnType.numeric && !col.align ? "right": col.align } style={ style }>
{ col.type === ColumnType.custom && col.customControl
- ? <col.customControl rowData={ entry } />
- : entry[col.property]
+ ? <col.customControl className={col.className} style={col.style} rowData={ entry } />
+ : col.type === ColumnType.boolean
+ ? <span className={col.className} style={col.style}>{col.labels ? col.labels[entry[col.property] ? "true": "false"] : String(entry[col.property]) }</span>
+ : <span className={col.className} style={col.style}>{String(entry[col.property])}</span>
}
</TableCell>
);
@@ -270,10 +272,10 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
if (state.showFilter) {
Object.keys(filter).forEach(prop => {
const exp = filter[prop];
- filtered = filtered || !!exp;
- data = exp ? data.filter((val) => {
+ filtered = filtered || exp !== undefined;
+ data = exp !== undefined ? data.filter((val) => {
const value = val[prop];
- return value && value.toString().indexOf(exp) > -1;
+ return (value == exp) || (value && value.toString().indexOf(String(exp)) > -1);
}) : data;
});
}
@@ -341,7 +343,7 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
};
handleSelectAllClick: () => {};
-
+
private onHandleChangePage = (event: React.MouseEvent<HTMLButtonElement> | null, page: number) => {
if (isMaterialTableComponentPropsWithRowsAndRequestData(this.props)) {
this.props.onHandleChangePage(page);
@@ -378,7 +380,7 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
}
if (!this.props.enableSelection){
return;
- }
+ }
let selected = this.state.selected || [];
const selectedIndex = selected.indexOf(id);
if (selectedIndex > -1) {
diff --git a/sdnr/wt/odlux/framework/src/components/material-table/tableFilter.tsx b/sdnr/wt/odlux/framework/src/components/material-table/tableFilter.tsx
index 68e47d7ee..e21855abb 100644
--- a/sdnr/wt/odlux/framework/src/components/material-table/tableFilter.tsx
+++ b/sdnr/wt/odlux/framework/src/components/material-table/tableFilter.tsx
@@ -7,6 +7,7 @@ import { withStyles, WithStyles, createStyles, Theme } from '@material-ui/core/s
import TableCell from '@material-ui/core/TableCell';
import TableRow from '@material-ui/core/TableRow';
import Input from '@material-ui/core/Input';
+import { Select, FormControl, InputLabel, MenuItem } from '@material-ui/core';
const styles = (theme: Theme) => createStyles({
@@ -27,7 +28,7 @@ interface IEnhancedTableFilterComponentProps extends WithStyles<typeof styles> {
}
class EnhancedTableFilterComponent extends React.Component<IEnhancedTableFilterComponentProps> {
- createFilterHandler = (property: string) => (event: React.ChangeEvent<HTMLInputElement>) => {
+ createFilterHandler = (property: string) => (event: React.ChangeEvent<HTMLInputElement|HTMLSelectElement|HTMLTextAreaElement>) => {
this.props.onFilterChanged && this.props.onFilterChanged(property, event.target.value);
};
@@ -35,11 +36,11 @@ class EnhancedTableFilterComponent extends React.Component<IEnhancedTableFilterC
const { columns, filter, classes } = this.props;
return (
<TableRow>
- { this.props.enableSelection
+ { this.props.enableSelection
? <TableCell padding="checkbox" style={ { width: "50px" } }>
</TableCell>
: null
- }
+ }
{ columns.map(col => {
const style = col.width ? { width: col.width } : {};
return (
@@ -48,14 +49,17 @@ class EnhancedTableFilterComponent extends React.Component<IEnhancedTableFilterC
padding={ col.disablePadding ? 'none' : 'default' }
style={ style }
>
- { col.disableFilter || (col.type === ColumnType.custom) ? null : <Input
- className={ classes.input }
- inputProps={ {
- 'aria-label': 'Filter',
- } }
- value={ filter[col.property] || '' }
- onChange={ this.createFilterHandler(col.property) }
- /> }
+ { col.disableFilter || (col.type === ColumnType.custom)
+ ? null
+ : (col.type === ColumnType.boolean)
+ ? <Select className={classes.input} value={filter[col.property] !== undefined ? filter[col.property] : ''} onChange={this.createFilterHandler(col.property)} inputProps={{ name: `${col.property}-bool`, id: `${col.property}-bool` }} >
+ <MenuItem value={undefined}>
+ <em>None</em>
+ </MenuItem>
+ <MenuItem value={true as any as string}>{ col.labels ? col.labels["true"]:"true"}</MenuItem>
+ <MenuItem value={false as any as string}>{ col.labels ? col.labels["false"] : "false"}</MenuItem>
+ </Select>
+ : <Input className={classes.input} inputProps={{ 'aria-label': 'Filter' }} value={filter[col.property] || ''} onChange={this.createFilterHandler(col.property)} />}
</TableCell>
);
}, this) }
diff --git a/sdnr/wt/odlux/framework/src/components/titleBar.tsx b/sdnr/wt/odlux/framework/src/components/titleBar.tsx
index d4d17d22e..ed6eb2ccc 100644
--- a/sdnr/wt/odlux/framework/src/components/titleBar.tsx
+++ b/sdnr/wt/odlux/framework/src/components/titleBar.tsx
@@ -31,8 +31,7 @@ const styles = (theme: Theme) => createStyles({
marginRight: 20,
},
icon: {
- marginRight: 8,
- marginLeft: 24,
+ marginRight: 12
}
});
diff --git a/sdnr/wt/odlux/framework/src/index.html b/sdnr/wt/odlux/framework/src/index.html
index 36d937775..3c59b1580 100644
--- a/sdnr/wt/odlux/framework/src/index.html
+++ b/sdnr/wt/odlux/framework/src/index.html
@@ -16,7 +16,7 @@
<script>
// run the application
require(["run"], function (run) {
- run.runApplication();
+ run.runApplication();
});
</script>
</body>
diff --git a/sdnr/wt/odlux/framework/src/models/elasticSearch.ts b/sdnr/wt/odlux/framework/src/models/elasticSearch.ts
index 504b2cf21..7c12f97d3 100644
--- a/sdnr/wt/odlux/framework/src/models/elasticSearch.ts
+++ b/sdnr/wt/odlux/framework/src/models/elasticSearch.ts
@@ -20,3 +20,24 @@ export type HitEntry<TSource extends {}> = {
_score: number;
_source: TSource;
}
+
+type ActionResponse ={
+ _index: string;
+ _type: string;
+ _id: string;
+ _shards: {
+ total: number,
+ successful: number,
+ failed: number
+ },
+
+}
+
+export type PostResponse = ActionResponse & {
+ created: boolean
+}
+
+export type DeleteResponse = ActionResponse & {
+ found: boolean
+}
+