merge: sync upstream preview + worklog and custom-field fixes#9454
merge: sync upstream preview + worklog and custom-field fixes#9454mohammad425 wants to merge 8 commits into
Conversation
…trols - Work item timers (start/stop) with live elapsed in the button and browser tab title - Manual "Log work" with start/end datetime; editable worklog entries with delete confirmation - Worklogs activity tab with a per-person totals overview and per-person filter - State-gated timers: workspace default allowed states, overridable per project (admin configurable) - Active-timer banner above the title showing who is currently working on the item - Block moving an item to a completed state while a timer is running - Admins can stop any user's timer and edit/delete any worklog; members only their own - ModalCore marks its panel data-prevent-outside-click so dialogs don't close an underlying peek view Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat(worklog): time tracking with timers, worklogs, and admin controls
…and work items
Workspace admins can define typed custom fields (12 types: text, paragraph, number,
select, multi-select, boolean, radio, date, datetime, color, hyperlink, email) for
Projects and Work Items under a new Workspace Settings > Custom Fields category.
Backend:
- CustomField + CustomFieldValue models with entity_type discriminator (migration 0125/0126)
- Hard-delete values on field deletion; IDOR guard on issue values endpoint
- Endpoints: admin CRUD, active-fields (member-visible), project values, issue values
- Optimised serialisation (single many=True call instead of per-field loop)
Frontend:
- MobX store + SWR hook with shared cache key (Properties <-> Custom Fields tab sync)
- Settings management pages (Projects + Work Items) with create/edit/delete/reorder
- CustomFieldsSection: 12-column grid, required validation, default values
- Project create modal and General settings: custom fields persisted after save
- Work-item issue detail: Custom Fields tab (full editor) after Worklogs
- Properties sidebar (detail + peek): filled fields only, read-only with click-to-edit,
hover pencil icon (admin-aware), ExternalLink for hyperlinks, colour circle display
- URL/Hyperlink: { url, text } shape with display text; non-editors click to open link
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…d custom-fields features
- Add 24 missing keys to common.json (worklog/time-tracking + custom_fields)
- Add full custom_fields section to workspace-settings.json (76 keys)
- Fix 4 untranslated keys (your_profile, developer, work_structure, execution)
- Fix brand-mark violation: pi_chat value corrected to "Plane AI"
- Fix workspace_dashboards typo ("Däschbords" → "Dashboards")
- Remove spurious `few` plural form from `member` key (de CLDR: one/other only)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
At the start of each month a Celery Beat task pushes the previous month's logged hours per project into Perfex CRM as a task with an "Invoice hours" custom field, enabling client billing. Backend: - CrmIntegration (per-workspace singleton, Fernet-encrypted API key) and CrmSyncLog models + migration 0127 - Workspace-admin endpoints under /workspaces/<slug>/crm-integration/ (CRUD, test connection, manual sync, CRM field proxy, sync logs) - Shared CrmApiClient with CRM_VERIFY_SSL setting - monthly_crm_sync task (idempotent per month, per-issue hour breakdown, HTML-escaped descriptions) on Celery Beat Frontend: - New Integrations settings category with CRM Sync page (form, Test Connection, Sync Now, fetch CRM fields, sync history) - en/de translations The Perfex-side plane_api module (Bearer-auth REST endpoints, hashed API keys, request logging) lives in the CRM codebase. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat(crm): monthly worklog sync to Perfex CRM
Brings in 44 upstream commits, mostly a large batch of security fixes (IDOR/query scoping, stored XSS via SVG and comment HTML, ORM order_by/group_by injection, OAuth email verification, deactivated and bot user login, invite token disclosure), dependency bumps, and the ce/ -> core/ store/component/hook consolidation. Conflict resolution: upstream removed apps/web/ce entirely along with the @/plane-web/* path alias, so our time-tracker files moved to their core/ equivalents and every @/plane-web import was rewritten to @/. The ce IssueDetail wrapper is gone, so its worklog store and delegating methods were folded directly into core's IssueDetail. Kept our activity tab bar (which replaced upstream's activity filter dropdown) and the worklog and custom-field sidebar properties; dropped the ce-only stubs upstream deleted (WorkItemAdditionalSidebarProperties, WorkItemLayoutAdditionalProperties). Verified: web check:types clean, oxlint 0 errors, Django check clean, no migration drift. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…es, responsive tabs - Empty worklog list rendered the raw key: activity_empty_state lives at the root of common.json, not under its `common` object. Same class of bug fixed in three toasts that used common.error, which is an object, not a string. - Starting or stopping a timer only updated the active-timer maps, never the per-issue running-timer list the Worklogs overview reads, so its stop button appeared or vanished only after a tab switch or reload. Both now keep that list in sync, matching what adminStopTimer already did. - Date and datetime custom fields accepted only fixed calendar dates for earliest/latest/default, which go stale. They now also accept a value relative to today (today+30d, today-1w, ...), resolved on every render. Fixed dates are untouched, so existing fields keep working. - The activity tab bar overflowed on narrow screens. It now scrolls on its own with a thin scrollbar while the timer and log-work buttons stay pinned and collapse to icons, keeping both reachable without scrolling the page. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
|
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (115)
📝 WalkthroughWalkthroughChangesThe PR adds issue worklog and timer tracking, workspace/project custom fields, and CRM integration with scheduled monthly synchronization. It updates API models, routes, serializers, web stores/services/components, shared types/constants, settings navigation, translations, and local development configuration. Worklog and timer tracking
Custom fields
CRM synchronization
Estimated code review effort: 5 (Critical) | ~120 minutes Possibly related PRs
Suggested labels: Suggested reviewers: ✨ Finishing Touches🧪 Generate unit tests (beta)
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 Checkov (3.3.8)apps/api/Dockerfile.devTraceback (most recent call last): docker-compose-local.ymlTraceback (most recent call last): packages/i18n/src/locales/de/common.jsonTraceback (most recent call last):
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 |
|
Opened by mistake against upstream — this targets our fork. Closing. |
Description
Merges 44 upstream commits from
makeplane/planeinto the fork, and fixes four bugs found while verifying the result.Upstream merge — the bulk is a large batch of security fixes (IDOR/query scoping, stored XSS via SVG attachments and comment HTML, ORM
order_by/group_byinjection, OAuth email verification, deactivated/bot login, invite token disclosure), plus dependency bumps and ace/→core/consolidation.That consolidation was the hard part: upstream deleted
apps/web/ceentirely along with the@/plane-web/*path alias, and our time-tracker feature lived there. Resolution:core/components/issues/worklog/, and every@/plane-web/...import was rewritten to@/....ceIssueDetailwrapper (which added the worklog store to core's) no longer exists, so its store and delegating methods were folded directly intocore/store/issue/issue-details/root.store.ts.ce-only stubs upstream deleted (WorkItemAdditionalSidebarProperties,WorkItemLayoutAdditionalProperties).Bug fixes
common.activity_empty_state.no_worklogs.activity_empty_statesits at the root ofcommon.json, not under itscommonobject. The same class of bug affected three toasts callingt("common.error"), which resolves to an object rather than a string.today+30d,today-1w, …), resolved on every render. Fixed dates pass through untouched, so existing fields are unaffected.adminStopTimeralready did.Type of Change
Screenshots and Media (if applicable)
Activity tab bar at 420px — tabs scroll horizontally with a thin scrollbar; the start-timer and log-work buttons collapse to icons and stay in view.
Test Scenarios
Verified in the browser against the running app:
All / Activity / Comments / Worklogs / Custom Fieldstabs and the Log work button;/worklogs/,/timer/,/active-timers/and/custom-field-values/all return 200, which exercises the store methods relocated out ofce. CRM Sync settings page still loads and Test Connection succeeds.settings.max = "today+30d"; on the work item the native input renderedmax="2026-08-20"against a system date of 2026-07-21.Also clean: web
check:types, oxlint (0 errors), Djangomanage.py check, and no migration drift. All test data created during verification was removed.References
Upstream:
makeplane/plane@7cef741c2and the 43 commits before it onpreview.🤖 Generated with Claude Code
Summary by CodeRabbit