Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
20f6826
Created view, route and controller for institutions
May 30, 2022
c42d54e
Added page to navigation for admins
May 30, 2022
893b0a3
List now shows all the institutions with tutor and student counts
May 30, 2022
13d5f19
Adjusted pagination number
May 30, 2022
20c751c
Created manage and new institution pages
May 30, 2022
6852d68
Linked institution edit page
May 30, 2022
87d191e
Created view to show users in institution
May 30, 2022
085f347
Added route in controller for institution
May 30, 2022
cf75327
Created data for view and created stats for institution
May 30, 2022
cc86480
Created the users list
May 30, 2022
ada8c97
Fixed incorrect total for member list
May 30, 2022
2f0dbef
Added autocomplete the managing the institution
May 30, 2022
9ff9d0c
Fixed institution issue on dashboard
May 31, 2022
cfcb70c
Fixed order for institution links in routes
Jun 1, 2022
734d5b6
Added padding to stats on managing institutions
Jun 1, 2022
cebf9c3
Created page to add users to institutions
Jun 1, 2022
49eddb4
Adjusted manage institution logic and added few more routes
Jun 1, 2022
8cbe171
Added links to add and view institution users
Jun 1, 2022
17170da
Added logic for adding users to institution via email
Jun 1, 2022
30fe7a3
Admins can now create new institutions
Jun 1, 2022
90005a6
Added delete functionality
Jun 1, 2022
7239775
Added logic for dissociating users from the institutions
Jun 1, 2022
069abf0
Removed unnecessary uses in routes file
Jun 1, 2022
0e9142e
Added delete to the institution itself
Jun 1, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions app/Http/Controllers/Institution.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class Institution extends Controller
{
public function view()
{
return view('institutions',
[
'all' => \App\Models\Institution::query()->orderByDesc('institutions.institution')->paginate(25),
]);
}

public function manage($joincode)
{
return view('institutionmanage', [
'institution' => \App\Models\Institution::query()->where('institutions.joincode', $joincode)->firstOrFail()
]);
}

public function create()
{
return view('institutionnew');
}

public function submit(Request $request)
{
\App\Models\Institution::query()->create(
[
'joincode' => $request->input('joincode'),
'institution' => $request->input('name')
]
)->save();

return redirect(route('institution.edit', $request->input('joincode')));
}

public function update($joincode, Request $request)
{
$new = $request->input('joincode');

$n = \App\Models\Institution::query()->where('joincode', $joincode)
->update([
'institution' => $request->input('institution'),
'joincode' => $new
]);

return redirect(route('institution.manage'));
}

public function users($joincode)
{
return view('institutionusers', [
'users' => \App\Models\Institution::query()->where('institutions.joincode', $joincode)->firstOrFail()
]);
}

public function addUser($joincode)
{
return view('institutionadduser');
}

public function process($joincode, Request $request)
{
$email = $request->input('email');

$user = \App\Models\User::query()->where('email', $email);

$id = \App\Models\Institution::query()->where('joincode', $joincode)->get('id');

if ($user->exists() and $user->get('users.institution_id') == null) {
$user = \App\Models\User::all()->where('email', $email)->all();
$user->Institution()->associate($id);
$user->save();
}
else {
abort(404, 'User not found');
}
return view(route('institution.users', $joincode));
}

public function requestDelete($joincode)
{
return view('requestinstitutiondelete', [
'joincode' => $joincode
]);
}

public function deletedelete($joincode)
{
$institution = \App\Models\Institution::query()->where('joincode', $joincode)->get('id');

foreach (\App\Models\User::query()->where('institution_id', $institution)->get('id') as $u)
{
$u->Instituion->dissociate($u);
$u->save();
}

\App\Models\Institution::query()->where('joincode', $joincode)->delete();

return redirect(route('institution.manage'));
}
}
5 changes: 5 additions & 0 deletions app/Models/Institution.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ class Institution extends Model
{
use HasFactory;

protected $fillable = [
'institution',
'joincode'
];

public function User()
{
return $this->hasMany(User::class);
Expand Down
2 changes: 1 addition & 1 deletion resources/views/dashboard.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ class="origin-top-right absolute right-0 mt-2 w-48 rounded-md shadow-lg bg-white
<svg class="flex-shrink-0 mr-1.5 h-5 w-5 text-gray-400" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
<path fill-rule="evenodd" d="M4 4a2 2 0 012-2h8a2 2 0 012 2v12a1 1 0 110 2h-3a1 1 0 01-1-1v-2a1 1 0 00-1-1H9a1 1 0 00-1 1v2a1 1 0 01-1 1H4a1 1 0 110-2V4zm3 1h2v2H7V5zm2 4H7v2h2V9zm2-4h2v2h-2V5zm2 4h-2v2h2V9z" clip-rule="evenodd" />
</svg>
{{auth()->user()->Institution()->first()->pluck('institutions.institution')}}
{{auth()->user()->Institution()->first()->institution}}
</dd>
@endif
@if(auth()->user()->hasVerifiedEmail())
Expand Down
108 changes: 108 additions & 0 deletions resources/views/institutionadduser.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
<x-app-layout>
<div class="min-h-full">

<!-- Main column -->
<div class="lg:pl-64 flex flex-col">
<!-- Search header -->
<div class="sticky top-0 z-10 flex-shrink-0 flex h-16 bg-white border-b border-gray-200 lg:hidden">
<!-- Sidebar toggle, controls the 'sidebarOpen' sidebar state. -->
<button @click="menu = true" type="button"
class="px-4 border-r border-gray-200 text-gray-500 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-purple-500 lg:hidden">
<span class="sr-only">Open sidebar</span>
<!-- Heroicon name: outline/menu-alt-1 -->
<svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
stroke="currentColor" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M4 6h16M4 12h8m-8 6h16"/>
</svg>
</button>
<div class="flex-1 flex justify-between px-4 sm:px-6 lg:px-8">
<div class="flex-1 flex">
<form class="w-full flex md:ml-0" action="#" method="GET">
<label for="search-field" class="sr-only">Search</label>
<div class="relative w-full text-gray-400 focus-within:text-gray-600">
<div class="absolute inset-y-0 left-0 flex items-center pointer-events-none">
<!-- Heroicon name: solid/search -->
<svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"
fill="currentColor" aria-hidden="true">
<path fill-rule="evenodd"
d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
clip-rule="evenodd"/>
</svg>
</div>
<input id="search-field" name="search-field"
class="block w-full h-full pl-8 pr-3 py-2 border-transparent text-gray-900 placeholder-gray-500 focus:outline-none focus:ring-0 focus:border-transparent focus:placeholder-gray-400 sm:text-sm"
placeholder="Search" type="search">
</div>
</form>
</div>
<div class="flex items-center">
<!-- Profile dropdown -->
<div class="ml-3 relative">
<div>
<button @click="profile = true" type="button"
class="max-w-xs bg-white flex items-center text-sm rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500"
id="user-menu-button" aria-expanded="false" aria-haspopup="true">
<span class="sr-only">Open user menu</span>
<img class="h-8 w-8 rounded-full"
src="https://images.unsplash.com/photo-1502685104226-ee32379fefbe?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80"
alt="">
</button>
</div>

<!--
Dropdown menu, show/hide based on menu state.

Entering: "transition ease-out duration-100"
From: "transform opacity-0 scale-95"
To: "transform opacity-100 scale-100"
Leaving: "transition ease-in duration-75"
From: "transform opacity-100 scale-100"
To: "transform opacity-0 scale-95"
-->
<div x-show="profile" x-cloak
class="origin-top-right absolute right-0 mt-2 w-48 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 divide-y divide-gray-200 focus:outline-none"
role="menu" aria-orientation="vertical" aria-labelledby="user-menu-button"
tabindex="-1">
<div class="py-1" role="none">
<!-- Active: "bg-gray-100 text-gray-900", Not Active: "text-gray-700" -->
<a href="#" class="text-gray-700 block px-4 py-2 text-sm" role="menuitem"
tabindex="-1" id="user-menu-item-0">View profile</a>
<a href="#" class="text-gray-700 block px-4 py-2 text-sm" role="menuitem"
tabindex="-1" id="user-menu-item-1">Settings</a>
<a href="#" class="text-gray-700 block px-4 py-2 text-sm" role="menuitem"
tabindex="-1" id="user-menu-item-2">Notifications</a>
</div>
<div class="py-1" role="none">
<a href="#" class="text-gray-700 block px-4 py-2 text-sm" role="menuitem"
tabindex="-1" id="user-menu-item-3">Get desktop app</a>
<a href="#" class="text-gray-700 block px-4 py-2 text-sm" role="menuitem"
tabindex="-1" id="user-menu-item-4">Support</a>
</div>
<div class="py-1" role="none">
<a href="#" class="text-gray-700 block px-4 py-2 text-sm" role="menuitem"
tabindex="-1" id="user-menu-item-5">Logout</a>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="bg-white shadow sm:rounded-lg">
<div class="px-4 py-5 sm:p-6">
<h3 class="text-lg leading-6 font-medium text-gray-900">Add student to institution</h3>
<div class="mt-2 max-w-xl text-sm text-gray-500">
<p>Enter the students email to add them to the institution if they are not already part of one.</p>
</div>
<form class="mt-5 sm:flex sm:items-center">
<div class="w-full sm:max-w-xs">
<label for="email" class="sr-only">Email</label>
<input type="email" name="email" id="email" class="shadow-sm focus:ring-indigo-500 focus:border-indigo-500 block w-full sm:text-sm border-gray-300 rounded-md" placeholder="you@example.com">
</div>
<button type="submit" class="mt-3 w-full inline-flex items-center justify-center px-4 py-2 border border-transparent shadow-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">Add</button>
</form>
</div>
</div>

</x-app-layout>
Loading