add mappings page; implement delete mapping function
This commit is contained in:
35
client/src/components/PromptMessage/index.js
Normal file
35
client/src/components/PromptMessage/index.js
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
import {Button, Modal} from "semantic-ui-react";
|
||||||
|
|
||||||
|
|
||||||
|
class PromptMessage extends Component {
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
show = false,
|
||||||
|
size = 'tiny',
|
||||||
|
title = '',
|
||||||
|
message = '',
|
||||||
|
noActionLabel = 'No',
|
||||||
|
yesActionLabel = 'Yes',
|
||||||
|
yesActionIconName = 'checkmark',
|
||||||
|
onClose = null,
|
||||||
|
onActionNo = null,
|
||||||
|
onActionYes = null,
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal size={size} open={show} onClose={onClose}>
|
||||||
|
<Modal.Header>{title}</Modal.Header>
|
||||||
|
<Modal.Content>
|
||||||
|
<p>{message}</p>
|
||||||
|
</Modal.Content>
|
||||||
|
<Modal.Actions>
|
||||||
|
<Button negative onClick={onActionNo}>{noActionLabel}</Button>
|
||||||
|
<Button positive icon={yesActionIconName} onClick={onActionYes} labelPosition='right' content={yesActionLabel} />
|
||||||
|
</Modal.Actions>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PromptMessage;
|
||||||
@@ -3,6 +3,7 @@ import Home from '../scenes/Home';
|
|||||||
import IncidentsReport from '../scenes/IncidentsReport';
|
import IncidentsReport from '../scenes/IncidentsReport';
|
||||||
import SpecificMemberIncidentsReport from '../scenes/SpecificMemberIncidentsReport';
|
import SpecificMemberIncidentsReport from '../scenes/SpecificMemberIncidentsReport';
|
||||||
import MemberPracticeSummaryReport from '../scenes/MemberPracticeSummaryReport';
|
import MemberPracticeSummaryReport from '../scenes/MemberPracticeSummaryReport';
|
||||||
|
import RoomOfficeNameMapping from '../scenes/RoomOfficeNameMapping';
|
||||||
|
|
||||||
export const mainMenuItems = [
|
export const mainMenuItems = [
|
||||||
{
|
{
|
||||||
@@ -46,4 +47,11 @@ export const mainMenuItems = [
|
|||||||
url: '/dlock',
|
url: '/dlock',
|
||||||
component: UploadDLockData,
|
component: UploadDLockData,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'roomOfficeNameMapping',
|
||||||
|
showInMenu: true,
|
||||||
|
title: 'Room Office Name Mapping',
|
||||||
|
url: '/room-office-name-mapping',
|
||||||
|
component: RoomOfficeNameMapping,
|
||||||
|
}
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
|
||||||
|
import { Table, Label, Icon } from 'semantic-ui-react';
|
||||||
|
import PromptMessage from '../../../components/PromptMessage';
|
||||||
|
import { deleteMapping } from '../../../store/actions';
|
||||||
|
|
||||||
|
class SingleMapping extends Component {
|
||||||
|
state = {showDeletePrompt: false};
|
||||||
|
|
||||||
|
deleteMapping = () => {
|
||||||
|
this.setState({showDeletePrompt: true});
|
||||||
|
};
|
||||||
|
|
||||||
|
onPromptClose = () => {
|
||||||
|
this.setState({showDeletePrompt: false});
|
||||||
|
};
|
||||||
|
|
||||||
|
onPromptYes = () => {
|
||||||
|
const { singleMapping: { id }, deleteMapping } = this.props;
|
||||||
|
if (parseInt(id)){
|
||||||
|
deleteMapping(id);
|
||||||
|
}
|
||||||
|
this.onPromptClose();
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { singleMapping: { officeSlug, resourceSlug } } = this.props;
|
||||||
|
const { officeName, resourceName } = this.props;
|
||||||
|
const { showDeletePrompt } = this.state;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Table.Row>
|
||||||
|
<PromptMessage
|
||||||
|
onClose={this.onPromptClose}
|
||||||
|
onActionNo={this.onPromptClose}
|
||||||
|
onActionYes={this.onPromptYes}
|
||||||
|
title={'Delete mapping'}
|
||||||
|
message={'Do you want to delete this mapping ?'}
|
||||||
|
show={showDeletePrompt}
|
||||||
|
/>
|
||||||
|
<Table.Cell>
|
||||||
|
<Label size={'big'}>{`[${officeSlug}-${resourceSlug}]`}</Label>
|
||||||
|
</Table.Cell>
|
||||||
|
<Table.Cell>{officeName}</Table.Cell>
|
||||||
|
<Table.Cell>{resourceName}</Table.Cell>
|
||||||
|
<Table.Cell>
|
||||||
|
<Icon
|
||||||
|
circular
|
||||||
|
name={'check'}
|
||||||
|
size={'large'}
|
||||||
|
disabled
|
||||||
|
/>
|
||||||
|
<Icon
|
||||||
|
circular
|
||||||
|
name={'trash'}
|
||||||
|
size={'large'}
|
||||||
|
link
|
||||||
|
onClick={this.deleteMapping}
|
||||||
|
/>
|
||||||
|
</Table.Cell>
|
||||||
|
</Table.Row>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
|
deleteMapping: (id) => deleteMapping(dispatch, id),
|
||||||
|
});
|
||||||
|
|
||||||
|
export default connect(null, mapDispatchToProps)(SingleMapping);
|
||||||
84
client/src/scenes/RoomOfficeNameMapping/index.js
Normal file
84
client/src/scenes/RoomOfficeNameMapping/index.js
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { Container, Message, Loader, Table } from 'semantic-ui-react';
|
||||||
|
|
||||||
|
import MainMenu from '../../components/MainMenu';
|
||||||
|
import { fetchMappings } from '../../store/actions';
|
||||||
|
import SingleMapping from './components/SingleMapping';
|
||||||
|
|
||||||
|
class RoomOfficeNameMapping extends Component {
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
const { fetchMappings } = this.props;
|
||||||
|
|
||||||
|
fetchMappings();
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const { pendingMappings, mappings } = this.props;
|
||||||
|
const existingMappings = mappings && mappings.existingMappings ? mappings.existingMappings : [];
|
||||||
|
const offices = mappings && mappings.offices ? mappings.offices : [];
|
||||||
|
const resources = mappings && mappings.resources ? mappings.resources : [];
|
||||||
|
|
||||||
|
const officesMap = {};
|
||||||
|
const resourcesMap = {};
|
||||||
|
|
||||||
|
offices.forEach((office) => {
|
||||||
|
const { officeId, officeName } = office;
|
||||||
|
officesMap[officeId] = officeName;
|
||||||
|
});
|
||||||
|
|
||||||
|
resources.forEach((resource) => {
|
||||||
|
const { resourceId, resourceName } = resource;
|
||||||
|
resourcesMap[resourceId] = resourceName;
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container>
|
||||||
|
<Loader active={pendingMappings} />
|
||||||
|
<MainMenu/>
|
||||||
|
<h3>Room-Office-Name Mappings</h3>
|
||||||
|
<hr/>
|
||||||
|
<br/>
|
||||||
|
<Table singleLine unstackable>
|
||||||
|
<Table.Header>
|
||||||
|
<Table.Row>
|
||||||
|
<Table.HeaderCell>File name</Table.HeaderCell>
|
||||||
|
<Table.HeaderCell>Office</Table.HeaderCell>
|
||||||
|
<Table.HeaderCell>Resource</Table.HeaderCell>
|
||||||
|
<Table.HeaderCell>Actions</Table.HeaderCell>
|
||||||
|
</Table.Row>
|
||||||
|
</Table.Header>
|
||||||
|
<Table.Body>
|
||||||
|
{
|
||||||
|
existingMappings.map((singleMapping) => {
|
||||||
|
const { officeId, resourceId } = singleMapping;
|
||||||
|
return <SingleMapping
|
||||||
|
key={singleMapping.id}
|
||||||
|
singleMapping={singleMapping}
|
||||||
|
officeName={officesMap[officeId]}
|
||||||
|
resourceName={resourcesMap[resourceId]}
|
||||||
|
/>
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</Table.Body>
|
||||||
|
</Table>
|
||||||
|
<br/>
|
||||||
|
<Message>
|
||||||
|
<h4>To add the mapping, upload new DL lock files and you will be prompted with new mapping options if the file name contains the unknown location</h4>
|
||||||
|
</Message>
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const mapStateToProps = (state) => ({
|
||||||
|
pendingMappings: state.mappingsData.pending,
|
||||||
|
mappings: state.mappingsData.result,
|
||||||
|
});
|
||||||
|
|
||||||
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
|
fetchMappings: () => fetchMappings(dispatch),
|
||||||
|
});
|
||||||
|
|
||||||
|
export default connect(mapStateToProps, mapDispatchToProps)(RoomOfficeNameMapping);
|
||||||
@@ -38,6 +38,17 @@ export const fetchMappings = (dispatch) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const deleteMapping = (dispatch, mappingId) => {
|
||||||
|
dispatch({type: FETCH_MAPPINGS_PENDING});
|
||||||
|
API.delete(`integration/mappings/${mappingId}`)
|
||||||
|
.then(response => {
|
||||||
|
dispatch({type: FETCH_MAPPINGS_SUCCESS, payload: response.data});
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
dispatch({type: FETCH_MAPPINGS_FAILED, payload: error.response});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const addNewMapping = (dispatch, mapping) => {
|
export const addNewMapping = (dispatch, mapping) => {
|
||||||
dispatch({type: ADD_NEW_MAPPING_PENDING});
|
dispatch({type: ADD_NEW_MAPPING_PENDING});
|
||||||
API.post('integration/mappings', {
|
API.post('integration/mappings', {
|
||||||
|
|||||||
Reference in New Issue
Block a user