This commit is contained in:
ismail 2025-10-06 16:25:08 +03:00
parent 89fff965f4
commit 9c8047ce11
3 changed files with 95 additions and 34 deletions

Binary file not shown.

View File

@ -652,6 +652,10 @@
margin-bottom: 5px;
}
}
.stage-tab.drag-over {
background-color: rgba(67, 97, 238, 0.1);
border: 2px dashed var(--primary);
}
</style>
</head>
<body>
@ -923,6 +927,7 @@
<script>
// Application State
const state = {
draggedStageIndex: null,
formName: 'Resume Application Form',
formDescription: '',
formActive: true,
@ -1028,6 +1033,49 @@
templateId: djangoConfig.templateId // Initialize with Django template ID if editing
};
function allowStageDrop(event) {
event.preventDefault();
}
function dragStageEnter(event) {
event.target.classList.add('drag-over');
}
function dragStageLeave(event) {
event.target.classList.remove('drag-over');
}
function startStageDrag(event, index) {
state.draggedStageIndex = index;
event.dataTransfer.setData('text/plain', 'stage-reorder');
event.dataTransfer.effectAllowed = 'move';
}
function dropStage(event, targetIndex) {
event.preventDefault();
event.target.classList.remove('drag-over');
if (state.draggedStageIndex !== null && state.draggedStageIndex !== targetIndex) {
const draggedStage = state.stages[state.draggedStageIndex];
state.stages.splice(state.draggedStageIndex, 1);
// Adjust target index if we removed an element before it
const adjustedIndex = state.draggedStageIndex < targetIndex ? targetIndex - 1 : targetIndex;
state.stages.splice(adjustedIndex, 0, draggedStage);
// Update current stage if needed
if (state.currentStage === state.draggedStageIndex) {
state.currentStage = adjustedIndex;
} else if (state.currentStage > state.draggedStageIndex && state.currentStage <= adjustedIndex) {
state.currentStage--;
} else if (state.currentStage < state.draggedStageIndex && state.currentStage >= adjustedIndex) {
state.currentStage++;
}
renderStageNavigation();
renderCurrentStage();
}
state.draggedStageIndex = null;
}
// DOM Elements
const elements = {
stageNav: document.getElementById('stageNav'),
@ -1193,43 +1241,56 @@
// DOM Rendering Functions (same as before)
function renderStageNavigation() {
elements.stageNav.innerHTML = '';
state.stages.forEach((stage, index) => {
const stageTab = document.createElement('div');
stageTab.className = `stage-tab ${index === state.currentStage ? 'active' : ''}`;
stageTab.dataset.index = index;
stageTab.innerHTML = `
${stage.name}
${hasRequiredFields(stage) ? '<span class="required-indicator"> *</span>' : ''}
${stage.predefined ? '<span class="predefined-badge">Default</span>' : ''}
<span class="rename-btn"><i class="fas fa-edit"></i></span>
${(!stage.predefined || state.stages.length > 1) ? '<span class="remove-btn"><i class="fas fa-times"></i></span>' : ''}
`;
stageTab.addEventListener('click', (e) => {
if (!e.target.closest('.rename-btn') && !e.target.closest('.remove-btn')) {
state.currentStage = index;
renderCurrentStage();
renderStageNavigation();
}
});
const renameBtn = stageTab.querySelector('.rename-btn');
if (renameBtn) {
renameBtn.addEventListener('click', (e) => {
e.stopPropagation();
openRenameModal(stage);
});
}
const removeBtn = stageTab.querySelector('.remove-btn');
if (removeBtn) {
removeBtn.addEventListener('click', (e) => {
e.stopPropagation();
removeStage(index);
});
}
elements.stageNav.appendChild(stageTab);
elements.stageNav.innerHTML = '';
state.stages.forEach((stage, index) => {
const stageTab = document.createElement('div');
stageTab.className = `stage-tab ${index === state.currentStage ? 'active' : ''}`;
stageTab.dataset.index = index;
// Make stage tabs draggable
stageTab.draggable = true;
stageTab.addEventListener('dragstart', (e) => startStageDrag(e, index));
stageTab.addEventListener('dragover', allowStageDrop);
stageTab.addEventListener('dragenter', dragStageEnter);
stageTab.addEventListener('dragleave', dragStageLeave);
stageTab.addEventListener('drop', (e) => dropStage(e, index));
stageTab.innerHTML = `
${stage.name}
${hasRequiredFields(stage) ? '<span class="required-indicator"> *</span>' : ''}
${stage.predefined ? '<span class="predefined-badge">Default</span>' : ''}
<span class="rename-btn"><i class="fas fa-edit"></i></span>
${(!stage.predefined || state.stages.length > 1) ? '<span class="remove-btn"><i class="fas fa-times"></i></span>' : ''}
`;
stageTab.addEventListener('click', (e) => {
if (!e.target.closest('.rename-btn') && !e.target.closest('.remove-btn')) {
state.currentStage = index;
renderCurrentStage();
renderStageNavigation();
}
});
const renameBtn = stageTab.querySelector('.rename-btn');
if (renameBtn) {
renameBtn.addEventListener('click', (e) => {
e.stopPropagation();
openRenameModal(stage);
});
}
const removeBtn = stageTab.querySelector('.remove-btn');
if (removeBtn) {
removeBtn.addEventListener('click', (e) => {
e.stopPropagation();
removeStage(index);
});
}
elements.stageNav.appendChild(stageTab);
});
}
function renderCurrentStage() {
const currentStage = state.stages[state.currentStage];
elements.stageNameDisplay.textContent = currentStage.name;