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 = `
<%= week %> <%= status %> <%= week_names %> <%= shift_time %> <%= total %> <%= schedule_policy %> <%= branch_department %> <%= job_task %> <%= open_shift_multiplier %>
`; } else if ( Global.getProductEdition() >= 15 ) { render = `
<%= week %> <%= status %> <%= week_names %> <%= shift_time %> <%= total %> <%= schedule_policy %> <%= branch_department %> <%= open_shift_multiplier %>
`; } else { render = `
<%= week %> <%= status %> <%= week_names %> <%= shift_time %> <%= total %> <%= schedule_policy %> <%= branch_department %>
`; } return render; } function getRowRender() { var render = ''; if ( Global.getProductEdition() >= 20 ) { render = ` `; } else if ( Global.getProductEdition() >= 15 ) { render = ` `; } else { render = ` `; } 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 = $( '
' ); 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 = $( '
' ); // 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 = $( '
' ); var divContainer1 = $( '
' ); var label_1 = $( ' ' + $.i18n._( 'In' ) + ' ' ); 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 = $( '
' ); var label_2 = $( ' ' + $.i18n._( 'Out' ) + ' ' ); 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 = $( '
' ); divContainer1 = $( '
' ); label_1 = $( ' ' + $.i18n._( 'Branch' ) + ' ' ); 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 = $( '
' ); label_2 = $( ' ' + $.i18n._( 'Department' ) + ' ' ); 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 = $( '
' ); divContainer1 = $( '
' ); label_1 = $( ' ' + $.i18n._( 'Job' ) + ' ' ); 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 = $( '
' ); label_2 = $( ' ' + $.i18n._( 'Task' ) + ' ' ); 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 = $( '
' ); var label_3 = $( ' ' + $.i18n._( 'Tags' ) + ' ' ); 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 `
`; } }