From e4783bc64e7aec0d30fa79e8d35448f239ee1173 Mon Sep 17 00:00:00 2001 From: tanshu Date: Tue, 19 Jan 2021 08:16:02 +0530 Subject: [PATCH] Compliance list done. Except for the cleanup of the hearing import data, This is the first version. --- DB/import.sh | 5 ++ .../versions/74058d75b7a0_initial_commit.py | 15 ++-- luthor/luthor/main.py | 2 + luthor/luthor/models/case.py | 10 +-- luthor/luthor/models/hearing.py | 6 +- luthor/luthor/routers/case.py | 2 +- luthor/luthor/routers/cause_list.py | 3 +- luthor/luthor/routers/compliance_list.py | 66 ++++++++++++++++++ luthor/luthor/schemas/compliance_list.py | 45 ++++++++++++ otis/src/app/app-routing.module.ts | 5 ++ .../app/cause-list/cause-list.component.html | 10 +-- .../app/cause-list/cause-list.component.ts | 1 - .../compliance-list-datasource.ts | 42 ++++++++++++ .../compliance-list/compliance-list-item.ts | 20 ++++++ .../compliance-list-resolver.service.spec.ts | 15 ++++ .../compliance-list-resolver.service.ts | 18 +++++ .../compliance-list-routing.module.spec.ts | 13 ++++ .../compliance-list-routing.module.ts | 29 ++++++++ .../compliance-list.component.css | 0 .../compliance-list.component.html | 68 +++++++++++++++++++ .../compliance-list.component.spec.ts | 22 ++++++ .../compliance-list.component.ts | 58 ++++++++++++++++ .../compliance-list.module.spec.ts | 13 ++++ .../compliance-list/compliance-list.module.ts | 63 +++++++++++++++++ .../compliance-list.service.spec.ts | 15 ++++ .../compliance-list.service.ts | 28 ++++++++ .../app/compliance-list/compliance-list.ts | 12 ++++ otis/src/app/nav-bar/nav-bar.component.html | 1 + 28 files changed, 561 insertions(+), 26 deletions(-) create mode 100644 luthor/luthor/routers/compliance_list.py create mode 100644 luthor/luthor/schemas/compliance_list.py create mode 100644 otis/src/app/compliance-list/compliance-list-datasource.ts create mode 100644 otis/src/app/compliance-list/compliance-list-item.ts create mode 100644 otis/src/app/compliance-list/compliance-list-resolver.service.spec.ts create mode 100644 otis/src/app/compliance-list/compliance-list-resolver.service.ts create mode 100644 otis/src/app/compliance-list/compliance-list-routing.module.spec.ts create mode 100644 otis/src/app/compliance-list/compliance-list-routing.module.ts create mode 100644 otis/src/app/compliance-list/compliance-list.component.css create mode 100644 otis/src/app/compliance-list/compliance-list.component.html create mode 100644 otis/src/app/compliance-list/compliance-list.component.spec.ts create mode 100644 otis/src/app/compliance-list/compliance-list.component.ts create mode 100644 otis/src/app/compliance-list/compliance-list.module.spec.ts create mode 100644 otis/src/app/compliance-list/compliance-list.module.ts create mode 100644 otis/src/app/compliance-list/compliance-list.service.spec.ts create mode 100644 otis/src/app/compliance-list/compliance-list.service.ts create mode 100644 otis/src/app/compliance-list/compliance-list.ts diff --git a/DB/import.sh b/DB/import.sh index 52e958e..23011e8 100755 --- a/DB/import.sh +++ b/DB/import.sh @@ -30,3 +30,8 @@ docker run -it -v /home/tanshu/Programming/luthor/DB/csv:/mnt --link postgres:db sed -i 's/\x0//g' /home/tanshu/Programming/luthor/DB/csv/o-hearings.csv docker run -it -v /home/tanshu/Programming/luthor/DB/csv:/mnt --link postgres:db --rm --env PGPASSWORD="123456" postgres:alpine bash -c 'psql -h db -U postgres luthor -c "\copy hearings(old_id, old_case_id, bench, proceedings, next_hearing_date, old_court_status_id, court_number, item_number) from /mnt/o-hearings.csv with delimiter E'\''\t'\'' null as '\'''\''"' alembic upgrade 87a06eaadd34 + +# To filter out bad hearings which will now not import +# select cs.name, c.office_file_number, ch.next_hearing_date from (select case_id, next_hearing_date from hearings group by case_id, next_hearing_date having count(*) > 1) as ch inner join cases c on ch.case_id = c.id inner join case_sources cs on c.case_source_id = cs.id order by next_hearing_date desc; +# Temp fix to delete hearings +# delete from hearings where next_hearing_date is null; \ No newline at end of file diff --git a/luthor/alembic/versions/74058d75b7a0_initial_commit.py b/luthor/alembic/versions/74058d75b7a0_initial_commit.py index 9dbed22..ef1aee2 100644 --- a/luthor/alembic/versions/74058d75b7a0_initial_commit.py +++ b/luthor/alembic/versions/74058d75b7a0_initial_commit.py @@ -172,16 +172,16 @@ def upgrade(): sa.Column("year", sa.Unicode(length=255), nullable=False), sa.Column("title", sa.Unicode(length=255), nullable=True), sa.Column("docket_number", sa.Unicode(length=255), nullable=True), - sa.Column("receipt_date", sa.DateTime(), nullable=True), - sa.Column("limitation_date", sa.DateTime(), nullable=True), - sa.Column("filing_date", sa.DateTime(), nullable=True), + sa.Column("receipt_date", sa.Date(), nullable=True), + sa.Column("limitation_date", sa.Date(), nullable=True), + sa.Column("filing_date", sa.Date(), nullable=True), sa.Column("appear_on_behalf_of", sa.Unicode(length=255), nullable=True), sa.Column("question_of_law", sa.Unicode(length=4000), nullable=True), sa.Column("aor_name", sa.Unicode(length=255), nullable=True), sa.Column("opposing_council_aor", sa.Unicode(length=255), nullable=True), sa.Column("opposing_council_detail", sa.Unicode(length=255), nullable=True), sa.Column("lower_court_case_number", sa.Unicode(length=2000), nullable=True), - sa.Column("date_of_impugned_judgement", sa.DateTime(), nullable=True), + sa.Column("date_of_impugned_judgement", sa.Date(), nullable=True), sa.Column("brief_description", sa.Unicode(length=10000), nullable=True), sa.Column("remarks", sa.Unicode(length=10000), nullable=True), sa.Column("slp_counter", sa.Unicode(length=255), nullable=True), @@ -255,8 +255,9 @@ def upgrade(): sa.Column("item_number", sa.Unicode(length=255), nullable=True), sa.Column("bench", sa.Unicode(length=255), nullable=True), sa.Column("proceedings", sa.Unicode(length=2000), nullable=True), - sa.Column("compliance_date", sa.DateTime(), nullable=True), - sa.Column("next_hearing_date", sa.DateTime(), nullable=False), + sa.Column("compliance_date", sa.Date(), nullable=True), + # sa.Column("next_hearing_date", sa.Date(), nullable=False), + sa.Column("next_hearing_date", sa.Date(), nullable=True), sa.Column("court_status_id", postgresql.UUID(as_uuid=True), nullable=True), sa.Column("old_court_status_id", sa.Integer(), nullable=True), sa.ForeignKeyConstraint(["case_id"], ["cases.id"], name=op.f("fk_hearings_case_id_cases")), @@ -264,7 +265,7 @@ def upgrade(): ["court_status_id"], ["court_statuses.id"], name=op.f("fk_hearings_court_status_id_court_statuses") ), sa.PrimaryKeyConstraint("id", name=op.f("pk_hearings")), - sa.UniqueConstraint("next_hearing_date", "case_id", name=op.f("uq_hearings_next_hearing_date")), + # sa.UniqueConstraint("next_hearing_date", "case_id", name=op.f("uq_hearings_next_hearing_date")), ) op.create_index(op.f("ix_hearings_case_id"), "hearings", ["case_id"], unique=False) op.create_index(op.f("ix_hearings_next_hearing_date"), "hearings", ["next_hearing_date"], unique=False) diff --git a/luthor/luthor/main.py b/luthor/luthor/main.py index 7732372..87886f5 100644 --- a/luthor/luthor/main.py +++ b/luthor/luthor/main.py @@ -13,6 +13,7 @@ from .routers import ( case_source, case_type, cause_list, + compliance_list, contact, court, court_status, @@ -43,6 +44,7 @@ app.include_router(cause_list.router, prefix="/api/cause-list", tags=["cases"]) app.include_router(case.router, prefix="/api/cases", tags=["cases"]) app.include_router(case_source.router, prefix="/api/case-sources", tags=["case-sources"]) app.include_router(case_type.router, prefix="/api/case-types", tags=["case-types"]) +app.include_router(compliance_list.router, prefix="/api/compliance-list", tags=["cases"]) app.include_router(contact.router, prefix="/api/contacts", tags=["contacts"]) app.include_router(court.router, prefix="/api/courts", tags=["courts"]) app.include_router(court_status.router, prefix="/api/court-statuses", tags=["court-status"]) diff --git a/luthor/luthor/models/case.py b/luthor/luthor/models/case.py index 98d9c5a..4c02799 100644 --- a/luthor/luthor/models/case.py +++ b/luthor/luthor/models/case.py @@ -1,7 +1,7 @@ import uuid from luthor.models.hearing import Hearing -from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Unicode, desc, text +from sqlalchemy import Boolean, Column, Date, ForeignKey, Unicode, desc, text from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from sqlalchemy.sql import expression @@ -20,16 +20,16 @@ class Case(Base): year = Column("year", Unicode(255), nullable=False, unique=True) title = Column("title", Unicode(255), nullable=False, unique=True) docket_number = Column("docket_number", Unicode(255), nullable=False, unique=True) - receipt_date = Column("receipt_date", DateTime, nullable=False, index=True) - limitation_date = Column("limitation_date", DateTime, nullable=False, index=True) - filing_date = Column("filing_date", DateTime, nullable=False, index=True) + receipt_date = Column("receipt_date", Date, nullable=False, index=True) + limitation_date = Column("limitation_date", Date, nullable=False, index=True) + filing_date = Column("filing_date", Date, nullable=False, index=True) appear_on_behalf_of = Column("appear_on_behalf_of", Unicode(255), nullable=False, unique=True) question_of_law = Column("question_of_law", Unicode(255), nullable=False, unique=True) aor_name = Column("aor_name", Unicode(255), nullable=False, unique=True) opposing_council_aor = Column("opposing_council_aor", Unicode(255), nullable=False, unique=True) opposing_council_detail = Column("opposing_council_detail", Unicode(255), nullable=False) lower_court_case_number = Column("lower_court_case_number", Unicode(255), nullable=False, unique=True) - date_of_impugned_judgement = Column("date_of_impugned_judgement", DateTime, nullable=False, index=True) + date_of_impugned_judgement = Column("date_of_impugned_judgement", Date, nullable=False, index=True) brief_description = Column("brief_description", Unicode(255), nullable=False, unique=True) remarks = Column("remarks", Unicode(255), nullable=False, unique=True) slp_counter = Column("slp_counter", Unicode(255), nullable=False, unique=True) diff --git a/luthor/luthor/models/hearing.py b/luthor/luthor/models/hearing.py index 059f9fe..27b542b 100644 --- a/luthor/luthor/models/hearing.py +++ b/luthor/luthor/models/hearing.py @@ -1,6 +1,6 @@ import uuid -from sqlalchemy import Column, DateTime, ForeignKey, Unicode, text +from sqlalchemy import Column, Date, ForeignKey, Unicode, text from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship @@ -24,8 +24,8 @@ class Hearing(Base): item_number = Column("item_number", Unicode(255), nullable=False, unique=True) bench = Column("bench", Unicode(255), nullable=False, unique=True) proceedings = Column("proceedings", Unicode(255), nullable=False, unique=True) - next_hearing_date = Column("next_hearing_date", DateTime, nullable=False, index=True) - compliance_date = Column("compliance_date", DateTime, nullable=False, index=True) + next_hearing_date = Column("next_hearing_date", Date, nullable=False, index=True) + compliance_date = Column("compliance_date", Date, nullable=False, index=True) court_status_id = Column("court_status_id", UUID(as_uuid=True), ForeignKey("court_statuses.id"), nullable=True) court_status = relationship("CourtStatus", back_populates="hearings") diff --git a/luthor/luthor/routers/case.py b/luthor/luthor/routers/case.py index 4f72f70..10ca369 100644 --- a/luthor/luthor/routers/case.py +++ b/luthor/luthor/routers/case.py @@ -259,7 +259,7 @@ def case_info(item: Case) -> schemas.Case: title=item.title if item.title is not None else "", docketNumber=item.docket_number if item.docket_number is not None else "", receiptDate=item.receipt_date, - limitation_date=item.limitation_date, + limitationDate=item.limitation_date, filingDate=item.filing_date, appearOnBehalfOf=item.appear_on_behalf_of if item.appear_on_behalf_of is not None else "", questionOfLaw=item.question_of_law if item.question_of_law is not None else "", diff --git a/luthor/luthor/routers/cause_list.py b/luthor/luthor/routers/cause_list.py index 2fe7748..eea8eac 100644 --- a/luthor/luthor/routers/cause_list.py +++ b/luthor/luthor/routers/cause_list.py @@ -3,7 +3,7 @@ from datetime import date, datetime import luthor.schemas.case as schemas import luthor.schemas.cause_list as cl_schemas -from fastapi import APIRouter, Depends, Request, Security +from fastapi import APIRouter, Depends, Security from luthor.models.hearing import Hearing from sqlalchemy.orm import Session @@ -27,7 +27,6 @@ def get_db(): @router.get("", response_model=cl_schemas.CauseList) def report_blank( - request: Request, s: str = None, f: str = None, db: Session = Depends(get_db), diff --git a/luthor/luthor/routers/compliance_list.py b/luthor/luthor/routers/compliance_list.py new file mode 100644 index 0000000..29fb33d --- /dev/null +++ b/luthor/luthor/routers/compliance_list.py @@ -0,0 +1,66 @@ +from datetime import date, datetime +from typing import List + +import luthor.schemas.compliance_list as schemas + +from fastapi import APIRouter, Depends, Security +from luthor.models.hearing import Hearing +from sqlalchemy.orm import Session + +from ..core.security import get_current_active_user as get_user +from ..db.session import SessionLocal +from ..models.case import Case +from ..schemas.user_token import UserToken + + +router = APIRouter() + + +# Dependency +def get_db(): + try: + db = SessionLocal() + yield db + finally: + db.close() + + +@router.get("", response_model=schemas.ComplianceList) +def report_blank( + d: str = None, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["cases"]), +) -> schemas.ComplianceList: + d = date.today() if d is None else datetime.strptime(d, "%d-%b-%Y").date() + return schemas.ComplianceList( + date=d, + items=get_items(d, db), + ) + + +def get_items(d: date, db: Session) -> List[schemas.ComplianceListItem]: + items = [ + case_info(item, d) + for item in db.query(Case) + .join(Case.hearings) + .filter(Hearing.compliance_date >= d) + .order_by(Hearing.compliance_date) + .all() + ] + return [item for sublist in items for item in sublist] + + +def case_info(item: Case, date_: date) -> List[schemas.ComplianceListItem]: + return [ + schemas.ComplianceListItem( + id=item.id, + officeFileNumber=f"{item.case_source.prefix}-{item.office_file_number}", + courtNumber=h.court_number if h.court_number is not None else "", + itemNumber=h.item_number if h.item_number is not None else "", + title=item.title, + proceedings=h.proceedings if h.proceedings is not None else "", + complianceDate=h.compliance_date, + ) + for h in item.hearings + if h.compliance_date is not None and h.compliance_date >= date_ + ] diff --git a/luthor/luthor/schemas/compliance_list.py b/luthor/luthor/schemas/compliance_list.py new file mode 100644 index 0000000..e09fb16 --- /dev/null +++ b/luthor/luthor/schemas/compliance_list.py @@ -0,0 +1,45 @@ +import uuid + +from datetime import date, datetime +from typing import List + +from pydantic import BaseModel, validator + +from . import to_camel + + +class ComplianceListItem(BaseModel): + id_: uuid.UUID + office_file_number: str + court_number: str + item_number: str + title: str + proceedings: str + compliance_date: date + + class Config: + anystr_strip_whitespace = True + alias_generator = to_camel + json_encoders = {date: lambda v: v.strftime("%d-%b-%Y")} + + @validator("compliance_date", pre=True) + def parse_compliance_date(cls, value): + if isinstance(value, date): + return value + return datetime.strptime(value, "%d-%b-%Y").date() + + +class ComplianceList(BaseModel): + date_: date + items: List[ComplianceListItem] + + class Config: + anystr_strip_whitespace = True + alias_generator = to_camel + json_encoders = {date: lambda v: v.strftime("%d-%b-%Y")} + + @validator("date_", pre=True) + def parse_date(cls, value): + if isinstance(value, date): + return value + return datetime.strptime(value, "%d-%b-%Y").date() diff --git a/otis/src/app/app-routing.module.ts b/otis/src/app/app-routing.module.ts index ce83e4c..109ef59 100644 --- a/otis/src/app/app-routing.module.ts +++ b/otis/src/app/app-routing.module.ts @@ -30,6 +30,11 @@ const routes: Routes = [ path: 'cases', loadChildren: () => import('./cases/cases.module').then((mod) => mod.CasesModule), }, + { + path: 'compliance-list', + loadChildren: () => + import('./compliance-list/compliance-list.module').then((mod) => mod.ComplianceListModule), + }, { path: 'contacts', loadChildren: () => import('./contacts/contacts.module').then((mod) => mod.ContactsModule), diff --git a/otis/src/app/cause-list/cause-list.component.html b/otis/src/app/cause-list/cause-list.component.html index 40307cc..a16fb5f 100644 --- a/otis/src/app/cause-list/cause-list.component.html +++ b/otis/src/app/cause-list/cause-list.component.html @@ -1,10 +1,6 @@ Cases - - add_box - Add -
@@ -15,7 +11,7 @@ fxLayoutGap.lt-md="0px" fxLayoutAlign="space-around start" > - + - + - + diff --git a/otis/src/app/cause-list/cause-list.component.ts b/otis/src/app/cause-list/cause-list.component.ts index fe99048..e7418ef 100644 --- a/otis/src/app/cause-list/cause-list.component.ts +++ b/otis/src/app/cause-list/cause-list.component.ts @@ -49,7 +49,6 @@ export class CauseListComponent implements OnInit { const data = value as { info: CauseList }; this.info = data.info; - console.log(this.info.cases); this.form.setValue({ startDate: moment(this.info.startDate, 'DD-MMM-YYYY').toDate(), finishDate: moment(this.info.finishDate, 'DD-MMM-YYYY').toDate(), diff --git a/otis/src/app/compliance-list/compliance-list-datasource.ts b/otis/src/app/compliance-list/compliance-list-datasource.ts new file mode 100644 index 0000000..da269fd --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list-datasource.ts @@ -0,0 +1,42 @@ +import { DataSource } from '@angular/cdk/collections'; +import { EventEmitter } from '@angular/core'; +import { MatPaginator, PageEvent } from '@angular/material/paginator'; +import { merge, Observable, of as observableOf } from 'rxjs'; +import { map, tap } from 'rxjs/operators'; + +import { ComplianceListItem } from './compliance-list-item'; + +export class ComplianceListDatasource extends DataSource { + constructor(public data: ComplianceListItem[], private paginator?: MatPaginator) { + super(); + } + + connect(): Observable { + const dataMutations: (Observable | EventEmitter)[] = [ + observableOf(this.data), + ]; + if (this.paginator) { + dataMutations.push((this.paginator as MatPaginator).page); + } + + return merge(...dataMutations) + .pipe( + tap((x: ComplianceListItem[]) => { + if (this.paginator) { + this.paginator.length = x.length; + } + }), + ) + .pipe(map((x: ComplianceListItem[]) => this.getPagedData(this.data))); + } + + disconnect() {} + + private getPagedData(data: ComplianceListItem[]) { + if (this.paginator === undefined) { + return data; + } + const startIndex = this.paginator.pageIndex * this.paginator.pageSize; + return data.slice(startIndex, startIndex + this.paginator.pageSize); + } +} diff --git a/otis/src/app/compliance-list/compliance-list-item.ts b/otis/src/app/compliance-list/compliance-list-item.ts new file mode 100644 index 0000000..78e07c0 --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list-item.ts @@ -0,0 +1,20 @@ +export class ComplianceListItem { + id: string; + officeFileNumber: string; + courtNumber: string; + itemNumber: string; + title: string; + proceedings: string; + complianceDate: string; + + public constructor(init?: Partial) { + this.id = ''; + this.officeFileNumber = ''; + this.courtNumber = ''; + this.itemNumber = ''; + this.title = ''; + this.proceedings = ''; + this.complianceDate = ''; + Object.assign(this, init); + } +} diff --git a/otis/src/app/compliance-list/compliance-list-resolver.service.spec.ts b/otis/src/app/compliance-list/compliance-list-resolver.service.spec.ts new file mode 100644 index 0000000..90a5d41 --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list-resolver.service.spec.ts @@ -0,0 +1,15 @@ +import { inject, TestBed } from '@angular/core/testing'; + +import { ComplianceListResolver } from './compliance-list-resolver.service'; + +describe('ComplianceListResolverService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ComplianceListResolver], + }); + }); + + it('should be created', inject([ComplianceListResolver], (service: ComplianceListResolver) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/otis/src/app/compliance-list/compliance-list-resolver.service.ts b/otis/src/app/compliance-list/compliance-list-resolver.service.ts new file mode 100644 index 0000000..73412ae --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list-resolver.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; +import { Observable } from 'rxjs/internal/Observable'; + +import { ComplianceList } from './compliance-list'; +import { ComplianceListService } from './compliance-list.service'; + +@Injectable({ + providedIn: 'root', +}) +export class ComplianceListResolver implements Resolve { + constructor(private ser: ComplianceListService) {} + + resolve(route: ActivatedRouteSnapshot): Observable { + const date = route.queryParamMap.get('date') || null; + return this.ser.list(date); + } +} diff --git a/otis/src/app/compliance-list/compliance-list-routing.module.spec.ts b/otis/src/app/compliance-list/compliance-list-routing.module.spec.ts new file mode 100644 index 0000000..944e8e0 --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list-routing.module.spec.ts @@ -0,0 +1,13 @@ +import { ComplianceListRoutingModule } from './compliance-list-routing.module'; + +describe('ComplianceListRoutingModule', () => { + let complianceListRoutingModule: ComplianceListRoutingModule; + + beforeEach(() => { + complianceListRoutingModule = new ComplianceListRoutingModule(); + }); + + it('should create an instance', () => { + expect(complianceListRoutingModule).toBeTruthy(); + }); +}); diff --git a/otis/src/app/compliance-list/compliance-list-routing.module.ts b/otis/src/app/compliance-list/compliance-list-routing.module.ts new file mode 100644 index 0000000..2e34895 --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list-routing.module.ts @@ -0,0 +1,29 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { AuthGuard } from '../auth/auth-guard.service'; + +import { ComplianceListResolver } from './compliance-list-resolver.service'; +import { ComplianceListComponent } from './compliance-list.component'; +const advocatesRoutes: Routes = [ + { + path: '', + component: ComplianceListComponent, + canActivate: [AuthGuard], + data: { + permission: 'Cases', + }, + resolve: { + info: ComplianceListResolver, + }, + runGuardsAndResolvers: 'always', + }, +]; + +@NgModule({ + imports: [CommonModule, RouterModule.forChild(advocatesRoutes)], + exports: [RouterModule], + providers: [ComplianceListResolver], +}) +export class ComplianceListRoutingModule {} diff --git a/otis/src/app/compliance-list/compliance-list.component.css b/otis/src/app/compliance-list/compliance-list.component.css new file mode 100644 index 0000000..e69de29 diff --git a/otis/src/app/compliance-list/compliance-list.component.html b/otis/src/app/compliance-list/compliance-list.component.html new file mode 100644 index 0000000..1abce9a --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list.component.html @@ -0,0 +1,68 @@ + + + Compliances + + +
+
+ + + + + + +
+
+ + + + File No. + {{ row.officeFileNumber }} + + + + + Title + {{ row.title }} + + + + + Proceedings + {{ row.proceedings }} + + + + + Compliance Date + {{ row.complianceDate }} + + + + + + + +
+
diff --git a/otis/src/app/compliance-list/compliance-list.component.spec.ts b/otis/src/app/compliance-list/compliance-list.component.spec.ts new file mode 100644 index 0000000..1485120 --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; + +import { ComplianceListComponent } from './compliance-list.component'; + +describe('ComplianceListComponent', () => { + let component: ComplianceListComponent; + let fixture: ComponentFixture; + + beforeEach(fakeAsync(() => { + TestBed.configureTestingModule({ + declarations: [ComplianceListComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(ComplianceListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should compile', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/otis/src/app/compliance-list/compliance-list.component.ts b/otis/src/app/compliance-list/compliance-list.component.ts new file mode 100644 index 0000000..bf466a1 --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list.component.ts @@ -0,0 +1,58 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { MatPaginator } from '@angular/material/paginator'; +import { ActivatedRoute, Router } from '@angular/router'; +import * as moment from 'moment'; + +import { ComplianceList } from './compliance-list'; +import { ComplianceListDatasource } from './compliance-list-datasource'; + +@Component({ + selector: 'app-compliance-list', + templateUrl: './compliance-list.component.html', + styleUrls: ['./compliance-list.component.css'], +}) +export class ComplianceListComponent implements OnInit { + @ViewChild(MatPaginator, { static: true }) paginator?: MatPaginator; + form: FormGroup; + info: ComplianceList = new ComplianceList(); + dataSource: ComplianceListDatasource = new ComplianceListDatasource(this.info.items); + /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ + displayedColumns = ['officeFileNumber', 'title', 'proceedings', 'complianceDate']; + + constructor(private route: ActivatedRoute, private router: Router, private fb: FormBuilder) { + // Create form + this.form = this.fb.group({ + date: '', + }); + } + + ngOnInit() { + this.route.data.subscribe((value) => { + const data = value as { info: ComplianceList }; + + this.info = data.info; + this.form.setValue({ + date: moment(this.info.date, 'DD-MMM-YYYY').toDate(), + }); + this.dataSource = new ComplianceListDatasource(this.info.items, this.paginator); + }); + } + + show() { + const info = this.getInfo(); + this.router.navigate(['compliance-list'], { + queryParams: { + date: info.date, + }, + }); + } + + getInfo(): ComplianceList { + const formModel = this.form.value; + + return new ComplianceList({ + date: moment(formModel.date).format('DD-MMM-YYYY'), + }); + } +} diff --git a/otis/src/app/compliance-list/compliance-list.module.spec.ts b/otis/src/app/compliance-list/compliance-list.module.spec.ts new file mode 100644 index 0000000..556f9a8 --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list.module.spec.ts @@ -0,0 +1,13 @@ +import { ComplianceListModule } from './compliance-list.module'; + +describe('ComplianceListModule', () => { + let complianceListModule: ComplianceListModule; + + beforeEach(() => { + complianceListModule = new ComplianceListModule(); + }); + + it('should create an instance', () => { + expect(complianceListModule).toBeTruthy(); + }); +}); diff --git a/otis/src/app/compliance-list/compliance-list.module.ts b/otis/src/app/compliance-list/compliance-list.module.ts new file mode 100644 index 0000000..96ca0bb --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list.module.ts @@ -0,0 +1,63 @@ +import { CdkTableModule } from '@angular/cdk/table'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { + DateAdapter, + MAT_DATE_FORMATS, + MAT_DATE_LOCALE, + MatNativeDateModule, +} from '@angular/material/core'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTableModule } from '@angular/material/table'; + +import { ComplianceListRoutingModule } from './compliance-list-routing.module'; +import { ComplianceListComponent } from './compliance-list.component'; + +export const MY_FORMATS = { + parse: { + dateInput: 'DD-MMM-YYYY', + }, + display: { + dateInput: 'DD-MMM-YYYY', + monthYearLabel: 'MMM YYYY', + dateA11yLabel: 'DD-MMM-YYYY', + monthYearA11yLabel: 'MMM YYYY', + }, +}; + +@NgModule({ + imports: [ + CommonModule, + CdkTableModule, + FlexLayoutModule, + MatButtonModule, + MatCardModule, + MatIconModule, + MatInputModule, + MatProgressSpinnerModule, + MatTableModule, + ReactiveFormsModule, + ComplianceListRoutingModule, + MatSelectModule, + MatPaginatorModule, + MatDatepickerModule, + MatDialogModule, + ], + declarations: [ComplianceListComponent], + providers: [ + { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE] }, + { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS }, + ], +}) +export class ComplianceListModule {} diff --git a/otis/src/app/compliance-list/compliance-list.service.spec.ts b/otis/src/app/compliance-list/compliance-list.service.spec.ts new file mode 100644 index 0000000..772e805 --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list.service.spec.ts @@ -0,0 +1,15 @@ +import { inject, TestBed } from '@angular/core/testing'; + +import { ComplianceListService } from './compliance-list.service'; + +describe('ComplianceListService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ComplianceListService], + }); + }); + + it('should be created', inject([ComplianceListService], (service: ComplianceListService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/otis/src/app/compliance-list/compliance-list.service.ts b/otis/src/app/compliance-list/compliance-list.service.ts new file mode 100644 index 0000000..f5c4584 --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list.service.ts @@ -0,0 +1,28 @@ +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs/internal/Observable'; +import { catchError } from 'rxjs/operators'; + +import { ErrorLoggerService } from '../core/error-logger.service'; + +import { ComplianceList } from './compliance-list'; + +const url = '/api/compliance-list'; +const serviceName = 'ComplianceListService'; + +@Injectable({ + providedIn: 'root', +}) +export class ComplianceListService { + constructor(private http: HttpClient, private log: ErrorLoggerService) {} + + list(date: string | null): Observable { + const options = { params: new HttpParams() }; + if (date !== null) { + options.params = options.params.set('d', date); + } + return this.http + .get(url, options) + .pipe(catchError(this.log.handleError(serviceName, 'list'))) as Observable; + } +} diff --git a/otis/src/app/compliance-list/compliance-list.ts b/otis/src/app/compliance-list/compliance-list.ts new file mode 100644 index 0000000..97b7321 --- /dev/null +++ b/otis/src/app/compliance-list/compliance-list.ts @@ -0,0 +1,12 @@ +import { ComplianceListItem } from './compliance-list-item'; + +export class ComplianceList { + date: string; + items: ComplianceListItem[]; + + public constructor(init?: Partial) { + this.date = ''; + this.items = []; + Object.assign(this, init); + } +} diff --git a/otis/src/app/nav-bar/nav-bar.component.html b/otis/src/app/nav-bar/nav-bar.component.html index 99a457a..bbce643 100644 --- a/otis/src/app/nav-bar/nav-bar.component.html +++ b/otis/src/app/nav-bar/nav-bar.component.html @@ -4,6 +4,7 @@ Home Cause List + Compliance List Acts Advocates