Skip to content

Commit da9a643

Browse files
perryr16crutan
andauthored
Creates reusable seed-page component (#9)
* seed page component tab pages lint styles * titles * styles --------- Co-authored-by: Caleb Rutan <crutan@users.noreply.github.com>
1 parent 0360aa5 commit da9a643

37 files changed

+149
-328
lines changed

src/@seed/components/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ export * from './drawer'
44
export * from './loading-bar'
55
export * from './masonry'
66
export * from './navigation'
7+
export * from './page'

src/@seed/components/page/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './page.component'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<div class="flex min-w-0 flex-auto flex-col" *transloco="let t">
2+
<div
3+
class="bg-card flex flex-0 flex-col border-b p-6 sm:flex-row sm:items-center sm:justify-between sm:px-10 sm:py-8 dark:bg-transparent"
4+
>
5+
<div class="min-w-0 flex-1">
6+
<h2 class="truncate text-3xl font-extrabold capitalize leading-7 tracking-tight sm:leading-10 md:text-4xl">{{ config.title }}</h2>
7+
</div>
8+
<!-- Actions -->
9+
@if (config.action) {
10+
<div class="mt-6 flex shrink-0 items-center sm:ml-4 sm:mt-0">
11+
<a mat-flat-button color="primary" (click)="config.action()">
12+
<mat-icon class="icon-size-4" [svgIcon]="config.actionIcon"></mat-icon>
13+
<span class="ml-2">{{ config.actionText }}</span>
14+
</a>
15+
</div>
16+
}
17+
</div>
18+
<ng-content></ng-content>
19+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Component, Input } from '@angular/core'
2+
import { MatButtonModule } from '@angular/material/button'
3+
import { MatIconModule } from '@angular/material/icon'
4+
import { SharedImports } from '@seed/directives'
5+
import type { Config } from './page.types'
6+
7+
@Component({
8+
selector: 'seed-page',
9+
templateUrl: './page.component.html',
10+
imports: [MatButtonModule, MatIconModule, SharedImports],
11+
})
12+
export class PageComponent {
13+
@Input() config: Config
14+
}
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export type Config = {
2+
action?: () => void;
3+
actionIcon?: string;
4+
actionText?: string;
5+
title: string;
6+
}

src/app/modules/data/data.component.html

+3-17
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,4 @@
1-
<div class="flex min-w-0 flex-auto flex-col" *transloco="let t">
2-
<div
3-
class="bg-card flex flex-0 flex-col border-b p-6 sm:flex-row sm:items-center sm:justify-between sm:px-10 sm:py-8 dark:bg-transparent"
4-
>
5-
<div class="min-w-0 flex-1">
6-
<h2 class="truncate text-3xl font-extrabold capitalize leading-7 tracking-tight sm:leading-10 md:text-4xl">Data</h2>
7-
</div>
8-
<!-- Actions -->
9-
<div class="mt-6 flex shrink-0 items-center sm:ml-4 sm:mt-0">
10-
<a mat-flat-button color="primary">
11-
<mat-icon class="icon-size-4" svgIcon="fa-solid:plus"></mat-icon>
12-
<span class="ml-2">Create data set</span>
13-
</a>
14-
</div>
15-
</div>
16-
1+
<seed-page [config]="{ title: 'Data', action: createDataset, actionIcon: 'fa-solid:plus', actionText: 'Create Dataset' }">
172
<!-- Main -->
183
<div class="flex-auto pt-4 sm:pt-6">
194
<div class="mx-auto w-full max-w-screen-xl">
@@ -72,4 +57,5 @@ <h2 class="truncate text-3xl font-extrabold capitalize leading-7 tracking-tight
7257
</div>
7358
</div>
7459
</div>
75-
</div>
60+
<!-- </div> -->
61+
</seed-page>

src/app/modules/data/data.component.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ import { ActivatedRoute, Router } from '@angular/router'
99
import { from, skip } from 'rxjs'
1010
import type { Dataset } from '@seed/api/dataset'
1111
import { UserService } from '@seed/api/user'
12+
import { PageComponent } from '@seed/components'
1213
import { SharedImports } from '@seed/directives'
1314

1415
@Component({
1516
selector: 'seed-data',
1617
templateUrl: './data.component.html',
1718
encapsulation: ViewEncapsulation.None,
1819
changeDetection: ChangeDetectionStrategy.OnPush,
19-
imports: [DatePipe, MatButtonModule, MatIconModule, MatSortModule, MatTableModule, SharedImports],
20+
imports: [DatePipe, MatButtonModule, MatIconModule, MatSortModule, MatTableModule, PageComponent, SharedImports],
2021
})
2122
export class DataComponent implements OnInit, AfterViewInit {
2223
private _activatedRoute = inject(ActivatedRoute)
@@ -38,6 +39,10 @@ export class DataComponent implements OnInit, AfterViewInit {
3839
})
3940
}
4041

42+
createDataset(): void {
43+
console.log('create dataset')
44+
}
45+
4146
ngAfterViewInit(): void {
4247
this.datasetsDataSource.sort = this.sort()
4348
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<seed-page [config]="{ title: 'Access Level Tree' }">
2+
<div>Access Level Tree Content</div>
3+
</seed-page>
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import type { OnInit } from '@angular/core'
22
import { Component } from '@angular/core'
33
import { MatIconModule } from '@angular/material/icon'
4+
import { PageComponent } from '@seed/components'
45

56
@Component({
67
selector: 'seed-organizations-access-level-tree',
7-
templateUrl: './organizations-access-level-tree.component.html',
8-
imports: [MatIconModule],
8+
templateUrl: './access-level-tree.component.html',
9+
imports: [MatIconModule, PageComponent],
910
})
10-
export class OrganizationsAccessLevelTreeComponent implements OnInit {
11+
export class AccessLevelTreeComponent implements OnInit {
1112
ngOnInit(): void {
1213
console.log('organizations access level tree')
1314
}
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div class="flex min-w-0 flex-auto flex-col" *transloco="let t">
1+
<seed-page [config]="{ title: 'Column Mappings' }" *transloco="let t">
22
<div class="flex space-x-1">
33
@for (tab of tabs; track tab) {
44
<div
@@ -17,4 +17,4 @@
1717
<div class="z-1 -mt-px flex-auto border-t pt-4 sm:pt-6">
1818
<div class="mx-auto w-full max-w-screen-xl">{{ t(type) }} column mappings table</div>
1919
</div>
20-
</div>
20+
</seed-page>
+4-3
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ import { NgClass } from '@angular/common'
22
import type { OnInit } from '@angular/core'
33
import { Component, inject, ViewEncapsulation } from '@angular/core'
44
import { ActivatedRoute, Router } from '@angular/router'
5+
import { PageComponent } from '@seed/components'
56
import { SharedImports } from '@seed/directives'
67
import type { OrganizationTab } from '../organizations.types'
78

89
@Component({
910
selector: 'seed-organizations-column-mappings',
10-
templateUrl: './organizations-column-mappings.component.html',
11+
templateUrl: './column-mappings.component.html',
1112
encapsulation: ViewEncapsulation.None,
12-
imports: [NgClass, SharedImports],
13+
imports: [NgClass, PageComponent, SharedImports],
1314
})
14-
export class OrganizationsColumnMappingsComponent implements OnInit {
15+
export class ColumnMappingsComponent implements OnInit {
1516
private _route = inject(ActivatedRoute)
1617
private _router = inject(Router)
1718

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div class="flex min-w-0 flex-auto flex-col" *transloco="let t">
1+
<seed-page [config]="{ title: 'Column Settings' }" *transloco="let t">
22
<div class="flex space-x-1">
33
@for (tab of tabs; track tab) {
44
<div
@@ -17,4 +17,4 @@
1717
<div class="z-1 -mt-px flex-auto border-t pt-4 sm:pt-6">
1818
<div class="mx-auto w-full max-w-screen-xl">{{ t(type) }} column settings table</div>
1919
</div>
20-
</div>
20+
</seed-page>
+4-3
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ import { NgClass } from '@angular/common'
22
import type { OnInit } from '@angular/core'
33
import { Component, inject, ViewEncapsulation } from '@angular/core'
44
import { ActivatedRoute, Router } from '@angular/router'
5+
import { PageComponent } from '@seed/components'
56
import { SharedImports } from '@seed/directives'
67
import type { InventoryType } from '../../inventory/inventory.types'
78

89
@Component({
910
selector: 'seed-organizations-column-settings',
10-
templateUrl: './organizations-column-settings.component.html',
11+
templateUrl: './column-settings.component.html',
1112
encapsulation: ViewEncapsulation.None,
12-
imports: [NgClass, SharedImports],
13+
imports: [NgClass, PageComponent, SharedImports],
1314
})
14-
export class OrganizationsColumnSettingsComponent implements OnInit {
15+
export class ColumnSettingsComponent implements OnInit {
1516
private _route = inject(ActivatedRoute)
1617
private _router = inject(Router)
1718

src/app/modules/organizations/cycles/cycles.component.html

+3-16
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,4 @@
1-
<div class="flex min-w-0 flex-auto flex-col" *transloco="let t">
2-
<div
3-
class="bg-card flex flex-0 flex-col border-b p-6 sm:flex-row sm:items-center sm:justify-between sm:px-10 sm:py-8 dark:bg-transparent"
4-
>
5-
<div class="min-w-0 flex-1">
6-
<h2 class="truncate text-3xl font-extrabold capitalize leading-7 tracking-tight sm:leading-10 md:text-4xl">Cycles</h2>
7-
</div>
8-
<!-- Actions -->
9-
<div class="mt-6 flex shrink-0 items-center sm:ml-4 sm:mt-0">
10-
<a mat-flat-button color="primary" (click)="createCycle()">
11-
<mat-icon class="icon-size-4" svgIcon="fa-solid:plus"></mat-icon>
12-
<span class="ml-2">Create cycle</span>
13-
</a>
14-
</div>
15-
</div>
1+
<seed-page [config]="{ title: 'Cycles', action: createCycle, actionIcon: 'fa-solid:plus', actionText: 'Create Cycle' }" title="Cycles">
162
<!-- Cycles Table -->
173
<div class="flex-auto pt-4 sm:pt-6">
184
<div class="mx-auto w-full max-w-screen-xl">
@@ -63,4 +49,5 @@ <h2 class="truncate text-3xl font-extrabold capitalize leading-7 tracking-tight
6349
</div>
6450
</div>
6551
</div>
66-
</div>
52+
<!-- </div> -->
53+
</seed-page>

src/app/modules/organizations/cycles/cycles.component.ts

+14-3
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,31 @@ import { MatIconModule } from '@angular/material/icon'
77
import { MatTableDataSource, MatTableModule } from '@angular/material/table'
88
import type { Cycle, CyclesResponse } from '@seed/api/cycle'
99
import { CycleService } from '@seed/api/cycle/cycle.service'
10+
import { PageComponent } from '@seed/components'
1011
import { SharedImports } from '@seed/directives'
1112
import { DeleteModalComponent } from './modal/delete-modal.component'
1213
import { FormModalComponent } from './modal/form-modal.component'
1314

1415
@Component({
1516
selector: 'seed-organizations-cycles',
1617
templateUrl: './cycles.component.html',
17-
imports: [MatButtonModule, MatDialogModule, MatIconModule, MatTableModule, CommonModule, SharedImports],
18+
imports: [
19+
CommonModule,
20+
MatButtonModule,
21+
MatDialogModule,
22+
MatIconModule,
23+
MatTableModule,
24+
PageComponent,
25+
SharedImports,
26+
],
1827
})
19-
export class OrganizationsCyclesComponent implements OnInit {
28+
export class CyclesComponent implements OnInit {
2029
private _cycleService = inject(CycleService)
2130
private _dialog = inject(MatDialog)
2231
private _orgId: number
2332
private _existingNames: string[]
2433

34+
// actionConfig: { action: () => void; icon: string; text: string }
2535
cyclesDataSource = new MatTableDataSource<Cycle>([])
2636
cyclesColumns = ['id', 'name', 'start', 'end', 'actions']
2737

@@ -39,7 +49,8 @@ export class OrganizationsCyclesComponent implements OnInit {
3949
})
4050
}
4151

42-
createCycle(): void {
52+
createCycle = () => {
53+
// createCycle(): void {
4354
const dialogRef = this._dialog.open(FormModalComponent, {
4455
width: '40rem',
4556
data: { cycle: null, orgId: this._orgId, existingNames: this._existingNames },
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div class="flex min-w-0 flex-auto flex-col" *transloco="let t">
1+
<seed-page [config]="{ title: 'Data Quality' }" *transloco="let t">
22
<div class="flex space-x-1">
33
@for (tab of tabs; track tab) {
44
<div
@@ -17,4 +17,4 @@
1717
<div class="z-1 -mt-px flex-auto border-t pt-4 sm:pt-6">
1818
<div class="mx-auto w-full max-w-screen-xl">{{ t(type) }} table</div>
1919
</div>
20-
</div>
20+
</seed-page>
+4-3
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ import { NgClass } from '@angular/common'
22
import type { OnInit } from '@angular/core'
33
import { Component, inject, ViewEncapsulation } from '@angular/core'
44
import { ActivatedRoute, Router } from '@angular/router'
5+
import { PageComponent } from '@seed/components'
56
import { SharedImports } from '@seed/directives'
67
import type { OrganizationTab } from '../organizations.types'
78

89
@Component({
910
selector: 'seed-organizations-data-quality',
10-
templateUrl: './organizations-data-quality.component.html',
11+
templateUrl: './data-quality.component.html',
1112
encapsulation: ViewEncapsulation.None,
12-
imports: [NgClass, SharedImports],
13+
imports: [NgClass, PageComponent, SharedImports],
1314
})
14-
export class OrganizationsDataQualityComponent implements OnInit {
15+
export class DataQualityComponent implements OnInit {
1516
private _route = inject(ActivatedRoute)
1617
private _router = inject(Router)
1718

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div class="flex min-w-0 flex-auto flex-col" *transloco="let t">
1+
<seed-page [config]="{ title: 'Derived Columns' }" *transloco="let t">
22
<div class="flex space-x-1">
33
@for (tab of tabs; track tab) {
44
<div
@@ -17,4 +17,4 @@
1717
<div class="z-1 -mt-px flex-auto border-t pt-4 sm:pt-6">
1818
<div class="mx-auto w-full max-w-screen-xl">{{ t(type) }} derived columns table</div>
1919
</div>
20-
</div>
20+
</seed-page>
+4-3
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ import { NgClass } from '@angular/common'
22
import type { OnInit } from '@angular/core'
33
import { Component, inject, ViewEncapsulation } from '@angular/core'
44
import { ActivatedRoute, Router } from '@angular/router'
5+
import { PageComponent } from '@seed/components'
56
import { SharedImports } from '@seed/directives'
67
import type { InventoryType } from '../../inventory/inventory.types'
78

89
@Component({
910
selector: 'seed-organizations-derived-columns',
10-
templateUrl: './organizations-derived-columns.component.html',
11+
templateUrl: './derived-columns.component.html',
1112
encapsulation: ViewEncapsulation.None,
12-
imports: [NgClass, SharedImports],
13+
imports: [NgClass, PageComponent, SharedImports],
1314
})
14-
export class OrganizationsDerivedColumnsComponent implements OnInit {
15+
export class DerivedColumnsComponent implements OnInit {
1516
private _route = inject(ActivatedRoute)
1617
private _router = inject(Router)
1718

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<seed-page [config]="{ title: 'Email Templates' }">
2+
<div>Email Templates Content</div>
3+
</seed-page>
+4-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import type { OnInit } from '@angular/core'
22
import { Component } from '@angular/core'
3+
import { PageComponent } from '@seed/components'
34

45
@Component({
56
selector: 'seed-organizations-email-templates',
6-
templateUrl: './organizations-email-templates.component.html',
7+
templateUrl: './email-templates.component.html',
8+
imports: [PageComponent],
79
})
8-
export class OrganizationsEmailTemplatesComponent implements OnInit {
10+
export class EmailTemplatesComponent implements OnInit {
911
ngOnInit(): void {
1012
console.log('organizations email templates')
1113
}
+8-10
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
export * from './organizations-access-level-tree/organizations-access-level-tree.component'
2-
export * from './organizations-column-mappings/organizations-column-mappings.component'
3-
export * from './organizations-column-settings/organizations-column-settings.component'
1+
export * from './access-level-tree/access-level-tree.component'
2+
export * from './column-mappings/column-mappings.component'
3+
export * from './column-settings/column-settings.component'
44
export * from './cycles/cycles.component'
5-
export * from './organizations-data-quality/organizations-data-quality.component'
6-
export * from './organizations-derived-columns/organizations-derived-columns.component'
7-
export * from './organizations-email-templates/organizations-email-templates.component'
8-
export * from './organizations-labels/organizations-labels.component'
9-
export * from './organizations-members/organizations-members.component'
10-
export * from './organizations-list/organizations-list.component'
11-
export * from './organizations-nav/organizations-nav.component'
5+
export * from './data-quality/data-quality.component'
6+
export * from './derived-columns/derived-columns.component'
7+
export * from './email-templates/email-templates.component'
8+
export * from './labels/labels.component'
9+
export * from './members/members.component'
1210
export * from './settings/settings.component'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<seed-page [config]="{ title: 'Labels' }">
2+
<div>Labels Content</div>
3+
</seed-page>

src/app/modules/organizations/organizations-labels/organizations-labels.component.ts src/app/modules/organizations/labels/labels.component.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import type { OnInit } from '@angular/core'
22
import { Component } from '@angular/core'
33
import { MatIconModule } from '@angular/material/icon'
4+
import { PageComponent } from '@seed/components'
45

56
@Component({
67
selector: 'seed-organizations-labels',
7-
templateUrl: './organizations-labels.component.html',
8-
imports: [MatIconModule],
8+
templateUrl: './labels.component.html',
9+
imports: [PageComponent, MatIconModule],
910
})
10-
export class OrganizationsLabelsComponent implements OnInit {
11+
export class LabelsComponent implements OnInit {
1112
ngOnInit(): void {
1213
console.log('organizations labels')
1314
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<seed-page [config]="{ title: 'Members' }">
2+
<div>Members Content</div>
3+
</seed-page>

0 commit comments

Comments
 (0)