type !== 'Modules\ProfessionalProject\Notifications\NewTaskAssignedNotification') { return []; } $data = $notification->data; $task = PpTask::with('project')->find($data['pp_task_id'] ?? null); if (empty($task)) { return []; } return [ 'msg' => __( 'professionalproject::lang.new_task_assigned_notification', [ 'created_by' => $data['actor_name'] ?? __('lang_v1.unknown'), 'subject' => $task->title, ] ), 'icon_class' => 'fas fa-tasks bg-green', 'link' => action([\Modules\ProfessionalProject\Http\Controllers\ProjectController::class, 'show'], ['id' => $task->project_id]).'?tab=tasks', 'read_at' => $notification->read_at, 'created_at' => format_relative_time($notification->created_at), ]; } public function superadmin_package() { return [ [ 'name' => 'professional_project_module', 'label' => __('professionalproject::lang.module_name'), 'default' => false, ], ]; } public function user_permissions() { return [ ['value' => 'professionalproject.access', 'label' => __('professionalproject::lang.access'), 'default' => false], ['value' => 'professionalproject.create_project', 'label' => __('professionalproject::lang.create_project'), 'default' => false], ['value' => 'professionalproject.edit_project', 'label' => __('professionalproject::lang.edit_project'), 'default' => false], ['value' => 'professionalproject.delete_project', 'label' => __('professionalproject::lang.delete_project'), 'default' => false], ['value' => 'professionalproject.create_task', 'label' => __('professionalproject::lang.create_task'), 'default' => false], ['value' => 'professionalproject.edit_task', 'label' => __('professionalproject::lang.edit_task'), 'default' => false], ['value' => 'professionalproject.delete_task', 'label' => __('professionalproject::lang.delete_task'), 'default' => false], ['value' => 'professionalproject.manage_milestones', 'label' => __('professionalproject::lang.manage_milestones'), 'default' => false], ['value' => 'professionalproject.view_gantt', 'label' => __('professionalproject::lang.view_gantt'), 'default' => false], ['value' => 'professionalproject.manage_task_statuses', 'label' => __('professionalproject::lang.manage_task_statuses'), 'default' => false], ]; } public function modifyAdminMenu() { if (! \Module::has('ProfessionalProject') || ! \Module::isEnabled('ProfessionalProject') || ! auth()->user()->can('professionalproject.access')) { return; } $business_id = (int) session()->get('user.business_id'); $categories = PpProjectCategory::forBusiness($business_id) ->orderBy('position') ->orderBy('name') ->get(); $unified_projects_menu = (bool) config('menu_consolidation.unified_projects_menu', true); $module_util = new ModuleUtil(); $is_legacy_project_enabled = (bool) $module_util->hasThePermissionInSubscription($business_id, 'project_module'); Menu::modify('admin-sidebar-menu', function ($menu) use ($categories, $unified_projects_menu, $is_legacy_project_enabled) { if ($unified_projects_menu) { $menu->dropdown( __('lang_v1.unified_projects_menu'), function ($sub) use ($categories, $is_legacy_project_enabled) { if ($is_legacy_project_enabled) { $sub->header(__('lang_v1.projects_operational')); $sub->url( action([\Modules\Project\Http\Controllers\ProjectController::class, 'index']).'?project_view=list_view', __('lang_v1.projects_operational'), ['active' => request()->segment(1) == 'project' || request()->get('type') == 'project'] ); } $sub->header(__('lang_v1.projects_professional_pm')); self::addProfessionalProjectCoreLinks($sub); }, [ 'icon' => MenuIcons::svg('briefcase'), 'active' => request()->segment(1) == 'professional-project' || request()->segment(1) == 'project', 'data-module' => 'ProfessionalProject', 'data-menu-group' => 'engineering', ] )->order(85); self::addProjectCategoriesDropdown($menu, $categories); return; } $menu->dropdown( __('professionalproject::lang.module_name'), function ($sub) { self::addProfessionalProjectCoreLinks($sub); }, ['icon' => MenuIcons::svg('briefcase'), 'active' => request()->segment(1) == 'professional-project' && ! request()->filled('filter_category'), 'data-module' => 'ProfessionalProject', 'data-menu-group' => 'engineering'] )->order(85); self::addProjectCategoriesDropdown($menu, $categories); }); } protected static function addProfessionalProjectCoreLinks($sub): void { $sub->url( action([\Modules\ProfessionalProject\Http\Controllers\ProjectController::class, 'index']).'?view=list', __('professionalproject::lang.projects'), ['active' => request()->segment(1) == 'professional-project' && request()->segment(2) == 'projects' && request()->get('view', 'list') === 'list' && ! request()->filled('filter_category')] ); $sub->url( action([\Modules\ProfessionalProject\Http\Controllers\ProjectController::class, 'index']).'?view=kanban', __('professionalproject::lang.kanban_board').' — '.__('professionalproject::lang.projects'), ['active' => request()->segment(1) == 'professional-project' && request()->segment(2) == 'projects' && request()->get('view') === 'kanban' && ! request()->filled('filter_category')] ); $sub->url( action([\Modules\ProfessionalProject\Http\Controllers\TaskController::class, 'index']), __('professionalproject::lang.tasks'), ['active' => request()->segment(2) == 'tasks'] ); if (auth()->user()->can('professionalproject.manage_task_statuses')) { $sub->url( action([\Modules\ProfessionalProject\Http\Controllers\TaskStatusController::class, 'index']), __('professionalproject::lang.task_statuses'), ['active' => request()->segment(2) == 'task-statuses'] ); } } protected static function addProjectCategoriesDropdown($menu, $categories): void { if (! ($categories->isNotEmpty() || ( \Module::has('ManagementTools') && \Module::isEnabled('ManagementTools') && auth()->user()->can('managementtools.access') && (auth()->user()->can('managementtools.manage_employee_tasks') || auth()->user()->can('managementtools.manage_project_categories')) ))) { return; } $menu->dropdown( __('professionalproject::lang.project_categories'), function ($sub) use ($categories) { self::addCategoryLinks($sub, $categories); if (\Module::has('ManagementTools') && \Module::isEnabled('ManagementTools') && auth()->user()->can('managementtools.access') && (auth()->user()->can('managementtools.manage_employee_tasks') || auth()->user()->can('managementtools.manage_project_categories'))) { $sub->url( action([\Modules\ManagementTools\Http\Controllers\ProjectCategoryController::class, 'index']), __('professionalproject::lang.manage_categories'), [ 'icon' => MenuIcons::child('settings'), 'active' => request()->segment(1) == 'management-tools' && request()->segment(2) == 'project-categories', ] ); } }, [ 'icon' => MenuIcons::child('folder'), 'active' => (request()->segment(1) == 'professional-project' && request()->filled('filter_category')) || (request()->segment(1) == 'management-tools' && request()->segment(2) == 'project-categories'), 'data-module' => 'ProfessionalProject', 'data-menu-group' => 'engineering', ] )->order(84); } protected static function addCategoryLinks($sub, $categories, ?int $parent_id = null, int $depth = 0): void { $children = $parent_id === null ? $categories->whereNull('parent_id') : $categories->where('parent_id', $parent_id); foreach ($children as $category) { $icon = ! empty($category->icon) ? $category->icon : 'fa fa-folder'; $label = str_repeat('— ', $depth).$category->name; $sub->url( action([\Modules\ProfessionalProject\Http\Controllers\ProjectController::class, 'index']) .'?view=list&filter_category='.$category->id, $label, [ 'icon' => $icon, 'active' => request()->segment(1) == 'professional-project' && request()->segment(2) == 'projects' && (string) request()->get('filter_category') === (string) $category->id, ] ); self::addCategoryLinks($sub, $categories, $category->id, $depth + 1); } } }