Frontend Architecture¶
Version: Arctyk ITSM v0.6.0+
Last Updated: 2025
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