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 = $( '
' ); label = $( ' ' ); 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 = $( '' ); this.available_balance_info = $( '' ); 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 = $( '' ); var sun = $( ' ' ); var mon = $( ' ' ); var tue = $( ' ' ); var wed = $( ' ' ); var thu = $( ' ' ); var fri = $( ' ' ); var sat = $( ' ' ); 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 = $( '' ); label = $( '' ); 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 = $( '' ); this.overlapping_shift_info = $( '' ); 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 = $( '' ); 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 = $( '' ); 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 = $( '' ); 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 ); } ); } }