Added Compliance date.

Showing the next hearing date in the case list
Showing cases on home
This commit is contained in:
Amritanshu Agrawal 2021-01-18 10:56:51 +05:30
parent 08d9e9ab8e
commit 361d012d34
17 changed files with 101 additions and 92 deletions

View File

@ -255,6 +255,7 @@ def upgrade():
sa.Column("item_number", sa.Unicode(length=255), nullable=True), sa.Column("item_number", sa.Unicode(length=255), nullable=True),
sa.Column("bench", 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("proceedings", sa.Unicode(length=2000), nullable=True),
sa.Column("compliance_date", sa.DateTime(), nullable=True),
sa.Column("next_hearing_date", sa.DateTime(), nullable=True), sa.Column("next_hearing_date", sa.DateTime(), nullable=True),
sa.Column("court_status_id", postgresql.UUID(as_uuid=True), 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.Column("old_court_status_id", sa.Integer(), nullable=True),

View File

@ -25,6 +25,7 @@ class Hearing(Base):
bench = Column("bench", Unicode(255), nullable=False, unique=True) bench = Column("bench", Unicode(255), nullable=False, unique=True)
proceedings = Column("proceedings", 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) next_hearing_date = Column("next_hearing_date", DateTime, nullable=False, index=True)
compliance_date = Column("compliance_date", DateTime, nullable=False, index=True)
court_status_id = Column("court_status_id", UUID(as_uuid=True), ForeignKey("court_statuses.id"), nullable=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") court_status = relationship("CourtStatus", back_populates="hearings")
@ -37,6 +38,7 @@ class Hearing(Base):
item_number=None, item_number=None,
bench=None, bench=None,
proceedings=None, proceedings=None,
compliance_date=None,
next_hearing_date=None, next_hearing_date=None,
court_status_id=None, court_status_id=None,
id_=None, id_=None,
@ -47,5 +49,6 @@ class Hearing(Base):
self.item_number = item_number self.item_number = item_number
self.bench = bench self.bench = bench
self.proceedings = proceedings self.proceedings = proceedings
self.compliance_date = compliance_date
self.next_hearing_date = next_hearing_date self.next_hearing_date = next_hearing_date
self.court_status_id = court_status_id self.court_status_id = court_status_id

View File

@ -74,6 +74,7 @@ def save(
item_number=h.item_number, item_number=h.item_number,
bench=h.bench, bench=h.bench,
proceedings=h.proceedings, proceedings=h.proceedings,
compliance_date=h.compliance_date,
next_hearing_date=h.next_hearing_date, next_hearing_date=h.next_hearing_date,
court_status_id=h.court_status.id_ if h.court_status is not None else None, court_status_id=h.court_status.id_ if h.court_status is not None else None,
) )
@ -103,7 +104,7 @@ def update(
) -> schemas.Case: ) -> schemas.Case:
try: try:
item: Case = db.query(Case).filter(Case.id == id_).first() item: Case = db.query(Case).filter(Case.id == id_).first()
item.case_source_id = data.case_source.id_, item.case_source_id = data.case_source.id_
item.office_file_number = data.office_file_number item.office_file_number = data.office_file_number
item.court_case_number = data.court_case_number item.court_case_number = data.court_case_number
item.year = data.year item.year = data.year
@ -150,6 +151,7 @@ def update(
h.item_number = d.item_number h.item_number = d.item_number
h.bench = d.bench h.bench = d.bench
h.proceedings = d.proceedings h.proceedings = d.proceedings
h.compliance_date = d.compliance_date
h.next_hearing_date = d.next_hearing_date h.next_hearing_date = d.next_hearing_date
h.court_status_id = d.court_status.id_ if d.court_status is not None else None h.court_status_id = d.court_status.id_ if d.court_status is not None else None
for d in [d for d in data.hearings if d.id_ is None]: for d in [d for d in data.hearings if d.id_ is None]:
@ -158,6 +160,7 @@ def update(
item_number=d.item_number, item_number=d.item_number,
bench=d.bench, bench=d.bench,
proceedings=d.proceedings, proceedings=d.proceedings,
compliance_date=d.compliance_date,
next_hearing_date=d.next_hearing_date, next_hearing_date=d.next_hearing_date,
court_status_id=d.court_status.id_ if d.court_status is not None else None, court_status_id=d.court_status.id_ if d.court_status is not None else None,
) )
@ -294,6 +297,7 @@ def case_info(item: Case) -> schemas.Case:
itemNumber=h.item_number if h.item_number is not None else "", itemNumber=h.item_number if h.item_number is not None else "",
bench=h.bench if h.bench is not None else "", bench=h.bench if h.bench is not None else "",
proceedings=h.proceedings if h.proceedings is not None else "", proceedings=h.proceedings if h.proceedings is not None else "",
complianceDate=h.compliance_date,
nextHearingDate=h.next_hearing_date, nextHearingDate=h.next_hearing_date,
courtStatus=schemas.CourtStatusLink(id=h.court_status.id, name=h.court_status.name) courtStatus=schemas.CourtStatusLink(id=h.court_status.id, name=h.court_status.name)
if h.court_status is not None if h.court_status is not None

View File

@ -14,6 +14,7 @@ class HearingIn(BaseModel):
item_number: str item_number: str
bench: str bench: str
proceedings: str proceedings: str
compliance_date: Optional[date]
next_hearing_date: Optional[date] next_hearing_date: Optional[date]
court_status: Optional[CourtStatusLink] court_status: Optional[CourtStatusLink]
@ -22,6 +23,14 @@ class HearingIn(BaseModel):
alias_generator = to_camel alias_generator = to_camel
json_encoders = {datetime: lambda v: v.strftime("%d-%b-%Y %H:%M"), date: lambda v: v.strftime("%d-%b-%Y")} json_encoders = {datetime: lambda v: v.strftime("%d-%b-%Y %H:%M"), 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
if value is None:
return None
return datetime.strptime(value, "%d-%b-%Y").date()
@validator("next_hearing_date", pre=True) @validator("next_hearing_date", pre=True)
def parse_next_hearing_date(cls, value): def parse_next_hearing_date(cls, value):
if isinstance(value, date): if isinstance(value, date):

View File

@ -3,7 +3,6 @@ import { Routes, RouterModule } from '@angular/router';
import { LoginComponent } from './auth/login/login.component'; import { LoginComponent } from './auth/login/login.component';
import { LogoutComponent } from './auth/logout/logout.component'; import { LogoutComponent } from './auth/logout/logout.component';
import { HomeComponent } from './home/home.component';
const routes: Routes = [ const routes: Routes = [
{ {
@ -72,7 +71,7 @@ const routes: Routes = [
}, },
{ path: 'login', component: LoginComponent }, { path: 'login', component: LoginComponent },
{ path: 'logout', component: LogoutComponent }, { path: 'logout', component: LogoutComponent },
{ path: '', component: HomeComponent }, { path: '', redirectTo: '/cases', pathMatch: 'full' },
]; ];
@NgModule({ @NgModule({
imports: [ imports: [

View File

@ -27,14 +27,13 @@ import { AppComponent } from './app.component';
import { LoginComponent } from './auth/login/login.component'; import { LoginComponent } from './auth/login/login.component';
import { LogoutComponent } from './auth/logout/logout.component'; import { LogoutComponent } from './auth/logout/logout.component';
import { CoreModule } from './core/core.module'; import { CoreModule } from './core/core.module';
import { HomeComponent } from './home/home.component';
import { NavBarComponent } from './nav-bar/nav-bar.component'; import { NavBarComponent } from './nav-bar/nav-bar.component';
import { SharedModule } from './shared/shared.module'; import { SharedModule } from './shared/shared.module';
registerLocaleData(enIN); registerLocaleData(enIN);
@NgModule({ @NgModule({
declarations: [AppComponent, LoginComponent, LogoutComponent, HomeComponent, NavBarComponent], declarations: [AppComponent, LoginComponent, LogoutComponent, NavBarComponent],
imports: [ imports: [
BrowserModule, BrowserModule,
AppRoutingModule, AppRoutingModule,

View File

@ -52,7 +52,14 @@
> >
<mat-form-field fxFlex> <mat-form-field fxFlex>
<mat-label>Title</mat-label> <mat-label>Title</mat-label>
<input matInput placeholder="Title" formControlName="title" /> <textarea
matInput
placeholder="Title"
formControlName="title"
autocomplete="off"
cdkTextareaAutosize
cdkAutosizeMinRows="2"
></textarea>
</mat-form-field> </mat-form-field>
</div> </div>
<div <div
@ -447,11 +454,11 @@
fx fx
> >
<mat-form-field fxFlex> <mat-form-field fxFlex>
<mat-label>Proceedings</mat-label> <mat-label>Proceedings / Action to be taken</mat-label>
<textarea <textarea
type="text" type="text"
matInput matInput
placeholder="Proceedings" placeholder="Proceedings / Action to be taken"
formControlName="proceedings" formControlName="proceedings"
autocomplete="off" autocomplete="off"
cdkTextareaAutosize cdkTextareaAutosize
@ -468,7 +475,21 @@
fxLayoutGap="20px" fxLayoutGap="20px"
fxLayoutGap.lt-md="0px" fxLayoutGap.lt-md="0px"
> >
<mat-form-field fxFlex="80%"> <mat-form-field fxFlex="40%">
<mat-label>Compliance Date</mat-label>
<input
matInput
[matDatepicker]="complianceDate"
placeholder="Compliance Date"
formControlName="complianceDate"
autocomplete="off"
#complianceDateElement
(focus)="complianceDateElement.select()"
/>
<mat-datepicker-toggle matSuffix [for]="complianceDate"></mat-datepicker-toggle>
<mat-datepicker #complianceDate></mat-datepicker>
</mat-form-field>
<mat-form-field fxFlex="40%">
<mat-label>Next Hearing Date</mat-label> <mat-label>Next Hearing Date</mat-label>
<input <input
matInput matInput
@ -482,7 +503,7 @@
<mat-datepicker-toggle matSuffix [for]="nextHearingDate"></mat-datepicker-toggle> <mat-datepicker-toggle matSuffix [for]="nextHearingDate"></mat-datepicker-toggle>
<mat-datepicker #nextHearingDate></mat-datepicker> <mat-datepicker #nextHearingDate></mat-datepicker>
</mat-form-field> </mat-form-field>
<button mat-raised-button color="primary" (click)="addHearing()" fxFlex="80%">Add</button> <button mat-raised-button color="primary" (click)="addHearing()" fxFlex="20%">Add</button>
</div> </div>
<mat-table #table [dataSource]="dataSource" matSort aria-label="Elements"> <mat-table #table [dataSource]="dataSource" matSort aria-label="Elements">
<!-- Item Number Column --> <!-- Item Number Column -->
@ -509,6 +530,12 @@
<mat-cell *matCellDef="let row" class="right">{{ row.proceedings }}</mat-cell> <mat-cell *matCellDef="let row" class="right">{{ row.proceedings }}</mat-cell>
</ng-container> </ng-container>
<!-- Compliance Date Column -->
<ng-container matColumnDef="complianceDate">
<mat-header-cell *matHeaderCellDef class="right">Compliance Date</mat-header-cell>
<mat-cell *matCellDef="let row" class="right">{{ row.complianceDate }}</mat-cell>
</ng-container>
<!-- Next Hearing Date Column --> <!-- Next Hearing Date Column -->
<ng-container matColumnDef="nextHearingDate"> <ng-container matColumnDef="nextHearingDate">
<mat-header-cell *matHeaderCellDef class="right">Next Hearing</mat-header-cell> <mat-header-cell *matHeaderCellDef class="right">Next Hearing</mat-header-cell>

View File

@ -50,6 +50,7 @@ export class CaseDetailComponent implements OnInit, AfterViewInit {
'bench', 'bench',
'courtStatus', 'courtStatus',
'proceedings', 'proceedings',
'complianceDate',
'nextHearingDate', 'nextHearingDate',
'action', 'action',
]; ];
@ -100,6 +101,7 @@ export class CaseDetailComponent implements OnInit, AfterViewInit {
bench: '', bench: '',
latestStatus: '', latestStatus: '',
proceedings: '', proceedings: '',
complianceDate: '',
nextHearingDate: '', nextHearingDate: '',
}), }),
}); });
@ -358,10 +360,12 @@ export class CaseDetailComponent implements OnInit, AfterViewInit {
}); });
const proceedings = formValue.proceedings; const proceedings = formValue.proceedings;
const nextHearingDate = const complianceDate = formValue.complianceDate
formValue.nextHearingDate === '' ? moment(formValue.complianceDate).format('DD-MMM-YYYY')
? null : null;
: moment(formValue.nextHearingDate).format('DD-MMM-YYYY'); const nextHearingDate = formValue.nextHearingDate
? moment(formValue.nextHearingDate).format('DD-MMM-YYYY')
: null;
this.item.hearings.push( this.item.hearings.push(
new Hearing({ new Hearing({
@ -370,6 +374,7 @@ export class CaseDetailComponent implements OnInit, AfterViewInit {
bench, bench,
courtStatus: latestStatus, courtStatus: latestStatus,
proceedings, proceedings,
complianceDate,
nextHearingDate, nextHearingDate,
}), }),
); );
@ -384,6 +389,7 @@ export class CaseDetailComponent implements OnInit, AfterViewInit {
bench: '', bench: '',
courtStatus: '', courtStatus: '',
proceedings: '', proceedings: '',
complianceDate: '',
nextHearingDate: '', nextHearingDate: '',
}); });
} }

View File

@ -1,4 +1,4 @@
<h1 mat-dialog-title>Edit Journal Entry</h1> <h1 mat-dialog-title>Edit Hearing</h1>
<div mat-dialog-content> <div mat-dialog-content>
<form [formGroup]="form"> <form [formGroup]="form">
<div <div
@ -65,18 +65,16 @@
fx fx
> >
<mat-form-field fxFlex> <mat-form-field fxFlex>
<mat-label>Proceedings</mat-label> <mat-label>Proceedings / Action to be taken</mat-label>
<textarea <textarea
type="text" type="text"
matInput matInput
placeholder="Proceedings" placeholder="Proceedings / Action to be taken"
formControlName="proceedings" formControlName="proceedings"
autocomplete="off" autocomplete="off"
cdkTextareaAutosize cdkTextareaAutosize
cdkAutosizeMinRows="5" cdkAutosizeMinRows="5"
> ></textarea>
></textarea
>
</mat-form-field> </mat-form-field>
</div> </div>
<div <div
@ -86,7 +84,21 @@
fxLayoutGap="20px" fxLayoutGap="20px"
fxLayoutGap.lt-md="0px" fxLayoutGap.lt-md="0px"
> >
<mat-form-field fxFlex="80%"> <mat-form-field fxFlex="40%">
<mat-label>Compliance Date</mat-label>
<input
matInput
[matDatepicker]="complianceDate"
placeholder="Compliance Date"
formControlName="complianceDate"
autocomplete="off"
#complianceDateElement
(focus)="complianceDateElement.select()"
/>
<mat-datepicker-toggle matSuffix [for]="complianceDate"></mat-datepicker-toggle>
<mat-datepicker #complianceDate></mat-datepicker>
</mat-form-field>
<mat-form-field fxFlex="40%">
<mat-label>Next Hearing Date</mat-label> <mat-label>Next Hearing Date</mat-label>
<input <input
matInput matInput

View File

@ -25,6 +25,7 @@ export class HearingDialogComponent implements OnInit {
bench: '', bench: '',
latestStatus: '', latestStatus: '',
proceedings: '', proceedings: '',
complianceDate: '',
nextHearingDate: '', nextHearingDate: '',
}); });
} }
@ -36,6 +37,9 @@ export class HearingDialogComponent implements OnInit {
bench: this.data.hearing.bench, bench: this.data.hearing.bench,
latestStatus: this.data.hearing.courtStatus ? this.data.hearing.courtStatus.id : '', latestStatus: this.data.hearing.courtStatus ? this.data.hearing.courtStatus.id : '',
proceedings: this.data.hearing.proceedings, proceedings: this.data.hearing.proceedings,
complianceDate: this.data.hearing.complianceDate
? moment(this.data.hearing.complianceDate, 'DD-MMM-YYYY').toDate()
: '',
nextHearingDate: this.data.hearing.nextHearingDate nextHearingDate: this.data.hearing.nextHearingDate
? moment(this.data.hearing.nextHearingDate, 'DD-MMM-YYYY').toDate() ? moment(this.data.hearing.nextHearingDate, 'DD-MMM-YYYY').toDate()
: '', : '',
@ -58,12 +62,12 @@ export class HearingDialogComponent implements OnInit {
) as CourtStatus).name, ) as CourtStatus).name,
}); });
this.data.hearing.proceedings = formValue.proceedings; this.data.hearing.proceedings = formValue.proceedings;
if (formValue.nextHearingDate === '') { this.data.hearing.complianceDate = formValue.complianceDate
this.data.hearing.nextHearingDate = null; ? moment(formValue.complianceDate).format('DD-MMM-YYYY')
} else { : null;
this.data.hearing.nextHearingDate = moment(formValue.nextHearingDate).format('DD-MMM-YYYY'); this.data.hearing.nextHearingDate = formValue.nextHearingDate
} ? moment(formValue.nextHearingDate).format('DD-MMM-YYYY')
: null;
this.dialogRef.close(this.data.hearing); this.dialogRef.close(this.data.hearing);
} }
} }

View File

@ -69,7 +69,7 @@
<!-- Next Hearing Date Column --> <!-- Next Hearing Date Column -->
<ng-container matColumnDef="nextHearingDate"> <ng-container matColumnDef="nextHearingDate">
<mat-header-cell *matHeaderCellDef>Next Hearing Date</mat-header-cell> <mat-header-cell *matHeaderCellDef>Next Hearing Date</mat-header-cell>
<mat-cell *matCellDef="let row">Not Implemented</mat-cell> <mat-cell *matCellDef="let row">{{ nextHearingDate(row) }}</mat-cell>
</ng-container> </ng-container>
<!-- Court Satus Column --> <!-- Court Satus Column -->

View File

@ -2,7 +2,7 @@ import { Component, OnInit, ViewChild } from '@angular/core';
import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; import { FormBuilder, FormControl, FormGroup } from '@angular/forms';
import { MatPaginator } from '@angular/material/paginator'; import { MatPaginator } from '@angular/material/paginator';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs'; import { Observable } from 'rxjs';
import { distinctUntilChanged, startWith, switchMap, tap } from 'rxjs/operators'; import { distinctUntilChanged, startWith, switchMap, tap } from 'rxjs/operators';
import { Case } from '../../core/case'; import { Case } from '../../core/case';
@ -61,4 +61,9 @@ export class CaseListComponent implements OnInit {
}); });
this.dataSource = new CaseListDataSource(this.list, this.paginator); this.dataSource = new CaseListDataSource(this.list, this.paginator);
} }
nextHearingDate(row: Case): string {
const date = row.hearings.map((x) => x.nextHearingDate).find((x) => !!x);
return date ? date : '';
}
} }

View File

@ -7,6 +7,7 @@ export class Hearing {
bench: string; bench: string;
courtStatus: CourtStatus | null; courtStatus: CourtStatus | null;
proceedings: string; proceedings: string;
complianceDate: string | null;
nextHearingDate: string | null; nextHearingDate: string | null;
public constructor(init?: Partial<Hearing>) { public constructor(init?: Partial<Hearing>) {
@ -16,7 +17,8 @@ export class Hearing {
this.bench = ''; this.bench = '';
this.courtStatus = null; this.courtStatus = null;
this.proceedings = ''; this.proceedings = '';
this.nextHearingDate = ''; this.complianceDate = null;
this.nextHearingDate = null;
Object.assign(this, init); Object.assign(this, init);
} }
} }

View File

@ -1,16 +0,0 @@
.square-button {
min-width: 150px;
max-width: 150px;
min-height: 150px;
max-height: 150px;
cursor: pointer;
margin: 20px;
}
.item-name {
text-align: center;
padding: 0.5rem;
}
.center {
text-align: center;
}

View File

@ -1,3 +0,0 @@
<footer class="footer">
<p>Backend: v{{ auth.user?.ver }} / Frontend: v{{ version }}</p>
</footer>

View File

@ -1,26 +0,0 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { HomeComponent } from './home.component';
describe('HomeComponent', () => {
let component: HomeComponent;
let fixture: ComponentFixture<HomeComponent>;
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [HomeComponent],
}).compileComponents();
}),
);
beforeEach(() => {
fixture = TestBed.createComponent(HomeComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,17 +0,0 @@
import { Component } from '@angular/core';
import { environment } from '../../environments/environment';
import { AuthService } from '../auth/auth.service';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css'],
})
export class HomeComponent {
version: string;
constructor(public auth: AuthService) {
this.version = environment.version;
}
}