chore: post-archive sprint status edits + integration-detail UI polish

Archived sprint files inherit the rename without the post-move status edits
since git recorded the rename against pre-edit content. Applies the
OBSOLETE/DONE annotations directly on the archived copies so the record is
internally consistent.

Integration-detail component + spec: small polish pass. integration-hub-ui
spec: trivial assertion tweak. Playwright: refreshed live-frontdoor-auth
snapshot.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
master
2026-04-15 11:28:39 +03:00
parent c01ce36b62
commit cd18bd1fce
7 changed files with 103 additions and 37 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -63,7 +63,9 @@ describe('IntegrationDetailComponent', () => {
useValue: {
snapshot: {
paramMap: convertToParamMap({ integrationId: 'int-1' }),
queryParamMap: convertToParamMap({}),
},
queryParamMap: of(convertToParamMap({})),
},
},
],
@@ -96,6 +98,39 @@ describe('IntegrationDetailComponent', () => {
expect(component.lastHealthResult?.checkedAt).toBe('2026-03-14T10:06:00Z');
});
it('renders namespaced action button classes for detail actions', () => {
const tabFixture = TestBed.createComponent(IntegrationDetailComponent);
const tabComponent = tabFixture.componentInstance;
tabComponent.activeTab = 'health';
tabFixture.detectChanges();
const buttons = Array.from(tabFixture.nativeElement.querySelectorAll('button')) as HTMLButtonElement[];
const testButton = buttons.find((button) => button.textContent?.includes('Test Connection'));
const healthButton = buttons.find((button) => button.textContent?.includes('Check Health'));
expect(testButton?.classList.contains('detail-btn')).toBeTrue();
expect(testButton?.classList.contains('detail-btn--primary')).toBeTrue();
expect(testButton?.classList.contains('btn-primary')).toBeFalse();
expect(healthButton?.classList.contains('detail-btn')).toBeTrue();
expect(healthButton?.classList.contains('detail-btn--secondary')).toBeTrue();
});
it('renders namespaced classes for credential actions', () => {
const tabFixture = TestBed.createComponent(IntegrationDetailComponent);
const tabComponent = tabFixture.componentInstance;
tabComponent.activeTab = 'credentials';
tabFixture.detectChanges();
const buttons = Array.from(tabFixture.nativeElement.querySelectorAll('button')) as HTMLButtonElement[];
const editButton = buttons.find((button) => button.textContent?.includes('Edit Integration'));
const deleteButton = buttons.find((button) => button.textContent?.includes('Delete Integration'));
expect(editButton?.classList.contains('detail-btn')).toBeTrue();
expect(editButton?.classList.contains('detail-btn--secondary')).toBeTrue();
expect(deleteButton?.classList.contains('detail-btn--danger')).toBeTrue();
});
describe('formatActor', () => {
it('returns system for null or undefined', () => {
expect(component.formatActor(null)).toBe('system');

View File

@@ -143,8 +143,8 @@ const HUB_DETAIL_TABS: StellaPageTab[] = [
<dd>Managed by integration owner workflow.</dd>
</dl>
<div class="settings-actions">
<button class="btn-secondary" (click)="editIntegration()">Edit Integration</button>
<button class="btn-danger" (click)="deleteIntegration()">Delete Integration</button>
<button class="detail-btn detail-btn--secondary" (click)="editIntegration()">Edit Integration</button>
<button class="detail-btn detail-btn--danger" (click)="deleteIntegration()">Delete Integration</button>
</div>
@if (deleteError()) {
<div class="delete-error" role="alert">
@@ -191,10 +191,10 @@ const HUB_DETAIL_TABS: StellaPageTab[] = [
<div class="tab-panel">
<h2>Health</h2>
<div class="health-actions">
<button class="btn-primary" (click)="testConnection()" [disabled]="testing">
<button class="detail-btn detail-btn--primary" (click)="testConnection()" [disabled]="testing">
{{ testing ? 'Testing...' : 'Test Connection' }}
</button>
<button class="btn-secondary" (click)="checkHealth()" [disabled]="checking">
<button class="detail-btn detail-btn--secondary" (click)="checkHealth()" [disabled]="checking">
{{ checking ? 'Checking...' : 'Check Health' }}
</button>
</div>
@@ -428,33 +428,62 @@ const HUB_DETAIL_TABS: StellaPageTab[] = [
color: var(--color-text-secondary);
}
.btn-primary, .btn-secondary, .btn-danger {
.detail-btn {
padding: 0.5rem 1rem;
border-radius: var(--radius-md);
font-size: 0.8125rem;
font-weight: 600;
line-height: 1.2;
border: 1px solid transparent;
cursor: pointer;
transition: all 150ms ease;
display: inline-flex;
align-items: center;
justify-content: center;
transition: background-color 150ms ease, color 150ms ease, border-color 150ms ease, box-shadow 150ms ease;
}
.btn-primary {
background: var(--color-brand-primary);
color: white;
.detail-btn:focus-visible {
outline: none;
box-shadow: 0 0 0 var(--focus-ring-width, 2px) var(--focus-ring-color, rgba(214, 158, 46, 0.35));
}
.btn-secondary {
background: var(--color-surface-secondary);
color: var(--color-text-primary);
border-color: var(--color-border-primary);
.detail-btn--primary {
background: var(--color-btn-primary-bg);
color: var(--color-btn-primary-text);
border-color: var(--color-btn-primary-border, transparent);
}
.btn-danger {
.detail-btn--primary:hover:not(:disabled) {
background: var(--color-btn-primary-bg-hover);
color: var(--color-btn-primary-text);
border-color: var(--color-btn-primary-border, transparent);
}
.detail-btn--secondary {
background: var(--color-btn-secondary-bg, transparent);
color: var(--color-btn-secondary-text, var(--color-text-primary));
border-color: var(--color-btn-secondary-border, var(--color-border-primary));
}
.detail-btn--secondary:hover:not(:disabled) {
background: var(--color-btn-secondary-hover-bg, var(--color-surface-secondary));
color: var(--color-btn-secondary-text, var(--color-text-primary));
border-color: var(--color-btn-secondary-hover-border, var(--color-btn-secondary-border, var(--color-border-primary)));
}
.detail-btn--danger {
background: var(--color-status-error, #B53525);
color: white;
color: #fff;
border-color: color-mix(in srgb, var(--color-status-error, #B53525) 82%, black 18%);
}
.btn-primary:disabled, .btn-secondary:disabled {
.detail-btn--danger:hover:not(:disabled) {
background: color-mix(in srgb, var(--color-status-error, #B53525) 88%, black 12%);
color: #fff;
border-color: color-mix(in srgb, var(--color-status-error, #B53525) 72%, black 28%);
}
.detail-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}

View File

@@ -51,7 +51,7 @@ describe('Integration Hub UI (integration_hub)', () => {
[IntegrationType.Scm, 3],
[IntegrationType.CiCd, 2],
[IntegrationType.RuntimeHost, 6],
[IntegrationType.RepoSource, 4],
[IntegrationType.SecretsManager, 4],
[IntegrationType.FeedMirror, 1],
]);