diff --git a/package.json b/package.json
index 6c017ee..95799d6 100644
--- a/package.json
+++ b/package.json
@@ -8,6 +8,8 @@
"react-dom": "^16.7.0",
"react-redux": "^6.0.0",
"react-scripts": "2.1.3",
+ "react-timeago": "^4.3.0",
+ "redux": "^4.0.1",
"redux-observable": "^1.0.0",
"rxjs": "^6.4.0",
"typescript": "3.2.4"
@@ -32,6 +34,7 @@
"@types/node": "10.12.18",
"@types/react": "16.7.22",
"@types/react-dom": "16.0.11",
- "@types/react-redux": "^7.0.1"
+ "@types/react-redux": "^7.0.1",
+ "@types/react-timeago": "^4.1.0"
}
}
diff --git a/src/App.tsx b/src/App.tsx
deleted file mode 100755
index fe7898d..0000000
--- a/src/App.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import React, { PureComponent } from 'react';
-import './App.css';
-
-class App extends PureComponent {
- render() {
- return (
-
- App goes hereā¦
-
- );
- }
-}
-
-export default App;
diff --git a/src/App.css b/src/components/App/App.css
similarity index 100%
rename from src/App.css
rename to src/components/App/App.css
diff --git a/src/App.test.tsx b/src/components/App/App.test.tsx
similarity index 100%
rename from src/App.test.tsx
rename to src/components/App/App.test.tsx
diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx
new file mode 100755
index 0000000..02257aa
--- /dev/null
+++ b/src/components/App/App.tsx
@@ -0,0 +1,22 @@
+import React, { PureComponent } from 'react';
+
+import { WorkloadListContainer } from '../WorkloadList';
+import './App.css';
+
+
+class App extends PureComponent {
+ render() {
+ return (
+
+ );
+ }
+}
+
+export default App;
diff --git a/src/components/App/index.ts b/src/components/App/index.ts
new file mode 100644
index 0000000..d048c43
--- /dev/null
+++ b/src/components/App/index.ts
@@ -0,0 +1,2 @@
+export { default } from './App';
+export * from './App';
\ No newline at end of file
diff --git a/src/components/WorkloadItem/WorkloadItem.css b/src/components/WorkloadItem/WorkloadItem.css
new file mode 100644
index 0000000..3602dfb
--- /dev/null
+++ b/src/components/WorkloadItem/WorkloadItem.css
@@ -0,0 +1,3 @@
+.WorkloadItem {
+ border: 2px solid var(--wf-blue);
+}
diff --git a/src/components/WorkloadItem/WorkloadItem.tsx b/src/components/WorkloadItem/WorkloadItem.tsx
new file mode 100644
index 0000000..559b295
--- /dev/null
+++ b/src/components/WorkloadItem/WorkloadItem.tsx
@@ -0,0 +1,54 @@
+import React from 'react';
+import TimeAgo from 'react-timeago';
+import { Status } from '../../state/workloads'
+
+
+export interface WorkloadItemStateProps {
+ id: number;
+ complexity: number;
+ status: Status;
+ completeDate: Date;
+}
+
+export interface WorkloadItemMethodProps {
+ onCancel: () => void;
+}
+
+export interface WorkloadItemProps extends
+ WorkloadItemStateProps,
+ WorkloadItemMethodProps {}
+
+
+const WorkloadItem: React.SFC = (props) => (
+
+
+
Workload #{props.id}
+ Complexity: {props.complexity}
+
+
+ {props.status === 'WORKING'
+ ? (
+ <>
+
+
+ >
+ )
+ : (
+ {props.status.toLowerCase()}
+ )
+ }
+
+
+);
+
+
+export {
+ WorkloadItem,
+};
+
+export default WorkloadItem;
\ No newline at end of file
diff --git a/src/components/WorkloadItem/index.ts b/src/components/WorkloadItem/index.ts
new file mode 100644
index 0000000..55d2c73
--- /dev/null
+++ b/src/components/WorkloadItem/index.ts
@@ -0,0 +1,2 @@
+export { default } from './WorkloadItem';
+export * from './WorkloadItem';
\ No newline at end of file
diff --git a/src/components/WorkloadList/WorkloadList.tsx b/src/components/WorkloadList/WorkloadList.tsx
new file mode 100644
index 0000000..f77ac91
--- /dev/null
+++ b/src/components/WorkloadList/WorkloadList.tsx
@@ -0,0 +1,55 @@
+import React from 'react';
+import { Dispatch } from 'redux';
+import { connect } from 'react-redux';
+import { Action, State } from '../../state';
+import { cancel } from '../../state/workloads/actions';
+import { WorkloadItem, WorkloadItemStateProps } from '../WorkloadItem';
+
+
+export interface WorkloadListStateProps {
+ workloads: WorkloadItemStateProps[];
+}
+
+export interface WorkloadListDispatchProps {
+ cancelWorkload: (id: number) => void;
+}
+
+export interface WorkloadListProps extends
+ WorkloadListStateProps,
+ WorkloadListDispatchProps {}
+
+
+const WorkloadList: React.SFC = ({ workloads, cancelWorkload }) => (
+ !workloads.length
+ ? (
+ No workloads to display
+ )
+ : (
+
+ {workloads.map((workload) => (
+ -
+ cancelWorkload(workload.id)} />
+
+ ))}
+
+ )
+);
+
+
+const mapStateToProps = (state: State): WorkloadListStateProps => ({
+ workloads: Object.values(state.workloads),
+});
+
+const mapDispatchToProps = (dispatch: Dispatch): WorkloadListDispatchProps => ({
+ cancelWorkload: (id: number) => dispatch(cancel({ id })),
+})
+
+const WorkloadListContainer = connect(mapStateToProps, mapDispatchToProps)(WorkloadList);
+
+
+export {
+ WorkloadList,
+ WorkloadListContainer,
+};
+
+export default WorkloadList;
diff --git a/src/components/WorkloadList/index.ts b/src/components/WorkloadList/index.ts
new file mode 100644
index 0000000..2ed3305
--- /dev/null
+++ b/src/components/WorkloadList/index.ts
@@ -0,0 +1 @@
+export * from './WorkloadList';
\ No newline at end of file
diff --git a/src/index.tsx b/src/index.tsx
index a4d840f..68fa9dc 100755
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -7,7 +7,7 @@ import { createEpicMiddleware } from 'redux-observable';
import { reducers, epics, Action, State } from './state';
import * as WorkloadActions from './state/workloads/actions';
import './index.css';
-import App from './App';
+import App from './components/App';
const epicMiddleware = createEpicMiddleware();
@@ -15,6 +15,7 @@ const store = createStore(reducers, applyMiddleware(epicMiddleware));
epicMiddleware.run(epics);
store.dispatch(WorkloadActions.submit({ complexity: 100 }));
+store.dispatch(WorkloadActions.created({ id: 0, complexity: 100, completeDate: new Date() }));
/*
diff --git a/src/state/workloads/index.ts b/src/state/workloads/index.ts
index 9921edc..c758b74 100644
--- a/src/state/workloads/index.ts
+++ b/src/state/workloads/index.ts
@@ -1,3 +1,4 @@
+export * from './types';
export * from './actions';
export * from './reducers';
export * from './epics';
diff --git a/src/state/workloads/reducers.ts b/src/state/workloads/reducers.ts
index 08f8017..fd6c02a 100644
--- a/src/state/workloads/reducers.ts
+++ b/src/state/workloads/reducers.ts
@@ -3,6 +3,7 @@ import { Status } from './types';
interface Entry {
id: Id;
+ complexity: number;
completeDate: Date;
status: Status;
}
@@ -20,6 +21,7 @@ export const reducer = (state: State = initialState, action: Action): State => {
return {
[action.payload.id]: {
id: action.payload.id,
+ complexity: action.payload.complexity,
completeDate: action.payload.completeDate,
status: 'WORKING',
},
diff --git a/yarn.lock b/yarn.lock
index 1449897..b29a780 100755
--- a/yarn.lock
+++ b/yarn.lock
@@ -943,6 +943,13 @@
"@types/react" "*"
redux "^4.0.0"
+"@types/react-timeago@^4.1.0":
+ version "4.1.0"
+ resolved "https://npm.nutterlogic.com/@types%2freact-timeago/-/react-timeago-4.1.0.tgz#e8ebc0add9de6d768fda610922879382bdc2f327"
+ integrity sha512-rQihM3unIJ2i3gxJhoM9hktqrMsrqv2OVyz4zWG7T6hUdmt4V5IGs6B65EJgo+4Rt9Z5pscc0H9YcZX4hPuLkA==
+ dependencies:
+ "@types/react" "*"
+
"@types/react@*", "@types/react@16.7.22":
version "16.7.22"
resolved "https://npm.nutterlogic.com/@types%2freact/-/react-16.7.22.tgz#5bc6d166d5ac34b835756f0b736c7b1af0043e81"
@@ -8050,6 +8057,11 @@ react-scripts@2.1.3:
optionalDependencies:
fsevents "1.2.4"
+react-timeago@^4.3.0:
+ version "4.3.0"
+ resolved "https://npm.nutterlogic.com/react-timeago/-/react-timeago-4.3.0.tgz#ff47bb12c3c2a40bc31e6b3e457f5ac4a690a3ec"
+ integrity sha512-q89RXb4K16xyDdy2GR/mIRYrDw8ll/RlohSIgjCr1J85eHKeL/XEl4XPKICMdJnJpaXwRzOjlsdnEuxWsi61RQ==
+
react@^16.7.0:
version "16.7.0"
resolved "https://npm.nutterlogic.com/react/-/react-16.7.0.tgz#b674ec396b0a5715873b350446f7ea0802ab6381"
@@ -8154,7 +8166,7 @@ redux-observable@^1.0.0:
resolved "https://npm.nutterlogic.com/redux-observable/-/redux-observable-1.0.0.tgz#780ff2455493eedcef806616fe286b454fd15d91"
integrity sha512-6bXnpqWTBeLaLQjXHyN1giXq4nLxCmv+SUkdmiwBgvmVxvDbdmydvL1Z7DGo0WItyzI/kqXQKiucUuTxnrPRkA==
-redux@^4.0.0:
+redux@^4.0.0, redux@^4.0.1:
version "4.0.1"
resolved "https://npm.nutterlogic.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5"
integrity sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==