Skip to content

Commit

Permalink
* Added user management screen
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
walterjgsp committed Oct 28, 2020
1 parent f27b37e commit d039a69
Show file tree
Hide file tree
Showing 27 changed files with 154 additions and 31 deletions.
2 changes: 1 addition & 1 deletion trena_dashboard/src/components/base/ActionModal.tsx
Original file line number Diff line number Diff line change
@@ -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 {

Expand Down
2 changes: 1 addition & 1 deletion trena_dashboard/src/components/lists/ListPublicWork.tsx
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
2 changes: 1 addition & 1 deletion trena_dashboard/src/components/lists/ListTypePhoto.tsx
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
2 changes: 1 addition & 1 deletion trena_dashboard/src/components/lists/ListTypeWork.tsx
Original file line number Diff line number Diff line change
@@ -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";
Expand Down
2 changes: 1 addition & 1 deletion trena_dashboard/src/components/lists/ListUser.tsx
Original file line number Diff line number Diff line change
@@ -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(() => {
Expand Down
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
39 changes: 39 additions & 0 deletions trena_dashboard/src/components/menus/PublicWorkMenu.tsx
Original file line number Diff line number Diff line change
@@ -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<PublicWorkMenuProps> = (props) => {

const {collectCount, workState, onDownloadClicked} = props

return (
<nav className="level">
<div className="level-item has-text-centered">
<div>
<p className="heading">Coletas</p>
<p className="title">{collectCount}</p>
</div>
</div>
<div className="level-item">
<button className="button is-medium" onClick={onDownloadClicked}>
<span className="icon">
<FontAwesomeIcon icon={faDownload}/>
</span>
<span>Baixar dados de coletas</span>
</button>
</div>
<div className="level-item has-text-centered">
<div>
<p className="heading">Estado da Obra</p>
<span className="tag is-info">{workState}</span>
</div>
</div>
</nav>
)
}
2 changes: 1 addition & 1 deletion trena_dashboard/src/components/stats/StatsSummary.tsx
Original file line number Diff line number Diff line change
@@ -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<any> = observer(() => {

Expand Down
5 changes: 3 additions & 2 deletions trena_dashboard/src/core/contexts/RootContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ 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(),
publicWorkStore: new PublicWorkStore(),
viewStore: new ViewStore(),
typePhotoStore: new TypePhotoStore(),
userStore: new UserStore(),
statisticsStore: new StatisticsStore()
statisticsStore: new StatisticsStore(),
workStatusStore: new WorkStatusStore()
})
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from "react";

import {rootContext} from "../contexts/RootContext";
import {rootContext} from "./RootContext";

export const useStores =() => React.useContext(rootContext)
2 changes: 2 additions & 0 deletions trena_dashboard/src/core/models/PublicWork.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ export interface PublicWork {
name: string,
type_work_flag: number,
address: Address,
user_status?: number,
rnn_status?: number
}
5 changes: 5 additions & 0 deletions trena_dashboard/src/core/models/WorkStatus.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export interface WorkStatus {
flag: number,
name: string,
description: string
}
19 changes: 19 additions & 0 deletions trena_dashboard/src/core/network/services/CollectService.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

}
15 changes: 15 additions & 0 deletions trena_dashboard/src/core/network/services/WorkStatusService.tsx
Original file line number Diff line number Diff line change
@@ -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<WorkStatus[]> {
const call = Config.BASE_URL + "/workstatus/"
return network.get(call)
.then(res => {
let listOfWorkStatus: WorkStatus[] = res.body

return listOfWorkStatus
})
}
}
4 changes: 3 additions & 1 deletion trena_dashboard/src/core/stores/PublicWorkStore.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ export class PublicWorkStore extends BaseStore {
@observable selectedPublicWork?: PublicWork = undefined;
@observable collectsOfPublicWork: Collect[] = [];


@action
async loadPublicWorkList() {
this.baseCall(async () => {
Expand Down Expand Up @@ -83,5 +82,8 @@ export class PublicWorkStore extends BaseStore {
})
}

downloadCollectJSONReport = (publicWorkId: string) => {
CollectService.downloadJSONReport(publicWorkId)
}

}
1 change: 0 additions & 1 deletion trena_dashboard/src/core/stores/UserStore.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down
24 changes: 24 additions & 0 deletions trena_dashboard/src/core/stores/WorkStatusStore.tsx
Original file line number Diff line number Diff line change
@@ -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)
}
}
2 changes: 1 addition & 1 deletion trena_dashboard/src/screens/Home.tsx
Original file line number Diff line number Diff line change
@@ -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 {
}
Expand Down
9 changes: 1 addition & 8 deletions trena_dashboard/src/screens/LoginScreen.tsx
Original file line number Diff line number Diff line change
@@ -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";

Expand All @@ -10,15 +10,8 @@ export const LoginScreen: React.FC<any> = observer(() => {
const {userStore} = useStores()
const [user, setUser] = useState({username: "", password: ""})

const checkLogged = () => {
if (userStore.loggedUser) {
return <Redirect to="/"/>
}
}

const onLoginClicked = async () => {
await userStore.login(user.username, user.password)
checkLogged()
}

const onValueChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
Expand Down
6 changes: 4 additions & 2 deletions trena_dashboard/src/screens/MainScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 <Redirect to="/login"/>
Expand Down
2 changes: 1 addition & 1 deletion trena_dashboard/src/screens/PublicWorkScreen.tsx
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion trena_dashboard/src/screens/TypeOfWorkScreen.tsx
Original file line number Diff line number Diff line change
@@ -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";


Expand Down
2 changes: 1 addition & 1 deletion trena_dashboard/src/screens/UserManagementScreen.tsx
Original file line number Diff line number Diff line change
@@ -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<any> = () => {
const {userStore} = useStores()
Expand Down
26 changes: 24 additions & 2 deletions trena_dashboard/src/views/publicWork/PublicWorkView.tsx
Original file line number Diff line number Diff line change
@@ -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 (
<>{
Expand All @@ -25,6 +43,10 @@ export const PublicWorkView = observer(() => {
</p>
<MapView latitude={publicWork.address.latitude} longitude={publicWork.address.longitude}
zoom={14}/>
<br/>
<PublicWorkMenu collectCount={collectCount}
workState={getWorkStatus()}
onDownloadClicked={handleDownloadCollectClicked}/>
</div>
</div>
</article>
Expand Down
2 changes: 1 addition & 1 deletion trena_dashboard/src/views/user/UserCRUDView.tsx
Original file line number Diff line number Diff line change
@@ -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<any> = () => {
const {userStore} = useStores()
Expand Down

0 comments on commit d039a69

Please sign in to comment.