diff --git a/src_backup/add_comment.php b/src_backup/add_comment.php new file mode 100644 index 0000000..cfcbae6 --- /dev/null +++ b/src_backup/add_comment.php @@ -0,0 +1,50 @@ +prepare($sql); + +// Convert markdown_enabled to integer for database +$markdownEnabled = $data['markdown_enabled'] ? 1 : 0; + +$stmt->bind_param("sssi", + $data['ticket_id'], + $username, + $data['comment_text'], + $markdownEnabled +); + +if ($stmt->execute()) { + header('Content-Type: application/json'); + echo json_encode([ + 'success' => true, + 'user_name' => $username, + 'created_at' => date('M d, Y H:i'), + 'markdown_enabled' => $markdownEnabled + ]); +} else { + echo json_encode([ + 'success' => false, + 'error' => $conn->error + ]); +} + +$stmt->close(); +$conn->close(); diff --git a/src_backup/assets/css/dashboard.css b/src_backup/assets/css/dashboard.css new file mode 100644 index 0000000..d68e1f0 --- /dev/null +++ b/src_backup/assets/css/dashboard.css @@ -0,0 +1,553 @@ +/* Variables */ +:root { + --bg-primary: #f5f7fa; + --bg-secondary: #ffffff; + --text-primary: #2c3e50; + --text-secondary: #4a5568; + --border-color: #eee; + --shadow: 0 2px 4px rgba(0,0,0,0.1); + --hover-bg: #f8f9fa; + --priority-1: #ff4d4d; + --priority-2: #ffa726; + --priority-3: #42a5f5; + --priority-4: #66bb6a; + + /* Spacing */ + --spacing-xs: 0.5rem; + --spacing-sm: 1rem; + --spacing-md: 1.5rem; + --spacing-lg: 2rem; + + /* Transitions */ + --transition-default: all 0.3s ease; +} + +/* Dark theme */ +[data-theme="dark"] { + --bg-primary: #1a202c; + --bg-secondary: #2d3748; + --text-primary: #f7fafc; + --text-secondary: #e2e8f0; + --border-color: #4a5568; + --shadow: 0 2px 4px rgba(0,0,0,0.3); + --hover-bg: #374151; + --priority-1: #7f1d1d; + --priority-2: #854d0e; + --priority-3: #075985; + --priority-4: #166534; +} + +/* Base Elements */ +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + margin: 0; + padding: var(--spacing-md); + background-color: var(--bg-primary); + color: var(--text-primary); + transition: var(--transition-default); +} + +/* Reusable Components */ +.card-base { + background: var(--bg-secondary); + border-radius: 12px; + box-shadow: var(--shadow); + padding: var(--spacing-md); +} + +.btn-base { + padding: var(--spacing-sm) var(--spacing-md); + border-radius: 6px; + border: none; + cursor: pointer; + transition: var(--transition-default); +} + +.btn-primary { + background: #3b82f6; + color: white; +} + +/* Layout Components */ +.dashboard-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--spacing-md); + margin-left: 3.75rem; +} + +.ticket-container { + max-width: 800px; + margin: var(--spacing-lg) auto; + border-left: 6px solid; + transition: var(--transition-default); +} + +.flex-row { + display: flex; + gap: var(--spacing-sm); +} + +.flex-between { + justify-content: space-between; + align-items: center; +} + +/* Table Styles */ +.table-base { + width: 100%; + border-collapse: separate; + border-spacing: 0; + overflow: hidden; +} + +.table-cell { + padding: var(--spacing-md); + text-align: left; + border-bottom: 1px solid var(--border-color); +} + +/* Priority Styles */ +.priority-indicator { + font-weight: bold; + font-family: 'Courier New', monospace; + padding: var(--spacing-xs) var(--spacing-sm); + border-radius: 4px; + display: inline-block; +} + +.priority-1 { color: var(--priority-1); } +.priority-2 { color: var(--priority-2); } +.priority-3 { color: var(--priority-3); } +.priority-4 { color: var(--priority-4); } + +/* Status Styles */ +.status-base { + font-weight: bold; + padding: var(--spacing-xs) var(--spacing-sm); + border-radius: 4px; +} + +.status-Open { + color: #10b981; + background: rgba(16, 185, 129, 0.1); +} + +.status-Closed { + color: #ef4444; + background: rgba(239, 68, 68, 0.1); +} + +/*UNCHECKED BELOW*/ + +body.menu-open { + padding-left: 260px; +} + +.create-ticket { + background: #3b82f6; + color: white; + padding: 0.625rem 1.25rem; + border-radius: 0.375rem; + border: none; + cursor: pointer; + font-weight: 500; + transition: background-color 0.3s ease; + margin-right: 3.75rem; +} + +.create-ticket:hover { + background: #2563eb; +} + +h1 { + color: var(--text-primary); + margin: 0; +} + +table { + width: 100%; + border-collapse: separate; + border-spacing: 0; + background: var(--bg-secondary); + border-radius: 12px; + box-shadow: var(--shadow); + overflow: hidden; +} + +th, td { + padding: 16px; + text-align: left; + border-bottom: 1px solid var(--border-color); + color: var(--text-primary); +} + +th { + background-color: var(--bg-secondary); + font-weight: 600; + text-transform: uppercase; + font-size: 0.9em; + letter-spacing: 0.05em; +} + +tr:hover { + background-color: var(--hover-bg); +} + +tbody tr td:first-child { + border-left: 6px solid; +} + +tbody tr.priority-1 td:first-child { border-left-color: var(--priority-1); } +tbody tr.priority-2 td:first-child { border-left-color: var(--priority-2); } +tbody tr.priority-3 td:first-child { border-left-color: var(--priority-3); } +tbody tr.priority-4 td:first-child { border-left-color: var(--priority-4); } + +/* Priority number styling */ +td:nth-child(2) { + text-align: center; +} + +td:nth-child(2) span { + font-weight: bold; + font-family: 'Courier New', monospace; + padding: 4px 8px; + border-radius: 4px; + display: inline-block; + background: var(--hover-bg); +} + +.priority-1 td:nth-child(2) { color: var(--priority-1); } +.priority-2 td:nth-child(2) { color: var(--priority-2); } +.priority-3 td:nth-child(2) { color: var(--priority-3); } +.priority-4 td:nth-child(2) { color: var(--priority-4); } + +.search-box { + padding: 0.5rem 0.75rem; + border: 1px solid var(--border-color); + border-radius: 0.375rem; + background: var(--bg-secondary); + color: var(--text-primary); + margin-left: 1.25rem; + width: 40%; +} + +.status-filter { + padding: 0.5rem 0.75rem; + border: 1px solid var(--border-color); + border-radius: 0.375rem; + background: var(--bg-secondary); + color: var(--text-primary); + cursor: pointer; + min-width: 120px; + margin-right: 1rem; +} + +.search-box:focus, +.status-filter:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1); +} + +.theme-toggle { + position: absolute; + top: 20px; + right: 20px; + z-index: 100; + padding: 12px; + border-radius: 50%; + background: var(--bg-secondary); + border: 1px solid var(--border-color); + cursor: pointer; + box-shadow: var(--shadow); + font-size: 1.2em; + transition: transform 0.3s ease; +} + +.theme-toggle:hover { + transform: scale(1.1); +} + +.table-controls { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 15px; + padding: 10px; + background: var(--bg-secondary); + border-radius: 8px; + box-shadow: var(--shadow); +} + +.ticket-count { + font-weight: 500; + color: var(--text-secondary); +} + +.table-actions { + display: flex; + gap: 15px; + align-items: center; +} +.pagination { + display: flex; + gap: 0.5rem; + align-items: center; +} + +.pagination button { + padding: 0.5rem 0.75rem; + border: 1px solid var(--border-color); + background: var(--bg-secondary); + color: var(--text-primary); + border-radius: 0.375rem; + cursor: pointer; + transition: all 0.2s ease; +} + +.pagination button:hover { + background: var(--hover-bg); +} + +.pagination button.active { + background: #3b82f6; + color: white; + border-color: #3b82f6; +} + +.settings-icon { + cursor: pointer; + padding: 8px; + border-radius: 4px; + transition: background-color 0.2s; +} + +.settings-icon:hover { + background: var(--hover-bg); +} + +/* Settings Modal Styles */ +.settings-modal-backdrop { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; +} + +.settings-modal { + background: var(--bg-secondary); + border-radius: 12px; + width: 500px; + max-width: 90%; + box-shadow: var(--shadow); + padding: 20px; +} + +.settings-modal-header { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid var(--border-color); + padding-bottom: 15px; + margin-bottom: 15px; +} + +.settings-modal-header h2 { + margin: 0; + color: var(--text-primary); +} + +.close-modal { + background: none; + border: none; + font-size: 24px; + cursor: pointer; + color: var(--text-secondary); +} + +.setting-group { + margin-bottom: 15px; +} + +.setting-group label { + display: block; + margin-bottom: 8px; + color: var(--text-primary); +} + +.setting-group select { + width: 100%; + padding: 10px; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); + color: var(--text-primary); +} + +.settings-modal-footer { + display: flex; + justify-content: flex-end; + gap: 10px; + border-top: 1px solid var(--border-color); + padding-top: 15px; +} + +.save-settings, .cancel-settings { + padding: 10px 20px; + border-radius: 6px; + border: none; + cursor: pointer; + transition: background-color 0.3s ease; +} + +.save-settings { + background: #3b82f6; + color: white; +} + +.cancel-settings { + background: var(--hover-bg); + color: var(--text-primary); +} + +/* Sorting indicator styles */ +th { + position: relative; /* Ensure proper positioning of arrows */ + cursor: pointer; /* Show it's clickable */ +} + +th::after { + content: ''; + position: absolute; + right: 8px; + top: 50%; + transform: translateY(-50%); + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + opacity: 0.5; /* Make arrows less prominent when not active */ +} + +th.sort-asc::after { + border-bottom: 7px solid var(--text-primary); + opacity: 1; +} + +th.sort-desc::after { + border-top: 7px solid var(--text-primary); + opacity: 1; +} +/* Column toggle styles */ +.column-toggles { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 10px; +} + +.column-toggles label { + display: flex; + align-items: center; + gap: 8px; +} + +.hamburger-menu { + position: absolute; + top: 20px; + left: 20px; + z-index: 100; +} + +.hamburger-icon { + cursor: pointer; + font-size: 24px; + background: var(--bg-secondary); + padding: 10px; + border-radius: 4px; + box-shadow: var(--shadow); +} + +.hamburger-content { + position: fixed; + top: 0; + left: -250px; + width: 200px; + height: 100%; + background: var(--bg-secondary); + box-shadow: 2px 0 5px rgba(0,0,0,0.1); + transition: left 0.3s ease, margin-left 0.3s ease; + padding: 40px 20px 20px; + overflow-y: auto; + z-index: 99; +} + +.hamburger-content.open { + left: 0; +} + +.close-hamburger { + position: absolute; + top: 10px; + right: 10px; + cursor: pointer; + font-size: 24px; + background: var(--bg-secondary); + padding: 10px; + border-radius: 4px; + box-shadow: var(--shadow); +} + +.filter-section { + margin-bottom: 20px; +} + +.filter-section label { + display: block; + margin-bottom: 10px; +} + +.filter-actions { + display: flex; + gap: 10px; +} + +.filter-actions button { + flex: 1; + padding: 10px; + border: none; + border-radius: 4px; + cursor: pointer; +} + +#apply-filters { + background: #3b82f6; + color: white; +} + +#clear-filters { + background: var(--hover-bg); + color: var(--text-primary); +} + +.ticket-link { + font-family: 'Courier New', monospace; + font-weight: bold; + color: var(--text-primary) !important; + text-decoration: none; + background: var(--hover-bg); + padding: 4px 8px; + border-radius: 4px; + display: inline-block; +} + +.ticket-link:hover { + background: var(--border-color); +} diff --git a/src_backup/assets/css/ticket.css b/src_backup/assets/css/ticket.css new file mode 100644 index 0000000..b980f8e --- /dev/null +++ b/src_backup/assets/css/ticket.css @@ -0,0 +1,413 @@ +/* Base Layout Components */ +.ticket-container { + max-width: 800px; + margin: 40px auto; + padding: 20px; + background: var(--bg-secondary); + border-radius: 12px; + box-shadow: var(--shadow); + border-left: 6px solid; + transition: border-color 0.3s ease; +} + +.full-width { + grid-column: 1 / -1; +} +/* Header Components */ +.ticket-header { + display: flex; + flex-direction: column; + margin-bottom: 30px; +} + +.ticket-subheader { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 10px; +} + +.header-controls { + display: flex; + gap: 15px; + align-items: center; +} + +.ticket-id { + font-family: 'Courier New', monospace; + margin-right: 20px; +} + +h1 { + margin: 0; + padding: 0; + width: 100%; + display: block; +} + +/* Title Input Styles */ +.title-input { + font-size: 1em; + font-weight: bold; + width: 100%; + border: 2px solid transparent; + border-radius: 4px; + padding: 4px; + margin: -4px; + word-break: break-word; + white-space: normal; + display: block; +}.title-input:not(:disabled) { + border-color: var(--border-color); + background: var(--bg-primary); +} + +.title-input:not(:disabled):hover { + border-color: #3b82f6; +} + +.title-input:disabled { + color: var(--text-primary); + border: none; + background: transparent; +} + +/* Form Elements */ +.detail-group { + margin-bottom: 20px; +} + +.detail-group label { + display: block; + margin-bottom: 8px; + color: var(--text-secondary); + font-weight: 500; +} + +.editable { + padding: 10px; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); + color: var(--text-primary); +} + +input.editable { + width: calc(100% - 20px); + box-sizing: border-box; +} + +textarea.editable { + width: calc(100% - 20px); + min-height: 150px; + resize: vertical; + box-sizing: border-box; +} + +.editable:disabled { + background: var(--bg-secondary); + cursor: default; + border-color: transparent; +} + +/* Button Styles */ +.btn { + padding: 10px 20px; + border: none; + border-radius: 6px; + cursor: pointer; + font-weight: 500; + background: var(--bg-primary); + color: var(--text-primary); +} + +.btn.primary { + background: #3b82f6; + color: white; +} + +.btn.active { + background: #3b82f6; + color: white; +} + +/* Status and Priority Styles */ +.status-priority-row { + display: flex; + gap: 20px; +} + +.detail-half { + flex: 1; +} + +.status-priority-group { + display: flex; + gap: 10px; + align-items: center; + margin-right: 15px; +} + +.priority-indicator { + padding: 4px 8px; + border-radius: 4px; + font-weight: bold; +} + +/* Priority Select Styles */ +select[data-field="priority"] { + border-left: 4px solid; +} + +select[data-field="priority"] option { + padding: 10px; +} + +select[data-field="priority"] option[value="1"] { + background-color: var(--priority-1); +} +select[data-field="priority"] option[value="2"] { + background-color: var(--priority-2); +} +select[data-field="priority"] option[value="3"] { + background-color: var(--priority-3); +} +select[data-field="priority"] option[value="4"] { + background-color: var(--priority-4); +} + +select[data-field="priority"][value="1"] { + border-left-color: var(--priority-1); +} +select[data-field="priority"][value="2"] { + border-left-color: var(--priority-2); +} +select[data-field="priority"][value="3"] { + border-left-color: var(--priority-3); +} +select[data-field="priority"][value="4"] { + border-left-color: var(--priority-4); +} + +select[data-field="priority"] option[value="1"]:hover { + background-color: #ffc9c9; + color: var(--text-primary); +} + +select[data-field="priority"] option[value="2"]:hover { + background-color: #ffe0b2; + color: var(--text-primary); +} + +select[data-field="priority"] option[value="3"]:hover { + background-color: #bbdefb; + color: var(--text-primary); +} + +select[data-field="priority"] option[value="4"]:hover { + background-color: #c8e6c9; + color: var(--text-primary); +} + +[data-priority="1"] { border-color: var(--priority-1); } +[data-priority="2"] { border-color: var(--priority-2); } +[data-priority="3"] { border-color: var(--priority-3); } +[data-priority="4"] { border-color: var(--priority-4); } + +/* Comments Section */ +.comments-section { + margin-top: 30px; + padding-top: 20px; + border-top: 1px solid var(--border-color); +} + +.comment-form { + margin-bottom: 20px; +} + +.comment-form textarea { + width: calc(100% - 20px); + min-height: 80px; + margin-bottom: 10px; + padding: 10px; + border-radius: 6px; + border: 1px solid var(--border-color); + background: var(--bg-primary); + color: var(--text-primary); +} + +.comment { + background: var(--bg-primary); + padding: 15px; + border-radius: 6px; + margin-bottom: 10px; +} + +.comment-header { + display: flex; + justify-content: space-between; + margin-bottom: 8px; + font-size: 0.9em; +} + +.comment-user { + font-weight: bold; + color: var(--text-primary); +} + +.comment-date { + color: var(--text-secondary); +} + +.comment-text { + color: var(--text-primary); + line-height: 1.4; +} + +.comment-controls { + display: flex; + justify-content: space-between; + align-items: center; + margin: 10px 0; +} + +/* Comment Tabs */ +.ticket-tabs { + display: flex; + gap: 10px; + margin: 20px 0; +} + +.tab-btn { + padding: 10px 20px; + border: 1px solid var(--border-color); + background: var(--bg-secondary); + border-radius: 6px; + cursor: pointer; + font-weight: 500; +} + +.tab-btn.active { + background: #3b82f6; + color: white; + border-color: #3b82f6; +} + +.tab-content { + display: none; +} + +.tab-content.active { + display: block; +} + +/* Markdown Styles */ +.markdown-preview { + min-height: 100px; + padding: 10px; + border: 1px solid var(--border-color); + border-radius: 6px; + background: var(--bg-primary); +} + +.markdown-preview h1, +.markdown-preview h2, +.markdown-preview h3 { + margin-top: 0; +} + +.markdown-preview code { + background: var(--bg-secondary); + padding: 2px 4px; + border-radius: 4px; +} + +.markdown-preview pre { + background: var(--bg-secondary); + padding: 10px; + border-radius: 6px; + overflow-x: auto; +} + +.markdown-toggles { + display: flex; + gap: 20px; +} + +/* Toggle Switch */ +.switch { + position: relative; + display: inline-block; + width: 50px; + height: 24px; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--bg-secondary); + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 16px; + width: 16px; + left: 4px; + bottom: 4px; + background-color: white; + transition: .4s; +} + +.slider.round { + border-radius: 24px; +} + +.slider.round:before { + border-radius: 50%; +} + +input:checked + .slider { + background-color: #3b82f6; +} + +input:checked + .slider:before { + transform: translateX(26px); +} + +.switch input:disabled + .slider { + opacity: 0.5; + cursor: not-allowed; +} + +/* Footer */ +.ticket-footer { + margin-top: 30px; + padding-top: 20px; + border-top: 1px solid var(--border-color); +} + +.back-btn { + background: var(--bg-secondary); + color: var(--text-primary); + padding: 10px 20px; + border-radius: 6px; + border: 1px solid var(--border-color); + cursor: pointer; + transition: background-color 0.3s ease; +} + +.back-btn:hover { + background: var(--border-color); +} \ No newline at end of file diff --git a/src_backup/assets/images/favicon.png b/src_backup/assets/images/favicon.png new file mode 100644 index 0000000..2a27167 Binary files /dev/null and b/src_backup/assets/images/favicon.png differ diff --git a/src_backup/assets/js/dashboard.js b/src_backup/assets/js/dashboard.js new file mode 100644 index 0000000..b1ebc23 --- /dev/null +++ b/src_backup/assets/js/dashboard.js @@ -0,0 +1,487 @@ +document.addEventListener('DOMContentLoaded', function() { + // Only initialize filters if we're on the dashboard + if (document.querySelector('table')) { + initSearch(); + initStatusFilter(); + } + + // Keep theme toggle for all pages + initThemeToggle(); + + // Load saved theme preference + const savedTheme = localStorage.getItem('theme') || 'light'; + document.documentElement.setAttribute('data-theme', savedTheme); + + // Add sorting functionality + const tableHeaders = document.querySelectorAll('th'); + tableHeaders.forEach(header => { + header.addEventListener('click', () => { + const table = header.closest('table'); + const index = Array.from(header.parentElement.children).indexOf(header); + sortTable(table, index); + }); + }); + + // Add settings modal functionality + const settingsIcon = document.querySelector('.settings-icon'); + if (settingsIcon) { + settingsIcon.addEventListener('click', function(e) { + e.preventDefault(); + createSettingsModal(); + }); + } +}); + +function sortTable(table, column) { + // Remove existing sort indicators from all headers + const headers = table.querySelectorAll('th'); + headers.forEach(header => { + header.classList.remove('sort-asc', 'sort-desc'); + }); + + const rows = Array.from(table.querySelectorAll('tbody tr')); + + // Determine current sort direction + const currentDirection = table.dataset.sortColumn === column + ? (table.dataset.sortDirection === 'asc' ? 'desc' : 'asc') + : 'asc'; + + // Store current sorting column and direction + table.dataset.sortColumn = column; + table.dataset.sortDirection = currentDirection; + + rows.sort((a, b) => { + const aValue = a.children[column].textContent.trim(); + const bValue = b.children[column].textContent.trim(); + + // Try numeric sorting first, fallback to string comparison + const numA = parseFloat(aValue); + const numB = parseFloat(bValue); + + if (!isNaN(numA) && !isNaN(numB)) { + return currentDirection === 'asc' ? numA - numB : numB - numA; + } + + // String comparison + return currentDirection === 'asc' + ? aValue.localeCompare(bValue) + : bValue.localeCompare(aValue); + }); + + // Add sort indicator to the current header + const currentHeader = headers[column]; + currentHeader.classList.add(currentDirection === 'asc' ? 'sort-asc' : 'sort-desc'); + + // Reorder rows in the tbody + const tbody = table.querySelector('tbody'); + rows.forEach(row => tbody.appendChild(row)); +} + +// Add this to the DOMContentLoaded event listener to persist sorting on page load +document.addEventListener('DOMContentLoaded', function() { + const table = document.querySelector('table'); + if (table) { + const savedSortColumn = localStorage.getItem('sortColumn'); + const savedSortDirection = localStorage.getItem('sortDirection'); + + if (savedSortColumn !== null && savedSortDirection !== null) { + const headers = table.querySelectorAll('th'); + const columnIndex = Array.from(headers).findIndex(header => + header.textContent.toLowerCase().replace(' ', '_') === savedSortColumn + ); + + if (columnIndex !== -1) { + table.dataset.sortColumn = columnIndex; + table.dataset.sortDirection = savedSortDirection; + + const header = headers[columnIndex]; + header.classList.add(savedSortDirection === 'asc' ? 'sort-asc' : 'sort-desc'); + } + } + } +}); + +// Modify the existing event listeners for table headers +document.addEventListener('DOMContentLoaded', function() { + const tableHeaders = document.querySelectorAll('th'); + tableHeaders.forEach((header, index) => { + header.addEventListener('click', () => { + const table = header.closest('table'); + sortTable(table, index); + + // Save sorting preferences + const columnName = header.textContent.toLowerCase().replace(' ', '_'); + localStorage.setItem('sortColumn', columnName); + localStorage.setItem('sortDirection', table.dataset.sortDirection); + }); + }); +}); +function createSettingsModal() { + // Create modal backdrop + const backdrop = document.createElement('div'); + backdrop.className = 'settings-modal-backdrop'; + backdrop.innerHTML = ` +
| Ticket ID | +Priority | +Title | +Category | +Type | +Status | +Created | +Updated | +
|---|---|---|---|---|---|---|---|
| {$row['ticket_id']} | "; + echo "{$row['priority']} | "; + echo "{$row['title']} | "; + echo "{$row['category']} | "; + echo "{$row['type']} | "; + echo "{$row['status']} | "; + echo "" . date('Y-m-d H:i', strtotime($row['created_at'])) . " | "; + echo "" . date('Y-m-d H:i', strtotime($row['updated_at'])) . " | "; + echo "
| No tickets found | |||||||