Warning, /pim/itinerary/src/app/TrainPage.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org>
0002 // SPDX-FileCopyrightText: 2022 Carl Schwan <carl@carlschwan.eu>
0003 // SPDX-License-Identifier: LGPL-2.0-or-later
0004 
0005 import QtQuick
0006 import QtQuick.Layouts
0007 import QtQuick.Controls as QQC2
0008 import org.kde.kirigami as Kirigami
0009 import org.kde.kirigamiaddons.formcard as FormCard
0010 import org.kde.kpublictransport as KPublicTransport
0011 import org.kde.kitinerary
0012 import org.kde.itinerary
0013 
0014 DetailsPage {
0015     id: root
0016 
0017     title: i18n("Train Ticket")
0018     editor: TrainEditor {
0019         controller: root.controller
0020     }
0021 
0022     data: BarcodeScanModeButton {
0023         page: root
0024         visible: ticketToken.hasBarcode
0025     }
0026 
0027     Component {
0028         id: alternativePage
0029         AlternativeJourneyPage {
0030             controller: root.controller
0031             publicTransportManager: LiveDataManager.publicTransportManager
0032         }
0033     }
0034 
0035     Component {
0036         id: vehicleLayoutPage
0037         VehicleLayoutPage {
0038             publicTransportManager: root.controller.liveDataManager.publicTransportManager
0039             selectedVehicleSection: root.reservation.reservedTicket.ticketedSeat.seatSection
0040             selectedClasses: root.reservation.reservedTicket.ticketedSeat.seatingType
0041             seat: root.reservation.reservedTicket.ticketedSeat.seatNumber
0042 
0043             property bool arrival
0044 
0045             onLayoutUpdated: root.controller.setVehicleLayout(vehicleLayout, arrival);
0046         }
0047     }
0048 
0049     ColumnLayout {
0050         spacing: 0
0051 
0052         CardPageTitle {
0053             emojiIcon: "🚅"
0054             text: {
0055                 if (reservationFor.trainName || reservationFor.trainNumber) {
0056                     return reservationFor.trainName + " " + reservationFor.trainNumber
0057                 }
0058                 return i18n("%1 to %2", reservationFor.departureStation.name, reservationFor.arrivalStation.name);
0059             }
0060         }
0061 
0062         FormCard.FormCard {
0063             visible: ticketToken.ticketTokenCount > 0
0064             // ticket barcode
0065             TicketTokenDelegate {
0066                 id: ticketToken
0067                 Layout.fillWidth: true
0068                 resIds: ReservationManager.reservationsForBatch(root.batchId)
0069                 onCurrentReservationIdChanged: {
0070                     if (!currentReservationId)
0071                         return;
0072                     root.currentReservationId = currentReservationId;
0073                 }
0074                 onScanModeToggled: scanModeController.toggle()
0075             }
0076         }
0077 
0078         // departure data
0079         FormCard.FormHeader {
0080             title: i18nc("Train departure", "Departure")
0081         }
0082 
0083         FormCard.FormCard {
0084             FormCard.FormTextDelegate {
0085                 id: departureTimeDelegate
0086                 text: i18n("Departure time")
0087                 visible: departureTimeLabel.text.length > 0
0088                 contentItem: ColumnLayout {
0089                     spacing: Kirigami.Units.smallSpacing
0090                     QQC2.Label {
0091                         text: departureTimeDelegate.text
0092                         Layout.fillWidth: true
0093                         elide: Text.ElideRight
0094                         Accessible.ignored: true
0095                     }
0096                     RowLayout {
0097                         Layout.fillWidth: true
0098                         QQC2.Label {
0099                             id: departureTimeLabel
0100                             text: Localizer.formatDateTime(reservationFor, "departureTime")
0101                             color: Kirigami.Theme.disabledTextColor
0102                             font: Kirigami.Theme.smallFont
0103                             elide: Text.ElideRight
0104                         }
0105                         QQC2.Label {
0106                             text: (departure.departureDelay >= 0 ? "+" : "") + departure.departureDelay
0107                             color: (departure.departureDelay > 1) ? Kirigami.Theme.negativeTextColor : Kirigami.Theme.positiveTextColor
0108                             visible: departure.hasExpectedDepartureTime
0109                             Accessible.ignored: !visible
0110                         }
0111                     }
0112                 }
0113             }
0114             FormCard.FormTextDelegate {
0115                 text: i18n("Departure date")
0116                 visible: !departureTimeDelegate.visible && text.length > 0
0117                 description: Localizer.formatDate(reservationFor, "departureDay")
0118             }
0119 
0120             FormCard.FormDelegateSeparator {}
0121 
0122             FormCard.FormTextDelegate {
0123                 text: i18nc("train station", "Station")
0124                 description: reservationFor.departureStation.name
0125                 visible: description
0126             }
0127 
0128             FormCard.FormDelegateSeparator { visible: reservationFor.departureStation.name }
0129 
0130             FormPlatformDelegate {
0131                 id: departurePlatformDelegate
0132                 stopover: departure
0133                 sections: root.controller.departurePlatformSections
0134                 scheduledPlatform: reservationFor.departurePlatform
0135             }
0136 
0137             FormCard.FormDelegateSeparator { visible: departurePlatformDelegate.visible }
0138 
0139             FormPlaceDelegate {
0140                 id: departureDelegate
0141                 place: reservationFor.departureStation
0142                 controller: root.controller
0143                 isRangeBegin: true
0144             }
0145 
0146             FormCard.FormDelegateSeparator {
0147                 visible: departureDelegate.visible
0148             }
0149 
0150             FormCard.FormTextDelegate {
0151                 text: i18n("Additional notes")
0152                 description: departure.notes.join("<br/>")
0153                 descriptionItem.textFormat: Text.RichText
0154                 descriptionItem.wrapMode: Text.Wrap
0155                 visible: departure.notes.length > 0
0156                 font.italic: true
0157                 onLinkActivated: Qt.openUrlExternally(link)
0158             }
0159         }
0160 
0161         // arrival data
0162         FormCard.FormHeader {
0163             title: i18nc("Train arrival", "Arrival")
0164         }
0165 
0166         FormCard.FormCard {
0167             FormCard.FormTextDelegate {
0168                 id: arrivalTimeDelegate
0169                 text: i18n("Arrival time")
0170                 visible: arrivalTimeLabel.text.length > 0
0171                 contentItem: ColumnLayout {
0172                     Layout.fillWidth: true
0173                     spacing: Kirigami.Units.smallSpacing
0174                     QQC2.Label {
0175                         text: arrivalTimeDelegate.text
0176                         Layout.fillWidth: true
0177                         elide: Text.ElideRight
0178                         Accessible.ignored: true
0179                     }
0180                     RowLayout {
0181                         Layout.fillWidth: true
0182                         QQC2.Label {
0183                             id: arrivalTimeLabel
0184                             text: Localizer.formatDateTime(reservationFor, "arrivalTime")
0185                             color: Kirigami.Theme.disabledTextColor
0186                             font: Kirigami.Theme.smallFont
0187                             elide: Text.ElideRight
0188                         }
0189                         QQC2.Label {
0190                             font: Kirigami.Theme.smallFont
0191                             text: (arrival.arrivalDelay >= 0 ? "+" : "") + arrival.arrivalDelay
0192                             color: (arrival.arrivalDelay > 1) ? Kirigami.Theme.negativeTextColor : Kirigami.Theme.positiveTextColor
0193                             visible: arrival.hasExpectedArrivalTime
0194                             Accessible.ignored: !visible
0195                         }
0196                     }
0197                 }
0198             }
0199 
0200             FormCard.FormDelegateSeparator { visible: arrivalTimeLabel.text.length > 0 }
0201 
0202             FormCard.FormTextDelegate {
0203                 text: i18nc("train station", "Station")
0204                 description: reservationFor.arrivalStation.name
0205             }
0206 
0207             FormCard.FormDelegateSeparator { visible: reservationFor.arrivalStation.name }
0208 
0209             FormPlatformDelegate {
0210                 id: arrivalPlatformDelegate
0211                 stopover: arrival
0212                 sections: root.controller.arrivalPlatformSections
0213                 scheduledPlatform: reservationFor.arrivalPlatform
0214             }
0215 
0216             FormCard.FormDelegateSeparator { visible: arrivalPlatformDelegate.visible }
0217 
0218             FormPlaceDelegate {
0219                 id: arrivalDelegate
0220                 place: reservationFor.arrivalStation
0221                 controller: root.controller
0222                 isRangeEnd: true
0223             }
0224 
0225             FormCard.FormDelegateSeparator {
0226                 visible: arrivalDelegate
0227             }
0228 
0229             FormCard.FormTextDelegate {
0230                 text: i18n("Additional notes")
0231                 description: arrival.notes.join("<br/>")
0232                 descriptionItem.textFormat: Text.RichText
0233                 descriptionItem.wrapMode: Text.Wrap
0234                 visible: arrival.notes.length > 0
0235                 font.italic: true
0236                 onLinkActivated: Qt.openUrlExternally(link)
0237             }
0238         }
0239 
0240         // seat reservation
0241         FormCard.FormHeader {
0242             visible: seatCard.visible
0243             title: i18n("Seat")
0244         }
0245 
0246         FormCard.FormCard {
0247             id: seatCard
0248             visible: coachLabel.visible || seatLabel.visible || classLabel.visible || departureLayoutButton.visible || arrivalLayoutButton.visible
0249             FormCard.FormTextDelegate {
0250                 id: coachLabel
0251                 text: i18nc("coach of a train", "Coach:")
0252                 description: root.reservation.reservedTicket ? root.reservation.reservedTicket.ticketedSeat.seatSection : ''
0253                 visible: description
0254             }
0255             FormCard.FormDelegateSeparator {
0256                 visible: root.reservation.reservedTicket ? root.reservation.reservedTicket.ticketedSeat.seatSection : false
0257             }
0258             FormCard.FormTextDelegate {
0259                 id: seatLabel
0260                 text: i18n("Seat:")
0261                 description: root.reservation.reservedTicket ? root.reservation.reservedTicket.ticketedSeat.seatNumber : ''
0262                 visible: description
0263             }
0264             FormCard.FormDelegateSeparator {
0265                 visible: root.reservation.reservedTicket ? root.reservation.reservedTicket.ticketedSeat.seatNumber : false
0266             }
0267             FormCard.FormTextDelegate {
0268                 id: classLabel
0269                 text: i18n("Class:")
0270                 description: root.reservation.reservedTicket ? root.reservation.reservedTicket.ticketedSeat.seatingType : ''
0271                 visible: description
0272             }
0273             FormCard.FormDelegateSeparator {
0274                 visible: classLabel.visible
0275             }
0276             FormCard.FormButtonDelegate {
0277                 id: departureLayoutButton
0278                 text: i18n("Departure Vehicle Layout")
0279                 icon.name: "view-list-symbolic"
0280                 enabled: departure && (departure.route.line.mode == KPublicTransport.Line.LongDistanceTrain || departure.route.line.mode == KPublicTransport.Line.Train || departure.route.name !== "")
0281                 onClicked: applicationWindow().pageStack.push(vehicleLayoutPage, {stopover: root.controller.departure, arrival: false})
0282                 visible: enabled
0283             }
0284             FormCard.FormButtonDelegate {
0285                 id: arrivalLayoutButton
0286                 text: i18n("Arrival Vehicle Layout")
0287                 icon.name: "view-list-symbolic"
0288                 enabled: arrival && (arrival.route.line.mode == KPublicTransport.Line.LongDistanceTrain || arrival.route.line.mode == KPublicTransport.Line.Train || arrival.route.name !== "")
0289                 onClicked: applicationWindow().pageStack.push(vehicleLayoutPage, {stopover: root.controller.arrival, arrival: true});
0290                 visible: enabled
0291 
0292             }
0293         }
0294 
0295         ProgramMembershipCard {
0296             programMembership: root.reservation.programMembershipUsed
0297         }
0298 
0299         BookingCard {
0300             reservation: root.reservation
0301         }
0302 
0303         ReservationDocumentsCard {
0304             controller: root.controller
0305         }
0306 
0307         ActionsCard {
0308             batchId: root.batchId
0309             editor: root.editor
0310             reservation: root.reservation
0311             additionalActions: [
0312                 QQC2.Action {
0313                     text: i18n("Alternatives")
0314                     icon.name: "clock"
0315                     onTriggered: applicationWindow().pageStack.push(alternativePage)
0316                 },
0317                 Kirigami.Action {
0318                     text: i18n("Journey Details")
0319                     icon.name: "view-calendar-day"
0320                     onTriggered: applicationWindow().pageStack.push(journeySectionPage, {"journeySection": root.controller.journey});
0321                     Component.onCompleted: {
0322                         visible = Qt.binding(function() { return root.controller.journey && root.controller.journey.intermediateStops.length > 0});
0323                     }
0324                 },
0325                 Kirigami.Action {
0326                     text: "Test Notification"
0327                     icon.name: "notifications"
0328                     visible: Settings.developmentMode
0329                     onTriggered: LiveDataManager.showNotification(root.batchId)
0330                 }
0331             ]
0332         }
0333     }
0334 }