Frontend Architecture¶
This page documents the frontend architecture of Arctyk ITSM, including templates, SCSS, and JavaScript organization.
Overview¶
Arctyk ITSM uses a traditional server-rendered approach with progressive enhancement:
- Django Templates - Server-side HTML rendering
- SCSS - Modular, compiled stylesheets
- Vanilla JavaScript - Progressive enhancement for interactivity
- AJAX - For dynamic form submissions and updates
Template Architecture¶
See Template Architecture for detailed information.
Key Concepts¶
- Inheritance - Base templates extended by page templates
- Partials - Reusable template fragments
- Blocks - Override points for child templates
- Context Processors - Global template variables
SCSS Architecture¶
Directory Structure¶
STATIC_SRC/scss/
├── main.scss # Main entry point
├── base/
│ ├── _reset.scss # CSS reset
│ ├── _typography.scss
│ └── _variables.scss # Colors, fonts, spacing
├── layout/
│ ├── _sidebar.scss
│ ├── _topbar.scss
│ └── _grid.scss
├── components/
│ ├── _buttons.scss
│ ├── _forms.scss
│ ├── _tables.scss
│ ├── _modals.scss
│ └── _badges.scss
└── views/
├── _ticket_list.scss
├── _ticket_detail.scss
└── _dashboard.scss
Build Process¶
See SCSS Structure for details.
JavaScript Architecture¶
Directory Structure¶
STATIC_SRC/js/
├── main.js # Global scripts
├── components/
│ ├── sidebar.js # Sidebar interactions
│ ├── modal.js # Modal dialogs
│ └── dropdown.js # Dropdown menus
└── views/
├── ticket_form.js # Ticket form handling
└── ticket_list.js # Ticket list filtering
Patterns¶
Module Pattern:
// sidebar.js
const Sidebar = (function() {
'use strict';
function toggle() {
document.body.classList.toggle('sidebar-collapsed');
}
function init() {
const toggleBtn = document.querySelector('.sidebar-toggle');
if (toggleBtn) {
toggleBtn.addEventListener('click', toggle);
}
}
return {
init: init
};
})();
// Initialize on DOMContentLoaded
document.addEventListener('DOMContentLoaded', Sidebar.init);
AJAX Form Submission:
// ticket_form.js
function submitTicketForm(form) {
const formData = new FormData(form);
fetch(form.action, {
method: 'POST',
body: formData,
headers: {
'X-Requested-With': 'XMLHttpRequest',
'X-CSRFToken': formData.get('csrfmiddlewaretoken')
}
})
.then(response => response.json())
.then(data => {
if (data.success) {
window.location.href = data.redirect_url;
} else {
displayErrors(data.errors);
}
})
.catch(error => console.error('Error:', error));
}
See JavaScript Patterns for details.
Static File Serving¶
Development¶
Django serves static files directly:
Production¶
Nginx serves static files:
location /static/ {
alias /var/www/arctyk/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}
Collect static files:
Asset Pipeline¶
Build Tools¶
// package.json
{
"scripts": {
"build:scss": "sass STATIC_SRC/scss:static/css --style=compressed",
"watch:scss": "sass STATIC_SRC/scss:static/css --watch",
"build": "npm run build:scss"
}
}
Build Process¶
- Write SCSS in
STATIC_SRC/scss/ - Run
npm run build:scss - CSS output to
static/css/ - Django serves from
static/css/ - In production, Nginx serves directly
Performance Optimization¶
CSS Optimization¶
- Minification - Compressed output from Sass
- Critical CSS - Inline critical styles in
<head> - Lazy loading - Load non-critical CSS async
JavaScript Optimization¶
- Minimize HTTP requests - Concatenate scripts
- Defer non-critical JS - Use
deferattribute - Code splitting - Load page-specific scripts only
Image Optimization¶
- WebP format - Use modern image formats
- Lazy loading - Load images on scroll
- Responsive images - Serve appropriate sizes
Browser Support¶
Supported Browsers¶
- Chrome - Last 2 versions
- Firefox - Last 2 versions
- Safari - Last 2 versions
- Edge - Last 2 versions
Progressive Enhancement¶
Core functionality works without JavaScript. JavaScript enhances: - Form validation - AJAX submissions - Interactive components - Real-time updates