export class RecurringScheduleControlViewController extends BaseViewController { constructor( options = {} ) { _.defaults( options, { el: '#recurring_schedule_control_view_container', user_status_array: null, user_group_array: null, user_api: null, user_group_api: null } ); super( options ); } init( options ) { //this._super('initialize', options ); this.edit_view_tpl = 'RecurringScheduleControlEditView.html'; this.permission_id = 'recurring_schedule'; this.viewId = 'RecurringScheduleControl'; this.script_name = 'RecurringScheduleControlView'; this.table_name_key = 'recurring_schedule_control'; this.context_menu_name = $.i18n._( 'Recurring Schedules' ); this.navigation_label = $.i18n._( 'Recurring Schedule' ); this.api = TTAPI.APIRecurringScheduleControl; this.user_api = TTAPI.APIUser; this.user_group_api = TTAPI.APIUserGroup; this.event_bus = new TTEventBus({ view_id: this.viewId }); this.render(); this.buildContextMenu(); this.initData(); } initOptions() { var $this = this; this.initDropDownOption( 'status', 'user_status_id', this.user_api, function( res ) { res = res.getResult(); $this.user_status_array = Global.buildRecordArray( res ); } ); this.user_group_api.getUserGroup( '', false, false, { onResult: function( res ) { res = res.getResult(); res = Global.buildTreeRecord( res ); $this.user_group_array = res; if ( !$this.sub_view_mode && $this.basic_search_field_ui_dic['group_id'] ) { $this.basic_search_field_ui_dic['group_id'].setSourceData( res ); $this.adv_search_field_ui_dic['group_id'].setSourceData( res ); } } } ); } buildEditViewUI() { super.buildEditViewUI(); var $this = this; var tab_model = { 'tab_recurring_schedule': { 'label': $.i18n._( 'Recurring Schedule' ) }, 'tab_audit': true, }; this.setTabModel( tab_model ); var form_item_input; var widgetContainer; this.navigation.AComboBox( { api_class: TTAPI.APIRecurringScheduleControl, id: this.script_name + '_navigation', allow_multiple_selection: false, layout_name: 'global_recurring_schedule_control', navigation_mode: true, show_search_inputs: true } ); this.setNavigation(); //Tab 0 start var tab_recurring_schedule = this.edit_view_tab.find( '#tab_recurring_schedule' ); var tab_recurring_schedule_column1 = tab_recurring_schedule.find( '.first-column' ); this.edit_view_tabs[0] = []; this.edit_view_tabs[0].push( tab_recurring_schedule_column1 ); // Template form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX ); form_item_input.AComboBox( { api_class: TTAPI.APIRecurringScheduleTemplateControl, allow_multiple_selection: false, layout_name: 'global_recurring_template_control', show_search_inputs: true, set_empty: true, field: 'recurring_schedule_template_control_id' } ); this.addEditFieldToColumn( $.i18n._( 'Template' ), form_item_input, tab_recurring_schedule_column1, '' ); // Start Week form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT ); form_item_input.TTextInput( { field: 'start_week', width: 40 } ); this.addEditFieldToColumn( $.i18n._( 'Template Start Week' ), form_item_input, tab_recurring_schedule_column1 ); // 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_recurring_schedule_column1, '', null ); // End Date form_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER ); form_item_input.TDatePicker( { field: 'end_date' } ); widgetContainer = $( '
' ); var label = $( '' + $.i18n._( '(Leave blank for no end date)' ) + '' ); widgetContainer.append( form_item_input ); widgetContainer.append( label ); this.addEditFieldToColumn( $.i18n._( 'End Date' ), form_item_input, tab_recurring_schedule_column1, '', widgetContainer ); // Display Weeks form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT ); form_item_input.TTextInput( { field: 'display_weeks', width: 20 } ); this.addEditFieldToColumn( $.i18n._( 'Display Weeks' ), form_item_input, tab_recurring_schedule_column1, '', null ); if ( ( Global.getProductEdition() >= 15 ) ) { // Auto-Punch form_item_input = Global.loadWidgetByName( FormItemType.CHECKBOX ); form_item_input.TCheckbox( { field: 'auto_fill' } ); widgetContainer = $( '
' ); label = $( ' (' + $.i18n._( 'Punches employees in/out automatically' ) + ')' ); widgetContainer.append( form_item_input ); widgetContainer.append( label ); this.addEditFieldToColumn( $.i18n._( 'Auto-Punch' ), form_item_input, tab_recurring_schedule_column1, '', widgetContainer ); } // Employees form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX ); var default_args = {}; if ( ( Global.getProductEdition() >= 15 ) ) { form_item_input.AComboBox( { api_class: TTAPI.APIUser, allow_multiple_selection: this.is_add === true, layout_name: 'global_user', show_search_inputs: true, set_any: true, field: 'user_id', custom_first_label: Global.empty_item, addition_source_function: function( target, source_data ) { if ( !source_data ) { return source_data; } var first_item = form_item_input.createItem( TTUUID.zero_id, Global.open_item ); source_data.unshift( first_item ); return source_data; }, added_items: [ { value: TTUUID.zero_id, label: Global.open_item } ] } ); default_args.permission_section = 'recurring_schedule'; form_item_input.setDefaultArgs( default_args ); } else { form_item_input.AComboBox( { api_class: TTAPI.APIUser, allow_multiple_selection: this.is_add === true, layout_name: 'global_user', show_search_inputs: true, set_any: true, custom_first_label: Global.empty_item, field: 'user_id' } ); default_args.permission_section = 'recurring_schedule'; form_item_input.setDefaultArgs( default_args ); } this.addEditFieldToColumn( $.i18n._( 'Employees' ), form_item_input, tab_recurring_schedule_column1, '', null, true ); } buildSearchFields() { super.buildSearchFields(); this.search_fields = [ new SearchField( { label: $.i18n._( 'Employee Status' ), in_column: 1, field: 'user_status_id', multiple: true, basic_search: true, adv_search: true, layout_name: 'global_option_column', form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Template' ), in_column: 1, field: 'recurring_schedule_template_control_id', layout_name: 'global_recurring_template_control', api_class: TTAPI.APIRecurringScheduleTemplateControl, multiple: true, basic_search: true, adv_search: true, form_item_type: FormItemType.AWESOME_BOX } ), 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: true, addition_source_function: this.onEmployeeSourceCreate, form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Group' ), in_column: 1, multiple: true, field: 'group_id', layout_name: 'global_tree_column', tree_mode: true, basic_search: true, adv_search: true, form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Title' ), field: 'title_id', in_column: 1, layout_name: 'global_job_title', api_class: TTAPI.APIUserTitle, multiple: true, basic_search: false, adv_search: true, form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Default Branch' ), in_column: 2, field: 'default_branch_id', layout_name: 'global_branch', api_class: TTAPI.APIBranch, multiple: true, basic_search: true, adv_search: true, script_name: 'BranchView', form_item_type: FormItemType.AWESOME_BOX } ), new SearchField( { label: $.i18n._( 'Default Department' ), in_column: 2, field: 'default_department_id', layout_name: 'global_department', api_class: TTAPI.APIDepartment, multiple: true, basic_search: true, adv_search: true, script_name: 'DepartmentView', 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: false, adv_search: true, 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: false, adv_search: true, form_item_type: FormItemType.AWESOME_BOX } ) ]; } onEmployeeSourceCreate( target, source_data ) { if ( Global.getProductEdition() <= 10 ) { return source_data; } var display_columns = target.getDisplayColumns(); var first_item = {}; $.each( display_columns, function( index, content ) { first_item.id = TTUUID.zero_id; first_item[content.name] = Global.open_item; return false; } ); //Error: Object doesn't support property or method 'unshift' in /interface/html5/line 6953 if ( !source_data || $.type( source_data ) !== 'array' ) { source_data = []; } source_data.unshift( first_item ); return source_data; } 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 Templates' ), id: 'recurring_template', menu_align: 'right', action_group: 'jump_to', group: 'navigation', }, { label: $.i18n._( 'Schedules' ), id: 'schedule', menu_align: 'right', action_group: 'jump_to', group: 'navigation', } ] }; return context_menu_model; } onCustomContextClick( id ) { switch ( id ) { case 'recurring_template': case 'schedule': case 'export_excel': this.onNavigationClick( id ); break; } } /* * Common functions used by view and edit onclick logic */ onMassEditClick() { var $this = this; $this.is_add = false; $this.is_viewing = false; $this.is_mass_editing = true; LocalCacheData.current_doing_context_action = 'mass_edit'; var filter = {}; var grid_selected_id_array = this.getGridSelectIdArray(); var grid_selected_length = grid_selected_id_array.length; this.mass_edit_record_ids = []; $.each( grid_selected_id_array, function( index, value ) { $this.mass_edit_record_ids.push( value ); } ); filter.filter_data = {}; filter.filter_data.id = this.mass_edit_record_ids; this.api['getCommon' + this.api.key_name + 'Data']( filter, { onResult: function( result ) { var result_data = result.getResult(); if ( result_data.id ) { $this.onEditClick( result_data.id ); return; } $this.openEditView(); if ( !result_data ) { result_data = []; } $this.api['getOptions']( 'unique_columns', { onResult: function( result ) { $this.unique_columns = result.getResult(); $this.api['getOptions']( 'linked_columns', { onResult: function( result1 ) { $this.linked_columns = result1.getResult(); if ( $this.sub_view_mode && $this.parent_key ) { result_data[$this.parent_key] = $this.parent_value; } $this.current_edit_record = result_data; $this.initEditView(); } } ); } } ); } } ); } 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 } ); } } } onSaveClick( ignoreWarning ) { if ( !Global.isSet( ignoreWarning ) ) { ignoreWarning = false; } var record; //Setting is_add false too early can cause determineContextMenuMountAttributes() to have unexpected side effects. However not setting it here might have other side effects. //this.is_add = false; LocalCacheData.current_doing_context_action = 'save'; if ( this.is_mass_editing ) { var changed_fields = this.getChangedFields(); record = this.buildMassEditSaveRecord( this.mass_edit_record_ids, changed_fields ); } else if ( this.is_mass_adding ) { record = this.buildMassAddRecord( this.current_edit_record ); } else { record = this.getRecordsFromUserIDs(); } this.doSaveAPICall( record, ignoreWarning ); } onSaveAndCopy( ignoreWarning ) { var $this = this; if ( !Global.isSet( ignoreWarning ) ) { ignoreWarning = false; } this.is_add = true; this.is_changed = false; LocalCacheData.current_doing_context_action = 'save_and_copy'; var record = this.getRecordsFromUserIDs(); this.clearNavigationData(); this.api['set' + this.api.key_name]( record, false, ignoreWarning, { onResult: function( result ) { $this.onSaveAndCopyResult( result ); } } ); } onSaveAndNewClick( ignoreWarning ) { var $this = this; if ( !Global.isSet( ignoreWarning ) ) { ignoreWarning = false; } this.setCurrentEditViewState( 'new' ); var record = this.getRecordsFromUserIDs(); this.api['set' + this.api.key_name]( record, false, ignoreWarning, { onResult: function( result ) { $this.onSaveAndNewResult( result ); } } ); } onSaveAndContinue( ignoreWarning ) { var $this = this; if ( !Global.isSet( ignoreWarning ) ) { ignoreWarning = false; } this.is_changed = false; this.is_add = false; LocalCacheData.current_doing_context_action = 'save_and_continue'; var record = this.getRecordsFromUserIDs(); this.doSaveAPICall( record, ignoreWarning, { onResult: function( result ) { $this.onSaveAndContinueResult( result ); } } ); } validate( api ) { if ( this.enable_validation ) { //Allow alternate api to be validated. if ( api == undefined ) { var api = this.api; } var $this = this; var record = {}; if ( this.is_mass_editing ) { var changed_fields = this.getChangedFields(); record = this.buildMassEditSaveRecord( this.mass_edit_record_ids, changed_fields ); } else { record = this.getRecordsFromUserIDs(); } api['validate' + api.key_name]( record, { onResult: function( result ) { $this.validateResult( result ); } } ); } else { Debug.Text( 'Validation disabled', 'BaseViewController.js', 'BaseViewController', 'validate', 10 ); } } getRecordsFromUserIDs() { var record; if ( Array.isArray( this.current_edit_record.user_id ) ) { //Convert multiple user_id recurring schedules to their own record for the API. record = []; for ( var i = 0; i < this.current_edit_record.user_id.length; i++ ) { var tmp_record = Global.clone( this.current_edit_record ); tmp_record.user_id = this.current_edit_record.user_id[i]; tmp_record = this.uniformVariable( tmp_record ); record.push( tmp_record ); } } else { record = this.current_edit_record; record = this.uniformVariable( record ); } return record; } onNavigationClick( iconName ) { var $this = this; switch ( iconName ) { case 'schedule': var filter = { filter_data: {} }; var selected_item = this.getSelectedItem(); var include_users = null; var now_date = new Date(); if ( !Global.isSet( selected_item.user_id ) ) { var temp_filter = {}; temp_filter.filter_data = {}; temp_filter.filter_data.id = [selected_item.id]; temp_filter.filter_columns = { user_id: true }; this.api['get' + this.api.key_name]( temp_filter, { onResult: function( result ) { var result_data = result.getResult(); if ( !result_data ) { result_data = []; } result_data = result_data[0]; include_users = [result_data.user_id]; filter.filter_data.include_user_ids = { value: include_users }; filter.select_date = now_date.format(); Global.addViewTab( $this.viewId, $.i18n._( 'Recurring Schedules' ), window.location.href ); IndexViewController.goToView( 'Schedule', filter ); } } ); } else { include_users = [selected_item.user_id]; filter.filter_data.include_user_ids = { value: include_users }; filter.select_date = now_date.format(); Global.addViewTab( this.viewId, $.i18n._( 'Recurring Schedules' ), window.location.href ); IndexViewController.goToView( 'Schedule', filter ); } break; case 'recurring_template': filter = { filter_data: {} }; selected_item = this.getSelectedItem(); if ( !Global.isSet( selected_item.recurring_schedule_template_control_id ) ) { temp_filter = {}; temp_filter.filter_data = {}; temp_filter.filter_data.id = [selected_item.id]; this.api['get' + this.api.key_name]( temp_filter, { onResult: function( result ) { var result_data = result.getResult(); if ( !result_data ) { result_data = []; } result_data = result_data[0]; filter.filter_data.id = [result_data.recurring_schedule_template_control_id]; Global.addViewTab( $this.viewId, $.i18n._( 'Recurring Schedules' ), window.location.href ); IndexViewController.goToView( 'RecurringScheduleTemplateControl', filter ); } } ); } else { filter.filter_data.id = [selected_item.recurring_schedule_template_control_id]; Global.addViewTab( this.viewId, $.i18n._( 'Recurring Schedules' ), window.location.href ); IndexViewController.goToView( 'RecurringScheduleTemplateControl', filter ); } break; case 'export_excel': this.onExportClick( 'exportRecurringScheduleControl' ); break; } } setCustomDefaultMenuIcon( id, context_btn, grid_selected_length ) { switch ( id ) { case 'recurring_template': this.setDefaultMenuRecurringTemplateIcon( context_btn, grid_selected_length ); break; case 'schedule': this.setDefaultMenuScheduleIcon( context_btn, grid_selected_length ); break; } } setDefaultMenuRecurringTemplateIcon( context_btn, grid_selected_length, pId ) { if ( !this.viewPermissionValidate( pId ) || 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 ); } } 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 ); } } search( set_default_menu, page_action, page_number, callBack ) { if ( !Global.isSet( set_default_menu ) ) { set_default_menu = true; } var $this = this; var filter = {}; filter.filter_data = {}; filter.filter_sort = {}; filter.filter_columns = this.getFilterColumnsFromDisplayColumns(); filter.filter_items_per_page = 0; // Default to 0 to load user preference defined if ( this.pager_data ) { if ( LocalCacheData.paging_type === 0 ) { if ( page_action === 'next' ) { filter.filter_page = this.pager_data.next_page; } else { filter.filter_page = 1; } } else { switch ( page_action ) { case 'next': filter.filter_page = this.pager_data.next_page; break; case 'last': filter.filter_page = this.pager_data.previous_page; break; case 'start': filter.filter_page = 1; break; case 'end': filter.filter_page = this.pager_data.last_page_number; break; case 'go_to': filter.filter_page = page_number; break; default: filter.filter_page = this.pager_data.current_page; break; } } } else { filter.filter_page = 1; } if ( this.sub_view_mode && this.parent_key ) { this.select_layout.data.filter_data[this.parent_key] = this.parent_value; } //If sub view controller set custom filters, get it if ( Global.isSet( this.getSubViewFilter ) ) { this.select_layout.data.filter_data = this.getSubViewFilter( this.select_layout.data.filter_data ); } //select_layout will not be null, it's set in setSelectLayout function filter.filter_data = Global.convertLayoutFilterToAPIFilter( this.select_layout ); filter.filter_sort = this.select_layout.data.filter_sort; this.last_select_ids = this.getGridSelectIdArray(); this.api['get' + this.api.key_name]( filter, { onResult: function( result ) { var result_data = result.getResult(); if ( !Global.isArray( result_data ) ) { $this.showNoResultCover(); } else { $this.removeNoResultCover(); if ( Global.isSet( $this.__createRowId ) ) { result_data = $this.__createRowId( result_data ); } result_data = Global.formatGridData( result_data, $this.api.key_name ); } //Set Page data to widget, next show display info when setDefault Menu $this.pager_data = result.getPagerData(); //CLick to show more mode no need this step if ( LocalCacheData.paging_type !== 0 ) { $this.paging_widget.setPagerData( $this.pager_data ); $this.paging_widget_2.setPagerData( $this.pager_data ); } if ( LocalCacheData.paging_type === 0 && page_action === 'next' ) { var current_data = $this.grid.getGridParam( 'data' ); result_data = current_data.concat( result_data ); } ///Override to reset id, because id of each record is the same if employess assigned to this id. var len = result_data.length; for ( var i = 0; i < len; i++ ) { var item = result_data[i]; } if ( $this.grid ) { $this.grid.setData( result_data ); $this.reSelectLastSelectItems(); } $this.setGridCellBackGround(); //Set cell background for some views ProgressBar.closeOverlay(); //Add this in initData if ( set_default_menu ) { $this.setDefaultMenu( true ); } if ( LocalCacheData.paging_type === 0 ) { if ( !$this.pager_data || $this.pager_data.is_last_page ) { $this.paging_widget.css( 'display', 'none' ); } else { $this.paging_widget.css( 'display', 'block' ); } } if ( callBack ) { callBack( result ); } // when call this from save and new result, we don't call auto open, because this will call onAddClick twice if ( set_default_menu ) { $this.autoOpenEditViewIfNecessary(); } $this.searchDone(); } } ); } getFilterColumnsFromDisplayColumns() { var column_filter = {}; column_filter.user_id = true; return this._getFilterColumnsFromDisplayColumns( column_filter, true ); } setCustomEditMenuIcon( id, context_btn ) { switch ( id ) { case 'recurring_template': this.setEditMenuRecurringTemplateIcon( context_btn ); break; case 'schedule': this.setEditMenuScheduleIcon( context_btn ); break; } } setEditMenuRecurringTemplateIcon( 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 ); } } setEditMenuScheduleIcon( 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 ); } } }