diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc index 0d9097d..67d9f7c 100644 Binary files a/core/__pycache__/context_processors.cpython-311.pyc and b/core/__pycache__/context_processors.cpython-311.pyc differ diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index 16e876c..92a4d66 100644 Binary files a/core/__pycache__/forms.cpython-311.pyc and b/core/__pycache__/forms.cpython-311.pyc differ diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 8b0ae5e..e699863 100644 Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ diff --git a/core/context_processors.py b/core/context_processors.py index 0d1599d..265d612 100644 --- a/core/context_processors.py +++ b/core/context_processors.py @@ -17,7 +17,8 @@ def project_context(request): "project_address": settings.app_address, "project_phone": settings.app_phone, "project_email": settings.app_email, + "app_settings": settings, # Passing the whole object for easier access to new fields "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), # Used for cache-busting static assets "deployment_timestamp": int(time.time()), - } \ No newline at end of file + } diff --git a/core/forms.py b/core/forms.py index cd5e243..e32b761 100644 --- a/core/forms.py +++ b/core/forms.py @@ -4,13 +4,20 @@ from .models import Supplier, Faktur, Medicine, Batch, StockTransaction, Categor class AppSettingForm(forms.ModelForm): class Meta: model = AppSetting - fields = ['app_name', 'app_description', 'app_address', 'app_phone', 'app_email'] + fields = [ + 'app_name', 'app_description', 'app_address', 'app_phone', 'app_email', + 'theme_color', 'font_family', 'font_color', 'sidebar_theme' + ] widgets = { 'app_name': forms.TextInput(attrs={'class': 'form-control'}), 'app_description': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), 'app_address': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), 'app_phone': forms.TextInput(attrs={'class': 'form-control'}), 'app_email': forms.EmailInput(attrs={'class': 'form-control'}), + 'theme_color': forms.Select(attrs={'class': 'form-select'}), + 'font_family': forms.Select(attrs={'class': 'form-select'}), + 'font_color': forms.TextInput(attrs={'class': 'form-control', 'type': 'color'}), + 'sidebar_theme': forms.Select(attrs={'class': 'form-select'}), } class CategoryForm(forms.ModelForm): @@ -116,4 +123,4 @@ class StockOutForm(forms.Form): except (ValueError, TypeError): pass elif self.initial.get('medicine'): - self.fields['batch'].queryset = Batch.objects.filter(medicine_id=self.initial.get('medicine'), quantity__gt=0) + self.fields['batch'].queryset = Batch.objects.filter(medicine_id=self.initial.get('medicine'), quantity__gt=0) \ No newline at end of file diff --git a/core/migrations/0005_appsetting_font_color_appsetting_font_family_and_more.py b/core/migrations/0005_appsetting_font_color_appsetting_font_family_and_more.py new file mode 100644 index 0000000..43006a2 --- /dev/null +++ b/core/migrations/0005_appsetting_font_color_appsetting_font_family_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 5.2.7 on 2026-02-06 12:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0004_appsetting'), + ] + + operations = [ + migrations.AddField( + model_name='appsetting', + name='font_color', + field=models.CharField(default='#2d3748', max_length=7, verbose_name='Warna Font Utama'), + ), + migrations.AddField( + model_name='appsetting', + name='font_family', + field=models.CharField(choices=[('Inter', 'Inter (Modern)'), ('Poppins', 'Poppins (Friendly)'), ('Roboto', 'Roboto (Clean)'), ('Montserrat', 'Montserrat (Elegant)'), ('Playfair Display', 'Playfair (Classic)')], default='Inter', max_length=50, verbose_name='Jenis Font'), + ), + migrations.AddField( + model_name='appsetting', + name='sidebar_theme', + field=models.CharField(choices=[('light', 'Light'), ('dark', 'Dark'), ('glass', 'Glassmorphism')], default='glass', max_length=20, verbose_name='Gaya Sidebar'), + ), + migrations.AddField( + model_name='appsetting', + name='theme_color', + field=models.CharField(choices=[('primary', 'Ocean Blue'), ('success', 'Emerald Green'), ('indigo', 'Royal Purple'), ('orange', 'Sunset Orange'), ('dark', 'Midnight Dark'), ('secondary', 'Minimalist Gray')], default='primary', max_length=20, verbose_name='Warna Tema'), + ), + ] diff --git a/core/migrations/0006_alter_appsetting_theme_color.py b/core/migrations/0006_alter_appsetting_theme_color.py new file mode 100644 index 0000000..3addede --- /dev/null +++ b/core/migrations/0006_alter_appsetting_theme_color.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.7 on 2026-02-06 12:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0005_appsetting_font_color_appsetting_font_family_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='appsetting', + name='theme_color', + field=models.CharField(choices=[('primary', 'Ocean Blue'), ('success', 'Emerald Green'), ('indigo', 'Royal Purple'), ('orange', 'Sunset Orange'), ('dark', 'Midnight Dark'), ('secondary', 'Minimalist Gray'), ('white', 'Clean White')], default='primary', max_length=20, verbose_name='Warna Tema'), + ), + ] diff --git a/core/migrations/__pycache__/0005_appsetting_font_color_appsetting_font_family_and_more.cpython-311.pyc b/core/migrations/__pycache__/0005_appsetting_font_color_appsetting_font_family_and_more.cpython-311.pyc new file mode 100644 index 0000000..0303de9 Binary files /dev/null and b/core/migrations/__pycache__/0005_appsetting_font_color_appsetting_font_family_and_more.cpython-311.pyc differ diff --git a/core/migrations/__pycache__/0006_alter_appsetting_theme_color.cpython-311.pyc b/core/migrations/__pycache__/0006_alter_appsetting_theme_color.cpython-311.pyc new file mode 100644 index 0000000..0463523 Binary files /dev/null and b/core/migrations/__pycache__/0006_alter_appsetting_theme_color.cpython-311.pyc differ diff --git a/core/models.py b/core/models.py index b0e3a39..7ab7a00 100644 --- a/core/models.py +++ b/core/models.py @@ -2,12 +2,62 @@ from django.db import models from django.utils import timezone class AppSetting(models.Model): + THEME_CHOICES = [ + ('primary', 'Ocean Blue'), + ('success', 'Emerald Green'), + ('indigo', 'Royal Purple'), + ('orange', 'Sunset Orange'), + ('dark', 'Midnight Dark'), + ('secondary', 'Minimalist Gray'), + ('white', 'Clean White'), + ] + + FONT_CHOICES = [ + ('Inter', 'Inter (Modern)'), + ('Poppins', 'Poppins (Friendly)'), + ('Roboto', 'Roboto (Clean)'), + ('Montserrat', 'Montserrat (Elegant)'), + ('Playfair Display', 'Playfair (Classic)'), + ] + app_name = models.CharField(max_length=100, default="DN-WRS", verbose_name="Nama Aplikasi") app_description = models.TextField(blank=True, verbose_name="Deskripsi Aplikasi") app_address = models.TextField(blank=True, verbose_name="Alamat") app_phone = models.CharField(max_length=20, blank=True, verbose_name="Nomor Telepon") app_email = models.EmailField(blank=True, verbose_name="Email") + # Theme Management + theme_color = models.CharField(max_length=20, choices=THEME_CHOICES, default='primary', verbose_name="Warna Tema") + font_family = models.CharField(max_length=50, choices=FONT_CHOICES, default='Inter', verbose_name="Jenis Font") + font_color = models.CharField(max_length=7, default="#2d3748", verbose_name="Warna Font Utama") + sidebar_theme = models.CharField(max_length=20, choices=[('light', 'Light'), ('dark', 'Dark'), ('glass', 'Glassmorphism')], default='glass', verbose_name="Gaya Sidebar") + + @property + def theme_hex(self): + colors = { + 'primary': '#0d6efd', + 'success': '#10b981', + 'indigo': '#6366f1', + 'orange': '#f59e0b', + 'dark': '#1e293b', + 'secondary': '#64748b', + 'white': '#ffffff', + } + return colors.get(self.theme_color, '#0d6efd') + + @property + def theme_gradient_end(self): + colors = { + 'primary': '#00d2ff', + 'success': '#34d399', + 'indigo': '#a855f7', + 'orange': '#fbbf24', + 'dark': '#475569', + 'secondary': '#94a3b8', + 'white': '#f8fafc', + } + return colors.get(self.theme_color, '#00d2ff') + def __str__(self): return self.app_name @@ -15,6 +65,7 @@ class AppSetting(models.Model): verbose_name = "Pengaturan Aplikasi" verbose_name_plural = "Pengaturan Aplikasi" +# ... rest of the file stays same class Category(models.Model): name = models.CharField(max_length=100, verbose_name="Nama Kategori") description = models.TextField(blank=True, verbose_name="Deskripsi") @@ -145,4 +196,4 @@ class StockTransaction(models.Model): class Meta: verbose_name_plural = "Transaksi Stok" - verbose_name = "Transaksi Stok" \ No newline at end of file + verbose_name = "Transaksi Stok" diff --git a/core/templates/base.html b/core/templates/base.html index 12a5b04..535ad96 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -7,10 +7,22 @@