TimeTrex/interface/html5/views/my_account/request/RequestViewController.js

1313 lines
44 KiB
JavaScript
Raw Permalink Normal View History

2022-12-13 07:10:06 +01:00
export class RequestViewController extends RequestViewCommonController {
constructor( options = {} ) {
_.defaults( options, {
el: '#request_view_container',
type_array: null,
request_type_array: null,
status_array: null,
api_request_schedule: null,
authorization_api: null,
schedule_api: null,
hierarchy_type_id: false,
punch_tag_api: null,
default_punch_tag: [],
previous_punch_tag_selection: [],
overlapping_shift_data: {},
messages: null
} );
super( options );
}
init( options ) {
//this._super('initialize', options);
this.edit_view_tpl = 'RequestEditView.html';
this.permission_id = 'request';
this.viewId = 'Request';
this.script_name = 'RequestView';
this.table_name_key = 'request';
this.context_menu_name = $.i18n._( 'Requests' );
this.navigation_label = $.i18n._( 'Request' );
this.api = TTAPI.APIRequest;
this.api_absence_policy = TTAPI.APIAbsencePolicy;
this.api_schedule = TTAPI.APISchedule;
this.message_control_api = TTAPI.APIMessageControl;
if ( ( Global.getProductEdition() >= 15 ) ) {
this.api_request_schedule = TTAPI.APIRequestSchedule;
this.schedule_api = TTAPI.APISchedule;
}
if ( ( Global.getProductEdition() >= 20 ) ) {
this.job_api = TTAPI.APIJob;
this.job_item_api = TTAPI.APIJobItem;
this.punch_tag_api = TTAPI.APIPunchTag;
}
this.authorization_api = TTAPI.APIAuthorization;
this.initPermission();
this.render();
this.buildContextMenu();
this.initData();
}
// override allows a callback after initOptions when run as sub view (from EmployeeViewController)
initOptions( callBack ) {
var options = [
{ option_name: 'status' },
{ option_name: 'type' }
];
if ( ( Global.getProductEdition() >= 15 ) ) {
options.push( { option_name: 'overlap_type', api: TTAPI.APIRequestSchedule } );
}
this.initDropDownOptions( options, function( result ) {
if ( callBack ) {
callBack( result ); // First to initialize drop down options, and then to initialize edit view UI.
}
} );
}
buildEditViewUI() {
super.buildEditViewUI();
var tab_model = {
'tab_request': { 'label': $.i18n._( 'Message' ) },
'tab_audit': true,
};
this.setTabModel( tab_model );
//This hides the audit tab as this view is always used for creating/replying to an existing request.
//For some reason removing 'tab_audit' from the model above results in a blank tab appearing.
var tab_audit_label = this.edit_view.find( 'a[ref=tab_audit]' );
tab_audit_label.css( 'display', 'none' );
//Tab 0 start
var tab_request = this.edit_view_tab.find( '#tab_request' );
var tab_request_column1 = tab_request.find( '.first-column' );
var tab_request_column2 = tab_request.find( '.second-column' );
this.edit_view_tabs[0] = [];
this.edit_view_tabs[0].push( tab_request_column1 );
// Subject
var form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
form_item_input.TTextInput( { field: 'subject', width: 359 } );
this.addEditFieldToColumn( $.i18n._( 'Subject' ), form_item_input, tab_request_column1, '' );
// Body
form_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );
form_item_input.TTextArea( { field: 'body', width: 600, height: 400 } );
this.addEditFieldToColumn( $.i18n._( 'Body' ), form_item_input, tab_request_column1, '', null, null, true );
tab_request_column2.css( 'display', 'none' );
}
buildAddViewUI() {
super.buildEditViewUI();
var $this = this;
var tab_model = {
'tab_request': { 'label': $.i18n._( 'Request' ), 'is_multi_column': true },
'tab_audit': true,
};
this.setTabModel( tab_model );
//This hides the audit tab as this view is always used for creating/replying to an existing request.
//For some reason removing 'tab_audit' from the model above results in a blank tab appearing.
var tab_audit_label = this.edit_view.find( 'a[ref=tab_audit]' );
tab_audit_label.css( 'display', 'none' );
//Tab 0 start
var tab_request = this.edit_view_tab.find( '#tab_request' );
var tab_request_column1 = tab_request.find( '.first-column' );
var tab_request_column2 = tab_request.find( '.second-column' );
this.edit_view_tabs[0] = [];
this.edit_view_tabs[0].push( tab_request_column1 );
this.edit_view_tabs[0].push( tab_request_column2 );
var form_item_input;
var widgetContainer;
var label;
// Employee
form_item_input = Global.loadWidgetByName( FormItemType.TEXT );
form_item_input.TText( { field: 'full_name' } );
this.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_request_column1, '' );
// Type
form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );
form_item_input.TComboBox( { field: 'type_id', set_empty: false } );
form_item_input.setSourceData( $this.type_array );
this.addEditFieldToColumn( $.i18n._( 'Type' ), form_item_input, tab_request_column1 );
// Date
form_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );
form_item_input.TDatePicker( { field: 'date_stamp' } );
widgetContainer = $( '<div class=\'widget-h-box\'></div>' );
label = $( '<span class=\'widget-right-label\'> ' + $.i18n._( '(Use the first or only date affected by this request)' ) + '</span>' );
widgetContainer.append( form_item_input );
widgetContainer.append( label );
this.addEditFieldToColumn( $.i18n._( 'Date' ), form_item_input, tab_request_column1, '', widgetContainer );
if ( Global.getProductEdition() >= 15 && PermissionManager.validate( 'request', 'add_advanced' ) ) {
//Working Status
form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );
form_item_input.TComboBox( { field: 'request_schedule_status_id', set_empty: false } );
form_item_input.setSourceData( { 10: 'Working', 20: 'Absent' } );
this.addEditFieldToColumn( $.i18n._( 'Status' ), form_item_input, tab_request_column1 );
//Absence Policy
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
form_item_input.AComboBox( {
api_class: TTAPI.APIAbsencePolicy,
customSearchFilter: function() {
return { filter_data: { user_id: LocalCacheData.getLoginUser().id } };
},
allow_multiple_selection: false,
layout_name: 'global_absences',
set_empty: true,
field: 'absence_policy_id'
} );
this.addEditFieldToColumn( $.i18n._( 'Absence Policy' ), form_item_input, tab_request_column1 );
//Available Balance
form_item_input = Global.loadWidgetByName( FormItemType.TEXT );
form_item_input.TText( { field: 'available_balance' } );
widgetContainer = $( '<div class=\'widget-h-box available-balance-h-box\'></div>' );
this.available_balance_info = $( '<span class="available-balance-info tticon tticon-info_black_24dp"></span>' );
widgetContainer.append( form_item_input );
widgetContainer.append( this.available_balance_info );
this.addEditFieldToColumn( $.i18n._( 'Available Balance' ), form_item_input, tab_request_column1, '', widgetContainer, true );
//Start Date
form_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );
form_item_input.TDatePicker( { field: 'start_date' } );
this.addEditFieldToColumn( $.i18n._( 'Start Date' ), form_item_input, tab_request_column1, '' );
//End Date
form_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );
form_item_input.TDatePicker( { field: 'end_date' } );
this.addEditFieldToColumn( $.i18n._( 'End Date' ), form_item_input, tab_request_column1, '' );
// Effective Days
var form_item_sun_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
form_item_sun_checkbox.TCheckbox( { field: 'sun' } );
var form_item_mon_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
form_item_mon_checkbox.TCheckbox( { field: 'mon' } );
var form_item_tue_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
form_item_tue_checkbox.TCheckbox( { field: 'tue' } );
var form_item_wed_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
form_item_wed_checkbox.TCheckbox( { field: 'wed' } );
var form_item_thu_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
form_item_thu_checkbox.TCheckbox( { field: 'thu' } );
var form_item_fri_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
form_item_fri_checkbox.TCheckbox( { field: 'fri' } );
var form_item_sat_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
form_item_sat_checkbox.TCheckbox( { field: 'sat' } );
widgetContainer = $( '<div></div>' );
var sun = $( '<span class=\'widget-top-label\'> ' + $.i18n._( 'Sun' ) + ' <br> ' + ' </span>' );
var mon = $( '<span class=\'widget-top-label\'> ' + $.i18n._( 'Mon' ) + ' <br> ' + ' </span>' );
var tue = $( '<span class=\'widget-top-label\'> ' + $.i18n._( 'Tue' ) + ' <br> ' + ' </span>' );
var wed = $( '<span class=\'widget-top-label\'> ' + $.i18n._( 'Wed' ) + ' <br> ' + ' </span>' );
var thu = $( '<span class=\'widget-top-label\'> ' + $.i18n._( 'Thu' ) + ' <br> ' + ' </span>' );
var fri = $( '<span class=\'widget-top-label\'> ' + $.i18n._( 'Fri' ) + ' <br> ' + ' </span>' );
var sat = $( '<span class=\'widget-top-label\'> ' + $.i18n._( 'Sat' ) + ' <br> ' + ' </span>' );
sun.append( form_item_sun_checkbox );
mon.append( form_item_mon_checkbox );
tue.append( form_item_tue_checkbox );
wed.append( form_item_wed_checkbox );
thu.append( form_item_thu_checkbox );
fri.append( form_item_fri_checkbox );
sat.append( form_item_sat_checkbox );
widgetContainer.append( sun );
widgetContainer.append( mon );
widgetContainer.append( tue );
widgetContainer.append( wed );
widgetContainer.append( thu );
widgetContainer.append( fri );
widgetContainer.append( sat );
widgetContainer.addClass( 'request_edit_view_effective_days' );
this.addEditFieldToColumn( $.i18n._( 'Effective Days' ), [form_item_sun_checkbox, form_item_mon_checkbox, form_item_tue_checkbox, form_item_wed_checkbox, form_item_thu_checkbox, form_item_fri_checkbox, form_item_sat_checkbox], tab_request_column1, '', widgetContainer, false, true );
//Start time
form_item_input = Global.loadWidgetByName( FormItemType.TIME_PICKER );
form_item_input.TTimePicker( { field: 'start_time' } );
this.addEditFieldToColumn( $.i18n._( 'In' ), form_item_input, tab_request_column1 );
//End time
form_item_input = Global.loadWidgetByName( FormItemType.TIME_PICKER );
form_item_input.TTimePicker( { field: 'end_time' } );
this.addEditFieldToColumn( $.i18n._( 'Out' ), form_item_input, tab_request_column1 );
// Total
form_item_input = Global.loadWidgetByName( FormItemType.TEXT );
form_item_input.TText( { field: 'total_time' } );
widgetContainer = $( '<div class=\'widget-h-box\'></div>' );
label = $( '<span class=\'widget-right-label\' id=\'total_info\'></span>' );
widgetContainer.append( form_item_input );
widgetContainer.append( label );
this.addEditFieldToColumn( $.i18n._( 'Total' ), form_item_input, tab_request_column1, '', widgetContainer );
if ( ( Global.getProductEdition() >= 15 ) && this.overlappingShiftUIValidate() == true ) {
//Override / Split shift
var form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );
form_item_input.TComboBox( { field: 'overlap_type_id', set_empty: false } );
form_item_input.setSourceData( this.overlap_type_array );
widgetContainer = $( '<div class=\'widget-h-box overlapping-shift-h-box\'></div>' );
this.overlapping_shift_info = $( '<span style="position: relative; top: -3px; left: 3px;" id="overlapping-shift-total"></span><span id="overlapping-shift-icon" class="overlapping-shift-info tticon tticon-info_black_24dp"></span>' );
widgetContainer.append( form_item_input );
widgetContainer.append( this.overlapping_shift_info );
this.addEditFieldToColumn( $.i18n._( 'Overlapping Shift(s)' ), form_item_input, tab_request_column1, '', widgetContainer, true );
}
//Schedule Policy
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
form_item_input.AComboBox( {
api_class: TTAPI.APISchedulePolicy,
allow_multiple_selection: false,
layout_name: 'global_schedule',
show_search_inputs: true,
set_empty: true,
field: 'schedule_policy_id'
} );
this.addEditFieldToColumn( $.i18n._( 'Schedule Policy' ), form_item_input, tab_request_column1 );
//branch
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
form_item_input.AComboBox( {
api_class: TTAPI.APIBranch,
allow_multiple_selection: false,
layout_name: 'global_branch',
show_search_inputs: true,
set_empty: true,
field: 'branch_id'
} );
if ( this.show_branch_ui ) {
this.addEditFieldToColumn( $.i18n._( 'Branch' ), form_item_input, tab_request_column1 );
}
//Dept
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
form_item_input.AComboBox( {
api_class: TTAPI.APIDepartment,
allow_multiple_selection: false,
layout_name: 'global_department',
show_search_inputs: true,
set_empty: true,
field: 'department_id'
} );
if ( this.show_department_ui ) {
this.addEditFieldToColumn( $.i18n._( 'Department' ), form_item_input, tab_request_column1 );
}
if ( ( Global.getProductEdition() >= 20 ) ) {
//Job
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
form_item_input.AComboBox( {
api_class: TTAPI.APIJob,
allow_multiple_selection: false,
layout_name: 'global_job',
show_search_inputs: true,
set_empty: true,
setRealValueCallBack: ( function( val ) {
if ( val ) {
job_coder.setValue( val.manual_id );
}
} ),
field: 'job_id',
added_items: [
{ value: '-1', label: Global.default_item },
{ value: '-2', label: Global.selected_item }
]
} );
widgetContainer = $( '<div class=\'widget-h-box\'></div>' );
var job_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
job_coder.TTextInput( { field: 'job_quick_search', disable_keyup_event: true } );
job_coder.addClass( 'job-coder' );
widgetContainer.append( job_coder );
widgetContainer.append( form_item_input );
this.addEditFieldToColumn( $.i18n._( 'Job' ), [form_item_input, job_coder], tab_request_column1, '', widgetContainer, true );
if ( !this.show_job_ui ) {
//invalid permissions
this.detachElement( 'job_id' );
}
//Job Item
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
form_item_input.AComboBox( {
api_class: TTAPI.APIJobItem,
allow_multiple_selection: false,
layout_name: 'global_job_item',
show_search_inputs: true,
set_empty: true,
setRealValueCallBack: ( function( val ) {
if ( val ) {
job_item_coder.setValue( val.manual_id );
}
} ),
field: 'job_item_id',
added_items: [
{ value: '-1', label: Global.default_item },
{ value: '-2', label: Global.selected_item }
]
} );
widgetContainer = $( '<div class=\'widget-h-box\'></div>' );
var job_item_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
job_item_coder.TTextInput( { field: 'job_item_quick_search', disable_keyup_event: true } );
job_item_coder.addClass( 'job-coder' );
widgetContainer.append( job_item_coder );
widgetContainer.append( form_item_input );
this.addEditFieldToColumn( $.i18n._( 'Task' ), [form_item_input, job_item_coder], tab_request_column1, '', widgetContainer, true );
if ( !this.show_job_item_ui ) {
//invalid permissions
this.detachElement( 'job_item_id' );
}
//Punch Tag
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
form_item_input.AComboBox( {
api_class: TTAPI.APIPunchTag,
allow_multiple_selection: true,
layout_name: 'global_punch_tag',
show_search_inputs: true,
set_empty: true,
setRealValueCallBack: ( ( punch_tags ) => {
if ( punch_tags ) {
this.setPunchTagQuickSearchManualIds( punch_tags );
}
} ),
field: 'punch_tag_id'
} );
widgetContainer = $( '<div class=\'widget-h-box\'></div>' );
var punch_tag_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
punch_tag_coder.TTextInput( { field: 'punch_tag_quick_search', disable_keyup_event: true } );
punch_tag_coder.addClass( 'job-coder' );
widgetContainer.append( punch_tag_coder );
widgetContainer.append( form_item_input );
this.addEditFieldToColumn( $.i18n._( 'Tags' ), [form_item_input, punch_tag_coder], tab_request_column1, '', widgetContainer, true );
if ( !this.show_punch_tag_ui ) {
//invalid permissions
this.detachElement( 'punch_tag_id' );
}
}
}
// Message
form_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );
form_item_input.TTextArea( { field: 'message', width: 400, height: 300 } );
this.addEditFieldToColumn( $.i18n._( 'Reason / Message' ), form_item_input, tab_request_column1, '', null, null, true );
//hide initially hidden fields.
//tab_request_column2.css( 'display', 'none' );
if ( Global.getProductEdition() >= 15 && PermissionManager.validate( 'request', 'add_advanced' ) ) {
this.edit_view_ui_dic.available_balance.parents( '.edit-view-form-item-div' ).hide();
this.hideAdvancedFields();
}
this.onTypeChanged();
this.onWorkingStatusChanged();
}
buildSearchFields() {
super.buildSearchFields();
this.search_fields = [
new SearchField( {
label: $.i18n._( 'Employee' ),
in_column: 1,
field: 'user_id',
layout_name: 'global_user',
api_class: TTAPI.APIUser,
multiple: true,
basic_search: true,
adv_search: false,
form_item_type: FormItemType.AWESOME_BOX
} ),
new SearchField( {
label: $.i18n._( 'Type' ),
in_column: 1,
field: 'type_id',
multiple: true,
basic_search: true,
adv_search: false,
layout_name: 'global_option_column',
form_item_type: FormItemType.AWESOME_BOX
} ),
new SearchField( {
label: $.i18n._( 'Start Date' ),
in_column: 1,
field: 'start_date',
basic_search: true,
adv_search: false,
form_item_type: FormItemType.DATE_PICKER
} ),
new SearchField( {
label: $.i18n._( 'End Date' ),
in_column: 1,
field: 'end_date',
basic_search: true,
adv_search: false,
form_item_type: FormItemType.DATE_PICKER
} ),
new SearchField( {
label: $.i18n._( 'Status' ),
in_column: 2,
field: 'status_id',
multiple: true,
basic_search: true,
adv_search: false,
layout_name: 'global_option_column',
form_item_type: FormItemType.AWESOME_BOX
} ),
new SearchField( {
label: $.i18n._( 'Created By' ),
in_column: 2,
field: 'created_by',
layout_name: 'global_user',
api_class: TTAPI.APIUser,
multiple: true,
basic_search: true,
adv_search: false,
form_item_type: FormItemType.AWESOME_BOX
} ),
new SearchField( {
label: $.i18n._( 'Updated By' ),
in_column: 2,
field: 'updated_by',
layout_name: 'global_user',
api_class: TTAPI.APIUser,
multiple: true,
basic_search: true,
adv_search: false,
form_item_type: FormItemType.AWESOME_BOX
} )
];
}
getCustomContextMenuModel() {
var context_menu_model = {
exclude: ['default'],
include: [
{
label: $.i18n._( 'New' ),
id: 'add',
group: 'editor',
vue_icon: 'tticon tticon-add_black_24dp',
show_on_right_click: true,
},
{
label: $.i18n._( 'View' ),
id: 'view',
group: 'editor',
vue_icon: 'tticon tticon-visibility_black_24dp',
show_on_right_click: true,
sort_order: 1010
},
{
label: $.i18n._( 'Reply' ),
id: 'edit',
vue_icon: 'tticon tticon-reply_black_24dp'
},
{
label: $.i18n._( 'Send' ),
id: 'send',
group: 'editor',
vue_icon: 'tticon tticon-send_black_24dp'
},
{
label: $.i18n._( 'Delete' ),
id: 'delete_icon',
action_group: 'delete',
group: 'editor',
vue_icon: 'tticon tticon-delete_black_24dp',
show_on_right_click: true,
},
{
label: $.i18n._( 'Delete & Next' ),
id: 'delete_and_next',
action_group: 'delete',
group: 'editor',
vue_icon: 'tticon tticon-delete_black_24dp'
},
{
label: $.i18n._( 'Cancel' ),
id: 'cancel',
group: 'editor',
sort_order: 1990
},
{
label: $.i18n._( 'Jump To' ),
id: 'jump_to_header',
menu_align: 'right',
action_group: 'jump_to',
action_group_header: true,
permission_result: false // to hide it in legacy context menu and avoid errors in legacy parsers.
},
{
label: $.i18n._( 'TimeSheet' ),
id: 'timesheet',
menu_align: 'right',
action_group: 'jump_to',
group: 'navigation',
},
{
label: $.i18n._( 'Schedule' ),
id: 'schedule',
menu_align: 'right',
action_group: 'jump_to',
group: 'navigation',
},
{
label: $.i18n._( 'Export' ),
id: 'export_excel',
menu_align: 'right',
vue_icon: 'tticon tticon-file_upload_black_24dp',
sort_order: 100
},
{
label: $.i18n._( 'Edit Employee' ),
id: 'edit_employee',
menu_align: 'right',
action_group: 'jump_to',
},
]
};
return context_menu_model;
}
setCurrentEditRecordData( current_edit_record ) {
var $this = this;
if ( current_edit_record ) {
this.current_edit_record = current_edit_record;
}
if ( !this.current_edit_record ) {
this.current_edit_record = {};
}
//Set current edit record data to all widgets
for ( var key in this.current_edit_record ) {
if ( !this.current_edit_record.hasOwnProperty( key ) ) {
continue;
}
var widget = this.edit_view_ui_dic[key];
if ( Global.isSet( widget ) ) {
switch ( key ) {
case 'full_name':
if ( this.is_add ) {
widget.setValue( LocalCacheData.loginUser.first_name + ' ' + LocalCacheData.loginUser.last_name );
} else if ( this.is_viewing ) {
widget.setValue( this.current_edit_record['first_name'] + ' ' + this.current_edit_record['last_name'] );
}
break;
case 'subject':
// Error: Uncaught TypeError: Cannot read property '0' of null in /interface/html5/#!m=Request&a=view&id=13185&tab=Request line 505
if ( this.is_edit && this.messages ) {
widget.setValue( 'Re: ' + this.messages[0].subject );
} else if ( this.is_viewing ) {
widget.setValue( this.current_edit_record[key] );
}
break;
case 'punch_tag_id':
if ( ( Global.getProductEdition() >= 20 ) ) {
widget.setValue( this.current_edit_record[key] );
this.previous_punch_tag_selection = this.current_edit_record[key];
var punch_tag_widget = widget;
TTPromise.wait( null, null, function() {
//Update default args for punch tags AComboBox last as they rely on data from job, job item and related fields.
var args = {};
args.filter_data = $this.getPunchTagFilterData();
punch_tag_widget.setDefaultArgs( args );
} );
}
break;
default:
widget.setValue( this.current_edit_record[key] );
break;
}
}
}
this.collectUIDataToCurrentEditRecord();
//a new request comes from the current user.
if ( this.is_add ) {
this.current_edit_record.user_id = LocalCacheData.loginUser.id;
}
this.setEditViewDataDone();
}
setEditViewDataDone() {
var $this = this;
super.setEditViewDataDone();
if ( this.is_viewing ) {
} else {
if ( Global.isSet( $this.messages ) ) {
$this.messages = null;
}
}
if ( ( Global.getProductEdition() >= 15 ) ) {
$this.getOverlappingShifts();
}
}
initViewingView() {
super.initViewingView();
if ( this.edit_view_ui_dic.message ) {
this.edit_view_ui_dic.message.parents( '.edit-view-form-item-div' ).hide();
}
if ( Global.getProductEdition() >= 15 && ( this.edit_view_ui_dic.type_id == 30 || this.edit_view_ui_dic.type_id == 40 ) ) {
var dow = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
var one_selected = false;
for ( var key in this.current_edit_record ) {
if ( dow.indexOf( key ) > -1 ) {
for ( var i = 0; i < 7; i++ ) {
if ( this.current_edit_record[key] !== 0 && this.current_edit_record[key] !== false ) {
one_selected = true;
break;
}
}
if ( one_selected ) {
this.edit_view_ui_dic['sun'].parents( '.edit-view-form-item-div' ).show();
} else {
this.edit_view_ui_dic['sun'].parents( '.edit-view-form-item-div' ).hide();
}
}
}
}
}
setURL() {
if ( LocalCacheData.current_doing_context_action === 'edit' ) {
LocalCacheData.current_doing_context_action = '';
return;
}
super.setURL();
}
setCustomDefaultMenuIcon( id, context_btn, grid_selected_length ) {
switch ( id ) {
case 'send':
this.setDefaultMenuSendIcon( context_btn, grid_selected_length );
break;
case 'timesheet':
this.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'punch' );
break;
case 'schedule':
this.setDefaultMenuViewIcon( context_btn, grid_selected_length, 'schedule' );
break;
case 'edit_employee':
this.setDefaultMenuEditEmployeeIcon( context_btn, grid_selected_length, 'user' );
break;
}
}
setCustomEditMenuIcon( id, context_btn ) {
switch ( id ) {
case 'send':
this.setEditMenuSaveIcon( context_btn );
break;
case 'timesheet':
this.setEditMenuNavViewIcon( context_btn, 'punch' );
break;
case 'schedule':
this.setEditMenuNavViewIcon( context_btn, 'schedule' );
break;
case 'edit_employee':
this.setEditMenuNavEditIcon( context_btn, 'user' );
break;
}
}
setDefaultMenuCancelIcon( context_btn, grid_selected_length, pId ) {
if ( !this.sub_view_mode && !this.is_viewing ) {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
setDefaultMenuExportIcon( context_btn, grid_selected_length, pId ) {
if ( this.edit_only_mode || this.is_viewing || this.is_edit || this.is_add ) {
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
} else if ( grid_selected_length == 0 || this.grid == undefined ) {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
setEditMenuAddIcon( context_btn, pId ) {
super.setEditMenuAddIcon( context_btn, pId );
if ( this.is_edit || this.is_add ) {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
setEditMenuDeleteAndNextIcon( context_btn, pId ) {
if ( this.is_edit || this.is_add ) {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
setEditMenuNavViewIcon( context_btn, pId ) {
if ( this.is_edit || this.is_add ) {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
setEditMenuDeleteIcon( context_btn, pId ) {
if ( this.is_edit || this.is_add ) {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
onTypeChanged( arg ) {
if ( this.current_edit_record && Global.getProductEdition() >= 15 && PermissionManager.validate( 'request', 'add_advanced' ) && ( this.current_edit_record.type_id == 30 || this.current_edit_record.type_id == 40 ) ) { //schedule adjustment || absence selected
if ( this.edit_view_ui_dic.date_stamp ) {
this.edit_view_ui_dic.date_stamp.parents( '.edit-view-form-item-div' ).hide();
}
if ( this.current_edit_record.date_stamp != undefined && this.current_edit_record.start_date == '' ) {
this.edit_view_ui_dic.start_date.setValue( this.current_edit_record.date_stamp );
this.current_edit_record.start_date = this.current_edit_record.date_stamp;
}
if ( this.current_edit_record.date_stamp != undefined && this.current_edit_record.end_date == '' ) {
this.edit_view_ui_dic.end_date.setValue( this.current_edit_record.date_stamp );
this.current_edit_record.end_date = this.current_edit_record.date_stamp;
}
this.showAdvancedFields( false ); //Don't update schedule total time as it will be done lower down in setRequestFormDefaultData();
if ( this.edit_view_ui_dic.type_id.getValue() == 30 ) {
this.edit_view_ui_dic.request_schedule_status_id.setValue( 20 );
} else if ( this.edit_view_ui_dic.type_id.getValue() == 40 ) {
this.edit_view_ui_dic.request_schedule_status_id.setValue( 10 );
}
if ( arg ) {
arg.request_schedule_status_id = this.edit_view_ui_dic.request_schedule_status_id.getValue(); //arg is passed on setRequestFormDefaultData() below, so make sure it matches the UI here.
}
this.onWorkingStatusChanged();
var $this = this;
this.setRequestFormDefaultData( arg, function() {
$this.getAvailableBalance();
$this.setCurrentEditRecordData( $this.current_edit_record );
$this.getScheduleTotalTime();
} );
} else {
this.hideAdvancedFields();
if ( this.edit_view_ui_dic.date_stamp ) {
this.edit_view_ui_dic.date_stamp.parents( '.edit-view-form-item-div' ).show();
}
this.onWorkingStatusChanged();
}
}
setRequestFormDefaultData( data, callback_function ) {
if ( Global.getProductEdition() >= 15 && PermissionManager.validate( 'request', 'add_advanced' ) && ( this.current_edit_record.type_id == 30 || this.current_edit_record.type_id == 40 ) ) {
if ( data == undefined ) {
var $this = this;
this.enable_validation = false;
this.setUIWidgetFieldsToCurrentEditRecord();
var filter = this.uniformVariable( this.buildDataForAPI( this.current_edit_record ) );
this.api_request_schedule.getRequestScheduleDefaultData( filter, {
onResult: function( res ) {
data = res.getResult();
data.request_schedule_status_id = data.status_id;
data.date_stamp = data.start_date;
//force = true is required to set the current_edit_record and populate edit_view_ui_dic
$this.setDefaultData( data, true );
if ( callback_function ) {
callback_function();
}
}
} );
} else {
data.date_stamp = data.start_date;
data = this.buildDataFromAPI( data );
//force = true is required to set the current_edit_record and populate edit_view_ui_dic
this.setDefaultData( data, true );
if ( callback_function ) {
callback_function();
}
}
}
}
onAvailableBalanceChange() {
if ( Global.getProductEdition() >= 15 && PermissionManager.validate( 'request', 'add_advanced' ) ) {
if ( this.edit_view_ui_dic && this.edit_view_ui_dic.absence_policy_id && this.edit_view_ui_dic.request_schedule_status_id.getValue() == 20 && this.edit_view_ui_dic.absence_policy_id.getValue() != TTUUID.zero_id ) {
this.getAvailableBalance();
} else if ( this.edit_view_ui_dic && this.edit_view_ui_dic.available_balance ) {
this.edit_view_ui_dic.available_balance.parents( '.edit-view-form-item-div' ).hide();
}
}
}
//post hook for onSaveResult
onSaveDone( result ) {
var retval;
if ( this.is_edit ) {
this.onViewClick( this.current_edit_record.id );
retval = false;
} else {
retval = true;
}
$().TFeedback( {
source: 'Send'
} );
//If request was added from the TimeSheet view, refresh the TimeSheet.
if ( LocalCacheData.current_open_primary_controller && LocalCacheData.current_open_primary_controller.viewId === 'TimeSheet' ) {
LocalCacheData.current_open_primary_controller.search();
}
return retval;
}
uniformVariable( records ) {
if ( typeof records === 'object' ) {
records.user_id = LocalCacheData.loginUser.id;
records.first_name = LocalCacheData.loginUser.first_name;
records.last_name = LocalCacheData.loginUser.last_name;
}
if ( this.is_add ) {
records = this.buildDataForAPI( records );
} else if ( this.is_edit ) {
var msg = this.uniformMessageVariable( records );
if ( records && records.request_schedule ) {
msg.request_schedule = records.request_schedule;
}
return msg;
}
return records;
}
onSaveClick( ignoreWarning ) {
var $this = this;
LocalCacheData.current_doing_context_action = 'save';
if ( !Global.isSet( ignoreWarning ) ) {
ignoreWarning = false;
}
for ( var key in $this.current_edit_record ) {
if ( $this.edit_view_ui_dic[key] != undefined ) {
$this.current_edit_record[key] = $this.edit_view_ui_dic[key].getValue();
}
}
if ( this.is_add ) {
// //format data as expected by API
record = this.uniformVariable( $this.current_edit_record );
this.api['set' + this.api.key_name]( record, false, ignoreWarning, {
onResult: function( result ) {
$this.onSaveResult( result );
}
} );
} else if ( this.is_edit ) {
var record = {};
this.is_add = false;
this.setCurrentEditRecordData();
record = this.uniformVariable( this.current_edit_record );
EmbeddedMessage.reply( [record], ignoreWarning, function( result ) {
if ( result.isValid() ) {
var id = $this.current_edit_record.id;
//see #2224 - Unable to get property 'find' of undefined
$this.removeEditView();
$this.onViewClick( id );
} else {
$this.setErrorTips( result );
$this.setErrorMenu();
}
}
);
}
}
search( set_default_menu, page_action, page_number, callBack ) {
this.refresh_id = null;
super.search( set_default_menu, page_action, page_number, callBack );
}
setEditMenuEditIcon( context_btn ) {
if ( !this.editPermissionValidate( 'request' ) || this.edit_only_mode || this.is_mass_editing ) {
//Not shown in edit only mode or mass edit. Mass edit should only show mass edit (need to set that part in mass edit icon).
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
if ( !this.is_viewing || !this.editOwnerOrChildPermissionValidate( 'request' ) ) {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
setDefaultMenuEditIcon( context_btn, grid_selected_length ) {
if ( !this.editPermissionValidate( 'request' ) || this.edit_only_mode || ( !this.is_edit || !this.is_viewing ) ) {
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )
}
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
setDefaultMenuScheduleIcon( context_btn, grid_selected_length, pId ) {
if ( !PermissionManager.checkTopLevelPermission( 'Schedule' ) || this.edit_only_mode ) {
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )
}
if ( grid_selected_length === 1 ) {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );
} else {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
setDefaultMenuSendIcon( context_btn, grid_selected_length, pId ) {
if ( !this.addPermissionValidate( pId ) || this.edit_only_mode || ( !this.is_edit || !this.is_viewing ) ) {
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )
}
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
setDefaultMenuEditEmployeeIcon( context_btn, grid_selected_length ) {
if ( !this.editChildPermissionValidate( 'user' ) ) {
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )
}
if ( grid_selected_length === 1 ) {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );
} else {
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}
onCustomContextClick( id ) {
switch ( id ) {
case 'timesheet':
case 'schedule':
case 'edit_employee':
this.onNavigationClick( id );
break;
case 'send':
this.onSaveClick();
break;
}
}
setEditViewWidgetsMode() {
var did_clean = false;
for ( var key in this.edit_view_ui_dic ) {
var widget = this.edit_view_ui_dic[key];
widget.css( 'opacity', 1 );
var column = widget.parent().parent().parent();
if ( !column.hasClass( 'v-box' ) ) {
if ( !did_clean ) {
did_clean = true;
}
}
if ( this.is_viewing ) {
if ( Global.isSet( widget.setEnabled ) ) {
widget.setEnabled( false );
}
} else {
if ( Global.isSet( widget.setEnabled ) ) {
widget.setEnabled( true );
}
}
}
}
onFormItemChange( target, doNotValidate ) {
var $this = this;
this.collectUIDataToCurrentEditRecord();
this.setIsChanged( target );
this.setMassEditingFieldsWhenFormChange( target );
var key = target.getField();
var c_value = target.getValue();
this.current_edit_record[key] = c_value;
var needs_callback = false;
switch ( key ) {
case 'job_id':
if ( ( Global.getProductEdition() >= 20 ) ) {
this.edit_view_ui_dic['job_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );
this.setJobItemValueWhenJobChanged( target.getValue( true ), 'job_item_id' );
this.edit_view_ui_dic['job_quick_search'].setCheckBox( true );
this.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );
}
break;
case 'job_item_id':
if ( ( Global.getProductEdition() >= 20 ) ) {
this.edit_view_ui_dic['job_item_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );
this.edit_view_ui_dic['job_item_quick_search'].setCheckBox( true );
this.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );
}
break;
case 'punch_tag_id':
if ( ( Global.getProductEdition() >= 20 ) ) {
if ( c_value !== TTUUID.zero_id && c_value !== false && c_value.length > 0 ) {
this.setPunchTagQuickSearchManualIds( target.getSelectItems() );
} else {
this.edit_view_ui_dic['punch_tag_quick_search'].setValue( '' );
}
$this.previous_punch_tag_selection = c_value;
//Reset source data to make sure correct punch tags are always shown.
this.edit_view_ui_dic['punch_tag_id'].setSourceData( null );
}
break;
case 'user_id':
case 'branch_id':
case 'department_id':
if ( ( Global.getProductEdition() >= 20 ) ) {
this.setPunchTagValuesWhenCriteriaChanged( this.getPunchTagFilterData(), 'punch_tag_id' );
}
break;
case 'job_quick_search':
case 'job_item_quick_search':
if ( ( Global.getProductEdition() >= 20 ) ) {
this.onJobQuickSearch( key, c_value, 'job_id', 'job_item_id' );
TTPromise.wait( 'BaseViewController', 'onJobQuickSearch', function() {
$this.setPunchTagValuesWhenCriteriaChanged( $this.getPunchTagFilterData(), 'punch_tag_id' );
} );
}
break;
case 'punch_tag_quick_search':
if ( ( Global.getProductEdition() >= 20 ) ) {
this.onPunchTagQuickSearch( c_value, this.getPunchTagFilterData(), 'punch_tag_id' );
//Don't validate immediately as onJobQuickSearch is doing async API calls, and it would cause a guaranteed validation failure.
doNotValidate = true;
}
break;
case 'type_id':
// Set absence_policy_id to zero id to prevent available balance field showing when switching to a none absence request type.
// Also prevents available balance sometimes showing the wrong value due to mismatch in select menu and current_edit_record.
if ( this.edit_view_ui_dic.absence_policy_id && ( this.current_edit_record.type_id === 30 || this.current_edit_record.type_id === 40 ) ) {
this.edit_view_ui_dic.absence_policy_id.setValue( TTUUID.zero_id );
this.current_edit_record.absence_policy_id = TTUUID.zero_id;
}
doNotValidate = true;
this.onTypeChanged();
break;
case 'overlap_type_id':
if ( ( Global.getProductEdition() >= 15 ) ) {
this.getOverlappingShifts();
}
break;
case 'date_stamp':
this.onDateStampChanged();
break;
case 'request_schedule_status_id':
this.onWorkingStatusChanged();
break;
case 'start_date':
this.current_edit_record.start_date = this.edit_view_ui_dic.start_date.getValue();
this.current_edit_record.date_stamp = this.edit_view_ui_dic.start_date.getValue();
this.onStartDateChanged();
this.setRequestFormDefaultData( null, function() {
finishFormItemChange();
if ( ( Global.getProductEdition() >= 15 ) ) {
$this.getOverlappingShifts();
}
} );
needs_callback = true;
break;
case 'end_date':
this.current_edit_record.end_date = this.edit_view_ui_dic.end_date.getValue();
this.setRequestFormDefaultData( null, function() {
finishFormItemChange();
if ( ( Global.getProductEdition() >= 15 ) ) {
$this.getOverlappingShifts();
}
} );
needs_callback = true;
break;
case 'start_time':
case 'end_time':
if ( ( Global.getProductEdition() >= 15 ) ) {
this.getOverlappingShifts();
}
break;
case 'sun':
case 'mon':
case 'tue':
case 'wed':
case 'thu':
case 'fri':
case 'sat':
this.getScheduleTotalTime();
if ( ( Global.getProductEdition() >= 15 ) ) {
this.getOverlappingShifts();
}
break;
case 'schedule_policy_id':
if ( ( Global.getProductEdition() >= 15 ) ) {
$this.getOverlappingShifts();
}
break;
case'absence_policy_id':
this.selected_absence_policy_record = this.edit_view_ui_dic.absence_policy_id.getValue();
break;
case 'is_replace_with_open_shift':
if ( ( Global.getProductEdition() >= 15 ) ) {
this.getOverlappingShifts();
}
break;
}
if ( !needs_callback ) {
finishFormItemChange();
}
function finishFormItemChange() {
if ( key === 'date_stamp' ||
key === 'start_date_stamps' ||
key === 'start_date' ||
key === 'end_date' ||
key === 'start_date_stamp' ||
key === 'start_time' ||
key === 'end_time' ||
key === 'schedule_policy_id' ||
key === 'absence_policy_id' ) {
if ( $this.current_edit_record['date_stamp'] !== '' &&
$this.current_edit_record['start_time'] !== '' &&
$this.current_edit_record['end_time'] !== '' ) {
$this.getScheduleTotalTime();
} else {
$this.onAvailableBalanceChange();
}
}
if ( !doNotValidate ) {
$this.validate();
}
$this.setEditMenu();
}
}
validate() {
var $this = this;
var record = this.current_edit_record;
record = this.uniformVariable( record );
var api = this.message_control_api;
if ( this.is_add ) {
record = this.buildDataForAPI( record );
api = this.api;
}
api['validate' + api.key_name]( record, {
onResult: function( result ) {
$this.validateResult( result );
}
} );
}
onAddClick( data ) {
TTPromise.add( 'Request', 'add' );
TTPromise.wait();
var $this = this;
if ( this.edit_view ) {
this.removeEditView();
}
this.setCurrentEditViewState( 'new' );
this.openEditView();
this.buildAddViewUI();
//Error: Uncaught TypeError: undefined is not a function in /interface/html5/views/BaseViewController.js?v=8.0.0-20141117-111140 line 897
if ( $this.api && typeof $this.api['get' + $this.api.key_name + 'DefaultData'] === 'function' ) {
$this.api['get' + $this.api.key_name + 'DefaultData']( {
onResult: function( result ) {
if ( data ) {
//data passed should overwrite the default data from the API.
result = $.extend( {}, result.getResult(), data );
}
$this.onAddResult( result );
$this.onDateStampChanged();
if ( result.type_id ) {
$this.onTypeChanged( result );
} else {
$this.getScheduleTotalTime(); //This is called as part of onTypeChanged(), so it doesn't need to be done twice.
}
TTPromise.resolve( 'Request', 'add' );
}
} );
}
}
//To be called only by external scripts creating requests (timesheet and schedule at this time)
openAddView( data_array ) {
this.sub_view_mode = true;
this.edit_only_mode = true;
var $this = this;
this.initOptions( function() {
$this.onAddClick( data_array );
} );
}
}