Files
seatmapv2/client/src/modules/jsc.ts
2021-05-26 11:55:33 +02:00

209 lines
7.1 KiB
TypeScript

import * as I from "../types/types";
import { config } from "./config";
import * as State from "./state";
import * as Cart from "./cart";
import * as CartButtons from "./cartButtons";
import Utils from './utils'
export function getSeats(): I.JSCSeats {
const seatmapXML: any = config.state.seatmapXML;
const pricescaleArr: I.SeatmapPricescale[] = seatmapXML.seatmap[0].pricescale_config[0].pricescale;
let seatmapInitSeats: I.JSCSeats = {};
for (let key in pricescaleArr) {
const seatsObj: I.JSCSeats2 = {
"classes": `_${pricescaleArr[key].id[0]}`,
"seatsObj": pricescaleArr[key]
}
const seatsKey: string = String.fromCharCode(97 + parseInt(key)).toLocaleUpperCase();
seatmapInitSeats[seatsKey] = seatsObj;
}
return seatmapInitSeats;
}
export function activateSeatsBySectionID(inValue: string): void {
const seatmapXML: any = config.state.seatmapXML;
const seatmap: any = config.state.seatmap;
const pricescaleArr: I.SeatmapPricescale[] = seatmapXML.seatmap[0].pricescale_config[0].pricescale;
const seatsArr: string[] | undefined = pricescaleArr.find(arr => {
return arr.id[0] === inValue;
})?.mask[0].split(",");
seatmap.status(seatsArr, "available");
}
export function getRowsNaming(): string[] {
const seatmapXML: any = config.state.seatmapXML;
const layout: I.SeatmapLayout = seatmapXML.seatmap[0].layouts[0].layout[0];
const height: number = parseInt(layout.height[0]);
const namingArr: string[] = Array.from({ length: height }, (_) => "");
const rowsArr: I.LayoutRow2[] = layout.rows[0].row;
rowsArr.forEach(element => {
const index: number = parseInt(element.y_cell_coord[0]);
const seatsArr: string[] = element.seats[0].split("|");
const seatArr: string[] = splitSeatStr(seatsArr[0]);
const row: string = seatArr[4];
namingArr[index] = row;
});
return namingArr;
}
export function generateMap(): string[] {
const seatmapXML: any = config.state.seatmapXML;
const layout: I.SeatmapLayout = seatmapXML.seatmap[0].layouts[0].layout[0];
const rows: I.LayoutRow2[] = layout.rows[0].row;
const pricescaleArr: I.SeatmapPricescale[] = seatmapXML.seatmap[0].pricescale_config[0].pricescale;
const availabilityArr: I.JSCAvailability = seatmapXML.seatmap[0].view_modes[0].view_mode[0].availability[0];
// Form: arrMatrix[Y][X]
let arrMatrix: string[][] = createArrMatrix(
parseInt(layout.height[0]),
parseInt(layout.width[0]),
"_"
);
arrMatrix = enterSeatsInMatrix(rows, arrMatrix, pricescaleArr, availabilityArr);
return arrMatrix.map(element => element.join(""));
}
export function setUnavailableSeats(): void {
const seatmapXML: any = config.state.seatmapXML;
const seatmap: any = config.state.seatmap;
const availabilityArr: I.JSCAvailability = seatmapXML.seatmap[0].view_modes[0].view_mode[0].availability[0];
if (availabilityArr.unavailable_unselectable_mask[0] !== "") {
const unavailableArr: string[] = availabilityArr.unavailable_unselectable_mask[0].split(",");
seatmap.status(unavailableArr, "unavailable");
}
}
export function getSeatsKey(inSeatID: string, inPricescaleArr: I.SeatmapPricescale[]): string | undefined {
for (let key in inPricescaleArr) {
if (inPricescaleArr[key].mask[0].includes(inSeatID))
return String.fromCharCode(97 + parseInt(key)).toLocaleUpperCase();
}
return undefined;
}
export function splitSeatStr(inSeatStr: string): string[] {
return inSeatStr.split(",").map((item) => item.trim());
}
export function createArrMatrix(inNumrows: number, inNumcols: number, inCharacter: string): string[][] {
return Array(inNumrows).fill(null).map(() => Array(inNumcols).fill(inCharacter));
}
export function selectSeatsInCart(): void {
const seatmap: any = config.state.seatmap;
config.state.selectedSeatsArr.forEach(arr => {
const seatID: string = arr[0];
if (seatmap.get(seatID))
seatmap.status(seatID, "selected");
});
}
export function addSeatmap(inSelector: string, inMap: string[], inRowsNaming: string[], inSeats: I.JSCSeats, inLegend: I.JSCLegend): void {
const containerSeatmap: any = (<any>window).jQuery(inSelector);
config.state.seatmap = containerSeatmap.seatCharts({
naming: {
top: false,
left: false,
rows: inRowsNaming,
},
map: inMap,
seats: inSeats,
legend: inLegend,
click: function () {
return clickedSeat(this);
}
});
}
function enterSeatsInMatrix(inRows: I.LayoutRow2[], inArrMatrix: string[][], inPricescaleArr: I.SeatmapPricescale[], inAvailabilityArr: I.JSCAvailability): string[][] {
const availableArr: string[] = inAvailabilityArr.available_selectable_mask[0].split(",");
const unavailableArr: string[] = inAvailabilityArr.unavailable_unselectable_mask[0].split(",");
inRows.forEach(element => {
const row: I.LayoutRow2 = element;
const Y: number = parseInt(row.y_cell_coord[0]) - 1;
const seatsArr: string[] = row.seats[0].split("|");
seatsArr.forEach(element => {
const seatStr: string = element;
// Form:
// "568420,568420,15,7024,13 ,1"
const seatArr: string[] = splitSeatStr(seatStr);
// Form:
// 0: "568528" -> ID
// 1: "568528" -> ID
// 2: "21" -> X-Coord benutzen
// 3: "7024" -> section ID
// 4: "13" -> Reihenbezeichnung
// 5: "4" -> Platznummer
// skip blacked out seats
if (!availableArr.includes(seatArr[0]) && !unavailableArr.includes(seatArr[0]))
return;
// const X: number = parseInt(seatArr[5]);
const X: number = parseInt(seatArr[2]) - 1;
const seatsKey: string | undefined = getSeatsKey(seatArr[0], inPricescaleArr);
if (seatsKey)
inArrMatrix[Y][X] = `${seatsKey}[${seatArr[0]}, ]`;
// save seatArr in state with seatID as key
config.state.layoutRows[seatArr[0]] = seatArr;
});
});
return inArrMatrix;
}
function clickedSeat(inSeatmap: any) {
if (inSeatmap.status() == 'available') {
return clickAvailableSeat(inSeatmap);
}
else if (inSeatmap.status() === "selected") {
return clickedSelectedSeat(inSeatmap);
}
else if (inSeatmap.status() == 'unavailable') {
return "unavailable";
}
else {
return inSeatmap.style();
}
}
function clickAvailableSeat(inSeatmap: any) {
const selectedSeat: I.JSCSelectedSeat = inSeatmap.settings;
Utils.consoleLog(selectedSeat);
if (State.maximumSelectedSeatsReached(selectedSeat))
return "available";
State.addSeatToState(selectedSeat);
Cart.calcOverallPrice();
CartButtons.setBtnCartText();
return "selected";
}
function clickedSelectedSeat(inSeatmap: any) {
const selectedSeat: I.JSCSelectedSeat = inSeatmap.settings;
State.removeSeatFromState(selectedSeat);
Cart.calcOverallPrice();
CartButtons.setBtnCartText();
return "available";
}