tickera-angular-components 0.0.1-dev.190 → 0.0.1-dev.192
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, makeEnvironmentProviders, PLATFORM_ID, Inject, Injectable, signal, LOCALE_ID, computed, inject, EventEmitter, Input, Output, Component, ViewEncapsulation, HostListener, Self, Optional, Injector, forwardRef, effect, untracked, ViewChild } from '@angular/core';
|
|
2
|
+
import { InjectionToken, makeEnvironmentProviders, PLATFORM_ID, Inject, Injectable, signal, LOCALE_ID, computed, inject, EventEmitter, Input, Output, Component, ViewEncapsulation, HostListener, Self, Optional, Injector, forwardRef, effect, untracked, ViewChild, viewChildren } from '@angular/core';
|
|
3
3
|
import * as i1$3 from '@jsverse/transloco';
|
|
4
4
|
import { provideTransloco, TranslocoModule, TranslocoService } from '@jsverse/transloco';
|
|
5
5
|
import { from, throwError, BehaviorSubject, Subject, of, Observable, takeUntil as takeUntil$1 } from 'rxjs';
|
|
@@ -21,7 +21,7 @@ import { FormsModule, ReactiveFormsModule, Validators, NgControl, NG_VALUE_ACCES
|
|
|
21
21
|
import * as i3 from '@ng-select/ng-select';
|
|
22
22
|
import { NgSelectModule } from '@ng-select/ng-select';
|
|
23
23
|
import { DEFAULT_TOOLBAR, Editor, toHTML, NgxEditorComponent, NgxEditorMenuComponent } from 'ngx-editor';
|
|
24
|
-
import {
|
|
24
|
+
import { CoreShapeComponent, StageComponent } from 'ng2-konva';
|
|
25
25
|
import QRCode from 'qrcode';
|
|
26
26
|
|
|
27
27
|
var formErrors$1 = {
|
|
@@ -1174,6 +1174,11 @@ const TICKET_STATUS_LABELS = {
|
|
|
1174
1174
|
};
|
|
1175
1175
|
const TICKET_MAP_GRID_SIZE = 30;
|
|
1176
1176
|
const TICKET_MAP_TITLE_HEIGHT = 30;
|
|
1177
|
+
// Hover por piso: al pasar el mouse sobre un elemento de un piso, los demás
|
|
1178
|
+
// pisos visibles se atenúan y el piso activo pasa al frente (ver
|
|
1179
|
+
// PerformanceBookingDataService.floorZOrder y PerformanceTicketMapComponent).
|
|
1180
|
+
const TICKET_MAP_FLOOR_HOVER_OPACITY = 0.25;
|
|
1181
|
+
const TICKET_MAP_FLOOR_HOVER_FADE_MS = 150;
|
|
1177
1182
|
|
|
1178
1183
|
function drawRoundedRect(con, shape, x, y, width, height, cornerRadius) {
|
|
1179
1184
|
con.beginPath();
|
|
@@ -2318,31 +2323,6 @@ const KONVA_SHAPE_MAPPINGS = {
|
|
|
2318
2323
|
},
|
|
2319
2324
|
};
|
|
2320
2325
|
|
|
2321
|
-
const SHOW_TYPE_COLORS = {
|
|
2322
|
-
PLAY: { bg: '#f5f3ff', text: '#5b21b6' }, // violet-50 / violet-800
|
|
2323
|
-
MUSICAL: { bg: '#fef9c3', text: '#a16207' }, // yellow-100 / yellow-700
|
|
2324
|
-
CONCERT: { bg: '#dbeafe', text: '#1e40af' }, // blue-100 / blue-800
|
|
2325
|
-
DANCE: { bg: '#d1fae5', text: '#065f46' }, // emerald-100 / emerald-800
|
|
2326
|
-
OPERA: { bg: '#fee2e2', text: '#991b1b' }, // red-100 / red-800
|
|
2327
|
-
STAND_UP_COMEDY: { bg: '#fef3c7', text: '#92400e' }, // amber-100 / amber-800
|
|
2328
|
-
SPORT: { bg: '#cbfec3', text: '#07a19c' }, // yellow-100 / yellow-700
|
|
2329
|
-
OTHER: { bg: '#f5f5f5', text: '#262626' }, // neutral-100 / neutral-800
|
|
2330
|
-
DEFAULT: { bg: '#f3f4f6', text: '#374151' }, // gray-100 / gray-700
|
|
2331
|
-
};
|
|
2332
|
-
|
|
2333
|
-
var ShowType;
|
|
2334
|
-
(function (ShowType) {
|
|
2335
|
-
ShowType["PLAY"] = "PLAY";
|
|
2336
|
-
ShowType["CONCERT"] = "CONCERT";
|
|
2337
|
-
ShowType["STAND_UP_COMEDY"] = "STAND_UP_COMEDY";
|
|
2338
|
-
ShowType["OPERA"] = "OPERA";
|
|
2339
|
-
ShowType["MUSICAL"] = "MUSICAL";
|
|
2340
|
-
ShowType["DANCE"] = "DANCE";
|
|
2341
|
-
ShowType["SPORT"] = "SPORT";
|
|
2342
|
-
ShowType["OTHER"] = "OTHER";
|
|
2343
|
-
ShowType["DEFAULT"] = "DEFAULT";
|
|
2344
|
-
})(ShowType || (ShowType = {}));
|
|
2345
|
-
|
|
2346
2326
|
var SelectedDiscountCardType;
|
|
2347
2327
|
(function (SelectedDiscountCardType) {
|
|
2348
2328
|
SelectedDiscountCardType["COUPON"] = "COUPON";
|
|
@@ -3620,6 +3600,7 @@ class PerformanceBookingDataService {
|
|
|
3620
3600
|
_selectedHallFloor = signal(null, ...(ngDevMode ? [{ debugName: "_selectedHallFloor" }] : []));
|
|
3621
3601
|
_allRenderData = signal([], ...(ngDevMode ? [{ debugName: "_allRenderData" }] : []));
|
|
3622
3602
|
_visibleFloorIds = signal(new Set(), ...(ngDevMode ? [{ debugName: "_visibleFloorIds" }] : []));
|
|
3603
|
+
_hoveredFloorId = signal(null, ...(ngDevMode ? [{ debugName: "_hoveredFloorId" }] : []));
|
|
3623
3604
|
_stageConfig = signal(DEFAULT_STAGE_CONFIG, ...(ngDevMode ? [{ debugName: "_stageConfig" }] : []));
|
|
3624
3605
|
// Snapshot de tickets tal como llegó del último `setPerformanceBookingData`,
|
|
3625
3606
|
// más los parches aplicados por `applySeatStatusUpdates` (SSE). Se guarda
|
|
@@ -3633,17 +3614,44 @@ class PerformanceBookingDataService {
|
|
|
3633
3614
|
stageConfig = computed(() => this._stageConfig(), ...(ngDevMode ? [{ debugName: "stageConfig" }] : []));
|
|
3634
3615
|
roomMap = computed(() => this._roomMap(), ...(ngDevMode ? [{ debugName: "roomMap" }] : []));
|
|
3635
3616
|
visibleFloorIds = computed(() => this._visibleFloorIds(), ...(ngDevMode ? [{ debugName: "visibleFloorIds" }] : []));
|
|
3617
|
+
hoveredFloorId = computed(() => this._hoveredFloorId(), ...(ngDevMode ? [{ debugName: "hoveredFloorId" }] : []));
|
|
3636
3618
|
availableFloors = computed(() => {
|
|
3637
3619
|
const allData = this._allRenderData();
|
|
3638
3620
|
const floors = this._hallFloors();
|
|
3639
3621
|
const floorIdsWithElements = new Set(allData.map((el) => el.hallFloorId).filter(Boolean));
|
|
3640
3622
|
return floors.filter((f) => floorIdsWithElements.has(f.id));
|
|
3641
3623
|
}, ...(ngDevMode ? [{ debugName: "availableFloors" }] : []));
|
|
3624
|
+
// Orden de los pisos visibles de "atrás hacia adelante": el orden natural
|
|
3625
|
+
// es el mismo que usa el selector de pisos (availableFloors), y el piso
|
|
3626
|
+
// que está en hover siempre se manda al final (= arriba del todo).
|
|
3627
|
+
floorZOrder = computed(() => {
|
|
3628
|
+
const visible = this._visibleFloorIds();
|
|
3629
|
+
const order = this.availableFloors()
|
|
3630
|
+
.map((floor) => floor.id)
|
|
3631
|
+
.filter((id) => visible.has(id));
|
|
3632
|
+
const hovered = this._hoveredFloorId();
|
|
3633
|
+
if (hovered != null && visible.has(hovered)) {
|
|
3634
|
+
const withoutHovered = order.filter((id) => id !== hovered);
|
|
3635
|
+
withoutHovered.push(hovered);
|
|
3636
|
+
return withoutHovered;
|
|
3637
|
+
}
|
|
3638
|
+
return order;
|
|
3639
|
+
}, ...(ngDevMode ? [{ debugName: "floorZOrder" }] : []));
|
|
3640
|
+
// Agrupado por piso según floorZOrder, para que tanto el hit-test
|
|
3641
|
+
// (findElementAtPosition, que asume "último = más arriba") como el
|
|
3642
|
+
// render por capas (una <ko-layer> por piso) usen el mismo z-order.
|
|
3642
3643
|
renderData = computed(() => {
|
|
3643
3644
|
const visible = this._visibleFloorIds();
|
|
3644
|
-
|
|
3645
|
-
|
|
3646
|
-
|
|
3645
|
+
const order = this.floorZOrder();
|
|
3646
|
+
const byFloor = new Map();
|
|
3647
|
+
for (const el of this._allRenderData()) {
|
|
3648
|
+
if (el.hallFloorId == null || !visible.has(el.hallFloorId))
|
|
3649
|
+
continue;
|
|
3650
|
+
const arr = byFloor.get(el.hallFloorId) ?? [];
|
|
3651
|
+
arr.push(el);
|
|
3652
|
+
byFloor.set(el.hallFloorId, arr);
|
|
3653
|
+
}
|
|
3654
|
+
return order.flatMap((floorId) => byFloor.get(floorId) ?? []);
|
|
3647
3655
|
}, ...(ngDevMode ? [{ debugName: "renderData" }] : []));
|
|
3648
3656
|
setPerformanceBookingData({ data }) {
|
|
3649
3657
|
this._performance.set(data.performance);
|
|
@@ -3718,6 +3726,11 @@ class PerformanceBookingDataService {
|
|
|
3718
3726
|
const hallFloor = this._hallFloors().find((hallFloor) => hallFloor.id === id);
|
|
3719
3727
|
this._selectedHallFloor.set(hallFloor ?? null);
|
|
3720
3728
|
}
|
|
3729
|
+
setHoveredFloor(floorId) {
|
|
3730
|
+
if (this._hoveredFloorId() === floorId)
|
|
3731
|
+
return;
|
|
3732
|
+
this._hoveredFloorId.set(floorId);
|
|
3733
|
+
}
|
|
3721
3734
|
toggleFloorVisibility(floorId) {
|
|
3722
3735
|
const current = new Set(this._visibleFloorIds());
|
|
3723
3736
|
if (current.has(floorId)) {
|
|
@@ -5781,15 +5794,12 @@ class ShowTypeBadgeComponent {
|
|
|
5781
5794
|
show;
|
|
5782
5795
|
size = 'xs';
|
|
5783
5796
|
transloco = inject(TranslocoService);
|
|
5784
|
-
get showTypeColor() {
|
|
5785
|
-
return this.show.show_type ? SHOW_TYPE_COLORS[this.show.show_type] : SHOW_TYPE_COLORS['DEFAULT'];
|
|
5786
|
-
}
|
|
5787
5797
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowTypeBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
5788
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
5798
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: ShowTypeBadgeComponent, isStandalone: true, selector: "show-type-badge", inputs: { show: "show", size: "size" }, ngImport: i0, template: "@if (show.show_type; as showType) {\n <app-badge [text]=\"showType.name\" size=\"xs\" class=\"show-card__badge\" />\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AppBadgeComponent, selector: "app-badge", inputs: ["text", "color", "size", "bordered", "backgroundColor", "textColor"] }, { kind: "ngmodule", type: TranslocoModule }] });
|
|
5789
5799
|
}
|
|
5790
5800
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowTypeBadgeComponent, decorators: [{
|
|
5791
5801
|
type: Component,
|
|
5792
|
-
args: [{ selector: 'show-type-badge', standalone: true, imports: [CommonModule, AppBadgeComponent, TranslocoModule], template: "
|
|
5802
|
+
args: [{ selector: 'show-type-badge', standalone: true, imports: [CommonModule, AppBadgeComponent, TranslocoModule], template: "@if (show.show_type; as showType) {\n <app-badge [text]=\"showType.name\" size=\"xs\" class=\"show-card__badge\" />\n}\n" }]
|
|
5793
5803
|
}], propDecorators: { show: [{
|
|
5794
5804
|
type: Input,
|
|
5795
5805
|
args: [{ required: true }]
|
|
@@ -5804,9 +5814,6 @@ class ShowCardComponent {
|
|
|
5804
5814
|
linkQueryParams;
|
|
5805
5815
|
transloco = inject(TranslocoService);
|
|
5806
5816
|
dateService = inject(DateService);
|
|
5807
|
-
get showTypeColor() {
|
|
5808
|
-
return this.show.show_type ? SHOW_TYPE_COLORS[this.show.show_type] : SHOW_TYPE_COLORS['DEFAULT'];
|
|
5809
|
-
}
|
|
5810
5817
|
formatTimeDate(date) {
|
|
5811
5818
|
return new Date(date);
|
|
5812
5819
|
}
|
|
@@ -9808,6 +9815,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
|
|
|
9808
9815
|
args: [{ selector: 'ticket-map-floor-selector', standalone: true, imports: [CommonModule], template: "@if (availableFloors().length > 1) {\n <div class=\"ticket-map-floor-selector\">\n @for (floor of availableFloors(); track floor.id) {\n <button\n class=\"floor-button\"\n [class.floor-button-active]=\"isFloorVisible(floor.id)\"\n [class.floor-button-locked]=\"isFloorVisible(floor.id) && !canToggleOff(floor.id)\"\n [disabled]=\"isFloorVisible(floor.id) && !canToggleOff(floor.id)\"\n (click)=\"toggleFloor(floor.id)\"\n [title]=\"floor.name\"\n >\n {{ floor.name }}\n </button>\n }\n </div>\n}\n", styles: [".ticket-map-floor-selector{display:flex;flex-direction:row;align-items:center;gap:.25rem;font-size:.75rem}.ticket-map-floor-selector .floor-button{align-items:center;background-color:#f3f4f6;border:1px solid #e5e7eb;border-radius:.375rem;color:#4b5563;cursor:pointer;display:flex;font-size:.75rem;font-weight:500;height:2rem;justify-content:center;padding-left:.75rem;padding-right:.75rem;transition:all .2s;white-space:nowrap}.ticket-map-floor-selector .floor-button:hover{background-color:#e5e7eb;color:#1f2937}.ticket-map-floor-selector .floor-button.floor-button-active{background-color:#4f46e5;border-color:#4f46e5;color:#fff}.ticket-map-floor-selector .floor-button.floor-button-active:hover{background-color:#4338ca}.ticket-map-floor-selector .floor-button.floor-button-active.floor-button-locked{opacity:.7;cursor:not-allowed}.ticket-map-floor-selector .floor-button.floor-button-active.floor-button-locked:hover{background-color:#4f46e5}\n"] }]
|
|
9809
9816
|
}], ctorParameters: () => [{ type: PerformanceBookingDataService }] });
|
|
9810
9817
|
|
|
9818
|
+
const FLOOR_LAYER_NAME_PREFIX = 'ticket-map-floor-layer-';
|
|
9811
9819
|
class PerformanceTicketMapComponent {
|
|
9812
9820
|
platformId;
|
|
9813
9821
|
bookingDataService;
|
|
@@ -9850,6 +9858,29 @@ class PerformanceTicketMapComponent {
|
|
|
9850
9858
|
stageReady = signal(false, ...(ngDevMode ? [{ debugName: "stageReady" }] : []));
|
|
9851
9859
|
autoFitDone = false;
|
|
9852
9860
|
resizeObserver;
|
|
9861
|
+
// Una <ko-layer #floorLayer> por piso (ver template). No asumimos que su
|
|
9862
|
+
// orden coincida con floorGroups(); cada capa se identifica por su `name`
|
|
9863
|
+
// de Konva (ver FLOOR_LAYER_NAME_PREFIX).
|
|
9864
|
+
floorLayerRefs = viewChildren('floorLayer', ...(ngDevMode ? [{ debugName: "floorLayerRefs", read: CoreShapeComponent }] : [{ read: CoreShapeComponent }]));
|
|
9865
|
+
floorLayerName(floorId) {
|
|
9866
|
+
return `${FLOOR_LAYER_NAME_PREFIX}${floorId}`;
|
|
9867
|
+
}
|
|
9868
|
+
floorGroups = computed(() => {
|
|
9869
|
+
const order = this.bookingDataService.floorZOrder();
|
|
9870
|
+
const elements = this.renderData();
|
|
9871
|
+
const byFloor = new Map();
|
|
9872
|
+
for (const el of elements) {
|
|
9873
|
+
if (el.hallFloorId == null)
|
|
9874
|
+
continue;
|
|
9875
|
+
const arr = byFloor.get(el.hallFloorId) ?? [];
|
|
9876
|
+
arr.push(el);
|
|
9877
|
+
byFloor.set(el.hallFloorId, arr);
|
|
9878
|
+
}
|
|
9879
|
+
return order.map((floorId) => ({
|
|
9880
|
+
floorId,
|
|
9881
|
+
elements: byFloor.get(floorId) ?? [],
|
|
9882
|
+
}));
|
|
9883
|
+
}, ...(ngDevMode ? [{ debugName: "floorGroups" }] : []));
|
|
9853
9884
|
constructor(platformId, bookingDataService, feedbackModalService, selectionService, zoomService) {
|
|
9854
9885
|
this.platformId = platformId;
|
|
9855
9886
|
this.bookingDataService = bookingDataService;
|
|
@@ -9864,6 +9895,47 @@ class PerformanceTicketMapComponent {
|
|
|
9864
9895
|
this.zoomService.fitToContainer();
|
|
9865
9896
|
}
|
|
9866
9897
|
});
|
|
9898
|
+
// Trae al frente y atenúa/resalta cada capa (piso) según el hover.
|
|
9899
|
+
// Todo esto se hace de forma 100% imperativa sobre el nodo Konva real
|
|
9900
|
+
// (moveToTop + .to() para el fade), en vez de reordenar el @for y
|
|
9901
|
+
// esperar a que el MutationObserver de ng2-konva sincronice el zIndex:
|
|
9902
|
+
// ese camino depende de que Angular vuelva a renderizar la plantilla.
|
|
9903
|
+
// Así el cambio es instantáneo pase lo que pase con el ciclo de detección
|
|
9904
|
+
// de cambios.
|
|
9905
|
+
effect(() => {
|
|
9906
|
+
const hoveredFloorId = this.bookingDataService.hoveredFloorId();
|
|
9907
|
+
const order = this.bookingDataService.floorZOrder();
|
|
9908
|
+
const layerRefs = this.floorLayerRefs();
|
|
9909
|
+
const layerNodeByFloorId = new Map();
|
|
9910
|
+
for (const layerComponent of layerRefs) {
|
|
9911
|
+
const layerNode = layerComponent.getStage();
|
|
9912
|
+
const name = layerNode?.name?.() ?? '';
|
|
9913
|
+
if (!name.startsWith(FLOOR_LAYER_NAME_PREFIX))
|
|
9914
|
+
continue;
|
|
9915
|
+
const floorId = Number(name.slice(FLOOR_LAYER_NAME_PREFIX.length));
|
|
9916
|
+
if (Number.isFinite(floorId)) {
|
|
9917
|
+
layerNodeByFloorId.set(floorId, layerNode);
|
|
9918
|
+
}
|
|
9919
|
+
}
|
|
9920
|
+
let needsRedraw = false;
|
|
9921
|
+
for (const floorId of order) {
|
|
9922
|
+
const layerNode = layerNodeByFloorId.get(floorId);
|
|
9923
|
+
if (!layerNode)
|
|
9924
|
+
continue;
|
|
9925
|
+
layerNode.moveToTop();
|
|
9926
|
+
needsRedraw = true;
|
|
9927
|
+
const targetOpacity = hoveredFloorId == null || hoveredFloorId === floorId ? 1 : TICKET_MAP_FLOOR_HOVER_OPACITY;
|
|
9928
|
+
if (layerNode.opacity() !== targetOpacity) {
|
|
9929
|
+
layerNode.to({
|
|
9930
|
+
opacity: targetOpacity,
|
|
9931
|
+
duration: TICKET_MAP_FLOOR_HOVER_FADE_MS / 1000,
|
|
9932
|
+
});
|
|
9933
|
+
}
|
|
9934
|
+
}
|
|
9935
|
+
if (needsRedraw) {
|
|
9936
|
+
this.stageComponent?.getStage()?.batchDraw();
|
|
9937
|
+
}
|
|
9938
|
+
});
|
|
9867
9939
|
}
|
|
9868
9940
|
get isBrowser() {
|
|
9869
9941
|
return isPlatformBrowser(this.platformId);
|
|
@@ -9970,6 +10042,7 @@ class PerformanceTicketMapComponent {
|
|
|
9970
10042
|
return;
|
|
9971
10043
|
const internalPos = this.getInternalPointer(stage);
|
|
9972
10044
|
const hit = findElementAtPosition(this.bookingDataService.renderData(), internalPos.x, internalPos.y);
|
|
10045
|
+
this.bookingDataService.setHoveredFloor(hit?.element.hallFloorId ?? null);
|
|
9973
10046
|
if (!hit) {
|
|
9974
10047
|
this.tooltipData.set(null);
|
|
9975
10048
|
return;
|
|
@@ -9996,6 +10069,7 @@ class PerformanceTicketMapComponent {
|
|
|
9996
10069
|
}
|
|
9997
10070
|
handleStageMouseLeave() {
|
|
9998
10071
|
this.tooltipData.set(null);
|
|
10072
|
+
this.bookingDataService.setHoveredFloor(null);
|
|
9999
10073
|
}
|
|
10000
10074
|
handleWheel(konvaEvent) {
|
|
10001
10075
|
const nativeEvent = konvaEvent.event?.evt;
|
|
@@ -10011,11 +10085,11 @@ class PerformanceTicketMapComponent {
|
|
|
10011
10085
|
return floor;
|
|
10012
10086
|
}
|
|
10013
10087
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: PerformanceTicketMapComponent, deps: [{ token: PLATFORM_ID }, { token: PerformanceBookingDataService }, { token: FeedbackModalService }, { token: TicketSelectionService }, { token: TicketMapZoomService }], target: i0.ɵɵFactoryTarget.Component });
|
|
10014
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: PerformanceTicketMapComponent, isStandalone: true, selector: "performance-ticket-map", inputs: { readOnly: "readOnly", needsLogin: "needsLogin", isLoggedIn: "isLoggedIn" }, outputs: { selectionChange: "selectionChange", needsLoginError: "needsLoginError" }, viewQueries: [{ propertyName: "stageComponent", first: true, predicate: StageComponent, descendants: true }], ngImport: i0, template: "<div class=\"ticket-map-canvas-container\">\n @if (isBrowser) {\n <ko-stage\n [config]=\"bookingDataService.stageConfig()\"\n (click)=\"handleStageClick($event)\"\n (mousemove)=\"handleStageMouseMove($event)\"\n (mouseleave)=\"handleStageMouseLeave()\"\n (wheel)=\"handleWheel($event)\"\n >\n <ko-layer>\n
|
|
10088
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: PerformanceTicketMapComponent, isStandalone: true, selector: "performance-ticket-map", inputs: { readOnly: "readOnly", needsLogin: "needsLogin", isLoggedIn: "isLoggedIn" }, outputs: { selectionChange: "selectionChange", needsLoginError: "needsLoginError" }, viewQueries: [{ propertyName: "floorLayerRefs", predicate: ["floorLayer"], descendants: true, read: CoreShapeComponent, isSignal: true }, { propertyName: "stageComponent", first: true, predicate: StageComponent, descendants: true }], ngImport: i0, template: "<div class=\"ticket-map-canvas-container\">\n @if (isBrowser) {\n <ko-stage\n [config]=\"bookingDataService.stageConfig()\"\n (click)=\"handleStageClick($event)\"\n (mousemove)=\"handleStageMouseMove($event)\"\n (mouseleave)=\"handleStageMouseLeave()\"\n (wheel)=\"handleWheel($event)\"\n >\n @for (group of floorGroups(); track group.floorId) {\n <ko-layer #floorLayer [config]=\"{ name: floorLayerName(group.floorId) }\">\n @for (element of group.elements; track trackByElementId($index, element)) {\n <ko-shape [config]=\"element.shapeConfig\" />\n }\n </ko-layer>\n }\n </ko-stage>\n\n @if (tooltipData(); as tooltip) {\n <div class=\"ticket-tooltip\" [style.left.px]=\"tooltip.x\" [style.top.px]=\"tooltip.y\">\n <div class=\"tooltip-header\">{{ tooltip.elementName }}</div>\n @if (tooltip.seatLabel) {\n <div class=\"tooltip-row\">\n <span class=\"tooltip-label\">Asiento:</span>\n <span class=\"tooltip-value\">{{ tooltip.seatLabel }}</span>\n </div>\n }\n <div class=\"tooltip-row\">\n <span class=\"tooltip-label\">Precio:</span>\n <span class=\"tooltip-value\">${{ tooltip.price | number: '1.0-0' }}</span>\n </div>\n <div class=\"tooltip-row\">\n <span class=\"tooltip-label\">Estado:</span>\n <span class=\"tooltip-status\">\n <span class=\"status-dot\" [style.background]=\"tooltip.statusColor\"></span>\n {{ tooltip.statusLabel }}\n </span>\n </div>\n @if (tooltip.isSelected) {\n <div class=\"tooltip-selected-badge\">Seleccionado</div>\n }\n </div>\n }\n }\n</div>\n", styles: [".ticket-map-canvas-container{min-height:500px;overflow:hidden;position:relative;touch-action:pan-x pan-y;width:100%}.ticket-tooltip{position:absolute;z-index:100;background:#1f2937;color:#f9fafb;border-radius:8px;padding:10px 14px;font-size:12px;line-height:1.5;pointer-events:none;min-width:160px;box-shadow:0 4px 12px #00000040}.tooltip-header{font-weight:600;font-size:13px;margin-bottom:6px;padding-bottom:6px;border-bottom:1px solid #374151}.tooltip-row{display:flex;justify-content:space-between;gap:12px}.tooltip-label{color:#9ca3af}.tooltip-value{color:#f9fafb;font-weight:500}.tooltip-status{display:flex;align-items:center;gap:6px;color:#f9fafb;font-weight:500}.status-dot{display:inline-block;width:8px;height:8px;border-radius:50%}.tooltip-selected-badge{margin-top:6px;padding-top:6px;border-top:1px solid #374151;color:#34d399;font-weight:500;font-size:11px}.zoom-controls{position:absolute;bottom:16px;right:16px;display:flex;align-items:center;gap:8px;background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:4px 8px;box-shadow:0 1px 3px #0000001a}.zoom-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid #d1d5db;background:#f9fafb;border-radius:6px;cursor:pointer;font-size:16px;font-weight:600;color:#374151;line-height:1}.zoom-btn:hover{background:#e5e7eb}.zoom-level{font-size:12px;color:#6b7280;min-width:40px;text-align:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: StageComponent, selector: "ko-stage", inputs: ["config"], outputs: ["mouseover", "mousemove", "mouseout", "mouseenter", "mouseleave", "mousedown", "mouseup", "wheel", "contextmenu", "click", "dblclick", "touchstart", "touchmove", "touchend", "tap", "dbltap", "dragstart", "dragmove", "dragend", "transformstart", "transform", "transformend"] }, { kind: "component", type: CoreShapeComponent, selector: "ko-shape, ko-layer, ko-circle, ko-fastlayer, ko-group, ko-label, ko-rect, ko-ellipse, ko-wedge, ko-line, ko-sprite, ko-image, ko-text, ko-text-path, ko-star, ko-ring, ko-arc, ko-tag, ko-path, ko-regular-polygon, ko-arrow, ko-transformer", inputs: ["config"], outputs: ["configChange", "mouseover", "mousemove", "mouseout", "mouseenter", "mouseleave", "mousedown", "mouseup", "wheel", "contextmenu", "click", "dblclick", "touchstart", "touchmove", "touchend", "tap", "dbltap", "dragstart", "dragmove", "dragend", "transformstart", "transform", "transformend"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }] });
|
|
10015
10089
|
}
|
|
10016
10090
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: PerformanceTicketMapComponent, decorators: [{
|
|
10017
10091
|
type: Component,
|
|
10018
|
-
args: [{ selector: 'performance-ticket-map', standalone: true, imports: [CommonModule, StageComponent, CoreShapeComponent], template: "<div class=\"ticket-map-canvas-container\">\n @if (isBrowser) {\n <ko-stage\n [config]=\"bookingDataService.stageConfig()\"\n (click)=\"handleStageClick($event)\"\n (mousemove)=\"handleStageMouseMove($event)\"\n (mouseleave)=\"handleStageMouseLeave()\"\n (wheel)=\"handleWheel($event)\"\n >\n <ko-layer>\n
|
|
10092
|
+
args: [{ selector: 'performance-ticket-map', standalone: true, imports: [CommonModule, StageComponent, CoreShapeComponent], template: "<div class=\"ticket-map-canvas-container\">\n @if (isBrowser) {\n <ko-stage\n [config]=\"bookingDataService.stageConfig()\"\n (click)=\"handleStageClick($event)\"\n (mousemove)=\"handleStageMouseMove($event)\"\n (mouseleave)=\"handleStageMouseLeave()\"\n (wheel)=\"handleWheel($event)\"\n >\n @for (group of floorGroups(); track group.floorId) {\n <ko-layer #floorLayer [config]=\"{ name: floorLayerName(group.floorId) }\">\n @for (element of group.elements; track trackByElementId($index, element)) {\n <ko-shape [config]=\"element.shapeConfig\" />\n }\n </ko-layer>\n }\n </ko-stage>\n\n @if (tooltipData(); as tooltip) {\n <div class=\"ticket-tooltip\" [style.left.px]=\"tooltip.x\" [style.top.px]=\"tooltip.y\">\n <div class=\"tooltip-header\">{{ tooltip.elementName }}</div>\n @if (tooltip.seatLabel) {\n <div class=\"tooltip-row\">\n <span class=\"tooltip-label\">Asiento:</span>\n <span class=\"tooltip-value\">{{ tooltip.seatLabel }}</span>\n </div>\n }\n <div class=\"tooltip-row\">\n <span class=\"tooltip-label\">Precio:</span>\n <span class=\"tooltip-value\">${{ tooltip.price | number: '1.0-0' }}</span>\n </div>\n <div class=\"tooltip-row\">\n <span class=\"tooltip-label\">Estado:</span>\n <span class=\"tooltip-status\">\n <span class=\"status-dot\" [style.background]=\"tooltip.statusColor\"></span>\n {{ tooltip.statusLabel }}\n </span>\n </div>\n @if (tooltip.isSelected) {\n <div class=\"tooltip-selected-badge\">Seleccionado</div>\n }\n </div>\n }\n }\n</div>\n", styles: [".ticket-map-canvas-container{min-height:500px;overflow:hidden;position:relative;touch-action:pan-x pan-y;width:100%}.ticket-tooltip{position:absolute;z-index:100;background:#1f2937;color:#f9fafb;border-radius:8px;padding:10px 14px;font-size:12px;line-height:1.5;pointer-events:none;min-width:160px;box-shadow:0 4px 12px #00000040}.tooltip-header{font-weight:600;font-size:13px;margin-bottom:6px;padding-bottom:6px;border-bottom:1px solid #374151}.tooltip-row{display:flex;justify-content:space-between;gap:12px}.tooltip-label{color:#9ca3af}.tooltip-value{color:#f9fafb;font-weight:500}.tooltip-status{display:flex;align-items:center;gap:6px;color:#f9fafb;font-weight:500}.status-dot{display:inline-block;width:8px;height:8px;border-radius:50%}.tooltip-selected-badge{margin-top:6px;padding-top:6px;border-top:1px solid #374151;color:#34d399;font-weight:500;font-size:11px}.zoom-controls{position:absolute;bottom:16px;right:16px;display:flex;align-items:center;gap:8px;background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:4px 8px;box-shadow:0 1px 3px #0000001a}.zoom-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid #d1d5db;background:#f9fafb;border-radius:6px;cursor:pointer;font-size:16px;font-weight:600;color:#374151;line-height:1}.zoom-btn:hover{background:#e5e7eb}.zoom-level{font-size:12px;color:#6b7280;min-width:40px;text-align:center}\n"] }]
|
|
10019
10093
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
10020
10094
|
type: Inject,
|
|
10021
10095
|
args: [PLATFORM_ID]
|
|
@@ -10032,7 +10106,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
|
|
|
10032
10106
|
}], stageComponent: [{
|
|
10033
10107
|
type: ViewChild,
|
|
10034
10108
|
args: [StageComponent]
|
|
10035
|
-
}] } });
|
|
10109
|
+
}], floorLayerRefs: [{ type: i0.ViewChildren, args: ['floorLayer', { ...{ read: CoreShapeComponent }, isSignal: true }] }] } });
|
|
10036
10110
|
|
|
10037
10111
|
class TicketMapPriceZonesComponent {
|
|
10038
10112
|
title = 'Precios por zona';
|
|
@@ -11150,5 +11224,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
|
|
|
11150
11224
|
* Generated bundle index. Do not edit.
|
|
11151
11225
|
*/
|
|
11152
11226
|
|
|
11153
|
-
export { ADMIN_API_ROUTES, ADMISSION_API_ROUTES, ALERT_ICONS, AdminSelectComponent, AdminService, AdmissionQueueService, ApiService, AppAlertComponent, AppBadgeComponent, AppBreadcumbComponent, AppButtonComponent, AppLinkButtonComponent, AppModalComponent, AsyncSelectComponent, AuditInformationComponent, BASE_BUTTON_CLASSES, BASE_INPUT_CLASSES, BUTTON_SIZES_CLASSES, BUTTON_VARIANT_CLASSES, BaseModalService, BrowserZoomLockService, BulkSaveBarComponent, CITY_API_ENDPOINTS, COUNTRY_API_ENDPOINTS, CUSTOMERS_API_ROUTES, ChangePasswordFormComponent, ChangePasswordFormService, CitiesService, CitySelectComponent, ColorPickerComponent, ConfirmationOrderModalComponent, ConfirmationOrderModalService, CorporateBondStatus, CountrySelectComponent, CountryService, CouponApplicability, CouponDiscountType, CouponStatus, CreatorType, CustomerSelectComponent, CustomerService, DEFAULT_STAGE_CONFIG, DOCUMENT_TYPES_OPTIONS, DateInputComponent, DateService, DaySelectorGridComponent, DeleteConfirmationComponent, DeleteConfirmationService, DynamicTableComponent, ERROR_INPUT_CLASSES, EndDateGreaterThanStartValidator, FORM_ERROR_MESSAGES, FeedbackModalComponent, FeedbackModalService, FileType, FileUploadComponent, FileUploadPreviewComponent, FormEditorComponent, FormInputComponent, FormSelectComponent, FormTextareaComponent, GiftBondPurchaseStatus, GiftBondStatus, IdentityDocumentInputComponent, KONVA_SHAPE_MAPPINGS, LanguageSwitcherComponent, MembershipStatus, MinTodayValidator, MustMatchValidator, NumberInputComponent, ORDER_DISCOUNT_COLORS, ORDER_ITEM_TYPES_COLORS, ORDER_STATUS_COLORS, OrderBillingInfoComponent, OrderDiscountAppliedComponent, OrderInformationComponent, OrderItemType, OrderItemTypeBadgeComponent, OrderItemsComponent, OrderStatus, OrderStatusBadgeComponent, OrderTransactionDetailsModalComponent, OrderTransactionDetailsModalService, OrderTransactionsComponent, PAYMENT_METHODS_OPTIONS, PERFORMANCES_API_ROUTES, PERFORMANCE_STATUS_COLORS, PERFORMANCE_TICKET_STATUS_COLORS, PHONE_COUNTRIES, PRICE_ZONES_API_ROUTES, PRODUCTS_API_ROUTES, PRODUCT_CATEGORIES_API_ROUTES, PRODUCT_TAGS_API_ROUTES, PRODUCT_TYPES_API_ROUTES, PaymentMethod, PendingChangesService, PerformanceBookingDataService, PerformanceCardComponent, PerformanceCardListComponent, PerformanceMultiSelectComponent, PerformanceSelectComponent, PerformanceService, PerformanceStatus, PerformanceStatusBadgeComponent, PerformanceStepperComponent, PerformanceTicketMapComponent, PerformanceTicketStatus, PerformanceTicketStatusBadgeComponent, PerformancesListEventsService, PhoneInputComponent, PriceZoneEventService, PriceZoneFormModalService, PriceZoneSelectComponent, PriceZoneService, ProductCategoryService, ProductMultiSelectComponent, ProductSelectComponent, ProductService, ProductTagService, ProductTypeService, PurchaseLimitService, QuickStatusEditComponent, RoomMapElementOrientation, RoomMapElementType, SHOWS_API_ROUTES,
|
|
11227
|
+
export { ADMIN_API_ROUTES, ADMISSION_API_ROUTES, ALERT_ICONS, AdminSelectComponent, AdminService, AdmissionQueueService, ApiService, AppAlertComponent, AppBadgeComponent, AppBreadcumbComponent, AppButtonComponent, AppLinkButtonComponent, AppModalComponent, AsyncSelectComponent, AuditInformationComponent, BASE_BUTTON_CLASSES, BASE_INPUT_CLASSES, BUTTON_SIZES_CLASSES, BUTTON_VARIANT_CLASSES, BaseModalService, BrowserZoomLockService, BulkSaveBarComponent, CITY_API_ENDPOINTS, COUNTRY_API_ENDPOINTS, CUSTOMERS_API_ROUTES, ChangePasswordFormComponent, ChangePasswordFormService, CitiesService, CitySelectComponent, ColorPickerComponent, ConfirmationOrderModalComponent, ConfirmationOrderModalService, CorporateBondStatus, CountrySelectComponent, CountryService, CouponApplicability, CouponDiscountType, CouponStatus, CreatorType, CustomerSelectComponent, CustomerService, DEFAULT_STAGE_CONFIG, DOCUMENT_TYPES_OPTIONS, DateInputComponent, DateService, DaySelectorGridComponent, DeleteConfirmationComponent, DeleteConfirmationService, DynamicTableComponent, ERROR_INPUT_CLASSES, EndDateGreaterThanStartValidator, FORM_ERROR_MESSAGES, FeedbackModalComponent, FeedbackModalService, FileType, FileUploadComponent, FileUploadPreviewComponent, FormEditorComponent, FormInputComponent, FormSelectComponent, FormTextareaComponent, GiftBondPurchaseStatus, GiftBondStatus, IdentityDocumentInputComponent, KONVA_SHAPE_MAPPINGS, LanguageSwitcherComponent, MembershipStatus, MinTodayValidator, MustMatchValidator, NumberInputComponent, ORDER_DISCOUNT_COLORS, ORDER_ITEM_TYPES_COLORS, ORDER_STATUS_COLORS, OrderBillingInfoComponent, OrderDiscountAppliedComponent, OrderInformationComponent, OrderItemType, OrderItemTypeBadgeComponent, OrderItemsComponent, OrderStatus, OrderStatusBadgeComponent, OrderTransactionDetailsModalComponent, OrderTransactionDetailsModalService, OrderTransactionsComponent, PAYMENT_METHODS_OPTIONS, PERFORMANCES_API_ROUTES, PERFORMANCE_STATUS_COLORS, PERFORMANCE_TICKET_STATUS_COLORS, PHONE_COUNTRIES, PRICE_ZONES_API_ROUTES, PRODUCTS_API_ROUTES, PRODUCT_CATEGORIES_API_ROUTES, PRODUCT_TAGS_API_ROUTES, PRODUCT_TYPES_API_ROUTES, PaymentMethod, PendingChangesService, PerformanceBookingDataService, PerformanceCardComponent, PerformanceCardListComponent, PerformanceMultiSelectComponent, PerformanceSelectComponent, PerformanceService, PerformanceStatus, PerformanceStatusBadgeComponent, PerformanceStepperComponent, PerformanceTicketMapComponent, PerformanceTicketStatus, PerformanceTicketStatusBadgeComponent, PerformancesListEventsService, PhoneInputComponent, PriceZoneEventService, PriceZoneFormModalService, PriceZoneSelectComponent, PriceZoneService, ProductCategoryService, ProductMultiSelectComponent, ProductSelectComponent, ProductService, ProductTagService, ProductTypeService, PurchaseLimitService, QuickStatusEditComponent, RoomMapElementOrientation, RoomMapElementType, SHOWS_API_ROUTES, STATE_API_ENDPOINTS, SeatAvailabilitySseService, SeatSelectionEmptySummaryComponent, SeatSelectionSummaryComponent, SeatSelectionSummaryItemComponent, SelectedDiscountCardType, ShowCardComponent, ShowCardSkeletonComponent, ShowMultiSelectComponent, ShowSelectComponent, ShowService, ShowTypeBadgeComponent, ShowsFilterComponent, StateSelectComponent, StatesService, TICKERA_COMPONENTS_CONFIG, TICKET_ELEMENT_TYPES, TICKET_MAP_FLOOR_HOVER_FADE_MS, TICKET_MAP_FLOOR_HOVER_OPACITY, TICKET_MAP_GRID_SIZE, TICKET_MAP_LAST_TICKETS_LIMIT, TICKET_MAP_TITLE_HEIGHT, TICKET_STATUS_COLORS, TICKET_STATUS_FILLS, TICKET_STATUS_LABELS, TIcketMapProductSelectionComponent, TRANSACTION_STATUS_COLORS, TextExpandableComponent, TickeraTranslocoLoader, TicketMapFloorSelectorComponent, TicketMapPriceZonesComponent, TicketMapProductSelectionItemComponent, TicketMapTotalsComponent, TicketMapWidgetComponent, TicketMapWidgetHeaderComponent, TicketMapWrapperComponent, TicketMapZoomControlsComponent, TicketMapZoomService, TicketQrComponent, TicketQrModalComponent, TicketQrModalService, TicketQrService, TicketSelectionDetailsService, TicketSelectionDiscountService, TicketSelectionService, TicketSelectionTotalsService, ToastService, ToggleSwitchComponent, TransactionStatus, VENUES_API_ROUTES, VIP_CARDS_API_ROUTES, VipBalanceCardComponent, VipCardService, VipCardStatus, VipCardStatusBadgeComponent, VipRechargeModalComponent, VipTransactionType, VipTransactionsTableComponent, ZonePriceItemComponent, ZonePriceListComponent, authInterceptor, drawChairIcon$1 as drawChairIcon, drawHappyFace, drawRoundedRect, drawWheelchairIcon, emailValidator, findElementAtPosition, findTicketAtPosition, formatCitiesResponseToSelect, generateExitScene, generateHallwayScene, generateProductionAreaScene, generateSeatBlockScene, generateSeatBlockTicketScene, generateStageScene, generateStairScene, generateTableScene, generateTableTicketScene, generateUnavailableSpaceScene, generateZoneScene, getBrowserLanguage, getCustomerFullname, getItemTypeIcon, getOrderDiscount, getStoredLanguage, numberToLetter$1 as numberToLetter, parseJsonToFormDataAdvanced, phoneCountryFlag, processElementsToRenderData, provideTickeraComponents, resolveLanguage, setStoredLanguage, ticketCanOpenQr, tintColor, transformImageToFile, transformUrlParams };
|
|
11154
11228
|
//# sourceMappingURL=tickera-angular-components.mjs.map
|