..
This commit is contained in:
@@ -298,11 +298,12 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 공통 네비게이션 JS -->
|
||||
<script src="/js/common-navigation.js"></script>
|
||||
|
||||
<script>
|
||||
// 공용코드 전용 스크립트
|
||||
// 공통 네비게이션 컴포넌트
|
||||
class CommonNavigation {
|
||||
constructor(currentPage = '') {
|
||||
this.currentPage = currentPage;
|
||||
this.menuItems = [];
|
||||
this.init();
|
||||
}
|
||||
|
||||
@@ -448,7 +449,7 @@
|
||||
// 코드그룹 목록 로드
|
||||
function loadGroups() {
|
||||
showLoading();
|
||||
|
||||
|
||||
fetch('/Common/GetGroups')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
@@ -517,7 +518,7 @@
|
||||
// 특정 그룹의 데이터 로드
|
||||
function loadDataByGroup(grp) {
|
||||
showLoading();
|
||||
|
||||
|
||||
let url = '/Common/GetList';
|
||||
if (grp) {
|
||||
url += '?grp=' + encodeURIComponent(grp);
|
||||
@@ -642,9 +643,9 @@
|
||||
// 삭제 실행
|
||||
function confirmDelete() {
|
||||
if (!deleteTargetIdx) return;
|
||||
|
||||
|
||||
showLoading();
|
||||
|
||||
|
||||
fetch('/Common/Delete', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
@@ -704,9 +705,9 @@
|
||||
svalue2: document.getElementById('editSvalue2').value,
|
||||
memo: document.getElementById('editMemo').value
|
||||
};
|
||||
|
||||
|
||||
showLoading();
|
||||
|
||||
|
||||
fetch('/Common/Save', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
|
||||
@@ -130,50 +130,7 @@
|
||||
<!-- 통계 카드 -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-6 mb-8">
|
||||
|
||||
<!-- 출근 카드 -->
|
||||
<div class="glass-effect rounded-2xl p-6 card-hover animate-slide-up cursor-pointer" onclick="showPresentUserModal()">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<p class="text-white/70 text-sm font-medium">출근(대상)</p>
|
||||
<p class="text-3xl font-bold text-white" id="presentCount">0</p>
|
||||
</div>
|
||||
<div class="w-12 h-12 bg-success-500/20 rounded-full flex items-center justify-center">
|
||||
<svg class="w-6 h-6 text-success-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 휴가 카드 -->
|
||||
<div class="glass-effect rounded-2xl p-6 card-hover animate-slide-up">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<p class="text-white/70 text-sm font-medium">휴가</p>
|
||||
<p class="text-3xl font-bold text-white" id="leaveCount">0</p>
|
||||
</div>
|
||||
<div class="w-12 h-12 bg-warning-500/20 rounded-full flex items-center justify-center">
|
||||
<svg class="w-6 h-6 text-warning-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 휴가요청 카드 -->
|
||||
<div class="glass-effect rounded-2xl p-6 card-hover animate-slide-up cursor-pointer" onclick="showHolidayRequestModal()">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<p class="text-white/70 text-sm font-medium">휴가요청</p>
|
||||
<p class="text-3xl font-bold text-white" id="leaveRequestCount">0</p>
|
||||
</div>
|
||||
<div class="w-12 h-12 bg-primary-500/20 rounded-full flex items-center justify-center">
|
||||
<svg class="w-6 h-6 text-primary-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 구매요청 카드(NR) -->
|
||||
<div class="glass-effect rounded-2xl p-6 card-hover animate-slide-up cursor-pointer" onclick="showPurchaseNRModal()">
|
||||
@@ -213,34 +170,8 @@
|
||||
</div>
|
||||
|
||||
<!-- 2칸 레이아웃: 좌측 휴가현황, 우측 할일 -->
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8 animate-slide-up">
|
||||
<!-- 좌측: 휴가/기타 현황 -->
|
||||
<div class="glass-effect rounded-2xl overflow-hidden">
|
||||
<div class="px-6 py-4 border-b border-white/10">
|
||||
<h2 class="text-xl font-semibold text-white flex items-center">
|
||||
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"></path>
|
||||
</svg>
|
||||
휴가/기타 현황
|
||||
</h2>
|
||||
</div>
|
||||
<div class="overflow-x-auto max-h-[460px] custom-scrollbar">
|
||||
<table class="w-full">
|
||||
<thead class="bg-white/10 sticky top-0">
|
||||
<tr>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase tracking-wider">이름</th>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase tracking-wider">형태</th>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase tracking-wider">종류</th>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase tracking-wider">기간</th>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-white/70 uppercase tracking-wider">사유</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="holidayTable" class="divide-y divide-white/10">
|
||||
<!-- 데이터가 여기에 표시됩니다 -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 lg:grid-cols-1 gap-8 animate-slide-up">
|
||||
|
||||
|
||||
<!-- 우측: 할일 -->
|
||||
<div class="glass-effect rounded-2xl overflow-hidden">
|
||||
|
||||
@@ -31,7 +31,7 @@ function CommonCode() {
|
||||
const loadGroups = async () => {
|
||||
setIsLoading(true);
|
||||
try {
|
||||
const response = await fetch('http://127.0.0.1:7979/Common/GetGroups');
|
||||
const response = await fetch('/Common/GetGroups');
|
||||
const data = await response.json();
|
||||
setGroupData(data || []);
|
||||
} catch (error) {
|
||||
@@ -53,7 +53,7 @@ function CommonCode() {
|
||||
const loadDataByGroup = async (grp) => {
|
||||
setIsLoading(true);
|
||||
try {
|
||||
let url = 'http://127.0.0.1:7979/Common/GetList';
|
||||
let url = '/Common/GetList';
|
||||
if (grp) {
|
||||
url += '?grp=' + encodeURIComponent(grp);
|
||||
}
|
||||
@@ -130,7 +130,7 @@ function CommonCode() {
|
||||
|
||||
setIsLoading(true);
|
||||
try {
|
||||
const response = await fetch('http://127.0.0.1:7979/Common/Save', {
|
||||
const response = await fetch('/Common/Save', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
@@ -162,7 +162,7 @@ function CommonCode() {
|
||||
|
||||
setIsLoading(true);
|
||||
try {
|
||||
const response = await fetch('http://127.0.0.1:7979/Common/Delete', {
|
||||
const response = await fetch('/Common/Delete', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
|
||||
Reference in New Issue
Block a user