220 lines
7.9 KiB
HTML
220 lines
7.9 KiB
HTML
<vn-crud-model
|
|
vn-id="model"
|
|
url="WorkerTimeControls/filter"
|
|
filter="::$ctrl.filter"
|
|
data="$ctrl.hours">
|
|
</vn-crud-model>
|
|
<div>
|
|
<vn-card class="vn-pa-lg vn-w-lg">
|
|
<vn-table model="model" auto-load="false">
|
|
<vn-thead>
|
|
<vn-tr>
|
|
<vn-td ng-repeat="weekday in $ctrl.weekDays" center>
|
|
<div class="weekday" translate>{{::$ctrl.weekdayNames[$index].name}}</div>
|
|
<div>
|
|
<span>{{::weekday.dated | date: 'dd'}}</span>
|
|
<span title="{{::weekday.dated | date: 'MMMM' | translate}}" translate>
|
|
{{::weekday.dated | date: 'MMMM'}}
|
|
</span>
|
|
</div>
|
|
<vn-chip
|
|
title="{{::weekday.event.name}}"
|
|
ng-class="{invisible: !weekday.event}">
|
|
<vn-avatar
|
|
ng-style="::{backgroundColor: weekday.event.color}">
|
|
</vn-avatar>
|
|
<div>
|
|
{{::weekday.event.name}}
|
|
</div>
|
|
</vn-chip>
|
|
</vn-td>
|
|
</vn-tr>
|
|
</vn-thead>
|
|
<vn-tbody>
|
|
<vn-tr>
|
|
<vn-td ng-repeat="weekday in $ctrl.weekDays" class="hours vn-pa-none" expand>
|
|
<section ng-repeat="hour in weekday.hours">
|
|
<vn-icon
|
|
icon="{{
|
|
::hour.direction == 'in' ? 'arrow_forward' : 'arrow_back'
|
|
}}"
|
|
title="{{
|
|
::(hour.direction == 'in' ? 'In' : 'Out') | translate
|
|
}}"
|
|
ng-class="::{'invisible': hour.direction == 'middle'}">
|
|
</vn-icon>
|
|
<vn-chip
|
|
ng-class="::{'colored': hour.manual, 'clickable': true}"
|
|
removable="::hour.manual"
|
|
on-remove="$ctrl.showDeleteDialog($event, hour)"
|
|
ng-click="$ctrl.edit($event, hour)"
|
|
>
|
|
<prepend>
|
|
<vn-icon icon="edit"
|
|
vn-tooltip="Edit">
|
|
</vn-icon>
|
|
</prepend>
|
|
{{::hour.timed | date: 'HH:mm'}}
|
|
</vn-chip>
|
|
</section>
|
|
</vn-td>
|
|
</vn-tr>
|
|
</vn-tbody>
|
|
<vn-tfoot>
|
|
<vn-tr>
|
|
<vn-td ng-repeat="weekday in $ctrl.weekDays" center>
|
|
{{$ctrl.formatHours(weekday.workedHours)}} h.
|
|
</vn-td>
|
|
</vn-tr>
|
|
<vn-tr>
|
|
<vn-td center ng-repeat="weekday in $ctrl.weekDays">
|
|
<vn-icon-button
|
|
icon="add_circle"
|
|
vn-tooltip="Add time"
|
|
ng-click="$ctrl.showAddTimeDialog(weekday)">
|
|
</vn-icon-button>
|
|
</vn-td>
|
|
</vn-tr>
|
|
</vn-tfoot>
|
|
</vn-table>
|
|
</vn-card>
|
|
|
|
<vn-button-bar class="vn-w-lg">
|
|
<div ng-show="$ctrl.state">
|
|
<vn-button
|
|
label="Satisfied"
|
|
disabled="$ctrl.state == 'CONFIRMED'"
|
|
ng-show="$ctrl.isHimSelf"
|
|
ng-click="$ctrl.isSatisfied()">
|
|
</vn-button>
|
|
<vn-button
|
|
label="Not satisfied"
|
|
disabled="$ctrl.state == 'REVISE'"
|
|
ng-show="$ctrl.isHimSelf"
|
|
ng-click="reason.show()">
|
|
</vn-button>
|
|
<vn-button
|
|
label="Reason"
|
|
ng-show="$ctrl.reason && ($ctrl.isHimSelf || $ctrl.isHr)"
|
|
ng-click="reason.show()">
|
|
</vn-button>
|
|
</div>
|
|
<vn-button
|
|
label="{{$ctrl.state ? 'Resend' : 'Send'}}"
|
|
ng-click="sendEmailConfirmation.show()"
|
|
class="right"
|
|
vn-tooltip="{{$ctrl.state ? 'Resend' : 'Send'}} email of this week to the user"
|
|
ng-if="$ctrl.isHr && $ctrl.state != 'CONFIRMED' && $ctrl.canResend">
|
|
</vn-button>
|
|
</vn-button-bar>
|
|
</div>
|
|
|
|
<vn-side-menu side="right">
|
|
<div class="vn-pa-md">
|
|
<div class="totalBox" style="text-align: center;">
|
|
<h6 translate>Hours</h6>
|
|
<vn-label-value
|
|
label="Week total"
|
|
value="{{$ctrl.weekTotalHours}} h.">
|
|
</vn-label-value>
|
|
<vn-label-value
|
|
label="Finish at"
|
|
value="{{$ctrl.getFinishTime()}}">
|
|
</vn-label-value>
|
|
</div>
|
|
<vn-calendar
|
|
vn-id="calendar"
|
|
class="vn-pt-md"
|
|
ng-model="$ctrl.date"
|
|
format-week="$ctrl.formatWeek($element)"
|
|
on-move="$ctrl.getMailStates($date)"
|
|
has-events="$ctrl.hasEvents($day)">
|
|
</vn-calendar>
|
|
</div>
|
|
</vn-side-menu>
|
|
|
|
<vn-dialog
|
|
vn-id="addTimeDialog"
|
|
on-accept="$ctrl.addTime()"
|
|
message="Add time">
|
|
<tpl-body>
|
|
<vn-input-time
|
|
vn-one
|
|
vn-focus
|
|
ng-model="$ctrl.newTimeEntry.timed"
|
|
label="Hour"
|
|
required="true">
|
|
</vn-input-time>
|
|
<vn-autocomplete
|
|
label="Type"
|
|
ng-model="$ctrl.newTimeEntry.direction"
|
|
data="$ctrl.entryDirections"
|
|
select-fields="['code','description']"
|
|
show-field="description"
|
|
value-field="code"
|
|
required="true">
|
|
</vn-autocomplete>
|
|
</tpl-body>
|
|
<tpl-buttons>
|
|
<input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>
|
|
<button response="accept" translate>Save</button>
|
|
</tpl-buttons>
|
|
</vn-dialog>
|
|
<vn-confirm
|
|
vn-id="delete-entry-dialog"
|
|
on-accept="$ctrl.deleteTimeEntry()"
|
|
message="This time entry will be deleted"
|
|
question="Are you sure you want to delete this entry?">
|
|
</vn-confirm>
|
|
|
|
<!-- Edit entry Popover -->
|
|
<vn-popover vn-id="editEntry">
|
|
<vn-horizontal class="vn-pa-sm edit-time-entry">
|
|
<vn-autocomplete class="dense"
|
|
ng-model="$ctrl.selectedRow.direction"
|
|
data="$ctrl.entryDirections"
|
|
select-fields="['code','description']"
|
|
show-field="description"
|
|
value-field="code">
|
|
</vn-autocomplete>
|
|
<vn-icon-button vn-none
|
|
icon="check"
|
|
vn-tooltip="Save"
|
|
ng-click="$ctrl.save()">
|
|
</vn-icon-button>
|
|
</vn-horizontal>
|
|
</vn-popover>
|
|
|
|
<vn-dialog
|
|
vn-id="reason"
|
|
on-accept="$ctrl.isUnsatisfied()">
|
|
<tpl-body>
|
|
<div class="reasonDialog">
|
|
<vn-textarea
|
|
label="Reason"
|
|
ng-model="$ctrl.reason"
|
|
disabled="!$ctrl.isHimSelf"
|
|
rows="5"
|
|
required="true">
|
|
</vn-textarea>
|
|
</div>
|
|
</tpl-body>
|
|
<tpl-buttons ng-if="$ctrl.isHimSelf">
|
|
<input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>
|
|
<button response="accept" translate>Save</button>
|
|
</tpl-buttons>
|
|
</vn-dialog>
|
|
|
|
<vn-dialog
|
|
vn-id="sendEmailConfirmation"
|
|
on-accept="$ctrl.resendEmail()"
|
|
message="Send time control email">
|
|
<tpl-body>
|
|
<span translate>Are you sure you want to send it?</span>
|
|
</tpl-body>
|
|
<tpl-buttons>
|
|
<input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>
|
|
<button response="accept" translate>Confirm</button>
|
|
</tpl-buttons>
|
|
</vn-dialog>
|