docs: improve README structure and local setup guidance - #596
docs: improve README structure and local setup guidance#596Gingiris wants to merge 2508 commits into
Conversation
…-v2.6.17 v2.6.17 Change log updated
Merge pull request weDevsOfficial#521 from iftakharul-islam/master
…new-hooks Introduce new hooks for better extendibility
…r-role-task-not-showing-properly fix: subscriber role user task redirecting to latest task
…njection-via-orderby-Parameter Secure orderby parameter
…bitrary Options Update
…nee-issue-on-task check assignee on task
…uthorization-to-Authenticated-Limited-Arbitrary-Options-Update Fix : Missing Authorization to Authenticated (Subscriber+) Limited Ar…
added version 2.6.18 change log
Replace the previous truthy check for link_to_backend with explicit handling: if the setting is null, derive the default from the pm_pages option (use presence of a project page); otherwise parse the stored value as a boolean using filter_var. Keeps the existing apply_filters call. This ensures correct defaults and robust boolean parsing.
* Add view-all-projects check and use in controller Introduce wedevs_pm_can_view_all_projects() in libs/functions.php (wrapping existing admin capability check) to express intent that only PM Admins and WP Admins can view all projects. Update Project_Controller to use this helper so non-admin users (PM Managers) are limited to viewing only their assigned projects. * Use view-all-projects capability check Replace wedevs_pm_has_manage_capability with wedevs_pm_can_view_all_projects when $inUsers is empty so users granted the 'view all projects' permission can proceed without needing the broader manage capability. * Use admin capability check instead of view-all fn Remove the deprecated wedevs_pm_can_view_all_projects wrapper from libs/functions.php and update calls to use wedevs_pm_has_admin_capability in Project_Controller and Project helper. This consolidates permission logic so only users with the admin capability can view all projects, removing the obsolete function.
* fix: labels not showing in tasks list * Ensure project_id is in the data array for update_model * update nvmrc file * revert vue-fullscreen.min.js * revert package-lock.json * revert package-lock.json
* feature/headway-integration * Add Biome config; minor security and selector fixes Add a new biome.json to enable Biome linter and organizeImports, and ignore vendor, node_modules, vendor and build directories. Update libs/functions.php to use a simpler badge selector (#HW_badge_cont) for headway badge counting. Add rel="noopener noreferrer" to the external idea share link in header.vue to improve security when opening a new tab. * Defer Headway init and add icon/placement styles Remove biome.json and update Headway integration and header UI. Wrap Headway bootstrap in an IIFE, set HW_config on window, and defer initialization until after page load with a 2s idle delay to avoid blocking rendering; preserve callbacks to hide the unread badge when count is zero or widget is hidden. Add an inline SVG "What's New" icon with a translated title to the header and adjust CSS so the Headway badge container fills the clickable area and stacks correctly (absolute positioning and z-index). Also delete biome.json (project config) as part of this changeset. * Add Headway selector check and accessibility attrs Avoid JS errors by ensuring the Headway badge selector exists before initializing Headway (adds a document.querySelector check in pmInitHeadway). Improve accessibility of the Headway badge in the project header by adding role="button", tabindex="0" and an aria-label (keeps the existing title/localized text).
* Release v3.0.3: bump versions and changelogs Prepare and release v3.0.3: update plugin header and PM_VERSION, bump package version, adjust package release script, and add changelog/readme entries for v3.0.3. Includes fixes for email notifications, list-view button width, Unicode ucfirst capitalization, automatic inference of link_to_backend, restored task list labels, and added support for the view-all-projects check. * Added headway changelog
* Release v3.0.3: bump versions and changelogs (#587)
* Release v3.0.3: bump versions and changelogs
Prepare and release v3.0.3: update plugin header and PM_VERSION, bump package version, adjust package release script, and add changelog/readme entries for v3.0.3. Includes fixes for email notifications, list-view button width, Unicode ucfirst capitalization, automatic inference of link_to_backend, restored task list labels, and added support for the view-all-projects check.
* Added headway changelog
* React 18 UI redesign: admin panel with Tailwind + shadcn/ui
- Replace Vue 2 with React 18 + Redux Toolkit + React Router 6
- Add wp-scripts build pipeline, Tailwind v3, shadcn/ui (Radix)
- New sidebar with collapsible project tree, favourites, pro badges
- Projects page: grid/list views, filters, pagination, CRUD
- Task lists, task rows, task detail sheet with comments
- My Tasks: tabs, filters, project filter, new task sheet
- Admin settings: 6 tabs (General, Email, Task Types, User Map, Pusher, AI)
- Project sub-pages: Overview, Discussions, Milestones, Files, Activities
- Categories page with table + sheet drawer
- Calendar, Reports, Modules, Premium pages (pro-gated)
- Common: RichTextEditor (TipTap), FileUploadArea, ProBadge, ProGate
- Hooks: useApi, useI18n, usePermissions, useToast, usePmHooks
- Utility: pm-utils (date formatting, task status helpers)
- Consistent max-w-[1200px] across all pages
- Toast notifications with colored icons (bottom-center)
* Update Grunt build tasks and add release script
Refactor Gruntfile to adjust build/copy behavior and task wiring: tidy up formatting, add many file exclusions (pnpm-lock.yaml, .npmrc, tailwind/postcss/jsconfig/components, *.bak, etc.), update run tasks (rename/reset -> build, add composer/dumpautoload flows), replace makepot runner to use wp i18n with excludes, and load the relevant npm grunt tasks. Update the release task to run the new build step. Also add a package.json "release" script and minor scripts/lint formatting changes.
* Add TopBar, AI project generator and inline edits
Introduce a new TopBar (search, notifications, breadcrumb, sidebar-mode toggle) and integrate it into AppLayout; AppSidebar now listens for sidebar mode changes and supports a WordPress-hidden mode. Add AiCreateDialog sheet for AI-driven project generation (prompt + preview steps, generate/save flows). Simplify Pro gating: refactor ProGate to show inline ProBadge and open upgrade modal on click; remove several isPro checks and pro-only banners in Settings, AI and Pusher tabs. Enhance Discussions and Milestones pages with inline edit flows (edit/cancel/save for discussions, comments and milestones) and status toggles. Misc: import cleanup and various UI/UX tweaks across components.
* Add Pro features, invoice & pages settings
Introduce Pro functionality across the admin UI and project views. Adds new Pro-specific tabs (InvoiceSettingsTab, PagesSettingsTab, ProSettingsTab) and many Pro components (Gantt, Kanban, InvoicePage, LabelManager, TimeTrackerWidget, custom fields, etc.). Extend GeneralTab to include Pro fields (task start date, daily digest, company logo upload) and wire saving behavior. Add useProApi hook and multiple Redux slices under store/pro to support Pro features. Update AppSidebar and TopBar to surface Pro navigation, and enhance MyTasksPage with a mini calendar, reports tab (Pro) and associated data fetching. Misc: new radio-group UI, adjustments to useApi, index, tasks/taskLists slices, and Tailwind CSS tweaks to support the new UI.
* Enhance Kanban UI, Custom Fields, and Pro badges
UI & UX improvements across Kanban, custom fields and Pro UI. Swapped Pro badge icon to a crown and wired pro-tab clicks to open the Pro modal in MyTasksPage. Revamped CustomFieldsSection with better placeholders, checkbox/value handling, robust select/options parsing (adds a ‘none’ option), separators, icons, and debounced save with visual saving/saved indicators. Large refactor of KanbanBoard: added import-task modal, automation modal, color picker, filter panel, search/add-existing-task, drag-and-drop behavior, improved card/column layouts, task creation tied to a default task list, and helper utilities (fmtDate/isOverdue). Also updated store usage to include saveAutomation and integrated pro API hooks; various small UI/behavior polish and performance tweaks.
* Add Pro Invoices UI and Tools sidebar link
Introduce a full-featured Pro invoices UI: list, paginated listing, detailed view, create/edit sheet, line-items editor, address components, and payment dialog. InvoicePage was refactored to use new components and pro/api hooks, support list/form/detail views, pagination, member loading, and PDF/email actions. Added invoice helper utilities and modular components under components/pro/invoice (AddressSection, InvoiceFormSheet, InvoiceDetailView, LineItemsEditor, PaymentDialog, helpers). Also added a 'Tools' (Wrench) admin nav item to the AppSidebar and updated invoice-related store usages and imports to wire the new UI to the API/store.
* Refactor Gantt & Kanban UI with DnD and dialogs
Replace legacy GanttChart and Kanban implementations with componentized DnD-driven UIs and modern controls. Added new pro components (gantt and kanban indexes) and a context-menu UI, reorganized state (features/groups) and optimistic move/update/delete flows for tasks, and introduced provider-based Gantt/Kanban wrappers for timeline/sidebar rendering and drag handling. Updated API payloads and loading logic, simplified dialogs and detail panels, added zoom/range controls and select/context-menu integrations. package.json updated with new dependencies (dnd-kit, radix context-menu, jotai, usehooks, lodash.throttle, tunnel-rat, etc.). Misc: UI/UX refinements, improved error/toast handling, and numerous formatting/cleanup changes across files.
* Remove Pro components; add previews & recent projects
Remove legacy Pro-only components and store slices, rename package and update metadata, and introduce UX improvements: show Pro tab previews in Settings (ProSettingsPreview + ProBadge + modal trigger), make Pages settings more robust (use getSetting, support 'none' value, saving state, update PM_Pro_Vars), add recent projects persisted to localStorage and a Recent section in the sidebar, and add a Progress view route. Also add new hooks and route registry scaffolding (useNavRegistry, useSlot, routeRegistry) and update webpack/store entries accordingly. These changes simplify the codebase by removing many pro files and improve the free-user experience with non-blocking previews and navigation enhancements.
* Expose UI/Radix exports and dynamic Pro subnav
Re-export shadcn/ui components and Radix primitives on window.PM so the Pro bundle can reuse the same UI and context instances (prevents duplicate Radix contexts that caused popover/sheet interaction issues). Replace the static PROJECT_SUB_NAV_PRO with a getProSubNav() helper that reads PM_Pro_Vars.active_modules (safely guarded) and builds the pro project sub-navigation based on active modules, always including Settings. This filters pro menu items by module paths at runtime and preserves behavior when PM_Pro_Vars is absent or malformed.
* Add estimation & privacy controls to tasks
Introduce TaskEstimationField and TaskPrivacyField components and wire them into TaskDetailSheet. Estimation is now editable via an hh:mm popover when a task has no subtasks and exactly one assignee (falls back to read-only when subtasks exist); saves are posted to projects/{projectId}/tasks/{taskId}/update. Privacy is toggleable for Pro users (ProGate upsell for free users) and posts to projects/{projectId}/tasks/privacy/{taskId}.
Also update TaskRow to use the shared isPrivate helper, fix privacy toggle logic and payload, and show a tooltiped lock icon for private tasks. Misc: reorder detail fields so assignees appear before estimation (so assignment state affects editability) and add minor UI/UX improvements (disabled states, input validation, and toast messages).
* Add rich editor, project reset & UI tweaks
Replace plain Textarea with RichTextEditor across multiple pages (discussions, milestones, project create, task lists) to enable rich content. Remove ProSettingsTab and move logo upload into GeneralTab using a native file input + WP REST media upload (with upload state/loader). Add a global resetProjectState action, wire it into store exports and handle it in taskLists/tasks slices to clear project-scoped state when switching projects; TaskListsPage now dispatches resetProjectState on mount. Propagate a new showLabels flag (fetched from project) through TaskListsPage → TaskListSection → TaskRow to render task labels. Update TopBar to fetch activities (not notifications), improve notifications sheet layout and message templating, and rename headway badge id. Make various UI/styling tweaks (TaskDetailSheet properties layout, Activities card bg) and tweak tailwind to exclude .media-modal from a global dialog rule. Also export RichTextEditor and Sonner lib from window.PM for Pro compatibility.
* Add frontend layout and several UI enhancements
Introduce a FrontendLayout and frontend-aware behavior across the app (TopBar, AppSidebar, Enqueue_Scripts) to support embedding the app outside WP admin (adds is_frontend and logout_url). Make pm-scripts dependencies dynamic by reading views/assets/dist/pm.asset.php when present. Add project title search in Project_Controller. Improve FileUploadArea with image thumbnails, size labels and compact styling. Enhance TaskDetailSheet to support comment attachments, editing and deleting comments, and handle assignee payload edge-cases. Revamp MyTasks activity list with richer metadata, date range filter and parsing fallbacks. Update Projects UI: status colors/labels, grid/card layout tweaks, project search, clickable meta counters, and several id type-safety fixes (parseInt). Misc UI/UX adjustments and small bugfixes across components.
* Add invoice defaults and enhance file/project UIs
InvoiceSettingsTab: add invoice default fields (company_name, company_address, tax_rate, default_notes) with UI, support new PayPal/Stripe keys (paypal_status/paypal_email/paypal_test/stripe_status) while preserving legacy fallbacks, and include new keys in saved payload. FilesPage: implement folder navigation (breadcrumb path, enterFolder, navigateToBreadcrumb), grid/list view toggle (persisted in localStorage), improved icons/previews, privacy toggle for Pro files, upload/create actions now respect current folder parent, pro API folder filtering and deduplication logic when merging free + pro results, and sorting folders first. ProjectsPage: add Sort By select with handleSortChange to dispatch ordered project fetches. TaskDetailSheet: add FileText icon next to the Description header. Misc: various UI/UX refinements and small bugfixes related to file listing and handling.
* Update Gruntfile.js
* Add Pro placeholders, upgrade modal, file move & UI tweaks
Introduce multiple Pro UX improvements and safety fixes across the app:
- Add ProFeaturePlaceholder component (mock previews for kanban/gantt/invoices/settings) and enhance ProBadge with hover/display options.
- Rewrite ProUpgradeModal: new image slider, updated layout, checklist styling and CTA to match Vue design.
- AppSidebar: show pro preview items when not Pro, reveal ProBadge on hover, adjust premium CTA styling and nav grouping.
- FilesPage: add "Move to Folder" dialog and API flow, use Pro API exclusively when Pro is enabled (avoid duplicated files), add refresh key and several UI/metadata fixes (children_count handling, hover badges).
- ProjectsPage: add "Duplicate" action gated by Pro (opens modal if not Pro); search input and list UI tweaks.
- ProjectOverview: convert stats grid to horizontally scrollable cards and refine card layout.
- TaskDetailSheet: convert task estimation from hh:mm to total minutes for API compatibility.
- TaskFilterBar: adjust search input styling and focus ring behavior.
- TopBar: improve avatar fallback logic (use nested data fields and global PM_Vars).
- PHP: Activity_Transformer and Last_Activity updated with defensive checks to handle non-Activity/null values and avoid errors.
Also includes assorted CSS/class adjustments and small UX polish throughout components.
* Add task types, AI UX, pagination & UI polish
Add support for task types and several UX/store improvements:
- Backend: List_Task_Transformer now includes a get_type() query to attach task type object to transformed tasks.
- Task list UI/store:
- TaskListsPage: add pagination UI and page handling.
- taskListsSlice: support pagination meta, page param for fetchTaskLists thunk, update meta on add/delete, and loadingMore flag.
- Projects: wire ordering into Redux (orderBy), persist order into fetchProjects params, and expose setOrderBy action.
- AI generator dialog: large UX enhancements — overlay with progress/steps, fullscreen toggle, skeleton preview, prompt/preview improvements, stats badges, and various input/button state fixes.
- Task detail & rows:
- TaskDetailSheet: UI reorganizations, header navigation to project, add editable TaskTypeField (load/save/remove types), integrate ProInlineProperties and visual tweaks.
- TaskRow: render task.type as a badge in list rows.
- Misc UI polish: ProGate simplification, unsaved-changes indicator in AI settings, style/class tweaks across components.
These changes improve task type handling, add pagination for large task lists, and significantly polish the AI project-generation experience and task detail interactions.
* Add overdue badges, assignee filter, and project meta
Introduce overdue detection and UI badges, add assignee filtering to the task filter bar, and surface project metadata/created date in projects views.
Summary of changes:
- lib/pm-utils.js: Add isOverdue(dueField, status) helper to determine if a task's due date is past today for non-complete tasks.
- components/my-tasks/MyTasksPage.jsx: Import and use isOverdue to style due dates and render a destructive "Overdue" Badge for overdue tasks.
- components/tasks/TaskRow.jsx: Import isOverdue, show start→due range when start_at exists, and render an "Overdue" Badge next to the due date when appropriate.
- components/tasks/TaskFilterBar.jsx: Add an Assignee select (with avatars and initials), collect unique assignees from lists, include assigneeId in filter params (users), and ensure clearing/reset works for the new filter.
- components/projects/ProjectsPage.jsx: Import formatPmDate, add task breakdown (done/total) beneath progress bars, display project created date in card footer and table column, and adjust table layout accordingly.
These changes improve task visibility (overdue state), enable filtering by assignee, and provide better project summary information in the UI.
* Responsive UI tweaks, pro placeholders & privacy
Make multiple responsive and UX improvements across the app: reduce default paddings (p-6 -> p-4 sm:p-6), add responsive layout classes (flex-wrap, sm: prefixes), enable tables/tiles horizontal scroll (overflow-x-auto, min-w), and improve TopBar mobile behavior (compact spacing, mobile search button, hide headway on small screens).
Add sidebar auto-collapse logic for full-width pages (reports, calendar, progress, sprints) and use data-pm-dialog to center dialogs reliably via CSS changes in tailwind.css. Replace static Pro placeholders routes with conditional fallbacks so placeholders render only when Pro hasn't registered dynamic routes.
Task/file privacy and pro UX changes: remove file privacy toggle handlers/UI, add optimistic update action updateTaskPrivacy in taskListsSlice, wire optimistic privacy updates in TaskRow (with permission gating and Crown indicator), and disable private-list control for non-Pro users (with visual hint). Misc: small icon/button adjustments and assorted minor refactors/imports to support these changes.
* Add GitHub, Loom and Notion preview APIs
Add preview support for GitHub, Loom and Notion links: new REST routes and controllers (GitHub_Preview_Controller, Loom_Preview_Controller, Notion_Preview_Controller) with transient caching, rate-limit and error handling, and test-connection endpoints. Wire up front-end settings and UI: add settings tabs and preview card/container components, update Settings model/transformer and integrate previews into existing pages (Discussions, Task detail, app index). Also add a URL strippers utility and limit batch preview sizes to improve reliability.
* Add WelcomePage, pro slots, grunt deps & thunk
Introduce a new WelcomePage component (views/.../welcome/WelcomePage.jsx) to show a product tour, feature videos and resource links. Add extension points (Slot) to TaskListSection and TaskListsPage so Pro can inject actions/menu items (slot names: "tasklist.section.menu" and "tasklist.header.actions"). Wire up the new page in views/assets/src/index.jsx (lazy import + route) and expose fetchTaskLists in window.PM.thunks for Pro usage. Also add Grunt and several grunt plugins to package.json to support additional build tasks.
* Sync task updates and improve task UI
Keep task data consistent and improve UX across the app:
- Sync changes from tasksSlice into task lists by adding syncTaskInLists and handling updateTask.fetchTask.fulfilled to merge updated task fields into incomplete/complete lists.
- Show success toasts when changing task status in TaskRow, TaskDetailSheet, and MyTasksPage, and refetch tasks/user meta when the TaskDetailSheet closes (uses useAppSelector/useRef).
- Flatten TaskFilterBar API response (lists with embedded tasks) into a single task array and normalize task_list_id/board_id before returning results.
- Fix PHP Task helper to avoid treating array IDs as a single ID: only apply the single-ID branch when $id is not an array.
- Added/updated imports where needed (useAppSelector, useRef, task actions).
* Use outline buttons and adjust button sizing
Replace several Button variants from `ghost` to `outline` for consistent styling and remove deprecated muted text classes. Standardize small button height and padding (h-8, px-3) and tweak the Plus icon size for better visual alignment. Affected files: MyTasksPage.jsx, DiscussionsPage.jsx, TaskFilterBar.jsx, TaskListsPage.jsx.
* Show API keys, add skeletons & UI tweaks
Reveal decrypted AI API keys for admins (use decrypt_api_key_static) and stop masking them; treat other hidden settings as booleans and leave GitHub/Notion tokens as-is. Add show/hide (eye) toggles and input type adjustments for AI, GitHub and Notion token fields, plus minor input/button sizing/styling improvements. Replace loading spinners with skeleton placeholders across SettingsPage and several settings tabs (GitHub, Loom, Notion) for better perceived loading. Enhance MyTasks loading UI with a richer skeleton grid and conditional skeleton for missing user counts. Swap several icon usages for consistency (ListTodo -> LayoutList, Activity -> MessagesSquare) and replace AlertTriangle with AlertCircle in milestones/projects. Miscellaneous layout and class tweaks for improved UX.
* Sidebar, frontend layout and CSS fixes
Hide Modules/Premium sidebar block on frontend and simplify conditional rendering; update sidebar footer to show "Project Manager" with copyright/year and weDevs link when expanded, keep back-to-admin button when collapsed. Adjust FrontendLayout header container to use full-width padding (remove max-width centering). Add Tailwind override to remove WP admin margin leak on the frontend (#wedevs-project-manager margin-left: 0). Minor JSX/formatting cleanup for readability.
* Remove Trello import backend and adjust UI calls
Remove Trello import feature backend code and update the frontend integration flow. Deleted Trello-related controllers, helpers and library (routes/tools.php, src/Tools/Controllers/TrelloController.php, src/Tools/Helpers/ImportTrello.php, src/Tools/Library/PM_Trello.php, and the old importtools vue backup). Updated core/WP/Frontend.php to drop the ImportTrello use. Modified views/assets/src/components/projects/ToolsPage.jsx to change payload shape (use formData), add a stronger user existence check (userData.idMember), update calls to send formData to list/card/checklist/user steps, and update Trello URL references to trello.com/power-ups/admin. This cleans up deprecated backend code and ensures the UI sends the expected payload structure.
* Migrate API hooks to fetch and handle JSON
Convert client API helpers from jQuery.ajax to native fetch, add robust JSON handling and query serialization, and expose REST base URLs from PHP.
- core/Router/WP_Router.php: Detect and populate POST body from application/json requests (use request->get_json_params()) so REST endpoints receive JSON payloads when Content-Type is application/json.
- core/WP/Enqueue_Scripts.php: Add PM_Vars.rest_url and PM_Vars.rest_url_pro to make full REST base URLs available to the frontend.
- views/assets/src/hooks/useApi.js & useProApi.js: Fully rewrite to use fetch(); buildQueryString utility for GET params, send non-GET requests as JSON with X-WP-Nonce, implement uploadFormData using FormData + fetch, improved error handling, and keep injecting is_admin into all requests. useApi now uses PM_Vars.rest_url and useProApi uses PM_Vars.rest_url_pro.
- views/assets/src/tailwind.css: Make dialog buttons' background transparent to avoid unwanted default backgrounds.
Purpose: modernize frontend API calls (remove dependency on jQuery.ajax), correctly handle JSON request bodies, support Pro namespace base URL, and tighten UI styles.
* Validation, i18n, accessibility, and API fixes
Add input validation and preserve index mapping for GitHub and Notion preview controllers (skip empty/invalid URLs and return localized error entries). Adjust Loom preview handling so 404 is considered expected for the test URL and other non-2xx responses are treated as service blocking. Improve accessibility in SettingsPage by using a <button type="button"> for the pro overlay (retains styling and click handler). Mark the "Overdue" badge for translation and simplify pro API usage by always calling useProApi().
* Account for Pro plugin when showing license
Detect presence of the PM Pro plugin (pm-pro.js) via PM_Pro_Vars and use that to decide whether to include the License nav item. Previously the license link was only added when isPro was true; now the license item is shown if the Pro plugin is installed and we're not in the frontend. Also add the new isProInstalled dependency to the useMemo to avoid stale closures and include a clarifying comment.
* Use proApi hook for pro API calls
Replace direct fetch/api usage with the centralized proApi hook for pro endpoints. FilesPage now calls proApi.upload with the simplified `projects/${projectId}/files` path, and ProjectsPage imports and uses useProApi to call `duplicate/project/${project.id}` via proApi.post. Also added proApi to the effect dependency array. This consolidates Pro API calls and removes hardcoded pm-pro/v2 fetch logic.
* Add license page and enforce Pro license redirects
Introduce a License management page and license-aware routing. Adds LicensePage component (activate/delete license via Pro API) and registers a /license route. Expose isProLicensed from usePermissions and update ProFeaturePlaceholder, CalendarPage, ModulesPage, ProgressPage, and ReportsPage to redirect to /license when Pro is installed but not licensed. Add Sprints mock and sidebar route entry, register a sprints placeholder route, and include ReactJsxRuntime in window.PM libs. Various UI wiring and small UI/UX adjustments included.
* Bump font & icon sizes in settings UI
Increase readability and visual consistency across the app by raising small text and icon sizes in admin settings and related components. Replaced many occurrences of text-xs with text-sm, bumped SVG icon classes (w-4/h-4 -> w-5/h-5 or adjusted accordingly), and increased loader/icon sizes in buttons and status indicators. Changes span multiple admin-settings tabs (AI, Email, General, GitHub, Invoice, Loom, Notion, Pages, Pusher, Task Types, etc.), common preview components, layout/topbar/sidebar, project/task pages and related UI pieces.
* Decrypt and make AI API key editable
Allow the frontend to show and edit saved AI API keys and avoid overwriting masked keys. Changes:
- Project_Controller: increase PHP time limit for ai_generate to allow longer AI API responses.
- Settings_Transformer: decrypt stored ai_api_key_* values so the frontend receives the actual key (while keeping other hidden settings masked).
- AiSettingsTab.jsx: add UI to display a masked saved key with show/hide and edit actions (Pencil icon), an edit mode with autofocus and cancel, and improved UX for saving changes.
- settingsSlice.js: only include ai_api_key in the save payload when the user actually entered a new key (prevents sending masked placeholders and accidentally overwriting the stored key).
These changes enable safe display/editing of API keys and prevent accidental key loss while providing more resilient AI requests.
* Enforce model token limits; tweak task UI
WP_Router: Normalize validator errors into a single message before returning WP_Error to avoid passing arrays as the error message.
Project_Controller: Respect per-model max_output_tokens by capping ai response tokens to the model's configured limit. Also attempt to refresh the models config cache and retry when a model entry is missing before returning a validation error.
TaskDetailSheet.jsx: UI refinements — remove unused Badge import, tighten spacing and typography, replace outlined badge with a simple separator and monospaced id display, reduce icon/avatar sizes, and adjust layout/truncation classes for better alignment and responsiveness.
* Add webpack dependency
Add webpack (^5.90.0) to package.json to enable bundling/build tooling. Also fix the trailing comma on the previous dependency entry.
* Show saved token indicator and remove Loom test
Update admin settings UI to show a green check icon and explicit "Token saved" message for GitHub and Notion tokens, and provide clearer helper text when a token isn't saved. Simplify Loom settings by removing the oEmbed connection test UI, associated state, handler, and lucide-react icons. Backend change: treat HTTP 400 and 404 as acceptable responses for the Loom preview fake test URL by updating the status code check in Loom_Preview_Controller.
* Prevent duplicate roles and dedupe fetched roles
Add server-side check in Role_Controller::store to prevent creating duplicate roles with the same slug: if a role with the given slug exists the existing resource is returned instead of creating a new record. Also add client-side deduplication in projectsSlice.fetchRoles.fulfilled to filter fetched roles by slug (or title as fallback) using a Set, handling duplicate entries from QA databases and ensuring rolesLoaded is set.
* Update project pages, API hook; add pm.js.map
Modify DiscussionsPage.jsx and FilesPage.jsx to adjust project view behavior and UI, and update useProApi.js to change API hook logic/requests. Add generated source map views/assets/dist/pm.js.map for pm.js to aid debugging.
* Guard WP_Router::$request before get_query_params
Add a null check for WP_Router::$request before calling get_query_params() in the Transformer_Manager trait to prevent fatal errors when the request object is not available. The change applies the same defensive check in both occurrences and preserves the existing include parsing and sanitization logic.
* Fix date range SQL binding in Activity helper
Remove unused $com_start_reduce and correct the values bound into the prepared BETWEEN/NOT BETWEEN clauses. The change uses the provided $updated_at_start directly and ensures $com_add is computed correctly, preventing an incorrect/undefined variable from being passed into the SQL date range and fixing the date-boundary logic.
* Add ProjectSubNavBar and include in AppLayout
Introduce a new ProjectSubNavBar component and render it from AppLayout. The sub-nav shows project-scoped tabs (free and Pro), detects active Pro modules via PM_Pro_Vars, displays Pro preview badges, derives the active tab from the URL, and only renders in 'wordpress' sidebar mode when inside a project. The component also listens for pm-sidebar-mode-change events and reads sidebar mode from localStorage. AppLayout was updated to import and mount the new sub-navigation.
* Conditionally show Sprints nav item
Detect active Pro modules from PM_Pro_Vars and normalize entries, adding an isModuleActive helper. Move the 'Sprints' sidebar item into a conditional: always show as a preview for non-Pro users, but for Pro installs include it only when the Sprint module is active. Also apply minor formatting cleanup to the nav items array.
* Use Redux modules for pro nav; add sprint module
Make the pro sub-navigation reactive by reading active module paths from Redux (useAppSelector) with a fallback to the PHP-localized PM_Pro_Vars. getProSubNav now accepts modulePaths and the sidebar memo uses a memoized activeModulePaths so nav updates when modules are toggled. viewNavItems' module checks also use activeModulePaths and memo dependencies were updated. Additionally import Timer and add a new "sprint" module to MODULES.
* Enhance stats cards with icons and styling
Refactor ActivitiesPage and ProgressPage stats UI to use icon-based stat cards. Added lucide icons (BarChart2, Clock, PlusCircle, RefreshCw, Upload) and updated imports, replaced simple grid/text cards with rounded, bordered cards that show an icon, value and label, and adjusted grid layout. This improves visual hierarchy and consistency across the two pages.
* Enhance sidebar UI; refine assignee queries
Multiple UX and backend fixes:
- MyTask_Controller: assigned_users now accepts an optional WP_REST_Request, supports filtering by project_id, and returns unique user IDs.
- Task helper: replaced LEFT JOIN + NULL/IN condition for "no assignees" with a NOT EXISTS subquery to correctly detect tasks without assignees.
- AppSidebar.jsx: make module detection prefer Redux when populated, add short labels/icons for collapsed state, include Woo Project nav, adjust layout/spacing and collapsed behavior, add pm-sidebar-scroll class for custom scrollbar, and minor visual tweaks.
- ProjectSubNavBar.jsx: mirror AppSidebar's module detection (use Redux fallback), refactor pro subnav builder to accept module paths and recompute when modules change.
- tailwind.css: add .pm-sidebar-scroll styles for a thin, accent-highlighted, auto-show scrollbar.
These changes improve sidebar responsiveness to module data, provide better collapsed UI, and correct assignee-related task queries.
* Add CLAUDE agent docs; expose openTaskSheet
Add three new CLAUDE agent descriptor files (.claude/agents/backend-dev.md, frontend-dev.md, fullstack-dev-mentor.md) that document specialized assistant behavior, stacks, project constraints, and persistent memory rules for backend, frontend, and full-stack mentoring. Also update views/assets/src/index.jsx to import openTaskSheet from the tasks slice and expose it on window.PM.actions (alongside resetProjectState), so external/pro code can programmatically open the task sheet.
* Normalize task types; add type UI & filtering
Bump DB version to 2.5.1 and add an upgrade that normalizes pm_task_types.type (sets any non-'subtask' value to 'task'). Register the new Upgrade_2_5_1 in the Upgrade map.
Controller: Task_Types_Controller now supports filtering by a 'type' request parameter and enforces that created/updated types default to 'task' unless explicitly 'subtask'.
Frontend: Add a TypeToggle component and a "For" column to TaskTypesTab so admins can assign and see whether a type is for Task or Subtask; editing and creation forms respect the type. TaskDetailSheet now loads only task types for the task-type dropdown (api.get('settings/task-types', { type: 'task''})).
These changes ensure existing legacy types are correctly categorized after introducing the task/subtask distinction and provide UI and API filtering to manage types properly.
* Add milestone progress/health and UI features
Introduce computed task counts, progress and health on Milestone model and expose them via the transformer; use a direct SQL count with per-request caching to avoid Eloquent collection issues. Frontend: add a Redux milestonesSlice and register it in the store; replace the old Milestones page with a richer, componentized MilestonesPage (MilestoneCard, MilestoneForm, MilestoneProgress, MilestoneHealthBadge, MilestoneFilterBar, ImportTaskListsDialog) supporting create/edit dialogs, import/linking task lists, unlinking, filtering, sorting and improved UI/UX. Also add a read-only MilestoneField to TaskDetailSheet to show a task's milestone. Wire up API calls and dispatches for fetch/create/update/delete/privacy actions and refresh flows.
* Use store actions for renaming/deleting lists
Replace direct API calls and page reloads with Redux thunks: import updateTaskList and deleteTaskList and dispatch them in handleRename and handleDeleteList (using .unwrap()). Remove window.location.reload() and local refetch comment, and update useCallback dependencies to include dispatch instead of api. Keeps existing toast feedback on success/failure.
* Normalize task privacy and include privacy field
Normalize various representations of the task privacy value to an integer (accepting true/false, 'true'/'false', 1/'1') in Task_Controller and ensure params are set to 1 or 0 consistently. Also expose the normalized privacy as an integer 'privacy' field in List_Task_Transformer. Files changed: src/Task/Controllers/Task_Controller.php, src/Task_List/Transformers/List_Task_Transformer.php.
* Add single list page & privacy toggle UX
Introduce SingleTaskListPage component to display a single task list with tasks, comments (create/edit/delete), load-more pagination, progress, and task detail sheet. Update TaskDetailSheet to optimistically update task privacy in lists (dispatch updateTaskPrivacy), revert on failure, and show loading state while toggling. Adjust TaskListSection to add a "View List" button (navigate to single list), import useNavigate, and ensure load-more adds tasks without incrementing totals (incrementTotal: false).
* Add list comments and refine list handling
Register SingleTaskListPage route and lazy-load the component. Extend taskLists slice with listComments state and thunks to add, update, and delete list comments (API calls under projects/:projectId/comments). Add reducers to manage listComments (including clearListComments) and wire comment updates into extraReducers. Refactor several optimistic list/task handlers to accept listId, operate on both lists and currentList, avoid duplicates, properly handle task status/metadata merges, and ensure task syncs propagate to the current single-list view.
* Make isPrivate strict about accepted values
Change isPrivate to perform a strict check and only consider 1, '1', true, or 'true' as private. Updated the function and its comment to clarify that all other values (e.g. 0, '0', null, undefined, false) are treated as public to avoid false positives from a generic truthy check.
* Set default 'task' type and normalize values
Add a DEFAULT 'task' to the `type` column in table creation and upgrade scripts (db/Create_Table.php and core/Upgrades/Upgrade_2_4_1.php), and broaden the update in core/Upgrades/Upgrade_2_5_1.php to also convert NULL or empty string types to 'task'. This ensures new records default to 'task' and existing rows with missing/blank type values are normalized.
* Bump plugin version to 4.0.0
Update version references for a 4.0.0 release: update plugin header Version and PM_VERSION constant in cpm.php, package.json "version", and the Stable tag in readme.txt.
* Add Sprint ProGate row to task detail
Expose 'Sprint' as a pro-only inline property in TaskDetailSheet: import the Zap icon and add a ProGate(feature={__('Sprint')}) block that renders a flex row with the Zap icon, localized 'Sprint' label, and a ProBadge, matching the style of other pro properties.
* Add orderby param support for projects
Allow API consumers to customize project sorting via an 'orderby' request parameter (format: "column:dir"). The change sanitizes the input, parses column and direction, and only accepts whitelisted columns (id, title, status, created_at, updated_at) and ASC/DESC directions, defaulting to created_at DESC. This prevents malformed input/SQL injection while preserving the previous default ordering when no valid param is provided.
* Require Pro >=4.0.0 and update Grunt ignores
Raise the minimum WP Project Manager Pro compatibility from 3.0.0 to 4.0.0 in compatibility-checker.php: update version_compare logic, related flags/variables, and all user-facing deactivation/compatibility messages to reference 4.0.0. Also adjust Gruntfile.js exclude patterns to skip vendor/vue, vendor/vue-fullscreen, views/assets/js and generated .map files during tasks.
* Support linking tasks directly to milestones
Add API endpoints and controller actions to attach/detach tasks to a milestone (attach_tasks, detach_task). Update Milestone model to count tasks coming both from linked task lists and tasks directly attached via boardables, and expose direct tasks through Milestone_Transformer (include and total_direct_tasks). Add project-level subtask counting and surface total_subtasks in Project_Transformer and ProjectOverview. Frontend: implement ImportTasksDialog, TaskCheckbox and UI in MilestonesPage to link/unlink tasks, toggle task status, group milestones with "No Date", and show direct tasks on Milestone cards. Update milestones store fetch to request tasks (with: 'discussion_boards,tasks'). These changes enable direct task-milestone relationships and correct task/subtask counts across API, models and UI.
* Show filename next to icon and center dialogs
Display the file name inline with the FileText icon in DiscussionsPage.jsx by moving the name span into the non-image branch and wrapping both elements in a fragment to prevent duplication. Adjust dialog positioning in tailwind.css to truly center dialogs (top:50%, left:50%, margin:0 and transform: translate(-50%,-50%)) instead of the previous top-aligned layout. These changes improve file listing readability and ensure dialogs are visually centered.
* Use brand accent for completed tasks & UI tweaks
Replace hardcoded emerald success color with the brand accent (bg-pm-accent) for completed task indicators across TaskRow, TaskDetailSheet, MyTasksPage, and MilestonesPage to standardize styling. Adjust ProjectsPage table cell to constrain width (max-w-[300px]), add min-w-0 on the title container and switch line-clamp-1 to truncate to prevent overflow and improve text truncation. Add a cursor-pointer class to PaginationLink for better affordance. Enable richColors on the Toaster in index.jsx. These changes improve visual consistency and layout behavior.
* Improve attachments UI with image thumbnails
Separate image and non-image attachments and render images as thumbnail cards while showing other files as rounded list items with icons. Updated DiscussionsPage, SingleTaskListPage and TaskDetailSheet to group attachments (using thumb || url), add nicer borders, hover effects and responsive layouts, and to use mime_type/type checks for image detection. This improves attachment discoverability and provides a consistent visual style across discussion and task views.
* Add BuddyPress group scoping to projects
Introduce bpGroupParams helper that appends PM_BP_Vars.group_id to API query/payload when present. Apply it to fetchProjects and createProject so project listing and creation are automatically scoped to the current BuddyPress group (no behavior change when PM_BP_Vars is undefined).
* Add GitHub sync indicator to TaskRow
Import the Github icon from lucide-react and render a conditional GitHub/Bitbucket sync indicator in TaskRow. When task.github_issue is present, a small icon is shown with a Tooltip displaying the issue source and optional issue number (e.g. "#123"). This makes it easy to see linked external issues from the task list.
* I18n: localize UI strings & add sprintf helper
Introduce i18n support across multiple components by using the useI18n hook and wrapping hard-coded UI strings with __(). Add a sprintf helper to useI18n for formatted translations. Localized placeholders, button labels, mock data, status messages, and activity labels in ProBadge, ProFeaturePlaceholder, ProUpgradeModal, RichTextEditor, ActivitiesPage, AiCreateDialog, ProgressPage, and ToolsPage. Also switch date/time formatting to respect the runtime locale and update group/date formatting to use translated labels.
* Add React translation strings to language file
Adds a large set of i18n strings to languages/wedevs-project-manager.php to support translations in the plugin's React UI. New entries cover RichTextEditor, ProBadge, Trello import tools, Activities/Progress pages, AI project generator, Pro admin settings, calendar months/days, task/project pages, nav labels, and other common components and status messages.
* Add PM logo; conditional sidebar footer
Add new SVG asset views/assets/images/pm-logo.svg and update AppSidebar.jsx to only render the footer when not in the frontend (isFrontend false). Replace the previous text/copyright footer with the plugin logo when expanded, while keeping the collapsed arrow button. The logo src uses PM_Vars.dir_url if available with a fallback plugin path. This change tidies up sidebar branding and hides the footer on frontend pages.
* Use span button for Headway and fix widget position
Replace the previous wrapper div + button for the Headway "What's New" control with an inline span that acts as a button (role=button, tabIndex, cursor pointer). Stop event propagation on click, call window.Headway.toggle with the native event, and make the icon ignore pointer events to avoid interfering with clicks. Add CSS to force the Headway popup container (#HW_frame_cont.HW_visible) to be fixed with a very high z-index and explicit top/right positioning when visible so the widget is positioned predictably and doesn't overlap or break layout.
* Wait for React mount before initializing Headway
Replace the fixed timeout/load delay with a MutationObserver that waits for the React-rendered target selector before initializing Headway. Move Headway existence check into the wait function, call pmInitHeadway only when the element is present, and remove the old onHideWidget/opacity handling. Update badge hiding to target '#HW_badge' and use display:none when there are no unseen items.
* Control report fetch and preserve report dates
Stop automatic refetching of reports on date input changes by capturing the report start/end used for the last fetch and only fetching on explicit runs. Add reportDates state to store the start/end submitted to the API and update summary calculations to use those stored dates. Remove reportStart/reportEnd from fetchReport deps (with eslint disable) so fetching is triggered intentionally, and use a reportInitRef to perform a single initial fetch when the Reports tab is first opened. Also small refactors to the promise chain and local start/end variables.
* Fix email headers and new project notifications
Adjust notification email behavior and clean up related code: add the From header to the email headers array in Email.php, remove a stray debug echo from Notification.php, and tidy whitespace. In New_Project_Notification.php use a strict check for notify_users, guard against missing assignees data, remove obsolete commented logic, skip the current user when building recipient list, and perform minor formatting cleanups.
* Prefer roles.data[0].id for roleId
When mapping user attributes in ProjectCreateSheet, derive roleId from a.roles?.data?.[0]?.id first, then fall back to a.role_id and finally defaultRoleId. This handles APIs that return roles in a nested data array and avoids incorrectly assigning missing or default roles.
* Improve user search and display fallbacks
Make display names searchable and provide robust fallbacks across backend and frontend.
- Controller: include `display_name` in user search queries so display names are matched.
- Transformer: ensure `display_name` falls back to `user_login` or `user_email` when missing, so clients always have a displayable name.
- Frontend (ProjectCreateSheet): map `email` from `user_email` when needed, add `getUserName` helper and safer `userInitials` handling, use the helper for avatar alt text, initials and labels, and avoid showing duplicate email when display_name is the same as the email.
- Store: update `searchUsers` thunk to call the `users/search` endpoint with a `query` payload instead of querying `users` with `search`.
These changes improve UX for users without explicit display names and align the frontend with the updated search behaviour.
* Add formatted_date to date formatter
Expose a 'formatted_date' field in wedevs_pm_format_date that returns the date formatted with $date_format when a date is present (null otherwise). This provides a localized/WordPress-style formatted date alongside the existing date, time, datetime and timezone values.
* Use Select components and add WooCommerce mock
Replace native <select> elements with the app Select UI (SelectTrigger/SelectContent/SelectItem) in MyTasksPage and FilesPage for consistent styling and behavior; adjust related value/onChange handling and a button class. Add a new WooCommerce project mock (WooProjectMock) to ProFeaturePlaceholder and register it in MOCK_MAP, import a ShoppingCart icon and add a corresponding route placeholder in index.jsx. Also add the Select import in FilesPage and minor UI tweaks for improved UX.
* Replace Megaphone icon with CircleDot
Update TopBar component to import and use CircleDot from lucide-react instead of Megaphone. This changes the notification/announcement button icon by swapping the import and JSX usage in views/assets/src/components/layout/TopBar.jsx.
* Remove overflow-hidden from TaskListSection
Remove the `overflow-hidden` class from the root container in TaskListSection.jsx so child elements are not clipped by the card. This change allows popovers, dropdowns, or tooltips to render outside the card container.
* Add created_at filter, report date validation
Introduce created_at filtering and tighten report date handling across backend and frontend.
- libs/functions.php: Stop appending user_id and list_id to client-side anchor URLs; my-tasks and task-lists anchors no longer include explicit IDs.
- src/Task/Helper/Task.php: Add where_created_at() to the Task query builder and include it in the where-chain. The new method supports created_at, created_at_start and created_at_between (between / not between) with prepared date queries.
- views/assets/src/components/my-tasks/MyTasksPage.jsx: Improve reports UX by initializing report dates as empty, adding showReportDateError state, validating required dates and start<=end in fetchReport (with toasts), preventing auto-fetch on tab open, resetting report fields when selected user changes, and adding visual required/error styling on date inputs.
These changes ensure reports require explicit date inputs and support filtering tasks by creation date on the backend.
* reorder the project manager menus
* converted to link instead of button to get keyboard and mouse funcitonlity
* Make Activities a Pro feature with preview
Move Activities out of the free project nav and treat it as a Pro-only feature with a visible preview. Update AppSidebar to add Activities to the Pro subnav when enabled and show an Activities pro-preview entry when Pro is off. Update ActivitiesPage to respect Pro licensing: import permissions/modal hooks, redirect to /license if Pro installed but unlicensed, skip fetching when not Pro, and show a rich pro-preview UI (mock stats/feed, ProBadge and overlay that opens the upgrade modal). Also wire up required imports and UI tweaks (Crown icon, Navigate, usePermissions, useProModal, ProBadge).
* Mark Activities as pro-preview; tweak badge reveal
Remove Activities from SUB_NAV_FREE and add it to the pro-preview items (proPreview: true) so it appears as a pro feature for non-pro users. Replace the opacity-based ProBadge reveal with a width/overflow-based transition (max-w-0 overflow-hidden whitespace-nowrap -> group-hover/tab:max-w-fit with group-hover/tab:ml-1 and transition-all) for a smoother reveal animation.
* Expose TaskDetailSheet to window.PM
Import TaskDetailSheet and add it to window.PM.components so Pro/plugins can reuse the same component instance. The component is wrapped with a try/catch to log errors and return null on failure, and displayName is set to preserve a stable component identity across plugin boundaries.
* Add calendar navigation and task sheet portal
Introduce month navigation and task-detail integration in CalendarPage: add currentDate state with prev/next handlers and update month header rendering; switch day calculations to use currentDate and improve today highlighting. Replace static placeholders with ChevronLeft/ChevronRight buttons, render task indicators as interactive buttons, and wire a handleTaskClick that dispatches window.PM action to open the task sheet. Add a TaskDetailSheetPortal that safely loads TaskDetailSheet from window.PM via createPortal and Suspense, and import useAppDispatch to dispatch the sheet-opening action. Note: dayTasks is currently an empty array placeholder—populate from store/state as needed.
* Fallback to task projectId in PRO context
Use project ID from the current task as a fallback when taskLists.projectId is not available (PRO plugin context). Rename the selector value to storeProjectId, derive projectId as storeProjectId || currentTask?.project_id || currentTask?.project?.id, and add an isProContext flag. Also include isProContext in the fetchTask useEffect dependencies so the sheet refetches appropriately in PRO contexts while preserving existing behavior for the free context.
* Add global focus styles using primary color
Introduce consistent focus styles in views/assets/src/tailwind.css: add a :focus-visible outline using the --primary HSL variable with a 2px outline and 2px offset, and override WordPress admin blue focus box-shadow for a:focus and button:focus to use the primary color (preserve text color and remove the default outline). These changes improve keyboard accessibility and ensure a consistent pm-accent purple focus indicator across the UI.
* Add missing localization strings
Add several missing translation entries to languages/wedevs-project-manager.php for tooltip labels (with leading spaces: ' Tasks', ' Discussions', ' Task Lists', ' Files', ' Milestones', ' Comments') and a notification error message ('Transactional email triggered fatal error for callback '). This ensures these strings are available for translation and i18n tooling.
* Add AlertDialog, useConfirm hook, and ErrorBoundary
Introduce a reusable AlertDialog component and a useConfirm hook that returns [ConfirmDialog, confirm] for promise-based confirmation modals. Replace window.confirm usages in TaskTypesTab and LicensePage with the new confirm flow and render ConfirmDialog in those pages. Add an ErrorBoundary React class and wrap the root App to catch render errors. Export AlertDialog and ErrorBoundary via window.PM.components. Add Tailwind/CSS rules to properly center AlertDialog, set z-index ordering, and reset button styles inside alert dialogs for consistent styling.
* Add @radix-ui/react-alert-dialog dependency
Add @radix-ui/react-alert-dialog@^1.1.15 to package.json dependencies alongside other Radix UI packages to enable use of Radix alert dialog components in the project.
* Add HTML sanitization and i18n tweaks
Add DOMPurify and a sanitizeHtml util for defense‑in‑depth XSS protection, and apply it to rendered HTML in DiscussionsPage and TaskDetailSheet. Export the sanitizer via window.PM.utils and add dompurify to package.json. Move project sub-nav definitions into AppSidebar so __('...') calls are extractable by make-pot, wrap nav labels with __(), and use useCallback/useMemo where appropriate. In TopBar, introduce a BREADCRUMB_LABELS map (useMemo) to provide translatable breadcrumb labels and use those when building crumbs; also add a try/catch around Headway.toggle for resilience.
* Sanitize HTML in task list and comments
Import sanitizeHtml and apply it to HTML rendered via dangerouslySetInnerHTML in SingleTaskListPage.jsx. This updates currentList.description and comment.content to be sanitized before rendering to reduce XSS risk and ensure safer HTML output.
* Reset .wp-die-message paragraph margins
Add CSS to suppress WordPress .wp-die-message paragraph default margins. Inserts .wp-die-message p and p.wp-die-message { margin: 0 !important; } (with a comment) into views/assets/src/tailwind.css to prevent WP die message paragraphs from affecting layout.
* Adjust padding for task description
Tighten spacing in TaskDetailSheet.jsx by changing the Description container padding from px-6 py-4 to px-5 py-2. This reduces horizontal and vertical spacing to better match surrounding components and visual design.
* Sanitize list titles and add icon buttons
Replace text 'Save'/'Cancel' buttons with compact icon buttons (Check and X) and updated styling for rename actions. Import the X icon and the sanitizeHtml helper, and render list.title via dangerouslySetInnerHTML using sanitizeHtml to allow safe HTML in titles and prevent XSS.
* Modularize components into index/parts files
Split several large component files into smaller, organized modules (index, parts, constants, utils). Examples: InvoiceSettingsTab was broken out into index.jsx, constants.js and parts/ColorPicker.jsx (with the original file now re-exporting the new index); MyTasksPage, ActivitiesPage, AiCreateDialog, DiscussionsPage, FilesPage, MilestonesPage, ProjectsPage and TaskDetailSheet were similarly refactored with new subfolders and supporting parts/constants/utils files. Top-level component files now re-export the new module entry points to preserve imports. This improves maintainability, readability and makes individual pieces easier to test and evolve.
* Add Playwright E2E test suite scaffold
Add a complete Playwright + pnpm end-to-end test scaffold for the weDevs Project Manager (Free) plugin. Introduces tests/e2e-playwright with config files, package.json, tsconfig, lint/format configs, .env-example, PLAN/README, feature map, page objects (POM), test specs, utilities (summary, API helpers, spec fail-fast), and uploaded fixtures. Also add built frontend assets under views/assets/dist (pm.css, pm-rtl.css, pm.js, pm.asset.php). This provides an out-of-the-box e2e testing setup (serial, parallel and sharded runs) and documentation for running and extending the suite.
* Add milestone selection UI & attach/detach logic
Add interactive milestone assignment to tasks in both the task detail sheet and the new-task form. MilestoneField: fetches project milestones (including task and task_list relations), determines the current milestone by checking direct task membership then task_list membership, and provides a dropdown to assign/remove milestones with outside-click handling, saving state, toast feedback, and attach/detach API calls. TaskListSection: fetches milestones for the new-task form, adds a milestone select control, attaches the selected milestone to the created task, and resets the selection on form reset. Small refactors include using taskId for loading logic and added UI icons.
* Refactor MilestoneField dropdown and buttons
Restructure MilestoneField UI and event handling: moved dropdownRef into the inner control wrapper, consolidated the primary milestone button to show title/chevron and saving state, and separated the remove action. Adjusted conditional rendering for the remove button and dropdown list, fixed onClick handlers (stopPropagation for remove, correct selection callbacks), preserved keys for milestone items, and corrected the ordering/visibility of the 'None' option and milestone items. Overall this cleans up interactions, hover/disabled styles, and the open/save UX.
* TaskEstimationField: add Pro gate & slot override
Refactor TaskEstimationField to gate estimation UI behind Pro licensing and a slot override. Adds an EstimationTeaser (ProGate + ProBadge) for non-Pro users, uses usePermissions and useFilter('task.estimation.field') to allow custom overrides, and returns null for Pro users when the Time_Tracker module/UI is not active. Removes the previous inline editing UI, popover, local state and API save/clear logic (these responsibilities are now handled elsewhere or via overrides). This change simplifies the component and exposes an extension point for custom estimation UI.
* Add ColorPicker, TaskLabelBadges, and pro hooks
Introduce a reusable ColorPicker UI component and color preset library, and export it via window.PM. Replace the invoice settings inline picker with the shared ColorPicker. Add TaskLabelBadges component (uses a 'task.row.labels' filter) and update TaskRow/MyTaskRow to render labels via this pluggable component so pro-only label rendering is isolated. Add useActiveProModules hook plus helpers (isProModuleActive, isProPluginInstalled) and switch AppSidebar/ProjectSubNavBar to use these helpers to centralize pro-module detection logic.
* Validate and coerce title/description strings
Coerce title and description to strings before calling .trim() to avoid runtime errors when values are null or non-string. Use titleStr/descStr for payload construction, update input value bindings to String(title || '') and String(description || ''), and normalize onChange handlers (including RichTextEditor) to always set string values. Also adjust title error clearing to guard against non-string input.
* Normalize description/content handling in editors
Make RichTextEditor and ProjectCreateSheet handle description/content values robustly. RichTextEditor now coerces content to a string before comparing/setting and includes the editor in the effect dependencies to avoid stale updates. ProjectCreateSheet extracts a string description whether the source is an object (with a content field) or a plain string, and ensures onChange always receives a string. These changes prevent runtime errors and stale editor state when content is null, non-string, or received as an object.
* Sanitize content handling and avoid String()
RichTextEditor: Simplify sync effect to only set editor content when the incoming content differs from editor.getHTML(), and remove unnecessary String() coercion and the editor dependency to avoid redundant updates. ProjectCreateSheet: Prevent coercing description objects with String() (which yields "[object Object]"); extract description.content when present and ensure setDescription always receives a string (fallback to ''). These changes avoid accidental "[object Object]" values and make content handling safer.
* Project-aware permissions + useCurrentProject
Introduce a project-aware permissions layer and a shared useCurrentProject hook. Added views/assets/src/hooks/useCurrentProject.js to fetch/cache project data (with inflight deduplication and listeners). Reworked usePermissions to expose project-aware helpers (userCan, isManager, currentUserId, canEditTask, canEditComment, canCompleteTask) and related pm* helpers. Updated multiple components (DiscussionsPage, FilesPage, MilestonesPage, MilestoneCard, TaskDetailSheet, TaskListSection, TaskListsPage, TaskRow) to use useCurrentProject and the new permission helpers to conditionally show/hide UI actions (create/edit/delete/move/duplicate/privacy toggles, comment edits, etc.). Also added free-tier pro preview menu items and inbox list detection in task lists. These changes centralize permission logic and avoid redundant project fetches while enforcing per-project access rules in the UI.
* Integrate task sheet with milestones & UI tweaks
Add TaskDetailSheet to MilestonesPage and refetch milestones when the task sheet closes. Track per-milestone expanded state (expandedIds) with toggle and ensure helpers, pass expanded/onToggleExpanded/onTaskOpen props into MilestoneCard, and render TaskDetailSheet in the page. Update MilestoneCard to use the passed expanded state (remove local state), open the task sheet via openTaskSheet when a task title is clicked, and ensure the milestone is expanded when opening a task. Also adjust keyboard focus styles in tailwind.css to use :focus-visible and suppress non-keyboard focus outlines.
* Improve accessibility and layout in task views
Replace focus:outline-none/focus:ring classes with focus-visible equivalents across date inputs and select controls to improve keyboard accessibility. Add truncation (max-w and truncate) and title attributes to long table cells and the task SheetTitle so long titles don't overflow and full text is visible on hover. Make ImportTasksDialog content scrollable with a constrained max-height and keep the dialog footer fixed (shrink-0) to improve dialog UX. Minor related UI tweaks across MyTasksPage, ImportTasksDialog, TaskDetailSheet, and TaskListSection for better usability and layout.
* Always show Activities in Pro subnav
Remove the isActive('Activities') check so the Activities item is always included in the Pro project sub-navigation. Activities is not a module, so it should be displayed whenever Pro is active. Updated AppSidebar.jsx accordingly.
* Handle activity links and track task sheet edits
Add unified activity link resolver and make activity messages/actors navigable or open task sheets. Introduce views/assets/src/lib/activity-links.js (resolveActivityUrl/getUserProfileUrl) and wire it into MyTasksPage, ActivitiesPage, TaskDetailSheet, ProgressPage, and MilestonesPage to either navigate to the related resource or open the task sheet. Add taskModifiedInSheet flag to tasksSlice (reset on open, set on update/status change) and use it to only refetch lists when the sheet actually modified a task. Also trim actor names from parsed activity messages for clearer display.
* Remove pmglobal hooks and enhance MyTasks UI
Remove legacy pmglobal script/style registrations and related admin hooks/methods from Frontend (project switch, toolbar search/new-task handlers) and config (scripts.php, style.php). Update MyTasksPage (React) to initialize default date range, introduce appliedFilterDates to control when overview API calls run, revamp the activity filter UI, and improve calendar layout, controls and event interactions for a cleaner, more interactive UX.
* Fix AI models cache, UI, accessibility, and utils
Multiple fixes and improvements across frontend and a backend config:
- Settings/AI: If models cache is empty/expired, synchronously update cache so the first response includes providers.
- Notion settings: Mask stored access token and use password input for token field to avoid exposing secrets.
- AppSidebar: Paginate and aggregate project list (per_page=100) with cancellation, auto-collapse sidebar on landing full-width pages, restore state on navigation, add '/importtools' mapping.
- MyTasksPage: Include calDaysInMonth in effect deps, update task item background to use card color.
- MilestoneCard: Handle milestone.description being either string or object, render description safely, and add aria-label to actions button.
- ProjectsPage: Clear search timer on unmount and add keyboard (Enter/Space) handlers to make project titles clickable via keyboard for accessibility.
- ProjectsPage utils: Use DOMParser in stripHtml and correctly handle string/object descriptions in getDescriptionSnippet.
Overall these changes improve data consistency, security (token masking), accessibility, and robustness of HTML parsing and UI behavior.
* Use spinner and optimistic privacy update
Replace skeleton placeholders with a centered Loader2 spinner when task is loading and no currentTask. Update TaskPrivacyField to optimistically update the current task meta (privacy) locally via a new updateCurrentTaskMeta action instead of refetching the task; revert local state on API error. Remove the taskLoading selector and conditional rendering for privacy. Add updateCurrentTaskMeta reducer to tasksSlice and export the action.
* Use unified Avatar helper & React UserAvatar
Add a centralized Avatar helper and replace scattered avatar logic across backend and frontend. Introduces src/User/Helper/Avatar.php that resolves user id/email/object, checks for local plugin avatars (simple_local_avatar, wp_user_avatars, wp_user_avatar), falls back to Gravatar, and exposes a filter (wedevs_pm_user_avatar_url). Replace direct get_avatar_url calls with Avatar::get_url in controllers, helpers and transformers. Add a new frontend component views/assets/src/components/common/UserAvatar.jsx and swap existing Avatar/AvatarImage/AvatarFallback usages across many React components to standardize rendering, initials fallback and sizing; register UserAvatar on window.PM.c…
Add a new v4.0.0 changelog section (May 7, 2026) to readme.txt documenting the major release: redesigned admin/frontend UI, sidebar navigation, right-side task panel, improved state management, enhanced editor, project duplication, AI project creation, shortcode support, grid/list toggles, and other UX features. Also lists numerous improvements (WordPress integration, design system, task/project views, My Tasks dashboard, pagination, file navigation, settings, filtering, activity feed, responsive spacing) and fixes (security for content, confirmation prompts, Pro integration, frontend shortcodes, sidebar activities). This documents the notable user-facing changes and bug fixes for the v4.0.0 release.
Move POT generation into the CI job after PHP is set up (adds tools: wp-cli) and add a dedicated pnpm makepot script to package.json. Replace the previous multi-step composer install/update/dump-autoload sequence with a single production-ready command (composer install --no-dev --optimize-autoloader) to simplify and speed up the build.
Update GitHub Actions workflow to perform real WordPress plugin deployments by setting the 10up/action-wordpress-plugin-deploy input dry-run to false. This enables publishing to SVN using the existing SVN_USERNAME and SVN_PASSWORD secrets; ensure those secrets are configured correctly before merging.
…fficial#593) * Fix React i18n: replace useI18n wrapper with @wordpress/i18n, wire wp_set_script_translations, regenerate translations Refactor all React components to import __ directly from @wordpress/i18n instead of the custom useI18n hook so wp i18n make-pot can statically extract strings. Add wp_set_script_translations() to enqueue, so WP loads JSON translations for the bundled script. Build pipeline now generates POT, builds an i18n source map from webpack output, and emits per-locale JSON keyed by bundle path. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Validate sourcemap shape in build-i18n-map.mjs Read/parse failures and missing "sources" array now exit with a descriptive message pointing at the sourcemap path, instead of throwing a generic exception. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Strip fuzzy entries from translation catalogs msgmerge auto-flagged many entries as fuzzy when merging older catalogs with the regenerated POT. Fuzzy translations leaked into the JSON catalogs and produced wrong UI strings (e.g. "Move Task" → "Nouvelle tâche"). Run msgattrib --no-fuzzy on every PO before recompiling MO and regenerating JSON so WP falls back to the original English instead of an incorrect translation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Fix React i18n pipeline and add full Bengali translation - Bootstrap setLocaleData() from PM_Vars.language JED data at app init - Wrap ACTION_LABELS, DAYS, MONTHS at definition for static pot extraction - Remove build-i18n-map.mjs and stale JSON translation files - Update deploy workflow: generate POT after build step - Add Bengali translation: 1726 strings translated via OpenAI * Add .claude agent configs and docs Introduce a comprehensive .claude directory with agent definitions, commands, rules, skills, and settings for developer-facing assistants. Adds new agents (e.g. code-reviewer, security-auditor), many command and rule markdowns, skill descriptions, CLAUDE.md and CLAUDE.local.md.example. Update backend-dev and frontend-dev agent docs to reflect updated stack, routing/permission patterns, Fractal/Eloquent conventions, and Free/Pro frontend bridge; also adjust related guidance and checklists. Update .gitignore to include the new files. * Update translation * ignore claude directory from production build * try dry mode * update with memo cache --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Iftakharul Islam Ifat <88052038+iftakharul-islam@users.noreply.github.com>
Add CLAUDE.md, CLAUDE.local.md, CLAUDE.local.md.example, .npmrc, .nvmrc, and .env.example to .distignore so they stop leaking into the wp.org build zip via 10up/action-wordpress-plugin-build-zip. Surfaced after v4.0.1 deploy where these files appeared in the published SVN tag.
Add a new Claude skill file documenting the 'wepm-release' workflow for releasing wedevs-project-manager (free) via GitHub Actions. The document (/.claude/skills/wepm-release/SKILL.md) includes TL;DR usage, CLI flags, preflight checks, detailed agent flow for auto-generating changelogs, step-by-step release/build/tag/push instructions, examples (including dry-run and fork testing), troubleshooting, required secrets, and file locations.
…ore-claude-env Chore/distignore claude env
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Tip 💬 Introducing Slack Agent: The best way for teams to turn conversations into code.Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.
Built for teams:
One agent for your entire SDLC. Right inside Slack. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
2277bc7 to
b543d83
Compare
447c234 to
0e4412f
Compare
What changed
README optimized with Gingiris README Generator