Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions src/Facade/Services/StockStateFacadeService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,19 @@ protected override Expression<Func<StockState, bool>> FindExpression(StockStateR
{
throw new NotImplementedException();
}

protected override StockState CreateFromResource(StockStateResource resource, IEnumerable<string> privileges = null)
{
return new StockState(resource.State, resource.Description)
{
QCRequired = resource.QCRequired ?? "N"
};
}

protected override void UpdateFromResource(StockState entity, StockStateResource updateResource, IEnumerable<string> privileges = null)
{
entity.Description = updateResource.Description;
entity.QCRequired = updateResource.QCRequired ?? entity.QCRequired;
}
}
}
3 changes: 3 additions & 0 deletions src/Service.Host/client/src/components/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ function App() {
<ListItem component={Link} to="/stores2/consignments/packing-lists">
<Typography color="primary">Packing List Viewer</Typography>
</ListItem>
<ListItem component={Link} to="/stores2/stock/states">
<Typography color="primary">Stock States</Typography>
</ListItem>
</List>
</Grid>
</Grid>
Expand Down
6 changes: 6 additions & 0 deletions src/Service.Host/client/src/components/Root.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ import Pallets from './Pallets';
import Pallet from './Pallet';
import StorageSites from './storageSites/StorageSites';
import StorageSite from './storageSites/StorageSite';
import StockStates from './StockStates';
import StockState from './StockState';
import DailyEuDispatchReport from './DailyEuDispatchReport';
import DailyEuRsnDispatchReport from './DailyEuRsnDispatchReport';
import DailyEuRsnImportReport from './DailyEuRsnImportReport';
Expand Down Expand Up @@ -91,6 +93,7 @@ function Root() {
<Route path="/" element={<Navigate to="/stores2" replace />} />
<Route path="/stores2" element={<App />} />
<Route path="/stores2/reports" element={<App />} />
<Route path="/stores2/stock" element={<App />} />
<Route path="/stores2/consignments" element={<PackingListViewer />} />
<Route path="/stores2/logged-out" element={<LoggedOut />} />
<Route path="/stores2/carriers" element={<Carriers />} />
Expand Down Expand Up @@ -158,6 +161,9 @@ function Root() {
<Route path="/stores2/pallets/:id" element={<Pallet />} />
<Route path="/stores2/pallets/create" element={<Pallet creating />} />
<Route path="/stores2/storage/locations/:id" element={<StorageLocation />} />
<Route path="/stores2/stock/states" element={<StockStates />} />
<Route path="/stores2/stock/states/create" element={<StockState creating />} />
<Route path="/stores2/stock/states/:state" element={<StockState />} />
<Route path="/stores2/stock-pools" element={<StockPools />} />
<Route path="/stores2/stores-trans-viewer" element={<StoresTransViewer />} />
<Route
Expand Down
154 changes: 154 additions & 0 deletions src/Service.Host/client/src/components/StockState.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
import React, { useEffect, useState } from 'react';
import { useNavigate, useParams } from 'react-router-dom';
import List from '@mui/material/List';
import Grid from '@mui/material/Grid';
import {
Dropdown,
ErrorCard,
InputField,
Loading,
SaveBackCancelButtons
} from '@linn-it/linn-form-components-library';
import PropTypes from 'prop-types';
import config from '../config';
import itemTypes from '../itemTypes';
import useGet from '../hooks/useGet';
import usePut from '../hooks/usePut';
import usePost from '../hooks/usePost';
import Page from './Page';

function StockState({ creating }) {
const [hasFetched, setHasFetched] = useState(false);
const { state } = useParams();
const {
send: getStockState,
isLoading,
result: stockStateGetResult
} = useGet(itemTypes.stockStates.url);

const {
send: updateStockState,
isLoading: updateLoading,
errorMessage: updateError,
putResult: updateResult
} = usePut(itemTypes.stockStates.url, true);

const {
send: createStockState,
isLoading: createLoading,
errorMessage: createError
} = usePost(itemTypes.stockStates.url, true, true);

if (!creating && !hasFetched) {
setHasFetched(true);
getStockState(state);
}

const navigate = useNavigate();

const [formValues, setFormValues] = useState();
const [changesMade, setChangesMade] = useState(false);

if (stockStateGetResult && !formValues) setFormValues(stockStateGetResult);
if (creating && !formValues) setFormValues({ qcRequired: 'N' });

const handleFieldChange = (propertyName, newValue) => {
const value = propertyName === 'state' ? newValue?.toUpperCase() : newValue;
setFormValues(current => ({ ...current, [propertyName]: value }));
setChangesMade(true);
};

useEffect(() => {
if (updateResult) setFormValues(updateResult);
}, [updateResult]);

return (
<Page homeUrl={config.appRoot} showAuthUi={false}>
<Grid container spacing={3}>
{updateError && (
<Grid size={12}>
<List>
<ErrorCard errorMessage={updateError} />
</List>
</Grid>
)}
{createError && (
<Grid size={12}>
<List>
<ErrorCard errorMessage={createError} />
</List>
</Grid>
)}
{isLoading || updateLoading || createLoading ? (
<Grid size={12}>
<List>
<Loading />
</List>
</Grid>
) : (
formValues && (
<>
<Grid size={4}>
<InputField
disabled={!creating}
value={formValues.state}
fullWidth
label="State"
propertyName="state"
onChange={handleFieldChange}
/>
</Grid>
<Grid size={8} />
<Grid size={6}>
<InputField
value={formValues.description}
fullWidth
label="Description"
propertyName="description"
onChange={handleFieldChange}
/>
</Grid>
<Grid size={6} />
<Grid size={4}>
<Dropdown
value={formValues.qcRequired}
fullWidth
label="QC Required"
propertyName="qcRequired"
allowNoValue={false}
items={[
{ id: 'Y', displayText: 'Yes' },
{ id: 'N', displayText: 'No' }
]}
onChange={handleFieldChange}
/>
</Grid>
<Grid size={8} />
<Grid size={12}>
<SaveBackCancelButtons
backClick={() => navigate('/stores2/stock/states')}
saveClick={() => {
setChangesMade(false);
if (creating) createStockState(null, formValues);
else updateStockState(state, formValues);
}}
saveDisabled={!changesMade}
cancelClick={() => {
setChangesMade(false);
if (creating) setFormValues({ qcRequired: 'N' });
else setFormValues(stockStateGetResult);
}}
/>
</Grid>
</>
)
)}
</Grid>
</Page>
);
}

StockState.propTypes = { creating: PropTypes.bool };
StockState.defaultProps = { creating: false };

export default StockState;
61 changes: 61 additions & 0 deletions src/Service.Host/client/src/components/StockStates.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import React from 'react';
import { useNavigate } from 'react-router-dom';
import Typography from '@mui/material/Typography';
import Grid from '@mui/material/Grid';
import Button from '@mui/material/Button';
import { DataGrid } from '@mui/x-data-grid';
import { Loading } from '@linn-it/linn-form-components-library';
import config from '../config';
import itemTypes from '../itemTypes';
import useInitialise from '../hooks/useInitialise';
import Page from './Page';

function StockStates() {
const { isLoading, result } = useInitialise(itemTypes.stockStates.url);
const navigate = useNavigate();

const columns = [
{ field: 'state', headerName: 'State', width: 150 },
{ field: 'description', headerName: 'Description', width: 300 },
{ field: 'qcRequired', headerName: 'QC Required', width: 120 }
];

return (
<Page homeUrl={config.appRoot} showAuthUi={false}>
<Grid container spacing={3}>
<Grid size={11}>
<Typography variant="h4">Stock States</Typography>
</Grid>
<Grid size={1}>
<Button
variant="outlined"
onClick={() => navigate('/stores2/stock/states/create')}
>
Create
</Button>
</Grid>
{isLoading ? (
<Grid size={12}>
<Loading />
</Grid>
) : (
<Grid size={12}>
<DataGrid
rows={result ?? []}
columns={columns}
getRowId={row => row.state}
onRowClick={params =>
navigate(`/stores2/stock/states/${params.row.state}`)
}
rowHeight={34}
hideFooter
sx={{ cursor: 'pointer' }}
/>
</Grid>
)}
</Grid>
</Page>
);
}

export default StockStates;
Loading
Loading