Add project files.

This commit is contained in:
2025-05-01 15:18:30 +03:00
parent e058ab8015
commit 774d695414
3094 changed files with 1336814 additions and 0 deletions

View File

@@ -0,0 +1,39 @@
@{
Layout = null;
}
<!DOCTYPE html>
<html lang="en">
@await Component.InvokeAsync("_AdminLayoutHeaderPartialComponent")
<body class="hold-transition sidebar-mini">
<div class="wrapper">
@await Component.InvokeAsync("_AdminLayoutNavbarPartialComponent")
<aside class="main-sidebar sidebar-dark-primary elevation-4">
@await Component.InvokeAsync("_AdminLayoutSidebarPartialComponent")
</aside>
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<div class="content-header">
<div class="container-fluid">
@RenderBody()
<div class="row mb-2">
</div><!-- /.row -->
</div><!-- /.container-fluid -->
</div>
<!-- /.content-header -->
<!-- Main content -->
</div>
<!-- /.content-wrapper -->
<!-- Main Footer -->
<footer class="main-footer">
@await Component.InvokeAsync("_AdminLayoutFooterPartialComponent")
</footer>
</div>
</body>
@await Component.InvokeAsync("_AdminLayoutScriptPartialComponent")
@RenderSection("Scripts", required: false)
</html>

View File

@@ -0,0 +1,67 @@
@model List<ResultCompanyInfoDto>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
int count = 0;
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Başarılarımız İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<table class="table table-head-bg-success table-striped table-hover">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Değer</th>
<th scope="col">Başlık</th>
<th scope="col">Alt Başlık</th>
<th scope="col">İşlemler</th>
</tr>
</thead>
<tbody>
@if (Model == null || !Model.Any())
{
<tr>
<td colspan="3">Kayıt bulunamadı.</td>
</tr>
}
else
{
@foreach (var item in Model)
{
count++;
<tr>
<td>@count</td>
<td>@item.Value</td>
<td>@item.Title</td>
<td>@item.SubTitle</td>
<td>
<a href="/CompanyInfo/UpdateCompanyInfo/@item.CompanyInfoID" class="btn btn-outline-success">Güncelle</a>
</td>
</tr>
}
}
</tbody>
</table>
<a asp-controller="CompanyInfoVideo" asp-action="Index" class="btn btn-success">Tanıtım Videosu Ekle</a>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,53 @@
@model UpdateCompanyInfoDto
@{
ViewData["Title"] = "UpdateCompanyInfo";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Başarılarımız İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form method="post">
<div class="card">
<div class="card-header">
<div class="card-title">Hizmet Güncelleme</div>
</div>
<input type="hidden" asp-for="CompanyInfoID" />
<div class="card-body">
<div class="form-group row">
<label for="Value" class="col-md-2 col-form-label">Değer</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Value" id="Value">
<span asp-validation-for="Value" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Title" class="col-md-2 col-form-label">Başlık</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Title" id="Title">
<span asp-validation-for="Title" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="SubTitle" class="col-md-2 col-form-label">Alt Başlık</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="SubTitle" id="SubTitle">
<span asp-validation-for="SubTitle" class="text-danger"></span>
</div>
</div>
</div>
<div class="card-action">
<button class="btn btn-success">Kaydet</button>
<a href="/CompanyInfo/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,58 @@
@model List<ResultCompanyInfoVideoDto>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Başarılarımız Viedo İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<table class="table table-head-bg-success table-striped table-hover">
<thead>
<tr>
<th scope="col">VideoUrl</th>
<th scope="col">İşlemler</th>
</tr>
</thead>
<tbody>
@if (Model == null || !Model.Any())
{
<tr>
<td colspan="3">Kayıt bulunamadı.</td>
</tr>
}
else
{
@foreach (var item in Model)
{
<tr>
<td>@item.VideoUrl</td>
<td>
<a href="/CompanyInfoVideo/UpdateCompanyInfoVideo/@item.CompanyInfoVideoID" class="btn btn-outline-success">Güncelle</a>
</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,39 @@
@model UpdateCompanyInfoVideoDto
@{
ViewData["Title"] = "UpdateCompanyInfoVideo";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Başarılarımız Viedo İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form method="post">
<div class="card">
<div class="card-header">
<div class="card-title">Hakkımızda Viedo Güncelleme</div>
</div>
<input type="hidden" asp-for="CompanyInfoVideoID" />
<div class="card-body">
<div class="form-group row">
<label for="VideoUrl" class="col-md-2 col-form-label">VideoUrl</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="VideoUrl" id="VideoUrl">
<span asp-validation-for="VideoUrl" class="text-danger"></span>
</div>
</div>
</div>
<div class="card-action">
<button class="btn btn-success">Kaydet</button>
<a href="/CompanyInfoVideo/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,60 @@
@model List<ResultContactUsDto>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
int count = 0;
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">İletişim İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<table class="table table-head-bg-success table-striped table-hover">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Tarih</th>
<th scope="col">Gönderen</th>
<th scope="col">E-Posta</th>
<th scope="col">Telefon</th>
<th scope="col">Mesaj</th>
<th scope="col">Durum</th>
<th scope="col">İşlemler</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
count++;
<tr>
<th>@count</th>
<td>@item.Date</td>
<td>@item.NameSurname</td>
<td>@item.Mail</td>
<td>@item.Phone</td>
<td>@item.MessageContent</td>
<td>
<span class="badge @(item.Status ? "bg-success text-white" : "bg-secondary text-white")">
@(item.Status ? "Okundu" : "Okunmadı")
</span>
</td>
<td>
<a href="/ContactUs/MarkAsRead/@item.ContactusID" class="btn btn-outline-info @(item.Status ? "disabled" : "")">Okundu</a>
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,123 @@
@using ConstructorAppUI.ViewModels
@model DashboardIndexViewModel
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
@section Scripts {
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
<script src="~/lib/microsoft/signalr/dist/browser/signalr.min.js"></script>
<script type="text/javascript">
$(document).ready(() => {
var signalRHubBaseUrl = '@ViewBag.SignalRHubBaseUrl';
var connection = new signalR.HubConnectionBuilder().withUrl(`${signalRHubBaseUrl}/signalrhub`).build();
connection.on("ReceiveContactUsCountAll", (value) => {
$("#receivecontactuscountall").text(value);
});
connection.on("ReceiveProjectCountAll", (value) => {
$("#receiveprojectcountall").text(value);
});
connection.on("ReceiveReferenceCountAll", (value) => {
$("#receivereferencecountall").text(value);
});
connection.on("ReceiveTestimonialCountAll", (value) => {
$("#receivetestimonialcountall").text(value);
});
connection.start().then(() => {
$("#connstatus").text("Bağlı"); // Bağlantı sağlandığında durumu "Connected" olarak ayarla
setInterval(() => {
connection.invoke("SendContactUs").catch((err) => console.error(err));
connection.invoke("SendProject").catch((err) => console.error(err));
connection.invoke("SendReference").catch((err) => console.error(err));
connection.invoke("SendTestimonial").catch((err) => console.error(err));
}, 1000);
}).catch((err) => {
console.error(err);
});
});
</script>
}
<!-- Ionicons -->
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<body class="hold-transition sidebar-mini layout-fixed">
<div class="wrapper">
<!-- Main content -->
<section class="content">
<div class="container-fluid">
<div class="row">
<div class="col-lg-3 col-6">
<!-- small box -->
<div class="small-box bg-info">
<div class="inner">
<h3 id="receivecontactuscountall"><sup style="font-size: 20px"></sup></h3>
<p>İletişim Talepleri</p>
</div>
<div class="icon">
<i class="far fa-envelope"></i>
</div>
<a href="ContactUs/Index/" class="small-box-footer">Daha Fazla <i class="fas fa-arrow-circle-right"></i></a>
</div>
</div>
<div class="col-lg-3 col-6">
<!-- small box -->
<div class="small-box bg-warning">
<div class="inner">
<h3 id="receiveprojectcountall"><sup style="font-size: 20px"></sup></h3>
<p>Gösterimdeki Projeler</p>
</div>
<div class="icon">
<i class="ion ion-person-add"></i>
</div>
<a href="#" class="small-box-footer">Daha Fazla <i class="fas fa-arrow-circle-right"></i></a>
</div>
</div>
<div class="col-lg-3 col-6">
<!-- small box -->
<div class="small-box bg-gradient-indigo">
<div class="inner">
<h3 id="receivereferencecountall"><sup style="font-size: 20px"></sup></h3>
<p>Referanslar</p>
</div>
<div class="icon">
<i class="ion ion-person-add"></i>
</div>
<a href="#" class="small-box-footer">Daha Fazla <i class="fas fa-arrow-circle-right"></i></a>
</div>
</div>
<div class="col-lg-3 col-6">
<!-- small box -->
<div class="small-box bg-success">
<div class="inner">
<h3 id="receivetestimonialcountall"><sup style="font-size: 20px"></sup></h3>
<p>Gelen Youmlar</p>
</div>
<div class="icon">
<i class="ion ion-person-add"></i>
</div>
<a href="#" class="small-box-footer">Daha Fazla <i class="fas fa-arrow-circle-right"></i></a>
</div>
</div>
</div>
</div>
</section>
</div>
</body>

View File

@@ -0,0 +1,72 @@
@model List<ResultFooterDto>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Footer İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<table class="table table-head-bg-success table-striped table-hover">
<thead>
<tr>
<th scope="col">Logo</th>
<th scope="col">Telefon</th>
<th scope="col">E-Posta</th>
<th scope="col">Facebook</th>
<th scope="col">Instagram</th>
<th scope="col">Linkedin</th>
<th scope="col">Youtube</th>
<th scope="col">İşlemler</th>
</tr>
</thead>
<tbody>
@if (Model == null || !Model.Any())
{
<tr>
<td colspan="3">Kayıt bulunamadı.</td>
</tr>
}
else
{
@foreach (var item in Model)
{
<tr>
<td>
<img width="75" height="75" src="@item.LogoUrl" alt="Görsel" />
</td>
<td>@item.Phone</td>
<td>@item.Mail</td>
<td>@item.Facebook</td>
<td>@item.Instagram</td>
<td>@item.Linkedin</td>
<td>@item.Youtube</td>
<td>
<a href="/Footer/UpdateFooter/@item.FooterID" class="btn btn-outline-success">Güncelle</a>
</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,90 @@
@model UpdateFooterDto
@{
ViewData["Title"] = "UpdateFooter";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Footer İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form method="post" enctype="multipart/form-data">
<div class="card">
<div class="card-header">
<div class="card-title">Banner Güncelleme</div>
</div>
<input type="hidden" asp-for="FooterID" />
<div class="card-body">
<!-- Görsel -->
<div class="form-group row">
<label for="ImageFile" class="col-md-2 col-form-label">Logo</label>
<div class="col-md-10">
<input type="file" class="form-control" name="ImageFile" id="ImageFile">
@if (!string.IsNullOrEmpty(Model.LogoUrl))
{
<img src="@Model.LogoUrl" alt="Görsel" class="img-fluid mt-2" style="width: 100px; height: 100px;">
}
</div>
</div>
<div class="form-group row">
<label for="Phone" class="col-md-2 col-form-label">Telefon</label>
<div class="col-md-10">
<input type="tel" class="form-control" asp-for="Phone" id="Phone">
<span asp-validation-for="Phone" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Mail" class="col-md-2 col-form-label">E-Posta</label>
<div class="col-md-10">
<input type="email" class="form-control" asp-for="Mail" id="Mail">
<span asp-validation-for="Mail" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Facebook" class="col-md-2 col-form-label">Facebook</label>
<div class="col-md-10">
<input type="url" class="form-control" asp-for="Facebook" id="Facebook">
<span asp-validation-for="Facebook" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Instagram" class="col-md-2 col-form-label">Instagram</label>
<div class="col-md-10">
<input type="url" class="form-control" asp-for="Instagram" id="Instagram">
<span asp-validation-for="Instagram" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Linkedin" class="col-md-2 col-form-label">Linkedin</label>
<div class="col-md-10">
<input type="url" class="form-control" asp-for="Linkedin" id="Linkedin">
<span asp-validation-for="Linkedin" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Youtube" class="col-md-2 col-form-label">Youtube</label>
<div class="col-md-10">
<input type="url" class="form-control" asp-for="Youtube" id="Youtube">
<span asp-validation-for="Youtube" class="text-danger"></span>
</div>
</div>
</div>
<div class="card-action">
<button class="btn btn-success">Kaydet</button>
<a href="/Footer/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,15 @@
@{
ViewData["Title"] = "Home Page";
Layout = "~/Views/HomeLayout/Index.cshtml";
}
<div class="page">
@await Component.InvokeAsync("_HomeBannerAndSliderPartialComponent")
@await Component.InvokeAsync("_HomeAboutPartialComponent")
@await Component.InvokeAsync("_HomeWorkProcessPartialComponent")
@await Component.InvokeAsync("_HomeTeamPartialComponent")
@await Component.InvokeAsync("_HomeCompanyInfoPartialComponent")
@await Component.InvokeAsync("_HomeProjectPartialComponent")
@await Component.InvokeAsync("_HomeTestimonialPartialComponent")
@await Component.InvokeAsync("_HomeReferencePartialComponent")
@await Component.InvokeAsync("_HomeContactUsPartialComponent")
</div>

View File

@@ -0,0 +1,54 @@
@model List<ResultHomeBannerDto>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Banner İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<table class="table table-head-bg-success table-striped table-hover">
<thead>
<tr>
<th scope="col">Başlık</th>
<th scope="col">Alt Başlık</th>
<th scope="col">Logo</th>
<th scope="col">İşlemler</th>
</tr>
</thead>
<tbody>
@if (Model == null || !Model.Any())
{
<tr>
<td colspan="3">Kayıt bulunamadı.</td>
</tr>
}
else
{
@foreach (var item in Model)
{
<tr>
<td>@item.Title</td>
<td>@item.SubTitle</td>
<td>
<img width="75" height="75" src="@item.LogoUrl" alt="Görsel1" />
</td>
<td><a href="/HomeBanner/UpdateHomeBanner/@item.HomeBannerID" class="btn btn-outline-success">Güncelle</a></td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,58 @@
@model UpdateHomeBannerDto
@{
ViewData["Title"] = "UpdateHomeBanner";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Banner İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form method="post" enctype="multipart/form-data">
<div class="card">
<div class="card-header">
<div class="card-title">Banner Güncelleme</div>
</div>
<input type="hidden" asp-for="HomeBannerID" />
<div class="card-body">
<div class="form-group row">
<label for="Title" class="col-md-2 col-form-label">Başlık</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Title" id="Title">
<span asp-validation-for="Title" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="SubTitle" class="col-md-2 col-form-label">Alt Başlık</label>
<div class="col-md-10">
<textarea rows="5" class="form-control" asp-for="SubTitle" id="SubTitle"></textarea>
<span asp-validation-for="SubTitle" class="text-danger"></span>
</div>
</div>
<!-- Görsel -->
<div class="form-group row">
<label for="ImageFile" class="col-md-2 col-form-label">Logo</label>
<div class="col-md-10">
<span class="badge badge-danger">Tema Bütünlüğü için Görsel Boyutu en fazla 440x84 olmaldır.</span>
<input type="file" class="form-control" name="ImageFile" id="ImageFile">
@if (!string.IsNullOrEmpty(Model.LogoUrl))
{
<img src="@Model.LogoUrl" alt="Görsel" class="img-fluid mt-2" style="width: 100px; height: 100px;">
}
</div>
</div>
</div>
<div class="card-action">
<button class="btn btn-success">Kaydet</button>
<a href="/HomeBanner/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,19 @@

@{
Layout = null;
// HomeLayout
}
<!DOCTYPE html>
<html lang="en">
@await Component.InvokeAsync("_HomeLayoutHeaderPartialComponent")
<body>
@await Component.InvokeAsync("_HomeLayoutNavbarPartialComponent")
@RenderBody()
@await Component.InvokeAsync("_HomeLayoutFooterPartialComponent")
@await Component.InvokeAsync("_HomeLayoutScriptPartialComponent")
@RenderSection("Scripts", required: false)
</body>
</html>

View File

@@ -0,0 +1,113 @@
@using ConstructorAppUI.ViewModels
@model LoginViewModel
@{
Layout = null;
}
<!DOCTYPE html>
<!DOCTYPE html>
<html>
<!-- Head -->
<head>
<title>Constructor Web-App Login</title>
<!-- Meta-Tags -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="keywords" content="">
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<script type="application/x-javascript"> addEventListener("load", function() { setTimeout(hideURLbar, 0); }, false); function hideURLbar(){ window.scrollTo(0,1); } </script>
<!-- //Meta-Tags -->
<link href="~/register/css/popuo-box.css" rel="stylesheet" type="text/css" media="all" />
<!-- Style -->
<link rel="stylesheet" href="~/register/css/style.css" type="text/css" media="all">
<!-- Fonts -->
<link href="//fonts.googleapis.com/css?family=Quicksand:300,400,500,700" rel="stylesheet">
<!-- //Fonts -->
</head>
<!-- //Head -->
<!-- Body -->
<body>
<div class="w3layoutscontaineragileits">
<div style="display: flex; align-items: center; justify-content: center;">
<img src="~/SeedData/Logo.png" alt="Logo" style="width: 250px; height: 100px; margin-right: 10px;" />
</div>
<h5 style="margin: 0;">Login</h5>
<br /><br />
<form method="post">
<input type="text" asp-for="UserName" placeholder="Kullanıcı Adınız" value="admin" required="">
<input type="password" asp-for="Password" placeholder="Şifreniz" value="Password123!" required="">
<span asp-validation-for="Password" class="text-danger"></span>
<br /><br />
<ul class="agileinfotickwthree">
<li>
<input type="checkbox" id="brand1" value="">
<label for="brand1"><span></span>Beni Hatırla</label>
@* <a href="/Register/Index/">Bir hesabınız yok mu?</a> *@
</li>
</ul>
@if (!ViewData.ModelState.IsValid)
{
<div class="alert alert-danger" style="color: red; text-align:center;">
@foreach (var modelError in ViewData.ModelState.Values.SelectMany(v => v.Errors))
{
<p>@modelError.ErrorMessage</p>
}
</div>
}
<input type="submit" value="Giriş">
<br />
<br />
<br />
<div class="aitssendbuttonw3ls">
<div class="copyright ml-5">
&copy; @DateTime.Now.Year
<a href="https://polikarbilisim.com" target="_blank">
<img src="~/SeedData/pb_logo_whitebg.png" alt="Polikar Bilişim Hizmetleri Logo" style="height: 70px; vertical-align: middle;" />
</a>
<a href="https://polikarbilisim.com/"></a> | Tüm Hakları Saklıdır.
</div>
<div class="clear"></div>
</div>
</form>
</div>
<script type="text/javascript" src="~/register/js/jquery-2.1.4.min.js"></script>
<!-- pop-up-box-js-file -->
<script src="~/register/js/jquery.magnific-popup.js" type="text/javascript"></script>
<!--//pop-up-box-js-file -->
<script>
$(document).ready(function () {
$('.w3_play_icon,.w3_play_icon1,.w3_play_icon2').magnificPopup({
type: 'inline',
fixedContentPos: false,
fixedBgPos: true,
overflowY: 'auto',
closeBtnInside: true,
preloader: false,
midClick: true,
removalDelay: 300,
mainClass: 'my-mfp-zoom-in'
});
});
</script>
</body>
<!-- //Body -->
</html>

View File

@@ -0,0 +1,210 @@
@model CreateProjectDto
@{
ViewData["Title"] = "CreateProject";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Projelerimiz İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form asp-action="CreateProject" method="post" enctype="multipart/form-data" id="sliderForm">
<div class="card">
<div class="card-header">
<div class="card-title">Yeni Proje Girişi</div>
</div>
<div class="card-body">
<div class="row">
<!-- Sol sütun -->
<div class="col-md-6">
<h5 class="mb-3 font-weight-bold text-primary">Anasayfa Projeler Kısmında Gösterilecek Alanlar:</h5>
<div class="form-group">
<label for="Date">Oturum Tarihi</label>
<input type="date" class="form-control" asp-for="Date" id="Date">
<span asp-validation-for="Date" class="text-danger"></span>
</div>
<div class="form-group">
<label for="Title">Başlık</label>
<input type="text" class="form-control" asp-for="Title" id="Title">
<span asp-validation-for="Title" class="text-danger"></span>
</div>
<div class="form-group">
<label for="Location">Lokasyon</label>
<input type="text" class="form-control" asp-for="Location" id="Location">
<span asp-validation-for="Location" class="text-danger"></span>
</div>
<div class="form-group">
<label for="ShortDescription">Kısa Açıklama</label>
<textarea rows="2" class="form-control" asp-for="ShortDescription" id="ShortDescription"></textarea>
<span asp-validation-for="ShortDescription" class="text-danger"></span>
</div>
<!-- Görsel CoverFile-->
<div class="form-group">
<label for="ImageFile">Kapak Görseli</label><br />
<span class="badge badge-danger">Tema Bütünlüğü için Görsel Boyutu 775x524 olmalıdır.</span>
<input type="file" class="form-control" name="CoverFile" id="CoverFile">
</div>
</div>
<!-- Sağ sütun -->
<div class="col-md-6">
<h5 class="mb-3 font-weight-bold text-warning">Projeler Detay Sayfasında Gösterilecek Alanlar:</h5>
<div class="form-group">
<label for="Slug">Sayfa Adı</label>
<input type="text" class="form-control" asp-for="Slug" id="Slug">
<span asp-validation-for="Slug" class="text-danger"></span>
</div>
<div class="form-group">
<label for="GoogleMapIFrame">Google Map IFrame</label>
<input type="text" class="form-control" asp-for="GoogleMapIFrame" id="GoogleMapIFrame">
<span asp-validation-for="GoogleMapIFrame" class="text-danger"></span>
</div>
<div class="form-group">
<label for="LongDescription">Uzun Açıklama</label>
<textarea rows="2" class="form-control" asp-for="LongDescription" id="LongDescription"></textarea>
<span asp-validation-for="LongDescription" class="text-danger"></span>
</div>
<div class="form-group">
<label for="VideoUrl">Video Url</label>
<input type="text" class="form-control" asp-for="VideoUrl" id="VideoUrl">
<span asp-validation-for="VideoUrl" class="text-danger"></span>
</div>
<!-- Görsel FloorPlanFile-->
<div class="form-group">
<label for="FloorPlanUrl">Kat Planı</label>
<input type="file" class="form-control" name="FloorPlanFile" id="FloorPlanFile">
<span asp-validation-for="FloorPlanUrl" class="text-danger"></span>
</div>
</div>
</div>
</div>
<div class="card-action">
<div id="errorMessages" class="text-danger mb-3"></div>
<button class="btn btn-success">Kaydet</button>
<a href="/Project/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@* Formdaki alanlar boş geçilemesin *@
<script>
document.addEventListener("DOMContentLoaded", function () {
const form = document.getElementById("sliderForm");
const errorDiv = document.getElementById("errorMessages");
const fields = [
{ id: "Location", name: "Lokasyon" },
{ id: "Title", name: "Başlık" },
{ id: "ShortDescription", name: "Kısa Açıklama" },
{ id: "GoogleMapIFrame", name: "Google Map IFrame" },
{ id: "CoverFile", name: "Kapak Görseli" },
{ id: "LongDescription", name: "Uzun Açıklama" },
{ id: "Slug", name: "Dinamik Sayfa Adı" }
];
// Her input için focus olduğunda çerçeveyi temizle
fields.forEach(field => {
const input = document.getElementById(field.id);
input.addEventListener("focus", function () {
input.style.border = "";
errorDiv.innerHTML = ""; // Hataları da temizle
});
});
// Form submit kontrolü
form.addEventListener("submit", function (e) {
let isValid = true;
let messages = [];
errorDiv.innerHTML = ""; // Önceki mesajları temizle
fields.forEach(field => {
const input = document.getElementById(field.id);
if (input.type === "file") {
if (input.files.length === 0) {
isValid = false;
messages.push(`<li>${field.name} yüklenmelidir.</li>`);
input.style.border = "2px solid red";
}
} else {
if (input.value.trim() === "") {
isValid = false;
messages.push(`<li>${field.name} alanı boş olamaz.</li>`);
input.style.border = "2px solid red";
}
}
});
if (!isValid) {
e.preventDefault();
errorDiv.innerHTML = `<ul>${messages.join("")}</ul>`;
}
});
});
</script>
<script>
// Slug dönüştürücü fonksiyon
function generateSlug(text) {
const map = {
ç: 'c', Ç: 'c',
ğ: 'g', Ğ: 'g',
ü: 'u', Ü: 'u',
ş: 's', Ş: 's',
ı: 'i', İ: 'i',
ö: 'o', Ö: 'o'
};
return text
.trim()
.toLowerCase()
.replace(/[çÇğĞüÜşŞıİöÖ]/g, letter => map[letter])
.replace(/[^a-z0-9\s-]/g, '') // harf, sayı, boşluk ve tire dışındakileri sil
.replace(/\s+/g, '-') // boşlukları tireye çevir
.replace(/-+/g, '-') // birden fazla tire varsa teke indir
.replace(/^-+|-+$/g, ''); // baştaki ve sondaki tireleri sil
}
document.addEventListener("DOMContentLoaded", function () {
const titleInput = document.getElementById("Title");
const slugInput = document.getElementById("Slug");
if (titleInput && slugInput) {
titleInput.addEventListener("input", function () {
const slug = generateSlug(titleInput.value);
slugInput.value = slug;
});
}
});
</script>
<style>
.input-error {
border: 2px solid red !important;
box-shadow: 0 0 4px rgba(255, 0, 0, 0.5);
}
</style>

View File

@@ -0,0 +1,177 @@
@model ResultProjectDto
@{
ViewData["Title"] = Model.Title;
Layout = null;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>@Model.Title</title>
<meta name="description" content="">
<meta name="keywords" content="">
<!-- Favicons -->
<link href="~/SeedData/favicon-16x16.png" rel="icon">
<link href="~/SeedData/apple-touch-icon.png" rel="apple-touch-icon">
<!-- Fonts -->
<link href="https://fonts.googleapis.com" rel="preconnect">
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Raleway:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" rel="stylesheet">
<!-- Vendor CSS Files -->
<link href="~/EstateAgency/assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="~/EstateAgency/assets/vendor/bootstrap-icons/bootstrap-icons.css" rel="stylesheet">
<link href="~/EstateAgency/assets/vendor/aos/aos.css" rel="stylesheet">
<link href="~/EstateAgency/assets/vendor/fontawesome-free/css/all.min.css" rel="stylesheet">
<link href="~/EstateAgency/assets/vendor/swiper/swiper-bundle.min.css" rel="stylesheet">
<!-- Main CSS File -->
<link href="~/EstateAgency/assets/css/main.css" rel="stylesheet">
</head>
<body class="property-single-page">
<main class="main">
<!-- Page Title -->
<div class="page-title" data-aos="fade">
<div class="heading">
<div class="container">
<div class="row d-flex justify-content-center text-center">
<div class="col-lg-8">
<h1>@Model.Title</h1>
<p class="mb-0">@Model.ShortDescription</p>
</div>
</div>
</div>
</div>
</div><!-- End Page Title -->
<!-- Real Estate 2 Section -->
<section id="real-estate-2" class="real-estate-2 section">
<div class="container" data-aos="fade-up">
<div class="portfolio-details-slider swiper init-swiper">
<script type="application/json" class="swiper-config">
{
"loop": true,
"speed": 600,
"autoplay": {
"delay": 5000
},
"slidesPerView": "auto",
"navigation": {
"nextEl": ".swiper-button-next",
"prevEl": ".swiper-button-prev"
},
"pagination": {
"el": ".swiper-pagination",
"type": "bullets",
"clickable": true
}
}
</script>
<div class="swiper-wrapper align-items-center">
@if (Model.ImageUrls != null && Model.ImageUrls.Any())
{
foreach (var img in Model.ImageUrls)
{
<div class="swiper-slide">
<img src="@img" alt="">
</div>
}
}
else
{
<div class="swiper-slide">
<img src="@Model.CoverUrl" alt="">
</div>
}
</div>
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
<div class="swiper-pagination"></div>
</div>
<div class="row justify-content-between gy-4 mt-4">
<div class="col-lg-12" data-aos="fade-up">
<div class="portfolio-description">
<h2>Proje Detayları</h2>
<p>
@Model.LongDescription
</p>
</div><!-- End Portfolio Description -->
<!-- Tabs -->
<ul class="nav nav-pills mb-3">
<li><a class="nav-link active" data-bs-toggle="pill" href="#real-estate-2-tab1">Video</a></li>
<li><a class="nav-link" data-bs-toggle="pill" href="#real-estate-2-tab2">Kat Planı</a></li>
<li><a class="nav-link" data-bs-toggle="pill" href="#real-estate-2-tab3">Lokasyon</a></li>
</ul><!-- End Tabs -->
<!-- Tab Content -->
<div class="tab-content">
<div class="tab-pane fade show active" id="real-estate-2-tab1">
<div class="ratio ratio-16x9">
@{
var url = Model.VideoUrl;
var vid = ConstructorAppUI.Helpers.YouTubeHelper.ExtractVideoId(url);
var embedUrl = string.IsNullOrEmpty(vid) ? "" : $"https://www.youtube.com/embed/{vid}?autoplay=1";
}
<p>Embed URL: @embedUrl</p>
@if (!string.IsNullOrEmpty(embedUrl))
{
<iframe src="@embedUrl" style="width: 100%; height: 400px;" frameborder="0" allowfullscreen></iframe>
}
</div>
</div><!-- End Tab 1 Content -->
<div class="tab-pane fade" id="real-estate-2-tab2">
@* <img width="750" height="750" src="@Model.FloorPlanUrl alt="Görsel" /> *@
<img src="@Model.FloorPlanUrl" alt="Görsel" width="750" height="750" />
</div><!-- End Tab 2 Content -->
<div class="tab-pane fade" id="real-estate-2-tab3">
<iframe src="@Html.Raw(Model.GoogleMapIFrame)" style="border:0; width:100%; height:400px;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"></iframe>
</div><!-- End Tab 3 Content -->
</div><!-- End Tab Content -->
</div>
</div>
</div>
</section><!-- /Real Estate 2 Section -->
</main>
<!-- Scroll Top -->
<a href="#" id="scroll-top" class="scroll-top d-flex align-items-center justify-content-center"><i class="bi bi-arrow-up-short"></i></a>
<!-- Preloader -->
<div id="preloader"></div>
<!-- Vendor JS Files -->
<script src="~/EstateAgency/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="~/EstateAgency/assets/vendor/php-email-form/validate.js"></script>
<script src="~/EstateAgency/assets/vendor/aos/aos.js"></script>
<script src="~/EstateAgency/assets/vendor/swiper/swiper-bundle.min.js"></script>
<script src="~/EstateAgency/assets/vendor/purecounter/purecounter_vanilla.js"></script>
<!-- Main JS File -->
<script src="~/EstateAgency/assets/js/main.js"></script>
</body>
</html>

View File

@@ -0,0 +1,92 @@
@using static ConstructorApp.EntityLayer.Entities.Project
@using static ConstructorAppUI.Helpers.EnumExtensions
@model List<ResultProjectDto>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
int count = 0;
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Projelerimiz İşlemleri</h4>
<a href="/Project/CreateProject/" class="btn btn-outline-primary">Yeni Ekle</a>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<table class="table table-head-bg-success table-striped table-hover">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Oturum Tarihi</th>
<th scope="col">Başlık</th>
<th scope="col">Sayfa Adı</th>
<th scope="col">Lokasyon</th>
<th scope="col">GoogleMap IFrame</th>
<th scope="col">Video Url</th>
<th scope="col">Kapak Görseli</th>
<th scope="col">Kat Planı</th>
<th scope="col">Yayın Durumu</th>
<th scope="col">Proje Durumu</th>
<th scope="col">İşlemler</th>
</tr>
</thead>
<tbody>
@if (Model == null || !Model.Any())
{
<tr>
<td colspan="3">Kayıt bulunamadı.</td>
</tr>
}
else
{
@foreach (var item in Model)
{
count++;
<tr>
<td>@count</td>
<td>@item.Date</td>
<td>@item.Title</td>
<td>@item.Slug</td>
<td>@(item.Location?.Length > 8 ? item.Location.Substring(0, 8) + "..." : item.Location)</td>
<td>@(item.GoogleMapIFrame?.Length > 8 ? item.GoogleMapIFrame.Substring(0, 8) + "..." : item.GoogleMapIFrame)</td>
<td>@(item.VideoUrl?.Length > 8 ? item.VideoUrl.Substring(0, 8) + "..." : item.VideoUrl)</td>
<td>
<img width="75" height="75" src="@item.CoverUrl" alt="Görsel" />
</td>
<td>
<img width="75" height="75" src="@item.FloorPlanUrl" alt="Görsel" />
</td>
<td>
<span class="badge @(item.IsActive? "bg-success text-white" : "bg-secondary text-white")">
@(item.IsActive ? "Aktif" : "Pasif")
</span>
</td>
<td>
<span class="badge
@(item.Status == ProjectStatus.Planned ? "bg-warning text-dark" :
item.Status == ProjectStatus.UnderConstruction ? "bg-info text-white" :
"bg-success text-white")">
@item.Status.GetDisplayName()
</span>
</td>
<td>
<a href="/Project/UpdateProject/@item.ProjectID" class="btn btn-outline-success">Güncelle</a>
<a href="/Project/ProjectStatusActive/@item.ProjectID" class="btn btn-outline-info @(item.IsActive == true ? "disabled" : "")">Aktif</a>
<a href="/Project/ProjectStatusPassive/@item.ProjectID" class="btn btn-outline-dark @(item.IsActive == false ? "disabled" : "")">Pasif</a>
</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,219 @@
@model UpdateProjectDto
@{
ViewData["Title"] = "UpdateProject";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Projelerimiz İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form method="post" enctype="multipart/form-data" id="sliderForm">
<div class="card">
<div class="card-header">
<div class="card-title">Slider Güncelleme</div>
</div>
<input type="hidden" asp-for="ProjectID" />
<input type="hidden" asp-for="IsActive" />
<div class="card-body">
<div class="row">
<!-- Sol sütun -->
<div class="col-md-6">
<h5 class="mb-3 font-weight-bold text-primary">Anasayfa Projeler Kısmında Gösterilecek Alanlar:</h5>
<div class="form-group">
<label for="Date">Oturum Tarihi</label>
<input type="date" class="form-control" asp-for="Date" id="Date">
<span asp-validation-for="Date" class="text-danger"></span>
</div>
<div class="form-group">
<label for="Title">Başlık</label>
<input type="text" class="form-control" asp-for="Title" id="Title">
<span asp-validation-for="Title" class="text-danger"></span>
</div>
<div class="form-group">
<label for="Location">Lokasyon</label>
<input type="text" class="form-control" asp-for="Location" id="Location">
<span asp-validation-for="Location" class="text-danger"></span>
</div>
<div class="form-group">
<label for="ShortDescription">Kısa Açıklama</label>
<textarea rows="2" class="form-control" asp-for="ShortDescription" id="ShortDescription"></textarea>
<span asp-validation-for="ShortDescription" class="text-danger"></span>
</div>
<!-- Görsel CoverUrl -->
<div class="form-group">
<label for="ImageFile">Kapak Görseli</label><br />
<span class="badge badge-danger">Tema Bütünlüğü için Görsel Boyutu 775x524 olmalıdır.</span>
<input type="file" class="form-control" name="CoverFile" id="ImageFile">
@if (!string.IsNullOrEmpty(Model.CoverUrl))
{
<img src="@Model.CoverUrl" alt="Görsel" class="img-fluid mt-2" style="width: 100px; height: 100px;">
}
</div>
</div>
<!-- Sağ sütun -->
<div class="col-md-6">
<h5 class="mb-3 font-weight-bold text-warning">Projeler Detay Sayfasında Gösterilecek Alanlar:</h5>
<div class="form-group">
<label for="Slug">Sayfa Adı</label>
<input type="text" class="form-control" asp-for="Slug" id="Slug">
<span asp-validation-for="Slug" class="text-danger"></span>
</div>
<div class="form-group">
<label for="GoogleMapIFrame">Google Map IFrame</label>
<input type="text" class="form-control" asp-for="GoogleMapIFrame" id="GoogleMapIFrame">
<span asp-validation-for="GoogleMapIFrame" class="text-danger"></span>
</div>
<div class="form-group">
<label for="LongDescription">Uzun Açıklama</label>
<textarea rows="2" class="form-control" asp-for="LongDescription" id="LongDescription"></textarea>
<span asp-validation-for="LongDescription" class="text-danger"></span>
</div>
<div class="form-group">
<label for="VideoUrl">Video Url</label>
<input type="text" class="form-control" asp-for="VideoUrl" id="VideoUrl">
<span asp-validation-for="VideoUrl" class="text-danger"></span>
</div>
<!-- Görsel FloorPlanFile -->
<div class="form-group">
<label for="ImageFile">Kat Planı</label><br />
<span class="badge badge-danger">Tema Bütünlüğü için Görsel Boyutu 775x524 olmalıdır.</span>
<input type="file" class="form-control" name="FloorPlanFile" id="FloorPlanFile">
@if (!string.IsNullOrEmpty(Model.FloorPlanUrl))
{
<img src="@Model.FloorPlanUrl" alt="Görsel" class="img-fluid mt-2" style="width: 100px; height: 100px;">
}
</div>
<div class="form-group">
<label for="Status">Proje Durumu</label>
<select asp-for="Status" class="form-control" asp-items="@(ViewBag.StatusList as List<SelectListItem>)">
<option value="">Durum Seçiniz</option>
</select>
<span asp-validation-for="Status" class="text-danger"></span>
</div>
</div>
</div>
</div>
<div class="card-action">
<div id="errorMessages" class="text-danger mb-3"></div>
<button class="btn btn-success">Kaydet</button>
<a href="/Project/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@* Formdaki alanlar boş geçilemesin *@
<script>
document.addEventListener("DOMContentLoaded", function () {
const form = document.getElementById("sliderForm");
const errorDiv = document.getElementById("errorMessages");
const fields = [
{ id: "Location", name: "Lokasyon" },
{ id: "Title", name: "Başlık" },
{ id: "ShortDescription", name: "Kısa Açıklama" },
{ id: "GoogleMapIFrame", name: "Google Map IFrame" },
{ id: "LongDescription", name: "Uzun Açıklama" },
{ id: "Slug", name: "Dinamik Sayfa Adı" }
];
// Her input için focus olduğunda çerçeveyi temizle
fields.forEach(field => {
const input = document.getElementById(field.id);
input.addEventListener("focus", function () {
input.style.border = "";
errorDiv.innerHTML = ""; // Hataları da temizle
});
});
// Form submit kontrolü
form.addEventListener("submit", function (e) {
let isValid = true;
let messages = [];
errorDiv.innerHTML = ""; // Önceki mesajları temizle
fields.forEach(field => {
const input = document.getElementById(field.id);
if (input.type === "file") {
if (input.files.length === 0) {
isValid = false;
messages.push(`<li>${field.name} yüklenmelidir.</li>`);
input.style.border = "2px solid red";
}
} else {
if (input.value.trim() === "") {
isValid = false;
messages.push(`<li>${field.name} alanı boş olamaz.</li>`);
input.style.border = "2px solid red";
}
}
});
if (!isValid) {
e.preventDefault();
errorDiv.innerHTML = `<ul>${messages.join("")}</ul>`;
}
});
});
</script>
<script>
// Slug dönüştürücü fonksiyon
function generateSlug(text) {
const map = {
ç: 'c', Ç: 'c',
ğ: 'g', Ğ: 'g',
ü: 'u', Ü: 'u',
ş: 's', Ş: 's',
ı: 'i', İ: 'i',
ö: 'o', Ö: 'o'
};
return text
.trim()
.toLowerCase()
.replace(/[çÇğĞüÜşŞıİöÖ]/g, letter => map[letter])
.replace(/[^a-z0-9\s-]/g, '') // harf, sayı, boşluk ve tire dışındakileri sil
.replace(/\s+/g, '-') // boşlukları tireye çevir
.replace(/-+/g, '-') // birden fazla tire varsa teke indir
.replace(/^-+|-+$/g, ''); // baştaki ve sondaki tireleri sil
}
document.addEventListener("DOMContentLoaded", function () {
const titleInput = document.getElementById("Title");
const slugInput = document.getElementById("Slug");
if (titleInput && slugInput) {
titleInput.addEventListener("input", function () {
const slug = generateSlug(titleInput.value);
slugInput.value = slug;
});
}
});
</script>
<style>
.input-error {
border: 2px solid red !important;
box-shadow: 0 0 4px rgba(255, 0, 0, 0.5);
}
</style>

View File

@@ -0,0 +1,25 @@
@model int // ProjectID
@{
ViewData["Title"] = "CreateProjectGallery";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<form asp-action="CreateProjectGallery" asp-controller="ProjectGallery" method="post" enctype="multipart/form-data">
<div class="form-group">
<label>Proje Seçiniz:</label>
<select asp-items="ViewBag.ProjectList" class="form-control" name="projectId" required>
<option value="">-- Proje Seçiniz --</option>
</select>
</div>
<div class="form-group mt-3">
<label>Galeri Görselleri:</label>
<input type="file" name="GalleryFiles" multiple class="form-control" required />
</div>
<button type="submit" class="btn btn-primary">Görselleri Yükle</button>
<a href="/ProjectGallery/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</form>

View File

@@ -0,0 +1,58 @@
@model List<ResultProjectGalleryDto>
@using Microsoft.AspNetCore.Mvc.Rendering
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
var apiBaseUrl = ViewData["ApiBaseUrl"] as string;
}
<h3>Projeye Ait Galeri Görselleri</h3>
<a href="/ProjectGallery/CreateProjectGallery/" class="btn btn-outline-primary">Yeni Ekle</a>
<form asp-action="Index" method="get">
<div class="form-group mb-3">
<label>Proje Seçiniz:</label>
<select id="projectSelect" class="form-control">
<option value="">-- Proje Seçin --</option>
@foreach (SelectListItem project in ViewBag.ProjectList)
{
<option value="@project.Value">@project.Text</option>
}
</select>
</div>
</form>
<!-- Image List -->
<div id="imageListContainer" style="display: flex; flex-wrap: wrap; gap: 20px; margin-top: 20px;">
<!-- Görseller JavaScript ile burada yüklenecek -->
</div>
<script>
document.getElementById("projectSelect").addEventListener("change", function () {
var projectId = this.value;
if (projectId && '@apiBaseUrl') {
fetch(`@apiBaseUrl/api/ProjectGallery/GetByProjectId/${projectId}`)
.then(res => res.json())
.then(data => {
let container = document.getElementById("imageListContainer");
container.innerHTML = ""; // Mevcut içeriği temizle
if (data.length === 0) {
container.innerHTML = "<p>Bu projeye ait galeri bulunamadı.</p>";
return;
}
// Görselleri liste olarak ekle
data.forEach(item => {
let imageElement = document.createElement("img");
imageElement.src = item.imageUrl;
imageElement.alt = "Project Image";
imageElement.style = "width: 100%; max-width: 300px; height: auto; object-fit: cover;";
container.appendChild(imageElement); // Görseli listeye ekle
});
});
}
});
</script>

View File

@@ -0,0 +1,48 @@
@model CreateReferenceDto
@{
ViewData["Title"] = "CreateReference";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Referanslarımız İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form asp-action="CreateReference" method="post" enctype="multipart/form-data">
<div class="card">
<div class="card-header">
<div class="card-title">Yeni Referans Girişi</div>
</div>
<div class="card-body">
<div class="form-group row">
<label for="ImageFile" class="col-md-2 col-form-label">Logo</label>
<div class="col-md-10">
<input type="file" class="form-control" asp-for="ImageFile" id="ImageFile">
<span asp-validation-for="ImageFile" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="WebUrl" class="col-md-2 col-form-label">Web Adresi</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="WebUrl" id="WebUrl">
<span asp-validation-for="WebUrl" class="text-danger"></span>
</div>
</div>
</div>
<div class="card-action">
<button class="btn btn-success">Kaydet</button>
<a href="/Reference/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,103 @@
@model List<ResultReferenceDto>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
int count = 0;
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Referanslarımız İşlemleri</h4>
<a href="/Reference/CreateReference/" class="btn btn-outline-primary">Yeni Ekle</a>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<table class="table table-head-bg-success table-striped table-hover">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Logo</th>
<th scope="col">Web Adresi</th>
</tr>
</thead>
<tbody>
@if (Model == null || !Model.Any())
{
<tr>
<td colspan="3">Kayıt bulunamadı.</td>
</tr>
}
else
{
@foreach (var item in Model)
{
count++;
<tr>
<td>@count</td>
<td>
<img width="75" height="75" src="@item.LogoUrl" alt="Logo" />
</td>
<td>@item.WebUrl</td>
<td>
<a href="/Reference/UpdateReference/@item.ReferenceID" class="btn btn-outline-success">Güncelle</a>
<button onclick="showDeleteConfirmation('@item.ReferenceID')" class="btn btn-outline-danger">Sil</button>
</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Delete Confirmation Modal -->
<div class="modal fade" id="deleteConfirmationModal" tabindex="-1" aria-labelledby="deleteConfirmationModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="deleteConfirmationModalLabel">Referans Sil</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
Bu referansı silmek istediğinize emin misiniz?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">İptal</button>
<form id="deleteForm" method="post">
@Html.AntiForgeryToken()
<button type="submit" class="btn btn-danger">Sil</button>
</form>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
var deleteModal = new bootstrap.Modal(document.getElementById('deleteConfirmationModal'));
var deleteForm = document.getElementById('deleteForm');
// Delete modal açma işlevi
window.showDeleteConfirmation = function (productId) {
deleteForm.action = "/Reference/DeleteReference/" + productId;
deleteModal.show();
};
// Modal'ın kapanma işlevi için data-bs-dismiss kullanımını kontrol edin
document.querySelectorAll('[data-bs-dismiss="modal"]').forEach(function (element) {
element.addEventListener('click', function () {
deleteModal.hide();
});
});
});
</script>

View File

@@ -0,0 +1,49 @@
@model UpdateReferenceDto
@{
ViewData["Title"] = "UpdateReference";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Referanslarımız İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form method="post" enctype="multipart/form-data">
<div class="card">
<div class="card-header">
<div class="card-title">Referans Güncelleme</div>
</div>
<input type="hidden" asp-for="ReferenceID" />
<div class="card-body">
<div class="form-group row">
<label for="ImageFile" class="col-md-2 col-form-label">Logo</label>
<div class="col-md-10">
<input type="file" class="form-control" name="ImageFile" id="ImageFile">
@if (!string.IsNullOrEmpty(Model.LogoUrl))
{
<img src="@Model.LogoUrl" alt="Logo" class="img-fluid mt-2" style="width: 100px; height: 100px;">
}
</div>
</div>
<div class="form-group row">
<label for="WebUrl" class="col-md-2 col-form-label">Web Adresi</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="WebUrl" id="WebUrl">
<span asp-validation-for="WebUrl" class="text-danger"></span>
</div>
</div>
</div>
<div class="card-action">
<button class="btn btn-success">Kaydet</button>
<a href="/Reference/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,70 @@
@model List<ResultServiceDto>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
int count = 0;
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Hakkımızda İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<table class="table table-head-bg-success table-striped table-hover">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Başlık</th>
<th scope="col">Alt Başlık</th>
<th scope="col">Durumu</th>
<th scope="col">İşlemler</th>
</tr>
</thead>
<tbody>
@if (Model == null || !Model.Any())
{
<tr>
<td colspan="3">Kayıt bulunamadı.</td>
</tr>
}
else
{
@foreach (var item in Model)
{
count++;
<tr>
<td>@count</td>
<td>@item.Title</td>
<td>@item.SubTitle</td>
<td>
<span class="badge @(item.IsActive? "bg-success text-white" : "bg-secondary text-white")">
@(item.IsActive ? "Aktif" : "Pasif")
</span>
</td>
<td>
<a href="/Service/UpdateService/@item.ServiceID" class="btn btn-outline-success">Güncelle</a>
<a href="/Service/ServiceStatusActive/@item.ServiceID" class="btn btn-outline-info @(item.IsActive == true ? "disabled" : "")">Aktif</a>
<a href="/Service/ServiceStatusPassive/@item.ServiceID" class="btn btn-outline-dark @(item.IsActive == false ? "disabled" : "")">Pasif</a>
</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,46 @@
@model UpdateServiceDto
@{
ViewData["Title"] = "UpdateService";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Hakkımızda İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form method="post">
<div class="card">
<div class="card-header">
<div class="card-title">Hizmet Güncelleme</div>
</div>
<input type="hidden" asp-for="ServiceID" />
<input type="hidden" asp-for="IsActive" />
<div class="card-body">
<div class="form-group row">
<label for="Title" class="col-md-2 col-form-label">Başlık</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Title" id="Title">
<span asp-validation-for="Title" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="SubTitle" class="col-md-2 col-form-label">Alt Başlık</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="SubTitle" id="SubTitle">
<span asp-validation-for="SubTitle" class="text-danger"></span>
</div>
</div>
</div>
<div class="card-action">
<button class="btn btn-success">Kaydet</button>
<a href="/Service/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,9 @@

<footer class="main-footer">
<!-- To the right -->
@* <div class="float-right d-none d-sm-inline">
Anything you want
</div> *@
<!-- Default to the left -->
<strong>Copyright &copy; 2017-@DateTime.Now.Year <a href="https://www.polikarbilisi.com"></a>Polikar Bilişim Hizmetleri</strong> Tüm hakları korunmuştur.
</footer>

View File

@@ -0,0 +1,26 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AdminLTE 3 | Dashboard</title>
<!-- Google Font: Source Sans Pro -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
<!-- Font Awesome -->
<link rel="stylesheet" href="~/AdminTheme/plugins/fontawesome-free/css/all.min.css">
<!-- Ionicons -->
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<!-- Tempusdominus Bootstrap 4 -->
<link rel="stylesheet" href="~/AdminTheme/plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css">
<!-- iCheck -->
<link rel="stylesheet" href="~/AdminTheme/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
<!-- JQVMap -->
<link rel="stylesheet" href="~/AdminTheme/plugins/jqvmap/jqvmap.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="~/AdminTheme/dist/css/adminlte.min.css">
<!-- overlayScrollbars -->
<link rel="stylesheet" href="~/AdminTheme/plugins/overlayScrollbars/css/OverlayScrollbars.min.css">
<!-- Daterange picker -->
<link rel="stylesheet" href="~/AdminTheme/plugins/daterangepicker/daterangepicker.css">
<!-- summernote -->
<link rel="stylesheet" href="~/AdminTheme/plugins/summernote/summernote-bs4.min.css">
</head>

View File

@@ -0,0 +1,188 @@
@using ConstructorAppUI.ViewModels
@model UserProfileViewModel
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
<script src="~/lib/microsoft/signalr/dist/browser/signalr.min.js"></script>
<div class="wrapper">
<script>
$(document).ready(() => {
var signalRHubBaseUrl = '@ViewBag.SignalRHubBaseUrl';
if (!signalRHubBaseUrl) {
console.error("SignalRHubBaseUrl tanımlı değil!");
return;
}
var connection = new signalR.HubConnectionBuilder().withUrl(`${signalRHubBaseUrl}/SignalRHub`).build();
connection.start()
.then(() => {
$("#connstatus").text("Bağlı");
document.getElementById("connstatus").className = "badge bg-success text-white";
var iconElement = document.querySelector("#navbarDropdown1 i");
if (iconElement) {
iconElement.className = "fas fa-wifi text-success";
}
setInterval(() => {
connection.invoke("SendContactUs");
}, 1000);
})
.catch((err) => {
console.error("SignalR bağlantısı sırasında hata:", err);
});
connection.onclose(() => {
$("#connstatus").text("Bağlı Değil");
document.getElementById("connstatus").className = "badge bg-danger text-white";
var iconElement = document.querySelector("#navbarDropdown1 i");
if (iconElement) {
iconElement.className = "fas fa-wifi text-danger";
}
setTimeout(() => connection.start().catch(console.error), 5000);
});
connection.onreconnecting(() => {
$("#connstatus").text("Yeniden Bağlanıyor...");
document.getElementById("connstatus").className = "badge bg-warning text-white";
});
connection.onreconnected(() => {
$("#connstatus").text("Bağlı");
document.getElementById("connstatus").className = "badge bg-success text-white";
var iconElement = document.querySelector("#navbarDropdown1 i");
if (iconElement) {
iconElement.className = "fas fa-wifi text-success";
}
});
connection.on("ReceiveContactUsCountByStatusPending", (value) => {
console.log(value);
if (value > 0) {
$("#contactuscount").text(value);
} else {
$("#contactuscount").text('');
}
});
});
</script>
<nav class="main-header navbar navbar-expand navbar-white navbar-light">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a>
</li>
<li class="nav-item">
<a class="nav-link" data-widget="navbar-search" href="#" role="button">
<i class="fas fa-search"></i>
</a>
<div class="navbar-search-block">
<form class="form-inline">
<div class="input-group input-group-sm">
<input class="form-control form-control-navbar" id="searchInput" type="search" placeholder="Arama.." aria-label="Search">
<div class="input-group-append">
<button id="searchButton" class="btn btn-navbar" type="submit">
<i class="fas fa-search"></i>
</button>
<button class="btn btn-navbar" type="button" data-widget="navbar-search">
<i class="fas fa-times"></i>
</button>
</div>
</div>
</form>
</div>
</li>
</ul>
<ul class="navbar-nav ml-auto">
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#" id="navbarDropdown1" role="button">
<i class="fas fa-wifi" title="Sistem Durumu"></i>
<span class="badge badge-warning navbar-badge" id="connstatus"></span>
</a>
</li>
<li class="nav-item dropdown hidden-caret">
<a class="nav-link" href="/ContactUs/Index" id="navbarDropdown1" role="button">
<i class="far fa-envelope" title="İletişim Formu"></i>
<span class="badge badge-danger navbar-badge" id="contactuscount"></span>
</a>
</li>
<li class="nav-item dropdown">
<a class="dropdown-toggle profile-pic" data-toggle="dropdown" href="#" aria-expanded="false">
<img src="~/SeedData/defaultuser.png" width="36" class="img-circle"><span style="color: black;">@Model.UserName</span>
</a>
<ul class="dropdown-menu dropdown-user">
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="javascript:void(0);" onclick="window.location.href='/UserProfile/Index/'">
<i class="la la-cog"></i> Ayarlar
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="javascript:void(0);" onclick="window.location.href='/Login/LogOut/'">
<i class="la la-close"></i> Çıkış
</a>
</ul>
</li>
</ul>
</nav>
</div>
<script>
// Vurguları temizlemek için fonksiyon
function clearHighlights() {
document.querySelectorAll("span[style='background-color: yellow;']").forEach(function (span) {
span.outerHTML = span.innerHTML; // Sadece span'ı kaldır ve içeriği olduğu gibi bırak
});
}
// Arama işlemini gerçekleştiren fonksiyon
function performSearch() {
var searchQuery = document.getElementById("searchInput").value.toLowerCase();
if (!searchQuery) return; // Arama kutusu boşsa bir şey yapma
// Vurguları temizle
clearHighlights();
// Sayfadaki hedef alanları belirle (örneğin yalnızca `.content` içindeki metinleri kontrol etmek isterseniz)
var elements = document.querySelectorAll("body *:not(script):not(style):not(input):not(button)");
elements.forEach(function (el) {
// Elementin içeriğini kontrol et
if (el.children.length === 0) { // Sadece metin düğümleri içeren elemanları işlemek
var text = el.textContent;
if (text.toLowerCase().includes(searchQuery)) {
// Aranan kelimeyi <span> ile sarmala ve vurgula
var highlightedText = text.replace(
new RegExp(`(${searchQuery})`, 'gi'),
`<span style="background-color: yellow;">$1</span>`
);
el.innerHTML = highlightedText;
}
}
});
}
// Arama kutusu her değiştiğinde (yazıldıkça) arama yap
document.getElementById("searchInput").addEventListener("input", function () {
performSearch(); // Her input değişikliğinde arama yap
});
// Arama kutusu temizlendiğinde (boşaltıldığında) vurguları temizle
document.getElementById("searchInput").addEventListener("input", function () {
if (this.value === "") {
clearHighlights(); // Arama kutusu boşsa vurguları temizle
}
});
</script>

View File

@@ -0,0 +1,27 @@
 <!-- jQuery -->
<script src="~/AdminTheme/plugins/jquery/jquery.min.js"></script>
<!-- Bootstrap 4 -->
<script src="~/AdminTheme/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Select2 -->
<script src="~/AdminTheme/plugins/select2/js/select2.full.min.js"></script>
<!-- Bootstrap4 Duallistbox -->
<script src="~/AdminTheme/plugins/bootstrap4-duallistbox/jquery.bootstrap-duallistbox.min.js"></script>
<!-- InputMask -->
<script src="~/AdminTheme/plugins/moment/moment.min.js"></script>
<script src="~/AdminTheme/plugins/inputmask/jquery.inputmask.min.js"></script>
<!-- date-range-picker -->
<script src="~/AdminTheme/plugins/daterangepicker/daterangepicker.js"></script>
<!-- bootstrap color picker -->
<script src="~/AdminTheme/plugins/bootstrap-colorpicker/js/bootstrap-colorpicker.min.js"></script>
<!-- Tempusdominus Bootstrap 4 -->
<script src="~/AdminTheme/plugins/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js"></script>
<!-- Bootstrap Switch -->
<script src="~/AdminTheme/plugins/bootstrap-switch/js/bootstrap-switch.min.js"></script>
<!-- BS-Stepper -->
<script src="~/AdminTheme/plugins/bs-stepper/js/bs-stepper.min.js"></script>
<!-- dropzonejs -->
<script src="~/AdminTheme/plugins/dropzone/min/dropzone.min.js"></script>
<!-- AdminLTE App -->
<script src="~/AdminTheme/dist/js/adminlte.min.js"></script>

View File

@@ -0,0 +1,114 @@
<!-- Main Sidebar Container -->
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar user panel (optional) -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex justify-content-center align-items-center">
<div class="image">
<a href="/Dashboard/Index">
<i class="fas fa-chart-line"></i> Dashboard
</a>
</div>
</div>
<!-- SidebarSearch Form -->
<div class="form-inline">
<div class="input-group" data-widget="sidebar-search">
<input class="form-control form-control-sidebar" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-append">
<button class="btn btn-sidebar">
<i class="fas fa-search fa-fw"></i>
</button>
</div>
</div>
</div>
<!-- Sidebar Menu -->
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
<!-- Web İşlemleri -->
<li class="nav-item">
<a href="#" class="nav-link">
<i class="fas fa-globe"></i>
<p style="margin-left: 8px;">
Web İşlemleri
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="/HomeBanner/Index" class="nav-link">
<i class="fas fa-window-maximize"></i>
<p style="margin-left: 8px;">Banner</p>
</a>
</li>
<li class="nav-item">
<a href="/Slider/Index" class="nav-link">
<i class="fas fa-sliders-h"></i>
<p style="margin-left: 8px;">Önce Çıkanlar</p>
</a>
</li>
<li class="nav-item">
<a href="/Service/Index" class="nav-link">
<i class="fas fa-quote-right"></i>
<p style="margin-left: 8px;">Hakkımızda</p>
</a>
</li>
<li class="nav-item">
<a href="/WorkProcess/Index" class="nav-link">
<i class="fas fa-paint-roller"></i>
<p style="margin-left: 8px;">Çalışma Şeklimiz</p>
</a>
</li>
<li class="nav-item">
<a href="/Team/Index" class="nav-link">
<i class="fas fa-users"></i>
<p style="margin-left: 12px;">Ekibimiz</p>
</a>
</li>
<li class="nav-item">
<a href="/CompanyInfo/Index" class="nav-link">
<i class="fas fa-award"></i>
<p style="margin-left: 12px;">Başarılar</p>
</a>
</li>
<li class="nav-item">
<a href="/Project/Index" class="nav-link">
<i class="fas fa-pencil-ruler"></i>
<p style="margin-left: 4px;">Projeler</p>
</a>
</li>
<li class="nav-item">
<a href="/ProjectGallery/Index" class="nav-link">
<i class="fas fa-images"></i>
<p style="margin-left: 4px;">Proje Galerisi</p>
</a>
</li>
<li class="nav-item">
<a href="/Testimonial/Index" class="nav-link">
<i class="fas fa-comments"></i>
<p style="margin-left: 4px;">Müşteri Yorumları</p>
</a>
</li>
<li class="nav-item">
<a href="/Reference/Index" class="nav-link">
<i class="fas fa-trophy"></i>
<p style="margin-left: 12px;">Referanslar</p>
</a>
</li>
<li class="nav-item">
<a href="/Footer/Index" class="nav-link">
<i class="fas fa-money-check"></i>
<p style="margin-left: 4px;">Footer</p>
</a>
</li>
</ul>
</li>
</ul>
</nav>
<!-- /.sidebar-menu -->
</div>
<!-- /.sidebar -->
</aside>

View File

@@ -0,0 +1,60 @@
@model List<ResultServiceDto>
<section class="section novi-background bg-cover section-xl bg-white parallax-scene-js" id="scene">
<div class="container">
<div class="row row-50 align-items-center justify-content-md-between">
<div class="col-md-4 col-lg-3">
<div class="row row-40 row-md-60">
@if (Model != null && Model.Any())
{
int delay = 0;
foreach (var item in Model.Where(x => x.IsActive))
{
<div class="col-sm-4 col-md-12 col-xl-11 wow fadeInLeft" data-wow-delay="@($"{(delay * 0.05).ToString("0.00")}s")">
<article class="box-icon-classic">
<div class="box-icon-classic-header">
<div class="box-icon-classic-icon novi-icon linearicons-apartment"></div>
<h6 class="box-icon-classic-title">
<a href="#">@item.Title</a>
</h6>
</div>
<div class="box-icon-classic-text">@item.SubTitle</div>
</article>
</div>
delay++;
}
}
</div>
</div>
<!-- Sağ taraf (Form alanı) sabit kalabilir -->
<div class="col-md-7 col-lg-6">
<div class="inset-xl-left-35">
<h3 class="wow fadeInRight">Sizin için en uygun evi<br>birlikte bulalım</h3>
<h6 class="title-style-1 wow fadeInRight" data-wow-delay=".05s">İletişim formumuzu doldurun, en kısa sürede sizlere ulaşalım</h6>
<div class="form-style-1 context-dark wow blurIn">
<h6 class="title-style-1 wow fadeInRight" data-wow-delay=".05s">
<a href="#contacts" style="text-decoration: none; color: inherit;">
İletişim Formu
</a>
</h6>
</div>
</div>
</div>
</div>
</div>
<div class="layer-wrap layer-1">
<div class="layer" data-depth="0.4">
<img src="~/SeedData/Service_bg.png" alt="" width="694" height="539" />
</div>
</div>
</section>
<script src="https://cdnjs.cloudflare.com/ajax/libs/parallax/3.1.0/parallax.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function () {
var scene = document.getElementById('scene');
var parallaxInstance = new Parallax(scene);
});
</script>

View File

@@ -0,0 +1,62 @@
@model ConstructorAppUI.ViewModels.HomeBannerAndSliderViewModel
@if (Model != null && Model.HomeBanners != null && Model.HomeBanners.Any())
{
var banner = Model.HomeBanners.First();
<!-- varsayılan olarak ilk banner'ı alıyoruz -->
<div class="preloader">
<div class="cssload-box-loading"></div>
</div>
<div class="position-relative">
<section class="section novi-background bg-cover section-horace">
<div class="section-horace-left bg-gray-800">
<div class="section-horace-left-content text-center">
<article class="project-classic project-classic-2">
<div class="project-classic-title">
@Html.Raw(banner.Title.Replace("&", "<br>&"))
</div>
<h6 class="project-classic-text">
@Html.Raw(banner.SubTitle.Replace(".", "<br>"))
</h6>
<a class="button button-jerry button-primary-outline" href="#contacts">
İletişim
<span class="button-jerry-line"></span>
<span class="button-jerry-line"></span>
<span class="button-jerry-line"></span>
<span class="button-jerry-line"></span>
</a>
</article>
</div>
<div class="section-horace-left-panel">
<div class="swiper-custom-nav">
<div class="swiper-button-prev mdi mdi-arrow-left" id="swiper-prev"></div>
<div class="swiper-button-next mdi mdi-arrow-right" id="swiper-next"></div>
</div>
</div>
</div>
<!-- SLIDER -->
@if (Model.Sliders != null && Model.Sliders.Any())
{
<div class="swiper-container swiper-slider swiper-slider-1" data-loop="true" data-autoplay="5000" data-simulate-touch="false" data-custom-prev="#swiper-prev" data-custom-next="#swiper-next" data-slide-effect="fade">
<div class="swiper-wrapper text-center">
@foreach (var slide in Model.Sliders)
{
<div class="swiper-slide context-dark" data-slide-bg="@slide.ImageUrl">
<div class="swiper-slide-caption project-modern">
<ul class="project-modern-info">
<li class="heading-6 project-modern-info-item project-modern-address" data-caption-animate="fadeInDown" data-caption-delay="200">@slide.Location</li>
<li class="heading-6 project-modern-info-item" data-caption-animate="fadeInDown" data-caption-delay="100">@slide.Sqm m2</li>
<li class="heading-6 project-modern-info-item" data-caption-animate="fadeInDown" data-caption-delay="0">$ @slide.PriceInfo</li>
</ul>
<div class="project-modern-decor" data-caption-animate="fadeInRight" data-caption-delay="0"></div>
</div>
</div>
}
</div>
<div class="project-modern-counter">@Model.Sliders.Count() + " works"</div>
</div>
}
</section>
</div>
}

View File

@@ -0,0 +1,68 @@
@model ConstructorAppUI.ViewModels.HomeCompanyInfoAndVideoViewModel
<section class="section novi-background bg-cover section-lg section-inset-3 bg-white parallax-scene-js" id="company-info-scene">
<div class="container">
<div class="row row-50 justify-content-md-between">
<!-- Sol taraf: Başlık + video -->
<div class="col-md-6">
<h3 class="wow fadeInRight">Ödüllü<br>Mimarlık şirketiniz</h3>
<h6 class="title-style-1 wow fadeInRight" data-wow-delay=".05s">En iyi çözümleri sunuyoruz</h6>
<article class="video-classic wow blurIn">
<div class="video-classic-figure">
<img src="~/SeedData/CompanyinfoVideo_bg.png" alt="" width="533" height="362" />
</div>
<a class="video-classic-link" data-lightgallery="item" href="@Model.CompanyInfoVideo.VideoUrl">
<span class="icon mdi mdi-play"></span>
</a>
</article>
</div>
<!-- Sağ taraf: Dinamik CompanyInfo kutucukları -->
<div class="col-md-4 col-xl-3 inset-xl-top-70">
<div class="row row-30 row-md-50 justify-content-center justify-content-md-start">
@if (Model.CompanyInfo != null && Model.CompanyInfo.Any())
{
double delay = 0;
foreach (var item in Model.CompanyInfo.OrderBy(x => x.CompanyInfoID))
{
<div class="col-6 col-sm-4 col-md-12 col-lg-11 wow fadeInRight" data-wow-delay="@($"{delay:0.##}s")">
<article class="counter-classic">
<div class="counter-classic-header">
<div class="heading-1 counter-classic-number"><span class="counter">@item.Value</span></div>
<h6 class="counter-classic-title">@item.Title</h6>
</div>
<div class="counter-classic-text">@item.SubTitle</div>
</article>
</div>
delay += 0.05;
}
}
<!-- İsteğe bağlı sabit buton -->
<div class="col-xl-12 wow fadeInUp">
<a class="button button-jerry button-primary" href="#contacts">
İletişim
<span class="button-jerry-line"></span><span class="button-jerry-line"></span><span class="button-jerry-line"></span><span class="button-jerry-line"></span>
</a>
</div>
</div>
</div>
</div>
</div>
<!-- Parallax görsel -->
<div class="layer-wrap layer-2">
<div class="layer" data-depth="0.4">
<img src="@Url.Content("~/SeedData/Companyinfo_bg.jpg")" alt="Company Info Background" width="853" height="574" />
</div>
</div>
</section>
<!-- Parallax.js script -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/parallax/3.1.0/parallax.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function () {
var scene = document.getElementById('company-info-scene');
var parallaxInstance = new Parallax(scene);
});
</script>

View File

@@ -0,0 +1,172 @@
@model CreateContactUsDto
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<section class="section novi-background bg-cover bg-white section-inset-1 parallax-scene-js" id="contacts">
<div class="container">
<div class="row justify-content-center">
<div class="col-lg-6 d-none d-lg-block wow fadeInLeft">
<img src="~/SeedData/ContactForm_Image-1.png" alt="" width="538" height="694" />
</div>
<div class="col-md-8 col-lg-6">
<div class="inset-xl-left-35 section-sm">
<h3 class="wow fadeInRight">Bize<br>Ulaşın</h3>
<h6 class="title-style-1 wow fadeInRight" data-wow-delay=".05s"
style="background-color: #ffffff; display: inline-block; padding: 5px 10px; border-radius: 6px;">
Gelin Birlikte Çalışalım!
</h6>
<div class="form-style-1 context-dark wow blurIn">
<!-- RD Mailform-->
<form method="post" class="rd-mailform text-left" id="contactForm">
<div class="form-wrap">
<input class="form-input" placeholder="Adınız Soyadınız" asp-for="NameSurname" id="nameInput" required />
<span asp-validation-for="NameSurname" class="text-danger"></span>
</div>
<div class="form-wrap">
<input class="form-input" placeholder="e-posta Adresiniz" asp-for="Mail" id="emailInput" required />
<span asp-validation-for="Mail" class="text-danger"></span>
</div>
<div class="form-wrap">
<input class="form-input" placeholder="Telefonunuz" asp-for="Phone" id="phoneInput" required />
<span asp-validation-for="Phone" class="text-danger"></span>
</div>
<div class="form-wrap">
<textarea class="form-input" placeholder="Mesajınız" asp-for="MessageContent" id="messageInput" required></textarea>
<span asp-validation-for="MessageContent" class="text-danger"></span>
</div>
<div class="form-wrap">
<div class="g-recaptcha" data-sitekey="6LeH2M8qAAAAAHbDq0txKL7O48Wo9vgHvkXP7_-X"></div>
</div>
<div class="form-button">
<button class="button button-jerry button-primary" type="button" id="sendMessageButton">
Gönder<span class="button-jerry-line"></span><span class="button-jerry-line"></span><span class="button-jerry-line"></span><span class="button-jerry-line"></span>
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="layer-wrap layer-3">
<div class="layer" data-depth="0.4">
<img src="~/SeedData/ContactForm_bg.png" alt="" width="1047" height="531" />
</div>
</div>
</section>
<script>
document.addEventListener("DOMContentLoaded", function () {
var contacts = document.getElementById('contacts');
var parallaxInstance = new Parallax(contacts);
});
</script>
<script>
$(document).on("click", "#sendMessageButton", function () {
var isValid = true;
// Form elemanlarını al
var name = $("#nameInput").val().trim();
var email = $("#emailInput").val().trim();
var phone = $("#phoneInput").val().trim();
var message = $("#messageInput").val().trim();
// Önce tüm hata stillerini temizle
$(".form-input").removeClass("input-error");
// Boş alan kontrolü
if (!name) {
$("#nameInput").addClass("input-error");
isValid = false;
}
if (!email) {
$("#emailInput").addClass("input-error");
isValid = false;
}
if (!phone) {
$("#phoneInput").addClass("input-error");
isValid = false;
}
if (!message) {
$("#messageInput").addClass("input-error");
isValid = false;
}
if (!isValid) {
alert("Lütfen tüm alanları doldurunuz.");
return;
}
// Email doğrulaması
if (isValid && !validateEmail(email)) {
isValid = false;
errorMessage = "Geçerli bir email adresi giriniz.";
}
// Telefon formatı kontrolü
if (!/^\d{3} \d{3} \d{2} \d{2}$/.test(phone)) {
$("#phoneInput").addClass("input-error");
alert("Telefon numarası sadece şu formatta olmalıdır: 555 111 22 33");
return;
}
// reCAPTCHA doğrulaması
var recaptchaResponse = grecaptcha.getResponse();
if (isValid && recaptchaResponse.length == 0) {
isValid = false;
errorMessage = "Lütfen reCAPTCHA doğrulamasını yapın.";
}
// Hata mesajını gösterme
if (!isValid) {
alert(errorMessage);
return;
}
// Form verisi
var contactData = {
NameSurname: name,
Mail: email,
Phone: phone,
MessageContent: message,
RecaptchaResponse: recaptchaResponse
};
// AJAX ile gönderim
$.ajax({
url: '@ViewBag.ApiBaseUrl/api/ContactUs',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(contactData),
success: function () {
alert("Mesajınız başarıyla gönderildi. En kısa sürede sizinle iletişime geçeceğiz!");
$("#contactForm")[0].reset();
grecaptcha.reset(); // reCAPTCHA sıfırlanır
},
error: function () {
alert("Mesaj gönderilirken bir hata oluştu. Lütfen daha sonra tekrar deneyin.");
}
});
});
// Email doğrulama fonksiyonu
function validateEmail(email) {
var regex = /^[a-zA-Z0-9._-]+@@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
return regex.test(email);
}
</script>
<style>
.input-error {
border: 2px solid #c4956a !important;
}
</style>

View File

@@ -0,0 +1,26 @@
@model ConstructorAppUI.Dtos.FooterDtos.ResultFooterDto
<footer class="section novi-background bg-cover section-sm footer-classic context-dark" id="contacts">
<div class="container">
<a class="brand wow blurIn" href="#">
<img src="@Url.Content(Model.LogoUrl)" alt="Logo" width="350" height="350" />
</a>
<ul class="contacts-modern footer-classic-list">
<li class="wow fadeInLeft">
<a class="heading-3" href="tel:@Model.Phone">@Model.Phone</a>
</li>
<li class="wow fadeInRight">
<a class="heading-3" href="mailto:@Model.Mail">@Model.Mail</a>
</li>
</ul>
<ul class="list-inline list-inline-xxl list-social footer-classic-list">
<li><a class="icon novi-icon mdi mdi-facebook" href="@Model.Facebook"></a></li>
<li><a class="icon novi-icon mdi mdi-instagram" href="@Model.Instagram"></a></li>
<li><a class="icon novi-icon mdi mdi-linkedin" href="@Model.Linkedin"></a></li>
<li><a class="icon novi-icon mdi mdi-youtube-play" href="@Model.Youtube"></a></li>
</ul>
<p class="rights"><span>&copy;&nbsp; </span><span class="copyright-year"></span><span>&nbsp;</span><span>Tüm hakları yasalarla korunmuştur</span>
<a href="https://polikarbilisim.com" class="text-secondary"> . Polikar Bilişim Teknolojileri tarafından geliştirilmiştir.</a>
</p>
</div>
</footer>

View File

@@ -0,0 +1,26 @@
<head>
<title>Home</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="icon" href="images/favicon.ico" type="image/x-icon">
<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Montserrat:300,400,500,700,800">
<link rel="stylesheet" href="~/WebTheme/css/bootstrap.css">
<link rel="stylesheet" href="~/WebTheme/css/fonts.css">
<link rel="stylesheet" href="~/WebTheme/css/style.css">
<style>
.ie-panel {
display: none;
background: #212121;
padding: 10px 0;
box-shadow: 3px 3px 5px 0 rgba(0,0,0,.3);
clear: both;
text-align: center;
position: relative;
z-index: 1;
}
html.ie-10 .ie-panel, html.lt-ie-10 .ie-panel {
display: block;
}</style>
</head>

View File

@@ -0,0 +1,52 @@
@model List<ResultHomeBannerDto>
@if (Model != null && Model.Any())
{
var banner = Model.First(); // İlk kaydı al
<!-- Page Header-->
<header class="section novi-background bg-cover page-header" id="home">
<!-- RD Navbar-->
<div class="rd-navbar-wrap">
<nav class="rd-navbar" data-layout="rd-navbar-fixed" data-sm-layout="rd-navbar-fixed" data-md-layout="rd-navbar-fixed" data-lg-layout="rd-navbar-fixed" data-lg-device-layout="rd-navbar-fixed" data-xl-layout="rd-navbar-sidebar" data-xl-device-layout="rd-navbar-sidebar" data-xxl-layout="rd-navbar-sidebar" data-xxl-device-layout="rd-navbar-sidebar" data-xl-stick-up-offset="400" data-xxl-stick-up-offset="400">
<div class="rd-navbar-main-outer">
<div class="rd-navbar-main">
<!-- RD Navbar Panel-->
<div class="rd-navbar-panel">
<!-- RD Navbar Brand-->
<div class="rd-navbar-brand">
<a class="brand" href="#">
<img src="@banner.LogoUrl" alt="Logo" width="479" height="111" />
</a>
</div>
<!-- RD Navbar Toggle-->
<button class="rd-navbar-toggle" data-rd-navbar-toggle=".rd-navbar-nav-wrap"><span></span></button>
</div>
<div class="rd-navbar-main-element">
<div class="rd-navbar-nav-wrap">
<!-- RD Navbar Nav-->
<ul class="rd-navbar-nav">
<li class="rd-nav-item"><a class="rd-nav-link" href="#project">Projelerimiz</a></li>
<li class="rd-nav-item"><a class="rd-nav-link" href="#company-info-scene">Hakkımızda</a></li>
<li class="rd-nav-item"><a class="rd-nav-link" href="#scene">Hizmetlerimiz</a></li>
<li class="rd-nav-item"><a class="rd-nav-link" href="#work-process">Ev Sahibi Olun</a></li>
<li class="rd-nav-item"><a class="rd-nav-link" href="#contacts">İletişim</a></li>
</ul>
<div class="contacts-classic">
<div class="unit align-items-center">
<div class="unit-left"><span class="icon novi-icon mdi mdi-cellphone"></span></div>
<div class="unit-body"><a class="contacts-classic-text" href="tel:#">@ViewBag.FooterPhone</a></div>
</div>
</div>
</div>
</div>
</div>
</div>
</nav>
</div>
</header>
}
else
{
<p>Header içeriği bulunamadı.</p>
}

View File

@@ -0,0 +1,3 @@
<div class="snackbars" id="form-output-global"></div>
<script src="~/WebTheme/js/core.min.js"></script>
<script src="~/WebTheme/js/script.js"></script>

View File

@@ -0,0 +1,118 @@
@using static ConstructorApp.EntityLayer.Entities.Project
@model List<ResultProjectDto>
<section class="section novi-background bg-cover section-lg section-inset-2 bg-gray-100" id="project">
<div class="container">
<div class="caption-classic">
<div class="caption-classic-group">
<h1 class="caption-classic-title wow fadeInLeft">Proje<span class="font-weight-light">ler</span></h1>
<p class="caption-classic-text wow fadeInRight">
Aşağıda, benzersiz mimari yaklaşımımızla çok sayıda ödüle layık görülen son projelerimize göz atabilirsiniz.
</p>
</div>
<div class="caption-classic-decor wow blurIn"></div>
</div>
<!-- Owl Carousel-->
<div class="owl-carousel owl-style-1" data-autoplay="true" data-autoplay-timeout="10000" data-autoplay-hover-pause="true" data-items="1" data-margin="30" data-xl-margin="90" data-nav="true" data-dots="true" data-mouse-drag="false" data-smart-speed="600">
@foreach (var project in Model.Where(x => x.IsActive))
{
<article class="project-mary">
<div class="project-mary-figure">
<a href="/projeler/@project.Slug">
<img src="@project.CoverUrl" alt="@project.Title" width="775" height="524" />
</a>
<!-- Ribbon Start -->
<div class="ribbon-wrapper">
<div class="ribbon
@(project.Status == ProjectStatus.Completed ? "bg-success text-white" :
project.Status == ProjectStatus.Planned ? "bg-warning text-white" :
project.Status == ProjectStatus.UnderConstruction ? "bg-secondary text-dark" :
"bg-secondary text-white")">
@(project.Status == ProjectStatus.Completed ? "Teslimatta" :
project.Status == ProjectStatus.Planned ? "Tanıtımda" :
project.Status == ProjectStatus.UnderConstruction ? "İnşaatta" :
"Durum Belirsiz")
</div>
</div>
<!-- Ribbon End -->
<div class="project-mary-link-wrap">
<a class="project-mary-link mdi mdi-magnify" data-lightgallery="item" href="@project.CoverUrl">
<img src="@project.CoverUrl" alt="@project.Title" width="775" height="524" />
</a>
</div>
</div>
<div class="project-mary-content">
<ul class="project-mary-panel">
<li class="project-mary-panel-item">
<time class="project-mary-time" datetime="@project.Date.ToString("yyyy-MM-dd")">
@project.Date.ToString("MMMM dd, yyyy")
</time>
</li>
<li class="project-mary-panel-item">
<div class="project-mary-tag">@project.Title</div>
</li>
</ul>
<h3 class="project-mary-title">
<a href="/projeler/@project.Slug">@project.Location</a>
</h3>
<p class="project-mary-text">@project.ShortDescription</p>
</div>
</article>
}
</div>
</div>
</section>
<style>
.ribbon-wrapper {
position: absolute;
top: 0px; /* Görselin içine doğru yukarıdan mesafe */
right: 0px; /* Görselin içine doğru sağdan mesafe */
overflow: hidden;
width: 100px;
height: 100px;
z-index: 10;
}
.ribbon {
position: absolute;
display: block;
width: 140px; /* Ribbon genişliği */
padding: 10px 0; /* Ribbon yüksekliği */
font-size: 16px; /* Yazı boyutu */
text-align: center;
color: #fff;
transform: rotate(45deg); /* Sağ üst köşeden çapraz */
top: 20px; /* Ribbon'un görselin içine kayması için ayar */
right: -30px; /* Görselin içine konumlandırma */
z-index: 11;
}
.ribbon.bg-success {
background-color: #28a745 !important;
}
.ribbon.bg-warning {
background-color: #ffc107 !important;
}
.ribbon.bg-info {
background-color: #17a2b8 !important;
}
.ribbon.bg-secondary {
background-color: #6c757d !important;
}
.text-secondary {
color: white !important; /* Tüm text-secondary sınıfları beyaz yapılır */
}
</style>

View File

@@ -0,0 +1,42 @@
@model List<ResultReferenceDto>
<h5 class="title-style-2 mb-3" style="color: #c4956a;">Referanslarımız</h5>
<div class="swiper mySwiper">
<div class="swiper-wrapper">
@foreach (var reference in Model)
{
<div class="swiper-slide">
<a class="clients-classic" href="@(string.IsNullOrEmpty(reference.WebUrl) ? "#" : reference.WebUrl)" target="_blank">
<img src="@reference.LogoUrl" alt="reference-logo" style="max-width: 150px;" />
</a>
</div>
}
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
<script>
var swiper = new Swiper(".mySwiper", {
loop: true,
autoplay: {
delay: 2500,
disableOnInteraction: false,
},
slidesPerView: 3,
spaceBetween: 30,
breakpoints: {
640: {
slidesPerView: 2,
},
768: {
slidesPerView: 3,
},
1024: {
slidesPerView: 5,
}
}
});
</script>

View File

@@ -0,0 +1,39 @@
@model List<ResultTeamDto>
<section class="section novi-background bg-cover section-lg bg-gray-100 text-center" id="team">
<div class="container">
<h3 class="wow fadeInLeft">Ekibimiz</h3>
<h6 class="title-style-1 wow fadeInRight">Başarımızın arkasındaki insanlar</h6>
<div class="owl-carousel" data-items="1" data-sm-items="2" data-md-items="3" data-xl-items="4" data-margin="5" data-dots="true" data-mouse-drag="false">
@foreach (var item in Model)
{
<article class="team-classic wow fadeInUp" data-wow-delay=".1s">
<div class="team-classic-figure">
<img src="@item.ImageUrl" alt="" width="290" height="284" />
</div>
<div class="team-classic-body">
<h5 class="team-classic-name"><a href="#">@item.NameSurname</a></h5>
</div>
<div class="team-classic-footer">
<div class="team-classic-status">@item.Title</div>
<div class="team-classic-list-panel">
<ul class="team-classic-list-social list-inline">
<li>
<a class="icon novi-icon mdi mdi-facebook" href="@item.Facebook" target="_blank"></a>
</li>
<li>
<a class="icon novi-icon mdi mdi-instagram" href="@item.Instagram" target="_blank"></a>
</li>
<li>
<a class="icon novi-icon mdi mdi-linkedin-box" href="@item.Linkedin" target="_blank"></a>
</li>
</ul>
<div class="heading-1 team-classic-placeholder">@item.NameSurname.Split(' ')[0]</div>
</div>
</div>
</article>
}
</div>
</div>
</section>

View File

@@ -0,0 +1,33 @@
@model List<ResultTestimonialDto>
@using ConstructorApp.EntityLayer.Entities
<section class="section novi-background bg-cover section-xl section-inset-2 bg-gray-800 bg-image" style="background-image: url(SeedData/bg-image-1.jpg)">
<div class="container">
<!-- Owl Carousel-->
<div class="owl-carousel owl-style-2" data-loop="true" data-autoplay="true" data-items="1" data-margin="30" data-dots="true" data-mouse-drag="false" data-animation-in="fadeIn" data-animation-out="fadeOut">
@foreach (var item in Model.Where(x => x.Status == TestimonialStatus.Confirmed))
{
<article class="quote-classic">
<div class="quote-classic-text">
<div class="q">@item.Comment</div>
</div>
<div class="unit unit-spacing-md align-items-center text-left d-inline-flex">
<div class="unit-left">
<div class="quote-classic-figure">
<img src="@item.ImageUrl" alt="@item.Name" width="80" height="80" />
</div>
</div>
<div class="unit-body">
<div class="quote-classic-author">@item.Name</div>
<div class="quote-classic-status">@item.Title</div>
</div>
</div>
<div class="quote-classic-decor-wrap">
<div class="quote-classic-decor"></div>
<div class="quote-classic-decor"></div>
</div>
</article>
}
</div>
</div>
</section>

View File

@@ -0,0 +1,51 @@
@model List<ResultWorkProcessDto>
<section class="section novi-background bg-cover section-xl bg-gray-800 decoration-1" id="work-process">
<div class="tabs-custom container" id="tabs-1" data-view-triggerable="true">
<div class="row row-30 row-md-40 justify-content-lg-between">
<div class="col-lg-5">
<h6 class="title-style-1 wow fadeInLeft">Yeni bir eve giden 4 adım</h6>
<h1 class="wow fadeInLeft" data-wow-delay=".05s">Bunu Nasıl<br class="d-none d-lg-block">Yapıyoruz <span class="font-weight-light">?</span></h1>
<!-- Tab Panes -->
<div class="tab-content wow fadeInLeft" data-wow-delay=".1s">
@for (int i = 0; i < Model.Count; i++)
{
var item = Model[i];
<div class="tab-pane fade @(i == 0 ? "show active" : "")" id="tabs-1-@(i+1)">
<h3 class="title-style-1">@item.Title</h3>
@* <p>@item.Info</p> *@
<p>@item.SubTitle</p>
</div>
}
</div>
</div>
<div class="col-lg-7 col-xl-6">
<div class="inset-xl-left-35">
<!-- Tab Navigation -->
<ul class="nav nav-style-1">
@for (int i = 0; i < Model.Count; i++)
{
var item = Model[i];
<li class="nav-item wow blurIn" role="presentation" data-wow-delay=".0@(i * 5)s">
<a class="nav-link @(i == 0 ? "active" : "")" href="#tabs-1-@(i+1)" data-toggle="tab">@item.Info</a>
</li>
}
</ul>
<!-- Images -->
<div class="project-creative wow blurIn">
@for (int i = 0; i < Model.Count; i++)
{
var item = Model[i];
<div class="project-creative-figure @(i == 0 ? "active" : "")" data-view-trigger="#tabs-1-@(i + 1)">
<img src="@item.ImageUrl" alt="" width="531" height="327" />
</div>
}
</div>
</div>
</div>
</div>
</div>
</section>

View File

@@ -0,0 +1,25 @@
@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>

View File

@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - ConstructorAppUI</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/ConstructorAppUI.styles.css" asp-append-version="true" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container-fluid">
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">ConstructorAppUI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
&copy; 2025 - ConstructorAppUI - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>

View File

@@ -0,0 +1,48 @@
/* Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
for details on configuring this project to bundle and minify static web assets. */
a.navbar-brand {
white-space: normal;
text-align: center;
word-break: break-all;
}
a {
color: #0077cc;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.border-top {
border-top: 1px solid #e5e5e5;
}
.border-bottom {
border-bottom: 1px solid #e5e5e5;
}
.box-shadow {
box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
}
button.accept-policy {
font-size: 1rem;
line-height: inherit;
}
.footer {
position: absolute;
bottom: 0;
width: 100%;
white-space: nowrap;
line-height: 60px;
}

View File

@@ -0,0 +1,2 @@
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

View File

@@ -0,0 +1,135 @@
@model CreateSliderDto
@{
ViewData["Title"] = "CreateSlider";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Önce Çıkanlar İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form asp-action="CreateSlider" method="post" enctype="multipart/form-data" id="sliderForm">
<div class="card">
<div class="card-header">
<div class="card-title">Yeni Slider Girişi</div>
</div>
<div class="card-body">
<!-- Lokasyon -->
<div class="form-group row">
<label for="Title" class="col-md-2 col-form-label">Lokasyon</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Location" id="Location">
<span asp-validation-for="Location" class="text-danger"></span>
</div>
</div>
<!-- Sqm -->
<div class="form-group row">
<label for="Sqm" class="col-md-2 col-form-label">Metrekare</label>
<div class="col-md-10">
<textarea rows="1" class="form-control" asp-for="Sqm" id="Sqm"></textarea>
<span asp-validation-for="Sqm" class="text-danger"></span>
</div>
</div>
<!-- Fiyat Açıklama -->
<div class="form-group row">
<label for="PriceInfo" class="col-md-2 col-form-label">Fiyat Açıklama</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="PriceInfo" id="PriceInfo" oninput="formatNumber(this)">
<span asp-validation-for="PriceInfo" class="text-danger"></span>
</div>
</div>
<!-- Görsel -->
<div class="form-group row">
<label for="ImageFile" class="col-md-2 col-form-label">Görsel</label>
<div class="col-md-10">
<input type="file" class="form-control" asp-for="ImageFile" id="ImageFile">
<span asp-validation-for="ImageFile" class="text-danger"></span>
<span class="badge badge-danger">Tema Bütünlüğü için Görsel Boyutu 1339x729 olmaldır.</span>
</div>
</div>
</div>
<div class="card-action">
<div id="errorMessages" class="text-danger mb-3"></div>
<button class="btn btn-success">Kaydet</button>
<a href="/Slider/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@* Fiyat Alanı rakam formatlama *@
<script>
function formatNumber(input) {
let value = input.value.replace(/\D/g, ''); // sadece rakamlar
value = value.replace(/\B(?=(\d{3})+(?!\d))/g, "."); // binlik nokta ayırıcı
input.value = value;
}
</script>
@* Formdaki alanlar boş geçilemesin *@
<script>
document.addEventListener("DOMContentLoaded", function () {
const form = document.getElementById("sliderForm");
const errorDiv = document.getElementById("errorMessages");
const fields = [
{ id: "Location", name: "Lokasyon" },
{ id: "Sqm", name: "Metrekare" },
{ id: "PriceInfo", name: "Fiyat Açıklama" },
{ id: "ImageFile", name: "Görsel" }
];
// Her input için focus olduğunda çerçeveyi temizle
fields.forEach(field => {
const input = document.getElementById(field.id);
input.addEventListener("focus", function () {
input.style.border = "";
errorDiv.innerHTML = ""; // Hataları da temizle (isteğe bağlı)
});
});
// Form submit kontrolü
form.addEventListener("submit", function (e) {
let isValid = true;
let messages = [];
errorDiv.innerHTML = ""; // Önceki mesajları temizle
fields.forEach(field => {
const input = document.getElementById(field.id);
if (input.value.trim() === "") {
isValid = false;
messages.push(`<li>${field.name} alanı boş olamaz.</li>`);
input.style.border = "2px solid red";
}
});
if (!isValid) {
e.preventDefault();
errorDiv.innerHTML = `<ul>${messages.join("")}</ul>`;
}
});
});
</script>
<style>
.input-error {
border: 2px solid red !important;
box-shadow: 0 0 4px rgba(255, 0, 0, 0.5);
}
</style>

View File

@@ -0,0 +1,108 @@
@model List<ResultSliderDto>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
int count = 0;
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Önce Çıkanlar İşlemleri</h4>
<a href="/Slider/CreateSlider/" class="btn btn-outline-primary">Yeni Ekle</a>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<table class="table table-head-bg-success table-striped table-hover">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Lokasyon</th>
<th scope="col">Metrekare</th>
<th scope="col">Fiyat Bilgisi</th>
<th scope="col">Görsel</th>
<th scope="col">İşlemler</th>
</tr>
</thead>
<tbody>
@if (Model == null || !Model.Any())
{
<tr>
<td colspan="3">Kayıt bulunamadı.</td>
</tr>
}
else
{
@foreach (var item in Model)
{
count++;
<tr>
<td>@count</td>
<td>@item.Location</td>
<td>@item.Sqm</td>
<td>@item.PriceInfo</td>
<td>
<img width="75" height="75" src="@item.ImageUrl" alt="Görsel" />
</td>
<td><a href="/Slider/UpdateSlider/@item.SliderID" class="btn btn-outline-success">Güncelle</a>
<button onclick="showDeleteConfirmation('@item.SliderID')" class="btn btn-outline-danger">Sil</button>
</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Delete Confirmation Modal -->
<div class="modal fade" id="deleteConfirmationModal" tabindex="-1" aria-labelledby="deleteConfirmationModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="deleteConfirmationModalLabel">Slider Sil</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
Bu sliderı silmek istediğinize emin misiniz?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">İptal</button>
<form id="deleteForm" method="post">
@Html.AntiForgeryToken()
<button type="submit" class="btn btn-danger">Sil</button>
</form>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
var deleteModal = new bootstrap.Modal(document.getElementById('deleteConfirmationModal'));
var deleteForm = document.getElementById('deleteForm');
// Delete modal açma işlevi
window.showDeleteConfirmation = function (sliderId) {
deleteForm.action = "/Slider/DeleteSlider/" + sliderId;
deleteModal.show();
};
// Modal'ın kapanma işlevi için data-bs-dismiss kullanımını kontrol edin
document.querySelectorAll('[data-bs-dismiss="modal"]').forEach(function (element) {
element.addEventListener('click', function () {
deleteModal.hide();
});
});
});
</script>

View File

@@ -0,0 +1,129 @@
@model UpdateSliderDto
@{
ViewData["Title"] = "UpdateSlider";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Önce Çıkanlar İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form method="post" enctype="multipart/form-data" id="sliderForm">
<div class="card">
<div class="card-header">
<div class="card-title">Slider Güncelleme</div>
</div>
<input type="hidden" asp-for="SliderID" />
<div class="card-body">
<div class="form-group row">
<label for="Location" class="col-md-2 col-form-label">Lokasyon</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Location" id="Location">
<span asp-validation-for="Location" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Sqm" class="col-md-2 col-form-label">Metrekare</label>
<div class="col-md-10">
<textarea rows="1" class="form-control" asp-for="Sqm" id="Sqm"></textarea>
<span asp-validation-for="Sqm" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="PriceInfo" class="col-md-2 col-form-label">Fiyat Açıklama</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="PriceInfo" id="PriceInfo" oninput="formatNumber(this)">
<span asp-validation-for="PriceInfo" class="text-danger"></span>
</div>
</div>
<!-- Görsel -->
<div class="form-group row">
<label for="ImageFile" class="col-md-2 col-form-label">Görsel</label>
<div class="col-md-10">
<span class="badge badge-danger">Tema Bütünlüğü için Görsel Boyutu 1339x729 olmaldır.</span>
<input type="file" class="form-control" name="ImageFile" id="ImageFile">
@if (!string.IsNullOrEmpty(Model.ImageUrl))
{
<img src="@Model.ImageUrl" alt="Görsel" class="img-fluid mt-2" style="width: 100px; height: 100px;">
}
</div>
</div>
</div>
<div class="card-action">
<div id="errorMessages" class="text-danger mb-3"></div>
<button class="btn btn-success">Kaydet</button>
<a href="/Slider/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@* Fiyat Alanı rakam formatlama *@
<script>
function formatNumber(input) {
let value = input.value.replace(/\D/g, ''); // sadece rakamlar
value = value.replace(/\B(?=(\d{3})+(?!\d))/g, "."); // binlik nokta ayırıcı
input.value = value;
}
</script>
@* Formdaki alanlar boş geçilemesin *@
<script>
document.addEventListener("DOMContentLoaded", function () {
const form = document.getElementById("sliderForm");
const errorDiv = document.getElementById("errorMessages");
const fields = [
{ id: "Location", name: "Lokasyon" },
{ id: "Sqm", name: "Metrekare" },
{ id: "PriceInfo", name: "Fiyat Açıklama" }
];
// Her input için focus olduğunda çerçeveyi temizle
fields.forEach(field => {
const input = document.getElementById(field.id);
input.addEventListener("focus", function () {
input.style.border = "";
errorDiv.innerHTML = ""; // Hataları da temizle (isteğe bağlı)
});
});
// Form submit kontrolü
form.addEventListener("submit", function (e) {
let isValid = true;
let messages = [];
errorDiv.innerHTML = ""; // Önceki mesajları temizle
fields.forEach(field => {
const input = document.getElementById(field.id);
if (input.value.trim() === "") {
isValid = false;
messages.push(`<li>${field.name} alanı boş olamaz.</li>`);
input.style.border = "2px solid red";
}
});
if (!isValid) {
e.preventDefault();
errorDiv.innerHTML = `<ul>${messages.join("")}</ul>`;
}
});
});
</script>
<style>
.input-error {
border: 2px solid red !important;
box-shadow: 0 0 4px rgba(255, 0, 0, 0.5);
}
</style>

View File

@@ -0,0 +1,135 @@
@model CreateTeamDto
@{
ViewData["Title"] = "CreateTeam";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Ekibimiz İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form asp-action="CreateTeam" method="post" enctype="multipart/form-data" id="sliderForm">
<div class="card">
<div class="card-header">
<div class="card-title">Yeni Ekip Üye Girişi</div>
</div>
<div class="card-body">
<div class="form-group row">
<label for="NameSurname" class="col-md-2 col-form-label">Adı Soyadı</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="NameSurname" id="NameSurname">
<span asp-validation-for="NameSurname" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Title" class="col-md-2 col-form-label">Ünvanı</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Title" id="Title">
<span asp-validation-for="Title" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Facebook" class="col-md-2 col-form-label">Facebook</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Facebook" id="Facebook">
<span asp-validation-for="Facebook" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Instagram" class="col-md-2 col-form-label">Instagram</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Instagram" id="Instagram">
<span asp-validation-for="Instagram" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Linkedin" class="col-md-2 col-form-label">Linkedin</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Linkedin" id="Linkedin">
<span asp-validation-for="Linkedin" class="text-danger"></span>
</div>
</div>
<!-- Görsel -->
<div class="form-group row">
<label for="ImageFile" class="col-md-2 col-form-label">Görsel</label>
<div class="col-md-10">
<input type="file" class="form-control" asp-for="ImageFile" id="ImageFile">
<span asp-validation-for="ImageFile" class="text-danger"></span>
<span class="badge badge-danger">Tema Bütünlüğü için Görsel Boyutu 290x284 olmaldır.</span>
</div>
</div>
</div>
<div class="card-action">
<div id="errorMessages" class="text-danger mb-3"></div>
<button class="btn btn-success">Kaydet</button>
<a href="/Team/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@* Formdaki alanlar boş geçilemesin *@
<script>
document.addEventListener("DOMContentLoaded", function () {
const form = document.getElementById("sliderForm");
const errorDiv = document.getElementById("errorMessages");
const fields = [
{ id: "NameSurname", name: "Adı Soyadı" },
{ id: "Title", name: "Ünvan" },
{ id: "ImageFile", name: "Görsel" }
];
// Her input için focus olduğunda çerçeveyi temizle
fields.forEach(field => {
const input = document.getElementById(field.id);
input.addEventListener("focus", function () {
input.style.border = "";
errorDiv.innerHTML = ""; // Hataları da temizle (isteğe bağlı)
});
});
// Form submit kontrolü
form.addEventListener("submit", function (e) {
let isValid = true;
let messages = [];
errorDiv.innerHTML = ""; // Önceki mesajları temizle
fields.forEach(field => {
const input = document.getElementById(field.id);
if (input.value.trim() === "") {
isValid = false;
messages.push(`<li>${field.name} alanı boş olamaz.</li>`);
input.style.border = "2px solid red";
}
});
if (!isValid) {
e.preventDefault();
errorDiv.innerHTML = `<ul>${messages.join("")}</ul>`;
}
});
});
</script>
<style>
.input-error {
border: 2px solid red !important;
box-shadow: 0 0 4px rgba(255, 0, 0, 0.5);
}
</style>

View File

@@ -0,0 +1,115 @@
@model List<ResultTeamDto>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
int count = 0;
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Ekibimiz İşlemleri</h4>
<a href="/Team/CreateTeam/" class="btn btn-outline-primary">Yeni Ekle</a>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<table class="table table-head-bg-success table-striped table-hover">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Adı Soyadı</th>
<th scope="col">Ünvanı</th>
<th scope="col">Facebook</th>
<th scope="col">Instagram</th>
<th scope="col">Linkedin</th>
<th scope="col">Görsel</th>
<th scope="col">İşlemler</th>
</tr>
</thead>
<tbody>
@if (Model == null || !Model.Any())
{
<tr>
<td colspan="3">Kayıt bulunamadı.</td>
</tr>
}
else
{
@foreach (var item in Model)
{
count++;
<tr>
<td>@count</td>
<td>@item.NameSurname</td>
<td>@item.Title</td>
<td>@item.Facebook</td>
<td>@item.Instagram</td>
<td>@item.Linkedin</td>
<td>
<img width="75" height="75" src="@item.ImageUrl" alt="Görsel" />
</td>
<td>
<a href="/Team/UpdateTeam/@item.TeamID" class="btn btn-outline-success">Güncelle</a>
<button onclick="showDeleteConfirmation('@item.TeamID')" class="btn btn-outline-danger">Sil</button>
</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Delete Confirmation Modal -->
<div class="modal fade" id="deleteConfirmationModal" tabindex="-1" aria-labelledby="deleteConfirmationModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="deleteConfirmationModalLabel">Ekip Üyesi Sil</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
Bu ekip üyesini silmek istediğinize emin misiniz?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">İptal</button>
<form id="deleteForm" method="post">
@Html.AntiForgeryToken()
<button type="submit" class="btn btn-danger">Sil</button>
</form>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
var deleteModal = new bootstrap.Modal(document.getElementById('deleteConfirmationModal'));
var deleteForm = document.getElementById('deleteForm');
// Delete modal açma işlevi
window.showDeleteConfirmation = function (teamId) {
deleteForm.action = "/Team/DeleteTeam/" + teamId;
deleteModal.show();
};
// Modal'ın kapanma işlevi için data-bs-dismiss kullanımını kontrol edin
document.querySelectorAll('[data-bs-dismiss="modal"]').forEach(function (element) {
element.addEventListener('click', function () {
deleteModal.hide();
});
});
});
</script>

View File

@@ -0,0 +1,135 @@
@model UpdateTeamDto
@{
ViewData["Title"] = "UpdateTeam";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Ekibimiz İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form method="post" enctype="multipart/form-data" id="sliderForm">
<div class="card">
<div class="card-header">
<div class="card-title">Ekip Üyesi Güncelleme</div>
</div>
<input type="hidden" asp-for="TeamID" />
<div class="card-body">
<div class="form-group row">
<label for="NameSurname" class="col-md-2 col-form-label">Adı Soyadı</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="NameSurname" id="NameSurname">
<span asp-validation-for="NameSurname" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Title" class="col-md-2 col-form-label">Ünvanı</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Title" id="Title">
<span asp-validation-for="Title" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Facebook" class="col-md-2 col-form-label">Facebook</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Facebook" id="Facebook">
<span asp-validation-for="Facebook" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Instagram" class="col-md-2 col-form-label">Instagram</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Instagram" id="Instagram">
<span asp-validation-for="Instagram" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Linkedin" class="col-md-2 col-form-label">Linkedin</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Linkedin" id="Linkedin">
<span asp-validation-for="Linkedin" class="text-danger"></span>
</div>
</div>
<!-- Görsel -->
<div class="form-group row">
<label for="ImageFile" class="col-md-2 col-form-label">Görsel</label>
<div class="col-md-10">
<span class="badge badge-danger">Tema Bütünlüğü için Görsel Boyutu 290x284 olmaldır.</span>
<input type="file" class="form-control" name="ImageFile" id="ImageFile">
@if (!string.IsNullOrEmpty(Model.ImageUrl))
{
<img src="@Model.ImageUrl" alt="Görsel" class="img-fluid mt-2" style="width: 100px; height: 100px;">
}
</div>
</div>
</div>
<div class="card-action">
<div id="errorMessages" class="text-danger mb-3"></div>
<button class="btn btn-success">Kaydet</button>
<a href="/Team/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@* Formdaki alanlar boş geçilemesin *@
<script>
document.addEventListener("DOMContentLoaded", function () {
const form = document.getElementById("sliderForm");
const errorDiv = document.getElementById("errorMessages");
const fields = [
{ id: "NameSurname", name: "Adı Soyadı" },
{ id: "Title", name: "Ünvan" },
];
// Her input için focus olduğunda çerçeveyi temizle
fields.forEach(field => {
const input = document.getElementById(field.id);
input.addEventListener("focus", function () {
input.style.border = "";
errorDiv.innerHTML = ""; // Hataları da temizle (isteğe bağlı)
});
});
// Form submit kontrolü
form.addEventListener("submit", function (e) {
let isValid = true;
let messages = [];
errorDiv.innerHTML = ""; // Önceki mesajları temizle
fields.forEach(field => {
const input = document.getElementById(field.id);
if (input.value.trim() === "") {
isValid = false;
messages.push(`<li>${field.name} alanı boş olamaz.</li>`);
input.style.border = "2px solid red";
}
});
if (!isValid) {
e.preventDefault();
errorDiv.innerHTML = `<ul>${messages.join("")}</ul>`;
}
});
});
</script>
<style>
.input-error {
border: 2px solid red !important;
box-shadow: 0 0 4px rgba(255, 0, 0, 0.5);
}
</style>

View File

@@ -0,0 +1,63 @@
@model CreateTestimonialDto
@{
ViewData["Title"] = "CreateTestimonial";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Müşteri Yorumları İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form asp-action="CreateTestimonial" method="post" enctype="multipart/form-data">
<div class="card">
<div class="card-header">
<div class="card-title">Yeni Müşteri Yorumu Girişi</div>
</div>
<div class="card-body">
<div class="form-group row">
<label for="Name" class="col-md-2 col-form-label">Adı/Soyadı</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Name" id="Name">
<span asp-validation-for="Name" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Title" class="col-md-2 col-form-label">Ünvanı</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Title" id="Title">
<span asp-validation-for="Title" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Comment" class="col-md-2 col-form-label">Yorum</label>
<div class="col-md-10">
<textarea rows="5" class="form-control" asp-for="Comment" id="Comment"></textarea>
<span asp-validation-for="Comment" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="ImageFile" class="col-md-2 col-form-label">Görsel</label>
<div class="col-md-10">
<input type="file" class="form-control" asp-for="ImageFile" id="ImageFile">
<span asp-validation-for="ImageFile" class="text-danger"></span>
<span class="badge badge-danger">Görsel Boyutu 80x80 olmaldır.</span>
</div>
</div>
</div>
<div class="card-action">
<button class="btn btn-success">Kaydet</button>
<a href="/Testimonial/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,107 @@
@using ConstructorApp.EntityLayer.Entities
@model List<ResultTestimonialDto>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
int count = 0;
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Müşterilerden Gelenler İşlemleri</h4>
<a href="/Testimonial/CreateTestimonial/" class="btn btn-outline-primary">Yeni Ekle</a>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<table class="table table-head-bg-success table-striped table-hover">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Adı Soyadı</th>
<th scope="col">Ünvanı</th>
<th scope="col">Yorum</th>
<th scope="col">Görsel</th>
<th scope="col">Durumu</th>
<th scope="col">İşlemler</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
count++;
<tr>
<td>@count</td>
<td>@item.Name</td>
<td>@item.Title</td>
<td>@item.Comment</td>
<td>
<img width="75" height="75" src="@item.ImageUrl" alt="Görsel" />
</td>
<td>
<span class="badge @(item.Status == TestimonialStatus.Confirmed ? "bg-success text-white" : item.Status == TestimonialStatus.Cancelled ? "bg-danger text-white" : "bg-secondary text-white")">
@(item.Status == TestimonialStatus.Confirmed ? "Gösterimde" : item.Status == TestimonialStatus.Cancelled ? "Gösterimden Kaldırıldı" : "Onay Bekliyor")
</span>
</td>
<td>
<a href="/Testimonial/UpdateTestimonial/@item.TestimonialID" class="btn btn-outline-success">Güncelle</a>
<a href="/Testimonial/TestimonialStatusActive/@item.TestimonialID" class="btn btn-outline-info @(item.Status == TestimonialStatus.Confirmed ? "disabled" : "")">Onay</a>
<a href="/Testimonial/TestimonialStatusPassive/@item.TestimonialID" class="btn btn-outline-dark @(item.Status == TestimonialStatus.Cancelled ? "disabled" : "")">Pasif</a>
<button onclick="showDeleteConfirmation('@item.TestimonialID')" class="btn btn-outline-danger">Sil</button>
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Delete Confirmation Modal -->
<div class="modal fade" id="deleteConfirmationModal" tabindex="-1" aria-labelledby="deleteConfirmationModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="deleteConfirmationModalLabel">Müşteri Yorumu Sil</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
Bu müşteri yorumunu silmek istediğinize emin misiniz?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">İptal</button>
<form id="deleteForm" method="post">
@Html.AntiForgeryToken()
<button type="submit" class="btn btn-danger">Sil</button>
</form>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
var deleteModal = new bootstrap.Modal(document.getElementById('deleteConfirmationModal'));
var deleteForm = document.getElementById('deleteForm');
// Delete modal açma işlevi
window.showDeleteConfirmation = function (productId) {
deleteForm.action = "/Testimonial/DeleteTestimonial/" + productId;
deleteModal.show();
};
// Modal'ın kapanma işlevi için data-bs-dismiss kullanımını kontrol edin
document.querySelectorAll('[data-bs-dismiss="modal"]').forEach(function (element) {
element.addEventListener('click', function () {
deleteModal.hide();
});
});
});
</script>

View File

@@ -0,0 +1,64 @@
@model UpdateTestimonialDto
@{
ViewData["Title"] = "UpdateTestimonial";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Müşteri Yorumları İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form method="post" enctype="multipart/form-data">
<div class="card">
<div class="card-header">
<div class="card-title">Yorum Güncelleme</div>
</div>
<input type="hidden" asp-for="TestimonialID" />
<div class="card-body">
<div class="form-group row">
<label for="Name" class="col-md-2 col-form-label">Adı/Soyadı</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Name" id="Name">
<span asp-validation-for="Name" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Title" class="col-md-2 col-form-label">Ünvanı</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Title" id="Title">
<span asp-validation-for="Title" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Comment" class="col-md-2 col-form-label">Yorum</label>
<div class="col-md-10">
<textarea rows="5" class="form-control" asp-for="Comment" id="Comment"></textarea>
<span asp-validation-for="Comment" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="ImageFile" class="col-md-2 col-form-label">Görsel</label>
<div class="col-md-10">
<input type="file" class="form-control" name="ImageFile" id="ImageFile">
@if (!string.IsNullOrEmpty(Model.ImageUrl))
{
<img src="@Model.ImageUrl" alt="Görsel" class="img-fluid mt-2" style="width: 100px; height: 100px;">
}
</div>
<span class="badge badge-danger">Görsel Boyutu 80x80 olmaldır.</span>
</div>
</div>
<div class="card-action">
<button class="btn btn-success">Kaydet</button>
<a href="/Testimonial/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,68 @@
@using ConstructorApp.DtoLayer.AppUserDto
@model AppUserEditDto
@{
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Admin Profil Ayarları</h4>
<div class="row">
<div class="col-md-12">
<form method="post">
<div class="card">
<div class="card-header">
<div class="card-title">Şifre Güncelleme Sayfası</div>
</div>
<div class="card-body">
<div class="row">
<!-- Sol Taraf: UserName, Mevcut Şifre, Yeni Şifre ve Şifre Onayı -->
<div class="col-md-6">
<div class="form-group">
<label for="UserName">Kullanıcı Adınız</label>
<input type="text" class="form-control" asp-for="UserName" id="UserName" readonly>
</div>
<div class="form-group">
<label for="CurrentPassword">Mevcut Şifreniz</label>
<input type="password" class="form-control" asp-for="CurrentPassword" id="CurrentPassword" placeholder="Mevcut şifrenizi giriniz">
</div>
<div class="form-group">
<label for="Password">Yeni Şifreniz</label>
<input type="password" class="form-control" asp-for="Password" id="Password" placeholder="Yeni şifrenizi giriniz">
</div>
<div class="form-group">
<label for="ConfirmPassword">Yeni Şifrenizi Onaylayınız</label>
<input type="password" class="form-control" asp-for="ConfirmPassword" id="ConfirmPassword" placeholder="Yeni şifrenizi tekrar giriniz">
</div>
</div>
</div>
<!-- Hata Mesajlarını Göster -->
<div>
@if (!ViewData.ModelState.IsValid)
{
<div class="alert alert-danger">
@foreach (var error in ViewData.ModelState.Values.SelectMany(v => v.Errors))
{
<p>@error.ErrorMessage</p>
}
</div>
}
</div>
</div>
<div class="card-action">
<button class="btn btn-success">Kaydet</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@section Scripts {
}

View File

@@ -0,0 +1,73 @@
@model List<ResultWorkProcessDto>
@{
ViewData["Title"] = "Index";
Layout = "~/Views/AdminLayout/Index.cshtml";
int count = 0;
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Çalışma Şeklimiz İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<table class="table table-head-bg-success table-striped table-hover">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Kısa Açıklama</th>
<th scope="col">Başlık</th>
<th scope="col">Uzun Açıklama</th>
<th scope="col">Görsel</th>
<th scope="col">İşlemler</th>
</tr>
</thead>
<tbody>
@if (Model == null || !Model.Any())
{
<tr>
<td colspan="3">Kayıt bulunamadı.</td>
</tr>
}
else
{
@foreach (var item in Model)
{
count++;
<tr>
<td>@count</td>
<td>@item.Info</td>
<td>@item.Title</td>
<td>@item.SubTitle</td>
<td>
<img width="75" height="75" src="@item.ImageUrl" alt="Görsel" />
</td>
<td>
<span class="badge @(item.IsActive? "bg-success text-white" : "bg-secondary text-white")">
@(item.IsActive ? "Aktif" : "Pasif")
</span>
</td>
<td>
<a href="/WorkProcess/UpdateWorkProcess/@item.WorkProcessID" class="btn btn-outline-success">Güncelle</a>
<a href="/WorkProcess/ServiceStatusActive/@item.WorkProcessID" class="btn btn-outline-info @(item.IsActive == true ? "disabled" : "")">Aktif</a>
<a href="/WorkProcess/ServiceStatusPassive/@item.WorkProcessID" class="btn btn-outline-dark @(item.IsActive == false ? "disabled" : "")">Pasif</a>
</td>
</tr>
}
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,64 @@
@model UpdateWorkProcessDto
@{
ViewData["Title"] = "UpdateWorkProcess";
Layout = "~/Views/AdminLayout/Index.cshtml";
}
<div class="content">
<div class="container-fluid">
<h4 class="page-title">Ana Sayfa Çalışma Şeklimiz İşlemleri</h4>
<div class="row">
<div class="col-md-12">
<form method="post" enctype="multipart/form-data">
<div class="card">
<div class="card-header">
<div class="card-title">Çalışma Şekli Güncelleme</div>
</div>
<input type="hidden" asp-for="WorkProcessID" />
<input type="hidden" asp-for="IsActive" />
<div class="card-body">
<div class="form-group row">
<label for="Location" class="col-md-2 col-form-label">Lokasyon</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Info" id="Lokasyon">
<span asp-validation-for="Info" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="Title" class="col-md-2 col-form-label">Başlık</label>
<div class="col-md-10">
<input type="text" class="form-control" asp-for="Title" id="Title">
<span asp-validation-for="Title" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<label for="SubTitle" class="col-md-2 col-form-label">Uzun Açıklama</label>
<div class="col-md-10">
<textarea rows="5" class="form-control" asp-for="SubTitle" id="SubTitle"></textarea>
<span asp-validation-for="SubTitle" class="text-danger"></span>
</div>
</div>
<!-- Görsel -->
<div class="form-group row">
<label for="ImageFile" class="col-md-2 col-form-label">Görsel</label>
<div class="col-md-10">
<span class="badge badge-danger">Tema Bütünlüğü için Görsel Boyutu 531x327 olmaldır.</span>
<input type="file" class="form-control" name="ImageFile" id="ImageFile">
@if (!string.IsNullOrEmpty(Model.ImageUrl))
{
<img src="@Model.ImageUrl" alt="Görsel" class="img-fluid mt-2" style="width: 100px; height: 100px;">
}
</div>
</div>
</div>
<div class="card-action">
<div id="errorMessages" class="text-danger mb-3"></div>
<button class="btn btn-success">Kaydet</button>
<a href="/WorkProcess/Index/" class="btn btn-warning ml-2">Listeye Dön</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,16 @@
@using ConstructorAppUI
@using ConstructorAppUI.Models
@using ConstructorAppUI.Dtos.HomeBannerDtos
@using ConstructorAppUI.Dtos.SliderDtos
@using ConstructorAppUI.Dtos.ServiceDtos
@using ConstructorAppUI.Dtos.WorkProcessDtos
@using ConstructorAppUI.Dtos.TeamDtos
@using ConstructorAppUI.Dtos.CompanyInfoDtos
@using ConstructorAppUI.Dtos.CompanyInfoVideoDtos
@using ConstructorAppUI.Dtos.ProjectDtos
@using ConstructorAppUI.Dtos.ProjectGalleryDtos
@using ConstructorAppUI.Dtos.TestimonialDtos
@using ConstructorAppUI.Dtos.ReferenceDtos
@using ConstructorAppUI.Dtos.ContactUsDtos
@using ConstructorAppUI.Dtos.FooterDtos
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

View File

@@ -0,0 +1,3 @@
@{
Layout = "_Layout";
}