1083 lines
36 KiB
JavaScript
1083 lines
36 KiB
JavaScript
export class RecurringScheduleTemplateControlViewController extends BaseViewController {
|
|
constructor( options = {} ) {
|
|
_.defaults( options, {
|
|
el: '#recurring_schedule_template_control_view_container',
|
|
|
|
|
|
sub_document_view_controller: null,
|
|
|
|
document_object_type_id: null,
|
|
|
|
recurring_schedule_template_api: null,
|
|
|
|
schedule_api: null,
|
|
|
|
recurring_schedule_status_array: null
|
|
} );
|
|
|
|
super( options );
|
|
}
|
|
|
|
init( options ) {
|
|
//this._super('initialize', options );
|
|
this.edit_view_tpl = 'RecurringScheduleTemplateControlEditView.html';
|
|
this.permission_id = 'recurring_schedule_template';
|
|
this.viewId = 'RecurringScheduleTemplateControl';
|
|
this.script_name = 'RecurringScheduleTemplateControlView';
|
|
this.table_name_key = 'recurring_schedule_template_control';
|
|
this.context_menu_name = $.i18n._( 'Recurring Templates' );
|
|
this.navigation_label = $.i18n._( 'Recurring Template' );
|
|
this.api = TTAPI.APIRecurringScheduleTemplateControl;
|
|
this.schedule_api = TTAPI.APISchedule;
|
|
this.recurring_schedule_template_api = TTAPI.APIRecurringScheduleTemplate;
|
|
|
|
this.document_object_type_id = 10;
|
|
this.event_bus = new TTEventBus({ view_id: this.viewId });
|
|
|
|
this.render();
|
|
this.buildContextMenu();
|
|
|
|
this.initData();
|
|
}
|
|
|
|
initOptions() {
|
|
var $this = this;
|
|
|
|
this.initDropDownOption( 'status', null, this.recurring_schedule_template_api, function( res ) {
|
|
res = res.getResult();
|
|
$this.recurring_schedule_status_array = Global.buildRecordArray( res );
|
|
} );
|
|
}
|
|
|
|
buildEditViewUI() {
|
|
super.buildEditViewUI();
|
|
|
|
var $this = this;
|
|
|
|
var tab_model = {
|
|
'tab_recurring_template': {
|
|
'label': $.i18n._( 'Recurring Template' ),
|
|
'html_template': this.getRecurringTemplateTabHtml()
|
|
},
|
|
'tab_attachment': true,
|
|
'tab_audit': true,
|
|
};
|
|
this.setTabModel( tab_model );
|
|
|
|
var form_item_input;
|
|
|
|
this.navigation.AComboBox( {
|
|
api_class: TTAPI.APIRecurringScheduleTemplateControl,
|
|
id: this.script_name + '_navigation',
|
|
allow_multiple_selection: false,
|
|
layout_name: 'global_recurring_template_control',
|
|
navigation_mode: true,
|
|
show_search_inputs: true
|
|
} );
|
|
|
|
this.setNavigation();
|
|
|
|
//These width changes can cause crashes when tab is hidden on selenium screenshot unit test mode.
|
|
//Left menu would not be clickable due to elements overlapping.
|
|
if ( Global.UNIT_TEST_MODE == false ){
|
|
this.edit_view_tab.css( 'max-width', 'none' );
|
|
|
|
if ( Global.getProductEdition() >= 20 ) {
|
|
this.edit_view_tab.css( 'min-width', '1250px' );
|
|
} else if ( Global.getProductEdition() >= 15 ) {
|
|
this.edit_view_tab.css( 'min-width', '1050px' );
|
|
} else {
|
|
this.edit_view_tab.css( 'min-width', '950px' );
|
|
}
|
|
}
|
|
|
|
//Tab 0 start
|
|
|
|
var tab_recurring_template = this.edit_view_tab.find( '#tab_recurring_template' );
|
|
|
|
var tab_recurring_template_column1 = tab_recurring_template.find( '.first-column' );
|
|
|
|
this.edit_view_tabs[0] = [];
|
|
|
|
this.edit_view_tabs[0].push( tab_recurring_template_column1 );
|
|
|
|
//Name
|
|
form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
|
|
|
|
form_item_input.TTextInput( { field: 'name', width: '100%' } );
|
|
this.addEditFieldToColumn( $.i18n._( 'Name' ), form_item_input, tab_recurring_template_column1, '' );
|
|
|
|
form_item_input.parent().width( '45%' );
|
|
|
|
// Description
|
|
form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
|
|
|
|
form_item_input.TTextInput( { field: 'description', width: '100%' } );
|
|
this.addEditFieldToColumn( $.i18n._( 'Description' ), form_item_input, tab_recurring_template_column1 );
|
|
|
|
form_item_input.parent().width( '45%' );
|
|
|
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
|
form_item_input.AComboBox( {
|
|
api_class: TTAPI.APIUser,
|
|
allow_multiple_selection: false,
|
|
layout_name: 'global_user',
|
|
show_search_inputs: true,
|
|
set_empty: true,
|
|
field: 'created_by_id'
|
|
} );
|
|
this.addEditFieldToColumn( $.i18n._( 'Created By' ), form_item_input, tab_recurring_template_column1 );
|
|
|
|
form_item_input.parent().width( '45%' );
|
|
|
|
//Inside editor
|
|
|
|
var inside_editor_div = tab_recurring_template.find( '.inside-editor-div' );
|
|
|
|
var args = {
|
|
week: $.i18n._( 'Week' ),
|
|
status: $.i18n._( 'Status' ),
|
|
week_names: 'S M T W T  F S',
|
|
shift_time: $.i18n._( 'Shift Time' ),
|
|
total: $.i18n._( 'Total' ),
|
|
schedule_policy: $.i18n._( 'Schedule Policy' ),
|
|
branch_department: $.i18n._( 'Branch/Department' ),
|
|
job_task: $.i18n._( 'Job/Task/Tags' ),
|
|
open_shift_multiplier: $.i18n._( 'Open Shift Multiplier' )
|
|
};
|
|
|
|
this.editor = Global.loadWidgetByName( FormItemType.INSIDE_EDITOR );
|
|
|
|
this.editor.InsideEditor( {
|
|
title: $.i18n._( 'NOTE: To set different In/Out times for each day of the week, add additional weeks all with the same week number.' ),
|
|
addRow: this.insideEditorAddRow,
|
|
removeRow: this.insideEditorRemoveRow,
|
|
getValue: this.insideEditorGetValue,
|
|
setValue: this.insideEditorSetValue,
|
|
parent_controller: this,
|
|
api: this.recurring_schedule_template_api,
|
|
render: getRender(),
|
|
render_args: args,
|
|
render_inline_html: true,
|
|
row_render: getRowRender()
|
|
|
|
} );
|
|
|
|
function getRender() {
|
|
var render = ''
|
|
|
|
if ( Global.getProductEdition() >= 20 ) {
|
|
render = `
|
|
<table class="inside-editor-render">
|
|
<tr class="title">
|
|
<td style="width: 50px"><%= week %></td>
|
|
<td style="width: 100px"><%= status %></td>
|
|
<td style="width: 153px"><%= week_names %></td>
|
|
<td style="width: 140px"><%= shift_time %></td>
|
|
<td style="width: 45px"><%= total %></td>
|
|
<td style="width: 140px"><%= schedule_policy %></td>
|
|
<td style="width: 230px"><%= branch_department %></td>
|
|
<td style="width: 190px"><%= job_task %></td>
|
|
<td style="width: 100px"><%= open_shift_multiplier %></td>
|
|
</tr>
|
|
</table>`;
|
|
} else if ( Global.getProductEdition() >= 15 ) {
|
|
render = `
|
|
<table class="inside-editor-render">
|
|
<tr class="title">
|
|
<td style="width: 50px"><%= week %></td>
|
|
<td style="width: 100px"><%= status %></td>
|
|
<td style="width: 153px"><%= week_names %></td>
|
|
<td style="width: 140px"><%= shift_time %></td>
|
|
<td style="width: 45px"><%= total %></td>
|
|
<td style="width: 140px"><%= schedule_policy %></td>
|
|
<td style="width: 230px"><%= branch_department %></td>
|
|
<td style="width: 100px"><%= open_shift_multiplier %></td>
|
|
</tr>
|
|
</table>`;
|
|
} else {
|
|
render = `
|
|
<table class="inside-editor-render">
|
|
<tr class="title">
|
|
<td style="width: 50px"><%= week %></td>
|
|
<td style="width: 100px"><%= status %></td>
|
|
<td style="width: 153px"><%= week_names %></td>
|
|
<td style="width: 140px"><%= shift_time %></td>
|
|
<td style="width: 45px"><%= total %></td>
|
|
<td style="width: 140px"><%= schedule_policy %></td>
|
|
<td style="width: 230px"><%= branch_department %></td>
|
|
</tr>
|
|
</table>`;
|
|
}
|
|
return render;
|
|
}
|
|
|
|
function getRowRender() {
|
|
var render = '';
|
|
|
|
if ( Global.getProductEdition() >= 20 ) {
|
|
render = `<tr class="inside-editor-row data-row">
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class="week-cell"></td>
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class="cell control-icon">
|
|
<button class="plus-icon" onclick=""></button>
|
|
</td>
|
|
<td class="cell control-icon">
|
|
<button class="minus-icon " onclick=""></button>
|
|
</td>
|
|
</tr>`;
|
|
} else if ( Global.getProductEdition() >= 15 ) {
|
|
render = `<tr class="inside-editor-row data-row">
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class="week-cell"></td>
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class="cell control-icon">
|
|
<button class="plus-icon" onclick=""></button>
|
|
</td>
|
|
<td class="cell control-icon">
|
|
<button class="minus-icon " onclick=""></button>
|
|
</td>
|
|
</tr>`;
|
|
} else {
|
|
render = `
|
|
<tr class="inside-editor-row data-row">
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class="week-cell"></td>
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class=""></td>
|
|
<td class="cell control-icon">
|
|
<button class="plus-icon" onclick=""></button>
|
|
</td>
|
|
<td class="cell control-icon">
|
|
<button class="minus-icon " onclick=""></button>
|
|
</td>
|
|
</tr>`;
|
|
}
|
|
return render;
|
|
}
|
|
|
|
inside_editor_div.append( this.editor );
|
|
}
|
|
|
|
setEditViewDataDone() {
|
|
super.setEditViewDataDone();
|
|
if ( !this.is_mass_editing ) {
|
|
this.initInsideEditorData();
|
|
this.edit_view.find( '.inside-editor-div' ).show();
|
|
} else {
|
|
this.edit_view.find( '.inside-editor-div' ).hide();
|
|
}
|
|
}
|
|
|
|
initInsideEditorData() {
|
|
var $this = this;
|
|
var args = {};
|
|
args.filter_data = {};
|
|
|
|
if ( ( !this.current_edit_record || !this.current_edit_record.id ) && !this.copied_record_id ) {
|
|
$this.editor.removeAllRows();
|
|
$this.editor.getDefaultData();
|
|
|
|
} else {
|
|
|
|
args.filter_data.recurring_schedule_template_control_id = this.current_edit_record.id ? this.current_edit_record.id : this.copied_record_id;
|
|
this.copied_record_id = '';
|
|
$this.recurring_schedule_template_api['get' + $this.recurring_schedule_template_api.key_name]( args, {
|
|
onResult: function( res ) {
|
|
if ( !$this.edit_view ) {
|
|
return;
|
|
}
|
|
var data = res.getResult();
|
|
$this.editor.setValue( data );
|
|
|
|
}
|
|
} );
|
|
|
|
}
|
|
}
|
|
|
|
insideEditorAddRow( data, index ) {
|
|
|
|
var form_item_input;
|
|
|
|
var $this = this;
|
|
if ( !data ) {
|
|
this.getDefaultData( index );
|
|
} else {
|
|
var form_item_input;
|
|
var widgetContainer;
|
|
|
|
var row_id = ( data.id && this.parent_controller.current_edit_record.id ) ? data.id : TTUUID.generateUUID();
|
|
var row = this.getRowRender(); //Get Row render
|
|
var render = this.getRender(); //get render, should be a table
|
|
var widgets = {}; //Save each row's widgets
|
|
|
|
//Build row widgets
|
|
|
|
// Week
|
|
form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
|
|
form_item_input.TTextInput( { field: 'week', width: 40 } );
|
|
form_item_input.setValue( data.week ? data.week : 1 );
|
|
widgets[form_item_input.getField()] = form_item_input;
|
|
row.children().eq( 0 ).append( form_item_input );
|
|
form_item_input.attr( 'recurring_schedule_template_id', row_id );
|
|
form_item_input.attr( 'date_stamp', data.date_stamp ); //Needed to prepend start/end times with so they can be parsed properly and calculate Total Time.
|
|
|
|
this.setWidgetEnableBaseOnParentController( form_item_input );
|
|
|
|
// Status
|
|
widgetContainer = $( '<div class=\'recurring-template-status-div\'></div>' );
|
|
|
|
form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );
|
|
form_item_input.TComboBox( { field: 'status_id' } );
|
|
form_item_input.setSourceData( this.parent_controller.recurring_schedule_status_array );
|
|
form_item_input.setValue( data.status_id ? data.status_id : 10 );
|
|
widgets[form_item_input.getField()] = form_item_input;
|
|
|
|
form_item_input.bind( 'formItemChange', function( e, target ) {
|
|
if ( target.getValue() == 10 ) {
|
|
widgets['absence_policy_id'].hide();
|
|
} else if ( target.getValue() == 20 ) {
|
|
widgets['absence_policy_id'].show();
|
|
}
|
|
} );
|
|
|
|
widgetContainer.append( form_item_input );
|
|
|
|
this.setWidgetEnableBaseOnParentController( form_item_input );
|
|
|
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
|
|
|
form_item_input.AComboBox( {
|
|
api_class: TTAPI.APIAbsencePolicy,
|
|
width: 132,
|
|
allow_multiple_selection: false,
|
|
layout_name: 'global_absences',
|
|
show_search_inputs: true,
|
|
set_empty: true,
|
|
field: 'absence_policy_id'
|
|
} );
|
|
|
|
form_item_input.css( 'position', 'absolute' );
|
|
form_item_input.css( 'left', '0' );
|
|
form_item_input.css( 'top', '30px' );
|
|
form_item_input.css( 'z-index', '1' ); //For some reason if this overlaps with the "checkboxes", it goes behind that div and makes the down arrow unclickable.
|
|
form_item_input.setValue( data.absence_policy_id ? data.absence_policy_id : '' );
|
|
widgets[form_item_input.getField()] = form_item_input;
|
|
this.setWidgetEnableBaseOnParentController( form_item_input );
|
|
widgetContainer.append( form_item_input );
|
|
|
|
row.children().eq( 1 ).append( widgetContainer );
|
|
|
|
// sun mon tue wed thu fri sat
|
|
var widgetContainer2 = $( '<div class=\'widget-h-box\'></div>' );
|
|
// Sun
|
|
var form_item_sun_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
|
|
form_item_sun_checkbox.TCheckbox( { field: 'sun' } );
|
|
form_item_sun_checkbox.setValue( data.sun ? data.sun : false );
|
|
widgets[form_item_sun_checkbox.getField()] = form_item_sun_checkbox;
|
|
widgetContainer2.append( form_item_sun_checkbox );
|
|
|
|
this.setWidgetEnableBaseOnParentController( form_item_sun_checkbox );
|
|
// Mon
|
|
var form_item_mon_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
|
|
form_item_mon_checkbox.TCheckbox( { field: 'mon' } );
|
|
form_item_mon_checkbox.setValue( data.mon ? data.mon : false );
|
|
widgets[form_item_mon_checkbox.getField()] = form_item_mon_checkbox;
|
|
widgetContainer2.append( form_item_mon_checkbox );
|
|
|
|
this.setWidgetEnableBaseOnParentController( form_item_mon_checkbox );
|
|
// Tue
|
|
var form_item_tue_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
|
|
form_item_tue_checkbox.TCheckbox( { field: 'tue' } );
|
|
form_item_tue_checkbox.setValue( data.tue ? data.tue : false );
|
|
widgets[form_item_tue_checkbox.getField()] = form_item_tue_checkbox;
|
|
widgetContainer2.append( form_item_tue_checkbox );
|
|
this.setWidgetEnableBaseOnParentController( form_item_tue_checkbox );
|
|
// Wed
|
|
var form_item_wed_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
|
|
form_item_wed_checkbox.TCheckbox( { field: 'wed' } );
|
|
form_item_wed_checkbox.setValue( data.wed ? data.wed : false );
|
|
widgets[form_item_wed_checkbox.getField()] = form_item_wed_checkbox;
|
|
widgetContainer2.append( form_item_wed_checkbox );
|
|
this.setWidgetEnableBaseOnParentController( form_item_wed_checkbox );
|
|
// Thu
|
|
var form_item_thu_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
|
|
form_item_thu_checkbox.TCheckbox( { field: 'thu' } );
|
|
form_item_thu_checkbox.setValue( data.thu ? data.thu : false );
|
|
widgets[form_item_thu_checkbox.getField()] = form_item_thu_checkbox;
|
|
widgetContainer2.append( form_item_thu_checkbox );
|
|
this.setWidgetEnableBaseOnParentController( form_item_thu_checkbox );
|
|
// Fri
|
|
var form_item_fri_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
|
|
form_item_fri_checkbox.TCheckbox( { field: 'fri' } );
|
|
form_item_fri_checkbox.setValue( data.fri ? data.fri : false );
|
|
widgets[form_item_fri_checkbox.getField()] = form_item_fri_checkbox;
|
|
widgetContainer2.append( form_item_fri_checkbox );
|
|
this.setWidgetEnableBaseOnParentController( form_item_fri_checkbox );
|
|
// Sat
|
|
var form_item_sat_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );
|
|
form_item_sat_checkbox.TCheckbox( { field: 'sat' } );
|
|
form_item_sat_checkbox.setValue( data.sat ? data.sat : false );
|
|
widgets[form_item_sat_checkbox.getField()] = form_item_sat_checkbox;
|
|
widgetContainer2.append( form_item_sat_checkbox );
|
|
this.setWidgetEnableBaseOnParentController( form_item_sat_checkbox );
|
|
|
|
row.children().eq( 2 ).append( widgetContainer2 );
|
|
|
|
// Shift Time
|
|
widgetContainer = $( '<div class=\'widget-h-box\'></div>' );
|
|
|
|
var divContainer1 = $( '<div style=\'text-align: left; \'></div>' );
|
|
|
|
var label_1 = $( '<span class=\'widget-right-label recurring-template-widget-right-label\' style=\'display: inline-block; width: 28px; vertical-align: middle;\'> ' + $.i18n._( 'In' ) + ' </span>' );
|
|
form_item_input = Global.loadWidgetByName( FormItemType.TIME_PICKER );
|
|
form_item_input.TTimePicker( { field: 'start_time' } );
|
|
form_item_input.setValue( data.start_time ? data.start_time : '' );
|
|
|
|
form_item_input.bind( 'formItemChange', function( e, target ) {
|
|
|
|
var rows_widgets = $this.rows_widgets_array[target.parent().parent().parent().parent().index() - 1];
|
|
|
|
$this.parent_controller.onRowChanges( rows_widgets );
|
|
} );
|
|
|
|
widgets[form_item_input.getField() + row_id] = form_item_input;
|
|
this.parent_controller.edit_view_ui_validation_field_dic[form_item_input.getField() + row_id] = form_item_input;
|
|
|
|
divContainer1.append( label_1 );
|
|
divContainer1.append( form_item_input );
|
|
|
|
widgetContainer.append( divContainer1 );
|
|
this.setWidgetEnableBaseOnParentController( form_item_input );
|
|
|
|
var divContainer2 = $( '<div style=\'text-align: left; margin-top: 5px;\'></div>' );
|
|
|
|
var label_2 = $( '<span class=\'widget-right-label recurring-template-widget-right-label\' style=\'display: inline-block; width: 28px; vertical-align: middle;\' > ' + $.i18n._( 'Out' ) + ' </span>' );
|
|
form_item_input = Global.loadWidgetByName( FormItemType.TIME_PICKER );
|
|
form_item_input.TTimePicker( { field: 'end_time' } );
|
|
form_item_input.setValue( data.end_time ? data.end_time : '' );
|
|
|
|
form_item_input.bind( 'formItemChange', function( e, target ) {
|
|
var rows_widgets = $this.rows_widgets_array[target.parent().parent().parent().parent().index() - 1];
|
|
|
|
$this.parent_controller.onRowChanges( rows_widgets );
|
|
} );
|
|
|
|
widgets[form_item_input.getField() + row_id] = form_item_input;
|
|
this.parent_controller.edit_view_ui_validation_field_dic[form_item_input.getField() + row_id] = form_item_input;
|
|
|
|
divContainer2.append( label_2 );
|
|
divContainer2.append( form_item_input );
|
|
|
|
widgetContainer.append( divContainer2 );
|
|
|
|
row.children().eq( 3 ).append( widgetContainer );
|
|
this.setWidgetEnableBaseOnParentController( form_item_input );
|
|
|
|
// Total
|
|
form_item_input = Global.loadWidgetByName( FormItemType.TEXT );
|
|
form_item_input.TText( { field: 'total_time' } );
|
|
form_item_input.setValue( data.total_time ? Global.getTimeUnit( data.total_time ) : '' ); //
|
|
widgets[form_item_input.getField()] = form_item_input;
|
|
|
|
row.children().eq( 4 ).append( form_item_input );
|
|
|
|
// Schedule Policy
|
|
|
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
|
|
|
form_item_input.AComboBox( {
|
|
api_class: TTAPI.APISchedulePolicy,
|
|
width: 80,
|
|
allow_multiple_selection: false,
|
|
layout_name: 'global_schedule',
|
|
show_search_inputs: true,
|
|
set_empty: true,
|
|
field: 'schedule_policy_id'
|
|
} );
|
|
|
|
form_item_input.setValue( data.schedule_policy_id ? data.schedule_policy_id : '' );
|
|
widgets[form_item_input.getField()] = form_item_input;
|
|
|
|
row.children().eq( 5 ).append( form_item_input );
|
|
|
|
form_item_input.bind( 'formItemChange', function( e, target ) {
|
|
var rows_widgets = $this.rows_widgets_array[target.parent().parent().index() - 1];
|
|
|
|
$this.parent_controller.onRowChanges( rows_widgets );
|
|
} );
|
|
this.setWidgetEnableBaseOnParentController( form_item_input );
|
|
|
|
// Branch / Department
|
|
|
|
widgetContainer = $( '<div class=\'widget-h-box recurring-template-widget-h-box\'></div>' );
|
|
|
|
divContainer1 = $( '<div></div>' );
|
|
|
|
label_1 = $( '<span class=\'widget-right-label\' style=\'float: left; height: 24px; line-height: 24px; min-width: 74px;\'> ' + $.i18n._( 'Branch' ) + ' </span>' );
|
|
|
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
|
|
|
form_item_input.AComboBox( {
|
|
api_class: TTAPI.APIBranch,
|
|
width: 80,
|
|
allow_multiple_selection: false,
|
|
layout_name: 'global_branch',
|
|
show_search_inputs: true,
|
|
set_any: true,
|
|
field: 'branch_id',
|
|
custom_first_label: Global.default_item
|
|
} );
|
|
|
|
if ( data.branch_id.toUpperCase() === TTUUID.not_exist_id.toUpperCase() ) {
|
|
form_item_input.set_default_value = true;
|
|
} else {
|
|
form_item_input.setValue( data.branch_id ? data.branch_id : '' );
|
|
}
|
|
widgets[form_item_input.getField()] = form_item_input;
|
|
|
|
divContainer1.append( label_1 );
|
|
divContainer1.append( form_item_input );
|
|
|
|
widgetContainer.append( divContainer1 );
|
|
|
|
divContainer2 = $( '<div style=\'margin-top: 5px; float: left\'></div>' );
|
|
|
|
label_2 = $( '<span class=\'widget-right-label\' style=\'float: left; height: 24px; line-height: 24px; min-width: 74px;\'> ' + $.i18n._( 'Department' ) + ' </span>' );
|
|
|
|
this.setWidgetEnableBaseOnParentController( form_item_input );
|
|
|
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
|
|
|
form_item_input.AComboBox( {
|
|
api_class: TTAPI.APIDepartment,
|
|
width: 80,
|
|
allow_multiple_selection: false,
|
|
layout_name: 'global_department',
|
|
show_search_inputs: true,
|
|
set_any: true,
|
|
field: 'department_id',
|
|
custom_first_label: Global.default_item
|
|
} );
|
|
form_item_input.setValue( ( data.department_id ) ? data.department_id : '' );
|
|
widgets[form_item_input.getField()] = form_item_input;
|
|
|
|
divContainer2.append( label_2 );
|
|
divContainer2.append( form_item_input );
|
|
|
|
widgetContainer.append( divContainer2 );
|
|
|
|
row.children().eq( 6 ).append( widgetContainer );
|
|
this.setWidgetEnableBaseOnParentController( form_item_input );
|
|
|
|
// Job/Task/Punch Tag
|
|
|
|
if ( ( Global.getProductEdition() >= 20 ) ) {
|
|
|
|
widgetContainer = $( '<div class=\'widget-h-box recurring-template-widget-h-box\'></div>' );
|
|
|
|
divContainer1 = $( '<div></div>' );
|
|
|
|
label_1 = $( '<span class=\'widget-right-label\' style=\'float: left; height: 24px; line-height: 24px; min-width: 32px;\'> ' + $.i18n._( 'Job' ) + ' </span>' );
|
|
|
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
|
|
|
form_item_input.AComboBox( {
|
|
api_class: TTAPI.APIJob,
|
|
width: 80,
|
|
allow_multiple_selection: false,
|
|
layout_name: 'global_job',
|
|
show_search_inputs: true,
|
|
set_any: true,
|
|
field: 'job_id',
|
|
custom_first_label: Global.default_item
|
|
} );
|
|
form_item_input.setValue( data.job_id ? data.job_id : '' );
|
|
widgets[form_item_input.getField()] = form_item_input;
|
|
|
|
divContainer1.append( label_1 );
|
|
divContainer1.append( form_item_input );
|
|
|
|
widgetContainer.append( divContainer1 );
|
|
|
|
divContainer2 = $( '<div style=\'margin-top: 5px; float: left\'></div>' );
|
|
|
|
label_2 = $( '<span class=\'widget-right-label\' style=\'float: left; height: 24px; line-height: 24px; min-width: 32px;\'> ' + $.i18n._( 'Task' ) + ' </span>' );
|
|
this.setWidgetEnableBaseOnParentController( form_item_input );
|
|
|
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
|
|
|
form_item_input.AComboBox( {
|
|
api_class: TTAPI.APIJobItem,
|
|
width: 80,
|
|
allow_multiple_selection: false,
|
|
layout_name: 'global_job_item',
|
|
show_search_inputs: true,
|
|
set_any: true,
|
|
field: 'job_item_id',
|
|
custom_first_label: Global.default_item
|
|
} );
|
|
form_item_input.setValue( data.job_item_id ? data.job_item_id : '' );
|
|
widgets[form_item_input.getField()] = form_item_input;
|
|
|
|
divContainer2.append( label_2 );
|
|
divContainer2.append( form_item_input );
|
|
|
|
widgetContainer.append( divContainer2 );
|
|
|
|
var divContainer3 = $( '<div style=\'margin-top: 5px; float: left\'></div>' );
|
|
|
|
var label_3 = $( '<span class=\'widget-right-label\' style=\'float: left; height: 24px; line-height: 24px; min-width: 32px;\'> ' + $.i18n._( 'Tags' ) + ' </span>' );
|
|
this.setWidgetEnableBaseOnParentController( form_item_input );
|
|
|
|
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
|
|
|
|
form_item_input.AComboBox( {
|
|
api_class: TTAPI.APIPunchTag,
|
|
width: 80,
|
|
allow_multiple_selection: true,
|
|
layout_name: 'global_punch_tag',
|
|
show_search_inputs: true,
|
|
set_any: true,
|
|
setRealValueCallBack: ( ( punch_tags ) => {
|
|
if ( punch_tags ) {
|
|
this.setPunchTagQuickSearchManualIds( punch_tags );
|
|
}
|
|
} ),
|
|
field: 'punch_tag_id',
|
|
custom_first_label: Global.default_item
|
|
} );
|
|
form_item_input.setValue( data.punch_tag_id ? data.punch_tag_id : '' );
|
|
widgets[form_item_input.getField()] = form_item_input;
|
|
|
|
divContainer3.append( label_3 );
|
|
divContainer3.append( form_item_input );
|
|
|
|
widgetContainer.append( divContainer3 );
|
|
|
|
row.children().eq( 7 ).append( widgetContainer );
|
|
this.setWidgetEnableBaseOnParentController( form_item_input );
|
|
|
|
}
|
|
|
|
if ( Global.getProductEdition() >= 15 ) {
|
|
// Open Shift Multiplier
|
|
form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
|
|
form_item_input.TTextInput( { field: 'open_shift_multiplier', width: 20 } );
|
|
form_item_input.setValue( data.open_shift_multiplier ? data.open_shift_multiplier : 1 );
|
|
widgets[form_item_input.getField()] = form_item_input;
|
|
|
|
if ( Global.getProductEdition() <= 15 ) {
|
|
row.children().eq( 7 ).append( form_item_input );
|
|
} else {
|
|
row.children().eq( 8 ).append( form_item_input );
|
|
}
|
|
|
|
this.setWidgetEnableBaseOnParentController( form_item_input );
|
|
}
|
|
|
|
if ( typeof index != 'undefined' ) {
|
|
|
|
row.insertAfter( $( render ).find( 'tr' ).eq( index ) );
|
|
this.rows_widgets_array.splice( ( index ), 0, widgets );
|
|
|
|
} else {
|
|
$( render ).append( row );
|
|
this.rows_widgets_array.push( widgets );
|
|
}
|
|
|
|
if ( this.parent_controller.is_viewing ) {
|
|
row.find( '.control-icon' ).hide();
|
|
}
|
|
|
|
if ( widgets.status_id.getValue() == 10 ) {
|
|
widgets.absence_policy_id.css( 'display', 'none' );
|
|
} else if ( widgets.status_id.getValue() == 20 ) {
|
|
widgets.absence_policy_id.css( 'display', 'block' );
|
|
}
|
|
|
|
this.addIconsEvent( row ); //Bind event to add and minus icon
|
|
this.removeLastRowLine();
|
|
}
|
|
}
|
|
|
|
onRowChanges( row_widgets ) {
|
|
var recurring_schedule_template_id = row_widgets.week.attr( 'recurring_schedule_template_id' );
|
|
var date_stamp = row_widgets.week.attr( 'date_stamp' );
|
|
|
|
if ( recurring_schedule_template_id ) {
|
|
var startTime = date_stamp +' '+ row_widgets['start_time' + recurring_schedule_template_id].getValue();
|
|
var endTime = date_stamp +' '+ row_widgets['end_time' + recurring_schedule_template_id].getValue();
|
|
var schedulePolicyId = row_widgets.schedule_policy_id.getValue();
|
|
|
|
if ( startTime !== '' && endTime !== '' && schedulePolicyId !== '' ) {
|
|
var result = this.schedule_api.getScheduleTotalTime( startTime, endTime, schedulePolicyId, { async: false } );
|
|
if ( result ) {
|
|
var total_time = result.getResult();
|
|
|
|
row_widgets.total_time.setValue( Global.getTimeUnit( total_time ) );
|
|
}
|
|
}
|
|
|
|
this.validate();
|
|
}
|
|
}
|
|
|
|
insideEditorGetValue( current_edit_item_id ) {
|
|
var len = this.rows_widgets_array.length;
|
|
|
|
var result = [];
|
|
|
|
for ( var i = 0; i < len; i++ ) {
|
|
var row = this.rows_widgets_array[i];
|
|
|
|
var recurring_schedule_template_id = row.week.attr( 'recurring_schedule_template_id' );
|
|
var date_stamp = row.week.attr( 'date_stamp' );
|
|
|
|
if ( recurring_schedule_template_id ) {
|
|
var data = {
|
|
id: recurring_schedule_template_id,
|
|
|
|
week: row.week.getValue(),
|
|
status_id: row.status_id.getValue(),
|
|
|
|
mon: row.mon.getValue(),
|
|
tue: row.tue.getValue(),
|
|
wed: row.wed.getValue(),
|
|
thu: row.thu.getValue(),
|
|
fri: row.fri.getValue(),
|
|
sat: row.sat.getValue(),
|
|
sun: row.sun.getValue(),
|
|
|
|
date_stamp: date_stamp,
|
|
start_time: row['start_time' + recurring_schedule_template_id].getValue(),
|
|
end_time: row['end_time' + recurring_schedule_template_id].getValue(),
|
|
total_time: null,
|
|
|
|
branch_id: row.branch_id.getValue(),
|
|
department_id: row.department_id.getValue(),
|
|
|
|
absence_policy_id: row.absence_policy_id.getValue(),
|
|
schedule_policy_id: row.schedule_policy_id.getValue()
|
|
};
|
|
|
|
if ( Global.getProductEdition() >= 15 ) {
|
|
data.open_shift_multiplier = row.open_shift_multiplier.getValue();
|
|
}
|
|
|
|
if ( Global.getProductEdition() >= 20 ) {
|
|
data.job_id = row.job_id.getValue();
|
|
data.job_item_id = row.job_item_id.getValue();
|
|
data.punch_tag_id = row.punch_tag_id.getValue();
|
|
}
|
|
|
|
data.recurring_schedule_template_control_id = current_edit_item_id;
|
|
result.push( data );
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
insideEditorSetValue( val ) {
|
|
var len = val.length;
|
|
this.removeAllRows();
|
|
|
|
if ( len > 0 ) {
|
|
for ( var i = 0; i < val.length; i++ ) {
|
|
if ( Global.isSet( val[i] ) ) {
|
|
var row = val[i];
|
|
this.addRow( row );
|
|
}
|
|
}
|
|
} else {
|
|
this.getDefaultData();
|
|
}
|
|
}
|
|
|
|
insideEditorRemoveRow( row ) {
|
|
var index = row[0].rowIndex - 1;
|
|
var remove_id = this.rows_widgets_array[index].week.attr( 'recurring_schedule_template_id' );
|
|
if ( TTUUID.isUUID( remove_id ) && remove_id != TTUUID.zero_id && remove_id != TTUUID.not_exist_id ) {
|
|
this.delete_ids.push( remove_id );
|
|
}
|
|
row.remove();
|
|
this.rows_widgets_array.splice( index, 1 );
|
|
|
|
this.removeLastRowLine();
|
|
}
|
|
|
|
uniformVariable( records ) {
|
|
if ( !this.is_mass_editing ) {
|
|
records.recurring_schedule_template = this.editor.getValue( this.refresh_id );
|
|
}
|
|
return records;
|
|
}
|
|
|
|
renameObjectKey( obj, old_key, new_key ) {
|
|
if ( old_key !== new_key ) {
|
|
Object.defineProperty( obj, new_key,
|
|
Object.getOwnPropertyDescriptor( obj, old_key ) );
|
|
delete obj[old_key];
|
|
}
|
|
}
|
|
|
|
_continueDoCopyAsNew() {
|
|
this.setCurrentEditViewState( 'new' );
|
|
LocalCacheData.current_doing_context_action = 'copy_as_new';
|
|
|
|
if ( Global.isSet( this.edit_view ) ) {
|
|
for ( var i = 0; i < this.editor.rows_widgets_array.length; i++ ) {
|
|
//Fix JS exception: Uncaught TypeError: Cannot read property 'getValue' of undefined
|
|
//start_time,end_time object keys are appended with the recurring_schedule_template_id, so when copying records we need to rename them to use the new recurring_schedule_template_id
|
|
var new_uuid = TTUUID.generateUUID();
|
|
var old_recurring_schedule_template_id = this.editor.rows_widgets_array[i].week.attr( 'recurring_schedule_template_id' );
|
|
|
|
this.renameObjectKey( this.editor.rows_widgets_array[i], 'start_time' + old_recurring_schedule_template_id, 'start_time' + new_uuid );
|
|
this.renameObjectKey( this.editor.rows_widgets_array[i], 'end_time' + old_recurring_schedule_template_id, 'end_time' + new_uuid );
|
|
|
|
this.editor.rows_widgets_array[i].week.attr( 'recurring_schedule_template_id', new_uuid );
|
|
}
|
|
}
|
|
super._continueDoCopyAsNew();
|
|
}
|
|
|
|
onCopyAsNewResult( result ) {
|
|
var $this = this;
|
|
var result_data = result.getResult();
|
|
|
|
if ( !result_data ) {
|
|
TAlertManager.showAlert( $.i18n._( 'Record does not exist' ) );
|
|
$this.onCancelClick();
|
|
return;
|
|
}
|
|
|
|
$this.openEditView(); // Put it here is to avoid if the selected one is not existed in data or have deleted by other pragram. in this case, the edit view should not be opend.
|
|
|
|
result_data = result_data[0];
|
|
this.copied_record_id = result_data.id;
|
|
result_data.id = '';
|
|
if ( $this.sub_view_mode && $this.parent_key ) {
|
|
result_data[$this.parent_key] = $this.parent_value;
|
|
}
|
|
|
|
$this.current_edit_record = result_data;
|
|
$this.initEditView();
|
|
}
|
|
|
|
buildSearchFields() {
|
|
|
|
super.buildSearchFields();
|
|
this.search_fields = [
|
|
|
|
new SearchField( {
|
|
label: $.i18n._( 'Name' ),
|
|
in_column: 1,
|
|
field: 'name',
|
|
multiple: true,
|
|
basic_search: true,
|
|
adv_search: false,
|
|
form_item_type: FormItemType.TEXT_INPUT
|
|
} ),
|
|
|
|
new SearchField( {
|
|
label: $.i18n._( 'Description' ),
|
|
in_column: 1,
|
|
field: 'description',
|
|
multiple: true,
|
|
basic_search: true,
|
|
adv_search: false,
|
|
form_item_type: FormItemType.TEXT_INPUT
|
|
} ),
|
|
|
|
new SearchField( {
|
|
label: $.i18n._( 'Template' ),
|
|
in_column: 1,
|
|
field: 'id',
|
|
layout_name: 'global_recurring_template_control',
|
|
api_class: TTAPI.APIRecurringScheduleTemplateControl,
|
|
multiple: true,
|
|
basic_search: true,
|
|
adv_search: false,
|
|
form_item_type: FormItemType.AWESOME_BOX
|
|
} ),
|
|
|
|
new SearchField( {
|
|
label: $.i18n._( 'Schedule Policy' ),
|
|
in_column: 2,
|
|
field: 'schedule_policy_id',
|
|
layout_name: 'global_schedule',
|
|
api_class: TTAPI.APISchedulePolicy,
|
|
multiple: true,
|
|
basic_search: true,
|
|
adv_search: false,
|
|
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: [],
|
|
include: [
|
|
{
|
|
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._( 'Recurring Schedules' ),
|
|
id: 'recurring_schedule',
|
|
menu_align: 'right',
|
|
action_group: 'jump_to',
|
|
group: 'navigation',
|
|
}]
|
|
};
|
|
|
|
return context_menu_model;
|
|
}
|
|
|
|
onCustomContextClick( id ) {
|
|
switch ( id ) {
|
|
case 'recurring_schedule':
|
|
this.onNavigationClick( id );
|
|
break;
|
|
}
|
|
}
|
|
|
|
onNavigationClick( iconName ) {
|
|
|
|
var $this = this;
|
|
|
|
var grid_selected_id_array;
|
|
|
|
var filter = { filter_data: {} };
|
|
|
|
var recurring_schedule_template_control_ids = [];
|
|
|
|
if ( $this.edit_view && $this.current_edit_record.id ) {
|
|
recurring_schedule_template_control_ids.push( $this.current_edit_record.id );
|
|
} else {
|
|
grid_selected_id_array = this.getGridSelectIdArray();
|
|
$.each( grid_selected_id_array, function( index, value ) {
|
|
var grid_selected_row = $this.getRecordFromGridById( value );
|
|
recurring_schedule_template_control_ids.push( grid_selected_row.id );
|
|
} );
|
|
}
|
|
|
|
filter.filter_data.recurring_schedule_template_control_id = recurring_schedule_template_control_ids;
|
|
|
|
switch ( iconName ) {
|
|
case 'recurring_schedule':
|
|
Global.addViewTab( this.viewId, $.i18n._( 'Recurring Templates' ), window.location.href );
|
|
IndexViewController.goToView( 'RecurringScheduleControl', filter );
|
|
break;
|
|
}
|
|
}
|
|
|
|
setCustomDefaultMenuIcon( id, context_btn, grid_selected_length ) {
|
|
switch ( id ) {
|
|
case 'recurring_schedule':
|
|
this.setDefaultMenuRecurringScheduleIcon( context_btn, grid_selected_length );
|
|
break;
|
|
}
|
|
}
|
|
|
|
setDefaultMenuRecurringScheduleIcon( context_btn, grid_selected_length, pId ) {
|
|
if ( !PermissionManager.checkTopLevelPermission( 'RecurringScheduleControl' ) || this.edit_only_mode ) {
|
|
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )
|
|
}
|
|
|
|
if ( grid_selected_length > 0 ) {
|
|
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, true );
|
|
} else {
|
|
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
|
|
}
|
|
}
|
|
|
|
setCustomEditMenuIcon( id, context_btn ) {
|
|
switch ( id ) {
|
|
case 'recurring_schedule':
|
|
this.setEditMenuRecurringScheduleIcon( context_btn );
|
|
break;
|
|
}
|
|
}
|
|
|
|
setEditMenuRecurringScheduleIcon( context_btn, pId ) {
|
|
if ( !this.viewPermissionValidate( pId ) || this.edit_only_mode ) {
|
|
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )
|
|
}
|
|
|
|
if ( !this.current_edit_record || !this.current_edit_record.id ) {
|
|
ContextMenuManager.disableMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
|
|
}
|
|
|
|
}
|
|
|
|
onSaveResult( result ) {
|
|
super.onSaveResult( result );
|
|
if ( result && result.isValid() ) {
|
|
var system_job_queue = result.getAttributeInAPIDetails( 'system_job_queue' );
|
|
if ( system_job_queue ) {
|
|
this.event_bus.emit( 'tt_topbar', 'toggle_job_queue_spinner', {
|
|
show: true,
|
|
get_job_data: true
|
|
} );
|
|
}
|
|
}
|
|
}
|
|
|
|
getRecurringTemplateTabHtml() {
|
|
return `<div id="tab_recurring_template" class="edit-view-tab-outside">
|
|
<div class="edit-view-tab" id="tab_recurring_template_content_div">
|
|
<div class="first-column full-width-column"></div>
|
|
<div class="inside-editor-div full-width-column">
|
|
</div>
|
|
</div>
|
|
</div>`;
|
|
}
|
|
}
|