@asdp/ferryui 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +124 -1
- package/dist/index.d.ts +124 -1
- package/dist/index.js +322 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +322 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -731,4 +731,127 @@ interface ModalServiceProps {
|
|
|
731
731
|
*/
|
|
732
732
|
declare const ModalService: React.FC<ModalServiceProps>;
|
|
733
733
|
|
|
734
|
-
|
|
734
|
+
/**
|
|
735
|
+
* Service class codes for passenger services
|
|
736
|
+
*/
|
|
737
|
+
type PassengerServiceCode = 'ECONOMY' | 'BUSINESS' | 'EXECUTIVE';
|
|
738
|
+
/**
|
|
739
|
+
* Service class data structure
|
|
740
|
+
*/
|
|
741
|
+
interface ServiceClass {
|
|
742
|
+
id: number;
|
|
743
|
+
name: string;
|
|
744
|
+
key: string;
|
|
745
|
+
serviceName: PassengerServiceCode;
|
|
746
|
+
}
|
|
747
|
+
/**
|
|
748
|
+
* Default service classes available
|
|
749
|
+
*/
|
|
750
|
+
declare const DEFAULT_SERVICE_CLASSES: ServiceClass[];
|
|
751
|
+
|
|
752
|
+
/**
|
|
753
|
+
* Passenger object structure
|
|
754
|
+
*/
|
|
755
|
+
interface Passenger {
|
|
756
|
+
[key: string]: any;
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* Service with passenger count
|
|
760
|
+
*/
|
|
761
|
+
interface PassengerService {
|
|
762
|
+
serviceId: number;
|
|
763
|
+
serviceName: PassengerServiceCode;
|
|
764
|
+
count: number;
|
|
765
|
+
passengers: Passenger[];
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* Passenger type from API
|
|
769
|
+
*/
|
|
770
|
+
interface PassengerType {
|
|
771
|
+
id: number;
|
|
772
|
+
passengerTypeCode: string;
|
|
773
|
+
passengerTypeName: string;
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* Selected passenger item structure
|
|
777
|
+
*/
|
|
778
|
+
interface SelectedPassengerItem {
|
|
779
|
+
passengerTypeId: number;
|
|
780
|
+
passengerTypeCode: string;
|
|
781
|
+
passengerTypeName: string;
|
|
782
|
+
services: PassengerService[];
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* Props for ModalTotalPassengers component
|
|
786
|
+
*/
|
|
787
|
+
interface ModalTotalPassengersProps {
|
|
788
|
+
/**
|
|
789
|
+
* Whether the modal is open
|
|
790
|
+
*/
|
|
791
|
+
open: boolean;
|
|
792
|
+
/**
|
|
793
|
+
* Callback when modal should close
|
|
794
|
+
*/
|
|
795
|
+
onClose: () => void;
|
|
796
|
+
/**
|
|
797
|
+
* Modal title
|
|
798
|
+
* @default "Pilih Jumlah Penumpang"
|
|
799
|
+
*/
|
|
800
|
+
title?: string;
|
|
801
|
+
/**
|
|
802
|
+
* Array of passenger types from API
|
|
803
|
+
*/
|
|
804
|
+
passengerTypes: PassengerType[];
|
|
805
|
+
/**
|
|
806
|
+
* Array of service classes
|
|
807
|
+
* @default DEFAULT_SERVICE_CLASSES
|
|
808
|
+
*/
|
|
809
|
+
serviceClasses?: ServiceClass[];
|
|
810
|
+
/**
|
|
811
|
+
* Currently selected passengers
|
|
812
|
+
*/
|
|
813
|
+
selectedPassengers: SelectedPassengerItem[];
|
|
814
|
+
/**
|
|
815
|
+
* Callback when save button is clicked
|
|
816
|
+
*/
|
|
817
|
+
onSave: (passengers: SelectedPassengerItem[]) => void;
|
|
818
|
+
/**
|
|
819
|
+
* Loading state
|
|
820
|
+
* @default false
|
|
821
|
+
*/
|
|
822
|
+
isLoading?: boolean;
|
|
823
|
+
/**
|
|
824
|
+
* Maximum number of passengers allowed
|
|
825
|
+
* @default 10
|
|
826
|
+
*/
|
|
827
|
+
maxPassengers?: number;
|
|
828
|
+
/**
|
|
829
|
+
* Message to display in the info bar
|
|
830
|
+
* @default "Anda dapat menambahkan hingga {maxPassengers} penumpang pada golongan kendaraan ini."
|
|
831
|
+
*/
|
|
832
|
+
infoMessage?: string;
|
|
833
|
+
}
|
|
834
|
+
/**
|
|
835
|
+
* ModalTotalPassengers - A reusable modal component for selecting passenger counts
|
|
836
|
+
*
|
|
837
|
+
* This component provides a passenger selection modal with features like:
|
|
838
|
+
* - Accordion for each passenger type
|
|
839
|
+
* - Counter for each service class (Economy, Business, Executive)
|
|
840
|
+
* - Automatic default selection (1 adult economy)
|
|
841
|
+
* - Validation and save functionality
|
|
842
|
+
*
|
|
843
|
+
* @example
|
|
844
|
+
* ```tsx
|
|
845
|
+
* <ModalTotalPassengers
|
|
846
|
+
* open={isOpen}
|
|
847
|
+
* onClose={() => setIsOpen(false)}
|
|
848
|
+
* title="Pilih Jumlah Penumpang"
|
|
849
|
+
* passengerTypes={passengerTypes}
|
|
850
|
+
* selectedPassengers={selectedPassengers}
|
|
851
|
+
* onSave={handleSave}
|
|
852
|
+
* />
|
|
853
|
+
* ```
|
|
854
|
+
*/
|
|
855
|
+
declare const ModalTotalPassengers: React$1.FC<ModalTotalPassengersProps>;
|
|
856
|
+
|
|
857
|
+
export { BackgroundTicketCard, BackgroundTicketCardVertical, CardBanner, type CardBannerProps, CardPromo, type CardPromoProps, CardServiceMenu, type CardServiceMenuProps, CardTicket, type CardTicketButton, type CardTicketProps, CarouselWithCustomNav, type CarouselWithCustomNavProps, type CountryCode, DEFAULT_COUNTRY_CODES, DEFAULT_SERVICE_CLASSES, type HarborItem, InputDynamic, type InputDynamicProps, type InputType, MODAL_PRESETS, ModalIllustration, type ModalIllustrationButton, type ModalIllustrationProps, type ModalPresetKey, ModalSearchHarbor, type ModalSearchHarborProps, ModalSelectDate, type ModalSelectDateProps, ModalService, type ModalServiceProps, ModalTotalPassengers, type ModalTotalPassengersProps, type Passenger, type PassengerService, type PassengerServiceCode, type PassengerType, type RadioOption, type SelectOption, type SelectedPassengerItem, type ServiceClass, type ServiceItem, type ServiceMenuItem, type TabType, getModalPreset };
|
package/dist/index.d.ts
CHANGED
|
@@ -731,4 +731,127 @@ interface ModalServiceProps {
|
|
|
731
731
|
*/
|
|
732
732
|
declare const ModalService: React.FC<ModalServiceProps>;
|
|
733
733
|
|
|
734
|
-
|
|
734
|
+
/**
|
|
735
|
+
* Service class codes for passenger services
|
|
736
|
+
*/
|
|
737
|
+
type PassengerServiceCode = 'ECONOMY' | 'BUSINESS' | 'EXECUTIVE';
|
|
738
|
+
/**
|
|
739
|
+
* Service class data structure
|
|
740
|
+
*/
|
|
741
|
+
interface ServiceClass {
|
|
742
|
+
id: number;
|
|
743
|
+
name: string;
|
|
744
|
+
key: string;
|
|
745
|
+
serviceName: PassengerServiceCode;
|
|
746
|
+
}
|
|
747
|
+
/**
|
|
748
|
+
* Default service classes available
|
|
749
|
+
*/
|
|
750
|
+
declare const DEFAULT_SERVICE_CLASSES: ServiceClass[];
|
|
751
|
+
|
|
752
|
+
/**
|
|
753
|
+
* Passenger object structure
|
|
754
|
+
*/
|
|
755
|
+
interface Passenger {
|
|
756
|
+
[key: string]: any;
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* Service with passenger count
|
|
760
|
+
*/
|
|
761
|
+
interface PassengerService {
|
|
762
|
+
serviceId: number;
|
|
763
|
+
serviceName: PassengerServiceCode;
|
|
764
|
+
count: number;
|
|
765
|
+
passengers: Passenger[];
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* Passenger type from API
|
|
769
|
+
*/
|
|
770
|
+
interface PassengerType {
|
|
771
|
+
id: number;
|
|
772
|
+
passengerTypeCode: string;
|
|
773
|
+
passengerTypeName: string;
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* Selected passenger item structure
|
|
777
|
+
*/
|
|
778
|
+
interface SelectedPassengerItem {
|
|
779
|
+
passengerTypeId: number;
|
|
780
|
+
passengerTypeCode: string;
|
|
781
|
+
passengerTypeName: string;
|
|
782
|
+
services: PassengerService[];
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* Props for ModalTotalPassengers component
|
|
786
|
+
*/
|
|
787
|
+
interface ModalTotalPassengersProps {
|
|
788
|
+
/**
|
|
789
|
+
* Whether the modal is open
|
|
790
|
+
*/
|
|
791
|
+
open: boolean;
|
|
792
|
+
/**
|
|
793
|
+
* Callback when modal should close
|
|
794
|
+
*/
|
|
795
|
+
onClose: () => void;
|
|
796
|
+
/**
|
|
797
|
+
* Modal title
|
|
798
|
+
* @default "Pilih Jumlah Penumpang"
|
|
799
|
+
*/
|
|
800
|
+
title?: string;
|
|
801
|
+
/**
|
|
802
|
+
* Array of passenger types from API
|
|
803
|
+
*/
|
|
804
|
+
passengerTypes: PassengerType[];
|
|
805
|
+
/**
|
|
806
|
+
* Array of service classes
|
|
807
|
+
* @default DEFAULT_SERVICE_CLASSES
|
|
808
|
+
*/
|
|
809
|
+
serviceClasses?: ServiceClass[];
|
|
810
|
+
/**
|
|
811
|
+
* Currently selected passengers
|
|
812
|
+
*/
|
|
813
|
+
selectedPassengers: SelectedPassengerItem[];
|
|
814
|
+
/**
|
|
815
|
+
* Callback when save button is clicked
|
|
816
|
+
*/
|
|
817
|
+
onSave: (passengers: SelectedPassengerItem[]) => void;
|
|
818
|
+
/**
|
|
819
|
+
* Loading state
|
|
820
|
+
* @default false
|
|
821
|
+
*/
|
|
822
|
+
isLoading?: boolean;
|
|
823
|
+
/**
|
|
824
|
+
* Maximum number of passengers allowed
|
|
825
|
+
* @default 10
|
|
826
|
+
*/
|
|
827
|
+
maxPassengers?: number;
|
|
828
|
+
/**
|
|
829
|
+
* Message to display in the info bar
|
|
830
|
+
* @default "Anda dapat menambahkan hingga {maxPassengers} penumpang pada golongan kendaraan ini."
|
|
831
|
+
*/
|
|
832
|
+
infoMessage?: string;
|
|
833
|
+
}
|
|
834
|
+
/**
|
|
835
|
+
* ModalTotalPassengers - A reusable modal component for selecting passenger counts
|
|
836
|
+
*
|
|
837
|
+
* This component provides a passenger selection modal with features like:
|
|
838
|
+
* - Accordion for each passenger type
|
|
839
|
+
* - Counter for each service class (Economy, Business, Executive)
|
|
840
|
+
* - Automatic default selection (1 adult economy)
|
|
841
|
+
* - Validation and save functionality
|
|
842
|
+
*
|
|
843
|
+
* @example
|
|
844
|
+
* ```tsx
|
|
845
|
+
* <ModalTotalPassengers
|
|
846
|
+
* open={isOpen}
|
|
847
|
+
* onClose={() => setIsOpen(false)}
|
|
848
|
+
* title="Pilih Jumlah Penumpang"
|
|
849
|
+
* passengerTypes={passengerTypes}
|
|
850
|
+
* selectedPassengers={selectedPassengers}
|
|
851
|
+
* onSave={handleSave}
|
|
852
|
+
* />
|
|
853
|
+
* ```
|
|
854
|
+
*/
|
|
855
|
+
declare const ModalTotalPassengers: React$1.FC<ModalTotalPassengersProps>;
|
|
856
|
+
|
|
857
|
+
export { BackgroundTicketCard, BackgroundTicketCardVertical, CardBanner, type CardBannerProps, CardPromo, type CardPromoProps, CardServiceMenu, type CardServiceMenuProps, CardTicket, type CardTicketButton, type CardTicketProps, CarouselWithCustomNav, type CarouselWithCustomNavProps, type CountryCode, DEFAULT_COUNTRY_CODES, DEFAULT_SERVICE_CLASSES, type HarborItem, InputDynamic, type InputDynamicProps, type InputType, MODAL_PRESETS, ModalIllustration, type ModalIllustrationButton, type ModalIllustrationProps, type ModalPresetKey, ModalSearchHarbor, type ModalSearchHarborProps, ModalSelectDate, type ModalSelectDateProps, ModalService, type ModalServiceProps, ModalTotalPassengers, type ModalTotalPassengersProps, type Passenger, type PassengerService, type PassengerServiceCode, type PassengerType, type RadioOption, type SelectOption, type SelectedPassengerItem, type ServiceClass, type ServiceItem, type ServiceMenuItem, type TabType, getModalPreset };
|
package/dist/index.js
CHANGED
|
@@ -3562,6 +3562,326 @@ var ModalService = ({
|
|
|
3562
3562
|
);
|
|
3563
3563
|
};
|
|
3564
3564
|
|
|
3565
|
+
// src/components/ModalTotalPassengers/constants.ts
|
|
3566
|
+
var DEFAULT_SERVICE_CLASSES = [
|
|
3567
|
+
{ id: 1, name: "Ekonomi", key: "ekonomi", serviceName: "ECONOMY" },
|
|
3568
|
+
{ id: 2, name: "Bisnis", key: "bisnis", serviceName: "BUSINESS" },
|
|
3569
|
+
{ id: 3, name: "Eksekutif", key: "eksekutif", serviceName: "EXECUTIVE" }
|
|
3570
|
+
];
|
|
3571
|
+
var useStyles11 = reactComponents.makeStyles({
|
|
3572
|
+
dialogSurface: {
|
|
3573
|
+
maxWidth: "600px",
|
|
3574
|
+
width: "100%"
|
|
3575
|
+
},
|
|
3576
|
+
passengerSection: {
|
|
3577
|
+
marginTop: reactComponents.tokens.spacingHorizontalM,
|
|
3578
|
+
display: "flex",
|
|
3579
|
+
flexDirection: "column"
|
|
3580
|
+
},
|
|
3581
|
+
accordionHeader: {
|
|
3582
|
+
fontSize: reactComponents.tokens.fontSizeBase300,
|
|
3583
|
+
fontWeight: reactComponents.tokens.fontWeightBold
|
|
3584
|
+
},
|
|
3585
|
+
accordionItem: {
|
|
3586
|
+
borderRadius: reactComponents.tokens.borderRadiusXLarge,
|
|
3587
|
+
marginBottom: "1rem",
|
|
3588
|
+
border: `1px solid ${reactComponents.tokens.colorNeutralStroke2}`
|
|
3589
|
+
},
|
|
3590
|
+
passengerCount: {
|
|
3591
|
+
display: "flex",
|
|
3592
|
+
alignItems: "center",
|
|
3593
|
+
gap: "12px"
|
|
3594
|
+
},
|
|
3595
|
+
counterButton: {
|
|
3596
|
+
minWidth: "24px",
|
|
3597
|
+
height: "24px",
|
|
3598
|
+
padding: "0",
|
|
3599
|
+
borderRadius: reactComponents.tokens.borderRadiusCircular,
|
|
3600
|
+
color: reactComponents.tokens.colorBrandBackground,
|
|
3601
|
+
border: `1px solid ${reactComponents.tokens.colorBrandBackground}`,
|
|
3602
|
+
"&:hover": {
|
|
3603
|
+
border: `1px solid ${reactComponents.tokens.colorBrandBackgroundHover}`,
|
|
3604
|
+
color: reactComponents.tokens.colorBrandBackgroundHover
|
|
3605
|
+
},
|
|
3606
|
+
"&:disabled": {
|
|
3607
|
+
border: `1px solid ${reactComponents.tokens.colorNeutralStrokeDisabled}`,
|
|
3608
|
+
color: reactComponents.tokens.colorNeutralForegroundDisabled
|
|
3609
|
+
}
|
|
3610
|
+
},
|
|
3611
|
+
countText: {
|
|
3612
|
+
minWidth: "24px",
|
|
3613
|
+
textAlign: "center"
|
|
3614
|
+
},
|
|
3615
|
+
nestedSection: {
|
|
3616
|
+
borderTop: `2px solid ${reactComponents.tokens.colorBrandBackground}`,
|
|
3617
|
+
display: "flex",
|
|
3618
|
+
flexDirection: "column",
|
|
3619
|
+
padding: "0.6rem"
|
|
3620
|
+
},
|
|
3621
|
+
nestedRow: {
|
|
3622
|
+
display: "flex",
|
|
3623
|
+
justifyContent: "space-between",
|
|
3624
|
+
alignItems: "center",
|
|
3625
|
+
padding: "4px",
|
|
3626
|
+
borderRadius: reactComponents.tokens.borderRadiusSmall,
|
|
3627
|
+
backgroundColor: reactComponents.tokens.colorNeutralBackground1
|
|
3628
|
+
},
|
|
3629
|
+
submitButton: {
|
|
3630
|
+
marginTop: "16px",
|
|
3631
|
+
width: "100%",
|
|
3632
|
+
borderRadius: reactComponents.tokens.borderRadiusCircular
|
|
3633
|
+
},
|
|
3634
|
+
accordionPanel: {
|
|
3635
|
+
margin: 0
|
|
3636
|
+
}
|
|
3637
|
+
});
|
|
3638
|
+
var ModalTotalPassengers = ({
|
|
3639
|
+
open,
|
|
3640
|
+
onClose,
|
|
3641
|
+
title = "Pilih Jumlah Penumpang",
|
|
3642
|
+
passengerTypes,
|
|
3643
|
+
serviceClasses = DEFAULT_SERVICE_CLASSES,
|
|
3644
|
+
selectedPassengers,
|
|
3645
|
+
onSave,
|
|
3646
|
+
isLoading = false,
|
|
3647
|
+
maxPassengers = 10,
|
|
3648
|
+
infoMessage
|
|
3649
|
+
}) => {
|
|
3650
|
+
const styles = useStyles11();
|
|
3651
|
+
const [passengers, setPassengers] = React2.useState([]);
|
|
3652
|
+
const [openItems, setOpenItems] = React2.useState([]);
|
|
3653
|
+
const defaultInfoMessage = `Anda dapat menambahkan hingga ${maxPassengers} penumpang pada golongan kendaraan ini.`;
|
|
3654
|
+
React2.useEffect(() => {
|
|
3655
|
+
if (passengerTypes.length === 0) return;
|
|
3656
|
+
const defaultPassengers = passengerTypes.map((passengerType) => ({
|
|
3657
|
+
passengerTypeId: passengerType.id,
|
|
3658
|
+
passengerTypeCode: passengerType.passengerTypeCode,
|
|
3659
|
+
passengerTypeName: passengerType.passengerTypeName,
|
|
3660
|
+
services: serviceClasses.map((sc) => ({
|
|
3661
|
+
serviceId: sc.id,
|
|
3662
|
+
serviceName: sc.serviceName,
|
|
3663
|
+
count: 0,
|
|
3664
|
+
passengers: []
|
|
3665
|
+
}))
|
|
3666
|
+
}));
|
|
3667
|
+
if (selectedPassengers && selectedPassengers.length > 0) {
|
|
3668
|
+
const mergedPassengers = defaultPassengers.map((defaultP) => {
|
|
3669
|
+
const selectedP = selectedPassengers.find(
|
|
3670
|
+
(p) => p.passengerTypeCode === defaultP.passengerTypeCode
|
|
3671
|
+
);
|
|
3672
|
+
if (selectedP) {
|
|
3673
|
+
const mergedServices = defaultP.services.map((defaultS) => {
|
|
3674
|
+
const selectedS = selectedP.services.find((s) => s.serviceName === defaultS.serviceName);
|
|
3675
|
+
return selectedS ? { ...defaultS, count: selectedS.count, passengers: selectedS.passengers || [] } : defaultS;
|
|
3676
|
+
});
|
|
3677
|
+
return { ...defaultP, services: mergedServices };
|
|
3678
|
+
}
|
|
3679
|
+
return defaultP;
|
|
3680
|
+
});
|
|
3681
|
+
setPassengers(mergedPassengers);
|
|
3682
|
+
const itemsWithData = selectedPassengers.filter((p) => p.services.some((s) => s.count > 0)).map((p) => {
|
|
3683
|
+
const passengerType = passengerTypes.find(
|
|
3684
|
+
(pt) => pt.passengerTypeCode === p.passengerTypeCode
|
|
3685
|
+
);
|
|
3686
|
+
return passengerType ? String(passengerType.id) : "";
|
|
3687
|
+
}).filter((id) => id !== "");
|
|
3688
|
+
setOpenItems(itemsWithData);
|
|
3689
|
+
} else {
|
|
3690
|
+
setPassengers(defaultPassengers);
|
|
3691
|
+
setOpenItems([]);
|
|
3692
|
+
}
|
|
3693
|
+
}, [open, passengerTypes, serviceClasses, selectedPassengers]);
|
|
3694
|
+
const getServiceCount = (passengerTypeCode, serviceName) => {
|
|
3695
|
+
const passenger = passengers.find((p) => p.passengerTypeCode === passengerTypeCode);
|
|
3696
|
+
if (!passenger) return 0;
|
|
3697
|
+
const service = passenger.services.find((s) => s.serviceName === serviceName);
|
|
3698
|
+
return service?.count || 0;
|
|
3699
|
+
};
|
|
3700
|
+
const getTotalForType = (passengerTypeCode) => {
|
|
3701
|
+
const passenger = passengers.find((p) => p.passengerTypeCode === passengerTypeCode);
|
|
3702
|
+
if (!passenger) return "0";
|
|
3703
|
+
const parts = [];
|
|
3704
|
+
passenger.services.forEach((service) => {
|
|
3705
|
+
if (service.count > 0) {
|
|
3706
|
+
const serviceClass = serviceClasses.find((sc) => sc.serviceName === service.serviceName);
|
|
3707
|
+
const serviceName = serviceClass?.name || service.serviceName;
|
|
3708
|
+
parts.push(`${service.count} ${serviceName}`);
|
|
3709
|
+
}
|
|
3710
|
+
});
|
|
3711
|
+
return parts.length > 0 ? parts.join(", ") : "0";
|
|
3712
|
+
};
|
|
3713
|
+
const handleIncrement = (passengerTypeCode, serviceName) => {
|
|
3714
|
+
setPassengers(
|
|
3715
|
+
(prev) => prev.map((passenger) => {
|
|
3716
|
+
if (passenger.passengerTypeCode === passengerTypeCode) {
|
|
3717
|
+
return {
|
|
3718
|
+
...passenger,
|
|
3719
|
+
services: passenger.services.map((service) => {
|
|
3720
|
+
if (service.serviceName === serviceName) {
|
|
3721
|
+
const newCount = service.count + 1;
|
|
3722
|
+
const newPassengers = [...service.passengers || []];
|
|
3723
|
+
while (newPassengers.length < newCount) {
|
|
3724
|
+
newPassengers.push({});
|
|
3725
|
+
}
|
|
3726
|
+
return {
|
|
3727
|
+
...service,
|
|
3728
|
+
count: newCount,
|
|
3729
|
+
passengers: newPassengers
|
|
3730
|
+
};
|
|
3731
|
+
}
|
|
3732
|
+
return service;
|
|
3733
|
+
})
|
|
3734
|
+
};
|
|
3735
|
+
}
|
|
3736
|
+
return passenger;
|
|
3737
|
+
})
|
|
3738
|
+
);
|
|
3739
|
+
};
|
|
3740
|
+
const handleDecrement = (passengerTypeCode, serviceName) => {
|
|
3741
|
+
setPassengers(
|
|
3742
|
+
(prev) => prev.map((passenger) => {
|
|
3743
|
+
if (passenger.passengerTypeCode === passengerTypeCode) {
|
|
3744
|
+
return {
|
|
3745
|
+
...passenger,
|
|
3746
|
+
services: passenger.services.map((service) => {
|
|
3747
|
+
if (service.serviceName === serviceName && service.count > 0) {
|
|
3748
|
+
const newCount = service.count - 1;
|
|
3749
|
+
const newPassengers = (service.passengers || []).slice(0, newCount);
|
|
3750
|
+
return {
|
|
3751
|
+
...service,
|
|
3752
|
+
count: newCount,
|
|
3753
|
+
passengers: newPassengers
|
|
3754
|
+
};
|
|
3755
|
+
}
|
|
3756
|
+
return service;
|
|
3757
|
+
})
|
|
3758
|
+
};
|
|
3759
|
+
}
|
|
3760
|
+
return passenger;
|
|
3761
|
+
})
|
|
3762
|
+
);
|
|
3763
|
+
};
|
|
3764
|
+
const handleSave = () => {
|
|
3765
|
+
const filteredPassengers = passengers.map((passenger) => ({
|
|
3766
|
+
...passenger,
|
|
3767
|
+
services: passenger.services.filter((service) => service.count > 0)
|
|
3768
|
+
})).filter((passenger) => passenger.services.length > 0);
|
|
3769
|
+
onSave(filteredPassengers);
|
|
3770
|
+
};
|
|
3771
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3772
|
+
reactComponents.Dialog,
|
|
3773
|
+
{
|
|
3774
|
+
open,
|
|
3775
|
+
onOpenChange: (_, data) => !data.open && onClose(),
|
|
3776
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(reactComponents.DialogSurface, { children: /* @__PURE__ */ jsxRuntime.jsxs(reactComponents.DialogBody, { children: [
|
|
3777
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3778
|
+
reactComponents.DialogTitle,
|
|
3779
|
+
{
|
|
3780
|
+
action: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3781
|
+
reactComponents.Button,
|
|
3782
|
+
{
|
|
3783
|
+
appearance: "subtle",
|
|
3784
|
+
"aria-label": "close",
|
|
3785
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(react.Icon, { icon: "fluent:dismiss-12-regular" }),
|
|
3786
|
+
onClick: onClose
|
|
3787
|
+
}
|
|
3788
|
+
),
|
|
3789
|
+
children: title
|
|
3790
|
+
}
|
|
3791
|
+
),
|
|
3792
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactComponents.DialogContent, { children: [
|
|
3793
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactComponents.MessageBar, { shape: "rounded", children: /* @__PURE__ */ jsxRuntime.jsx(reactComponents.MessageBarBody, { children: infoMessage || defaultInfoMessage }) }),
|
|
3794
|
+
isLoading ? /* @__PURE__ */ jsxRuntime.jsx(reactComponents.Body1, { children: "Loading..." }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
3795
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3796
|
+
reactComponents.Accordion,
|
|
3797
|
+
{
|
|
3798
|
+
collapsible: true,
|
|
3799
|
+
multiple: true,
|
|
3800
|
+
openItems,
|
|
3801
|
+
onToggle: (_, data) => setOpenItems(data.openItems),
|
|
3802
|
+
className: styles.passengerSection,
|
|
3803
|
+
children: passengerTypes.map((passengerType) => {
|
|
3804
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3805
|
+
reactComponents.AccordionItem,
|
|
3806
|
+
{
|
|
3807
|
+
value: String(passengerType.id),
|
|
3808
|
+
className: styles.accordionItem,
|
|
3809
|
+
children: [
|
|
3810
|
+
/* @__PURE__ */ jsxRuntime.jsxs(reactComponents.AccordionHeader, { className: styles.accordionHeader, expandIconPosition: "end", children: [
|
|
3811
|
+
passengerType.passengerTypeName,
|
|
3812
|
+
" (",
|
|
3813
|
+
getTotalForType(passengerType.passengerTypeCode),
|
|
3814
|
+
")"
|
|
3815
|
+
] }),
|
|
3816
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactComponents.AccordionPanel, { className: styles.accordionPanel, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles.nestedSection, children: serviceClasses.map((service) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.nestedRow, children: [
|
|
3817
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactComponents.Body1, { children: service.name }),
|
|
3818
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.passengerCount, children: [
|
|
3819
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3820
|
+
reactComponents.Button,
|
|
3821
|
+
{
|
|
3822
|
+
appearance: "outline",
|
|
3823
|
+
className: styles.counterButton,
|
|
3824
|
+
size: "small",
|
|
3825
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(react.Icon, { icon: "fluent:subtract-12-regular" }),
|
|
3826
|
+
onClick: (e) => {
|
|
3827
|
+
e.stopPropagation();
|
|
3828
|
+
handleDecrement(
|
|
3829
|
+
passengerType.passengerTypeCode,
|
|
3830
|
+
service.serviceName
|
|
3831
|
+
);
|
|
3832
|
+
},
|
|
3833
|
+
disabled: getServiceCount(
|
|
3834
|
+
passengerType.passengerTypeCode,
|
|
3835
|
+
service.serviceName
|
|
3836
|
+
) === 0
|
|
3837
|
+
}
|
|
3838
|
+
),
|
|
3839
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactComponents.Body1, { className: styles.countText, children: getServiceCount(
|
|
3840
|
+
passengerType.passengerTypeCode,
|
|
3841
|
+
service.serviceName
|
|
3842
|
+
) }),
|
|
3843
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3844
|
+
reactComponents.Button,
|
|
3845
|
+
{
|
|
3846
|
+
appearance: "outline",
|
|
3847
|
+
className: styles.counterButton,
|
|
3848
|
+
size: "small",
|
|
3849
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(react.Icon, { icon: "fluent:add-12-regular" }),
|
|
3850
|
+
onClick: (e) => {
|
|
3851
|
+
e.stopPropagation();
|
|
3852
|
+
handleIncrement(
|
|
3853
|
+
passengerType.passengerTypeCode,
|
|
3854
|
+
service.serviceName
|
|
3855
|
+
);
|
|
3856
|
+
}
|
|
3857
|
+
}
|
|
3858
|
+
)
|
|
3859
|
+
] })
|
|
3860
|
+
] }, service.key)) }) })
|
|
3861
|
+
]
|
|
3862
|
+
},
|
|
3863
|
+
passengerType.id
|
|
3864
|
+
);
|
|
3865
|
+
})
|
|
3866
|
+
}
|
|
3867
|
+
),
|
|
3868
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3869
|
+
reactComponents.Button,
|
|
3870
|
+
{
|
|
3871
|
+
appearance: "primary",
|
|
3872
|
+
size: "medium",
|
|
3873
|
+
className: styles.submitButton,
|
|
3874
|
+
onClick: handleSave,
|
|
3875
|
+
children: "Simpan"
|
|
3876
|
+
}
|
|
3877
|
+
)
|
|
3878
|
+
] })
|
|
3879
|
+
] })
|
|
3880
|
+
] }) })
|
|
3881
|
+
}
|
|
3882
|
+
);
|
|
3883
|
+
};
|
|
3884
|
+
|
|
3565
3885
|
exports.BackgroundTicketCard = BackgroundTicketCard_default;
|
|
3566
3886
|
exports.BackgroundTicketCardVertical = BackgroundTicketCardVertical_default;
|
|
3567
3887
|
exports.CardBanner = CardBanner;
|
|
@@ -3570,12 +3890,14 @@ exports.CardServiceMenu = CardServiceMenu;
|
|
|
3570
3890
|
exports.CardTicket = CardTicket;
|
|
3571
3891
|
exports.CarouselWithCustomNav = CarouselWithCustomNav;
|
|
3572
3892
|
exports.DEFAULT_COUNTRY_CODES = DEFAULT_COUNTRY_CODES2;
|
|
3893
|
+
exports.DEFAULT_SERVICE_CLASSES = DEFAULT_SERVICE_CLASSES;
|
|
3573
3894
|
exports.InputDynamic = InputDynamic_default;
|
|
3574
3895
|
exports.MODAL_PRESETS = MODAL_PRESETS;
|
|
3575
3896
|
exports.ModalIllustration = ModalIllustration;
|
|
3576
3897
|
exports.ModalSearchHarbor = ModalSearchHarbor;
|
|
3577
3898
|
exports.ModalSelectDate = ModalSelectDate;
|
|
3578
3899
|
exports.ModalService = ModalService;
|
|
3900
|
+
exports.ModalTotalPassengers = ModalTotalPassengers;
|
|
3579
3901
|
exports.getModalPreset = getModalPreset;
|
|
3580
3902
|
//# sourceMappingURL=index.js.map
|
|
3581
3903
|
//# sourceMappingURL=index.js.map
|