Skip to content

Commit

Permalink
feat: display groups on employee profile page (#854)
Browse files Browse the repository at this point in the history
  • Loading branch information
djaiss committed May 6, 2021
1 parent 6f81fda commit 8488016
Show file tree
Hide file tree
Showing 10 changed files with 315 additions and 123 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,10 @@ public function show(Request $request, int $companyId, int $employeeId)
$ships = EmployeeShowViewHelper::recentShips($employee);

// all projects of this employee
$projects = EmployeeShowViewHelper::projects($employee, $loggedCompany);
$projects = EmployeeWorkViewHelper::projects($employee, $loggedCompany);

// all groups of this employee
$groups = EmployeeWorkViewHelper::groups($employee, $loggedCompany);

// information about the employee that the logged employee consults, that depends on what the logged Employee has the right to see
$employee = EmployeeShowViewHelper::informationAboutEmployee($employee, $permissions, $loggedEmployee);
Expand All @@ -70,6 +73,7 @@ public function show(Request $request, int $companyId, int $employeeId)
'workFromHomes' => $workFromHomeStats,
'ships' => $ships,
'projects' => $projects,
'groups' => $groups,
]);
}

Expand Down
2 changes: 1 addition & 1 deletion app/Http/ViewHelpers/Company/Group/GroupShowViewHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public static function information(Group $group, Company $company): array
return [
'id' => $group->id,
'name' => $group->name,
'mission' => StringHelper::parse($group->mission),
'mission' => $group->mission ? StringHelper::parse($group->mission) : null,
'members' => $membersCollection,
'url_edit' => route('groups.edit', [
'company' => $company,
Expand Down
52 changes: 0 additions & 52 deletions app/Http/ViewHelpers/Employee/EmployeeShowViewHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,13 @@
use App\Models\User\Pronoun;
use App\Helpers\StringHelper;
use App\Models\Company\Company;
use App\Models\Company\Project;
use App\Models\Company\Employee;
use App\Models\Company\Timesheet;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use App\Helpers\WorkFromHomeHelper;
use App\Models\Company\ProjectTask;
use App\Models\Company\ECoffeeMatch;
use App\Models\Company\EmployeeStatus;
use App\Models\Company\ProjectMessage;

class EmployeeShowViewHelper
{
Expand Down Expand Up @@ -794,55 +791,6 @@ public static function positions(Company $company): ?Collection
return $positionCollection;
}

/**
* List all the projects of the employee.
*
* @param Employee $employee
* @param Company $company
* @return Collection|null
*/
public static function projects(Employee $employee, Company $company): ?Collection
{
/** Going through a raw query coupled with eloquent to drastically reduce the number of hydrated models */
$projects = Project::join('employee_project', 'employee_project.project_id', '=', 'projects.id')
->select('employee_project.role', 'employee_project.created_at', 'employee_project.project_id', 'projects.id as project_id', 'projects.name', 'projects.code', 'projects.status')
->addSelect([
'messages_count' => ProjectMessage::select(DB::raw('count(id)'))
->whereColumn('author_id', 'employee_id')
->whereColumn('project_id', 'projects.id'),
])
->addSelect([
'tasks_count' => ProjectTask::select(DB::raw('count(id)'))
->whereColumn('assignee_id', 'employee_id')
->whereColumn('project_id', 'projects.id'),
])
->where('employee_project.employee_id', $employee->id)
->orderBy('projects.id', 'desc')
->withCasts([
'created_at' => 'datetime',
])
->get();

$projectsCollection = collect([]);
foreach ($projects as $project) {
$projectsCollection->push([
'id' => $project->project_id,
'name' => $project->name,
'code' => $project->code,
'status' => $project->status,
'role' => $project->role,
'messages_count' => $project->messages_count,
'tasks_count' => $project->tasks_count,
'url' => route('projects.show', [
'company' => $company,
'project' => $project->project_id,
]),
]);
}

return $projectsCollection;
}

/**
* List all the eCoffees the employee participated to.
*
Expand Down
97 changes: 97 additions & 0 deletions app/Http/ViewHelpers/Employee/EmployeeWorkViewHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,15 @@
use Carbon\Carbon;
use App\Helpers\DateHelper;
use Illuminate\Support\Str;
use App\Helpers\ImageHelper;
use App\Helpers\StringHelper;
use App\Models\Company\Company;
use App\Models\Company\Project;
use App\Models\Company\Employee;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use App\Models\Company\ProjectTask;
use App\Models\Company\ProjectMessage;

class EmployeeWorkViewHelper
{
Expand Down Expand Up @@ -112,4 +118,95 @@ public static function weeks(Employee $loggedEmployee): Collection

return $weeksCollection;
}

/**
* List all the projects of the employee.
*
* @param Employee $employee
* @param Company $company
* @return Collection|null
*/
public static function projects(Employee $employee, Company $company): ?Collection
{
/** Going through a raw query coupled with eloquent to drastically reduce the number of hydrated models */
$projects = Project::join('employee_project', 'employee_project.project_id', '=', 'projects.id')
->select('employee_project.role', 'employee_project.created_at', 'employee_project.project_id', 'projects.id as project_id', 'projects.name', 'projects.code', 'projects.status')
->addSelect([
'messages_count' => ProjectMessage::select(DB::raw('count(id)'))
->whereColumn('author_id', 'employee_id')
->whereColumn('project_id', 'projects.id'),
])
->addSelect([
'tasks_count' => ProjectTask::select(DB::raw('count(id)'))
->whereColumn('assignee_id', 'employee_id')
->whereColumn('project_id', 'projects.id'),
])
->where('employee_project.employee_id', $employee->id)
->orderBy('projects.id', 'desc')
->withCasts([
'created_at' => 'datetime',
])
->get();

$projectsCollection = collect([]);
foreach ($projects as $project) {
$projectsCollection->push([
'id' => $project->project_id,
'name' => $project->name,
'code' => $project->code,
'status' => $project->status,
'role' => $project->role,
'messages_count' => $project->messages_count,
'tasks_count' => $project->tasks_count,
'url' => route('projects.show', [
'company' => $company,
'project' => $project->project_id,
]),
]);
}

return $projectsCollection;
}

public static function groups(Employee $employee, Company $company): Collection
{
$groups = $employee->groups;

$groupsCollection = collect([]);
foreach ($groups as $group) {
$members = $group->employees()
->inRandomOrder()
->take(3)
->get();

$totalMembersCount = $group->employees()->count();
$totalMembersCount = $totalMembersCount - $members->count();

$membersCollection = collect([]);
foreach ($members as $member) {
$membersCollection->push([
'id' => $member->id,
'avatar' => ImageHelper::getAvatar($member, 25),
'url' => route('employees.show', [
'company' => $group->company_id,
'employee' => $member,
]),
]);
}

$groupsCollection->push([
'id' => $group->id,
'name' => $group->name,
'mission' => $group->mission ? StringHelper::parse($group->mission) : null,
'preview_members' => $membersCollection,
'remaining_members_count' => $totalMembersCount,
'url' => route('groups.show', [
'company' => $company,
'group' => $group,
]),
]);
}

return $groupsCollection;
}
}
1 change: 1 addition & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ parameters:
- tests
excludePaths:
- app/Http/ViewHelpers/Employee/EmployeeShowViewHelper.php
- app/Http/ViewHelpers/Employee/EmployeeWorkViewHelper.php
- app/Http/ViewHelpers/Company/HR/CompanyHRViewHelper.php
- app/Http/ViewHelpers/Company/Group/GroupMembersViewHelper.php
- app/Services/Company/Group/CreateMeeting.php
Expand Down
19 changes: 15 additions & 4 deletions resources/js/Pages/Employee/Work/Index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,21 @@
:menu="menu"
/>

<worklogs
:permissions="permissions"
:employee="employee"
:worklog="worklog"
:weeks="weeks"
/>

<projects
:employee="employee"
:projects="projects"
/>

<worklogs
:permissions="permissions"
<groups
:employee="employee"
:worklog="worklog"
:weeks="weeks"
:groups="groups"
/>

<recent-ships
Expand All @@ -82,6 +87,7 @@ import Worklogs from '@/Pages/Employee/Work/Partials/Worklogs';
import WorkFromHome from '@/Pages/Employee/Work/Partials/WorkFromHome';
import RecentShips from '@/Pages/Employee/Work/Partials/RecentShips';
import Projects from '@/Pages/Employee/Work/Partials/Projects';
import Groups from '@/Pages/Employee/Work/Partials/Groups';
export default {
components: {
Expand All @@ -93,6 +99,7 @@ export default {
WorkFromHome,
RecentShips,
Projects,
Groups,
},
props: {
Expand Down Expand Up @@ -128,6 +135,10 @@ export default {
type: Array,
default: null,
},
groups: {
type: Array,
default: null,
},
weeks: {
type: Array,
default: null,
Expand Down
75 changes: 75 additions & 0 deletions resources/js/Pages/Employee/Work/Partials/Groups.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<style lang="scss" scoped>
.groups-list:last-child {
border-bottom: 0;
}
.groups-list:first-child:hover {
border-top-left-radius: 10px;
border-top-right-radius: 10px;
}
.groups-list:last-child:hover {
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
}
</style>

<template>
<div>
<span class="db fw5 mb2">
<span class="mr1">
👷
</span> {{ $t('employee.groups_title', { name: employee.name }) }}

<help :url="$page.props.help_links.team_recent_ship" :top="'2px'" />
</span>

<div class="mb4 bg-white box cf">
<!-- list of groups -->
<ul class="list pl0 ma0">
<li v-for="group in groups" :key="group.id" class="w-100 pa3 mr3 flex justify-between items-center bb bb-gray groups-list">
<div>
<p class="ma0 lh-copy relative">
<inertia-link :href="group.url">{{ group.name }}</inertia-link>
</p>
<div v-if="group.mission" class="mt2 lh-copy f6 parsed-content" v-html="group.mission"></div>
</div>

<!-- members -->
<span v-if="group.preview_members" class="ma0 mb0 f7 grey">
<div class="flex items-center relative tr">
<avatar v-for="member in group.preview_members" :key="member.id" :avatar="member.avatar" :url="member.url" :size="25"
:class="'br-100 small-avatar'"
/>
<div v-if="group.remaining_members_count > 0" class="pl2 f7 more-members relative gray">
+ {{ group.remaining_members_count }}
</div>
</div>
</span>
</li>
</ul>
</div>
</div>
</template>

<script>
import Help from '@/Shared/Help';
export default {
components: {
Help
},
props: {
groups: {
type: Array,
default: null,
},
employee: {
type: Object,
default: null,
},
},
};
</script>
2 changes: 2 additions & 0 deletions resources/lang/en/employee.php
Original file line number Diff line number Diff line change
Expand Up @@ -241,4 +241,6 @@
'stat_hiring' => '{percent}% employees have been hired after {name}',

'past_position_history_title' => 'Position history in the company',

'groups_title' => 'Groups {name} is part of',
];

0 comments on commit 8488016

Please sign in to comment.