Repository navigation
fix: four dead ends from the 18.2.0 browser pass (#2338 items 1-4) - #2346
Merged
Merged
Conversation
…g, bind the marketing set to its leaders, drop the toolbar Update Stage (#2338 items 1-4) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J8VVAk32RuJpqjMZ6Lqc7k
…for users Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J8VVAk32RuJpqjMZ6Lqc7k
…n bar (#2338 item 4) Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J8VVAk32RuJpqjMZ6Lqc7k
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
…em 4) Any authored bulk entry hides the console's default bulk Delete, so the Update Stage defs left the six opportunity grid lists without it (Open Deals already lacked it). The shared constant becomes GRID_BAR and carries an explicit operation: 'delete' def, modelled on all_accounts, with its labels in the zh-CN, es-ES and ja-JP packs. The selection-bar pin now requires the delete def too; ablating it turned the pin red. The mass_update_stage comment no longer claims that list views inherit the def. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J8VVAk32RuJpqjMZ6Lqc7k
Contributor
Author
席位核对Verdict: ACCEPT ·
Generated by Claude Code |
This was referenced Oct 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Irene · project thread
Part of #2338 (items 1–4)
Clause-②: no
Metadata-protocol: none
Items 5–13 of the list card stay open for later orders. Dispatch order 6450948994, claim 6451041709. Implemented by session
session_01J8VVAk32RuJpqjMZ6Lqc7k.维护者速读
src/sales/sharing/positions.ts(两个岗位新增权限集,权限面最大);src/sales/views/opportunity.view.ts(五个视图的勾选栏与默认删除的取舍);src/service/views/case.view.ts(解决方案字段的 visibleWhen)。What changes
Item 1: dashboards offered to personas who cannot read them
nav_service_dashboardnow carriesCASE_READ_AUDIENCE(case read, and not a sales rep), the gate the three case reports already carried, renamed fromCASE_REPORT_AUDIENCE(src/service/index.ts). The console prunes object entries by read access but not dashboard entries, so a marketing user, who reads no cases, was offered Service Overview beside no Cases and no My Cases.marketing_userposition): Service Overview drew 14 tiles reading "You don't have permission to view the data behind this widget", one 403POST /api/v1/analytics/dataset/queryeach. After: the entry is gone from that user's sidebar; Knowledge stays (screenshots03-after-mkt-sidebar.png).crm_user, so all 13 tiles answer 200 for the marketing user; the zeros and "No data yet" are their own activity, not a refusal. A read gate would hide it from no one. This is the order's mechanism assumption measured false for that entry, reported rather than worked around.forecast_metrics; the set grants nocrm_forecast), not the 2 the card estimated. Hiding the whole dashboard for one tile would repeat neither house precedent (Sales Activity and Customer Churn Signals are both kept open for a single refused panel). No tile-level read gate exists on 18.2.0: a widget'srequiresObjectis filtered against the served object list (DashboardViewin the console), and/api/v1/meta/objectserves all 99 objects,crm_forecastincluded, to the marketing user; a widget takes novisible. That is a platform finding, in the report. The reasoning is recorded beside the audiences insrc/sales/apps/crm.app.ts.Item 2: Edit Case offers Closed but no Resolution
src/service/views/case.view.ts) offersresolutionright under Status, gated byhas(record.status) && (record.status == "resolved" || record.status == "closed")(TOTAL, per the house rule). It is notrequiredon the form:resolution_required_for_closedasks for it onclosedonly.new, so the field stays off it.status: closedwith the resolution stored; the New Case dialog shows no Resolution (04–07).Item 3: Marketing Manager and Director cannot edit live campaigns
permissionSets: ['marketing_user'](src/sales/sharing/positions.ts). An existing set, not a new one: a rung that leads the marketers does their work, enrolling members and tracking responses included.crm_useralone tocrm_user+marketing_user):crm_campaigncreate + edit + view all;crm_campaign_membercreate + read + edit;crm_leadcreate + edit + view all + export;crm_contactcreate + edit + view all + export;crm_accountandcrm_opportunityview all + export (private deals held back by the set's row filter);crm_article_feedbackcreate/read/edit,crm_knowledge_articleread;sys_attachment,sys_comment,sys_activityas the set declares; field rulescrm_opportunity.amountandcrm_account.health_scoreread-only; the set's three row-level policies (private-deal filter, campaign and member update widening).crm_user+member_defaultonly, campaignallowEdit: false, andPATCH /api/v1/data/crm_campaign/IDanswered 403PERMISSION_DENIEDon all seven seeded campaigns. After: both resolvemarketing_userthrough the position alone, PATCH answers 200, and the record header shows Enroll Members and Edit (08).marketing_userset alone writes every campaign, completed ones included (the write scope is org-wide), so for these rungs thecampaign_leadership_*share grants nothing beyond the set. The note insrc/marketing/sharing/campaign.sharing.tsthat the sharing layer's write-owned baseline still refuses a specialist's campaign is a 17.0.0-rc.2 measurement and no longer holds; left untouched here (outside the claimed surface) and listed in the report.Item 4: "Update Stage" in the list toolbar fails on every selection
_selectedIds(the record-id resolver in the console framework bundle refuses more than one ticked row with "select exactly one row", and with none opens the dialog over no record). So the toolbar copy cannot work on a selection on 18.2.0; it is removed (locations: [], the spec's headless spelling; the selection bar places an action by name).listview (Open Deals) carried the aggregatebulkActionDefs; named list views do not inherit it (All Opportunities' bar offered only Delete). Surface extended at the seat's word, 19:2xZ: the five other grid lists (All Opportunities, My Open Deals, Stale, Tender This Quarter, Closing This Quarter) now declare the same entry through oneGRID_BARconstant (Update Stage plus an explicit bulk Delete; see below).09–11).Tests
test/app-navigation-audience.test.ts: a marketing-user persona; Service Overview is no longer shown to them and nothing else in their sidebar moves; every other persona's sidebar is unchanged against the pre-Browser pass #2320 on 18.2.0 — HotCRM-side defects (13 items: dashboards shown to personas with no access, a dead-end case close, campaign editors who cannot edit, a toolbar action that always fails, …) — list card, split per item at dispatch #2338 gate. The A HotCRM user with no permission set lands on the Service dashboard's 6 "You don't have access" tiles — once the platform has a no-access landing, make HotCRM's app hand such a user to it (#2194 T2-U19, the HotCRM half) #2250 block's "gates alone" first entry is now the Approvals Inbox (the platform access page still preempts it).test/case-create-form-narrowing.test.ts: the create-form set is now what a NEW case shows (each entry'svisibleWhenevaluated with@objectstack/formulaon the object's defaults and on an empty record), so the removal direction still holds with Resolution on the form; a new block pins Resolution shown for resolved and closed, hidden for the other five statuses, a new case and an empty record, and not required.test/marketing-leadership-campaign-edit.test.ts(new): each rung, staffed by position alone, resolvesmarketing_user, holds campaign edit and member create, and updates a live campaign a specialist owns.test/demo-staffing.test.ts: seven declared bindings.test/bulk-action-dispatch.test.ts: every opportunity grid list carries the aggregate Update Stage def;mass_update_stagedeclares nolist_toolbar. Ablation, one-shot: removing the def fromall_opportunitiesturned the pin red (expected [ 'all_opportunities' ] to deeply equal []), restored withgit checkout HEAD,git diff HEADempty and the file's hash equal to HEAD's.Acceptance notes
GRID_BARalso carries an explicitoperation: 'delete'def modelled onall_accounts, and all six grid lists (Open Deals included) use it. The labels are in the zh-CN, es-ES and ja-JP packs, oneOPPORTUNITY_BULK_DELETEper pack under each view'sbulkActions.test/bulk-action-dispatch.test.tsrequires the delete def on every grid list, and an ablation of it turns the test red.bulkActions: ['delete']alone is refused bypnpm lint(action-name-undefined, measured).campaign.sharing.ts's 17.0.0-rc.2 write-boundary note.Verification
pnpm verify(validate, typecheck, lint, hygiene, hygiene:tokens, build, test) green on2c618e8(229 files, 4464 tests) and on4537d02(229 files, 4466 tests); and on the head577b31c, after mergingorigin/main(feat(dashboards): compare seven picker-bound KPI tiles with the previous period #2340, fix(marketing): Add to Campaign refuses a closed campaign and an opted-out person; a member holds a Lead or a Contact, not both #2343): 231 files, 4491 passed, 1 skipped,EXIT=0.issue-2338/(11 screenshots, before and after).🤖 Generated with Claude Code
https://claude.ai/code/session_01J8VVAk32RuJpqjMZ6Lqc7k