Skip to content

Fleet UI: Move Add-entity buttons out of table headers - #50102

Merged
RachelElysia merged 5 commits into
mainfrom
34374-move-add-buttons-outside-table-header
Jul 30, 2026
Merged

Fleet UI: Move Add-entity buttons out of table headers#50102
RachelElysia merged 5 commits into
mainfrom
34374-move-add-buttons-outside-table-header

Conversation

@RachelElysia

@RachelElysia RachelElysia commented Jul 28, 2026

Copy link
Copy Markdown
Member

Issue

Resolves #34374

Description

Moves "Add profile", "Add asset", "Add script", "Add variable", "Add vital", and "Add certificate" out of table headers (UploadListHeading / SectionHeader details) into a new __tab-header flex row above the list, right of the section description — so the buttons align consistently across Controls pages.

  • Configuration profiles: SectionHeader now carries only the title. Description + Add button move into each of the two tabs (Profiles / Assets). When MDM is off, the description still renders (with its "Learn more" link) but the Add button hides via the existing showAddProfileButton = mdmEnabled && !isTechnician gate — the description reads as informational above the "MDM must be turned on" EmptyState below.
  • Scripts > Library: description + "Add script" on one row above the list.
  • Variables > Global variables: same pattern; also drops the "N variables" count.
  • Variables > Custom host vitals: same pattern.
  • OS settings > Certificates: same pattern; "Add certificate" gated on isPremiumTier && androidMdmEnabled && hasCustomScepCA.
  • TableContainer: .table-container__header collapses via :has() when it has no count / controls / search — so removing count/action/search doesn't leave an empty gap. The <span className="controls"> in TableContainer.tsx now carries a comment flagging that its shape is load-bearing for the collapse selector.
  • Removes the unused ScriptListHeading and (post self-review) UploadListHeading components.
  • Extracts the duplicated &__tab-header { display: flex; justify-content: space-between; align-items: flex-start; gap: $pad-medium; } block into a shared @mixin tab-header in styles/var/mixins.scss; six copies across five files now @include it.

Screenrecording

Screen.Recording.2026-07-28.at.4.09.20.PM.mov

Testing

  • Controls > OS settings > Configuration profiles: Profiles tab shows description + "Add profile" on one row above list; Assets tab shows description + "Add asset". SectionHeader is title-only.
  • Controls > OS settings > Configuration profiles with MDM disabled: Profiles tab shows the description (no Add button) above the "Additional configuration required" EmptyState.
  • Controls > Scripts > Library: description + "Add script" above list.
  • Controls > Variables > Global variables: description + "Add variable" above table; no "N variables" count; no whitespace gap where the count row used to be.
  • Controls > Variables > Custom host vitals: description + "Add vital" above table.
  • Controls > OS settings > Certificates: "Add certificate" only visible when premium + Android MDM enabled + custom SCEP CA configured.
  • GitOps mode: Add buttons render the standard tooltip and stay disabled.
  • Free tier and technician role: Add buttons hidden where appropriate.
  • QA'd all new/changed functionality manually

Summary by CodeRabbit

  • New Features
    • Added consistent tab headers with descriptions and contextual actions across management pages.
    • Added “Add” actions for certificates, configuration profiles, assets, scripts, variables, and custom host vitals where permitted.
    • Actions now respect subscription tier, device-management settings, permissions, technician access, and GitOps mode.
  • Bug Fixes
    • Empty table headers are now automatically hidden when they contain no visible content.
    • Improved placement and behavior of add buttons and empty states across management tabs.

Moves "Add profile", "Add asset", "Add script", "Add variable",
"Add vital", and "Add certificate" out of table/list headers and
SectionHeader details slots into a new `__tab-header` flex row that
sits above the list, right of the section description — so the
buttons align consistently across Controls pages.

Configuration profiles now pushes its description + button into each
of its two tabs (Profiles / Assets); the SectionHeader carries only
the title. Global variables drops the row count. Empty
`.table-container__header` collapses via `:has()` so removing the
count/action/search doesn't leave a gap. Removes the unused
ScriptListHeading component.
Copilot AI review requested due to automatic review settings July 28, 2026 23:11

Copilot AI 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.

Pull request overview

This PR standardizes Controls page layouts by moving “Add …” action buttons out of list/table headers and into a consistent flex “tab header” row alongside each section’s description, improving alignment across tabs and cards. It also prevents empty TableContainer headers from leaving visual gaps after removing counts/actions/search in some views.

Changes:

  • Moved add-entity buttons (profiles, assets, scripts, variables, vitals, certificates) from UploadListHeading/SectionHeader header areas into new __tab-header rows above their respective lists.
  • Removed the unused ScriptListHeading component and updated Script Library to render “Add script” in the new header row.
  • Updated TableContainer styles to fully hide .table-container__header when it contains no results count, controls, or search bar.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated no comments.

Show a summary per file
File Description
frontend/pages/ManageControlsPage/Variables/cards/GlobalVariables/GlobalVariables.tsx Removes table count and relocates “Add variable” into a new tab-header row with the description.
frontend/pages/ManageControlsPage/Variables/cards/CustomHostVitalsTab/CustomHostVitalsTab.tsx Relocates “Add vital” out of SectionHeader details into a tab-header row; aligns icon sizing and tooltip position.
frontend/pages/ManageControlsPage/Variables/_styles.scss Adds shared flex tab-header styling for Variables cards.
frontend/pages/ManageControlsPage/Scripts/components/ScriptListHeading/ScriptListHeading.tsx Removes unused component.
frontend/pages/ManageControlsPage/Scripts/components/ScriptListHeading/index.ts Removes unused re-export.
frontend/pages/ManageControlsPage/Scripts/components/ScriptListHeading/_styles.scss Removes unused styling.
frontend/pages/ManageControlsPage/Scripts/cards/ScriptLibrary/ScriptLibrary.tsx Moves “Add script” into a new tab-header row and drops UploadList heading component usage.
frontend/pages/ManageControlsPage/Scripts/cards/ScriptLibrary/_styles.scss Adds tab-header flex styling for Script Library.
frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/ConfigurationProfiles.tsx Moves description + “Add profile” into the Profiles tab header row; removes list heading component usage.
frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/components/AssetsTab/AssetsTab.tsx Moves description + “Add asset” into a tab-header row; removes list heading component usage.
frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/components/AssetsTab/_styles.scss Adds tab-header styling and applies vertical tab panel layout mixin.
frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/_styles.scss Adds .profiles-tab layout and tab-header styling for the Profiles tab panel.
frontend/pages/ManageControlsPage/OSSettings/cards/Certificates/Certificates.tsx Moves description + “Add certificate” into a tab-header row and applies the intended premium/Android/custom-SCEP gating.
frontend/pages/ManageControlsPage/OSSettings/cards/Certificates/_styles.scss Switches to vertical-card-layout and adds tab-header styling.
frontend/components/TableContainer/_styles.scss Collapses empty .table-container__header using :has() checks to avoid blank gaps.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

The "Add script" button now lives in the tab-header row above the
list rather than inside the list header, so it stays mounted even
when the list is empty and when the modal is closed. Two deep-link
tests need to account for the extra occurrence: 2 → 3 when the
modal is open (tab-header + modal title + modal submit), and
0 → 1 after the modal is dismissed.
Copilot AI review requested due to automatic review settings July 28, 2026 23:24
@RachelElysia

Copy link
Copy Markdown
Member Author

Self-review — CTO-style

Must fix

1. Double "Add" CTAs on empty states — six surfaces

Pre-PR, UploadList's HeadingComponent only rendered when a list existed. The new tab-header sits above renderContent(), so the Add button now renders in empty states too — alongside the existing empty-state CTAs:

  • Certificates.tsxAddCertCard empty state has its own "Add certificate" button; tab-header now also shows "Add certificate".
  • ConfigurationProfiles.tsxAddProfileCard empty state renders a large upload CTA with its own "Add profile" button; tab-header shows "Add profile".
  • AssetsTab.tsxEmptyState primaryButton "Add asset"; tab-header "Add asset".
  • ScriptLibrary.tsxEmptyState primaryButton "Upload"; tab-header "Add script" (different labels, same modal).
  • CustomHostVitalsTab.tsxEmptyState primaryButton "Add vital"; tab-header "Add vital".
  • GlobalVariables.tsxEmptyState primaryButton "Add variable"; tab-header "Add variable". Tests already updated to expect both to render (GlobalVariables.tests.tsx:72-77).

Design decision needed: keep the persistent tab-header CTA (drop the empty-state ones) or hide the tab-header button when the list is empty (mirror the pre-PR scoping).

2. ScriptLibrary.tests.tsx — fixed in commit 889c7a7

Deep-link tests asserting getAllByText("Add script")).toHaveLength(2) (2 → 3 when modal is open) and toHaveLength(0) (0 → 1 after modal closes). Updated.

Should fix

3. Orphaned UploadListHeading component

pages/ManageControlsPage/components/UploadListHeading/ has no imports left in Controls after this PR. Parallel to the ScriptListHeading delete already done. Note: still used by admin/software pages (out of scope), so keep the component; but the Controls-scoped import path is now unused.

4. !mdmEnabled copy mismatch on Configuration profiles

ConfigurationProfiles.tsx:288-310 — the "Create and upload configuration profiles…" description now renders inside the profiles tab, above the Additional configuration required EmptyState when MDM is disabled. Consider suppressing or swapping the description when !mdmEnabled.

5. Duplicated __tab-header SCSS

Identical block copy-pasted across six files:

&__tab-header {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: $pad-medium;
}

Candidate for a shared mixin in frontend/styles/var/mixins.scss.

Nit

6. .profiles-tab class scoping

.profiles-tab (top-level BEM block) mirrors .assets-tab but breaks the &__tab-header scoping used by Certificates / ScriptLibrary. Worth a consistency pass either way.

7. .controls > * :has selector

TableContainer/_styles.scss:88-91 collapse rule depends on the <span className="controls"> shape in TableContainer.tsx:499. A one-line comment near the JSX referencing the SCSS contract would prevent future drift.

@codecov

codecov Bot commented Jul 28, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 80.00000% with 7 lines in your changes missing coverage. Please review.
✅ Project coverage is 68.09%. Comparing base (3a78739) to head (2bad128).
⚠️ Report is 21 commits behind head on main.

Files with missing lines Patch % Lines
...ds/ConfigurationProfiles/ConfigurationProfiles.tsx 75.00% 3 Missing and 1 partial ⚠️
...age/OSSettings/cards/Certificates/Certificates.tsx 80.00% 1 Missing ⚠️
...urationProfiles/components/AssetsTab/AssetsTab.tsx 80.00% 1 Missing ⚠️
...Page/Scripts/cards/ScriptLibrary/ScriptLibrary.tsx 75.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #50102      +/-   ##
==========================================
+ Coverage   68.05%   68.09%   +0.04%     
==========================================
  Files        3929     3931       +2     
  Lines      250284   250289       +5     
  Branches    13238    13398     +160     
==========================================
+ Hits       170324   170439     +115     
+ Misses      64661    64550     -111     
- Partials    15299    15300       +1     
Flag Coverage Δ
frontend 61.25% <80.00%> (+0.29%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copilot AI 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.

Pull request overview

Copilot reviewed 16 out of 16 changed files in this pull request and generated no new comments.

- (#3) Deleted orphaned components/UploadListHeading/ folder — no
  external importers left after the tab-header refactor.
- (#4) ConfigurationProfiles: hide the __tab-header (description +
  Add button) when !mdmEnabled so the "Create and upload configuration
  profiles..." copy no longer contradicts the "MDM must be turned on"
  EmptyState directly below.
- (#5) Extracted the duplicated __tab-header block into a
  @mixin tab-header in styles/var/mixins.scss; six copies across five
  files now @include it.
- (#6) Comment on .profiles-tab explaining why ConfigurationProfiles
  splits its card wrapper from its per-tab layout (two inner tabs
  mirroring .assets-tab) while Certificates / ScriptLibrary stay
  single-block (one-tab card).
- (#7) Comment on <span className="controls"> in TableContainer.tsx
  flagging the load-bearing shape that _styles.scss's :has(.controls
  > *) collapse rule depends on.
Copilot AI review requested due to automatic review settings July 29, 2026 15:24

Copilot AI 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.

Pull request overview

Copilot reviewed 21 out of 21 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/ConfigurationProfiles.tsx:312

  • The profiles tab description (including the “Learn more” link) now only renders when mdmEnabled is true. Previously it rendered even when MDM is disabled, and this change isn’t mentioned in the PR description. If MDM is off, users will lose that contextual/help link and the layout becomes inconsistent with the Assets tab (which always shows its description).
              {mdmEnabled && (
                <div className="profiles-tab__tab-header">
                  <PageDescription
                    variant="right-panel"
                    content={profilesDescription}



Tests each surface touched by this PR (tab-header row above the list
with description + optional Add button):

- Certificates.tests.tsx (new): 4 tests — description always renders;
  Add certificate hidden on Free, hidden without a custom SCEP CA,
  shown for premium + Android MDM + custom SCEP CA.
- ConfigurationProfiles.tests.tsx (new): 3 tests — MDM enabled shows
  description + Add profile; MDM disabled keeps description but hides
  Add profile (EmptyState explains "MDM must be turned on");
  technician sees the "View configuration profiles." copy with no
  Add profile button.
- AssetsTab.tests.tsx: added a tab-header test above a populated list
  and adjusted the empty-state assertion to expect two "Add asset"
  buttons (empty-state CTA + persistent tab-header — matches the
  accepted double-CTA pattern from self-review item #1).
- CustomHostVitalsTab.tests.tsx: added a tab-header describe block
  asserting the description + Add vital button render above the list.

Also reverts the earlier suppress-when-MDM-off change on
ConfigurationProfiles.tsx: the description now always renders (its
"Learn more" link stays useful even when MDM is off) and the existing
`showAddProfileButton = mdmEnabled && !isTechnician` gate is what
hides the button. That matches the behavior the new tests assert.
Copilot AI review requested due to automatic review settings July 29, 2026 15:47

Copilot AI 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.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Copilot AI review requested due to automatic review settings July 29, 2026 16:01
@RachelElysia
RachelElysia marked this pull request as ready for review July 29, 2026 16:02
@RachelElysia
RachelElysia requested a review from a team as a code owner July 29, 2026 16:02

Copilot AI 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.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

frontend/components/TableContainer/_styles.scss:91

  • The new header-collapse selector checks for .table-container__results-count element presence, but TableContainer always renders that wrapper whenever renderCount is provided—even if renderCount() returns null. This means tables that intentionally return null for an empty count (e.g. LabelsTable) will still keep an empty header visible. Consider matching on .table-container__results-count > * (like you already do for .controls > *) so the header collapses when the count wrapper has no children.
    // Hide the header entirely when it has no visible content (no
    // results count, no filter/action controls, and no search bar).
    &:not(:has(.table-container__results-count)):not(:has(.controls
          > *)):not(:has(.table-container__search)) {
      display: none;

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Manage page actions are moved from upload-list and section headers into dedicated tab-header rows for certificates, profiles, assets, scripts, variables, and custom host vitals. A shared tab-header mixin standardizes layout, while TableContainer hides headers without visible content. Tests cover conditional action visibility, header content, and updated script modal counts.

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main UI change: moving add buttons out of table headers.
Description check ✅ Passed The PR description includes the linked issue, change summary, screenshots, testing, and relevant checklist items.
Linked Issues check ✅ Passed The changes satisfy #34374 by moving the requested add buttons out of table headers and improving alignment on the targeted Controls pages.
Out of Scope Changes check ✅ Passed The extra edits are supportive of the same UI refactor and match the PR objectives, with no clearly unrelated changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 34374-move-add-buttons-outside-table-header

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.

@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 (1)
frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/ConfigurationProfiles.tsx (1)

288-331: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

Extract the repeated tab-header action pattern into a shared component.

The same JSX shape — PageDescription + a conditionally-visible, GitOpsModeTooltipWrapper-wrapped secondary Button with a plus Icon, inside a __tab-header wrapper — is copy-pasted across all three files below (and, per the PR description, extends to more surfaces in sibling layers of this stack). The SCSS side of this duplication was already consolidated into a shared tab-header mixin; the JSX side is a natural follow-up.

  • frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/ConfigurationProfiles.tsx#L288-L331: extract the PageDescription + conditional "Add profile" GitOpsModeTooltipWrapper/Button/Icon block into a shared component (e.g. TabHeaderAction) parameterized by description content, button label, onClick, and a show boolean.
  • frontend/pages/ManageControlsPage/OSSettings/cards/Certificates/Certificates.tsx#L248-L286: replace the equivalent "Add certificate" block with the same shared component.
  • frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/components/AssetsTab/AssetsTab.tsx#L174-L199: replace the equivalent "Add asset" block with the same shared component.
🤖 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
`@frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/ConfigurationProfiles.tsx`
around lines 288 - 331, The repeated tab-header JSX should be extracted into a
shared TabHeaderAction component. Update ConfigurationProfiles.tsx (288-331),
Certificates.tsx (248-286), and AssetsTab.tsx (174-199) to use it,
parameterizing description content, button label, onClick, and show while
preserving each existing GitOps wrapper, secondary button, plus icon, and
tab-header layout.
🤖 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
`@frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/ConfigurationProfiles.tsx`:
- Around line 288-331: The repeated tab-header JSX should be extracted into a
shared TabHeaderAction component. Update ConfigurationProfiles.tsx (288-331),
Certificates.tsx (248-286), and AssetsTab.tsx (174-199) to use it,
parameterizing description content, button label, onClick, and show while
preserving each existing GitOps wrapper, secondary button, plus icon, and
tab-header layout.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 74edda79-cc8c-423b-a50f-27ce182880ee

📥 Commits

Reviewing files that changed from the base of the PR and between 3a78739 and 2bad128.

📒 Files selected for processing (25)
  • frontend/components/TableContainer/TableContainer.tsx
  • frontend/components/TableContainer/_styles.scss
  • frontend/pages/ManageControlsPage/OSSettings/cards/Certificates/Certificates.tests.tsx
  • frontend/pages/ManageControlsPage/OSSettings/cards/Certificates/Certificates.tsx
  • frontend/pages/ManageControlsPage/OSSettings/cards/Certificates/_styles.scss
  • frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/ConfigurationProfiles.tests.tsx
  • frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/ConfigurationProfiles.tsx
  • frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/_styles.scss
  • frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/components/AssetsTab/AssetsTab.tests.tsx
  • frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/components/AssetsTab/AssetsTab.tsx
  • frontend/pages/ManageControlsPage/OSSettings/cards/ConfigurationProfiles/components/AssetsTab/_styles.scss
  • frontend/pages/ManageControlsPage/Scripts/cards/ScriptLibrary/ScriptLibrary.tests.tsx
  • frontend/pages/ManageControlsPage/Scripts/cards/ScriptLibrary/ScriptLibrary.tsx
  • frontend/pages/ManageControlsPage/Scripts/cards/ScriptLibrary/_styles.scss
  • frontend/pages/ManageControlsPage/Scripts/components/ScriptListHeading/ScriptListHeading.tsx
  • frontend/pages/ManageControlsPage/Scripts/components/ScriptListHeading/_styles.scss
  • frontend/pages/ManageControlsPage/Scripts/components/ScriptListHeading/index.ts
  • frontend/pages/ManageControlsPage/Variables/_styles.scss
  • frontend/pages/ManageControlsPage/Variables/cards/CustomHostVitalsTab/CustomHostVitalsTab.tests.tsx
  • frontend/pages/ManageControlsPage/Variables/cards/CustomHostVitalsTab/CustomHostVitalsTab.tsx
  • frontend/pages/ManageControlsPage/Variables/cards/GlobalVariables/GlobalVariables.tsx
  • frontend/pages/ManageControlsPage/components/UploadListHeading/UploadListHeading.tsx
  • frontend/pages/ManageControlsPage/components/UploadListHeading/_styles.scss
  • frontend/pages/ManageControlsPage/components/UploadListHeading/index.ts
  • frontend/styles/var/mixins.scss
💤 Files with no reviewable changes (6)
  • frontend/pages/ManageControlsPage/components/UploadListHeading/_styles.scss
  • frontend/pages/ManageControlsPage/Scripts/components/ScriptListHeading/index.ts
  • frontend/pages/ManageControlsPage/Scripts/components/ScriptListHeading/ScriptListHeading.tsx
  • frontend/pages/ManageControlsPage/Scripts/components/ScriptListHeading/_styles.scss
  • frontend/pages/ManageControlsPage/components/UploadListHeading/index.ts
  • frontend/pages/ManageControlsPage/components/UploadListHeading/UploadListHeading.tsx

@RachelElysia
RachelElysia merged commit 39cbfed into main Jul 30, 2026
27 checks passed
@RachelElysia
RachelElysia deleted the 34374-move-add-buttons-outside-table-header branch July 30, 2026 14:17
RachelElysia added a commit that referenced this pull request Aug 3, 2026
Six Add buttons landed on main just ahead of this branch and still use the
old <Icon>-child pattern. Migrate them to the icon prop for consistency
with the rest of this branch's refactor.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

UI Improvement: Move "Add profile" and similar header buttons outside table header

3 participants