Passed
Pull Request — master (#437)
by
unknown
03:34 queued 42s
created

LeaveRequestTableFactory.addStatusRow   A

Complexity

Conditions 2

Size

Total Lines 10
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 10
dl 0
loc 10
rs 9.9
c 0
b 0
f 0
cc 2
1
import { Inject, Injectable } from '@nestjs/common';
2
import { LeaveRequestDetailView } from 'src/Application/HumanResource/Leave/View/LeaveRequestDetailView';
3
import { LeaveRequestView } from 'src/Application/HumanResource/Leave/View/LeaveRequestView';
4
import { RouteNameResolver } from 'src/Infrastructure/Common/ExtendedRouting/RouteNameResolver';
5
import { Inline, Row, Table } from 'src/Infrastructure/Tables';
6
import { formatDate } from 'src/Infrastructure/Common/Utils/dateUtils';
7
import { formatFullName } from 'src/Infrastructure/Common/Utils/formatUtils';
8
import {
9
  ActionsOptions,
10
  RowBuilder,
11
  RowFactory
12
} from 'src/Infrastructure/Tables/RowFactory';
13
import { Status } from 'src/Domain/HumanResource/Leave/LeaveRequest.entity';
14
import { Picto } from 'src/Infrastructure/Ui/Picto';
15
import { ITranslator } from 'src/Infrastructure/Translations/ITranslator';
16
17
@Injectable()
18
export class LeaveRequestTableFactory {
19
  constructor(
20
    private readonly resolver: RouteNameResolver,
21
    private rowFactory: RowFactory,
22
    @Inject('ITranslator')
23
    private readonly translator: ITranslator
24
  ) {}
25
26
  public create(leaveRequests: LeaveRequestView[], userId: string): Table {
27
    const columns = [
28
      'leaves-user',
29
      'leaves-period',
30
      'leaves-type',
31
      'leaves-status',
32
      'common-actions'
33
    ];
34
35
    const rows = leaveRequests.map(
36
      (leaveRequest): Row => {
37
        const actions: ActionsOptions = {
38
          view: {
39
            url: this.resolver.resolve('people_leave_requests_detail', {
40
              id: leaveRequest.id
41
            })
42
          }
43
        };
44
45
        if (
46
          leaveRequest.user.id === userId &&
47
          leaveRequest.status === Status.PENDING
48
        ) {
49
          actions.edit = {
50
            url: this.resolver.resolve('people_leave_requests_edit', {
51
              id: leaveRequest.id
52
            })
53
          };
54
        }
55
56
        return this.rowFactory
57
          .createBuilder()
58
          .value(formatFullName(leaveRequest.user))
59
          .trans('leaves-period-value', {
60
            startDate: leaveRequest.startDate,
61
            endDate: leaveRequest.endDate
62
          })
63
          .trans('leaves-type-value', { type: leaveRequest.type })
64
          .apply(builder => this.addStatusRow(builder, leaveRequest.status))
65
          .actions(actions)
66
          .build();
67
      }
68
    );
69
70
    return new Table(columns, rows);
71
  }
72
73
  public createInline(leaveRequest: LeaveRequestDetailView): Inline {
74
    const columns = [
75
      'leaves-status',
76
      'leaves-type',
77
      'leaves-startDate',
78
      'leaves-endDate',
79
      'leaves-duration',
80
      'leaves-moderator',
81
      'leaves-comment'
82
    ];
83
84
    const row = this.rowFactory
85
      .createBuilder()
86
      .apply(builder => this.addStatusRow(builder, leaveRequest.status))
87
      .trans('leaves-type-value', { type: leaveRequest.type })
88
      .value(formatDate(new Date(leaveRequest.startDate)))
89
      .value(formatDate(new Date(leaveRequest.endDate)))
90
      .trans('leaves-duration-value', { days: leaveRequest.duration })
91
      .value(
92
        leaveRequest.moderator
93
          ? `${leaveRequest.moderator.firstName} ${leaveRequest.moderator.lastName}`
94
          : ''
95
      )
96
      .value(leaveRequest.comment)
97
      .build();
98
99
    return new Inline(columns, row);
100
  }
101
102
  private addStatusRow(builder: RowBuilder, status: Status): void {
103
    builder.picto(
104
      {
105
        [Status.PENDING]: Picto.HOURGLASS,
106
        [Status.ACCEPTED]: Picto.ACTIVE,
107
        [Status.REFUSED]: Picto.DISABLED
108
      }[status],
109
      this.translator.translate('leaves-status-value', { status }),
110
      { class: status === Status.PENDING ? 'pc-bold' : '' }
111
    );
112
  }
113
}
114