Skip to content

Commit

Permalink
Merge dev into master (#353)
Browse files Browse the repository at this point in the history
* Feature/2020 admin interface
* Feature/2023 login link for users 

Co-authored-by: Robert <[email protected]>
  • Loading branch information
rabbl and Roschl authored Dec 16, 2020
1 parent 9e9dbfc commit 9599602
Show file tree
Hide file tree
Showing 30 changed files with 1,529 additions and 60 deletions.
2 changes: 2 additions & 0 deletions src/config.default.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
const getConfig = () => ({
// eslint-disable-next-line no-restricted-globals
URL: `${location.protocol}//${location.host}`,
BASE_URL: process.env.REACT_APP_API_URL + '/v3',
DATADROPPER_URL: process.env.REACT_APP_DATADROPPER_URL || 'https://datadropper.inowas.com',
DISABLE_TOOL: process.env.REACT_APP_DISABLE_TOOL || '',
Expand Down
9 changes: 7 additions & 2 deletions src/routes.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from 'react';
import {Route, Switch} from 'react-router-dom';
import React from 'react';

import * as Scenes from './scenes';
import PrivateRoute from './services/router/PrivateRoute';
Expand All @@ -17,6 +17,8 @@ const getRoutes = () => {
return (
<Switch>
<PrivateRoute exact={true} path="/" component={Scenes.LandingPage} forRoles={['ROLE_USER']}/>
<PrivateRoute exact={true} path="/admin/:property?/:id?" component={Scenes.Admin}
forRoles={['ROLE_ADMIN']}/>
<PrivateRoute exact={true} path="/tools" component={Scenes.Dashboard} forRoles={['ROLE_USER']}/>
<PrivateRoute
exact={true}
Expand Down Expand Up @@ -76,6 +78,7 @@ const getRoutes = () => {

<Route path="/imprint" component={Scenes.Imprint}/>
<Route path="/terms-and-conditions" component={Scenes.TermsAndConditions}/>
<Route path="/login/:id?/:token?" component={Scenes.Login}/>
<Route path="/login" component={Scenes.Login}/>
<Route path="/logout" component={Scenes.Logout}/>
<Route path="/signup" component={Scenes.SignUp}/>
Expand All @@ -86,6 +89,8 @@ const getRoutes = () => {
return (
<Switch>
<PrivateRoute exact={true} path="/" component={Scenes.LandingPage} forRoles={['ROLE_USER']}/>
<PrivateRoute exact={true} path="/admin/:property?/:id?" component={Scenes.Admin}
forRoles={['ROLE_ADMIN']}/>
<PrivateRoute exact={true} path="/tools" component={Scenes.Dashboard} forRoles={['ROLE_USER']}/>
<PrivateRoute exact={true} path="/tools/T01" component={Scenes.T01} forRoles={['ROLE_USER']}/>
<PrivateRoute exact={true} path="/tools/T02/:id?" component={Scenes.T02} forRoles={['ROLE_USER']}/>
Expand Down Expand Up @@ -160,7 +165,7 @@ const getRoutes = () => {

<Route path="/imprint" component={Scenes.Imprint}/>
<Route path="/terms-and-conditions" component={Scenes.TermsAndConditions}/>
<Route path="/login" component={Scenes.Login}/>
<Route path="/login/:id?/:token?" component={Scenes.Login}/>
<Route path="/logout" component={Scenes.Logout}/>
<Route path="/signup" component={Scenes.SignUp}/>
</Switch>
Expand Down
176 changes: 176 additions & 0 deletions src/scenes/admin/components/DefaultTools.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
import {Button, Form, Header, Message, Segment} from 'semantic-ui-react';
import {IUser} from './Users';
import {IUserDetails} from './User';
import {buildPayloadToolInstance} from '../../shared/simpleTools/helpers';

import {defaultsWithSession as defaultsT02} from '../../t02/defaults';
import {defaultsWithSession as defaultsT08} from '../../t08/defaults';
import {defaultsWithSession as defaultsT09A} from '../../t09/defaults/T09A';
import {defaultsWithSession as defaultsT09B} from '../../t09/defaults/T09B';
import {defaultsWithSession as defaultsT09C} from '../../t09/defaults/T09C';
import {defaultsWithSession as defaultsT09D} from '../../t09/defaults/T09D';
import {defaultsWithSession as defaultsT09E} from '../../t09/defaults/T09E';
import {defaultsWithSession as defaultsT12} from '../../t12/defaults/T12';
import {defaultsWithSession as defaultsT13A} from '../../t13/defaults/T13A';
import {defaultsWithSession as defaultsT13B} from '../../t13/defaults/T13B';
import {defaultsWithSession as defaultsT13C} from '../../t13/defaults/T13C';
import {defaultsWithSession as defaultsT13D} from '../../t13/defaults/T13D';
import {defaultsWithSession as defaultsT13E} from '../../t13/defaults/T13E';
import {defaultsWithSession as defaultsT14A} from '../../t14/defaults/T14A';
import {defaultsWithSession as defaultsT14B} from '../../t14/defaults/T14B';
import {defaultsWithSession as defaultsT14C} from '../../t14/defaults/T14C';
import {defaultsWithSession as defaultsT14D} from '../../t14/defaults/T14D';
import {defaultsWithSession as defaultsT18} from '../../t18/defaults/T18';

import {deleteToolInstance} from '../../dashboard/commands';
import {fetchApiWithToken, sendCommandAsync} from '../../../services/api';
import React, {useEffect, useState} from 'react';
import SimpleToolsCommand from '../../shared/simpleTools/commands/SimpleToolsCommand';
import ToolsDataTable from './ToolsDataTable';

const DefaultTools = () => {

const [isLoading, setIsLoading] = useState<boolean>(false);
const [errorLoading, setErrorLoading] = useState<boolean>(false);
const [users, setUsers] = useState<IUser[]>([]);
const [defaultUserName, setDefaultUserName] = useState<string>('inowas');
const [defaultUser, setDefaultUser] = useState<IUserDetails | null>(null);

useEffect(() => {
const f = async () => {
setIsLoading(true);
setErrorLoading(false);
try {
const users: IUser[] = (await fetchApiWithToken('users')).data;
setUsers(users);
} catch (e) {
setErrorLoading(true);
} finally {
setIsLoading(false);
}
};

f();
}, []);

useEffect(() => {
const f = async () => {
setIsLoading(true);
setErrorLoading(false);
try {
const du = users.filter((u) => u.username === defaultUserName)[0];
const user: IUserDetails = (await fetchApiWithToken(`users/${du.id}`)).data;
setDefaultUser(user);
} catch (e) {
setErrorLoading(true);
} finally {
setIsLoading(false);
}
};

f();
}, [users, defaultUserName]);

const onDeleteToolClick = (tool: string, id: string) => {
const sc = async () => {
if (!defaultUser) {
return;
}

setIsLoading(true);
setErrorLoading(false);
try {
await sendCommandAsync(deleteToolInstance(tool, id));
setDefaultUser({...defaultUser, tools: defaultUser.tools.filter((t) => t.id !== id)});
} catch (e) {
setErrorLoading(true);
} finally {
setIsLoading(false);
}
};

sc();
};

const createCommand = (defaults: any) => {
const command = SimpleToolsCommand.createToolInstance({
...buildPayloadToolInstance(defaults),
public: true
});
command.metadata = {'user_id': defaultUser && defaultUser.id};
return command;
};

const generateDefaultTools = () => {
const g = async () => {
setIsLoading(true);
setErrorLoading(false);
try {
await sendCommandAsync(createCommand(defaultsT02()));
await sendCommandAsync(createCommand(defaultsT08()));
await sendCommandAsync(createCommand(defaultsT09A()));
await sendCommandAsync(createCommand(defaultsT09B()));
await sendCommandAsync(createCommand(defaultsT09C()));
await sendCommandAsync(createCommand(defaultsT09D()));
await sendCommandAsync(createCommand(defaultsT09E()));
await sendCommandAsync(createCommand(defaultsT12()));
await sendCommandAsync(createCommand(defaultsT13A()));
await sendCommandAsync(createCommand(defaultsT13B()));
await sendCommandAsync(createCommand(defaultsT13C()));
await sendCommandAsync(createCommand(defaultsT13D()));
await sendCommandAsync(createCommand(defaultsT13E()));
await sendCommandAsync(createCommand(defaultsT14A()));
await sendCommandAsync(createCommand(defaultsT14B()));
await sendCommandAsync(createCommand(defaultsT14C()));
await sendCommandAsync(createCommand(defaultsT14D()));
await sendCommandAsync(createCommand(defaultsT18()));
} catch (e) {
setErrorLoading(true);
} finally {
if (defaultUser) {
const user: IUserDetails = (await fetchApiWithToken(`users/${defaultUser.id}`)).data;
setDefaultUser(user);
}

setIsLoading(false);
}
};

g();
};

return (
<Segment color={'grey'} loading={isLoading}>
{errorLoading && <Message negative>
<Message.Header>Error</Message.Header>
<p>There was an error fetching the userdata.</p>
</Message>}
<Header as={'h1'}>Default Tools</Header>
<Form>
<Form.Dropdown
label={'Default User'}
selection
options={users.map((u) => ({key: u.id, value: u.username, text: u.username}))}
value={defaultUserName}
onChange={(e, data: any) => setDefaultUserName(data.value)}
/>

<Button
positive={true}
onClick={generateDefaultTools}
>
Generate default tools
</Button>
</Form>

{defaultUser &&
<ToolsDataTable
tools={defaultUser.tools}
onChangeMetadata={() => ({})}
onDelete={onDeleteToolClick}
/>}
</Segment>
);
};

export default DefaultTools;
81 changes: 81 additions & 0 deletions src/scenes/admin/components/Tools.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import {Header, Message, Segment} from 'semantic-ui-react';
import {deleteToolInstance, updateToolInstanceMetadata} from '../../dashboard/commands';
import {fetchApiWithToken, sendCommandAsync} from '../../../services/api';
import React, {useEffect, useState} from 'react';
import ToolsDataTable, {ITool} from './ToolsDataTable';

const Tools = () => {

const [isLoading, setIsLoading] = useState<boolean>(false);
const [errorLoading, setErrorLoading] = useState<boolean>(false);
const [tools, setTools] = useState<ITool[]>([]);

useEffect(() => {
const f = async () => {
setIsLoading(true);
setErrorLoading(false);
try {
const tools: ITool[] = (await fetchApiWithToken('tools')).data;
setTools(tools);
} catch (e) {
setErrorLoading(true);
} finally {
setIsLoading(false);
}
};

f();
}, []);

const onChangeMetadata = (tool: string, id: string, name: string, description: string, isPublic: boolean) => {
const sc = async () => {
setIsLoading(true);
setErrorLoading(false);
try {
await sendCommandAsync(updateToolInstanceMetadata(tool, {id, name, description, isPublic}));
setTools(tools.map((t) => {
if (t.id === id) {
t.public = isPublic;
}
return t;
}));
} catch (e) {
setErrorLoading(true);
} finally {
setIsLoading(false);
}
};

sc();
};

const onDeleteToolClick = (tool: string, id: string) => {
const sc = async () => {
setIsLoading(true);
setErrorLoading(false);
try {
await sendCommandAsync(deleteToolInstance(tool, id));
setTools(tools.filter((t) => t.id !== id));
} catch (e) {
setErrorLoading(true);
} finally {
setIsLoading(false);
}
};

sc();
};

return (
<Segment color={'grey'} loading={isLoading}>
{errorLoading && <Message negative>
<Message.Header>Error</Message.Header>
<p>There was an error fetching the tool data.</p>
</Message>}
<Header as={'h2'}>Tools</Header>
<ToolsDataTable tools={tools} onChangeMetadata={onChangeMetadata} onDelete={onDeleteToolClick}/>
</Segment>
);
};

export default Tools;
Loading

0 comments on commit 9599602

Please sign in to comment.