🎯 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,18 @@
import { Test } from '@nestjs/testing';
import { <%= classify(className) %> } from './<%= name %>';
describe('<%= classify(className) %>', () => {
let provider;
beforeEach(async () => {
const module = await Test.createTestingModule({
providers: [<%= classify(className) %>],
}).compile();
provider = module.get(<%= classify(className) %>);
});
it('should be defined', () => {
expect(provider).toBeDefined();
});
});

View File

@@ -0,0 +1,4 @@
import { Injectable } from '@nestjs/common';
@Injectable()
export class <%= classify(className) %> {}

View File

@@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { <%= classify(className) %> } from './<%= name %>';
describe('<%= classify(className) %>', () => {
let provider: <%= classify(className) %>;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [<%= classify(className) %>],
}).compile();
provider = module.get<<%= classify(className) %>>(<%= classify(className) %>);
});
it('should be defined', () => {
expect(provider).toBeDefined();
});
});

View File

@@ -0,0 +1,4 @@
import { Injectable } from '@nestjs/common';
@Injectable()
export class <%= classify(className) %> {}

View File

@@ -0,0 +1,3 @@
import { Rule } from '@angular-devkit/schematics';
import { ProviderOptions } from './provider.schema';
export declare function main(options: ProviderOptions): Rule;

View File

@@ -0,0 +1,76 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.main = main;
const core_1 = require("@angular-devkit/core");
const schematics_1 = require("@angular-devkit/schematics");
const formatting_1 = require("../../utils/formatting");
const module_declarator_1 = require("../../utils/module.declarator");
const module_finder_1 = require("../../utils/module.finder");
const name_parser_1 = require("../../utils/name.parser");
const source_root_helpers_1 = require("../../utils/source-root.helpers");
function main(options) {
options = transform(options);
return (tree, context) => {
return (0, schematics_1.branchAndMerge)((0, schematics_1.chain)([
(0, source_root_helpers_1.mergeSourceRoot)(options),
addDeclarationToModule(options),
(0, schematics_1.mergeWith)(generate(options)),
]))(tree, context);
};
}
function transform(options) {
const target = Object.assign({}, options);
target.metadata = 'providers';
target.specFileSuffix = (0, formatting_1.normalizeToKebabOrSnakeCase)(options.specFileSuffix || 'spec');
if (!target.name) {
throw new schematics_1.SchematicsException('Option (name) is required.');
}
const location = new name_parser_1.NameParser().parse(target);
target.name = (0, formatting_1.normalizeToKebabOrSnakeCase)(location.name);
if (target.name.includes('.')) {
target.className = core_1.strings.classify(target.name).replace('.', '');
}
else {
target.className = core_1.strings.classify(target.name);
}
target.path = (0, formatting_1.normalizeToKebabOrSnakeCase)(location.path);
target.language = target.language !== undefined ? target.language : 'ts';
target.path = target.flat
? target.path
: (0, core_1.join)(target.path, target.name);
return target;
}
function generate(options) {
return (context) => (0, schematics_1.apply)((0, schematics_1.url)((0, core_1.join)('./files', options.language)), [
options.spec
? (0, schematics_1.noop)()
: (0, schematics_1.filter)((path) => {
const languageExtension = options.language || 'ts';
const suffix = `.__specFileSuffix__.${languageExtension}`;
return !path.endsWith(suffix);
}),
(0, schematics_1.template)({
...core_1.strings,
...options,
}),
(0, schematics_1.move)(options.path),
])(context);
}
function addDeclarationToModule(options) {
return (tree) => {
if (options.skipImport !== undefined && options.skipImport) {
return tree;
}
options.module = new module_finder_1.ModuleFinder(tree).find({
name: options.name,
path: options.path,
});
if (!options.module) {
return tree;
}
const content = tree.read(options.module).toString();
const declarator = new module_declarator_1.ModuleDeclarator();
tree.overwrite(options.module, declarator.declare(content, options));
return tree;
};
}

View File

@@ -0,0 +1,50 @@
{
"$schema": "http://json-schema.org/schema",
"$id": "SchematicsNestProvider",
"title": "Nest Provider Options Schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the provider.",
"$default": {
"$source": "argv",
"index": 0
},
"x-prompt": "What name would you like to use for the provider?"
},
"path": {
"type": "string",
"format": "path",
"description": "The path to create the provider."
},
"language": {
"type": "string",
"description": "Nest provider language (ts/js)."
},
"sourceRoot": {
"type": "string",
"description": "Nest provider source root directory."
},
"flat": {
"type": "boolean",
"default": true,
"description": "Flag to indicate if a directory is created."
},
"spec": {
"type": "boolean",
"default": true,
"description": "Specifies if a spec file is generated."
},
"specFileSuffix": {
"type": "string",
"default": "spec",
"description": "Specifies the file suffix of spec files."
},
"className": {
"type": "string",
"description": "Class name to be used internally."
}
},
"required": ["name"]
}