import { memo, useState, useEffect, useCallback } from 'react';
import { json, redirect } from '@remix-run/node';
import {
Form,
useActionData,
useLoaderData,
useNavigation,
useSubmit
} from '@remix-run/react';
import ContentLayout from '~/components/content-layout';
import FormField from '~/components/form-field';
import Container from '~/components/container';
import Select from '~/components/select';
import Header from '~/components/header';
import Grid from '~/components/grid';
import Checkbox from '~/components/checkbox';
import Input from '~/components/input';
import Tiles from '~/components/tiles';
import DatePicker from '~/components/date-picker';
import SpaceBetween from '~/components/space-between';
import getCurrentDate from './utils';
import { DeleteContext } from './context';
import Table from './table';
const fetchData = async (url) => {
const response = await fetch(url);
return [Link] ? await [Link]() : [];
};
const loader = async function ({ request }) {
const data = {};
const url = new URL([Link]);
const ProdTypeUID = [Link]("ProdTypeUID");
const VType = [Link]("VType");
const ProdTypeID = [Link]("ProdTypeID");
const ProdTypeDesc = [Link]("ProdTypeDesc");
const Authorised = [Link]("Authorised");
const Issued = [Link]("Issued");
const ORDNUMBER = [Link]("ORDNUMBER");
data.List_Locations = await
fetchData('[Link]
data.List_Units = await fetchData('[Link]
data.List_ProdTypes = await
fetchData('[Link]
if (!!ProdTypeUID && VType === 'C') {
data.List_CustomerOrder = await
fetchData(`[Link]
{ProdTypeUID}`);
}
if (!!VType === 'O') {
data.List_CustomerStock = await
fetchData('[Link]
}
if(!!ORDNUMBER)
{
const PlanItem = await
fetch(`[Link]
{ProdTypeID}&ProductType=${ProdTypeUID}&ProductTypeDesc=$
{ProdTypeDesc}&Authorised=${Authorised}&Issued=${Issued}&ORDNUMBER=${ORDNUMBER}`);
[Link] = [Link] ? await [Link]() : []
//[Link]([Link])
}
return data;
};
const action = async function ({ request }) {
const fd = new Map([...(await [Link]())].map(e => [e[0],
e[1].trim()]));
try {
const resp = await fetch('[Link] {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: [Link](fd)
});
const result = await [Link]();
} catch (err) {
[Link](err);
}
return redirect('/prodplan/create', { status: 302 });
};
const Z = memo(() => {
const nav = useNavigation();
const actionData = useActionData();
const loaderData = useLoaderData();
const submit = useSubmit();
const [locOptions, setLocOptions] = useState([]);
const [unitOptions, setUnitOptions] = useState([]);
const [prodTypeOptions, setProdTypeOptions] = useState([]);
const [customerStockOptions, setCustomerStockOptions] = useState([]);
const [customerOrderOptions, setCustomerOrderOptions] = useState([]);
const [planDate, setPlanDate] = useState(getCurrentDate());
const [deliveryDate, setDeliveryDate] = useState("");
const [selectedLoc, setLoc] = useState({ label: '', value: '' });
const [selectedUnit, setUnit] = useState({ label: '', value: '' });
const [selectedProd, setProdType] = useState({ label: '', value: '' });
const [selectedCS, setCustomeStock] = useState({ label: '', value: '' });
const [selectedCO, setCustomerOrder] = useState({ label: '', value: '' });
const [achecked, setAChecked] = useState(false);
const [ichecked, setIChecked] = useState(false);
const [type, setType] = useState();
useEffect(() => {
if (loaderData.List_Locations) {
setLocOptions(loaderData.List_Locations.map(e => ({
label: [Link],
value: [Link],
description: [Link]
})));
}
if (loaderData.List_Units) {
setUnitOptions(loaderData.List_Units.map(e => ({
label: [Link],
value: [Link],
description: [Link]
})));
}
if (loaderData.List_ProdTypes) {
setProdTypeOptions(loaderData.List_ProdTypes.map(e => ({
label: [Link],
value: [Link],
description: [Link]
})));
}
if (loaderData.List_CustomerStock) {
setCustomerStockOptions(loaderData.List_CustomerStock.map(e => ({
label: [Link],
value: [Link],
description: [Link]
})));
}
if (loaderData.List_CustomerOrder) {
setCustomerOrderOptions(loaderData.List_CustomerOrder.map(e => ({
label: [Link],
value: [Link],
description: `ORDNUMBER: ${[Link]} NAMECUST: ${[Link]} PONUMBER: $
{[Link]}`
})));
}
}, [loaderData]);
const onLoadCustomeStockOptions = useCallback(async e => {
const filter = [Link];
if (!!filter) {
try {
const response = await
fetch(`[Link]
if (![Link]) {
throw new Error("Failed to fetch vendor data");
}
const responseObject = await [Link]();
const List_CustomerStock = responseObject?.map(e => ({
label: [Link],
value: [Link],
description: [Link]
})) || [];
setCustomerStockOptions(List_CustomerStock);
} catch (error) {
[Link]("Error fetching vendor data:", error);
}
}
}, []);
const onLoadCustomeOrderOptions = useCallback(async e => {
const filter = [Link];
if (!!filter) {
try {
const response = await
fetch(`[Link]
{[Link]}&filterQuery=${filter}`);
if (![Link]) {
throw new Error("Failed to fetch vendor data");
}
const responseObject = await [Link]();
const List_CustomerOrder = responseObject?.map(e => ({
label: [Link],
value: [Link],
description: `ORDNUMBER: ${[Link]} NAMECUST: ${[Link]} PONUMBER:
${[Link]}`
})) || [];
setCustomerOrderOptions(List_CustomerOrder);
} catch (error) {
[Link]("Error fetching vendor data:", error);
}
}
}, [selectedProd]);
const onchangeType = useCallback(ev => {
const { value } = [Link];
setType(value);
if (value !== 'S') {
submit({
ProdTypeUID: [Link],
VType: value,
}, { method: "get" });
}
}, [selectedProd, submit]);
const onChangeCustomerOrder = useCallback(ev => {
const selectedOption = [Link];
setCustomerOrder(selectedOption);
const requestData = {
ProdTypeID: [Link],
ProdTypeUID: [Link],
ProdTypeDesc: [Link],
Authorised: achecked,
Issued: ichecked,
ORDNUMBER: [Link]
};
submit(requestData, { method: "GET" });
}, [selectedProd, achecked, ichecked, submit]);
const [PlanItem, setPlanItem] = useState(loaderData?.PlanItem?.Table || []);
[Link](PlanItem)
useEffect(() => {
[Link]("Data Changed");
updateTableItem();
}, [[Link]]);
const addItem = () => {
const newItem = {
PlanItm: [Link] + 1,
ItemNo: "",
ItemDesc: "",
Status: "White",
MinQty: "",
MaxQty: "",
StockQty: 0,
WipQty: 0,
Qty: 0,
TotalQty: 0,
POQty: 0,
TotalAuthQty: 0,
WSIssueQty: 0,
PendingQty: "",
Uom: "",
Schedule: "",
Pack_Qty: 0.00,
PackUom: "",
SpecialReq: "No Requiremnet"
};
setPlanItem([...PlanItem, newItem]);
};
const updateTableItem = () => {
setPlanItem(loaderData?.PlanItem?.Table || []);
};
const deleteTableItem = id => {
const updatedItems = [Link](item => [Link] !== id);
setPlanItem(updatedItems);
};
return (
<ContentLayout header={
<Header variant='h1'>Production Plan Module</Header>
}>
<Form data-login method='POST' action='./'>
<input type='hidden' name='VType' value={type} />
<Container>
<Grid gridDefinition={[
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 8 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 3 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 4 } },
]}>
<FormField
errorText={actionData?.[Link]}
stretch={false}
label='Location'>
<Input type='hidden' name='Location' value={[Link]} />
<Select
selectedOption={selectedLoc}
onChange={({ detail }) => setLoc([Link])}
options={locOptions}
placeholder="Choose a Location"
filteringType="auto"
preventScrollReset={true}
/>
</FormField>
<FormField
stretch={false}
label='Location Desc'>
<Input value={[Link]} />
</FormField>
<FormField
stretch={false}
label='Unit'>
<Select
selectedOption={selectedUnit}
onChange={({ detail }) => setUnit([Link])}
options={unitOptions}
placeholder="Choose a Unit"
filteringType="auto"
preventScrollReset={true}
/>
</FormField>
<FormField
stretch={false}
label='Unit Desc'>
<Input value={[Link]} />
</FormField>
<FormField
stretch={false}
label='Prod Type'>
<Select
selectedOption={selectedProd}
onChange={({ detail }) => setProdType([Link])}
options={prodTypeOptions}
placeholder="Choose a ProdType"
filteringType="auto"
preventScrollReset={true}
/>
</FormField>
<FormField
stretch={false}
label='Prod Type Desc'>
<Input value={[Link]} />
</FormField>
<Checkbox
onChange={({ detail }) => setAChecked([Link])}
checked={achecked}>
Authorised
<Input type='hidden' name='Authorised' value={achecked} />
</Checkbox>
<Checkbox
onChange={({ detail }) => setIChecked([Link])}
checked={ichecked}>
Issued
<Input type='hidden' name='Issued' value={ichecked} />
</Checkbox>
<Tiles
onChange={onchangeType}
value={type}
items={[
{ label: "Stock", value: "S" },
{ label: "Customer Stock", value: "O" },
{ label: "Customer Order", value: "C" }
]}
/>
<FormField
label="Plan Date"
errorText={actionData?.[Link]}>
<input type='hidden' name='PlanDate' value={planDate} />
<DatePicker
onChange={({ detail }) => setPlanDate([Link])}
value={planDate}
openCalendarAriaLabel={selectedDate => "Choose plan date" +
(selectedDate ? `, selected date is ${selectedDate}` : "")}
placeholder="YYYY/MM/DD"
/>
</FormField>
<FormField
label="Delivery Date"
errorText={actionData?.[Link]}>
<input type='hidden' name='DeliveryDate' value={deliveryDate} />
<DatePicker
onChange={({ detail }) => setDeliveryDate([Link])}
value={deliveryDate}
openCalendarAriaLabel={selectedDate => "Choose plan date" +
(selectedDate ? `, selected date is ${selectedDate}` : "")}
placeholder="YYYY/MM/DD"
/>
</FormField>
{type === "O" &&
<FormField stretch={false} label='Customer'>
<Select
selectedOption={selectedCS}
onChange={({ detail }) => setCustomeStock([Link])}
onLoadItems={onLoadCustomeStockOptions}
options={customerStockOptions}
placeholder="Choose a ProdType"
filteringType="auto"
/>
</FormField>
}
{type === "C" &&
<FormField stretch={false} label='Customer Order'>
<Select
selectedOption={selectedCO}
onChange={onChangeCustomerOrder}
onLoadItems={onLoadCustomeOrderOptions}
options={customerOrderOptions}
filteringType="auto"
/>
</FormField>
}
{type !== "C" && (
<div style={{ width: '150px' }}>
<FormField stretch={false} label='Auto Planing Items'>
<Input type='number' name='AutoPlanItem' onChange={({ detail })
=> setAPI([Link])} />
</FormField>
</div>
)}
</Grid>
</Container>
</Form>
<FormField><br /></FormField>
<SpaceBetween size='m'>
<[Link] value={deleteTableItem}>
<Table
items={PlanItem}
setPlanItem={setPlanItem}
rcnt={PlanItem}
//attrOpts={itemNo}
addItem={addItem}
/>
</[Link]>
</SpaceBetween>
</ContentLayout>
);
});
const handle = {
//crumb: {text: 'Create'},
contentType: 'form'
}
export {
action,
loader,
handle,
Z as default
}
24/04/2024
import { memo, useState, useEffect, useCallback } from 'react';
import { json, redirect } from '@remix-run/node';
import {
Form,
useActionData,
useLoaderData,
useNavigation,
useSubmit
} from '@remix-run/react';
import ContentLayout from '~/components/content-layout';
import FormField from '~/components/form-field';
import Container from '~/components/container';
import Select from '~/components/select';
import Header from '~/components/header';
import Grid from '~/components/grid';
import Checkbox from '~/components/checkbox';
import Input from '~/components/input';
import Tiles from '~/components/tiles';
import DatePicker from '~/components/date-picker';
import SpaceBetween from '~/components/space-between';
import getCurrentDate from './utils';
import { DeleteContext } from './context';
import Table from './table';
const fetchData = async (url) => {
const response = await fetch(url);
return [Link] ? await [Link]() : [];
};
const loader = async function ({ request }) {
const data = {};
const url = new URL([Link]);
const ProdTypeUID = [Link]("ProdTypeUID");
const VType = [Link]("VType");
const ProdTypeID = [Link]("ProdTypeID");
const ProdTypeDesc = [Link]("ProdTypeDesc");
const Authorised = [Link]("Authorised");
const Issued = [Link]("Issued");
const ORDNUMBER = [Link]("ORDNUMBER");
data.List_Locations = await
fetchData('[Link]
data.List_Units = await fetchData('[Link]
data.List_ProdTypes = await
fetchData('[Link]
if (!!ProdTypeUID && VType === 'C') {
data.List_CustomerOrder = await
fetchData(`[Link]
{ProdTypeUID}`);
}
if (!!VType === 'O') {
data.List_CustomerStock = await
fetchData('[Link]
}
if(!!ORDNUMBER)
{
const PlanItem = await
fetch(`[Link]
{ProdTypeID}&ProductType=${ProdTypeUID}&ProductTypeDesc=$
{ProdTypeDesc}&Authorised=${Authorised}&Issued=${Issued}&ORDNUMBER=${ORDNUMBER}`);
[Link] = [Link] ? await [Link]() : []
//[Link]([Link])
}
return data;
};
const action = async function ({ request }) {
const fd = new Map([...(await [Link]())].map(e => [e[0],
e[1].trim()]));
try {
const resp = await fetch('[Link] {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: [Link](fd)
});
const result = await [Link]();
} catch (err) {
[Link](err);
}
return redirect('/prodplan/create', { status: 302 });
};
const Z = memo(() => {
const nav = useNavigation();
const actionData = useActionData();
const loaderData = useLoaderData();
const submit = useSubmit();
const [locOptions, setLocOptions] = useState([]);
const [unitOptions, setUnitOptions] = useState([]);
const [prodTypeOptions, setProdTypeOptions] = useState([]);
const [customerStockOptions, setCustomerStockOptions] = useState([]);
const [customerOrderOptions, setCustomerOrderOptions] = useState([]);
const [planDate, setPlanDate] = useState(getCurrentDate());
const [deliveryDate, setDeliveryDate] = useState("");
const [selectedLoc, setLoc] = useState({ label: '', value: '' });
const [selectedUnit, setUnit] = useState({ label: '', value: '' });
const [selectedProd, setProdType] = useState({ label: '', value: '' });
const [selectedCS, setCustomeStock] = useState({ label: '', value: '' });
const [selectedCO, setCustomerOrder] = useState({ label: '', value: '' });
const [achecked, setAChecked] = useState(false);
const [ichecked, setIChecked] = useState(false);
const [type, setType] = useState();
const [autoPlanItem, setAutoPlanItem] = useState(0);
useEffect(() => {
if (loaderData.List_Locations) {
setLocOptions(loaderData.List_Locations.map(e => ({
label: [Link],
value: [Link],
description: [Link]
})));
}
if (loaderData.List_Units) {
setUnitOptions(loaderData.List_Units.map(e => ({
label: [Link],
value: [Link],
description: [Link]
})));
}
if (loaderData.List_ProdTypes) {
setProdTypeOptions(loaderData.List_ProdTypes.map(e => ({
label: [Link],
value: [Link],
description: [Link]
})));
}
if (loaderData.List_CustomerStock) {
setCustomerStockOptions(loaderData.List_CustomerStock.map(e => ({
label: [Link],
value: [Link],
description: [Link]
})));
}
if (loaderData.List_CustomerOrder) {
setCustomerOrderOptions(loaderData.List_CustomerOrder.map(e => ({
label: [Link],
value: [Link],
description: `ORDNUMBER: ${[Link]} NAMECUST: ${[Link]} PONUMBER: $
{[Link]}`
})));
}
}, [loaderData]);
const onLoadCustomeStockOptions = useCallback(async e => {
const filter = [Link];
if (!!filter) {
try {
const response = await
fetch(`[Link]
if (![Link]) {
throw new Error("Failed to fetch vendor data");
}
const responseObject = await [Link]();
const List_CustomerStock = responseObject?.map(e => ({
label: [Link],
value: [Link],
description: [Link]
})) || [];
setCustomerStockOptions(List_CustomerStock);
} catch (error) {
[Link]("Error fetching vendor data:", error);
}
}
}, []);
const onLoadCustomeOrderOptions = useCallback(async e => {
const filter = [Link];
if (!!filter) {
try {
const response = await
fetch(`[Link]
{[Link]}&filterQuery=${filter}`);
if (![Link]) {
throw new Error("Failed to fetch vendor data");
}
const responseObject = await [Link]();
const List_CustomerOrder = responseObject?.map(e => ({
label: [Link],
value: [Link],
description: `ORDNUMBER: ${[Link]} NAMECUST: ${[Link]} PONUMBER:
${[Link]}`
})) || [];
setCustomerOrderOptions(List_CustomerOrder);
} catch (error) {
[Link]("Error fetching vendor data:", error);
}
}
}, [selectedProd]);
const onchangeType = useCallback(ev => {
const { value } = [Link];
setType(value);
if (value !== 'S') {
submit({
ProdTypeUID: [Link],
VType: value,
}, { method: "get" });
}
}, [selectedProd, submit]);
const onChangeCustomerOrder = useCallback(ev => {
const selectedOption = [Link];
setCustomerOrder(selectedOption);
const requestData = {
ProdTypeID: [Link],
ProdTypeUID: [Link],
ProdTypeDesc: [Link],
Authorised: achecked,
Issued: ichecked,
ORDNUMBER: [Link]
};
submit(requestData, { method: "GET" });
}, [selectedProd, achecked, ichecked, submit]);
const PO = loaderData?.PlanItem?.Table ?? []
const [PlanItem, setPlanItem] = useState(PO || []);
//const [PlanItem, setPlanItem] = useState([]);
//[Link](PlanItem);
const addItem = () => {
setPlanItem(prevPlanItems => [
...prevPlanItems,
{
PlanItem: [Link] + 1,
ItemNo: "",
ItemDesc: "",
Status: "White",
MinQty: "",
MaxQty: "",
StockQty: 0,
WipQty: 0,
Qty: 0,
TotalQty: 0,
POQty: 0,
TotalAuthQty: 0,
WSIssueQty: 0,
PendingQty: "",
Uom: "",
Schedule: "",
Pack_Qty: 0.00,
PackUom: "",
SpecialReq: "No Requirement"
}
]);
};
const updateTableItem = () => {
setPlanItem(loaderData?.PlanItem?.Table || []);
};
const deleteTableItem = id => {
setPlanItem(prevPlanItems =>
[Link](item => [Link] !== id)
);
};
useEffect(() => {
[Link]("Data Changed");
updateTableItem();
}, [[Link]]);
return (
<ContentLayout header={
<Header variant='h1'>Production Plan Module</Header>
}>
<Form data-login method='POST' action='./'>
<input type='hidden' name='VType' defaultValue={type} />
<Container>
<Grid gridDefinition={[
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 8 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 3 } },
{ colspan: { default: 12, s: 2 } },
{ colspan: { default: 12, s: 4 } },
]}>
<FormField
errorText={actionData?.[Link]}
stretch={false}
label='Location'>
<input type='hidden' name='Location' defaultValue={[Link]}
/>
<Select
selectedOption={selectedLoc}
onChange={({ detail }) => setLoc([Link])}
options={locOptions}
placeholder="Choose a Location"
filteringType="auto"
preventScrollReset={true}
/>
</FormField>
<FormField
stretch={false}
label='Location Desc'>
<Input value={[Link]} />
</FormField>
<FormField
stretch={false}
label='Unit'>
<Select
selectedOption={selectedUnit}
onChange={({ detail }) => setUnit([Link])}
options={unitOptions}
placeholder="Choose a Unit"
filteringType="auto"
preventScrollReset={true}
/>
</FormField>
<FormField
stretch={false}
label='Unit Desc'>
<Input value={[Link]} />
</FormField>
<FormField
stretch={false}
label='Prod Type'>
<Select
selectedOption={selectedProd}
onChange={({ detail }) => setProdType([Link])}
options={prodTypeOptions}
placeholder="Choose a ProdType"
filteringType="auto"
preventScrollReset={true}
/>
</FormField>
<FormField
stretch={false}
label='Prod Type Desc'>
<Input value={[Link]} />
</FormField>
<Checkbox
onChange={({ detail }) => setAChecked([Link])}
checked={achecked}>
Authorised
<input type='hidden' name='Authorised' defaultValue={achecked} />
</Checkbox>
<Checkbox
onChange={({ detail }) => setIChecked([Link])}
checked={ichecked}>
Issued
<input type='hidden' name='Issued' defaultValue={ichecked} />
</Checkbox>
<Tiles
onChange={onchangeType}
value={type}
items={[
{ label: "Stock", value: "S" },
{ label: "Customer Stock", value: "O" },
{ label: "Customer Order", value: "C" }
]}
/>
<FormField
label="Plan Date"
errorText={actionData?.[Link]}>
<input type='hidden' name='PlanDate' defaultValue={planDate} />
<DatePicker
onChange={({ detail }) => setPlanDate([Link])}
value={planDate}
openCalendarAriaLabel={selectedDate => "Choose plan date" +
(selectedDate ? `, selected date is ${selectedDate}` : "")}
placeholder="YYYY/MM/DD"
/>
</FormField>
<FormField
label="Delivery Date"
errorText={actionData?.[Link]}>
<input type='hidden' name='DeliveryDate'
defaultValue={deliveryDate} />
<DatePicker
onChange={({ detail }) => setDeliveryDate([Link])}
value={deliveryDate}
openCalendarAriaLabel={selectedDate => "Choose plan date" +
(selectedDate ? `, selected date is ${selectedDate}` : "")}
placeholder="YYYY/MM/DD"
/>
</FormField>
{type === "O" &&
<FormField stretch={false} label='Customer'>
<Select
selectedOption={selectedCS}
onChange={({ detail }) => setCustomeStock([Link])}
onLoadItems={onLoadCustomeStockOptions}
options={customerStockOptions}
placeholder="Choose a ProdType"
filteringType="auto"
/>
</FormField>
}
{type === "C" &&
<FormField stretch={false} label='Customer Order'>
<Select
selectedOption={selectedCO}
onChange={onChangeCustomerOrder}
onLoadItems={onLoadCustomeOrderOptions}
options={customerOrderOptions}
filteringType="auto"
/>
</FormField>
}
{type !== "C" && (
<div style={{ width: '150px' }}>
<FormField stretch={false} label='Auto Planing Items'>
<Input type='number' name='AutoPlanItem' value={autoPlanItem}
onChange={({ detail }) => setAutoPlanItem([Link])} />
</FormField>
</div>
)}
</Grid>
</Container>
</Form>
<FormField><br /></FormField>
<SpaceBetween size='m'>
<[Link] value={deleteTableItem}>
<Table
items={PlanItem}
setPlanItem={setPlanItem}
rcnt={[Link]}
//attrOpts={itemNo}
addItem={addItem}
/>
</[Link]>
</SpaceBetween>
</ContentLayout>
);
});
const handle = {
//crumb: {text: 'Create'},
contentType: 'form'
}
export {
action,
loader,
handle,
Z as default
}