diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 37e793ac2..204ccabf5 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -8,6 +8,7 @@ use App\Models\RoleObject; use App\Models\RoleUser; use App\Models\User; +use App\Models\Workshop; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\File; @@ -218,7 +219,15 @@ private function getHomePageContacts(): array Role::BOARD_OF_TRUSTEES_MEMBER => User::boardOfTrusteesMembers(), Role::ETHICS_COMMISSIONER => User::ethicsCommissioners(), ]); + + $contacts['workshops'] = Workshop::all()->flatMap(fn ($workshop) => [ + $workshop->name => [ + 'leaders' => $workshop->leaders->pluck('name')->implode(', '), + 'administrators' => $workshop->administrators->pluck('name')->implode(', ') + ] + ]); } + return $contacts; } } diff --git a/app/Models/Workshop.php b/app/Models/Workshop.php index 3a17b7473..fe42a0f3f 100644 --- a/app/Models/Workshop.php +++ b/app/Models/Workshop.php @@ -3,6 +3,8 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +use App\Models\Role; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; /** @@ -61,11 +63,38 @@ class Workshop extends Model self::TORTENESZ, ]; - public function users() + public const COLORS = [ + self::ANGOL => 'deep-purple lighten-3', + self::BIOLOGIA => 'green lighten-2', + self::BOLLOK => 'teal lighten-2', + self::FILOZOFIA => 'teal accent-4', + self::AURELION => 'lime darken-2', + self::GAZDALKODASTUDOMANYI => 'brown lighten-2', + self::GERMANISZTIKA => 'blue-grey lighten-2', + self::INFORMATIKA => 'light-blue darken-4', + self::MAGYAR => 'red lighten-2', + self::MATEMATIKA => 'blue darken-2', + self::MENDOL => 'cyan darken-2', + self::OLASZ => 'red accent-3', + self::ORIENTALISZTIKA => 'amber lighten-1', + self::SKANDINAVISZTIKA => 'deep-orange lighten-3', + self::SPANYOL => 'deep-purple darken-2', + self::SZLAVISZTIKA => 'light-blue lighten-2', + self::TARSADALOMTUDOMANYI => 'purple lighten-1', + self::TORTENESZ => 'teal darken-4', + ]; + + /** + * Defines the BelongsToMany connection to users. + */ + public function users(): BelongsToMany { return $this->belongsToMany(User::class, 'workshop_users'); } + /** + * Returns a collection containing the residents in the workshop. + */ public function residents() { return $this->users->filter(function ($user, $key) { @@ -73,6 +102,9 @@ public function residents() }); } + /** + * Returns a collection containing the externs in the workshop. + */ public function externs() { return $this->users->filter(function ($user, $key) { @@ -80,6 +112,30 @@ public function externs() }); } + /** + * Returns a collection with all functionaries of the workshop in it. + */ + public function functionaries(): BelongsToMany + { + return $this->belongsToMany(User::class, 'role_users'); + } + + /** + * Filters functionaries to only include workshop administrators. + */ + public function administrators(): BelongsToMany + { + return $this->functionaries()->wherePivot('role_id', Role::get(Role::WORKSHOP_ADMINISTRATOR)->id); + } + + /** + * Filters functionaries to only include workshop leaders. + */ + public function leaders(): BelongsToMany + { + return $this->functionaries()->wherePivot('role_id', Role::get(Role::WORKSHOP_LEADER)->id); + } + /** * Returns all the balances the workshop has had in different semesters. */ @@ -97,47 +153,11 @@ public function balance(int $semester = null): ?WorkshopBalance return $this->balances()->firstWhere('semester_id', $semester ?? Semester::current()->id); } - public function color() + /** + * Associates each workshop with a fixed color. + */ + public function color(): string { - switch ($this->name) { - case self::ANGOL: - return 'deep-purple lighten-3'; - case self::BIOLOGIA: - return 'green lighten-2'; - case self::BOLLOK: - return 'teal lighten-2'; - case self::FILOZOFIA: - return 'teal accent-4'; - case self::AURELION: - return 'lime darken-2'; - case self::GAZDALKODASTUDOMANYI: - return 'brown lighten-2'; - case self::GERMANISZTIKA: - return 'blue-grey lighten-2'; - case self::INFORMATIKA: - return 'light-blue darken-4'; - case self::MAGYAR: - return 'red lighten-2'; - case self::MATEMATIKA: - return 'blue darken-2'; - case self::MENDOL: - return 'cyan darken-2'; - case self::OLASZ: - return 'red accent-3'; - case self::ORIENTALISZTIKA: - return 'amber lighten-1'; - case self::SKANDINAVISZTIKA: - return 'deep-orange lighten-3'; - case self::SPANYOL: - return 'deep-purple darken-2'; - case self::SZLAVISZTIKA: - return 'light-blue lighten-2'; - case self::TARSADALOMTUDOMANYI: - return 'purple lighten-1'; - case self::TORTENESZ: - return 'teal darken-4'; - default: - return 'black'; - } + return isset(self::COLORS[$this->name]) ? self::COLORS[$this->name] : 'black'; } } diff --git a/resources/lang/en/role.php b/resources/lang/en/role.php index 8635d59fb..86a3b7fa3 100644 --- a/resources/lang/en/role.php +++ b/resources/lang/en/role.php @@ -56,4 +56,5 @@ 'tenant' => 'Tenant', 'workshop-administrator' => 'Workshop administrator', 'workshop-leader' => 'Workshop leader', + 'workshop-functionaries' => 'Workshop functionaries', ]; diff --git a/resources/lang/hu/role.php b/resources/lang/hu/role.php index 910881f78..e8946997f 100644 --- a/resources/lang/hu/role.php +++ b/resources/lang/hu/role.php @@ -56,4 +56,5 @@ 'tenant' => 'Vendég', 'workshop-administrator' => 'Műhelytitkár', 'workshop-leader' => 'Műhelyvezető', + 'workshop-functionaries' => 'A műhelyek tisztségviselői', ]; diff --git a/resources/sass/materialize.scss b/resources/sass/materialize.scss index 5561cb906..d392a1b28 100644 --- a/resources/sass/materialize.scss +++ b/resources/sass/materialize.scss @@ -68,6 +68,34 @@ span.badge.tag { float: none; } +// for our custom arrow dropdowns +// (e.g. for the workshop functionaries on the home page) +.arrow-dropdown .arrow-dropdown-title a { + color: inherit; + text-decoration: inherit; + cursor: pointer; +} +.arrow-dropdown .arrow-dropdown-title.closed::after { + content: '▶'; + display: inline-block; + font-size: 0.6em; + transform: translateY(-0.4em); +} +.arrow-dropdown .arrow-dropdown-title.open::after { + content: '▼'; + display: inline-block; + font-size: 0.6em; + transform: translateY(-0.3em); +} +.arrow-dropdown .arrow-dropdown-content ul li ul { + margin: 0 0 10px 20px; +} +.arrow-dropdown > .arrow-dropdown-title.closed + .arrow-dropdown-content ul { + display: none; +} +.arrow-dropdown > .arrow-dropdown-title.open + .arrow-dropdown-content ul { + display: block; +} //enable multiline buttons if the text does not fit in .btn, diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index dfb86e036..edec51a09 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -111,6 +111,29 @@ @endif @endforeach + +
+
+ @lang('role.workshop-functionaries') +
+
+ +
+
@endif @@ -167,6 +190,6 @@ function standby(id) { } $(document).ready(function(){ $('.materialboxed').materialbox(); - }); +}); @endpush diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 30fdbbf5d..fc8c7ba04 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -103,6 +103,26 @@ function toggleColorMode() { url: "{{ route('set-color-mode', [':mode']) }}".replace(':mode', mode), }); } + + // for our custom arrow dropdowns + // (e.g. the dropdown of workshop secretaries) + function toggleCollContent(title) { + return function() { + if (title.is(".closed")) { + title.removeClass("closed"); + title.addClass("open"); + // the rest is done by CSS rules + } else { + title.removeClass("open"); + title.addClass("closed"); + } + } + } + + titles = $(".arrow-dropdown .arrow-dropdown-title"); + titles.on('click', toggleCollContent(titles)); + // initialize them as closed: + titles.addClass('closed'); @endpush