Passed
Pull Request — master (#437)
by
unknown
02:25
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-duration',
31
      'leaves-type',
32
      'leaves-status',
33
      'common-actions'
34
    ];
35
36
    const rows = leaveRequests.map(
37
      (leaveRequest): Row => {
38
        const actions: ActionsOptions = {
39
          view: {
40
            url: this.resolver.resolve('people_leave_requests_detail', {
41
              id: leaveRequest.id
42
            })
43
          }
44
        };
45
46
        if (
47
          leaveRequest.user.id === userId &&
48
          leaveRequest.status === Status.PENDING
49
        ) {
50
          actions.edit = {
51
            url: this.resolver.resolve('people_leave_requests_edit', {
52
              id: leaveRequest.id
53
            })
54
          };
55
        }
56
57
        return this.rowFactory
58
          .createBuilder()
59
          .value(formatFullName(leaveRequest.user))
60
          .trans('leaves-period-value', {
61
            startDate: leaveRequest.startDate,
62
            endDate: leaveRequest.endDate
63
          })
64
          .trans('leaves-duration-value', { days: leaveRequest.duration })
65
          .trans('leaves-type-value', { type: leaveRequest.type })
66
          .apply(builder => this.addStatusRow(builder, leaveRequest.status))
67
          .actions(actions)
68
          .build();
69
      }
70
    );
71
72
    return new Table(columns, rows);
73
  }
74
75
  public createInline(leaveRequest: LeaveRequestDetailView): Inline {
76
    const columns = [
77
      'leaves-status',
78
      'leaves-type',
79
      'leaves-startDate',
80
      'leaves-endDate',
81
      'leaves-duration',
82
      'leaves-moderator',
83
      'leaves-moderateAt',
84
      'leaves-comment'
85
    ];
86
87
    const row = this.rowFactory
88
      .createBuilder()
89
      .apply(builder => this.addStatusRow(builder, leaveRequest.status))
90
      .trans('leaves-type-value', { type: leaveRequest.type })
91
      .value(formatDate(new Date(leaveRequest.startDate)))
92
      .value(formatDate(new Date(leaveRequest.endDate)))
93
      .trans('leaves-duration-value', { days: leaveRequest.duration })
94
      .value(
95
        leaveRequest.moderator ? formatFullName(leaveRequest.moderator) : ''
96
      )
97
      .value(
98
        leaveRequest.moderateAt
99
          ? formatDate(new Date(leaveRequest.moderateAt))
100
          : ''
101
      )
102
      .value(leaveRequest.comment)
103
      .build();
104
105
    return new Inline(columns, row);
106
  }
107
108
  private addStatusRow(builder: RowBuilder, status: Status): void {
109
    builder.picto(
110
      {
111
        [Status.PENDING]: Picto.HOURGLASS,
112
        [Status.ACCEPTED]: Picto.ACTIVE,
113
        [Status.REFUSED]: Picto.DISABLED
114
      }[status],
115
      this.translator.translate('leaves-status-value', { status }),
116
      { class: status === Status.PENDING ? 'pc-bold' : '' }
117
    );
118
  }
119
}
120