diff --git a/frontend/src/app/features/dependencies/dependency-list/dependency-list.component.html b/frontend/src/app/features/dependencies/dependency-list/dependency-list.component.html new file mode 100644 index 0000000..b06aab5 --- /dev/null +++ b/frontend/src/app/features/dependencies/dependency-list/dependency-list.component.html @@ -0,0 +1,85 @@ +
+
+

External Dependencies

+ +
+ +
+
+
+ + +
+ +
+ + +
+
+
+ +
Loading...
+
{{ error }}
+ +
+ + + + + + + + + + + + + + + + + + + + + +
NameTypeApplicationStatusValidity PeriodActions
{{ dep.name }}{{ dep.dependencyType.typeName }}{{ dep.application.name }} + + {{ getStatusLabel(dep.status) }} + + ({{ dep.daysUntilExpiration }} days) + + + +
+ {{ dep.validityStartDate ? (dep.validityStartDate | date:'mediumDate') : '-' }} + → + {{ dep.validityEndDate ? (dep.validityEndDate | date:'mediumDate') : 'Indefinite' }} +
+
-
+
+ + + +
+
+ +
+ No dependencies found. +
+ + +
\ No newline at end of file diff --git a/frontend/src/app/features/dependencies/dependency-list/dependency-list.component.scss b/frontend/src/app/features/dependencies/dependency-list/dependency-list.component.scss new file mode 100644 index 0000000..d36f0fe --- /dev/null +++ b/frontend/src/app/features/dependencies/dependency-list/dependency-list.component.scss @@ -0,0 +1,167 @@ +.container { + max-width: 1400px; + margin: 0 auto; + padding: 2rem; +} + +.header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1.5rem; + + h1 { margin: 0; } +} + +.filters { + background: white; + padding: 1.5rem; + border-radius: 8px; + margin-bottom: 1.5rem; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +.filter-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 1rem; +} + +.filter-group { + label { + display: block; + margin-bottom: 0.5rem; + font-weight: 500; + color: #555; + } + + .filter-select { + width: 100%; + padding: 0.75rem; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 1rem; + + &:focus { + outline: none; + border-color: #3f51b5; + } + } +} + +.btn-primary { + background-color: #3f51b5; + color: white; + border: none; + padding: 0.75rem 1.5rem; + border-radius: 4px; + cursor: pointer; + + &:hover { background-color: #303f9f; } +} + +.loading, .error, .empty { + text-align: center; + padding: 2rem; + color: #666; +} + +.error { color: #f44336; } + +.table-container { + overflow-x: auto; + background: white; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +table { + width: 100%; + border-collapse: collapse; + + th, td { + padding: 1rem; + text-align: left; + border-bottom: 1px solid #ddd; + } + + th { + background-color: #f5f5f5; + font-weight: 600; + } + + tbody tr:hover { background-color: #f9f9f9; } +} + +.status-badge { + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.875rem; + font-weight: 500; + + &.status-active { + background-color: #e8f5e9; + color: #388e3c; + } + + &.status-expiring { + background-color: #fff3e0; + color: #f57c00; + } + + &.status-expired { + background-color: #ffebee; + color: #c62828; + } + + &.status-not-valid { + background-color: #f5f5f5; + color: #616161; + } +} + +.actions { + display: flex; + gap: 0.5rem; +} + +.btn-sm { + padding: 0.5rem 1rem; + border: none; + border-radius: 4px; + cursor: pointer; + background-color: #2196f3; + color: white; + font-size: 0.875rem; + + &:hover { background-color: #1976d2; } + + &.btn-danger { + background-color: #f44336; + &:hover { background-color: #d32f2f; } + } +} + +.pagination { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + margin-top: 2rem; + + button { + padding: 0.5rem 1rem; + border: 1px solid #ddd; + border-radius: 4px; + background: white; + cursor: pointer; + + &:hover:not(:disabled) { background-color: #f5f5f5; } + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } + } + + span { color: #666; } +} \ No newline at end of file