🎯 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,3 @@
export declare const favIconHtml: string;
export declare const htmlTemplateString = "\n<!-- HTML for static distribution bundle build -->\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title><% title %></title>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"<% baseUrl %>swagger-ui.css\" >\n <% favIconString %>\n <style>\n html\n {\n box-sizing: border-box;\n overflow: -moz-scrollbars-vertical;\n overflow-y: scroll;\n }\n *,\n *:before,\n *:after\n {\n box-sizing: inherit;\n }\n\n body {\n margin:0;\n background: #fafafa;\n }\n </style>\n</head>\n\n<body>\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" style=\"position:absolute;width:0;height:0\">\n <defs>\n <symbol viewBox=\"0 0 20 20\" id=\"unlocked\">\n <path d=\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z\"></path>\n </symbol>\n\n <symbol viewBox=\"0 0 20 20\" id=\"locked\">\n <path d=\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z\"/>\n </symbol>\n\n <symbol viewBox=\"0 0 20 20\" id=\"close\">\n <path d=\"M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z\"/>\n </symbol>\n\n <symbol viewBox=\"0 0 20 20\" id=\"large-arrow\">\n <path d=\"M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z\"/>\n </symbol>\n\n <symbol viewBox=\"0 0 20 20\" id=\"large-arrow-down\">\n <path d=\"M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z\"/>\n </symbol>\n\n\n <symbol viewBox=\"0 0 24 24\" id=\"jump-to\">\n <path d=\"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z\"/>\n </symbol>\n\n <symbol viewBox=\"0 0 24 24\" id=\"expand\">\n <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\"/>\n </symbol>\n\n </defs>\n</svg>\n\n<div id=\"swagger-ui\"></div>\n\n<script src=\"<% baseUrl %>swagger-ui-bundle.js\"> </script>\n<script src=\"<% baseUrl %>swagger-ui-standalone-preset.js\"> </script>\n<script src=\"<% baseUrl %>swagger-ui-init.js\"> </script>\n<% customJs %>\n<% customJsStr %>\n<% customCssUrl %>\n<style>\n <% customCss %>\n <% explorerCss %>\n</style>\n</body>\n\n</html>\n";
export declare const jsTemplateString = "\nwindow.onload = function() {\n // Build a system\n let url = window.location.search.match(/url=([^&]+)/);\n if (url && url.length > 1) {\n url = decodeURIComponent(url[1]);\n } else {\n url = window.location.origin;\n }\n <% swaggerOptions %>\n url = options.swaggerUrl || url\n let urls = options.swaggerUrls\n let customOptions = options.customOptions\n let spec1 = options.swaggerDoc\n let swaggerOptions = {\n spec: spec1,\n url: url,\n urls: urls,\n dom_id: '#swagger-ui',\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n plugins: [\n SwaggerUIBundle.plugins.DownloadUrl\n ],\n layout: \"StandaloneLayout\"\n }\n for (let attrname in customOptions) {\n swaggerOptions[attrname] = customOptions[attrname];\n }\n let ui = SwaggerUIBundle(swaggerOptions)\n\n if (customOptions.initOAuth) {\n ui.initOAuth(customOptions.initOAuth)\n }\n\n if (customOptions.authAction) {\n ui.authActions.authorize(customOptions.authAction)\n }\n \n window.ui = ui\n}\n";

View File

@@ -0,0 +1,132 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.jsTemplateString = exports.htmlTemplateString = exports.favIconHtml = void 0;
exports.favIconHtml = '<link rel="icon" type="image/png" href="<% baseUrl %>favicon-32x32.png" sizes="32x32" />' +
'<link rel="icon" type="image/png" href="<% baseUrl %>favicon-16x16.png" sizes="16x16" />';
exports.htmlTemplateString = `
<!-- HTML for static distribution bundle build -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><% title %></title>
<link rel="stylesheet" type="text/css" href="<% baseUrl %>swagger-ui.css" >
<% favIconString %>
<style>
html
{
box-sizing: border-box;
overflow: -moz-scrollbars-vertical;
overflow-y: scroll;
}
*,
*:before,
*:after
{
box-sizing: inherit;
}
body {
margin:0;
background: #fafafa;
}
</style>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position:absolute;width:0;height:0">
<defs>
<symbol viewBox="0 0 20 20" id="unlocked">
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"></path>
</symbol>
<symbol viewBox="0 0 20 20" id="locked">
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z"/>
</symbol>
<symbol viewBox="0 0 20 20" id="close">
<path d="M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z"/>
</symbol>
<symbol viewBox="0 0 20 20" id="large-arrow">
<path d="M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z"/>
</symbol>
<symbol viewBox="0 0 20 20" id="large-arrow-down">
<path d="M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z"/>
</symbol>
<symbol viewBox="0 0 24 24" id="jump-to">
<path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z"/>
</symbol>
<symbol viewBox="0 0 24 24" id="expand">
<path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>
</symbol>
</defs>
</svg>
<div id="swagger-ui"></div>
<script src="<% baseUrl %>swagger-ui-bundle.js"> </script>
<script src="<% baseUrl %>swagger-ui-standalone-preset.js"> </script>
<script src="<% baseUrl %>swagger-ui-init.js"> </script>
<% customJs %>
<% customJsStr %>
<% customCssUrl %>
<style>
<% customCss %>
<% explorerCss %>
</style>
</body>
</html>
`;
exports.jsTemplateString = `
window.onload = function() {
// Build a system
let url = window.location.search.match(/url=([^&]+)/);
if (url && url.length > 1) {
url = decodeURIComponent(url[1]);
} else {
url = window.location.origin;
}
<% swaggerOptions %>
url = options.swaggerUrl || url
let urls = options.swaggerUrls
let customOptions = options.customOptions
let spec1 = options.swaggerDoc
let swaggerOptions = {
spec: spec1,
url: url,
urls: urls,
dom_id: '#swagger-ui',
deepLinking: true,
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIStandalonePreset
],
plugins: [
SwaggerUIBundle.plugins.DownloadUrl
],
layout: "StandaloneLayout"
}
for (let attrname in customOptions) {
swaggerOptions[attrname] = customOptions[attrname];
}
let ui = SwaggerUIBundle(swaggerOptions)
if (customOptions.initOAuth) {
ui.initOAuth(customOptions.initOAuth)
}
if (customOptions.authAction) {
ui.authActions.authorize(customOptions.authAction)
}
window.ui = ui
}
`;

View File

@@ -0,0 +1,2 @@
import { SwaggerUIInitOptions } from '../interfaces/swagger-ui-init-options.interface';
export declare function buildJSInitOptions(initOptions: SwaggerUIInitOptions): string;

View File

@@ -0,0 +1,17 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildJSInitOptions = void 0;
function buildJSInitOptions(initOptions) {
const functionPlaceholder = '____FUNCTION_PLACEHOLDER____';
const fns = [];
let json = JSON.stringify(initOptions, (key, value) => {
if (typeof value === 'function') {
fns.push(value);
return functionPlaceholder;
}
return value;
}, 2);
json = json.replace(new RegExp('"' + functionPlaceholder + '"', 'g'), () => fns.shift());
return `let options = ${json};`;
}
exports.buildJSInitOptions = buildJSInitOptions;

View File

@@ -0,0 +1 @@
export * from './swagger-ui';

View File

@@ -0,0 +1,17 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./swagger-ui"), exports);

View File

@@ -0,0 +1,4 @@
import { OpenAPIObject, SwaggerCustomOptions } from '../interfaces';
export declare function buildSwaggerInitJS(swaggerDoc: OpenAPIObject, customOptions?: SwaggerCustomOptions): string;
export declare function getSwaggerAssetsAbsoluteFSPath(): string;
export declare function buildSwaggerHTML(baseUrl: string, customOptions?: SwaggerCustomOptions): string;

View File

@@ -0,0 +1,63 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildSwaggerHTML = exports.getSwaggerAssetsAbsoluteFSPath = exports.buildSwaggerInitJS = void 0;
const constants_1 = require("./constants");
const helpers_1 = require("./helpers");
function buildSwaggerInitJS(swaggerDoc, customOptions = {}) {
const { swaggerOptions = {}, swaggerUrl } = customOptions;
const swaggerInitOptions = {
swaggerDoc,
swaggerUrl,
customOptions: swaggerOptions
};
const jsInitOptions = (0, helpers_1.buildJSInitOptions)(swaggerInitOptions);
return constants_1.jsTemplateString.replace('<% swaggerOptions %>', jsInitOptions);
}
exports.buildSwaggerInitJS = buildSwaggerInitJS;
let swaggerAssetsAbsoluteFSPath;
function getSwaggerAssetsAbsoluteFSPath() {
if (!swaggerAssetsAbsoluteFSPath) {
swaggerAssetsAbsoluteFSPath = require('swagger-ui-dist/absolute-path.js')();
}
return swaggerAssetsAbsoluteFSPath;
}
exports.getSwaggerAssetsAbsoluteFSPath = getSwaggerAssetsAbsoluteFSPath;
function toExternalScriptTag(url) {
return `<script src='${url}'></script>`;
}
function toInlineScriptTag(jsCode) {
return `<script>${jsCode}</script>`;
}
function toExternalStylesheetTag(url) {
return `<link href='${url}' rel='stylesheet'>`;
}
function toTags(customCode, toScript) {
if (!customCode) {
return '';
}
if (typeof customCode === 'string') {
return toScript(customCode);
}
else {
return customCode.map(toScript).join('\n');
}
}
function buildSwaggerHTML(baseUrl, customOptions = {}) {
const { customCss = '', customJs = '', customJsStr = '', customfavIcon = false, customSiteTitle = 'Swagger UI', customCssUrl = '', explorer = false } = customOptions;
const favIconString = customfavIcon
? `<link rel='icon' href='${customfavIcon}' />`
: constants_1.favIconHtml;
const explorerCss = explorer
? ''
: '.swagger-ui .topbar .download-url-wrapper { display: none }';
return constants_1.htmlTemplateString
.replace('<% customCss %>', customCss)
.replace('<% explorerCss %>', explorerCss)
.replace('<% favIconString %>', favIconString)
.replace(/<% baseUrl %>/g, baseUrl)
.replace('<% customJs %>', toTags(customJs, toExternalScriptTag))
.replace('<% customJsStr %>', toTags(customJsStr, toInlineScriptTag))
.replace('<% customCssUrl %>', toTags(customCssUrl, toExternalStylesheetTag))
.replace('<% title %>', customSiteTitle);
}
exports.buildSwaggerHTML = buildSwaggerHTML;