Passed
Push — master ( 1b1d3e...93cb6f )
by
unknown
02:31
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
        if (leaveRequest.canCancel) {
58
          actions.delete = {
59
            url: this.resolver.resolve('people_leave_requests_delete', {
60
              id: leaveRequest.id
61
            })
62
          };
63
        }
64
65
        return this.rowFactory
66
          .createBuilder()
67
          .value(formatFullName(leaveRequest.user))
68
          .trans('leaves-period-value', {
69
            startDate: leaveRequest.startDate,
70
            endDate: leaveRequest.endDate
71
          })
72
          .trans('leaves-duration-value', { days: leaveRequest.duration })
73
          .trans('leaves-type-value', { type: leaveRequest.type })
74
          .apply(builder => this.addStatusRow(builder, leaveRequest.status))
75
          .actions(actions)
76
          .build();
77
      }
78
    );
79
80
    return new Table(columns, rows);
81
  }
82
83
  public createInline(leaveRequest: LeaveRequestDetailView): Inline {
84
    const columns = [
85
      'leaves-status',
86
      'leaves-type',
87
      'leaves-startDate',
88
      'leaves-endDate',
89
      'leaves-duration',
90
      'leaves-moderator',
91
      'leaves-moderateAt',
92
      'leaves-comment'
93
    ];
94
95
    const row = this.rowFactory
96
      .createBuilder()
97
      .apply(builder => this.addStatusRow(builder, leaveRequest.status))
98
      .trans('leaves-type-value', { type: leaveRequest.type })
99
      .value(formatDate(new Date(leaveRequest.startDate)))
100
      .value(formatDate(new Date(leaveRequest.endDate)))
101
      .trans('leaves-duration-value', { days: leaveRequest.duration })
102
      .value(
103
        leaveRequest.moderator ? formatFullName(leaveRequest.moderator) : ''
104
      )
105
      .value(
106
        leaveRequest.moderateAt
107
          ? formatDate(new Date(leaveRequest.moderateAt))
108
          : ''
109
      )
110
      .value(leaveRequest.comment)
111
      .build();
112
113
    return new Inline(columns, row);
114
  }
115
116
  private addStatusRow(builder: RowBuilder, status: Status): void {
117
    builder.picto(
118
      {
119
        [Status.PENDING]: Picto.HOURGLASS,
120
        [Status.ACCEPTED]: Picto.ACTIVE,
121
        [Status.REFUSED]: Picto.DISABLED
122
      }[status],
123
      this.translator.translate('leaves-status-value', { status }),
124
      { class: status === Status.PENDING ? 'pc-bold' : '' }
125
    );
126
  }
127
}
128