Skip to content

[cueweb] Job Management actions: min/max cores, batch confirmation, unbook (#2281, #2283, #2288)#2405

Open
ttpss930141011 wants to merge 4 commits into
AcademySoftwareFoundation:masterfrom
ttpss930141011:cueweb-job-management-actions
Open

[cueweb] Job Management actions: min/max cores, batch confirmation, unbook (#2281, #2283, #2288)#2405
ttpss930141011 wants to merge 4 commits into
AcademySoftwareFoundation:masterfrom
ttpss930141011:cueweb-job-management-actions

Conversation

@ttpss930141011

@ttpss930141011 ttpss930141011 commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Related Issues

#2281
#2283
#2288

Summarize your change.

Bundles three CueWeb Job Management actions into one PR, following the same
pattern as the host-actions work (#2397): context-menu / toolbar handler →
app/utils/action_utils.ts helper → app/api/.../route.ts proxy → REST gateway.
Each ports the corresponding CueGUI behavior onto the Monitor Jobs page.

Set min/max cores (#2281)

  • New "Set Min/Max Cores…" row action: one dialog, two number inputs (Min / Max),
    range 0–50000, pre-filled with the job's current values.
  • Client-side min ≤ max validation disables Apply and shows an inline error.
  • Apply sends both SetMinCores and SetMaxCores (the issue's "both updated
    atomically"), with one success toast.
  • New routes app/api/job/action/setmincores|setmaxcores/route.ts; helper setJobCores.
  • CueGUI's RequestCoresDialog is an email/SMTP composer — this builds the real
    SetMinCores / SetMaxCores RPCs instead.

Multi-job batch confirmation (#2283)

  • Toolbar bulk actions now confirm before acting, listing the affected job names
    (reuses components/ui/confirm-dialog.tsx).
  • Confirmation policy mirrors CueGUI: kill / eat / retry always confirm;
    pause / unpause confirm only when ≥2 jobs are selected. Destructive actions use
    destructive styling + CueGUI's kill warning text. Cancel dispatches no RPC.
  • Implemented in app/jobs/data-table.tsx (no new API routes).

Unbook job (#2288)

  • New "Unbook…" row action: a dialog that unbooks every proc the job holds, with an
    optional "Kill unbooked frames?" checkbox that adds a second kill-confirmation step
    (mirroring CueGUI's KillConfirmationDialog).
  • CueWeb's first proc route: app/api/proc/action/unbook/route.ts
    ProcInterface.UnbookProcs, body { r: { jobs: [...] }, kill }. Helper unbookJob.
  • Gateway-path note: the REST path is /host.ProcInterface/UnbookProcs (host.proto
    declares package host;, so grpc-gateway uses host. as the prefix), verified
    against a running rest-gateway.

Documentation

  • User guide: new Job-action subsections (set min/max cores, batch operation
    confirmation, unbook) under the Monitor Jobs / Cuetopia section, each with screenshots.
  • Developer guide: document the new job/proc RPCs, the /api/job/action/... and
    /api/proc/action/... proxy routes, the cueweb:cores-changed event
    contract, and the batch confirmation policy.

Tests

  • Jest coverage for the new action_utils helpers and the new routes.
  • Manual end-to-end smoke test against a local dockerized cuebot + rest-gateway: every
    dialog exercised (cores + min ≤ max guard, batch pause/kill confirmations with the
    job list, unbook + optional kill); UnbookProcs returns the expected proc count.
  • npm run lint and tsc --noEmit clean.

LLM usage disclosure

Claude (Opus) was used to explore the existing CueGUI patterns, draft unit tests and the
PR request, and write the documentation.

Summary by CodeRabbit

  • New Features

    • Added "Set Min/Max Cores..." context menu action to adjust job core allocation with real-time table updates.
    • Added "Unbook..." context menu action to unbook job processes with optional "Kill unbooked frames?" confirmation.
    • Added confirmation dialogs for bulk job operations (Kill/Eat/Retry/Pause/Unpause) when multiple jobs are selected.
  • Documentation

    • Updated developer and user guides with new job management operations.

User guide: add Set Min/Max Cores, Unbook, and multi-job batch confirmation subsections under Job Management Operations, each with light + dark screenshots. Developer guide: document the new job/proc RPCs, the /api/job/action and /api/proc/action proxy routes, the cueweb:cores-changed optimistic-update contract, and the batch confirmation policy.
@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

This PR implements three interconnected job management features for CueWeb: setting job min/max cores through a dedicated dialog, unbooking procs with optional kill confirmation, and adding confirmation gates to multi-job toolbar operations. The backend exposes three REST routes that proxy to the OpenCue gateway; frontend dialogs drive user interactions via CustomEvents and dispatch success events for table patching or refresh. A new bulk operation flow in the Jobs dashboard toolbar gates destructive and multi-select actions with confirmation dialogs listing affected job names.

Changes

Job Management Operations Feature

Layer / File(s) Summary
Backend API Routes
cueweb/app/api/job/action/setmincores/route.ts, cueweb/app/api/job/action/setmaxcores/route.ts, cueweb/app/api/proc/action/unbook/route.ts
Three POST handlers validate method, JSON, and request body shape ({ job, val } for cores with 0–50000 range; { r, kill } for unbook), forward to the OpenCue gateway via handleRoute, and return upstream data or error mappings with appropriate HTTP status.
Action Utilities and Helpers
cueweb/app/utils/action_utils.ts
setJobCores(job, minCores, maxCores) performs two sequential RPC calls (min then max) and toasts success only if both succeed; unbookJob(job, kill) posts to the unbook endpoint with kill-dependent messaging; setCoresGivenRow and unbookGivenRow dispatch CustomEvents from context-menu rows to open dialogs.
Dialog Components
cueweb/components/ui/set-cores-dialog.tsx, cueweb/components/ui/unbook-dialog.tsx
SetCoresDialog opens via cueweb:open-set-cores, prefills and clamps core values (0–50000), validates min ≤ max, and dispatches cueweb:cores-changed on success for optimistic table patching. UnbookDialog opens via cueweb:open-unbook, manages optional kill checkbox with two-phase confirmation, dispatches cueweb:refresh-now on success, and disables inputs during submission.
Context Menu Integration
cueweb/components/ui/context_menus/action-context-menu.tsx
Adds "Set Min/Max Cores..." as an editable gated menu item and replaces the stubbed "Unbook" entry with a wired destructive action, both calling their respective CustomEvent dispatchers.
Data Table Integration and Bulk Operations
cueweb/app/jobs/data-table.tsx
Mounts both dialogs; implements runBulkAction() that filters FINISHED jobs, applies per-action confirmation policy (always confirm destructive; pause/unpause only on multi-select), renders job-name list in ConfirmDialog, wires toolbar Eat/Retry/Kill/Pause/Unpause to confirmation gate, and adds cueweb:cores-changed listener for real-time core patching.
Unit Tests
cueweb/app/__tests__/api/utils/set-cores.test.ts, cueweb/app/__tests__/api/utils/unbook.test.ts
Test setJobCores sequential RPC behavior, stop-on-first-failure, and toast validation; test unbookJob endpoint routing, kill flag, and success/failure returns.
Documentation
docs/_docs/developer-guide/cueweb-development.md, docs/_docs/user-guides/cueweb-user-guide.md
Developer guide describes CustomEvent wiring, REST validation bounds, sequential min/max behavior, and bulk confirmation policies; user guide documents dialog inputs, kill confirmation flow, and toolbar action confirmation behavior.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

  • OpenCue#2281: This PR directly implements the job min/max cores dialog and backing API, resolving the feature request for setting job core constraints through CueWeb.

Suggested reviewers

  • ramonfigueiredo
  • DiegoTavares
  • lithorus

Poem

🐰 A rabbit hops through the cores so bright,
Setting min and max with all its might,
Dialogs bloom where procs take flight,
Bulk confirmations guard the night,
Unbooking frames—what a delight! 🌟

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 44.44% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title comprehensively summarizes the main changes: min/max cores, batch confirmation, and unbook actions across three related features, directly matching the PR objectives.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@ttpss930141011

Copy link
Copy Markdown
Contributor Author

Screenshots

Rendered from the screenshots committed in this PR (docs/assets/images/cueweb/), light and dark.

Set Min/Max Cores

Light Dark
Context-menu entry menu menu dark
Dialog — min ≤ max guard dialog dialog dark
Success toast toast toast dark

Multi-job batch confirmation

Light Dark
Pause 3 jobs — affected-job list batch batch dark

Unbook

Light Dark
Context-menu entry unbook menu unbook menu dark
Dialog — "Kill unbooked frames?" unbook dialog unbook dialog dark
Kill confirmation unbook kill unbook kill dark

@ttpss930141011

Copy link
Copy Markdown
Contributor Author

Hi @ramonfigueiredo! I’ve spent some time adding mock data and testing this out, but before marking the PR ready for review, I’d like to double-check the scope for Unbook #2288.

For reference, CueGUI’s cuegui/cuegui/UnbookDialog.py also exposes a few extra options:

cuegui-unbook-dialog

I didn’t include allocation selection, an unbook amount limit, memory/runtime filters, or redirect-to-job/group for now, since they seemed to be outside the scope of the issue description.

I looked into it a bit more, and it seems like none of those options should require backend work. The first three already map to existing ProcSearchCriteria fields, and the redirect option looks like it maps to the existing UnbookToGroup / UnbookToJob RPCs:

message ProcSearchCriteria {
// An array of host names to match.
repeated string hosts = 1;
// An array of job names to match.
repeated string jobs = 2;
// An array of layer names to match.
repeated string layers = 3;
// An array of show names to match.
repeated string shows = 4;
// An array of allocation names to match.
repeated string allocs = 5;
// A range of memory usage. Values are in KB.
repeated criterion.InRangeIntegerSearchCriterion memory_range = 6;
// Less than memory usage. Values are in KB.
repeated criterion.GreaterThanIntegerSearchCriterion memory_greater_than = 10;
// Greater than memory usage. Values are in KB.
repeated criterion.GreaterThanIntegerSearchCriterion memory_less_than = 11;
// A duration range. Values are in seconds.
repeated criterion.InRangeIntegerSearchCriterion duration_range = 7;
//The maximum number of results.
repeated int32 max_results = 8;
//The offset of the first result.
int32 first_result = 9;
}

So I think it's gonna be as frontend only follow up.

Does the scope of the PR match what you had in mind for #2288, or would you prefer to include any of those options in this PR instead?

@ramonfigueiredo

Copy link
Copy Markdown
Collaborator

Hi @ramonfigueiredo! I’ve spent some time adding mock data and testing this out, but before marking the PR ready for review, I’d like to double-check the scope for Unbook #2288.

For reference, CueGUI’s cuegui/cuegui/UnbookDialog.py also exposes a few extra options:

cuegui-unbook-dialog

I didn’t include allocation selection, an unbook amount limit, memory/runtime filters, or redirect-to-job/group for now, since they seemed to be outside the scope of the issue description.

I looked into it a bit more, and it seems like none of those options should require backend work. The first three already map to existing ProcSearchCriteria fields, and the redirect option looks like it maps to the existing UnbookToGroup / UnbookToJob RPCs:

message ProcSearchCriteria {
// An array of host names to match.
repeated string hosts = 1;
// An array of job names to match.
repeated string jobs = 2;
// An array of layer names to match.
repeated string layers = 3;
// An array of show names to match.
repeated string shows = 4;
// An array of allocation names to match.
repeated string allocs = 5;
// A range of memory usage. Values are in KB.
repeated criterion.InRangeIntegerSearchCriterion memory_range = 6;
// Less than memory usage. Values are in KB.
repeated criterion.GreaterThanIntegerSearchCriterion memory_greater_than = 10;
// Greater than memory usage. Values are in KB.
repeated criterion.GreaterThanIntegerSearchCriterion memory_less_than = 11;
// A duration range. Values are in seconds.
repeated criterion.InRangeIntegerSearchCriterion duration_range = 7;
//The maximum number of results.
repeated int32 max_results = 8;
//The offset of the first result.
int32 first_result = 9;
}

So I think it's gonna be as frontend only follow up.

Does the scope of the PR match what you had in mind for #2288, or would you prefer to include any of those options in this PR instead?

Hi @ttpss930141011 ! Thanks for digging into this and for testing with mock data.

Yes, the current scope matches what I had in mind for #2288. My intention for this issue was to bring the existing unbook functionality to CueWeb with the core options, not necessarily to achieve full feature parity with CueGUI in the same PR.

I agree with your assessment that allocation selection, amount limits, memory/runtime filters, and redirect-to-job/group appear to be frontend-only enhancements, since they already map to existing ProcSearchCriteria fields and the existing UnbookToGroup / UnbookToJob RPCs. Those would make good follow-up improvements and can be tackled separately.

So I'd prefer to keep this PR focused and avoid expanding the scope. Once this lands, we can open additional issues (or a single parity issue) for the remaining options.

Thanks again for investigating this and confirming the backend support.

@ramonfigueiredo

Copy link
Copy Markdown
Collaborator

Excellent job, @ttpss930141011 !

I will review your PR soon.

Once it is ready for review, please change the status to Open

Thanks

@ttpss930141011 ttpss930141011 marked this pull request as ready for review June 11, 2026 05:31

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (5)
cueweb/app/__tests__/api/utils/set-cores.test.ts (1)

21-31: 💤 Low value

Remove unused mocks.

The mocks for getJobForLayer (lines 29-31) and toastWarning (line 26) are not used by setJobCores or any of the tests. Removing them would improve maintainability by reducing noise in the test setup.

♻️ Simplify mock setup
 jest.mock('`@/app/utils/notify_utils`', () => ({
   toastSuccess: jest.fn(),
-  toastWarning: jest.fn(),
   handleError: jest.fn(),
 }));
-jest.mock('`@/app/utils/get_utils`', () => ({
-  getJobForLayer: jest.fn(),
-}));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cueweb/app/__tests__/api/utils/set-cores.test.ts` around lines 21 - 31, The
test file registers unused mocks for getJobForLayer and toastWarning which
aren’t used by the setJobCores tests; remove the unused mock entries from the
jest.mock calls (delete getJobForLayer from the '`@/app/utils/get_utils`' mock and
remove toastWarning from the '`@/app/utils/notify_utils`' mock) so only
accessActionApi, toastSuccess, and handleError remain mocked for clarity and
maintainability.
cueweb/app/__tests__/api/utils/unbook.test.ts (1)

20-30: 💤 Low value

Remove unused mocks.

The mocks for getJobForLayer (lines 28-30) and toastWarning (line 25) are not used by unbookJob or any of the tests. Removing them would improve maintainability.

♻️ Simplify mock setup
 jest.mock('`@/app/utils/notify_utils`', () => ({
   toastSuccess: jest.fn(),
-  toastWarning: jest.fn(),
   handleError: jest.fn(),
 }));
-jest.mock('`@/app/utils/get_utils`', () => ({
-  getJobForLayer: jest.fn(),
-}));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cueweb/app/__tests__/api/utils/unbook.test.ts` around lines 20 - 30, Remove
the unused mocks from the test setup: delete the jest.mock entry that stubs
getJobForLayer and remove toastWarning from the notify_utils mock since neither
getJobForLayer nor toastWarning are referenced by unbookJob or its tests; keep
accessActionApi, toastSuccess, and handleError mocks intact so unbookJob-related
behavior remains covered.
cueweb/app/api/job/action/setmaxcores/route.ts (1)

22-25: 💤 Low value

Optional: method guard is redundant in Next.js 15 route handlers.

Next.js route handlers are method-specific by export name. The method !== 'POST' check on line 23 will never trigger for a POST function export. Consider removing lines 22-25 to simplify.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cueweb/app/api/job/action/setmaxcores/route.ts` around lines 22 - 25, Remove
the redundant HTTP method guard in the route handler: since this file is a
Next.js route exporting a POST handler (exported POST function), delete the
block that reads the request.method and returns a 405 when not 'POST' (the if
(method !== 'POST') { ... } block). Keep the rest of the POST handler logic
intact and rely on Next.js to dispatch only POST requests to the exported POST
function.
cueweb/app/api/proc/action/unbook/route.ts (1)

30-33: 💤 Low value

Optional: method guard is redundant in Next.js 15 route handlers.

The method !== 'POST' check on line 31 will never trigger for a POST function export. Consider removing lines 30-33 for consistency with the framework's method-specific routing.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cueweb/app/api/proc/action/unbook/route.ts` around lines 30 - 33, Remove the
redundant runtime method guard: delete the lines that read and check
request.method (the `const method = request.method;` and `if (method !== 'POST')
{ ... }` conditional) from the route handler so the file relies on the Next.js
15 export POST function routing; keep the exported POST handler (and its
existing logic) intact and ensure no other code depends on the removed `method`
variable.
cueweb/app/api/job/action/setmincores/route.ts (1)

22-25: 💤 Low value

Optional: method guard is redundant in Next.js 15 route handlers.

Next.js route handlers are method-specific by export name: the POST function only receives POST requests. The explicit method !== 'POST' check on line 23 will never trigger. Consider removing lines 22-25 to simplify the code, or keep them as defensive programming if preferred.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cueweb/app/api/job/action/setmincores/route.ts` around lines 22 - 25, The
explicit method guard using request.method and NextResponse in the route handler
is redundant because Next.js route files dispatch by exported function name
(POST), so remove the check block that reads request.method !== 'POST' and the
405 response; keep only the POST export implementation (e.g., the POST function
in route.ts) and any remaining request handling logic, or if you prefer
defensive coding, convert the block into a short comment explaining it's
intentionally redundant.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@cueweb/app/__tests__/api/utils/set-cores.test.ts`:
- Around line 21-31: The test file registers unused mocks for getJobForLayer and
toastWarning which aren’t used by the setJobCores tests; remove the unused mock
entries from the jest.mock calls (delete getJobForLayer from the
'`@/app/utils/get_utils`' mock and remove toastWarning from the
'`@/app/utils/notify_utils`' mock) so only accessActionApi, toastSuccess, and
handleError remain mocked for clarity and maintainability.

In `@cueweb/app/__tests__/api/utils/unbook.test.ts`:
- Around line 20-30: Remove the unused mocks from the test setup: delete the
jest.mock entry that stubs getJobForLayer and remove toastWarning from the
notify_utils mock since neither getJobForLayer nor toastWarning are referenced
by unbookJob or its tests; keep accessActionApi, toastSuccess, and handleError
mocks intact so unbookJob-related behavior remains covered.

In `@cueweb/app/api/job/action/setmaxcores/route.ts`:
- Around line 22-25: Remove the redundant HTTP method guard in the route
handler: since this file is a Next.js route exporting a POST handler (exported
POST function), delete the block that reads the request.method and returns a 405
when not 'POST' (the if (method !== 'POST') { ... } block). Keep the rest of the
POST handler logic intact and rely on Next.js to dispatch only POST requests to
the exported POST function.

In `@cueweb/app/api/job/action/setmincores/route.ts`:
- Around line 22-25: The explicit method guard using request.method and
NextResponse in the route handler is redundant because Next.js route files
dispatch by exported function name (POST), so remove the check block that reads
request.method !== 'POST' and the 405 response; keep only the POST export
implementation (e.g., the POST function in route.ts) and any remaining request
handling logic, or if you prefer defensive coding, convert the block into a
short comment explaining it's intentionally redundant.

In `@cueweb/app/api/proc/action/unbook/route.ts`:
- Around line 30-33: Remove the redundant runtime method guard: delete the lines
that read and check request.method (the `const method = request.method;` and `if
(method !== 'POST') { ... }` conditional) from the route handler so the file
relies on the Next.js 15 export POST function routing; keep the exported POST
handler (and its existing logic) intact and ensure no other code depends on the
removed `method` variable.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f513c11f-8904-49bc-a097-e6ce95b3c449

📥 Commits

Reviewing files that changed from the base of the PR and between de826ac and 93efba8.

⛔ Files ignored due to path filters (14)
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_batch_confirmation.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_batch_confirmation_dark.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_set_min_max_cores_confirmation.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_set_min_max_cores_confirmation_dark.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_set_min_max_cores_menu.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_set_min_max_cores_menu_dark.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_set_min_max_cores_window.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_set_min_max_cores_window_dark.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_unbook_kill_confirmation.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_unbook_kill_confirmation_dark.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_unbook_menu.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_unbook_menu_dark.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_unbook_window.png is excluded by !**/*.png
  • docs/assets/images/cueweb/cueweb_cuetopia_monitor_jobs_unbook_window_dark.png is excluded by !**/*.png
📒 Files selected for processing (12)
  • cueweb/app/__tests__/api/utils/set-cores.test.ts
  • cueweb/app/__tests__/api/utils/unbook.test.ts
  • cueweb/app/api/job/action/setmaxcores/route.ts
  • cueweb/app/api/job/action/setmincores/route.ts
  • cueweb/app/api/proc/action/unbook/route.ts
  • cueweb/app/jobs/data-table.tsx
  • cueweb/app/utils/action_utils.ts
  • cueweb/components/ui/context_menus/action-context-menu.tsx
  • cueweb/components/ui/set-cores-dialog.tsx
  • cueweb/components/ui/unbook-dialog.tsx
  • docs/_docs/developer-guide/cueweb-development.md
  • docs/_docs/user-guides/cueweb-user-guide.md

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants