diff --git a/.changeset/fn-7805-quick-add-priority-indicators.md b/.changeset/fn-7805-quick-add-priority-indicators.md
new file mode 100644
index 0000000000..e7e0d28d50
--- /dev/null
+++ b/.changeset/fn-7805-quick-add-priority-indicators.md
@@ -0,0 +1,7 @@
+---
+"@runfusion/fusion": patch
+---
+
+summary: Quick-add composer now shows icon-only priority/Fast controls with GitHub tracking beside attach.
+category: feature
+dev: QuickEntryBox + TaskForm reuse a shared priorityIndicator glyph helper; GitHub + Priority relocated into .quick-entry-primary-group; no test-id/payload changes.
diff --git a/docs/dashboard-guide.md b/docs/dashboard-guide.md
index 9f7671eadd..482d90cd42 100644
--- a/docs/dashboard-guide.md
+++ b/docs/dashboard-guide.md
@@ -462,7 +462,8 @@ Create requests never send an explicit `column`. The task store resolves the lan
Optional workflow steps declared by the active workflow are available from the quick-add action row and the **New Task** dialog's inline quick buttons. For example, the coding workflow's browser verification option appears as a quick drop-down when that workflow is active; each option is seeded from the workflow step's `defaultOn` setting and is sent with the task's `enabledWorkflowSteps` payload at creation time.
-Quick Add image attachments use the paperclip icon button in the action row. Supported image files (`png`, `jpeg`, `gif`, `webp`) can be selected from that control, pasted into the Quick Add input, or dragged onto the Quick Add box; all three paths show pending previews before task creation and upload the images to the created task afterward.
+
+Quick Add image attachments use the paperclip icon button in the action row. Supported image files (`png`, `jpeg`, `gif`, `webp`) can be selected from that control, pasted into the Quick Add input, or dragged onto the Quick Add box; all three paths show pending previews before task creation and upload the images to the created task afterward. The same bottom action row places the GitHub tracking override beside the paperclip; Priority is an icon-only control whose glyph changes by selected level (down arrow for low, flag for normal, up arrow for high, alert for urgent), and Fast is an icon-only lightning control. These icon-only controls keep accessible labels and the same create-payload behavior as the previous text chips.
Quick entry, inline quick-create, and the full **New Task** dialog all check for similar active tasks before creating. When possible duplicates exist, the warning lists each match by task description (falling back to title, then “No description”) and lets you open an existing task, cancel, or create anyway with the duplicates acknowledged.
diff --git a/packages/dashboard/app/__tests__/quick-entry-action-row-height-parity.test.tsx b/packages/dashboard/app/__tests__/quick-entry-action-row-height-parity.test.tsx
index 3af7f5c7c0..23f4e85554 100644
--- a/packages/dashboard/app/__tests__/quick-entry-action-row-height-parity.test.tsx
+++ b/packages/dashboard/app/__tests__/quick-entry-action-row-height-parity.test.tsx
@@ -89,7 +89,11 @@ vi.mock("lucide-react", () => ({
ChevronRight: () => null,
Bot: () => null,
Server: () => null,
+ ArrowDown: () => null,
+ ArrowUp: () => null,
Flag: () => null,
+ TriangleAlert: () => null,
+ Zap: () => null,
Maximize2: () => null,
Minimize2: () => null,
}));
@@ -182,7 +186,7 @@ describe("quick-entry action row height parity (FN-7680)", () => {
// unrelated @media block or the desktop base rule further up the file.
const sectionStart = cssContent.indexOf("Quick Entry Mobile Touch + Overflow Fixes");
expect(sectionStart).toBeGreaterThan(-1);
- const section = cssContent.slice(sectionStart, sectionStart + 800);
+ const section = cssContent.slice(sectionStart, sectionStart + 1600);
expect(section).toContain("max-width: 768px");
const mobileBlockMatch = section.match(
@@ -221,7 +225,7 @@ describe("quick-entry action row height parity (FN-7680)", () => {
expect(depTriggerMatch![1].trim()).toBe("3px 8px");
});
- it("renders Save, workflow trigger, Attach, Fast, Priority, and Deps as sibling .btn elements in the same .quick-entry-actions row", () => {
+ it("renders Save, workflow trigger, Attach, GitHub, Priority, Fast, and Deps as sibling .btn elements in the same .quick-entry-actions row", () => {
mockDesktopViewport();
renderQuickEntryBox();
@@ -231,11 +235,12 @@ describe("quick-entry action row height parity (FN-7680)", () => {
const save = screen.getByTestId("quick-entry-save");
const trigger = screen.getByTestId("quick-entry-workflow-trigger");
const attach = screen.getByTestId("quick-entry-attach");
- const fast = screen.getByTestId("quick-entry-fast-toggle");
+ const github = screen.getByTestId("quick-entry-github-toggle");
const priority = screen.getByTestId("quick-entry-priority-button");
+ const fast = screen.getByTestId("quick-entry-fast-toggle");
const deps = screen.getByTestId("quick-entry-deps");
- for (const el of [save, trigger, attach, fast, priority, deps]) {
+ for (const el of [save, trigger, attach, github, priority, fast, deps]) {
expect(el.classList.contains("btn")).toBe(true);
expect(actionsRow.contains(el)).toBe(true);
}
diff --git a/packages/dashboard/app/__tests__/quick-entry-workflow-trigger-height.test.tsx b/packages/dashboard/app/__tests__/quick-entry-workflow-trigger-height.test.tsx
index 93a1d70495..80f229130c 100644
--- a/packages/dashboard/app/__tests__/quick-entry-workflow-trigger-height.test.tsx
+++ b/packages/dashboard/app/__tests__/quick-entry-workflow-trigger-height.test.tsx
@@ -82,7 +82,11 @@ vi.mock("lucide-react", () => ({
ChevronRight: () => null,
Bot: () => null,
Server: () => null,
+ ArrowDown: () => null,
+ ArrowUp: () => null,
Flag: () => null,
+ TriangleAlert: () => null,
+ Zap: () => null,
Maximize2: () => null,
Minimize2: () => null,
}));
@@ -366,18 +370,22 @@ describe("quick-entry-actions fixed-height parity, not just a min-height floor (
expect(depTriggerMatches!.length).toBe(1);
});
- it("renders Save, Attach, Fast, and the workflow trigger as siblings in one .quick-entry-actions row (no shell/layout regression; jsdom cannot measure real pixel heights)", () => {
+ it("renders Save, Attach, GitHub, Priority, Fast, and the workflow trigger as siblings in one .quick-entry-actions row (no shell/layout regression; jsdom cannot measure real pixel heights)", () => {
mockDesktopViewport();
renderQuickEntryBox();
const saveButton = screen.getByTestId("quick-entry-save");
const attachButton = screen.getByTestId("quick-entry-attach");
+ const githubToggle = screen.getByTestId("quick-entry-github-toggle");
+ const priorityButton = screen.getByTestId("quick-entry-priority-button");
const fastToggle = screen.getByTestId("quick-entry-fast-toggle");
const workflowTrigger = screen.getByTestId("quick-entry-workflow-trigger");
const actionsRow = saveButton.closest(".quick-entry-actions");
expect(actionsRow).not.toBeNull();
expect(actionsRow?.contains(attachButton)).toBe(true);
+ expect(actionsRow?.contains(githubToggle)).toBe(true);
+ expect(actionsRow?.contains(priorityButton)).toBe(true);
expect(actionsRow?.contains(fastToggle)).toBe(true);
expect(actionsRow?.contains(workflowTrigger)).toBe(true);
});
diff --git a/packages/dashboard/app/components/QuickEntryBox.css b/packages/dashboard/app/components/QuickEntryBox.css
index a6d467e9c7..b28446101b 100644
--- a/packages/dashboard/app/components/QuickEntryBox.css
+++ b/packages/dashboard/app/components/QuickEntryBox.css
@@ -198,11 +198,12 @@ section under one line.
/*
FNXC:BoardComposer 2026-07-10-12:00:
The action row is organized as two logical clusters instead of one undifferentiated wrap of chips:
-- `.quick-entry-options-group` — task options (workflow, priority, optional steps, subtask, deps,
- models, node, agent, GitHub tracking), wrapping left-to-right with one consistent chip gap.
-- `.quick-entry-primary-group` — attach + Fast + Save; margin-left auto keeps it right-aligned so the
- distinct Save action always ends the row (and wraps as one unit on narrow columns, never splitting
- Save from its neighbors).
+- `.quick-entry-options-group` — task options (workflow, optional steps, subtask, deps,
+ models, node, agent), wrapping left-to-right with one consistent chip gap.
+- `.quick-entry-primary-group` — attach + GitHub tracking + Priority + Fast + Save; margin-left auto
+ keeps it right-aligned so the distinct Save action always ends the row (and wraps as one unit on
+ narrow columns, never splitting Save from its neighbors). Priority and Fast are icon-only here; the
+ priority glyph follows the shared up/high, down/low, flag/normal, alert/urgent mapping.
Chip HEIGHT consistency is already enforced by the FN-7680/FN-7683 fixed-box rule on
`.quick-entry-actions .btn` above (descendant selector — still applies inside these wrappers); these
rules only own grouping/spacing/alignment.
@@ -315,6 +316,14 @@ surfaces use are untouched.
color: var(--text);
}
+.quick-entry-primary-group .btn.btn-primary:not(.btn-task-create),
+.quick-entry-primary-group .btn.btn-primary:not(.btn-task-create):hover,
+.quick-entry-primary-group .btn.btn-primary:not(.btn-task-create):focus-visible {
+ background: var(--cta-bg);
+ border-color: var(--cta-border);
+ color: var(--cta-text);
+}
+
/*
FNXC:QuickAddWorkflow 2026-06-30-00:00:
Quick-add workflow targeting sits in the action row as a compact existing-button dropdown. Use tokenized sizing/colors so the selector wraps with Save/Plan controls on narrow Board and List surfaces without introducing a separate visual hierarchy.
diff --git a/packages/dashboard/app/components/QuickEntryBox.tsx b/packages/dashboard/app/components/QuickEntryBox.tsx
index f302d91e4f..a4352b3dfa 100644
--- a/packages/dashboard/app/components/QuickEntryBox.tsx
+++ b/packages/dashboard/app/components/QuickEntryBox.tsx
@@ -8,7 +8,7 @@ import type { Task, Settings, TaskPriority, ResolvedWorkflowOptionalStep, Thinki
import type { ModelInfo, Agent, CreateTaskInput, DuplicateMatch, BoardWorkflowDefinition, NodeInfo } from "../api";
import { checkDuplicateTasks, fetchModels, fetchSettings, updateGlobalSettings, fetchAgents, uploadAttachment, fetchWorkflowOptionalSteps } from "../api";
import { DuplicateWarningModal } from "./DuplicateWarningModal";
-import { Link, Paperclip, Brain, Lightbulb, ListTree, Sparkles, Save, ChevronDown, ChevronUp, ChevronRight, Bot, Server, Flag } from "lucide-react";
+import { Link, Paperclip, Brain, Lightbulb, ListTree, Sparkles, Save, ChevronDown, ChevronUp, ChevronRight, Bot, Server, Zap } from "lucide-react";
import { CustomModelDropdown } from "./CustomModelDropdown";
import { LoadingSpinner } from "./LoadingSpinner";
import { getScopedItem, removeScopedItem, setScopedItem } from "../utils/projectStorage";
@@ -17,6 +17,7 @@ import { NodeHealthDot } from "./NodeHealthDot";
import { ProviderIcon } from "./ProviderIcon";
import { WorkflowOptionalStepsDropdown } from "./WorkflowOptionalStepsDropdown";
import { WorkflowIcon } from "./WorkflowIcon";
+import { getPriorityIcon, getPriorityLabel } from "../utils/priorityIndicator";
const STORAGE_KEY = "kb-quick-entry-text";
const ALLOWED_IMAGE_TYPES = ["image/png", "image/jpeg", "image/gif", "image/webp"];
@@ -1636,6 +1637,10 @@ export function QuickEntryBox({ onCreate, addToast, tasks = [], availableModels,
const githubToggleLabel = effectiveGithubTracking
? t("tasks.githubTrackingOn", "GitHub tracking ON for next task (project default: {{default}})", { default: projectGithubTrackingDefault ? t("tasks.githubTrackingDefaultOn", "on") : t("tasks.githubTrackingDefaultOff", "off") })
: t("tasks.githubTrackingOff", "GitHub tracking OFF for next task (project default: {{default}})", { default: projectGithubTrackingDefault ? t("tasks.githubTrackingDefaultOn", "on") : t("tasks.githubTrackingDefaultOff", "off") });
+ const PriorityIcon = getPriorityIcon(priority);
+ const priorityLabel = getPriorityLabel(priority);
+ const priorityButtonLabel = t("tasks.quickEntryPriorityLabel", "Priority: {{priority}}", { priority: priorityLabel });
+ const fastToggleLabel = t("tasks.toggleFastMode", "Toggle fast execution mode");
// Show expanded controls based on disclosure state (user preference), not textarea focus
const showExpandedControls = isDisclosureExpanded;
@@ -1731,10 +1736,14 @@ export function QuickEntryBox({ onCreate, addToast, tasks = [], availableModels,
FNXC:BoardComposer 2026-07-10-12:00:
First-run review flagged the quick-add composer as disorganized: chips wrapped into four
arbitrary-looking rows with Save buried mid-row. Reorganize into two logical clusters inside
- the single wrapping action row: an options group (workflow, priority, optional steps, subtask,
- deps, models, node, agent, GitHub tracking) and a right-aligned primary group (attach, Fast,
- Save) so the primary Save action always reads last/right. All triggers, popovers, and test ids
- are unchanged — this is a layout/organization pass only.
+ the single wrapping action row: an options group (workflow, optional steps, subtask, deps,
+ models, node, agent) and a right-aligned primary group (attach, GitHub tracking, Priority,
+ Fast, Save) so status controls sit beside attach and Save still reads last/right.
+
+ FNXC:QuickAddActionRow 2026-07-10-21:45:
+ Priority and Fast are icon-only in the bottom primary group: priority uses the shared
+ up/high, down/low, flag/normal, alert/urgent glyph helper, and Fast uses Zap while retaining
+ title/aria-label/test-id semantics.
*/}
,
- portalRoot,
- )}
,
portalRoot,
)}
-
-
{/*
FNXC:BoardComposer 2026-07-10-12:00:
- Primary action cluster: attach + Fast sit directly beside Save, and Save is the LAST control in
- DOM order so it is right-aligned (margin-left auto on the cluster) and reads as the composer's
- primary action. Save keeps its distinct `btn-task-create` styling.
+ Primary action cluster: attach + GitHub tracking + Priority + Fast sit directly beside Save,
+ and Save is the LAST control in DOM order so it is right-aligned (margin-left auto on the
+ cluster) and reads as the composer's primary action. Save keeps its distinct `btn-task-create`
+ styling.
FNXC:QuickAddAttachments 2026-06-30-00:00 (relocated 2026-07-10): the attachment affordance
stays adjacent to Save (now immediately to its LEFT) preserving the icon-only label, hidden
file input trigger, and pending-count badge.
@@ -2254,6 +2182,90 @@ export function QuickEntryBox({ onCreate, addToast, tasks = [], availableModels,
)}
+
+
+