From d039a6924fbc761cb80521ad41289a783f70d23a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Walter=20Jose=CC=81?=
Date: Wed, 28 Oct 2020 10:16:45 -0300
Subject: [PATCH] * Added user management screen * Added more information
related to collects of public work * Possibility to download all collects of
a public work as JSON file * Showing work status on public work view
---
.../src/components/base/ActionModal.tsx | 2 +-
.../src/components/lists/ListPublicWork.tsx | 2 +-
.../src/components/lists/ListTypePhoto.tsx | 2 +-
.../src/components/lists/ListTypeWork.tsx | 2 +-
.../src/components/lists/ListUser.tsx | 2 +-
.../components/lists/items/ItemPublicWork.tsx | 2 +-
.../components/lists/items/ItemTypePhoto.tsx | 2 +-
.../components/lists/items/ItemTypeWork.tsx | 2 +-
.../src/components/menus/PublicWorkMenu.tsx | 39 +++++++++++++++++++
.../src/components/stats/StatsSummary.tsx | 2 +-
.../src/core/contexts/RootContext.tsx | 5 ++-
.../core/{stores => contexts}/UseStores.tsx | 2 +-
.../src/core/models/PublicWork.tsx | 2 +
.../src/core/models/WorkStatus.tsx | 5 +++
.../core/network/services/CollectService.tsx | 19 +++++++++
.../network/services/WorkStatusService.tsx | 15 +++++++
.../src/core/stores/PublicWorkStore.tsx | 4 +-
trena_dashboard/src/core/stores/UserStore.tsx | 1 -
.../src/core/stores/WorkStatusStore.tsx | 24 ++++++++++++
trena_dashboard/src/screens/Home.tsx | 2 +-
trena_dashboard/src/screens/LoginScreen.tsx | 9 +----
trena_dashboard/src/screens/MainScreen.tsx | 6 ++-
.../src/screens/PublicWorkScreen.tsx | 2 +-
.../src/screens/TypeOfWorkScreen.tsx | 2 +-
.../src/screens/UserManagementScreen.tsx | 2 +-
.../src/views/publicWork/PublicWorkView.tsx | 26 ++++++++++++-
.../src/views/user/UserCRUDView.tsx | 2 +-
27 files changed, 154 insertions(+), 31 deletions(-)
create mode 100644 trena_dashboard/src/components/menus/PublicWorkMenu.tsx
rename trena_dashboard/src/core/{stores => contexts}/UseStores.tsx (62%)
create mode 100644 trena_dashboard/src/core/models/WorkStatus.tsx
create mode 100644 trena_dashboard/src/core/network/services/WorkStatusService.tsx
create mode 100644 trena_dashboard/src/core/stores/WorkStatusStore.tsx
diff --git a/trena_dashboard/src/components/base/ActionModal.tsx b/trena_dashboard/src/components/base/ActionModal.tsx
index 85bb4c8..4370fe5 100644
--- a/trena_dashboard/src/components/base/ActionModal.tsx
+++ b/trena_dashboard/src/components/base/ActionModal.tsx
@@ -1,6 +1,6 @@
import {observer} from "mobx-react";
import React from "react";
-import {useStores} from "../../core/stores/UseStores";
+import {useStores} from "../../core/contexts/UseStores";
interface ActionModalProps {
diff --git a/trena_dashboard/src/components/lists/ListPublicWork.tsx b/trena_dashboard/src/components/lists/ListPublicWork.tsx
index 55c60b2..bb08e0c 100644
--- a/trena_dashboard/src/components/lists/ListPublicWork.tsx
+++ b/trena_dashboard/src/components/lists/ListPublicWork.tsx
@@ -1,5 +1,5 @@
import {observer} from "mobx-react";
-import {useStores} from "../../core/stores/UseStores";
+import {useStores} from "../../core/contexts/UseStores";
import React from "react";
import {ItemPublicWork} from "./items/ItemPublicWork";
import {Search} from "../form/Search";
diff --git a/trena_dashboard/src/components/lists/ListTypePhoto.tsx b/trena_dashboard/src/components/lists/ListTypePhoto.tsx
index 1f003b9..149ef20 100644
--- a/trena_dashboard/src/components/lists/ListTypePhoto.tsx
+++ b/trena_dashboard/src/components/lists/ListTypePhoto.tsx
@@ -1,7 +1,7 @@
import {observer} from "mobx-react";
import {ItemActionsMenu} from "../menus/ItemActionsMenu";
import React from "react";
-import {useStores} from "../../core/stores/UseStores";
+import {useStores} from "../../core/contexts/UseStores";
import {ItemTypePhoto} from "./items/ItemTypePhoto";
import {Search} from "../form/Search";
import {DeleteView} from "../../views/DeleteView";
diff --git a/trena_dashboard/src/components/lists/ListTypeWork.tsx b/trena_dashboard/src/components/lists/ListTypeWork.tsx
index 2b42e2a..fbacfab 100644
--- a/trena_dashboard/src/components/lists/ListTypeWork.tsx
+++ b/trena_dashboard/src/components/lists/ListTypeWork.tsx
@@ -1,5 +1,5 @@
import {observer} from "mobx-react";
-import {useStores} from "../../core/stores/UseStores";
+import {useStores} from "../../core/contexts/UseStores";
import React from "react";
import {ItemTypeWork} from "./items/ItemTypeWork";
import {Search} from "../form/Search";
diff --git a/trena_dashboard/src/components/lists/ListUser.tsx b/trena_dashboard/src/components/lists/ListUser.tsx
index 4c51d43..ac11e14 100644
--- a/trena_dashboard/src/components/lists/ListUser.tsx
+++ b/trena_dashboard/src/components/lists/ListUser.tsx
@@ -1,6 +1,6 @@
import {observer} from "mobx-react";
import React from "react";
-import {useStores} from "../../core/stores/UseStores";
+import {useStores} from "../../core/contexts/UseStores";
import {ItemUser} from "./items/ItemUser";
export const ListUser = observer(() => {
diff --git a/trena_dashboard/src/components/lists/items/ItemPublicWork.tsx b/trena_dashboard/src/components/lists/items/ItemPublicWork.tsx
index 97a4614..681cea7 100644
--- a/trena_dashboard/src/components/lists/items/ItemPublicWork.tsx
+++ b/trena_dashboard/src/components/lists/items/ItemPublicWork.tsx
@@ -1,6 +1,6 @@
import {PublicWork} from "../../../core/models/PublicWork";
import React from "react";
-import {useStores} from "../../../core/stores/UseStores";
+import {useStores} from "../../../core/contexts/UseStores";
import {observer} from "mobx-react";
interface ItemPublicWorkProps {
diff --git a/trena_dashboard/src/components/lists/items/ItemTypePhoto.tsx b/trena_dashboard/src/components/lists/items/ItemTypePhoto.tsx
index f0a5fa8..a3539af 100644
--- a/trena_dashboard/src/components/lists/items/ItemTypePhoto.tsx
+++ b/trena_dashboard/src/components/lists/items/ItemTypePhoto.tsx
@@ -1,7 +1,7 @@
import {TypePhoto} from "../../../core/models/TypePhoto";
import {observer} from "mobx-react";
import React from "react";
-import {useStores} from "../../../core/stores/UseStores";
+import {useStores} from "../../../core/contexts/UseStores";
interface ItemTypePhotoProps {
typePhoto: TypePhoto
diff --git a/trena_dashboard/src/components/lists/items/ItemTypeWork.tsx b/trena_dashboard/src/components/lists/items/ItemTypeWork.tsx
index 3f45135..acb05c1 100644
--- a/trena_dashboard/src/components/lists/items/ItemTypeWork.tsx
+++ b/trena_dashboard/src/components/lists/items/ItemTypeWork.tsx
@@ -1,6 +1,6 @@
import {TypeWork} from "../../../core/models/TypeWork";
import React from "react";
-import {useStores} from "../../../core/stores/UseStores";
+import {useStores} from "../../../core/contexts/UseStores";
import {observer} from "mobx-react";
interface ItemTypeWorkProps {
diff --git a/trena_dashboard/src/components/menus/PublicWorkMenu.tsx b/trena_dashboard/src/components/menus/PublicWorkMenu.tsx
new file mode 100644
index 0000000..b864419
--- /dev/null
+++ b/trena_dashboard/src/components/menus/PublicWorkMenu.tsx
@@ -0,0 +1,39 @@
+import React from "react";
+import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
+import {faDownload} from "@fortawesome/free-solid-svg-icons";
+
+interface PublicWorkMenuProps {
+ collectCount: number
+ workState: string
+ onDownloadClicked?: () => void
+}
+
+export const PublicWorkMenu: React.FC = (props) => {
+
+ const {collectCount, workState, onDownloadClicked} = props
+
+ return (
+
+ )
+}
\ No newline at end of file
diff --git a/trena_dashboard/src/components/stats/StatsSummary.tsx b/trena_dashboard/src/components/stats/StatsSummary.tsx
index a8955e1..f2f2a35 100644
--- a/trena_dashboard/src/components/stats/StatsSummary.tsx
+++ b/trena_dashboard/src/components/stats/StatsSummary.tsx
@@ -1,7 +1,7 @@
import React from "react";
import {StatsItem} from "./StatsItem";
import {observer} from "mobx-react";
-import {useStores} from "../../core/stores/UseStores";
+import {useStores} from "../../core/contexts/UseStores";
export const StatsSummary: React.FC = observer(() => {
diff --git a/trena_dashboard/src/core/contexts/RootContext.tsx b/trena_dashboard/src/core/contexts/RootContext.tsx
index 92c2143..e9d523c 100644
--- a/trena_dashboard/src/core/contexts/RootContext.tsx
+++ b/trena_dashboard/src/core/contexts/RootContext.tsx
@@ -5,7 +5,7 @@ import {ViewStore} from "../stores/ViewStore";
import {TypePhotoStore} from "../stores/TypePhotoStore";
import {UserStore} from "../stores/UserStore";
import {StatisticsStore} from "../stores/StatisticsStore";
-
+import {WorkStatusStore} from "../stores/WorkStatusStore";
export const rootContext = React.createContext({
typeWorkStore: new TypeWorkStore(),
@@ -13,5 +13,6 @@ export const rootContext = React.createContext({
viewStore: new ViewStore(),
typePhotoStore: new TypePhotoStore(),
userStore: new UserStore(),
- statisticsStore: new StatisticsStore()
+ statisticsStore: new StatisticsStore(),
+ workStatusStore: new WorkStatusStore()
})
\ No newline at end of file
diff --git a/trena_dashboard/src/core/stores/UseStores.tsx b/trena_dashboard/src/core/contexts/UseStores.tsx
similarity index 62%
rename from trena_dashboard/src/core/stores/UseStores.tsx
rename to trena_dashboard/src/core/contexts/UseStores.tsx
index 6441421..ab2edf4 100644
--- a/trena_dashboard/src/core/stores/UseStores.tsx
+++ b/trena_dashboard/src/core/contexts/UseStores.tsx
@@ -1,5 +1,5 @@
import React from "react";
-import {rootContext} from "../contexts/RootContext";
+import {rootContext} from "./RootContext";
export const useStores =() => React.useContext(rootContext)
\ No newline at end of file
diff --git a/trena_dashboard/src/core/models/PublicWork.tsx b/trena_dashboard/src/core/models/PublicWork.tsx
index 0bed6cb..ac7151c 100644
--- a/trena_dashboard/src/core/models/PublicWork.tsx
+++ b/trena_dashboard/src/core/models/PublicWork.tsx
@@ -5,4 +5,6 @@ export interface PublicWork {
name: string,
type_work_flag: number,
address: Address,
+ user_status?: number,
+ rnn_status?: number
}
\ No newline at end of file
diff --git a/trena_dashboard/src/core/models/WorkStatus.tsx b/trena_dashboard/src/core/models/WorkStatus.tsx
new file mode 100644
index 0000000..b21db2f
--- /dev/null
+++ b/trena_dashboard/src/core/models/WorkStatus.tsx
@@ -0,0 +1,5 @@
+export interface WorkStatus {
+ flag: number,
+ name: string,
+ description: string
+}
\ No newline at end of file
diff --git a/trena_dashboard/src/core/network/services/CollectService.tsx b/trena_dashboard/src/core/network/services/CollectService.tsx
index fcb4a47..20afd86 100644
--- a/trena_dashboard/src/core/network/services/CollectService.tsx
+++ b/trena_dashboard/src/core/network/services/CollectService.tsx
@@ -23,4 +23,23 @@ export class CollectService {
return collectCount
})
}
+
+ static async downloadJSONReport(publicWorkId: string) {
+ const call = Config.BASE_URL + "/collects/report/json/file"
+ network.get(call)
+ .responseType('blob')
+ .query({public_work_id: publicWorkId}).then(res => {
+ const data: Blob = res.body
+ this.saveData(data, publicWorkId)
+ })
+ }
+
+ private static saveData = (data: Blob, filename: string = "filename") => {
+ const csvURL = window.URL.createObjectURL(data);
+ let tempLink = document.createElement('a');
+ tempLink.href = csvURL;
+ tempLink.setAttribute('download', filename + '.json');
+ tempLink.click();
+ }
+
}
\ No newline at end of file
diff --git a/trena_dashboard/src/core/network/services/WorkStatusService.tsx b/trena_dashboard/src/core/network/services/WorkStatusService.tsx
new file mode 100644
index 0000000..ff34d42
--- /dev/null
+++ b/trena_dashboard/src/core/network/services/WorkStatusService.tsx
@@ -0,0 +1,15 @@
+import Config from "../../../config/Config";
+import {network} from "../NetworkInterceptor";
+import {WorkStatus} from "../../models/WorkStatus";
+
+export class WorkStatusService {
+ static async loadWorkStatus(): Promise {
+ const call = Config.BASE_URL + "/workstatus/"
+ return network.get(call)
+ .then(res => {
+ let listOfWorkStatus: WorkStatus[] = res.body
+
+ return listOfWorkStatus
+ })
+ }
+}
\ No newline at end of file
diff --git a/trena_dashboard/src/core/stores/PublicWorkStore.tsx b/trena_dashboard/src/core/stores/PublicWorkStore.tsx
index a9f56d3..163eadb 100644
--- a/trena_dashboard/src/core/stores/PublicWorkStore.tsx
+++ b/trena_dashboard/src/core/stores/PublicWorkStore.tsx
@@ -14,7 +14,6 @@ export class PublicWorkStore extends BaseStore {
@observable selectedPublicWork?: PublicWork = undefined;
@observable collectsOfPublicWork: Collect[] = [];
-
@action
async loadPublicWorkList() {
this.baseCall(async () => {
@@ -83,5 +82,8 @@ export class PublicWorkStore extends BaseStore {
})
}
+ downloadCollectJSONReport = (publicWorkId: string) => {
+ CollectService.downloadJSONReport(publicWorkId)
+ }
}
\ No newline at end of file
diff --git a/trena_dashboard/src/core/stores/UserStore.tsx b/trena_dashboard/src/core/stores/UserStore.tsx
index 64b8a5f..cf01b75 100644
--- a/trena_dashboard/src/core/stores/UserStore.tsx
+++ b/trena_dashboard/src/core/stores/UserStore.tsx
@@ -2,7 +2,6 @@ import {BaseStore} from "./BaseStore";
import {action, observable, runInAction} from "mobx";
import {User} from "../models/User";
import {SecurityService} from "../network/services/SecurityService";
-import {TypePhotoService} from "../network/services/TypePhotoService";
export class UserStore extends BaseStore {
diff --git a/trena_dashboard/src/core/stores/WorkStatusStore.tsx b/trena_dashboard/src/core/stores/WorkStatusStore.tsx
new file mode 100644
index 0000000..a625071
--- /dev/null
+++ b/trena_dashboard/src/core/stores/WorkStatusStore.tsx
@@ -0,0 +1,24 @@
+import {BaseStore} from "./BaseStore";
+import {action, observable, runInAction} from "mobx";
+import {WorkStatus} from "../models/WorkStatus";
+import {WorkStatusService} from "../network/services/WorkStatusService";
+
+export class WorkStatusStore extends BaseStore {
+
+ @observable workStatusList: WorkStatus[] = [];
+
+ @action
+ async loadWorkStatus() {
+ this.baseCall(async () => {
+ const workStatus = await WorkStatusService.loadWorkStatus()
+ runInAction(() => {
+ this.workStatusList = workStatus;
+ }
+ )
+ })
+ }
+
+ getWorkStatusByFlag = (flag: number): WorkStatus | undefined => {
+ return this.workStatusList.find(x => x.flag === flag)
+ }
+}
\ No newline at end of file
diff --git a/trena_dashboard/src/screens/Home.tsx b/trena_dashboard/src/screens/Home.tsx
index 63d9147..b314eb1 100644
--- a/trena_dashboard/src/screens/Home.tsx
+++ b/trena_dashboard/src/screens/Home.tsx
@@ -1,6 +1,6 @@
import React from "react";
import {StatsSummary} from "../components/stats/StatsSummary";
-import {useStores} from "../core/stores/UseStores";
+import {useStores} from "../core/contexts/UseStores";
interface HomeProps {
}
diff --git a/trena_dashboard/src/screens/LoginScreen.tsx b/trena_dashboard/src/screens/LoginScreen.tsx
index f118008..3b82edc 100644
--- a/trena_dashboard/src/screens/LoginScreen.tsx
+++ b/trena_dashboard/src/screens/LoginScreen.tsx
@@ -1,7 +1,7 @@
import React, {useState} from "react";
import {InputField} from "../components/form/InputField";
import {ReactComponent as Logo} from "../images/logo.svg";
-import {useStores} from "../core/stores/UseStores";
+import {useStores} from "../core/contexts/UseStores";
import {Redirect} from "react-router-dom";
import {observer} from "mobx-react";
@@ -10,15 +10,8 @@ export const LoginScreen: React.FC = observer(() => {
const {userStore} = useStores()
const [user, setUser] = useState({username: "", password: ""})
- const checkLogged = () => {
- if (userStore.loggedUser) {
- return
- }
- }
-
const onLoginClicked = async () => {
await userStore.login(user.username, user.password)
- checkLogged()
}
const onValueChanged = (e: React.ChangeEvent) => {
diff --git a/trena_dashboard/src/screens/MainScreen.tsx b/trena_dashboard/src/screens/MainScreen.tsx
index f445645..8098b41 100644
--- a/trena_dashboard/src/screens/MainScreen.tsx
+++ b/trena_dashboard/src/screens/MainScreen.tsx
@@ -4,13 +4,15 @@ import {TypeOfWorkScreen} from "./TypeOfWorkScreen";
import {PublicWorkScreen} from "./PublicWorkScreen";
import React from "react";
import {observer} from "mobx-react";
-import {useStores} from "../core/stores/UseStores";
+import {useStores} from "../core/contexts/UseStores";
import {NavigationMenu} from "../components/menus/NavigationMenu";
import {UserManagementScreen} from "./UserManagementScreen";
export const MainScreen = observer(() => {
- const {userStore} = useStores()
+ const {userStore, workStatusStore} = useStores()
+
+ workStatusStore.loadWorkStatus()
if (userStore.loggedUser === undefined) {
return
diff --git a/trena_dashboard/src/screens/PublicWorkScreen.tsx b/trena_dashboard/src/screens/PublicWorkScreen.tsx
index 6774335..a14fbae 100644
--- a/trena_dashboard/src/screens/PublicWorkScreen.tsx
+++ b/trena_dashboard/src/screens/PublicWorkScreen.tsx
@@ -1,6 +1,6 @@
import React from "react";
import {ListPublicWork} from "../components/lists/ListPublicWork";
-import {useStores} from "../core/stores/UseStores";
+import {useStores} from "../core/contexts/UseStores";
import {PublicWorkView} from "../views/publicWork/PublicWorkView";
interface PublicWorkScreenProps {
diff --git a/trena_dashboard/src/screens/TypeOfWorkScreen.tsx b/trena_dashboard/src/screens/TypeOfWorkScreen.tsx
index 3e2a015..5ec584b 100644
--- a/trena_dashboard/src/screens/TypeOfWorkScreen.tsx
+++ b/trena_dashboard/src/screens/TypeOfWorkScreen.tsx
@@ -1,6 +1,6 @@
import React from "react";
import {ListTypeWork} from "../components/lists/ListTypeWork";
-import {useStores} from "../core/stores/UseStores";
+import {useStores} from "../core/contexts/UseStores";
import {ListTypePhoto} from "../components/lists/ListTypePhoto";
diff --git a/trena_dashboard/src/screens/UserManagementScreen.tsx b/trena_dashboard/src/screens/UserManagementScreen.tsx
index 4b82302..fabb32d 100644
--- a/trena_dashboard/src/screens/UserManagementScreen.tsx
+++ b/trena_dashboard/src/screens/UserManagementScreen.tsx
@@ -1,7 +1,7 @@
import React from "react"
import {UserCRUDView} from "../views/user/UserCRUDView";
import {ListUser} from "../components/lists/ListUser";
-import {useStores} from "../core/stores/UseStores";
+import {useStores} from "../core/contexts/UseStores";
export const UserManagementScreen: React.FC = () => {
const {userStore} = useStores()
diff --git a/trena_dashboard/src/views/publicWork/PublicWorkView.tsx b/trena_dashboard/src/views/publicWork/PublicWorkView.tsx
index e6d485d..74247ce 100644
--- a/trena_dashboard/src/views/publicWork/PublicWorkView.tsx
+++ b/trena_dashboard/src/views/publicWork/PublicWorkView.tsx
@@ -1,13 +1,31 @@
import {observer} from "mobx-react";
-import {useStores} from "../../core/stores/UseStores";
+import {useStores} from "../../core/contexts/UseStores";
import React from "react";
import {EmptyView} from "../EmptyView";
import {MapView} from "./MapView";
+import {PublicWorkMenu} from "../../components/menus/PublicWorkMenu";
export const PublicWorkView = observer(() => {
- const {publicWorkStore} = useStores()
+ const {publicWorkStore, workStatusStore} = useStores()
const publicWork = publicWorkStore.selectedPublicWork
+ const collectCount = publicWorkStore.collectsOfPublicWork.length
+
+ const handleDownloadCollectClicked = () => {
+ if (publicWork) {
+ publicWorkStore.downloadCollectJSONReport(publicWork.id)
+ }
+ }
+
+ const getWorkStatus = (): string => {
+ const status = publicWork?.user_status
+ if (status) {
+ const workStatus = workStatusStore.getWorkStatusByFlag(status)
+ return workStatus?.name ?? "--"
+ } else {
+ return "--"
+ }
+ }
return (
<>{
@@ -25,6 +43,10 @@ export const PublicWorkView = observer(() => {
+
+
diff --git a/trena_dashboard/src/views/user/UserCRUDView.tsx b/trena_dashboard/src/views/user/UserCRUDView.tsx
index 06db9f7..90f0964 100644
--- a/trena_dashboard/src/views/user/UserCRUDView.tsx
+++ b/trena_dashboard/src/views/user/UserCRUDView.tsx
@@ -1,6 +1,6 @@
import React, {useState} from "react";
import {InputField} from "../../components/form/InputField";
-import {useStores} from "../../core/stores/UseStores";
+import {useStores} from "../../core/contexts/UseStores";
export const UserCRUDView: React.FC = () => {
const {userStore} = useStores()