Layout Design
@ -1,4 +1,5 @@
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using AppLibs.Libs;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using TWA_App.Models;
|
using TWA_App.Models;
|
||||||
|
|
||||||
@ -12,10 +13,10 @@ namespace TWA_App.Controllers
|
|||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
[PageInfor("1000", "Home")]
|
||||||
public IActionResult Index()
|
public async Task<IActionResult> Index()
|
||||||
{
|
{
|
||||||
return View();
|
return await this.ViewAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IActionResult Privacy()
|
public IActionResult Privacy()
|
||||||
|
|||||||
187
TWA-App/Json/navlist.json
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "1000",
|
||||||
|
"name": "Home",
|
||||||
|
"icon": "home",
|
||||||
|
"group": 0,
|
||||||
|
"url": "/",
|
||||||
|
"sub-item": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2000",
|
||||||
|
"name": "Company",
|
||||||
|
"icon": "",
|
||||||
|
"group": 0,
|
||||||
|
"url": "",
|
||||||
|
"sub-item": [
|
||||||
|
{
|
||||||
|
"id": "2001",
|
||||||
|
"name": "About Us",
|
||||||
|
"url": "/Company/AboutUs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2002",
|
||||||
|
"name": "Our Team",
|
||||||
|
"url": "/Company/OurTeam"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2003",
|
||||||
|
"name": "Mission & Vision",
|
||||||
|
"url": "/Company/Mission-Vision"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2004",
|
||||||
|
"name": "Milestone",
|
||||||
|
"url": "/Company/Milestone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2005",
|
||||||
|
"name": "Careers",
|
||||||
|
"url": "/Company/Careers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2006",
|
||||||
|
"name": "Partners",
|
||||||
|
"url": "/Company/Partners"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3000",
|
||||||
|
"name": "Services",
|
||||||
|
"icon": "",
|
||||||
|
"group": 0,
|
||||||
|
"url": "",
|
||||||
|
"sub-item": [
|
||||||
|
{
|
||||||
|
"name": "Air Cargo",
|
||||||
|
"group": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3001",
|
||||||
|
"name": "Air Freigth",
|
||||||
|
"url": "/GlyphFonts/Icons"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3002",
|
||||||
|
"name": "Air Forwarder",
|
||||||
|
"url": "/GlyphFonts/Glyps"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3003",
|
||||||
|
"name": "Cargo Tracking",
|
||||||
|
"url": "/GlyphFonts/Glyps"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3004",
|
||||||
|
"name": "Groupage",
|
||||||
|
"url": "/GlyphFonts/Glyps"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3004",
|
||||||
|
"name": "Special Cargo Handling",
|
||||||
|
"url": "/GlyphFonts/Glyps"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Air Passenger",
|
||||||
|
"group": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3005",
|
||||||
|
"name": "Ticketing & Reservation",
|
||||||
|
"url": "/GlyphFonts/Glyps"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3006",
|
||||||
|
"name": "Check-in Services",
|
||||||
|
"url": "/GlyphFonts/Glyps"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3007",
|
||||||
|
"name": "Baggage Handling",
|
||||||
|
"url": "/GlyphFonts/Glyps"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3008",
|
||||||
|
"name": "Customer Service & Support",
|
||||||
|
"url": "/GlyphFonts/Glyps"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Warehouse",
|
||||||
|
"group": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3009",
|
||||||
|
"name": "Contract Logistics",
|
||||||
|
"url": "/GlyphFonts/Glyps"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3010",
|
||||||
|
"name": "Value Added Services",
|
||||||
|
"url": "/GlyphFonts/Glyps"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3011",
|
||||||
|
"name": "Warehouse Logistics",
|
||||||
|
"url": "/GlyphFonts/Glyps"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3010",
|
||||||
|
"name": "Consultancy",
|
||||||
|
"url": "/GlyphFonts/Glyps"
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4000",
|
||||||
|
"name": "News & Events",
|
||||||
|
"icon": "",
|
||||||
|
"group": 0,
|
||||||
|
"url": "",
|
||||||
|
"sub-item": [
|
||||||
|
{
|
||||||
|
"id": "4001",
|
||||||
|
"name": "Vectors",
|
||||||
|
"flexpage": true,
|
||||||
|
"url": "/Images/Vectors"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "4002",
|
||||||
|
"name": "Ảnh Chụp",
|
||||||
|
"flexpage": true,
|
||||||
|
"url": "/Images/Photos"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "5000",
|
||||||
|
"name": "Resources",
|
||||||
|
"icon": "",
|
||||||
|
"group": 0,
|
||||||
|
"url": "",
|
||||||
|
"sub-item": [
|
||||||
|
{
|
||||||
|
"id": "5001",
|
||||||
|
"name": "Vectors",
|
||||||
|
"flexpage": true,
|
||||||
|
"url": "/Images/Vectors"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "5002",
|
||||||
|
"name": "Ảnh Chụp",
|
||||||
|
"flexpage": true,
|
||||||
|
"url": "/Images/Photos"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "6000",
|
||||||
|
"name": "Contact",
|
||||||
|
"icon": "",
|
||||||
|
"group": 0,
|
||||||
|
"url": "",
|
||||||
|
"sub-item": ""
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
@ -1,7 +1,10 @@
|
|||||||
|
using AppLibs.Libs;
|
||||||
|
|
||||||
|
await WSNavigation.LoadJson();
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
// Add services to the container.
|
// Add services to the container.
|
||||||
builder.Services.AddControllersWithViews();
|
builder.Services.AddControllersWithViews().AddRazorRuntimeCompilation();
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
|
|||||||
@ -7,4 +7,15 @@
|
|||||||
<RootNamespace>TWA_App</RootNamespace>
|
<RootNamespace>TWA_App</RootNamespace>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="9.0.7" />
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="AppLibs">
|
||||||
|
<HintPath>..\..\..\..\OneDrive - ATG SERVICES AND TRADING CORPORATION\My Documents\Project\MikaltoResort\AppLibs\AppLibs\bin\Release\net8.0\AppLibs.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@ -1,8 +1,164 @@
|
|||||||
@{
|
<div class="cfull">
|
||||||
ViewData["Title"] = "Home Page";
|
<div class="rSlider">
|
||||||
}
|
<div class="swiper mainSlider">
|
||||||
|
<div class="swiper-wrapper">
|
||||||
<div class="text-center">
|
<div class="swiper-slide">
|
||||||
<h1 class="display-4">Welcome</h1>
|
<div class="background" style="background-image: url(@Url.AbsoluteContent("~/images/banner/low-angle-view-cloudscape-against-sky-sunset.jpg"));">
|
||||||
<p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="con_slider">
|
||||||
|
<div class="h-100 d-f a-i-center">
|
||||||
|
<div class="cfull">
|
||||||
|
<div class="r-n-g d-f f-c a-i-center banner-content">
|
||||||
|
<h1>Air Freight</h1>
|
||||||
|
<div class="sec-header">
|
||||||
|
<h2>Global air, local care</h2>
|
||||||
|
</div>
|
||||||
|
<span class="desc">
|
||||||
|
Your cargo, delivered anywhere in the world with confidence, care, and the reliability you can trust
|
||||||
|
</span>
|
||||||
|
<div class="d-f mt-5">
|
||||||
|
<div class="sec-1">
|
||||||
|
<button class="btn btn-second">See Details</button>
|
||||||
|
</div>
|
||||||
|
<div class="sec-2 ml-2">
|
||||||
|
<button class="btn btn-primary">Quote for Air Freight</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="swiper-slide">
|
||||||
|
<div class="background">
|
||||||
|
<img src="/images/banner/b3.jpg">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="swiper-slide">
|
||||||
|
<div class="background">
|
||||||
|
<img src="/images/banner/b2.jpg">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="swiper-button-next"></div>
|
||||||
|
<div class="swiper-button-prev"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<div class="con">
|
||||||
|
<div class="r">
|
||||||
|
<div class="con-feature r-n-g">
|
||||||
|
<div class="c-12 c-s-6 c-m-4">
|
||||||
|
<div class="flex-feature d-f f-c a-i-center">
|
||||||
|
<i class="atg a-8x atg-trusted"></i>
|
||||||
|
<h3>
|
||||||
|
Trusted Air Partner
|
||||||
|
</h3>
|
||||||
|
<p>Safe, reliable air cargo booking and shipping, ensuring secure, timely, and cost-effective delivery</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="c-12 c-s-6 c-m-4">
|
||||||
|
<div class="flex-feature d-f f-c a-i-center">
|
||||||
|
<i class="atg a-8x atg-air-cargo"></i>
|
||||||
|
<h3>
|
||||||
|
Professional Booking & Live Tracking
|
||||||
|
</h3>
|
||||||
|
<p>Dedicated teams provide efficient cargo booking and shipping with real-time shipment tracking</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="c-12 c-s-6 c-m-4">
|
||||||
|
<div class="flex-feature d-f f-c a-i-center">
|
||||||
|
<i class="atg a-8x atg-support"></i>
|
||||||
|
<h3>Dedicated Customer Care</h3>
|
||||||
|
<p>Committed to transparent, devoted service and full support for all customer needs in cargo and passenger transportation</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Hero Section -->
|
||||||
|
<section class="pt-5 pb-5">
|
||||||
|
<div class="con">
|
||||||
|
<div class="r j-c-center">
|
||||||
|
<div class="c-12 c-m-10 text-center">
|
||||||
|
<h1 class="mb-3">Welcome to Aviationaly</h1>
|
||||||
|
<p class="mb-4">Start your aviation journey with professional instructors and top-notch facilities.</p>
|
||||||
|
<button class="p-2 bg-white">Get Started</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Features Section -->
|
||||||
|
<!-- Courses Section -->
|
||||||
|
<section class="pt-5 pb-5">
|
||||||
|
<div class="con">
|
||||||
|
<div class="r j-c-center">
|
||||||
|
<div class="c-12 text-center">
|
||||||
|
<h2 class="mb-3">Our Programs</h2>
|
||||||
|
</div>
|
||||||
|
<div class="r gap-3">
|
||||||
|
<div class="c-12 c-s-6 c-m-4 text-center">
|
||||||
|
<h4 class="mb-1">Private Pilot License</h4>
|
||||||
|
<p>Learn the fundamentals of flying and become a licensed pilot.</p>
|
||||||
|
</div>
|
||||||
|
<div class="c-12 c-s-6 c-m-4 text-center">
|
||||||
|
<h4 class="mb-1">Commercial Pilot License</h4>
|
||||||
|
<p>Advance your skills and prepare for a professional aviation career.</p>
|
||||||
|
</div>
|
||||||
|
<div class="c-12 c-s-6 c-m-4 text-center">
|
||||||
|
<h4 class="mb-1">Flight Instructor Course</h4>
|
||||||
|
<p>Teach others how to fly and build flight hours simultaneously.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Testimonials Section -->
|
||||||
|
<section class="pt-5 pb-5 bg-white">
|
||||||
|
<div class="con">
|
||||||
|
<div class="r j-c-center">
|
||||||
|
<div class="c-12 text-center">
|
||||||
|
<h2 class="mb-3">What Students Say</h2>
|
||||||
|
</div>
|
||||||
|
<div class="r gap-3">
|
||||||
|
<div class="c-12 c-s-6 c-m-6">
|
||||||
|
<p class="mb-1">"Great instructors and hands-on training. I got my PPL in no time!"</p>
|
||||||
|
<strong>- Alex T.</strong>
|
||||||
|
</div>
|
||||||
|
<div class="c-12 c-s-6 c-m-6">
|
||||||
|
<p class="mb-1">"Modern facilities and friendly staff. Highly recommended!"</p>
|
||||||
|
<strong>- Maria L.</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Contact Section -->
|
||||||
|
<section class="pt-5 pb-5">
|
||||||
|
<div class="con">
|
||||||
|
<div class="r j-c-center">
|
||||||
|
<div class="c-12 c-s-10 c-m-6">
|
||||||
|
<h2 class="mb-3 text-center">Contact Us</h2>
|
||||||
|
<form class="d-f f-c gap-2">
|
||||||
|
<input type="text" placeholder="Name" class="p-2">
|
||||||
|
<input type="email" placeholder="Email" class="p-2">
|
||||||
|
<textarea rows="4" placeholder="Message" class="p-2"></textarea>
|
||||||
|
<button class="p-2 bg-white">Send Message</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<!-- Footer -->
|
||||||
|
@section jsLib {
|
||||||
|
<script src="@Url.AbsoluteContent("~/js/ext_libs/swiper-bundle.min.js")" js-lib></script>
|
||||||
|
<script type="module" src="@Url.AbsoluteContent("~/js/js-page/1000.js")" js-lib></script>
|
||||||
|
}
|
||||||
3
TWA-App/Views/Partial/Footer.cshtml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<div class="con">
|
||||||
|
<p class="m-0">© 2025 Aviationaly. All rights reserved.</p>
|
||||||
|
</div>
|
||||||
31
TWA-App/Views/Partial/Header.cshtml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<div class="con hblock1">
|
||||||
|
<div class="r j-c-between a-i-center">
|
||||||
|
<div class="c-6 mt-2 mb-3">
|
||||||
|
<img src="~/images/logo/slogo.png" style="height:50px">
|
||||||
|
</div>
|
||||||
|
<div class="righ-bar d-f a-i-center">
|
||||||
|
<div class="d-s-b" data-dropdown>
|
||||||
|
<a href="javascript:void(0)" class="d-f a-i-center langnav"><span class="atg atg-world a-2x mr-1"></span> English <i class="atg a-s8x a-down-thick ml-2"></i></a>
|
||||||
|
<div class="sub-item">
|
||||||
|
<div class="nav-i"><a href="#" class="nav-link"><span>Vietnam</span></a></div>
|
||||||
|
<div class="nav-i"><a href="#" class="nav-link"><span>Cambodia</span></a></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="btn btn-signin ml-4">Sign in</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="con hblock2">
|
||||||
|
<div class="r j-c-between a-i-center">
|
||||||
|
<div class="d-f d-l-n f-c ico-menu">
|
||||||
|
<div><span style="width:100%"></span></div>
|
||||||
|
<div><span style="width:100%"></span></div>
|
||||||
|
<div><span style="width:100%"></span></div>
|
||||||
|
</div>
|
||||||
|
<nav class="d-n d-l-f c-l-11 navmain">
|
||||||
|
@await Html.PartialAsync("~/Views/Partial/MenuAP.cshtml")
|
||||||
|
</nav>
|
||||||
|
<a href="#"><span class="atg atg-search a-2x mb-1"></span></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
72
TWA-App/Views/Partial/MenuAP.cshtml
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
@using AppLibs.Libs
|
||||||
|
@{
|
||||||
|
List<NavItem> t = await WSNavigation.GetListMenu();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@foreach (var i in t)
|
||||||
|
{
|
||||||
|
if (i.SubItem == null)
|
||||||
|
{
|
||||||
|
<div class="nav-i">
|
||||||
|
<a href="@i.Url" @Html.Raw(i.IsFlexPage) nav-id ="@i.ID" class="nav-item">@i.Name</a>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<div class="nav-i has-sub" data-dropdown>
|
||||||
|
<a href="javascript:void(0)" nav-id="@i.ID" class="nav-item">@i.Name<i class="atg a-s6x a-down-thick mt-1 ml-2"></i></a>
|
||||||
|
@switch (i.ID)
|
||||||
|
{
|
||||||
|
case "3000":
|
||||||
|
<div class="sub-item sub-nav-full">
|
||||||
|
<div class="cfull">
|
||||||
|
<div class="r-n-g">
|
||||||
|
@{
|
||||||
|
string s = "";
|
||||||
|
string groupHtml = "";
|
||||||
|
string list = "";
|
||||||
|
foreach (var j in i.SubItem)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (j.IsGroup)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (groupHtml.Length > 0)
|
||||||
|
{
|
||||||
|
s += String.Format(groupHtml, list);
|
||||||
|
list = "";
|
||||||
|
}
|
||||||
|
groupHtml = $"<div class=\"c-l-4 c-x-3\"><div class=\"nav-col d-f f-c\"><h3 class=\"title\">{j.Name}</h3>{{0}}</div></div>";
|
||||||
|
}else{
|
||||||
|
list += $"<div class=\"nav-i\"><a href=\"{j.Url}\" {j.ToFlexPageAttribute()} nav-id=\"{j.ID}\" class=\"nav-link\"><span>{j.Name}</span></a></div>";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (groupHtml.Length > 0)
|
||||||
|
{
|
||||||
|
s += String.Format(groupHtml, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@Html.Raw(s)
|
||||||
|
<div class="d-n d-x-b c-x-3">
|
||||||
|
<img class="w-100" src="~/images/layout/air.png" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
<div class="sub-item">
|
||||||
|
@foreach (var j in i.SubItem)
|
||||||
|
{
|
||||||
|
<div class="nav-i"><a href="@j.Url" @j.ToFlexPageAttribute() nav-id="@j.ID" class="nav-link"><span>@j.Name</span></a></div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,25 +0,0 @@
|
|||||||
@model ErrorViewModel
|
|
||||||
@{
|
|
||||||
ViewData["Title"] = "Error";
|
|
||||||
}
|
|
||||||
|
|
||||||
<h1 class="text-danger">Error.</h1>
|
|
||||||
<h2 class="text-danger">An error occurred while processing your request.</h2>
|
|
||||||
|
|
||||||
@if (Model.ShowRequestId)
|
|
||||||
{
|
|
||||||
<p>
|
|
||||||
<strong>Request ID:</strong> <code>@Model.RequestId</code>
|
|
||||||
</p>
|
|
||||||
}
|
|
||||||
|
|
||||||
<h3>Development Mode</h3>
|
|
||||||
<p>
|
|
||||||
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
|
|
||||||
It can result in displaying sensitive information from exceptions to end users.
|
|
||||||
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
|
|
||||||
and restarting the app.
|
|
||||||
</p>
|
|
||||||
@ -1,130 +1,66 @@
|
|||||||
<!doctype html>
|
@{
|
||||||
|
IgnoreSection("jsLib");
|
||||||
|
IgnoreSection("jsPage");
|
||||||
|
IgnoreBody();
|
||||||
|
}
|
||||||
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
|
||||||
<title>Aviationaly - Aviation & Flight School</title>
|
<meta name="idPage" content="@ViewData["PageID"]" pageName="Trans World Aviation" layName="@ViewData["LayoutName"]" flexPage="@ViewData["FlexPage"]" />
|
||||||
<link rel="stylesheet" href="~/css/atg-lib/atg-core.css">
|
<title></title>
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="@Url.AbsoluteContent("~/images/logo/icon.png")">
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet" />
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Mulish:ital,wght@0,200..1000;1,200..1000&display=swap" rel="stylesheet" />
|
||||||
|
<link rel="stylesheet" href="~/css/atg-lib/atg-core.css" />
|
||||||
|
<link rel="stylesheet" href="~/css/atg-lib/swiper-bundle.min.css" />
|
||||||
|
<link rel="stylesheet" href="~/css/site.css" />
|
||||||
|
<link rel="stylesheet" href="~/css/atg-font/atg-admin-font.css" />
|
||||||
</head>
|
</head>
|
||||||
<body class="bg-white">
|
<body>
|
||||||
<!-- Header -->
|
<section data-scrollbar class="main-scrollbar">
|
||||||
<header class="p-3 bg-white">
|
<div class="loading"></div>
|
||||||
<div class="con">
|
<div class="main-wrapper" app-content>
|
||||||
<div class="r j-c-between a-i-center">
|
<header id="header"></header>
|
||||||
<div class="c-6">
|
<div class="main-container">
|
||||||
<img src="aviationkit/wp-content/uploads/sites/106/2022/09/aviationaly-logo-1.png" alt="Logo" style="height:50px">
|
<main main-content>
|
||||||
</div>
|
|
||||||
<nav class="c-6 d-f j-c-end gap-3">
|
|
||||||
<a href="#">Home</a>
|
|
||||||
<a href="#">Courses</a>
|
|
||||||
<a href="#">About</a>
|
|
||||||
<a href="#">Contact</a>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<!-- Hero Section -->
|
</main>
|
||||||
<section class="pt-5 pb-5">
|
|
||||||
<div class="con">
|
|
||||||
<div class="r j-c-center">
|
|
||||||
<div class="c-12 c-m-10 text-center">
|
|
||||||
<h1 class="mb-3">Welcome to Aviationaly</h1>
|
|
||||||
<p class="mb-4">Start your aviation journey with professional instructors and top-notch facilities.</p>
|
|
||||||
<button class="p-2 bg-white">Get Started</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<footer id="footer">
|
||||||
</section>
|
|
||||||
|
|
||||||
<!-- Features Section -->
|
|
||||||
<section class="pt-5 pb-5 bg-white">
|
|
||||||
<div class="con">
|
|
||||||
<div class="r gap-3">
|
|
||||||
<div class="c-12 c-s-6 c-m-4 text-center">
|
|
||||||
<h3 class="mb-2">Modern Fleet</h3>
|
|
||||||
<p>Train with the latest aircraft models and technologies.</p>
|
|
||||||
</div>
|
|
||||||
<div class="c-12 c-s-6 c-m-4 text-center">
|
|
||||||
<h3 class="mb-2">Certified Instructors</h3>
|
|
||||||
<p>Learn from aviation experts with years of experience.</p>
|
|
||||||
</div>
|
|
||||||
<div class="c-12 c-s-6 c-m-4 text-center">
|
|
||||||
<h3 class="mb-2">Flexible Scheduling</h3>
|
|
||||||
<p>Choose courses that fit your lifestyle and availability.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<!-- Courses Section -->
|
|
||||||
<section class="pt-5 pb-5">
|
|
||||||
<div class="con">
|
|
||||||
<div class="r j-c-center">
|
|
||||||
<div class="c-12 text-center">
|
|
||||||
<h2 class="mb-3">Our Programs</h2>
|
|
||||||
</div>
|
|
||||||
<div class="r gap-3">
|
|
||||||
<div class="c-12 c-s-6 c-m-4 text-center">
|
|
||||||
<h4 class="mb-1">Private Pilot License</h4>
|
|
||||||
<p>Learn the fundamentals of flying and become a licensed pilot.</p>
|
|
||||||
</div>
|
|
||||||
<div class="c-12 c-s-6 c-m-4 text-center">
|
|
||||||
<h4 class="mb-1">Commercial Pilot License</h4>
|
|
||||||
<p>Advance your skills and prepare for a professional aviation career.</p>
|
|
||||||
</div>
|
|
||||||
<div class="c-12 c-s-6 c-m-4 text-center">
|
|
||||||
<h4 class="mb-1">Flight Instructor Course</h4>
|
|
||||||
<p>Teach others how to fly and build flight hours simultaneously.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<!-- Testimonials Section -->
|
|
||||||
<section class="pt-5 pb-5 bg-white">
|
|
||||||
<div class="con">
|
|
||||||
<div class="r j-c-center">
|
|
||||||
<div class="c-12 text-center">
|
|
||||||
<h2 class="mb-3">What Students Say</h2>
|
|
||||||
</div>
|
|
||||||
<div class="r gap-3">
|
|
||||||
<div class="c-12 c-s-6 c-m-6">
|
|
||||||
<p class="mb-1">"Great instructors and hands-on training. I got my PPL in no time!"</p>
|
|
||||||
<strong>- Alex T.</strong>
|
|
||||||
</div>
|
|
||||||
<div class="c-12 c-s-6 c-m-6">
|
|
||||||
<p class="mb-1">"Modern facilities and friendly staff. Highly recommended!"</p>
|
|
||||||
<strong>- Maria L.</strong>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<!-- Contact Section -->
|
|
||||||
<section class="pt-5 pb-5">
|
|
||||||
<div class="con">
|
|
||||||
<div class="r j-c-center">
|
|
||||||
<div class="c-12 c-s-10 c-m-6">
|
|
||||||
<h2 class="mb-3 text-center">Contact Us</h2>
|
|
||||||
<form class="d-f f-c gap-2">
|
|
||||||
<input type="text" placeholder="Name" class="p-2">
|
|
||||||
<input type="email" placeholder="Email" class="p-2">
|
|
||||||
<textarea rows="4" placeholder="Message" class="p-2"></textarea>
|
|
||||||
<button class="p-2 bg-white">Send Message</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
@RenderBody()
|
|
||||||
<!-- Footer -->
|
|
||||||
<footer class="p-3 bg-white text-center">
|
|
||||||
<div class="con">
|
|
||||||
<p class="m-0">© 2025 Aviationaly. All rights reserved.</p>
|
|
||||||
</div>
|
|
||||||
</footer>
|
</footer>
|
||||||
|
</section>
|
||||||
|
<script src="@Url.AbsoluteContent("~/js/libs/js-core.js")"></script>
|
||||||
|
<section app-js-lib>
|
||||||
|
<script src="@Url.AbsoluteContent("~/js/ext_libs/js-scrollbar.js")" js-lib></script>
|
||||||
|
<script src="@Url.AbsoluteContent("~/js/libs/js-waves.js")" js-lib></script>
|
||||||
|
</section>
|
||||||
|
<section app-js-page>
|
||||||
|
</section>
|
||||||
|
<script>
|
||||||
|
window.requestTimeout(() => {
|
||||||
|
window.app = new AApp('[app-content] > .main-container');
|
||||||
|
(function () {
|
||||||
|
var asyncStyleSheets = [
|
||||||
|
'@Url.AbsoluteContent("~/css/atg-lib/atg-core.css")',
|
||||||
|
'@Url.AbsoluteContent("~/css/site.css")'
|
||||||
|
];
|
||||||
|
window.app.loadCSS(asyncStyleSheets);
|
||||||
|
})();
|
||||||
|
(function () {
|
||||||
|
window.app.render();
|
||||||
|
window.app.initScrollBar();
|
||||||
|
|
||||||
|
var asyncStyleSheets = [
|
||||||
|
'https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap',
|
||||||
|
'/css/atg-font/atg-admin-font.css',
|
||||||
|
'/css/atg-lib/waves.min.css'
|
||||||
|
];
|
||||||
|
window.app.loadCSS(asyncStyleSheets);
|
||||||
|
})();
|
||||||
|
}, 5, window.registerCancel);
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
12
TWA-App/Views/Shared/_LayoutAsync.cshtml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<div id="header">
|
||||||
|
@await Html.PartialAsync("~/Views/Partial/Header.cshtml")
|
||||||
|
</div>
|
||||||
|
<div id="section1">
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
@await Html.PartialAsync("~/Views/Partial/Footer.cshtml")
|
||||||
|
</div>
|
||||||
|
@section jsLib {
|
||||||
|
<script type="module" src="@Url.AbsoluteContent("~/js/js-page/asyncLayout.js")" js-lib></script>
|
||||||
|
|
||||||
|
}
|
||||||
5
TWA-App/Views/Shared/_PartialScript.cshtml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
@RenderSection("jsLib", required: false)
|
||||||
|
@RenderSection("jsPage", required: false)
|
||||||
|
@{
|
||||||
|
IgnoreBody();
|
||||||
|
}
|
||||||
@ -1,2 +0,0 @@
|
|||||||
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
|
|
||||||
<script src="~/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script>
|
|
||||||
@ -1,3 +1,4 @@
|
|||||||
@using TWA_App
|
@using TWA_App
|
||||||
@using TWA_App.Models
|
@using TWA_App.Models
|
||||||
|
@using AppLibs.Libs;
|
||||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
|
|||||||
@ -1,3 +1,11 @@
|
|||||||
@{
|
@{
|
||||||
|
switch (ViewData["Layout"])
|
||||||
|
{
|
||||||
|
case "SectionScript":
|
||||||
|
Layout = "_PartialScript";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
Layout = "_Layout";
|
Layout = "_Layout";
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.atg {
|
.atg {
|
||||||
|
line-height: 1;
|
||||||
|
display: flex;
|
||||||
|
align-items:center;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-family: atg-admin-font;
|
font-family: atg-admin-font;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
@ -15,7 +18,12 @@
|
|||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
.a-s6x{
|
||||||
|
font-size: .55em
|
||||||
|
}
|
||||||
|
.a-s8x{
|
||||||
|
font-size: .8em
|
||||||
|
}
|
||||||
.a-1x {
|
.a-1x {
|
||||||
font-size: 1em
|
font-size: 1em
|
||||||
}
|
}
|
||||||
@ -298,3 +306,17 @@
|
|||||||
.atg-filters-light:before {
|
.atg-filters-light:before {
|
||||||
content: "\a03E"
|
content: "\a03E"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.atg-world:before {
|
||||||
|
content: "\a028"
|
||||||
|
}
|
||||||
|
.atg-trusted:before {
|
||||||
|
content: '\a03f'
|
||||||
|
}
|
||||||
|
|
||||||
|
.atg-air-cargo:before {
|
||||||
|
content: '\a040'
|
||||||
|
}
|
||||||
|
.atg-support:before {
|
||||||
|
content: '\a041'
|
||||||
|
}
|
||||||
@ -193,3 +193,4 @@
|
|||||||
.a-bag:before {
|
.a-bag:before {
|
||||||
content: '\f0028'
|
content: '\f0028'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 5.3 KiB |
BIN
TWA-App/wwwroot/images/1000/cargo.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
TWA-App/wwwroot/images/1000/pax.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 230 KiB |
BIN
TWA-App/wwwroot/images/layout/air.png
Normal file
|
After Width: | Height: | Size: 347 KiB |
|
Before Width: | Height: | Size: 684 B After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 31 KiB |
BIN
TWA-App/wwwroot/images/logo/slogo.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 11 KiB |
@ -1,9 +1,47 @@
|
|||||||
import AGrid from '/js/libs/js-AGrid.js'
|
|
||||||
|
function isInViewport(element) {
|
||||||
|
const rect = element.getBoundingClientRect();
|
||||||
|
return (
|
||||||
|
rect.top < window.innerHeight &&
|
||||||
|
rect.bottom > 0 &&
|
||||||
|
rect.left < window.innerWidth &&
|
||||||
|
rect.right > 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
function updateActiveSlideShow(swiperInstance) {
|
||||||
|
swiperInstance.slides.forEach(slide => slide.classList.remove('show'));
|
||||||
|
|
||||||
|
const activeSlide = swiperInstance.slides[swiperInstance.activeIndex];
|
||||||
|
if (isInViewport(activeSlide)) {
|
||||||
|
activeSlide.classList.add('show');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
window.L1000 = function () {
|
window.L1000 = function () {
|
||||||
|
const swiper = new Swiper('.mainSlider', {
|
||||||
|
loop: true,
|
||||||
|
on: {
|
||||||
|
slideChangeTransitionEnd: function () {
|
||||||
|
updateActiveSlideShow(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
document.addEventListener('visibilitychange', function () {
|
||||||
|
if (document.visibilityState === 'hidden') {
|
||||||
|
// Remove class show khỏi tất cả các slide
|
||||||
|
swiper.slides.forEach(slide => slide.classList.remove('show'));
|
||||||
|
}
|
||||||
|
|
||||||
var a = new AGrid({ "element": ".GridGraphics" });
|
if (document.visibilityState === 'visible') {
|
||||||
|
// Add class show lại cho slide đang active
|
||||||
var a1 = new AGrid({ "element": ".AGrid-WaterFall", "gridType": "waterfall" })
|
const activeSlide = swiper.slides[swiper.activeIndex];
|
||||||
|
if (activeSlide) {
|
||||||
|
// Delay một chút để CSS animation có thời gian reset
|
||||||
|
window.requestTimeout(() => {
|
||||||
|
activeSlide.classList.add('show');
|
||||||
|
}, 50); // delay nhẹ để đảm bảo browser detect lại class
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
window.AScript.set("1000", true);
|
window.AScript.set("1000", true);
|
||||||
@ -1,16 +1,16 @@
|
|||||||
import AMenu from '/js/libs/js-AMenu.js'
|
import AMenu from '/js/libs/js-AMenu.js'
|
||||||
import ALayout from '/js/libs/js-ALayout.js'
|
import ALayout from '/js/libs/js-ALayout.js'
|
||||||
|
import ADropDown from '/js/libs/js-ADropDown.js'
|
||||||
|
|
||||||
var asyncStyleSheets = [
|
//var asyncStyleSheets = [
|
||||||
'https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap',
|
// 'https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap',
|
||||||
'/css/atg-font/atg-admin-font.css'
|
// '/css/atg-font/atg-admin-font.css'
|
||||||
];
|
//];
|
||||||
window.app.loadCSS(asyncStyleSheets);
|
//window.app.loadCSS(asyncStyleSheets);
|
||||||
|
|
||||||
class AsyncLayout extends ALayout {
|
class AsyncLayout extends ALayout {
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
this.isLoaded = false;
|
|
||||||
this.layMNav = `<div class="m-header">
|
this.layMNav = `<div class="m-header">
|
||||||
<a app-nav href="${window.GetAbsoluteURL("/")}" class="c_logo d-f a-i-center c-a">
|
<a app-nav href="${window.GetAbsoluteURL("/")}" class="c_logo d-f a-i-center c-a">
|
||||||
<img src="/images/logo/logo.jpg" />
|
<img src="/images/logo/logo.jpg" />
|
||||||
@ -21,45 +21,19 @@ class AsyncLayout extends ALayout {
|
|||||||
</a>
|
</a>
|
||||||
<div class="nav-mainmenu d-f f-c">
|
<div class="nav-mainmenu d-f f-c">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>`;
|
|
||||||
this.fHeader = `<div id="fHeader" class="f-header">
|
|
||||||
<div class="cfull">
|
|
||||||
<div class="r d-f a-i-center c_second_header">
|
|
||||||
<a app-nav href="${window.GetAbsoluteURL("/")}" class="c_logo d-f a-i-center c-a">
|
|
||||||
<img src="/images/logo/logo.jpg" />
|
|
||||||
<span class="d-f no-wrap ml-2"><b class="lg">VIN</b> <b class="lg lg1">FONT</b></span>
|
|
||||||
</a>
|
|
||||||
<div class="ml-auto nav-mainmenu d-x-f d-n">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="ml-auto d-f d-x-n a-i-center">
|
|
||||||
<a class="d-f nav-login mr-0"><i class="atg atg-search"></i></a>
|
|
||||||
<a app-nav href="${window.GetAbsoluteURL("/Login")}" class="d-f nav-login"><i class="atg atg-user"></i></a>
|
|
||||||
<div class="m-navbar">
|
|
||||||
<div class="d-f f-c ico-menu p-0">
|
|
||||||
<div><span style="width:100%"></span></div>
|
|
||||||
<div><span style="width:100%"></span></div>
|
|
||||||
<div><span style="width:100%"></span></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>`;
|
</div>`;
|
||||||
}
|
}
|
||||||
_createFHeader() {
|
_createFHeader() {
|
||||||
document.body.insertAdjacentHTML("afterbegin", this.layMNav);
|
document.body.insertAdjacentHTML("afterbegin", this.layMNav);
|
||||||
document.body.insertAdjacentHTML("afterbegin", this.fHeader);
|
//document.body.insertAdjacentHTML("afterbegin", this.fHeader);
|
||||||
var h = document.querySelector("#fHeader .nav-mainmenu");
|
//var h = document.querySelector("#fHeader .nav-mainmenu");
|
||||||
var h2 = document.querySelector(".m-header");
|
//var h2 = document.querySelector(".m-header");
|
||||||
var he2 = h2.querySelector(".nav-mainmenu");
|
//var he2 = h2.querySelector(".nav-mainmenu");
|
||||||
var r = document.querySelector("#header");
|
//var r = document.querySelector("#header");
|
||||||
r.querySelector(".nav-mainmenu").childNodes.forEach(el => {
|
//r.querySelector(".nav-mainmenu").childNodes.forEach(el => {
|
||||||
he2.appendChild(el.cloneNode(true));
|
// he2.appendChild(el.cloneNode(true));
|
||||||
h.appendChild(el.cloneNode(true));
|
// h.appendChild(el.cloneNode(true));
|
||||||
})
|
//})
|
||||||
}
|
}
|
||||||
dispose() {
|
dispose() {
|
||||||
this.isLoaded = false;
|
this.isLoaded = false;
|
||||||
@ -77,38 +51,42 @@ class AsyncLayout extends ALayout {
|
|||||||
renderMenu() {
|
renderMenu() {
|
||||||
this.isLoaded = true;
|
this.isLoaded = true;
|
||||||
this._createFHeader();
|
this._createFHeader();
|
||||||
window.app.initNavs("Async");
|
this.dpLang = new ADropDown();
|
||||||
var hHeader = document.getElementById("header").clientHeight;
|
this.dpLang.bindDropDown(document.querySelector(".langnav"));
|
||||||
var fHeader = document.getElementById("fHeader");
|
this.a1 = new AMenu("#header .navmain", ".m-header", document.querySelectorAll(".ico-menu"), true);
|
||||||
|
|
||||||
if (window.getOS() == "iOS") {
|
// window.app.initNavs("Async");
|
||||||
fHeader.classList.add("ios");
|
// var hHeader = document.getElementById("header").clientHeight;
|
||||||
}
|
// var fHeader = document.getElementById("fHeader");
|
||||||
const idE0 = window.app.on("App_Scrolling", (scrollY) => {
|
|
||||||
if (scrollY > hHeader && !fHeader.classList.contains("show")) {
|
|
||||||
fHeader.classList.add("show");
|
|
||||||
|
|
||||||
}
|
// if (window.getOS() == "iOS") {
|
||||||
if (scrollY < hHeader && fHeader.classList.contains("show")) {
|
// fHeader.classList.add("ios");
|
||||||
fHeader.classList.remove("show");
|
// }
|
||||||
}
|
// const idE0 = window.app.on("App_Scrolling", (scrollY) => {
|
||||||
});
|
// if (scrollY > hHeader && !fHeader.classList.contains("show")) {
|
||||||
this.addCustomEvent(idE0, window.app, "Async");
|
// fHeader.classList.add("show");
|
||||||
var a1 = new AMenu("#header .nav-mainmenu", ".m-header", document.querySelectorAll(".m-navbar > .ico-menu"), true);
|
|
||||||
this.listAObject.add(a1);
|
// }
|
||||||
var a2 = new AMenu("#fHeader .nav-mainmenu", null, null);
|
// if (scrollY < hHeader && fHeader.classList.contains("show")) {
|
||||||
this.listAObject.add(a2);
|
// fHeader.classList.remove("show");
|
||||||
const idE1 = window.app.on("redirect_page", (e) => {
|
// }
|
||||||
a1.changeActive();
|
// });
|
||||||
a2.changeActive();
|
// this.addCustomEvent(idE0, window.app, "Async");
|
||||||
});
|
// var a1 = new AMenu("#header .nav-mainmenu", ".m-header", document.querySelectorAll(".m-navbar > .ico-menu"), true);
|
||||||
this.addCustomEvent(idE1, window.app, "Async");
|
// this.listAObject.add(a1);
|
||||||
const f = function (e) {
|
// var a2 = new AMenu("#fHeader .nav-mainmenu", null, null);
|
||||||
window.app.initNavApp(window.GetAbsoluteURL("/Search"));
|
// this.listAObject.add(a2);
|
||||||
}
|
// const idE1 = window.app.on("redirect_page", (e) => {
|
||||||
const btnMHeader = document.getElementById("btnMHeader");
|
// a1.changeActive();
|
||||||
// btnMHeader.addEventListener(this.eventName, f);
|
// a2.changeActive();
|
||||||
this.addSystemEvent(this.eventName, btnMHeader, f);
|
// });
|
||||||
|
// this.addCustomEvent(idE1, window.app, "Async");
|
||||||
|
// const f = function (e) {
|
||||||
|
// window.app.initNavApp(window.GetAbsoluteURL("/Search"));
|
||||||
|
// }
|
||||||
|
// const btnMHeader = document.getElementById("btnMHeader");
|
||||||
|
//// btnMHeader.addEventListener(this.eventName, f);
|
||||||
|
// this.addSystemEvent(this.eventName, btnMHeader, f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
window.ALayout.set("Async", new AsyncLayout());
|
window.ALayout.set("Async", new AsyncLayout());
|
||||||
|
|||||||
@ -1,128 +0,0 @@
|
|||||||
import AMenu from '/js/libs/js-AMenu.js'
|
|
||||||
import ALayout from '/js/libs/js-ALayout.js'
|
|
||||||
|
|
||||||
|
|
||||||
var asyncStyleSheets = [
|
|
||||||
'https://fonts.googleapis.com/css2?family=Quicksand:wght@300;400;500;600;700&display=swap',
|
|
||||||
'/css/atg-font/atg-admin-font.css'
|
|
||||||
];
|
|
||||||
window.app.loadCSS(asyncStyleSheets);
|
|
||||||
|
|
||||||
window.Load_Menu = function () {
|
|
||||||
|
|
||||||
//var a1 = new AMenu("#header .nav-mainmenu", ".m-header", document.querySelectorAll(".m-navbar > .ico-menu"), true);
|
|
||||||
|
|
||||||
//var a2 = new AMenu("#fHeader .nav-mainmenu", null, null);
|
|
||||||
//console.log(document.getElementById("btnMHeader"));
|
|
||||||
//document.getElementById("btnMHeader").addEventListener("click", (e) => {
|
|
||||||
// window.app.initNavApp(window.GetAbsoluteURL("/Search"));
|
|
||||||
//});
|
|
||||||
|
|
||||||
}
|
|
||||||
class Async1Layout extends ALayout {
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
this.isLoaded = false;
|
|
||||||
this.layMNav = `<div class="m-header">
|
|
||||||
<a app-nav href="${window.GetAbsoluteURL("/")}" class="c_logo d-f a-i-center c-a">
|
|
||||||
<img src="/images/logo/logo.jpg" />
|
|
||||||
<span class="d-f no-wrap ml-2"><b class="lg">VIN</b> <b class="lg lg1">FONT</b></span>
|
|
||||||
<a href="javascript:void(0)" class="hd-close">
|
|
||||||
<i class="atg atg-x"></i>
|
|
||||||
</a>
|
|
||||||
</a>
|
|
||||||
<div class="nav-mainmenu d-f f-c">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>`;
|
|
||||||
this.fHeader = `<div id="fHeader" class="f-header">
|
|
||||||
<div class="cfull">
|
|
||||||
<div class="c_search_header d-f a-i-center j-c-between">
|
|
||||||
<div class="c_filter c-6 c-s-4 c-l-2">
|
|
||||||
<a app-nav href="${window.GetAbsoluteURL("/")}" class="c_logo d-f a-i-center mt-3 mb-3">
|
|
||||||
<img src="/images/logo/logo.jpg" />
|
|
||||||
<span class="d-f no-wrap ml-2"><b class="lg">VIN</b> <b class="lg lg1">FONT</b></span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="c-6 c-s-8 c-l-10">
|
|
||||||
<div class="c_inp_search d-f">
|
|
||||||
<div class="c_cat d-n d-s-b c-s-4 c-m-3 c-x-2 ">
|
|
||||||
<div class="d-f j-c-center a-i-center" data-dropdown>
|
|
||||||
<a href="javascript:void(0)" class="d-f a-o j-c-between a-i-center w-100 pl-3 pr-3">
|
|
||||||
<div class="d-f a-i-center"><i class="atg a-2x atg-all mr-2"></i><span class="d-n d-s-b">Tất cả</span></div>
|
|
||||||
<i class="atg a-1x a-down-thick ml-2"></i>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<input type="text" class="c-12 c-s-8 c-m-9 c-x-10" placeholder="Tìm kiếm hàng triệu font và nội dung thiết kế với chật lượng cao" />
|
|
||||||
<div class="c_btn_search d-f">
|
|
||||||
<a href="javascript:void(0)"><i class="atg a-2x atg-image-upload"></i></a>
|
|
||||||
<a href="javascript:void(0)" class="ml-3 mr-3"><i class="atg a-2x atg-search"></i></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>`;
|
|
||||||
}
|
|
||||||
_createFHeader() {
|
|
||||||
document.body.insertAdjacentHTML("afterbegin", this.layMNav);
|
|
||||||
document.body.insertAdjacentHTML("afterbegin", this.fHeader);
|
|
||||||
var h = document.querySelector("#fHeader .nav-mainmenu");
|
|
||||||
var h2 = document.querySelector(".m-header");
|
|
||||||
var he2 = h2.querySelector(".nav-mainmenu");
|
|
||||||
var r = document.querySelector("#header");
|
|
||||||
}
|
|
||||||
dispose() {
|
|
||||||
this.isLoaded = false;
|
|
||||||
var h = document.getElementById("header");
|
|
||||||
var f = document.getElementById("footer");
|
|
||||||
var h1 = document.getElementById("fHeader");
|
|
||||||
document.querySelector(".m-header").remove();
|
|
||||||
f.removeAll();
|
|
||||||
h.removeAll();
|
|
||||||
h1.remove();
|
|
||||||
window.app.removeSytemEventParent(window.app.lName);
|
|
||||||
window.app.removeCustomEventParent(window.app.lName);
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
renderMenu() {
|
|
||||||
this.isLoaded = true;
|
|
||||||
this._createFHeader();
|
|
||||||
window.app.initNavs("Async1");
|
|
||||||
var hHeader = document.getElementById("header").clientHeight;
|
|
||||||
var fHeader = document.getElementById("fHeader");
|
|
||||||
|
|
||||||
if (window.getOS() == "iOS") {
|
|
||||||
fHeader.classList.add("ios");
|
|
||||||
}
|
|
||||||
window.app.on("App_Scrolling", (scrollY) => {
|
|
||||||
if (scrollY > hHeader && !fHeader.classList.contains("show")) {
|
|
||||||
fHeader.classList.add("show");
|
|
||||||
|
|
||||||
}
|
|
||||||
if (scrollY < hHeader && fHeader.classList.contains("show")) {
|
|
||||||
fHeader.classList.remove("show");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
//this.addCustomEvent(idE0, window.app, "Async1");
|
|
||||||
//var a1 = new AMenu("#header .nav-mainmenu", ".m-header", document.querySelectorAll(".m-navbar > .ico-menu"), true);
|
|
||||||
|
|
||||||
//var a2 = new AMenu("#fHeader .nav-mainmenu", null, null);
|
|
||||||
//const idE1 = window.app.on("redirect_page", (e) => {
|
|
||||||
// a1.changeActive();
|
|
||||||
// a2.changeActive();
|
|
||||||
//});
|
|
||||||
//this.addCustomEvent(idE1, window.app, "Async");
|
|
||||||
//const f = function (e) {
|
|
||||||
// window.app.initNavApp(window.GetAbsoluteURL("/Search"));
|
|
||||||
//}
|
|
||||||
//const btnMHeader = document.getElementById("btnMHeader");
|
|
||||||
//// btnMHeader.addEventListener(this.eventName, f);
|
|
||||||
//this.addSystemEvent(this.eventName, btnMHeader, f);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
window.ALayout.set("Async1", new Async1Layout());
|
|
||||||
window.AScript.set("asyncLayout1", true);
|
|
||||||