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:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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');
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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],
|
||||
]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user