Skip to content

Commit c0ac273

Browse files
arifulhoque7claude
andauthored
feat(kanban): move Kanban board into Free core + remove dead Vue (#627)
* feat(kanban): move Kanban board from Pro into Free core Kanban is now a built-in Free feature (no module gating). Data is unchanged — boards stay as pm_boards rows (type "kanboard"), task↔column mapping stays in pm_boardables, automation/header in pm_meta — so existing boards keep working with no migration. Backend (src/Kanban, routes/kanban.php): - Kanboard controller/models/transformer/permission ported from the Pro module, namespaced WeDevs\PM\Kanban; routes auto-load on pm/v2. - Boot class wires the task lifecycle hooks (after_create_task, etc.). - Added the missing Access_Project permission to the filter route. Frontend: - Kanban board components + slice moved in; proApi → Free useApi; window.PM bridge calls (TaskDetailSheet, useProjectAssignees, openTaskSheet, resetProjectState) replaced with direct imports. - Static route + store slice + sidebar nav (no more Pro placeholder/preview). Refs weDevsOfficial/pm-pro#357 * fix(kanban): int task-status comparison, i18n domain, dead-query typo - before_change_task_status compared int status (0/1) to 'incomplete'/ 'complete' strings — on PHP 8 that's always false, so the list-view→column status automation never ran. Compare to Task::INCOMPLETE / Task::COMPLETE. - Use the 'wedevs-project-manager' text domain (was 'pm' / 'pm-pro'). - get_tasks(): fix duplicated where('board_type','task') → 'boardable_type'. Refs weDevsOfficial/pm-pro#357 * chore(cleanup): remove dead legacy Vue app The app is fully React (entry views/assets/src/index.jsx → pm.js); the old Vue 2 app was dead — never built (webpack builds only index.jsx) and never enqueued (PHP loads only pm-config + pm-scripts). - Delete all .vue files and Vue JS (Vuex stores, vue-router, mixins, directives, helpers, the main.js/start.js entry, store/store.js). - Delete the compiled Vue bundles (views/main.js, vendor/vue/) and the vue-multiselect css. - Drop the dead Vue script/style registrations from config/scripts.php and config/style.php and re-point the dangling vendor dependencies. No runtime change — none of this was loaded by the React build. * fix(kanban): enlarge tiny card assignee avatars (sm 7px → md) Card initials rendered at size=sm (h-5, text-[7px]) — unreadable. Bump card avatars to md (h-7, text-[11px]) and the add-task assignee preview xs → sm. Refs weDevsOfficial/pm-pro#356 * fix(kanban): patch SQLi + cross-project IDOR + input hardening Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(kanban): remove dead unreachable after_new_comment body Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 3f4449e commit c0ac273

360 files changed

Lines changed: 4184 additions & 164597 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

bootstrap/start.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
wedevs_pm_load_routes();
2222
wedevs_pm_register_routes();
2323
wedevs_pm_clean_svg();
24+
25+
new WeDevs\PM\Kanban\Kanban();
26+
2427
do_action( 'wedevs_pm_loaded' );
2528

2629
add_action('init', 'wedevs_pm_init_tracker');

config/scripts.php

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -45,35 +45,11 @@
4545
'in_footer' => true
4646
],
4747

48-
'pm-vue' => [
49-
'id' => 'pm-vue',
50-
'url' => plugin_dir_url( dirname( __FILE__ ) ) . 'views/assets/vendor/vue/vue'.$wedevs_pm_suffix.'.js',
51-
'path' => $wedevs_pm_view_path . '/assets/vendor/vue/vue'.$wedevs_pm_suffix.'.js',
52-
'dependency' => ['pm-i18n'],
53-
'in_footer' => true
54-
],
55-
56-
'pm-vuex' => [
57-
'id' => 'pm-vuex',
58-
'url' => plugin_dir_url( dirname( __FILE__ ) ) . 'views/assets/vendor/vue/vuex'.$wedevs_pm_suffix.'.js',
59-
'path' => $wedevs_pm_view_path . '/assets/vendor/vue/vuex'.$wedevs_pm_suffix.'.js',
60-
'dependency' => ['pm-vue'],
61-
'in_footer' => true
62-
],
63-
64-
'pm-vue-router' => [
65-
'id' => 'pm-vue-router',
66-
'url' => plugin_dir_url( dirname( __FILE__ ) ) . 'views/assets/vendor/vue/vue-router'.$wedevs_pm_suffix.'.js',
67-
'path' => $wedevs_pm_view_path . '/assets/vendor/vue/vue-router'.$wedevs_pm_suffix.'.js',
68-
'dependency' => ['pm-vuex'],
69-
'in_footer' => true
70-
],
71-
7248
'pm-chart' => [
7349
'id' => 'pm-chart',
7450
'url' => plugin_dir_url( dirname( __FILE__ ) ) . 'views/assets/vendor/chart/chart'.$wedevs_pm_suffix.'.js',
7551
'path' => $wedevs_pm_view_path . '/assets/vendor/chart/chart'.$wedevs_pm_suffix.'.js',
76-
'dependency' => ['pm-vue-router'],
52+
'dependency' => ['pm-i18n'],
7753
'in_footer' => true
7854
],
7955

@@ -154,19 +130,11 @@
154130
'in_footer' => true
155131
],
156132

157-
'pm-vue-library' => [
158-
'id' => 'pm-vue-library',
159-
'url' => plugin_dir_url( dirname( __FILE__ ) ) . 'views/assets/js/library.js',
160-
'path' => $wedevs_pm_view_path . '/assets/js/library.js',
161-
'dependency' => ['pm-toastr'],
162-
'in_footer' => true
163-
],
164-
165133
'pm-pretty-photo' => [
166134
'id' => 'pm-pretty-photo',
167135
'url' => plugin_dir_url( dirname( __FILE__ ) ) . 'views/assets/vendor/pretty-photo/jquery.prettyPhoto.js',
168136
'path' => $wedevs_pm_view_path . '/assets/vendor/pretty-photo/jquery.prettyPhoto.js',
169-
'dependency' => ['pm-vue-library'],
137+
'dependency' => ['pm-toastr'],
170138
'in_footer' => true
171139
],
172140

@@ -280,8 +248,6 @@
280248
]
281249
];
282250

283-
$wedevs_pm_scripts['pm-vue-library']['dependency'] = array_merge( [$wedevs_pm_hooks['pm-hooks']['id']], $wedevs_pm_scripts['pm-vue-library']['dependency'] );
284-
285251
$wedevs_pm_scripts = array_merge( $wedevs_pm_scripts, $wedevs_pm_hooks );
286252
//}
287253

config/style.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,6 @@
33
$wedevs_pm_view_path = dirname (__FILE__) . '/../views/';
44

55
return [
6-
'pm-vue-multiselect' => [
7-
'id' => 'pm-vue-multiselect',
8-
'url' => plugin_dir_url( dirname( __FILE__ ) ) . 'views/assets/css/vue-multiselect/vue-multiselect.min.css',
9-
'dependency' => false,
10-
'path' => $wedevs_pm_view_path . '/assets/css/vue-multiselect/vue-multiselect.min.css',
11-
],
126
'pm-nprogress' => [
137
'id' => 'pm-nprogress',
148
'url' => plugin_dir_url( dirname( __FILE__ ) ) . 'views/assets/css/nprogress/nprogress.css',

routes/kanban.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
use WeDevs\PM\Core\Router\Router;
4+
5+
$wedevs_pm_router = Router::singleton();
6+
7+
$wedevs_pm_router->get( 'projects/{project_id}/kanboard', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@index' )
8+
->permission( ['WeDevs\PM\Core\Permissions\Access_Project'] );
9+
10+
$wedevs_pm_router->post( 'projects/{project_id}/kanboard', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@store' )
11+
->permission( ['WeDevs\PM\Core\Permissions\Project_Manage_Capability'] );
12+
13+
$wedevs_pm_router->post( 'projects/{project_id}/kanboard/{board_id}/task/{task_id}', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@store_searchable_task' )
14+
->permission( [
15+
'WeDevs\PM\Core\Permissions\Access_Project',
16+
'WeDevs\PM\Kanban\Permissions\Kanboard_Permission'
17+
] );
18+
19+
$wedevs_pm_router->get( 'projects/{project_id}/kanboard/{board_id}', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@show' )
20+
->permission( ['WeDevs\PM\Core\Permissions\Access_Project'] );
21+
22+
$wedevs_pm_router->post( 'projects/{project_id}/kanboard/{board_id}/update', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@update' )
23+
->permission( ['WeDevs\PM\Core\Permissions\Project_Manage_Capability'] );
24+
25+
$wedevs_pm_router->post( 'projects/{project_id}/kanboard/board-order', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@board_order' )
26+
->permission( ['WeDevs\PM\Core\Permissions\Project_Manage_Capability'] );
27+
28+
$wedevs_pm_router->post( 'projects/{project_id}/kanboard/task-order', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@task_order' )
29+
->permission( ['WeDevs\PM\Core\Permissions\Access_Project'] );
30+
31+
$wedevs_pm_router->post( 'projects/{project_id}/kanboard/{board_id}/delete', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@destroy' )
32+
->permission( ['WeDevs\PM\Core\Permissions\Project_Manage_Capability'] );
33+
34+
$wedevs_pm_router->post( 'projects/{project_id}/kanboard/{board_id}/tasks/{task_id}/delete', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@delte_task' )
35+
->permission( ['WeDevs\PM\Core\Permissions\Delete_Task'] );
36+
37+
$wedevs_pm_router->post( 'projects/{project_id}/list-view-type', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@list_view_type' )
38+
->permission( ['WeDevs\PM\Core\Permissions\Project_Manage_Capability'] );
39+
40+
$wedevs_pm_router->post( 'projects/{project_id}/boards/{board_id}/automation', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@automation' )
41+
->permission( ['WeDevs\PM\Core\Permissions\Project_Manage_Capability'] );
42+
43+
$wedevs_pm_router->post( 'projects/{project_id}/kanboard/{board_id}/header_background', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@header_background' )
44+
->permission( ['WeDevs\PM\Core\Permissions\Project_Manage_Capability'] );
45+
46+
$wedevs_pm_router->post( 'projects/{project_id}/kanboard/filter', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@search_tasks' )
47+
->permission( ['WeDevs\PM\Core\Permissions\Access_Project'] );
48+
49+
$wedevs_pm_router->post( 'projects/{project_id}/kanboard/import-tasks', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@import_bulk_task' )
50+
->permission( ['WeDevs\PM\Core\Permissions\Access_Project'] );
51+
52+
$wedevs_pm_router->get( 'projects/{project_id}/kanboard/tasks', 'WeDevs/PM/Kanban/Controllers/Kanboard_Controller@get_tasks' )
53+
->permission( [
54+
'WeDevs\PM\Core\Permissions\Access_Project',
55+
'WeDevs\PM\Kanban\Permissions\Kanboard_Permission'
56+
] );

0 commit comments

Comments
 (0)