@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 CHANGED
@@ -731,4 +731,127 @@ interface ModalServiceProps {
731
731
  */
732
732
  declare const ModalService: React.FC<ModalServiceProps>;
733
733
 
734
- 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, 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, type RadioOption, type SelectOption, type ServiceItem, type ServiceMenuItem, type TabType, getModalPreset };
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
- 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, 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, type RadioOption, type SelectOption, type ServiceItem, type ServiceMenuItem, type TabType, getModalPreset };
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