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()