diff --git a/ROADMAP.md b/ROADMAP.md index 67cfc0b..a273576 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -40,8 +40,8 @@ volgt. - [x] Per vak **automatisch een passend icoon** (afgeleid van de naam) — getoond in het rooster en bij Activiteiten/vakken. - - [ ] Optioneel: een icoon handmatig kunnen kiezen/overschrijven (vereist een - `icoon`-veld op Activiteit + migratie). + - [x] Optioneel: een icoon handmatig kunnen kiezen/overschrijven (`icoon`-veld + op Activiteit + migratie core 0007; leeg = automatisch op naam). ## Stage-module — uitbreidingen @@ -68,6 +68,9 @@ volgt. een zijbalk "nog niet ingedeeld". Personen naar elk niveau slepen; × haalt ze weer weg. Leerlingen licht gekleurd, personeel donker; duidelijke gekleurde structuur per niveau. Inline aanmaken/hernoemen. +- [x] **Toon-filter** (Allen / Leerlingen / Personeel) en **multi-select**: meerdere + personen aanvinken en in één keer in een gekozen groep plaatsen (of de + selectie samen slepen). ## Koppelingen & inzetregels diff --git a/backend/core/migrations/0007_activiteit_icoon.py b/backend/core/migrations/0007_activiteit_icoon.py new file mode 100644 index 0000000..3679668 --- /dev/null +++ b/backend/core/migrations/0007_activiteit_icoon.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.15 on 2026-06-16 20:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0006_lokaal_lokaalinstelling_roosterblok_lokaal'), + ] + + operations = [ + migrations.AddField( + model_name='activiteit', + name='icoon', + field=models.CharField(blank=True, help_text='Optioneel emoji; leeg = automatisch gekozen op naam.', max_length=8, verbose_name='icoon'), + ), + ] diff --git a/backend/core/models.py b/backend/core/models.py index d04dbab..4c55303 100644 --- a/backend/core/models.py +++ b/backend/core/models.py @@ -285,6 +285,7 @@ class Activiteit(models.Model): naam = models.CharField("naam", max_length=80, unique=True) kleur = models.CharField("kleur", max_length=7, default="#2563eb", help_text="hex, bv. #2563eb") + icoon = models.CharField("icoon", max_length=8, blank=True, help_text="Optioneel emoji; leeg = automatisch gekozen op naam.") omschrijving = models.CharField("omschrijving", max_length=255, blank=True) theorievak = models.BooleanField( "theorievak", default=False, diff --git a/backend/core/serializers.py b/backend/core/serializers.py index 3c6fd53..d7739a4 100644 --- a/backend/core/serializers.py +++ b/backend/core/serializers.py @@ -183,7 +183,7 @@ class ActiviteitSerializer(serializers.ModelSerializer): class Meta: model = Activiteit - fields = ["id", "naam", "kleur", "omschrijving", "theorievak", "actief"] + fields = ["id", "naam", "kleur", "icoon", "omschrijving", "theorievak", "actief"] class LocatieSerializer(serializers.ModelSerializer): @@ -207,6 +207,7 @@ class LokaalinstellingSerializer(serializers.ModelSerializer): class RoosterblokSerializer(serializers.ModelSerializer): activiteit_naam = serializers.CharField(source="activiteit.naam", read_only=True) activiteit_kleur = serializers.CharField(source="activiteit.kleur", read_only=True) + activiteit_icoon = serializers.CharField(source="activiteit.icoon", read_only=True, default="") tijdslot_label = serializers.CharField(source="tijdslot.__str__", read_only=True) locatie_naam = serializers.CharField(source="locatie.naam", read_only=True, default=None) lokaal_naam = serializers.CharField(source="lokaal.naam", read_only=True, default=None) @@ -218,7 +219,7 @@ class RoosterblokSerializer(serializers.ModelSerializer): model = Roosterblok fields = [ "id", "schooljaar", "tijdslot", "tijdslot_label", - "activiteit", "activiteit_naam", "activiteit_kleur", + "activiteit", "activiteit_naam", "activiteit_kleur", "activiteit_icoon", "locatie", "locatie_naam", "lokaal", "lokaal_naam", "groep", "subgroep", "leerling", "doel_type", "doel_naam", "begeleiders", "begeleiders_namen", "opmerkingen", "aangemaakt_op", diff --git a/frontend/src/pages.jsx b/frontend/src/pages.jsx index af9a0fc..4ad73d8 100644 --- a/frontend/src/pages.jsx +++ b/frontend/src/pages.jsx @@ -94,6 +94,7 @@ function CatalogusPage({ titel, uitleg, resource, kleur = false, telKolom, metTh naam: "", omschrijving: "", ...(kleur ? { kleur: "#2563eb" } : {}), ...(metTheorievak ? { theorievak: false } : {}), + ...(metIcoon ? { icoon: "" } : {}), }; const [form, setForm] = useState(leeg); const [editId, setEditId] = useState(null); @@ -126,6 +127,7 @@ function CatalogusPage({ titel, uitleg, resource, kleur = false, telKolom, metTh naam: it.naam, omschrijving: it.omschrijving, ...(kleur ? { kleur: it.kleur } : {}), ...(metTheorievak ? { theorievak: it.theorievak } : {}), + ...(metIcoon ? { icoon: it.icoon || "" } : {}), }); } @@ -140,6 +142,9 @@ function CatalogusPage({ titel, uitleg, resource, kleur = false, telKolom, metTh {kleur && ( setForm({ ...form, kleur: e.target.value })} /> )} + {metIcoon && ( + setForm({ ...form, icoon: e.target.value })} /> + )} {metTheorievak && (