This commit is contained in:
Yasin İLKAYA 2025-12-20 23:52:49 +03:00
parent 316d242297
commit 8b3e047831
16 changed files with 1063 additions and 519 deletions

View File

@ -1,17 +0,0 @@
const {Application} = require("../core/server");
const Joi = require("joi");
const { PostDataProcess } = require("../core/postdata");
const User = require("../database/user");
const { MiddlewareAuth } = require("./auth");
Application.get("/panel", MiddlewareAuth,PanelPage);
/**
* @param {import("express").Request} request
* @param {import("express").Response} response
*/
async function PanelPage(request, response)
{
response.render("panel");
}

87
controllers/catalog.js Normal file
View File

@ -0,0 +1,87 @@
const {Application} = require("../core/server");
const Joi = require("joi");
const { PostDataProcess } = require("../core/postdata");
const User = require("../database/user");
const { MiddlewareAuth } = require("./auth");
const express = require("express");
const { countCatalogs, getCatalogs, createCatalog } = require("../database/catalog");
Application.get("/catalogs", MiddlewareAuth,CatalogPage);
/**
* @param {import("express").Request} request
* @param {import("express").Response} response
*/
async function CatalogPage(request, response)
{
response.render("panel/catalogs");
}
Application.post("/catalog/list", MiddlewareAuth, express.urlencoded({extended: true}), CatalogsList);
/**
* @param {import("express").Request} request
* @param {import("express").Response} response
*/
async function CatalogsList(request, response)
{
let start = request.body.start ?? 0;
let length = request.body.length ?? 100;
let term = request.body.search?.value ?? null;
let count = await countCatalogs(request.session.user_id, term);
let data = await getCatalogs(request.session.user_id,start,length, term);
response.json({
"draw": request.body.draw | 0,
"recordsTotal": count,
"recordsFiltered" : count,
"length": 0,
"data": data
});
}
Application.post("/catalog/store", MiddlewareAuth, PostDataProcess(), CatalogStore);
/**
* @param {import("express").Request} request
* @param {import("express").Response} response
*/
async function CatalogStore(request, response)
{
const error = catalogStoreValidation(request.body);
if(error)
{
return response.status(400).json({
status: "fail",
message: error.message
});
}
try{
await createCatalog(
request.session.user_id,
request.body.name,
request.body.score,
request.body.description
);
return response.status(200).json({
status: "success"
});
}catch(err){
console.log(err)
return response.status(500).json({
status: "fail"
});
}
}
function catalogStoreValidation(body)
{
const schema = Joi.object({
id: Joi.number().min(1),
name: Joi.string().min(3).max(200).required().error(new Error('Adı en az 3 karakter ve zorunludur')),
score: Joi.number().min(1).allow('', null).error(new Error('Soyadı formatı hatalı')),
description: Joi.string().allow('', null)
});
const {error} = schema.validate(body);
return error;
}

163
controllers/students.js Normal file
View File

@ -0,0 +1,163 @@
const {Application} = require("../core/server");
const Joi = require("joi");
const { PostDataProcess } = require("../core/postdata");
const User = require("../database/user");
const { MiddlewareAuth } = require("./auth");
const { createStudent, getStudents, countStudents, updateStudent } = require("../database/student");
const express = require("express");
Application.get("/panel", MiddlewareAuth,PanelPage);
/**
* @param {import("express").Request} request
* @param {import("express").Response} response
*/
async function PanelPage(request, response)
{
response.render("panel/panel");
}
Application.post("/user/profile", MiddlewareAuth,ApiUserProfile);
/**
* @param {import("express").Request} request
* @param {import("express").Response} response
*/
async function ApiUserProfile(request, response)
{
let name = request.session.user.name;
let surname = request.session.user.surname;
response.json({
status: "active",
name,
surname
});
}
Application.get("/students", MiddlewareAuth,StudentsPage);
/**
* @param {import("express").Request} request
* @param {import("express").Response} response
*/
async function StudentsPage(request, response)
{
response.render("panel/students");
}
Application.post("/students/store", MiddlewareAuth, PostDataProcess(), StudentStore);
/**
* @param {import("express").Request} request
* @param {import("express").Response} response
*/
async function StudentStore(request, response)
{
const error = studentStoreValidation(request.body);
if(error)
{
return response.status(400).json({
status: "fail",
message: error.message
});
}
try{
await createStudent(
request.session.user_id,
request.body.name,
request.body.surname,
request.body.studentno,
request.body.email,
request.body.gender,
request.body.birthdate || null,
request.body.description
);
return response.status(200).json({
status: "success"
});
}catch(err){
console.log(err)
return response.status(500).json({
status: "fail"
});
}
}
Application.post("/students/update", MiddlewareAuth, PostDataProcess(), StudentUpdate);
/**
* @param {import("express").Request} request
* @param {import("express").Response} response
*/
async function StudentUpdate(request, response)
{
const error = studentStoreValidation(request.body);
if(error)
{
return response.status(400).json({
status: "fail",
message: error.message
});
}
try{
await updateStudent(
request.body.id,
request.session.user_id,
request.body.name,
request.body.surname,
request.body.studentno,
request.body.email,
request.body.gender,
request.body.birthdate || null,
request.body.description
);
return response.status(200).json({
status: "success"
});
}catch(err){
console.log(err)
return response.status(500).json({
status: "fail"
});
}
}
Application.post("/students/list", MiddlewareAuth, express.urlencoded({extended: true}), StudentList);
/**
* @param {import("express").Request} request
* @param {import("express").Response} response
*/
async function StudentList(request, response)
{
let start = request.body.start ?? 0;
let length = request.body.length ?? 100;
let term = request.body.search?.value ?? null;
let count = await countStudents(request.session.user_id, term);
let data = await getStudents(request.session.user_id,start,length, term);
response.json({
"draw": request.body.draw | 0,
"recordsTotal": count,
"recordsFiltered" : count,
"data": data
});
}
function studentStoreValidation(body)
{
const schema = Joi.object({
id: Joi.number().min(1),
name: Joi.string().min(3).max(200).required().error(new Error('Adı en az 3 karakter ve zorunludur')),
surname: Joi.string().max(200).allow('', null).error(new Error('Soyadı formatı hatalı')),
studentno: Joi.string().max(200).allow('', null).error(new Error('Numara formatı hatalı')),
email: Joi.string().email().max(200).allow('', null).error(new Error('E-posta adresi geçersiz')),
birthdate: Joi.date().iso().allow('', null).error(new Error('Doğum tarihi geçersiz')),
gender: Joi.string().valid('male', 'female', 'Belirtilmemiş').allow('', null).error(new Error('Cinsiyet seçimi hatalı')),
description: Joi.string().allow('', null)
});
const {error} = schema.validate(body);
return error;
}

View File

@ -5,7 +5,10 @@ const storage = multer.memoryStorage();
const upload = multer({
storage: storage,
limits: { fileSize: 5 * 1024 * 1024 } // Örn: Max 5MB sınırı
limits: {
fileSize: 5 * 1024 * 1024,
fieldNameSize: 200
}
});
exports.PostDataProcess = () => upload.none();

72
database/catalog.js Normal file
View File

@ -0,0 +1,72 @@
const crypto = require("node:crypto");
const DB = require("./connection");
exports.createCatalog = createCatalog;
exports.getCatalogs = getCatalogs;
exports.countCatalogs = countCatalogs;
exports.updateCatalog = updateCatalog;
async function createCatalog(
owner_id,
name,
score,
description
)
{
const [id] = await DB.table("events")
.insert({
owner_id,
name,
score,
description
})
.returning("id");
return id;
}
async function updateCatalog(
id,
owner_id,
name,
score,
description
)
{
await DB.table("events")
.where("id",id)
.where("owner_id", owner_id)
.update({
name,
score,
description
});
}
async function getCatalogs(
owner_id,
offset,
limit,
searchTerm
)
{
return await DB.table("events")
.where("owner_id",owner_id)
.whereNull("deleted_at")
.where("name","like",`%${searchTerm ?? ""}%`)
.limit(limit)
.offset(offset);
}
async function countCatalogs(owner_id, searchTerm)
{
return (
await DB.table("events")
.where("owner_id",owner_id)
.whereNull("deleted_at")
.where("name","like",`%${searchTerm ?? ""}%`)
.count("id as total")
.first()
).total;
}

View File

@ -11,7 +11,7 @@ exports.up = function(knex) {
table.string("studentno").nullable();
table.string("email").nullable();
table.string("gender").nullable();
table.dateTime("bithdate").nullable();
table.dateTime("birthdate").nullable();
table.text("description").nullable();
table.dateTime("created_at").defaultTo(knex.fn.now());;

88
database/student.js Normal file
View File

@ -0,0 +1,88 @@
const crypto = require("node:crypto");
const DB = require("./connection");
exports.createStudent = createStudent;
exports.getStudents = getStudents;
exports.countStudents = countStudents;
exports.updateStudent = updateStudent;
async function createStudent(
owner_id,
name,
surname,
studentno,
email,
gender,
birthdate,
description
)
{
const [id] = await DB.table("students")
.insert({
owner_id,
name,
surname,
studentno,
email,
gender,
birthdate,
description
})
.returning("id");
return id;
}
async function updateStudent(
id,
owner_id,
name,
surname,
studentno,
email,
gender,
birthdate,
description
)
{
await DB.table("students")
.where("id",id)
.where("owner_id", owner_id)
.update({
name,
surname,
studentno,
email,
gender,
birthdate,
description
});
}
async function getStudents(
owner_id,
offset,
limit,
searchTerm
)
{
return await DB.table("students")
.where("owner_id",owner_id)
.whereNull("deleted_at")
.where("name","like",`%${searchTerm ?? ""}%`)
.limit(limit)
.offset(offset);
}
async function countStudents(owner_id, searchTerm)
{
return (
await DB.table("students")
.where("owner_id",owner_id)
.whereNull("deleted_at")
.where("name","like",`%${searchTerm ?? ""}%`)
.count("id as total")
.first()
).total;
}

View File

@ -5,5 +5,6 @@ require("./core/static");
require("./database/session");
require("./controllers/auth");
require("./controllers/backend");
require("./controllers/students");
require("./controllers/catalog");
require("./controllers/fallback");

View File

@ -12108,19 +12108,6 @@ nav .app-logo .profile-menu-dropdown .dropdown-menu {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
transform: translate(32px, -70px) !important;
}
nav .app-logo .profile-menu-dropdown .dropdown-menu:before {
content: "";
width: 15px;
height: 15px;
background: rgba(var(--white), 1);
border-left: 1px solid rgba(var(--secondary), 0.4);
border-bottom: 1px solid rgba(var(--secondary), 0.4);
position: absolute;
top: 73px;
left: -8px;
transform: rotate(45deg);
}
nav .app-nav {
height: calc(100% - 162px);
@ -12665,7 +12652,7 @@ div .semi-nav ~ footer {
width: 100%;
height: 100%;
transition: var(--app-transition);
box-shadow: var(--box-shadow);
/*box-shadow: var(--box-shadow);*/
overflow: hidden;
}
.app-wrapper .app-content .container-xxl {
@ -34725,9 +34712,9 @@ body.dark nav .app-logo .logo img {
}
}
@media screen and (max-width: 576px) {
nav .app-logo .profile-menu-dropdown .dropdown-menu {
/*nav .app-logo .profile-menu-dropdown .dropdown-menu {
transform: translate(-28px, -70px) !important;
}
}*/
nav .app-logo .profile-menu-dropdown .dropdown-menu:before {
left: auto;
right: -8px;

View File

@ -1,15 +0,0 @@
<%-include("./partials/header.ejs") %>
<div class="app-wrapper default">
<%-include("./partials/sidebar.ejs") %>
<div class="app-content">
<%-include("./partials/navbar.ejs") %>
</div>
<main>
<h1>Merhaba</h1>
</main>
</div>
<%-include("./partials/footer.ejs") %>

273
views/panel/catalogs.ejs Normal file
View File

@ -0,0 +1,273 @@
<%-include("../partials/header.ejs") %>
<%-include("../partials/sidebar.ejs") %>
<div class="app-content">
<%-include("../partials/navbar.ejs") %>
<main>
<div class="container-fluid">
<!-- Breadcrumb start -->
<div class="row m-1">
<div class="col-12">
<h4 class="main-title">Puan Kataloğu</h4>
<p>
Öğrencileri değerlendireceğiniz kategorileri belirleyin
</p>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="card ">
<div class="card-header ">
<div class="d-flex flex-row flex-1">
<h5 class="flex-fill">
Puan Kataloğu listesi
</h5>
<div class="flex-min">
<button class="btn btn-success" data-bs-target="#add_student" data-bs-toggle="modal" type="button">
<i class="fa fa-plus"></i>
Puan Kataloğu ekle
</button>
</div>
</div>
</div>
<div class="card-body p-0">
<div class="app-datatable-default overflow-auto">
<table class="table display app-data-table default-data-table" id="cataloglist"></table>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
</div>
<div aria-hidden="true" class="modal fade" id="add_student" tabindex="-1">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Yeni Katalog Ekle</h5>
<button aria-label="Close" class="btn-close m-0 fs-5" data-bs-dismiss="modal" type="button"></button>
</div>
<form class="modal-body" id="catalogaveform" onsubmit="saveStudent(this);return false;">
<div class="row app-form">
<div class="col-md-6 mt-3">
<label class="form-label">Adı <small class="text-danger">*</small></label>
<input type="text" class="form-control" name="name" placeholder="Aktivite Adı" required min="3">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Puanı</label>
<input type="number" class="form-control" name="score" placeholder="Skor değeri" min="0" step="1" required>
</div>
</div>
</form>
<div class="modal-footer">
<button class="btn btn-outline-success" type="submit" form="catalogaveform">Kaydet</button>
<button class="btn btn-light-secondary" data-bs-dismiss="modal" type="button">Kapat</button>
</div>
</div>
</div>
</div>
<div aria-hidden="true" class="modal fade" id="update_student" tabindex="-1">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Öğrenci güncelle</h5>
<button aria-label="Close" class="btn-close m-0 fs-5" data-bs-dismiss="modal" type="button"></button>
</div>
<form class="modal-body" id="studentupdateform" onsubmit="updateStudent(this);return false;">
<input type="hidden" name="id">
<div class="row app-form">
<div class="col-md-6 mt-3">
<label class="form-label">Adı <small class="text-danger">*</small></label>
<input type="text" class="form-control" name="name" placeholder="Öğrencinin adı" required min="3">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Soyadı</label>
<input type="text" class="form-control" name="surname" placeholder="Öğrencinin Soyadı">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Numarası</label>
<input type="text" class="form-control" name="studentno" placeholder="Öğrencinin Numarası">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">E-Posta Adresi</label>
<input type="email" class="form-control" name="email" placeholder="Öğrencinin E-Posta Adresi">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Doğum Tarihi</label>
<input type="date" class="form-control" name="birthdate" placeholder="Öğrencinin E-Posta Adresi">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Cinsiyeti</label>
<select name="gender" class="form-control">
<option>Belirtilmemiş</option>
<option value="male">Erkek</option>
<option value="female">Kadın</option>
</select>
</div>
<div class="col-md-12 mt-3">
<label class="form-label">Açıklama</label>
<textarea name="description" class="form-control" placeholder="Öğrenci hakkında"></textarea>
</div>
</div>
</form>
<div class="modal-footer">
<button class="btn btn-outline-success" type="submit" form="studentupdateform">Güncelle</button>
<button class="btn btn-light-secondary" data-bs-dismiss="modal" type="button">Kapat</button>
</div>
</div>
</div>
</div>
<script>
let dataTable;
$(function(){
dataTable = $("#cataloglist").DataTable({
serverSide: true,
processing: true,
autoWidth: false,
ajax: {
url: "/catalog/list",
method:"post"
},
columns: [
{
width: "1%",
title: "#",
data: null,
render: function (data, type, row, meta) {
return meta.row + 1;
}
},
{
title: "Adı Soyadı",
data: null,
name: "fullname",
render: function (data, row) {
return `${data.name} ${data.surname || ''}`;
}
},
{
title: "Öğrenci No",
data: "studentno",
name: "studentno"
},
{
title: "Cinsiyet",
data: "gender",
name: "gender",
render: function (data) {
if (data === 'male') return 'Erkek';
if (data === 'female') return 'Kadın';
return 'Belirtilmemiş';
}
},
{
title: "E-Posta",
data: "email",
name: "email"
},
{
width: "1%",
title: "İşlemler",
data: null,
orderable: false, // İşlemlere göre sıralama yapılamasın
render: function (data) {
return `
<div class="btn-group d-flex flex-row flex-nowrap" role="group">
<button class="btn btn-sm btn-outline-primary text-nowrap" onclick="updateModal(this)" title="Düzenle">
<i class="fa fa-edit"></i>
Düzenle
</button>
<button class="btn btn-sm btn-outline-danger text-nowrap" onclick="deleteStudent(${data.id})" title="Sil">
<i class="fa fa-trash"></i>
Sil
</button>
</div>`;
}
}
],
"language": {
"url": "https://cdn.datatables.net/plug-ins/1.13.6/i18n/tr.json"
}
});
});
async function saveStudent(form)
{
blockui("#add_student .modal-content");
$.ajax({
url: "/catalog/store",
type: "post",
data: new FormData(form),
processData: false,
contentType: false,
success: function(response) {
dataTable.ajax.reload(null, false);
ublockui();
},
error: function(err) {
ublockui();
},
});
}
async function updateStudent(form)
{
blockui("#update_student .modal-content");
$.ajax({
url: "/catalog/update",
type: "post",
data: new FormData(form),
processData: false,
contentType: false,
success: function(response) {
dataTable.ajax.reload(null, false);
$("#update_student").modal("hide");
ublockui();
},
error: function(err) {
ublockui();
},
});
}
async function updateModal(tr)
{
let data = dataTable.row($(tr).closest('tr')).data();
$("#update_student form").get(0).reset();
$("#update_student [name='id']").val(data.id);
$("#update_student form input,#update_student form textarea").each(function(){
let name = this.name;
$(this).val(data[name]);
});
$("#update_student form select").each(function(){
let name = this.name;
$(this).find("option:selected").removeAttr("selected");
$(this).find(`option[value="${data[name]}"]`).attr("selected","selected");
});
$("#update_student").modal("show");
}
function blockui(ui)
{
$(blockui.id = ui).block({
message: '<div class="loader-container-box"><div class="loader"></div></div>',
//timeout: 13000,
overlayCSS: {
backgroundColor: 'rgba(var(--dark), 0.8)',
opacity: 0.8,
borderRadius: 'var(--app-border-radius)',
cursor: 'wait'
},
css: {
border: 0,
padding: 0,
backgroundColor: 'transparent'
}
});
}
function ublockui()
{
$(blockui.id).unblock()
}
</script>
<%-include("../partials/footer.ejs") %>

12
views/panel/panel.ejs Normal file
View File

@ -0,0 +1,12 @@
<%-include("../partials/header.ejs") %>
<%-include("../partials/sidebar.ejs") %>
<div class="app-content">
<%-include("../partials/navbar.ejs") %>
<main>
<h1>Merhaba</h1>
</main>
</div>
<%-include("../partials/footer.ejs") %>

297
views/panel/students.ejs Normal file
View File

@ -0,0 +1,297 @@
<%-include("../partials/header.ejs") %>
<%-include("../partials/sidebar.ejs") %>
<div class="app-content">
<%-include("../partials/navbar.ejs") %>
<main>
<div class="container-fluid">
<!-- Breadcrumb start -->
<div class="row m-1">
<div class="col-12">
<h4 class="main-title">Sisteme Kayıtlı Öğrenciler</h4>
<p>
Öğrenciler ekleyebilir, düzenleyebilir ve silebilirsiniz
</p>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="card ">
<div class="card-header ">
<div class="d-flex flex-row flex-1">
<h5 class="flex-fill">
Öğrenciler
</h5>
<div class="flex-min">
<button class="btn btn-success" data-bs-target="#add_student" data-bs-toggle="modal" type="button">
<i class="fa fa-plus"></i>
Öğrenci ekle
</button>
</div>
</div>
</div>
<div class="card-body p-0">
<div class="app-datatable-default overflow-auto">
<table class="table display app-data-table default-data-table" id="studentslist"></table>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
</div>
<div aria-hidden="true" class="modal fade" id="add_student" tabindex="-1">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Yeni Öğrenci Ekle</h5>
<button aria-label="Close" class="btn-close m-0 fs-5" data-bs-dismiss="modal" type="button"></button>
</div>
<form class="modal-body" id="studentsaveform" onsubmit="saveStudent(this);return false;">
<div class="row app-form">
<div class="col-md-6 mt-3">
<label class="form-label">Adı <small class="text-danger">*</small></label>
<input type="text" class="form-control" name="name" placeholder="Öğrencinin adı" required min="3">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Soyadı</label>
<input type="text" class="form-control" name="surname" placeholder="Öğrencinin Soyadı">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Numarası</label>
<input type="text" class="form-control" name="studentno" placeholder="Öğrencinin Numarası">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">E-Posta Adresi</label>
<input type="email" class="form-control" name="email" placeholder="Öğrencinin E-Posta Adresi">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Doğum Tarihi</label>
<input type="date" class="form-control" name="birthdate" placeholder="Öğrencinin E-Posta Adresi">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Cinsiyeti</label>
<select name="gender" class="form-control">
<option>Belirtilmemiş</option>
<option value="male">Erkek</option>
<option value="female">Kadın</option>
</select>
</div>
<div class="col-md-12 mt-3">
<label class="form-label">Açıklama</label>
<textarea name="description" class="form-control" placeholder="Öğrenci hakkında"></textarea>
</div>
</div>
</form>
<div class="modal-footer">
<button class="btn btn-outline-success" type="submit" form="studentsaveform">Kaydet</button>
<button class="btn btn-light-secondary" data-bs-dismiss="modal" type="button">Kapat</button>
</div>
</div>
</div>
</div>
<div aria-hidden="true" class="modal fade" id="update_student" tabindex="-1">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Öğrenci güncelle</h5>
<button aria-label="Close" class="btn-close m-0 fs-5" data-bs-dismiss="modal" type="button"></button>
</div>
<form class="modal-body" id="studentupdateform" onsubmit="updateStudent(this);return false;">
<input type="hidden" name="id">
<div class="row app-form">
<div class="col-md-6 mt-3">
<label class="form-label">Adı <small class="text-danger">*</small></label>
<input type="text" class="form-control" name="name" placeholder="Öğrencinin adı" required min="3">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Soyadı</label>
<input type="text" class="form-control" name="surname" placeholder="Öğrencinin Soyadı">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Numarası</label>
<input type="text" class="form-control" name="studentno" placeholder="Öğrencinin Numarası">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">E-Posta Adresi</label>
<input type="email" class="form-control" name="email" placeholder="Öğrencinin E-Posta Adresi">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Doğum Tarihi</label>
<input type="date" class="form-control" name="birthdate" placeholder="Öğrencinin E-Posta Adresi">
</div>
<div class="col-md-6 mt-3">
<label class="form-label">Cinsiyeti</label>
<select name="gender" class="form-control">
<option>Belirtilmemiş</option>
<option value="male">Erkek</option>
<option value="female">Kadın</option>
</select>
</div>
<div class="col-md-12 mt-3">
<label class="form-label">Açıklama</label>
<textarea name="description" class="form-control" placeholder="Öğrenci hakkında"></textarea>
</div>
</div>
</form>
<div class="modal-footer">
<button class="btn btn-outline-success" type="submit" form="studentupdateform">Güncelle</button>
<button class="btn btn-light-secondary" data-bs-dismiss="modal" type="button">Kapat</button>
</div>
</div>
</div>
</div>
<script>
let dataTable;
$(function(){
dataTable = $("#studentslist").DataTable({
serverSide: true,
processing: true,
autoWidth: false,
ajax: {
url: "/students/list",
method:"post"
},
columns: [
{
width: "1%",
title: "#",
data: null,
render: function (data, type, row, meta) {
return meta.row + 1;
}
},
{
title: "Adı Soyadı",
data: null,
name: "fullname",
render: function (data, row) {
return `${data.name} ${data.surname || ''}`;
}
},
{
title: "Öğrenci No",
data: "studentno",
name: "studentno"
},
{
title: "Cinsiyet",
data: "gender",
name: "gender",
render: function (data) {
if (data === 'male') return 'Erkek';
if (data === 'female') return 'Kadın';
return 'Belirtilmemiş';
}
},
{
title: "E-Posta",
data: "email",
name: "email"
},
{
width: "1%",
title: "İşlemler",
data: null,
orderable: false, // İşlemlere göre sıralama yapılamasın
render: function (data) {
return `
<div class="btn-group d-flex flex-row flex-nowrap" role="group">
<button class="btn btn-sm btn-outline-primary text-nowrap" onclick="updateModal(this)" title="Düzenle">
<i class="fa fa-edit"></i>
Düzenle
</button>
<button class="btn btn-sm btn-outline-danger text-nowrap" onclick="deleteStudent(${data.id})" title="Sil">
<i class="fa fa-trash"></i>
Sil
</button>
</div>`;
}
}
],
"language": {
"url": "https://cdn.datatables.net/plug-ins/1.13.6/i18n/tr.json"
}
});
});
async function saveStudent(form)
{
blockui("#add_student .modal-content");
$.ajax({
url: "/students/store",
type: "post",
data: new FormData(form),
processData: false,
contentType: false,
success: function(response) {
dataTable.ajax.reload(null, false);
ublockui();
},
error: function(err) {
ublockui();
},
});
}
async function updateStudent(form)
{
blockui("#update_student .modal-content");
$.ajax({
url: "/students/update",
type: "post",
data: new FormData(form),
processData: false,
contentType: false,
success: function(response) {
dataTable.ajax.reload(null, false);
$("#update_student").modal("hide");
ublockui();
},
error: function(err) {
ublockui();
},
});
}
async function updateModal(tr)
{
let data = dataTable.row($(tr).closest('tr')).data();
$("#update_student form").get(0).reset();
$("#update_student [name='id']").val(data.id);
$("#update_student form input,#update_student form textarea").each(function(){
let name = this.name;
$(this).val(data[name]);
});
$("#update_student form select").each(function(){
let name = this.name;
$(this).find("option:selected").removeAttr("selected");
$(this).find(`option[value="${data[name]}"]`).attr("selected","selected");
});
$("#update_student").modal("show");
}
function blockui(ui)
{
$(blockui.id = ui).block({
message: '<div class="loader-container-box"><div class="loader"></div></div>',
//timeout: 13000,
overlayCSS: {
backgroundColor: 'rgba(var(--dark), 0.8)',
opacity: 0.8,
borderRadius: 'var(--app-border-radius)',
cursor: 'wait'
},
css: {
border: 0,
padding: 0,
backgroundColor: 'transparent'
}
});
}
function ublockui()
{
$(blockui.id).unblock()
}
</script>
<%-include("../partials/footer.ejs") %>

View File

@ -5,14 +5,13 @@
</span>
</div>
<div id="customizer"></div>
<script src="/assets/vendor/datatable/jquery-3.5.1.js"></script>
<script src="/assets/vendor/datatable/jquery.dataTables.min.js"></script>
<script src="/assets/vendor/phosphor/phosphor.js"></script>
<script src="/assets/vendor/bootstrap/bootstrap.bundle.min.js"></script>
<script src="/assets/vendor/phosphor/phosphor.js"></script>
<script src="/assets/vendor/simplebar/simplebar.js"></script>
<script src="/assets/js/data_table.js"></script>
<script src="/assets/js/script.js"></script>
<script src="/assets/js/customizer.js"></script>
<script src="/assets/vendor/datatable/jquery.dataTables.min.js"></script>
<script src="/assets/vendor/block-ui/jquery.blockUI.js"></script>
</body>
</html>

View File

@ -20,6 +20,8 @@
<link href="/assets/vendor/simplebar/simplebar.css" rel="stylesheet" type="text/css">
<link href="/assets/css/style.css" rel="stylesheet" type="text/css">
<link href="/assets/css/responsive.css" rel="stylesheet" type="text/css">
<script src="/assets/vendor/datatable/jquery-3.5.1.js"></script>
<link href="/assets/vendor/datatable/jquery.dataTables.min.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="app-wrapper">

View File

@ -1,7 +1,10 @@
<nav>
<div class="app-logo">
<a class="logo d-inline-block" href="index.html">
<img alt="#" src="../assets/images/logo/1.png">
<a class="d-inline-block py-2 px-3" href="index.html">
<img alt="#" src="/logo.png" style="max-height: 50px;vertical-align: middle">
<span style="font-size: 2em; vertical-align: middle; letter-spacing: 3px;">
YeşilSkor
</span>
</a>
<span class="bg-light-primary toggle-semi-nav d-flex-center">
@ -9,484 +12,73 @@
</span>
<div class="d-flex align-items-center nav-profile p-3">
<span class="h-45 w-45 d-flex-center b-r-10 position-relative bg-danger m-auto">
<span class="h-45 w-45 d-flex-center b-r-10 position-relative bg-danger m-auto d-none">
<img alt="avatar" class="img-fluid b-r-10" src="../assets/images/avatar/woman.jpg">
<span class="position-absolute top-0 end-0 p-1 bg-success border border-light rounded-circle"></span>
</span>
<div class="flex-grow-1 ps-2">
<h6 class="text-primary mb-0"> Ninfa Monaldo</h6>
<p class="text-muted f-s-12 mb-0">Web Developer</p>
<h6 class="text-primary mb-0 profile-username"></h6>
<p class="text-muted f-s-12 mb-0 profile-usersurname"></p>
</div>
<div class="dropdown profile-menu-dropdown">
<a aria-expanded="false" data-bs-auto-close="true" data-bs-placement="top" data-bs-toggle="dropdown"
role="button">
<i class="ti ti-settings fs-5"></i>
</a>
<ul class="dropdown-menu">
<li class="dropdown-item">
<a class="f-w-500" href="profile.html" target="_blank">
<i class="ph-duotone ph-user-circle pe-1 f-s-20"></i> Profile Details
</a>
</li>
<li class="dropdown-item">
<a class="f-w-500" href="setting.html" target="_blank">
<i class="ph-duotone ph-gear pe-1 f-s-20"></i> Settings
</a>
</li>
<li class="dropdown-item">
<div class="d-flex align-items-center justify-content-between">
<div>
<a class="f-w-500" href="data_table.html#">
<i class="ph-duotone ph-detective pe-1 f-s-20"></i> Incognito
</a>
</div>
<div class="flex-shrink-0">
<div class="form-check form-switch">
<input class="form-check-input form-check-primary" id="incognitoSwitch"
type="checkbox">
</div>
</div>
</div>
</li>
<li class="dropdown-item">
<a class="mb-0 text-secondary f-w-500" href="sign_up.html" target="_blank">
<i class="ph-bold ph-plus pe-1 f-s-20"></i> Add account
</a>
</li>
<li class="app-divider-v dotted py-1"></li>
<li class="dropdown-item">
<a class="mb-0 text-danger" href="sign_in.html" target="_blank">
<i class="ph-duotone ph-sign-out pe-1 f-s-20"></i> Log Out
</a>
</li>
</ul>
</div>
<script>
$(function(){
$.ajax({
url: "/user/profile",
method: "post",
success:data => {
$(".profile-username").text(data.name);
$(".profile-usersurname").text(data.surname);
}
})
});
</script>
</div>
</div>
<div class="app-nav" id="app-simple-bar">
<ul class="main-nav p-0 mt-2">
<li class="menu-title no-sub">
<a href="/">
Anasayfa
</a>
</li>
<li class="menu-title">
<span>Dashboard</span>
</li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#dashboard">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#home"></use>
</svg>
dashboard
<span class="badge bg-danger badge-dashboard badge-notification ms-2">New</span>
</a>
<ul class="collapse" id="dashboard">
<li><a href="index.html">Ecommerce</a></li>
<li><a href="project_dashboard.html">Project</a></li>
</ul>
</li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#apps">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#stack"></use>
</svg>
Apps
</a>
<ul class="collapse" id="apps">
<li><a href="calendar.html">Calender</a></li>
<li class="another-level">
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#Profile-page">
Profile
</a>
<ul class="collapse" id="Profile-page">
<li><a href="profile.html">Profile</a></li>
<li><a href="setting.html">Setting</a></li>
</ul>
</li>
<li class="another-level">
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#projects-page">
Projects Page
</a>
<ul class="collapse" id="projects-page">
<li><a href="project_app.html">projects</a></li>
<li><a href="project_details.html">projects Details</a></li>
</ul>
</li>
<li><a href="to_do.html">To-Do</a></li>
<li><a href="team.html">Team</a></li>
<li><a href="api.html">API</a></li>
<li class="another-level">
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#ticket-page">
Ticket
</a>
<ul class="collapse" id="ticket-page">
<li><a href="ticket.html">Ticket</a></li>
<li><a href="ticket_details.html">Ticket Details</a></li>
</ul>
</li>
<li class="another-level">
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#email-page">
Email Page
</a>
<ul class="collapse" id="email-page">
<li><a href="email.html"> Email</a></li>
<li><a href="read_email.html">Read Email</a></li>
</ul>
</li>
<li class="another-level">
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#e-shop">
E-shop
</a>
<ul class="collapse" id="e-shop">
<li><a href="cart.html">Cart</a></li>
<li><a href="product.html">Product</a></li>
<li><a href="add_product.html">Add Product</a></li>
<li><a href="product_details.html">Product-Details</a></li>
<li><a href="product_list.html">Product list</a></li>
<li><a href="orders.html">Orders</a></li>
<li><a href="orders_details.html">Orders Details</a></li>
<li><a href="orders_list.html">Orders List</a></li>
<li><a href="checkout.html">Check out</a></li>
<li><a href="wishlist.html">Wishlist</a></li>
</ul>
</li>
<li><a href="invoice.html">Invoice</a></li>
<li><a href="chat.html">Chat</a></li>
<li><a href="file_manager.html">File manager</a></li>
<li><a href="bookmark.html">Bookmark</a></li>
<li><a href="kanban_board.html">Kanban board</a></li>
<li><a href="timeline.html">Timeline</a></li>
<li><a href="faq.html">FAQS</a></li>
<li><a href="pricing.html">Pricing</a></li>
<li><a href="gallery.html">Gallery</a></li>
<li class="another-level">
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#blog-page">
Blog Page
</a>
<ul class="collapse" id="blog-page">
<li><a href="blog.html">Blog</a></li>
<li><a href="blog_read_more.html">Blog Details</a></li>
<li><a href="add_blog.html">Add Blog</a></li>
</ul>
</li>
</ul>
</li>
<li class="no-sub">
<a href="widget.html">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#squares"></use>
</svg>
Widgets
</a>
</li>
<li class="menu-title"><span>Component</span></li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#ui-kits">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#briefcase"></use>
</svg>
UI kits
</a>
<ul class="collapse" id="ui-kits">
<li><a href="cheatsheet.html">Cheatsheet</a></li>
<li><a href="alert.html">Alert</a></li>
<li><a href="badges.html">Badges</a></li>
<li><a href="buttons.html">Buttons</a></li>
<li><a href="cards.html">Cards</a></li>
<li><a href="dropdown.html">Dropdown</a></li>
<li><a href="grid.html">Grid</a></li>
<li><a href="avatar.html">Avatar</a></li>
<li><a href="tabs.html">Tabs</a></li>
<li><a href="accordions.html">Accordions</a></li>
<li><a href="progress.html">Progress</a></li>
<li><a href="notifications.html">Notifications</a></li>
<li><a href="list.html">Lists</a></li>
<li><a href="helper_classes.html">Helper Classes</a></li>
<li><a href="background.html">Background</a></li>
<li><a href="divider.html">Divider</a></li>
<li><a href="ribbons.html">Ribbons</a></li>
<li><a href="editor.html">Editor </a></li>
<li><a href="collapse.html">Collapse</a></li>
<li><a href="footer-page.html">Footer</a></li>
<li><a href="shadow.html">Shadow</a></li>
<li><a href="wrapper.html">Wrapper</a></li>
<li><a href="bullet.html">Bullet</a></li>
<li><a href="placeholder.html">Placeholder</a></li>
<li><a href="alignment.html">Alignment Thing</a></li>
</ul>
</li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#advance-ui">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#briefcase-advance"></use>
</svg>
Advance UI
<span class=" badge rounded-pill bg-warning badge-notification ms-2">
12+
<span class="visually-hidden">unread messages</span>
</span>
</a>
<ul class="collapse" id="advance-ui">
<li><a href="modals.html">Modals</a></li>
<li><a href="offcanvas.html">Offcanvas Toggle</a></li>
<li><a href="sweetalert.html">Sweat Alert</a></li>
<li><a href="scrollbar.html">Scrollbar</a></li>
<li><a href="spinners.html">Spinners</a></li>
<li><a href="animation.html">Animation</a></li>
<li><a href="video_embed.html">Video Embed</a></li>
<li><a href="tour.html">Tour</a></li>
<li><a href="slick.html">Slider</a></li>
<li><a href="bootstrap_slider.html">Bootstrap Slider</a></li>
<li><a href="scrollpy.html">Scrollpy</a></li>
<li><a href="tooltips_popovers.html">Tooltip & Popovers</a></li>
<li><a href="ratings.html">Rating</a></li>
<li><a href="prismjs.html">Prismjs</a></li>
<li><a href="count_down.html">Count Down</a></li>
<li><a href="count_up.html"> Count up </a></li>
<li><a href="draggable.html">Draggable</a></li>
<li><a href="tree-view.html">Tree View</a></li>
<li><a href="block_ui.html">Block Ui </a></li>
</ul>
</li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#icons">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#gift"></use>
</svg>
Icons
</a>
<ul class="collapse" id="icons">
<li><a href="fontawesome.html">Fontawesome</a></li>
<li><a href="flag_icons.html">Flag</a></li>
<li><a href="tabler-icons.html">Tabler</a></li>
<li><a href="weather_icon.html">Weather</a></li>
<li><a href="animated_icon.html">Animated</a></li>
<li><a href="iconoir_icon.html">Iconoir</a></li>
<li><a href="phosphor.html">Phosphor</a></li>
</ul>
</li>
<li class="no-sub">
<a href="misc.html">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#rectangle"></use>
</svg>
Misc
</a>
</li>
<li class="menu-title"><span>Map & Charts </span></li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#maps">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#location"></use>
</svg>
Map
</a>
<ul class="collapse" id="maps">
<li><a href="google-map.html">Google Maps</a></li>
<li><a href="leaflet-map.html">Leaflet map</a></li>
</ul>
</li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#chart">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#chart"></use>
</svg>
Chart
</a>
<ul class="collapse" id="chart">
<li><a href="chart_js.html">Chart js</a></li>
<li class="another-level">
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#apexcharts-page">
Apexcharts
</a>
<ul class="collapse" id="apexcharts-page">
<li><a href="line.html">Line</a></li>
<li><a href="area_charts.html">Area</a></li>
<li><a href="column.html">Column</a></li>
<li><a href="bar.html">Bar</a></li>
<li><a href="mixed.html">Mixed</a></li>
<li><a href="timeline_range_charts.html">Timeline & Range-Bars</a></li>
<li><a href="candlestick_charts.html">Candlestick</a></li>
<li><a href="boxplot.html">Boxplot</a></li>
<li><a href="bubble.html">Bubble</a></li>
<li><a href="scatter.html">Scatter</a></li>
<li><a href="heatmap.html">Heatmap</a></li>
<li><a href="treemap.html">Treemap</a></li>
<li><a href="pie_charts.html">Pie</a></li>
<li><a href="radial_bar.html">Radial bar</a></li>
<li><a href="radar_chart.html">Radar</a></li>
</ul>
</li>
</ul>
</li>
<li class="menu-title"><span>Table & forms </span></li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#table">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#table"></use>
</svg>
Table
</a>
<ul class="collapse" id="table">
<li><a href="basic_table.html">BasicTable</a></li>
<li><a href="data_table.html">Data Table</a></li>
<li><a href="list_table.html">List Js</a></li>
<li><a href="advance_table.html">Advance Table</a></li>
</ul>
</li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#forms">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#wallet"></use>
</svg>
Forms elements
</a>
<ul class="collapse" id="forms">
<li><a href="form_validation.html">Form Validation</a></li>
<li><a href="base_inputs.html">Base Input</a></li>
<li><a href="checkbox_radio.html">Checkbox & Radio</a></li>
<li><a href="input_groups.html">Input Groups</a></li>
<li><a href="input_masks.html">Input Masks</a></li>
<li><a href="floating_labels.html">Floating Labels</a></li>
<li><a href="date_picker.html">Datetimepicker</a></li>
<li><a href="touch_spin.html">Touch spin</a></li>
<li><a href="select.html">Select2</a></li>
<li><a href="switch.html">Switch</a></li>
<li><a href="range_slider.html">Range Slider</a></li>
<li><a href="typeahead.html">Typeahead</a></li>
<li><a href="textarea.html">Textarea</a></li>
<li><a href="clipboard.html">Clipboard</a></li>
<li><a href="file_upload.html">File Upload</a></li>
<li><a href="dual_list_boxes.html">Dual List Boxes</a></li>
<li><a href="default_forms.html">Default Forms</a></li>
</ul>
</li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#ready_to_use">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#newspaper"></use>
</svg>
Ready to use
<span class="badge text-bg-success badge-notification ms-2">2</span>
</a>
<ul class="collapse" id="ready_to_use">
<li><a href="form_wizards.html">Form wizards</a></li>
<li><a href="form_wizard_1.html">Form wizards 1</a></li>
<li><a href="form_wizard_2.html">Form wizards 2</a></li>
<li><a href="ready_to_use_form.html">Ready To Use Form</a></li>
<li><a href="ready_to_use_table.html">Ready To Use Tables</a></li>
</ul>
</li>
<li class="menu-title"><span>Pages</span></li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#auth_pages">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#window"></use>
</svg>
Auth Pages
</a>
<ul class="collapse" id="auth_pages">
<li><a href="sign_in.html">Sign In</a></li>
<li><a href="sign_in_1.html">Sign In with Bg-image</a></li>
<li><a href="sign_up.html">Sign Up</a></li>
<li><a href="sign_up_1.html">Sign Up with Bg-image</a></li>
<li><a href="password_reset.html">Password Reset</a></li>
<li><a href="password_reset_1.html">Password Reset with Bg-image</a></li>
<li><a href="password_create.html">Password Create</a></li>
<li><a href="password_create_1.html">Password Create with Bg-image</a></li>
<li><a href="lock_screen.html">Lock Screen</a></li>
<li><a href="lock_screen_1.html">Lock Screen with Bg-image</a></li>
<li><a href="two_step_verification.html">Two-Step Verification</a></li>
<li><a href="two_step_verification_1.html">Two-Step Verification with Bg-image</a></li>
</ul>
</li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#error_pages">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#exclamation-circle"></use>
</svg>
Error Pages
</a>
<ul class="collapse" id="error_pages">
<li><a href="error_400.html">Bad Request </a></li>
<li><a href="error_403.html">Forbidden </a></li>
<li><a href="error_404.html">Not Found</a></li>
<li><a href="error_500.html">Internal Server</a></li>
<li><a href="error_503.html">Service Unavailable</a></li>
</ul>
</li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#other_pages">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#document"></use>
</svg>
Other Pages
</a>
<ul class="collapse" id="other_pages">
<li><a href="blank.html">Blank</a></li>
<li><a href="maintenance.html">Maintenance</a></li>
<li><a href="landing.html">Landing Page</a></li>
<li><a href="coming_soon.html">Coming Soon</a></li>
<li><a href="sitemap.html">Sitemap</a></li>
<li><a href="privacy_policy.html">Privacy Policy</a></li>
<li><a href="terms_condition.html">Terms &amp; Condition</a></li>
</ul>
</li>
<li class="menu-title"><span>Others</span></li>
<li>
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#level">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#arrow-down"></use>
</svg>
2 level
</a>
<ul class="collapse" id="level">
<li><a href="data_table.html#">Blank</a></li>
<li class="another-level">
<a aria-expanded="false" data-bs-toggle="collapse" href="data_table.html#level2">
Another level
</a>
<ul class="collapse" id="level2">
<li><a href="blank.html">Blank</a></li>
</ul>
</li>
</ul>
</li>
<li class="no-sub">
<a href="https://phpstack-1384472-5121645.cloudwaysapps.com/document/html/ki-admin/index.html">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#document-text"></use>
</svg>
Document
</a>
<span>Panel</span>
</li>
<li class="no-sub">
<a href="mailto:teqlathemes@gmail.com">
<a href="/students">
<svg stroke="currentColor" stroke-width="1.5">
<use xlink:href="../assets/svg/_sprite.svg#chat-bubble"></use>
</svg>
Support
Öğrenciler
</a>
</li>
<li class="no-sub">
<a href="/catalogs">
<svg stroke="currentColor" stroke-width="1.5">
</svg>
Puan Katalogu
</a>
</li>
<li class="no-sub">
<a href="/catalogs">
<svg stroke="currentColor" stroke-width="1.5">
</svg>
Geçmiş İşlemler
</a>
</li>
<li class="menu-title"><span>Hesap</span></li>
<li class="no-sub">
<a href="/profile">
<svg stroke="currentColor" stroke-width="1.5">
</svg>
Hesap Ayarları
</a>
</li>
<li class="no-sub bg-danger text-danger">
<a href="/profile">
<svg stroke="currentColor" stroke-width="1.5">
</svg>
Çıkış yap
</a>
</li>
</ul>