🎯 MapView v2.0 - Global Deployment Ready

 MAJOR FEATURES:
• Auto-zoom intelligence với smart bounds fitting
• Enhanced 3D GPS markers với pulsing effects
• Professional route display với 6-layer rendering
• Status-based parking icons với availability indicators
• Production-ready build optimizations

🗺️ AUTO-ZOOM FEATURES:
• Smart bounds fitting cho GPS + selected parking
• Adaptive padding (50px) cho visual balance
• Max zoom control (level 16) để tránh quá gần
• Dynamic centering khi không có selection

🎨 ENHANCED VISUALS:
• 3D GPS marker với multi-layer pulse effects
• Advanced parking icons với status colors
• Selection highlighting với animation
• Dimming system cho non-selected items

🛣️ ROUTE SYSTEM:
• OpenRouteService API integration
• Multi-layer route rendering (glow, shadow, main, animated)
• Real-time distance & duration calculation
• Visual route info trong popup

📱 PRODUCTION READY:
• SSR safe với dynamic imports
• Build errors resolved
• Global deployment via Vercel
• Optimized performance

🌍 DEPLOYMENT:
• Vercel: https://whatever-ctk2auuxr-phong12hexdockworks-projects.vercel.app
• Bundle size: 22.8 kB optimized
• Global CDN distribution
• HTTPS enabled

💾 VERSION CONTROL:
• MapView-v2.0.tsx backup created
• MAPVIEW_VERSIONS.md documentation
• Full version history tracking
This commit is contained in:
2025-07-20 19:52:16 +07:00
parent 3203463a6a
commit c65cc97a33
64624 changed files with 7199453 additions and 6462 deletions

View File

@@ -0,0 +1 @@
export declare const FORBIDDEN_MESSAGE = "Forbidden resource";

View File

@@ -0,0 +1,4 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FORBIDDEN_MESSAGE = void 0;
exports.FORBIDDEN_MESSAGE = 'Forbidden resource';

View File

@@ -0,0 +1,9 @@
import { CanActivate } from '@nestjs/common';
import { ContextType, Controller } from '@nestjs/common/interfaces';
import { Observable } from 'rxjs';
import { ExecutionContextHost } from '../helpers/execution-context-host';
export declare class GuardsConsumer {
tryActivate<TContext extends string = ContextType>(guards: CanActivate[], args: unknown[], instance: Controller, callback: (...args: unknown[]) => unknown, type?: TContext): Promise<boolean>;
createContext(args: unknown[], instance: Controller, callback: (...args: unknown[]) => unknown): ExecutionContextHost;
pickResult(result: boolean | Promise<boolean> | Observable<boolean>): Promise<boolean>;
}

View File

@@ -0,0 +1,33 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GuardsConsumer = void 0;
const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
const rxjs_1 = require("rxjs");
const execution_context_host_1 = require("../helpers/execution-context-host");
class GuardsConsumer {
async tryActivate(guards, args, instance, callback, type) {
if (!guards || (0, shared_utils_1.isEmpty)(guards)) {
return true;
}
const context = this.createContext(args, instance, callback);
context.setType(type);
for (const guard of guards) {
const result = guard.canActivate(context);
if (await this.pickResult(result)) {
continue;
}
return false;
}
return true;
}
createContext(args, instance, callback) {
return new execution_context_host_1.ExecutionContextHost(args, instance.constructor, callback);
}
async pickResult(result) {
if (result instanceof rxjs_1.Observable) {
return (0, rxjs_1.lastValueFrom)(result);
}
return result;
}
}
exports.GuardsConsumer = GuardsConsumer;

View File

@@ -0,0 +1,17 @@
import { CanActivate } from '@nestjs/common';
import { Controller, Type } from '@nestjs/common/interfaces';
import { ApplicationConfig } from '../application-config';
import { ContextCreator } from '../helpers/context-creator';
import { NestContainer } from '../injector/container';
import { InstanceWrapper } from '../injector/instance-wrapper';
export declare class GuardsContextCreator extends ContextCreator {
private readonly container;
private readonly config?;
private moduleContext;
constructor(container: NestContainer, config?: ApplicationConfig);
create(instance: Controller, callback: (...args: unknown[]) => unknown, module: string, contextId?: import("../injector/instance-wrapper").ContextId, inquirerId?: string): CanActivate[];
createConcreteContext<T extends unknown[], R extends unknown[]>(metadata: T, contextId?: import("../injector/instance-wrapper").ContextId, inquirerId?: string): R;
getGuardInstance(metatype: Function | CanActivate, contextId?: import("../injector/instance-wrapper").ContextId, inquirerId?: string): CanActivate | null;
getInstanceByMetatype(metatype: Type<unknown>): InstanceWrapper | undefined;
getGlobalMetadata<T extends unknown[]>(contextId?: import("../injector/instance-wrapper").ContextId, inquirerId?: string): T;
}

View File

@@ -0,0 +1,70 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GuardsContextCreator = void 0;
const constants_1 = require("@nestjs/common/constants");
const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
const iterare_1 = require("iterare");
const context_creator_1 = require("../helpers/context-creator");
const constants_2 = require("../injector/constants");
class GuardsContextCreator extends context_creator_1.ContextCreator {
constructor(container, config) {
super();
this.container = container;
this.config = config;
}
create(instance, callback, module, contextId = constants_2.STATIC_CONTEXT, inquirerId) {
this.moduleContext = module;
return this.createContext(instance, callback, constants_1.GUARDS_METADATA, contextId, inquirerId);
}
createConcreteContext(metadata, contextId = constants_2.STATIC_CONTEXT, inquirerId) {
if ((0, shared_utils_1.isEmpty)(metadata)) {
return [];
}
return (0, iterare_1.iterate)(metadata)
.filter((guard) => guard && (guard.name || guard.canActivate))
.map(guard => this.getGuardInstance(guard, contextId, inquirerId))
.filter((guard) => guard && (0, shared_utils_1.isFunction)(guard.canActivate))
.toArray();
}
getGuardInstance(metatype, contextId = constants_2.STATIC_CONTEXT, inquirerId) {
const isObject = metatype.canActivate;
if (isObject) {
return metatype;
}
const instanceWrapper = this.getInstanceByMetatype(metatype);
if (!instanceWrapper) {
return null;
}
const instanceHost = instanceWrapper.getInstanceByContextId(this.getContextId(contextId, instanceWrapper), inquirerId);
return instanceHost && instanceHost.instance;
}
getInstanceByMetatype(metatype) {
if (!this.moduleContext) {
return;
}
const collection = this.container.getModules();
const moduleRef = collection.get(this.moduleContext);
if (!moduleRef) {
return;
}
const injectables = moduleRef.injectables;
return injectables.get(metatype);
}
getGlobalMetadata(contextId = constants_2.STATIC_CONTEXT, inquirerId) {
if (!this.config) {
return [];
}
const globalGuards = this.config.getGlobalGuards();
if (contextId === constants_2.STATIC_CONTEXT && !inquirerId) {
return globalGuards;
}
const scopedGuardWrappers = this.config.getGlobalRequestGuards();
const scopedGuards = (0, iterare_1.iterate)(scopedGuardWrappers)
.map(wrapper => wrapper.getInstanceByContextId(this.getContextId(contextId, wrapper), inquirerId))
.filter(host => !!host)
.map(host => host.instance)
.toArray();
return globalGuards.concat(scopedGuards);
}
}
exports.GuardsContextCreator = GuardsContextCreator;

3
backend/node_modules/@nestjs/core/guards/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
export * from './constants';
export * from './guards-consumer';
export * from './guards-context-creator';

6
backend/node_modules/@nestjs/core/guards/index.js generated vendored Normal file
View File

@@ -0,0 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
tslib_1.__exportStar(require("./constants"), exports);
tslib_1.__exportStar(require("./guards-consumer"), exports);
tslib_1.__exportStar(require("./guards-context-creator"), exports);