File

src/app/tripsummary/tripsummary.component.ts

Implements

OnInit

Metadata

Index

Properties
Methods
Accessors

Constructor

constructor(route: ActivatedRoute, db: DbConnectionService)
Parameters :
Name Type Optional
route ActivatedRoute No
db DbConnectionService No

Methods

fetchDayByDayView
fetchDayByDayView()
Returns : void
fetchTripInfo
fetchTripInfo()
Returns : void
fetchTripPrice
fetchTripPrice()
Returns : void
fetchTripSummary
fetchTripSummary()
Returns : void
getLink
getLink()
Returns : string
getPDF
getPDF()
Returns : void
getPeriod
getPeriod(activity)
Parameters :
Name Optional
activity No
Returns : string
getSummaryPeriod
getSummaryPeriod(startDate: string, endDate: string)
Parameters :
Name Type Optional
startDate string No
endDate string No
Returns : string
ngOnInit
ngOnInit()
Returns : void
stringToSimpleDate
stringToSimpleDate(datestring: string)
Parameters :
Name Type Optional
datestring string No
Returns : string
toSimpleDate
toSimpleDate(date: Date)
Parameters :
Name Type Optional
date Date No
Returns : string

Properties

activities
Type : Object[]
mobile
Type : boolean
Default value : false
trip
Type : Object
tripId
Type : number
tripPrice
Type : Object
tripSummery
Type : Object[]
Default value : []

Accessors

generateEmail
getgenerateEmail()
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { DbConnectionService } from '../db-connection.service';
import jsPDF from 'jspdf';
import html2canvas from 'html2canvas';
import $ from 'jquery';



@Component({
   selector: 'app-tripsummary',
   templateUrl: './tripsummary.component.html',
   styleUrls: ['./tripsummary.component.scss']
})
export class TripsummaryComponent implements OnInit {

   tripId: number;
   trip: Object;
   activities: Object[];
   tripPrice: Object;
   tripSummery: Object[] = [];
   mobile: boolean = false;
   // workspaceService: any;
   // pages: any;

   getLink() {
      return `www.createyourtrip.afriguideme.com/trip/${this.tripId}/summary`
   }

   get generateEmail() {
      // email details
      let emailAddress = "info@responsibletravelafrica.com";
      let subject = `New RTA Trip ${this.tripId}`;
      let body = `Dear Team of Responsible Travel Africa,\r\n\r\nI would like to be contacted about my trip with tripID:  ${this.tripId} \r\n Edit your trip via this link: ${this.getLink()} \r\n\r\nKind Regards,`

      return `mailto:${emailAddress}?SUBJECT=${encodeURI(subject)}&BODY=${encodeURI(body)}`
   }

   constructor(
      private route: ActivatedRoute,
      private db: DbConnectionService
   ) { }

   ngOnInit(): void {

      if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)){
         this.mobile = true
      }

      this.route.params.subscribe(r => {
         // error handling
         if (!r["tripId"] || isNaN(Number(r["tripId"])))
            return alert("Invalid TripID");
         this.tripId = Number(r["tripId"]);

         this.fetchTripInfo();
         this.fetchTripSummary();
         this.fetchTripPrice();
         this.fetchDayByDayView();
      })
   }

   fetchTripInfo() {
      this.db.executeQuery(`SELECT * FROM Trip WHERE tripID=${this.tripId}`).then(r => {
         this.trip = r["data"][0];
      })
   }

   fetchTripSummary() {
      this.db.executeQuery(`SELECT * FROM TripSummeryView WHERE tripID=${this.tripId}`).then(r => {
         this.activities = r["data"];
      })
   }

   fetchTripPrice() {
      this.db.executeQuery(`SELECT totalPrice FROM TripPriceView WHERE tripID=${this.tripId}`).then(r => {
         this.tripPrice = r["data"][0];
      })
   }

   fetchDayByDayView() {
      this.db.executeQuery(`SELECT * from DayByDayFinalView WHERE tripID=${this.tripId}`).then(r => {
         this.tripSummery = r["data"];
      })
   }

   // type "DD/MM - DD/MM"
   getPeriod(activity) {
      let startDate = new Date(activity["startDate"]);
      let endDate = new Date(startDate);
      endDate.setDate(startDate.getDate() + activity["nights"]);
      return `${this.toSimpleDate(startDate)} - ${this.toSimpleDate(endDate)}`;
   }

   // type "DD/MM"
   toSimpleDate(date: Date): string {
      return `${date.getDate()}/${date.getMonth() + 1}`
   }

   stringToSimpleDate(datestring: string): string {
      return this.toSimpleDate(new Date(datestring));
   }

   // type "DD Month - DD Month YYYY"
   getSummaryPeriod(startDate: string, endDate: string) {
      let d1 = new Date(startDate);
      let d2 = new Date(endDate);
      let d1_args = d1.toString().split(" ").splice(1, 3)
      let d2_args = d2.toString().split(" ").splice(1, 3)
      return `${d1_args[1]} ${d1_args[0]} ${d1_args[2] !== d2_args[2] ? `${d1_args[2]} ` : ''}- ${d2_args[1]} ${d2_args[0]} ${d2_args[2]}`
   }

   // downloadPDF(): void {
   //    let DATA: any = document.getElementById('tripSummary');
   //    html2canvas(DATA).then((canvas) => {
   //       let fileWidth = 208;
   //       let fileHeight = (canvas.height * fileWidth) / canvas.width;
   //       const FILEURI = canvas.toDataURL('image/png');
   //       let PDF = new jsPDF('p', 'mm', 'a4');
   //       let position = 0;
   //       PDF.addImage(FILEURI, 'PNG', 0, position, fileWidth, fileHeight);
   //       PDF.save(`RTA-trip-${this.trip["startDate"]}.pdf`);
   //    });
   // }

   getPDF(): void {
      var HTML_Width = $(".itinerary-summary").width();
      var HTML_Height = $(".itinerary-summary").height();
      console.log(HTML_Width)
      var top_left_margin = 15;
      var PDF_Width = HTML_Width + (top_left_margin * 2);
      var PDF_Height = (PDF_Width * 1.5) + (top_left_margin * 2);
      var canvas_image_width = HTML_Width;
      var canvas_image_height = HTML_Height;

      var totalPDFPages = Math.ceil(HTML_Height / PDF_Height) - 1;

      html2canvas($(".itinerary-summary")[0], { allowTaint: true }).then(function (canvas) {
         canvas.getContext('2d');

         //console.log(canvas.height + "  " + canvas.width);

         var imgData = canvas.toDataURL("image/jpeg", 1.0);
         var pdf = new jsPDF('p', 'pt', [PDF_Width, PDF_Height]);
         pdf.addImage(imgData, 'JPG', top_left_margin, top_left_margin, canvas_image_width, canvas_image_height);


         for (var i = 1; i <= totalPDFPages; i++) {
            pdf.addPage([PDF_Width, PDF_Height], 'p');
            pdf.addImage(imgData, 'JPG', top_left_margin, -(PDF_Height * i) + (top_left_margin * 4), canvas_image_width, canvas_image_height);
         }
         //pdf.save('RTA-trip-${this.trip["startDate"]}.pdf');
         pdf.save(`RTA-summery-trip*${new Date().toLocaleDateString()}.pdf`)
      });
   };

   // onConfirm() {
   //    this.pages = document.getElementById('tripSummary');
   //    this.workspaceService.exportAllToPDF(this.pages);
   //    console.log(this.pages)
   // }

   // exportAllToPDF(pages: HTMLElement) {
   //    const doc = new jsPDF({
   //       unit: 'px',
   //       format: true ? [595, 842] : [842, 1191]
   //    });

   //    doc.html(pages, {
   //       callback: (doc: jsPDF) => {
   //          doc.deletePage(doc.getNumberOfPages());
   //          doc.save('pdf-export');
   //       }
   //    });
   // }
}
<div class="header d-flex justify-content-between">
   <h2>Send Request</h2>
   <app-wizard [selectedStep]="5" [tripID] = this.tripId></app-wizard>
   <!-- <button *ngIf="mobile" class="btn btn-sm btn-edit" [routerLink]="['/trip', tripId, 'itinerary']">
      <i class="bi bi-pencil"></i>
      <span class="pl-2">Edit Your Trip</span>
   </button> -->
</div>

<div class="custom-card middle-container">
   <div class="itinerary-summary" *ngIf="trip">
      <div class="d-flex justify-content-between">
         <h3 *ngIf="!mobile" class="pl-2">Summary: {{ getSummaryPeriod(trip["startDate"], trip["endDate"]) }}</h3>
         <button *ngIf="!mobile" class="btn btn-sm btn-edit" [routerLink]="['/trip', tripId, 'itinerary']">
            <i class="bi bi-pencil"></i>
            <span class="pl-2">Edit Itinerary</span> <!-- <span>Edit Your Trip: <u>{{getLink()}}</u></span> -->
         </button>
      </div>
      <hr class="mt-0" />
      <div class="m-2">
         <b *ngIf="tripPrice">Total Estimated Trip Price: </b> {{tripPrice["totalPrice"]| currency:'EUR' : 'symbol' :
         '1.0-0'}} <br>
         <b> Travelers: </b> {{trip.persons}} <br>
      </div>
      <div class="day-part">
         <div class="card">
            <div class="card-body">
               <h5 class="card-title">{{ stringToSimpleDate(trip["startDate"]) }}: Arrival At {{ trip["arrivalPlace"] }}
               </h5>
            </div>
         </div>
      </div>
      <div class="day-part" *ngFor="let activity of activities">
         <div class="card">
            <div class="card-body">
               <h5 class="card-title">{{ getPeriod(activity) }}: {{ activity["Activity"] }} ({{ activity["nights"] }}
                  Night{{ activity["nights"] === 1 ? '' : 's' }})</h5>
               <div class="d-flex justify-content-left">
                  <div *ngIf="!mobile" class="images">
                     <img class="card-img"
                        [src]="activity.mainActivityPicture ? activity.mainActivityPicture : 'https://via.placeholder.com/140x100'">
                     <img class="card-img" *ngIf="activity.accomodationPicture"
                        [src]="activity.accomodationPicture ? activity.accomodationPicture
                        : 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Search_Icon.svg/1024px-Search_Icon.svg.png'">
                  </div>
                  <div class="content">
                     <p class="card-text">{{activity["description"]}}</p>
                     <b>Persons:</b> {{ activity["persons"] }} <br>
                     <b>Day Activities:</b> {{ activity["dayActivities"] }} <br>
                     <b>Accommodation:</b> {{ activity["accomodation"]}} <br>
                     <span *ngIf="activity['transport']">
                        <b>Transport:</b> {{ activity["transport"] }} <br>
                     </span>
                     <b>Price:</b> {{ activity["price"] | currency:'EUR' : 'symbol' : '1.0-0'}} <br>
                     <b *ngIf="activity.comment">Comment:</b> {{activity.comment}} <br>
                  </div>
               </div>
            </div>
         </div>
      </div>
      <div class="day-part">
         <div class="card" *ngIf="trip">
            <div class="card-body">
               <h5 class="card-title">{{ stringToSimpleDate(trip["endDate"]) }}: Departure From {{
                  trip["departurePlace"] }}</h5>
            </div>
         </div>
      </div>

      <h3 class="pl-2 mt-4">Your Trip: Day by day</h3>
      <hr />
      <div class="day-by-day-table">
         <table class="table">
            <thead>
               <tr>
                  <th *ngIf="!mobile" scope="col">Day</th>
                  <th scope="col">Date</th>
                  <th scope="col">Activity</th>
                  <th scope="col">Day Activity</th>
                  <th *ngIf="!mobile" scope="col">Accommodation*</th>
                  <th *ngIf="!mobile" scope="col">Transport</th>
               </tr>
            </thead>
            <tbody>
               <tr *ngFor="let x of tripSummery">
                  <th *ngIf="!mobile" scope="row">{{x.day}}</th>
                  <td>{{x.date}}</td>
                  <td>{{x.activity}}</td>
                  <td>{{x.dayActivity}}</td>
                  <td *ngIf="!mobile"> {{x.accomodation}}</td>
                  <td *ngIf="!mobile">{{x.transport}}</td>
               </tr>
            </tbody>
         </table>
         *or similar
      </div>
   </div>
</div>

<div class="footer d-flex justify-content-between">
   <button type="button" class="btn btn-back" [routerLink]="['/trip', tripId, 'itinerary']"><i class="bi bi-pencil"></i> Edit</button>
   <button *ngIf="!mobile" type="button" class="btn btn-back" (click)="getPDF()"> <i class="bi bi-save"></i> PDF</button>
   <a role="button" class="btn btn-next" [href]="generateEmail" target="_blank" rel="noopener noreferrer"> <i class="bi bi-envelope"></i> {{ !mobile?
      'Enquire Now' : 'Enquire'}}</a>
</div>

./tripsummary.component.scss

@import 'variables';
@import 'footer';
@import 'header';
@import 'custom-card';
@import 'custom-table';


.card-img {
   width: 100%;
   width: 400px;
   margin-bottom: 5px;
   // border: 2px solid $primary-button-color;
   border-radius: 5px;
}

.btn-edit {
   height: 35px;
}

.itinerary-summary {
   overflow-y: auto;

   &::-webkit-scrollbar {
      border-radius: 3px;
      width: 10px;
   }

   /* Track */
   &::-webkit-scrollbar-track {
      background: #f1f1f1;
   }

   /* Handle */
   &::-webkit-scrollbar-thumb {
      border-radius: 3px;
      background: $secondary-button-color;
   }

   /* Handle on hover */
   &::-webkit-scrollbar-thumb:hover {
      background: $primary-button-color;
   }

   .day-part {
      width: 100%;
      padding: 0px 5px;
      margin-bottom: 5px;

      .card {
         width: 100%;
         background-color: $secondary-background-color;
      }

      .images {
         max-width: 400px;
      }

      .content {
         margin-left: 15px;
      }
   }

   .day-by-day-table {
      margin: 0px 5px;
   }
}
.custom-card {
height: calc(100vh
         /*header*/
         - $header-height
         /*footer*/
         - $footer-height
         /*middle-container margins*/);
      }
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""