diff --git a/app/Enums/Parties.php b/app/Enums/Parties.php new file mode 100644 index 0000000..6e8ecf9 --- /dev/null +++ b/app/Enums/Parties.php @@ -0,0 +1,46 @@ + 'Socialdemokraterna', + self::CENTER_PARTY => 'Centerpartiet', + self::LIBERALS => 'Liberalerna', + self::GREEN_PARTY => 'Miljöpartiet', + self::LEFT_PARTY => 'Vänsterpartiet', + self::MODERATES => 'Moderaterna', + self::CHRIST_DEMOCRATS => 'Kristdemokraterna', + self::SWEDEN_DEMOCRATS => 'Sverigedemokraterna', + self::OTHER => 'Partilös', + }; + } + + public function logo(): string + { + return match ($this) { + self::SOCIAL_DEMOCRATS => 'https://bilder.riksdagen.se/publishedmedia/cj3cmk5s63xb1ihzlalj/Symbol_Socialdemokraterna__134px.png', + self::CENTER_PARTY => 'https://bilder.riksdagen.se/publishedmedia/t1cxmh6vk2olrgltat9j/Symbol_Centern_125.png', + self::LIBERALS => 'https://bilder.riksdagen.se/publishedmedia/ve2gtm25br1jr8t8c3mo/L_partilogga.png', + self::GREEN_PARTY => 'https://bilder.riksdagen.se/publishedmedia/zzxff0abnuukdggtqboe/MP_partilogga.png', + self::LEFT_PARTY => 'https://bilder.riksdagen.se/publishedmedia/9ktrv8a5x75lo7zm90pn/Symbol_Va-nsterpartiet_121px.png', + self::MODERATES => 'https://bilder.riksdagen.se/publishedmedia/hxssexpfw01wb5uh3nfp/Symbol_Moderaterna_125px.png', + self::CHRIST_DEMOCRATS => 'https://bilder.riksdagen.se/publishedmedia/sjyk5gmvg3rkxmy2x84o/KD_partilogga.png', + self::SWEDEN_DEMOCRATS => 'https://bilder.riksdagen.se/publishedmedia/aog7hfhgv94tykktrkpy/Sveriedemokraterna_132px.png', + self::OTHER => '-', + }; + } +} diff --git a/app/Enums/PartyEnum.php b/app/Enums/PartyEnum.php deleted file mode 100644 index 37efd4e..0000000 --- a/app/Enums/PartyEnum.php +++ /dev/null @@ -1,29 +0,0 @@ - 'Socialdemokraterna', - self::CENTER_PARTY => 'Centerpartiet', - self::LIBERALS => 'Liberalerna', - self::GREEN_PARTY => 'Miljöpartiet', - self::LEFT_PARTY => 'Vänsterpartiet', - self::MODERATES => 'Moderaterna', - self::CHRIST_DEMOCRATS => 'Kristdemokraterna', - self::SWEDEN_DEMOCRATS => 'Sverigedemokraterna', - }; - } -} diff --git a/app/Livewire/HomePage.php b/app/Livewire/HomePage.php new file mode 100644 index 0000000..619ae90 --- /dev/null +++ b/app/Livewire/HomePage.php @@ -0,0 +1,13 @@ +parties = PartyEnum::cases(); + $this->parties = collect(Parties::cases())->sortBy(fn($party) => $party->label())->toArray(); } public function search() diff --git a/app/Livewire/Person/Show.php b/app/Livewire/Person/Show.php index afad971..cb9213b 100644 --- a/app/Livewire/Person/Show.php +++ b/app/Livewire/Person/Show.php @@ -6,7 +6,9 @@ use Livewire\Component; use App\Services\RiksdagenService; use Livewire\Attributes\Computed; use Asantibanez\LivewireCharts\Models\PieChartModel; +use Livewire\Attributes\Lazy; +#[Lazy()] class Show extends Component { public $personId; @@ -132,8 +134,9 @@ class Show extends Component $statistics = $this->votingStatistics; $pieChart = (new PieChartModel()) - ->setTitle('Röststatistik för ' . $this->selectedYear) - ->setAnimated(true); + ->setTitle('Voteringsstatistik för ' . $this->selectedYear) + ->setAnimated(true) + ->withDataLabels(); $colors = [ 'Ja' => '#10b981', // Green @@ -150,6 +153,11 @@ class Show extends Component return $pieChart; } + public function placeholder() + { + return view('livewire.person.show-skeleton'); + } + public function render() { return view('livewire.person.show'); diff --git a/resources/views/components/layouts/app.blade.php b/resources/views/components/layouts/app.blade.php index 3d15107..6668f8d 100644 --- a/resources/views/components/layouts/app.blade.php +++ b/resources/views/components/layouts/app.blade.php @@ -1,5 +1,14 @@ {{ $slot }} + diff --git a/resources/views/components/layouts/app/sidebar.blade.php b/resources/views/components/layouts/app/sidebar.blade.php index 8fdc149..5552cff 100644 --- a/resources/views/components/layouts/app/sidebar.blade.php +++ b/resources/views/components/layouts/app/sidebar.blade.php @@ -3,126 +3,10 @@ @include('partials.head') - - - - - - - - - - - {{ __('Dashboard') }} - - - - - - - - {{ __('Repository') }} - - - - {{ __('Documentation') }} - - - - - - + - - - - - - - - - -
-
- - - {{ auth()->user()?->initials() }} - - - -
- {{ auth()->user()?->name }} - {{ auth()->user()?->email }} -
-
-
-
- - - - - {{ __('Settings') }} - - - - -
- @csrf - - {{ __('Log Out') }} - -
-
-
{{ $slot }} diff --git a/resources/views/livewire/home-page.blade.php b/resources/views/livewire/home-page.blade.php new file mode 100644 index 0000000..f12b767 --- /dev/null +++ b/resources/views/livewire/home-page.blade.php @@ -0,0 +1,131 @@ +
+
+ +
+

+ Riksdagen App +

+

+ Utforska information om riksdagsledamöter, deras röster och uppdrag i Sveriges riksdag +

+
+ + +
+ + + +
+
+
+ + + +
+

Ledamöter

+

+ Sök och utforska information om riksdagsledamöter, deras rösthistorik och uppdrag +

+
+ Sök ledamöter + + + +
+
+
+
+ + +
+
+
+ + + +
+

Propositioner

+

+ Sök och läs propositioner och andra dokument från riksdagen +

+
+ Kommer snart +
+
+
+ + +
+
+
+ + + +
+

Statistik

+

+ Se röststatistik och analyser för partier och ledamöter +

+
+ Kommer snart +
+
+
+ + +
+
+
+ + + +
+

Kalender

+

+ Se kommande voteringar och riksdagsmöten +

+
+ Kommer snart +
+
+
+ + +
+
+
+ + + +
+

Partier

+

+ Utforska partier och deras ståndpunkter i olika frågor +

+
+ Kommer snart +
+
+
+ + +
+
+
+ + + +
+

Sök Allmänt

+

+ Sök i alla riksdagens dokument och voteringar +

+
+ Kommer snart +
+
+
+ +
+
+
diff --git a/resources/views/livewire/person/search.blade.php b/resources/views/livewire/person/search.blade.php index 58271ea..0d75ec5 100644 --- a/resources/views/livewire/person/search.blade.php +++ b/resources/views/livewire/person/search.blade.php @@ -1,60 +1,130 @@ -
-

Sök person

-
-
- - +
+
+ +
+
+ + + + + +
+ + + +
+
+

Sök Ledamöter

+

+ Sök efter riksdagsledamöter genom namn eller parti och utforska deras rösthistorik och uppdrag +

-
- - + +
+ +
+ +
+
+ +
+
+ +
+ +
-
- - -
- - -
-
- - Loading... -
+ + + + +
+ @if ($results && isset($results->personlista->person)) +
+
+ + + +

Sökresultat

+
+
+ @php + $persons = $results->personlista->person; + if ( + !is_array($persons) || + (isset($persons->intressent_id) && is_string($persons->intressent_id)) + ) { + $persons = [$persons]; + } + @endphp + @foreach ($persons as $person) +
+
+ {{ $person->tilltalsnamn }} +
+ + {{ $person->tilltalsnamn }} {{ $person->efternamn }} ({{ $person->parti }}) + +
+ + {{ $person->valkrets }} +
+
{{ $person->status }}
+
+ + + +
+
+ @endforeach +
+
+
+ @elseif ($results && (!isset($results->personlista->person) || empty($results->personlista->person))) +
+
+ + + + Inga ledamöter hittades med de angivna sökkriterier. +
+
+ @endif
- - @if($results && isset($results->personlista->person)) -
-

Resultat

-
    - @php - $persons = $results->personlista->person; - if (!is_array($persons) || (isset($persons->intressent_id) && is_string($persons->intressent_id))) { - $persons = [$persons]; - } - @endphp - @foreach($persons as $person) -
  • - {{ $person->tilltalsnamn }} -
    - - {{ $person->tilltalsnamn }} {{ $person->efternamn }} - -
    {{ $person->parti }} | {{ $person->valkrets }}
    -
    -
  • - @endforeach -
-
- @elseif($results && (!isset($results->personlista->person) || empty($results->personlista->person))) -
Inga personer hittades.
- @endif +
diff --git a/resources/views/livewire/person/show-skeleton.blade.php b/resources/views/livewire/person/show-skeleton.blade.php new file mode 100644 index 0000000..c8031cd --- /dev/null +++ b/resources/views/livewire/person/show-skeleton.blade.php @@ -0,0 +1,254 @@ +{{-- Skeleton loading placeholder for person show page --}} +
+
+ + + + +
+
+ {{-- Profile image skeleton --}} +
+
+
+ + {{-- Main content skeleton --}} +
+
+ {{-- Name skeleton --}} +
+
+
+
+
+
+ + {{-- Info grid skeleton --}} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + {{-- Action button skeleton --}} +
+
+
+
+ + +
+
+
+
+
+ + {{-- Uppdrag tabs skeleton --}} +
+ +
+ + {{-- Uppdrag cards skeleton --}} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+ + {{-- Year tabs skeleton --}} +
+ +
+ + {{-- Voting statistics chart skeleton --}} +
+
+
+
+ {{-- Chart placeholder --}} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + {{-- Voting table skeleton --}} +
+
+ {{-- Table header skeleton --}} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{-- Table rows skeleton --}} + @for($i = 0; $i < 5; $i++) +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @endfor +
+
+
+ + +
+
+
+
+
+
diff --git a/resources/views/livewire/person/show.blade.php b/resources/views/livewire/person/show.blade.php index b4d27da..9c1124f 100644 --- a/resources/views/livewire/person/show.blade.php +++ b/resources/views/livewire/person/show.blade.php @@ -1,57 +1,159 @@ -
- @if($person) -
-
- {{ $person->tilltalsnamn }} +
+
+ + + @if ($person) + +
+
+
+ {{ $person->tilltalsnamn }} +
+
+
+

{{ $person->tilltalsnamn }} + {{ $person->efternamn }} ({{ $person->parti }})

+
+ + {{ App\Enums\Parties::from($person->parti)->label() }} + + + {{ $person->valkrets }} valkrets +
+
+ +
+
+
Född
+
{{ $person->fodd_ar }}
+
+
+
Kön
+
{{ ucfirst($person->kon) }}
+
+
+
Status
+
{{ $person->status }}
+
+
+
E-post
+
+ {{ str_replace('[på]', '@', collect($person->personuppgift->uppgift ?? [])->firstWhere('kod', 'Officiell e-postadress')->uppgift[0] ?? '-') }} +
+
+
+ + + + + + + Visa på riksdagen.se + +
+
+
+ + +
+
+
+ + + + +
+

Uppdrag

-

Uppdrag

-
+
- @if($selectedUppdragTab == 'current' && !empty($currentUppdrag)) + @if ($selectedUppdragTab == 'current' && !empty($currentUppdrag))
- @foreach($currentUppdrag as $uppdrag) + @foreach ($currentUppdrag as $uppdrag)

{{ $uppdrag->roll_kod }}

- {{-- @if(!empty($uppdrag->uppgift[0]) && is_array($uppdrag->uppgift)) + {{-- @if (!empty($uppdrag->uppgift[0]) && is_array($uppdrag->uppgift))

{{ implode(', ', $uppdrag->uppgift) }}

@endif --}}

Typ: {{ ucfirst($uppdrag->typ) }} - @if(isset($uppdrag->status) && $uppdrag->status) + @if (isset($uppdrag->status) && $uppdrag->status) | Status: {{ $uppdrag->status }} @endif

Från: {{ Carbon\Carbon::parse($uppdrag->from)->format('Y-m-d') }}
- @if(!empty($uppdrag->tom)) + @if (!empty($uppdrag->tom))
Till: {{ Carbon\Carbon::parse($uppdrag->tom)->format('Y-m-d') }}
@else
Pågående
@@ -66,25 +168,26 @@ @endif - @if($selectedUppdragTab == 'previous' && !empty($previousUppdrag)) + @if ($selectedUppdragTab == 'previous' && !empty($previousUppdrag))
- @foreach($previousUppdrag as $uppdrag) + @foreach ($previousUppdrag as $uppdrag)

{{ $uppdrag->roll_kod }}

- {{-- @if(!empty($uppdrag->uppgift[0]) && is_array($uppdrag->uppgift)) + {{-- @if (!empty($uppdrag->uppgift[0]) && is_array($uppdrag->uppgift))

{{ implode(', ', $uppdrag->uppgift) }}

@endif --}}

Typ: {{ ucfirst($uppdrag->typ) }} - @if(isset($uppdrag->status) && $uppdrag->status) + @if (isset($uppdrag->status) && $uppdrag->status) | Status: {{ $uppdrag->status }} @endif

-
{{ Carbon\Carbon::parse($uppdrag->from)->format('Y-m-d') }} - {{ Carbon\Carbon::parse($uppdrag->tom)->format('Y-m-d') }}
+
{{ Carbon\Carbon::parse($uppdrag->from)->format('Y-m-d') }} - + {{ Carbon\Carbon::parse($uppdrag->tom)->format('Y-m-d') }}
{{ Carbon\Carbon::parse($uppdrag->from)->diffForHumans(Carbon\Carbon::parse($uppdrag->tom), true) }}
@@ -96,24 +199,27 @@ @elseif($selectedUppdragTab == 'previous' && empty($previousUppdrag))

Inga tidigare uppdrag registrerade.

@endif -

Biografi

-
    - @foreach(collect($person->personuppgift->uppgift ?? [])->where('typ', 'biografi') as $bio) -
  • - {{ $bio->kod }}: {{ is_array($bio->uppgift) ? implode(', ', $bio->uppgift) : $bio->uppgift }} -
  • - @endforeach -
- - @if(!empty($votesByYear)) -

Voteringar

+
+ @if (!empty($votesByYear)) + +
+
+
+ + + + +
+

Voteringar

+
- @if($selectedYear && isset($votesByYear[$selectedYear])) + @if ($selectedYear && isset($votesByYear[$selectedYear])) -
-

Röststatistik för {{ $selectedYear }}

- @if(!empty($this->votingStatistics)) +
+ @if (!empty($this->votingStatistics))
-
- +
+
-
+
- @foreach($this->votingStatistics as $voteType => $count) + @php($totalVotes = array_sum($this->votingStatistics)) + @foreach ($this->votingStatistics as $voteType => $count)
- {{ $voteType }} - {{ $count }} + {{ $voteType }} + {{ $count }} + ({{ round(($count / $totalVotes) * 100, 2) }}%)
@endforeach -
- Totalt antal voteringar - {{ array_sum($this->votingStatistics) }} +
+ Totalt antal voteringar + {{ array_sum($this->votingStatistics) }}
@else -

Ingen röststatistik tillgänglig för detta år.

+

Ingen voteringsstatistik tillgänglig för detta år.

@endif
@endif - @if($selectedYear && isset($votesByYear[$selectedYear])) + @if ($selectedYear && isset($votesByYear[$selectedYear]))
- - - - - - + + + + - - @foreach($votesByYear[$selectedYear] as $vote) - + + @foreach ($votesByYear[$selectedYear] as $vote) + - - @endforeach
DatumBeteckningPunktRöstAvserVotering + Datum + Beteckning + Punkt + Röst
{{ Carbon\Carbon::parse($vote->systemdatum)->format('Y-m-d') }} - + {{ $vote->beteckning }} {{ $vote->punkt }} - + {{ $vote->rost }} {{ $vote->avser }}{{ $vote->votering }}
@endif - @endif -
-
- @else -
Personen kunde inte hittas.
- @endif -
- Källa: Sveriges riksdag (riksdagen.se) + @endif
+ + +
+
+
+ + + + +
+

Biografi

+
+
+ @foreach (collect($person->personuppgift->uppgift ?? [])->where('typ', 'biografi') as $bio) +
+
{{ $bio->kod }}
+
+ {{ is_array($bio->uppgift) ? implode(', ', $bio->uppgift) : $bio->uppgift }}
+
+ @endforeach +
+
+@else +
+ + + +

Person inte hittad

+

Personen kunde inte hittas i databasen.

+
+ @endif +
diff --git a/routes/web.php b/routes/web.php index 0e2771e..4b6aa58 100644 --- a/routes/web.php +++ b/routes/web.php @@ -7,15 +7,14 @@ use App\Livewire\Settings\TwoFactor; use Illuminate\Support\Facades\Route; use Laravel\Fortify\Features; +use App\Livewire\HomePage; use App\Livewire\Person\Search as PersonSearch; use App\Livewire\Person\Show as PersonShow; -Route::get('/', function () { - return view('welcome'); -})->name('home'); +Route::get('/', HomePage::class)->name('home'); -Route::get('/person', PersonSearch::class)->name('person.search'); -Route::get('/person/{personId}', PersonShow::class)->name('person.show'); +Route::get('/ledamot', PersonSearch::class)->name('person.search'); +Route::get('/ledamot/{personId}', PersonShow::class)->name('person.show'); Route::view('dashboard', 'dashboard') ->middleware(['auth', 'verified'])