') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Add Triggering User Name to the DagRun UI page by dheerajturaga · Pull Request #53510 · apache/airflow · GitHub
Skip to content

Add Triggering User Name to the DagRun UI page - #53510

Merged
pierrejeambrun merged 3 commits into
apache:mainfrom
dheerajturaga:dagrun-trigger-user-column
Jul 22, 2025
Merged

Add Triggering User Name to the DagRun UI page#53510
pierrejeambrun merged 3 commits into
apache:mainfrom
dheerajturaga:dagrun-trigger-user-column

Conversation

@dheerajturaga

@dheerajturagadheerajturaga commented Jul 18, 2025

Copy link
Copy Markdown
Member

For DAGs with frequent manual triggers from multiple users, it can be difficult to determine which DagRun corresponds to which user. With the addition of the triggering_user_name field to the DagRun model in #51738, this PR enhances the DagRun UI by displaying the triggering user's name, making it easier to trace manual runs.

image

@boring-cyborgboring-cyborgBot added the area:UI Related to UI/UX. For Frontend Developers. label Jul 18, 2025
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

I have also added triggering user name filter to DAG runs table
This enhancement improves the user experience by making it easier to locate DAG runs triggered by specific users, which is particularly useful in multi-user environments for debugging and monitoring purposes.
image

@jscheffljscheffl 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.

Seems to be OK for me. Would like another UI Experts opinion, unsure whether a specific concept for displayed columns was made. I like this approach but other filter and columns select options are missing atm.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for the PR, that's a great addition.

I think there are a few adjustments to make before we can merge it.

Comment threadairflow-core/src/airflow/ui/src/pages/DagRuns.tsx Outdated
Comment threadairflow-core/src/airflow/ui/src/pages/DagRuns.tsx Outdated
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@pierrejeambrun , I removed the filtering completely, this PR just adds the additional column to the DagRun. Please let me know if this looks good

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks!

@pierrejeambrun

Copy link
Copy Markdown
Member

Feel free to follow with the backend sort implementation. That should be pretty straight forward there a plenty of example to take a look at.

@pierrejeambrun
pierrejeambrun merged commit 6a1d9b2 into apache:mainJul 22, 2025
53 checks passed
@dheerajturaga
dheerajturaga deleted the dagrun-trigger-user-column branch July 22, 2025 16:15
@dheerajturaga

Copy link
Copy Markdown
MemberAuthor

@pierrejeambrun can we include this in 3.1.0 ?

@jscheffljscheffl added this to the Airflow 3.1.0 milestone Aug 21, 2025
@jscheffl

Copy link
Copy Markdown
Contributor

@dheerajturaga It is on main and 3.1 stable / test branch is not branched-off so it will be for sure in 3.1 (unless somebody reverts). Added the milestone tag to make it clear.

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

Labels

area:UIRelated to UI/UX. For Frontend Developers.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@dheerajturaga@pierrejeambrun@jscheffl