226 lines
10 KiB
PHP
226 lines
10 KiB
PHP
<?php
|
|
|
|
namespace Modules\ProfessionalProject\Http\Controllers;
|
|
|
|
use App\Http\MenuIcons;
|
|
use App\Utils\ModuleUtil;
|
|
use Illuminate\Routing\Controller;
|
|
use Menu;
|
|
use Modules\ProfessionalProject\Entities\PpProjectCategory;
|
|
use Modules\ProfessionalProject\Entities\PpTask;
|
|
|
|
class DataController extends Controller
|
|
{
|
|
public function parse_notification($notification)
|
|
{
|
|
if ($notification->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);
|
|
}
|
|
}
|
|
}
|