remove bulk delete

This commit is contained in:
2026-01-08 23:35:49 -05:00
parent 2e7956ce40
commit 2633d0f962
4 changed files with 193 additions and 9 deletions

View File

@@ -2691,3 +2691,119 @@ body.modal-open {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
/* ========================================
MARKDOWN FORMATTING STYLES
======================================== */
/* Code blocks */
.code-block {
background: var(--bg-primary);
border: 2px solid var(--terminal-green);
border-left: 4px solid var(--terminal-amber);
padding: 1rem;
margin: 1rem 0;
overflow-x: auto;
font-family: var(--font-mono);
color: var(--terminal-green);
text-shadow: var(--glow-green);
}
.code-block code {
background: transparent;
border: none;
padding: 0;
}
/* Inline code */
code.inline-code {
background: var(--bg-secondary);
border: 1px solid var(--terminal-green);
padding: 0.2rem 0.4rem;
font-family: var(--font-mono);
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
border-radius: 0;
}
/* Markdown headings in content */
[data-markdown] h1,
[data-markdown] h2,
[data-markdown] h3 {
color: var(--terminal-amber);
text-shadow: var(--glow-amber);
font-family: var(--font-mono);
margin: 1.5rem 0 0.5rem 0;
border-bottom: 2px solid var(--terminal-green);
padding-bottom: 0.5rem;
}
[data-markdown] h1 { font-size: 1.8rem; }
[data-markdown] h2 { font-size: 1.5rem; }
[data-markdown] h3 { font-size: 1.2rem; }
/* Markdown lists */
[data-markdown] ul,
[data-markdown] ol {
margin: 1rem 0;
padding-left: 2rem;
}
[data-markdown] li {
color: var(--terminal-green);
margin: 0.5rem 0;
}
[data-markdown] li::marker {
color: var(--terminal-amber);
}
/* Markdown blockquotes */
[data-markdown] blockquote {
border-left: 4px solid var(--terminal-amber);
background: var(--bg-secondary);
padding: 1rem;
margin: 1rem 0;
color: var(--terminal-green);
font-style: italic;
}
/* Markdown links */
[data-markdown] a {
color: var(--terminal-cyan);
text-decoration: none;
border-bottom: 1px dotted var(--terminal-cyan);
transition: all 0.3s ease;
}
[data-markdown] a:hover {
color: var(--terminal-amber);
border-bottom-color: var(--terminal-amber);
text-shadow: var(--glow-amber);
}
/* Horizontal rules */
[data-markdown] hr {
border: none;
border-top: 2px solid var(--terminal-green);
margin: 2rem 0;
}
/* Markdown paragraphs */
[data-markdown] p {
margin: 1rem 0;
line-height: 1.6;
}
/* Strong/bold text */
[data-markdown] strong {
color: var(--terminal-amber);
font-weight: bold;
text-shadow: var(--glow-amber);
}
/* Italic/emphasized text */
[data-markdown] em {
color: var(--terminal-cyan);
font-style: italic;
}

77
assets/js/markdown.js Normal file
View File

@@ -0,0 +1,77 @@
/**
* Simple Markdown Parser for Tinker Tickets
* Supports basic markdown formatting without external dependencies
*/
function parseMarkdown(markdown) {
if (!markdown) return '';
let html = markdown;
// Escape HTML first to prevent XSS
html = html.replace(/&/g, '&')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;');
// Code blocks (```code```)
html = html.replace(/```([\s\S]*?)```/g, '<pre class="code-block"><code>$1</code></pre>');
// Inline code (`code`)
html = html.replace(/`([^`]+)`/g, '<code class="inline-code">$1</code>');
// Bold (**text** or __text__)
html = html.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
html = html.replace(/__(.+?)__/g, '<strong>$1</strong>');
// Italic (*text* or _text_)
html = html.replace(/\*(.+?)\*/g, '<em>$1</em>');
html = html.replace(/_(.+?)_/g, '<em>$1</em>');
// Links [text](url)
html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>');
// Headers (# H1, ## H2, etc.)
html = html.replace(/^### (.+)$/gm, '<h3>$1</h3>');
html = html.replace(/^## (.+)$/gm, '<h2>$1</h2>');
html = html.replace(/^# (.+)$/gm, '<h1>$1</h1>');
// Lists
// Unordered lists (- item or * item)
html = html.replace(/^\s*[-*]\s+(.+)$/gm, '<li>$1</li>');
html = html.replace(/(<li>.*<\/li>)/s, '<ul>$1</ul>');
// Ordered lists (1. item)
html = html.replace(/^\s*\d+\.\s+(.+)$/gm, '<li>$1</li>');
// Blockquotes (> text)
html = html.replace(/^>\s+(.+)$/gm, '<blockquote>$1</blockquote>');
// Horizontal rules (--- or ***)
html = html.replace(/^(?:---|___|\*\*\*)$/gm, '<hr>');
// Line breaks (two spaces at end of line or double newline)
html = html.replace(/ \n/g, '<br>');
html = html.replace(/\n\n/g, '</p><p>');
// Wrap in paragraph if not already wrapped
if (!html.startsWith('<')) {
html = '<p>' + html + '</p>';
}
return html;
}
// Apply markdown rendering to all elements with data-markdown attribute
function renderMarkdownElements() {
document.querySelectorAll('[data-markdown]').forEach(element => {
const markdownText = element.getAttribute('data-markdown') || element.textContent;
element.innerHTML = parseMarkdown(markdownText);
});
}
// Apply markdown to description and comments on page load
document.addEventListener('DOMContentLoaded', renderMarkdownElements);
// Expose for manual use
window.parseMarkdown = parseMarkdown;
window.renderMarkdownElements = renderMarkdownElements;

View File

@@ -150,14 +150,6 @@ class BulkOperationsModel {
} }
} }
break; break;
case 'bulk_delete':
$success = $ticketModel->deleteTicket($ticketId);
if ($success) {
$auditLogModel->log($operation['performed_by'], 'delete', 'ticket', $ticketId,
['bulk_operation_id' => $operationId]);
}
break;
} }
if ($success) { if ($success) {

View File

@@ -262,7 +262,6 @@
<button onclick="showBulkStatusModal()" class="btn btn-bulk">Change Status</button> <button onclick="showBulkStatusModal()" class="btn btn-bulk">Change Status</button>
<button onclick="showBulkAssignModal()" class="btn btn-bulk">Assign</button> <button onclick="showBulkAssignModal()" class="btn btn-bulk">Assign</button>
<button onclick="showBulkPriorityModal()" class="btn btn-bulk">Priority</button> <button onclick="showBulkPriorityModal()" class="btn btn-bulk">Priority</button>
<button onclick="showBulkDeleteModal()" class="btn btn-bulk" style="background: var(--status-closed); border-color: var(--status-closed);">Delete</button>
<button onclick="clearSelection()" class="btn btn-secondary">Clear</button> <button onclick="clearSelection()" class="btn btn-secondary">Clear</button>
</div> </div>
<?php endif; ?> <?php endif; ?>