Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit41f2c0a

Browse files
authored
OBPIH-7186 Change expiration date confirm modal in old inbound workflow (#5591)
1 parent655e4c1 commit41f2c0a

File tree

2 files changed

+102
-49
lines changed

2 files changed

+102
-49
lines changed

‎src/js/components/modals/ModalWithTable.jsx‎

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,28 @@ const ModalWithTable = ({
2424

2525
return(
2626
<ModalisOpen={isOpen}className="modal-content min-width-1000">
27-
<divclassName="modal-content__header">
28-
<pclassName="modal-content__header__title">{title}</p>
29-
<pclassName="modal-content__header__subtitile">{subtitle}</p>
30-
</div>
31-
<divclassName="modal-content__main">
32-
<DataTabledata={data}columns={columns}disablePagination/>
33-
</div>
34-
<divclassName="modal-content__buttons">
35-
<Button
36-
defaultLabel={cancelLabel.default}
37-
label={cancelLabel.key}
38-
variant="secondary"
39-
onClick={onCancel}
40-
/>
41-
<Button
42-
defaultLabel={confirmLabel.default}
43-
label={confirmLabel.key}
44-
variant="primary"
45-
onClick={onConfirm}
46-
/>
27+
<divdata-testid="modal-with-table">
28+
<divclassName="modal-content__header">
29+
<pclassName="modal-content__header__title">{title}</p>
30+
<pclassName="modal-content__header__subtitile">{subtitle}</p>
31+
</div>
32+
<divclassName="modal-content__main">
33+
<DataTabledata={data}columns={columns}disablePagination/>
34+
</div>
35+
<divclassName="modal-content__buttons">
36+
<Button
37+
defaultLabel={cancelLabel.default}
38+
label={cancelLabel.key}
39+
variant="secondary"
40+
onClick={onCancel}
41+
/>
42+
<Button
43+
defaultLabel={confirmLabel.default}
44+
label={confirmLabel.key}
45+
variant="primary"
46+
onClick={onConfirm}
47+
/>
48+
</div>
4749
</div>
4850
</Modal>
4951
);

‎src/js/components/stock-movement-wizard/inbound/AddItemsPage.jsx‎

Lines changed: 80 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import DateField from 'components/form-elements/DateField';
2020
importProductSelectFieldfrom'components/form-elements/ProductSelectField';
2121
importSelectFieldfrom'components/form-elements/SelectField';
2222
importTextFieldfrom'components/form-elements/TextField';
23+
importConfirmExpirationDateModalfrom'components/modals/ConfirmExpirationDateModal';
2324
import{STOCK_MOVEMENT_URL}from'consts/applicationUrls';
2425
importapiClientfrom'utils/apiClient';
2526
import{renderFormField,setColumnValue}from'utils/form-utils';
@@ -226,6 +227,10 @@ class AddItemsPage extends Component {
226227
newItem:false,
227228
totalCount:0,
228229
isFirstPageLoaded:false,
230+
isExpirationModalOpen:false,
231+
// Stores the resolve function for the ConfirmExpirationDateModal promise
232+
resolveExpirationModal:null,
233+
itemsWithMismatchedExpiry:[],
229234
};
230235

231236
this.props.showSpinner();
@@ -485,26 +490,37 @@ class AddItemsPage extends Component {
485490
}
486491

487492
/**
488-
* Shows Inventory item expiration date update confirmation dialog.
489-
*@param {function} onConfirm
493+
* Shows Inventory item expiration date update confirmation modal.
494+
*@param {Array} itemsWithMismatchedExpiry - Array of elements with mismatched expiration dates.
495+
*@returns {Promise} - Resolves to true if user confirms the update, false if not.
490496
*@public
491497
*/
492-
confirmInventoryItemExpirationDateUpdate(onConfirm){
493-
confirmAlert({
494-
title:this.props.translate('react.stockMovement.message.confirmSave.label','Confirm save'),
495-
message:this.props.translate(
496-
'react.stockMovement.confirmExpiryDateUpdate.message',
497-
'This will update the expiry date across all depots in the system. Are you sure you want to proceed?',
498-
),
499-
buttons:[
500-
{
501-
label:this.props.translate('react.default.yes.label','Yes'),
502-
onClick:onConfirm,
503-
},
504-
{
505-
label:this.props.translate('react.default.no.label','No'),
506-
},
507-
],
498+
confirmExpirationDateSave(itemsWithMismatchedExpiry){
499+
returnnewPromise((resolve)=>{
500+
this.setState({
501+
isExpirationModalOpen:true,
502+
resolveExpirationModal:resolve,
503+
itemsWithMismatchedExpiry,
504+
});
505+
});
506+
}
507+
508+
/**
509+
* Handles the response from the expiration date confirmation modal.
510+
*@param {boolean} shouldUpdate - True if the user confirmed the update, false if not.
511+
*@public
512+
*/
513+
handleExpirationModalResponse(shouldUpdate){
514+
// Resolve the promise returned by confirmExpirationDateSave.
515+
if(this.state.resolveExpirationModal){
516+
this.state.resolveExpirationModal(shouldUpdate);
517+
}
518+
519+
// Close the modal and reset its state.
520+
this.setState({
521+
isExpirationModalOpen:false,
522+
resolveExpirationModal:null,
523+
itemsWithMismatchedExpiry:[],
508524
});
509525
}
510526

@@ -620,24 +636,53 @@ class AddItemsPage extends Component {
620636
this.props.showSpinner();
621637

622638
this.saveRequisitionItemsInCurrentStep(lineItems)
623-
.then((resp)=>{
639+
.then(async(resp)=>{
624640
letvalues=formValues;
625641
if(resp){
626642
values={ ...formValues,lineItems:resp.data.data.lineItems};
627643
}
628644

629-
if(_.some(values.lineItems,(item)=>item.inventoryItem
630-
&&item.expirationDate!==item.inventoryItem.expirationDate)){
631-
if(_.some(values.lineItems,(item)=>item.inventoryItem.quantity&&item.inventoryItem.quantity!=='0')){
632-
this.props.hideSpinner();
633-
this.confirmInventoryItemExpirationDateUpdate(()=>
634-
this.updateInventoryItemsAndTransitionToNextStep(values,lineItems));
635-
}else{
636-
this.updateInventoryItemsAndTransitionToNextStep(values,lineItems);
645+
consthasExpiryMismatch=values.lineItems.some(
646+
(item)=>item.inventoryItem&&item.expirationDate!==item.inventoryItem.expirationDate,
647+
);
648+
649+
if(!hasExpiryMismatch){
650+
returnthis.transitionToNextStepAndChangePage(formValues);
651+
}
652+
653+
consthasNonZeroQuantity=values.lineItems.some(
654+
(item)=>item.inventoryItem?.quantity&&item.inventoryItem.quantity!=='0',
655+
);
656+
657+
if(hasNonZeroQuantity){
658+
this.props.hideSpinner();
659+
660+
constitemsWithMismatchedExpiry=values.lineItems
661+
.filter(
662+
(item)=>
663+
item.inventoryItem
664+
&&item.inventoryItem.expirationDate!==item.expirationDate
665+
&&item.inventoryItem.quantity
666+
&&item.inventoryItem.quantity!=='0',
667+
)
668+
.map((item)=>({
669+
code:item.product?.productCode,
670+
product:item.product,
671+
lotNumber:item.lotNumber,
672+
previousExpiry:item.inventoryItem.expirationDate,
673+
newExpiry:item.expirationDate,
674+
}));
675+
676+
if(itemsWithMismatchedExpiry.length>0){
677+
constshouldUpdateExpirationDate=
678+
awaitthis.confirmExpirationDateSave(itemsWithMismatchedExpiry);
679+
if(!shouldUpdateExpirationDate){
680+
returnPromise.reject();
681+
}
637682
}
638-
}else{
639-
this.transitionToNextStepAndChangePage(formValues);
640683
}
684+
685+
returnthis.updateInventoryItemsAndTransitionToNextStep(values,lineItems);
641686
})
642687
.catch(()=>this.props.hideSpinner());
643688
}
@@ -1098,6 +1143,12 @@ class AddItemsPage extends Component {
10981143
<Translateid="react.default.button.next.label"defaultMessage="Next"/>
10991144
</button>
11001145
</div>
1146+
<ConfirmExpirationDateModal
1147+
isOpen={this.state.isExpirationModalOpen}
1148+
itemsWithMismatchedExpiry={this.state.itemsWithMismatchedExpiry}
1149+
onConfirm={()=>this.handleExpirationModalResponse(true)}
1150+
onCancel={()=>this.handleExpirationModalResponse(false)}
1151+
/>
11011152
</form>
11021153
</div>
11031154
)}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp