TimeTrex/interface/html5/components/main_menu/MenuManager.js

2537 lines
79 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Imports
// Relies on Debug in @/global/Debug.js imported as a global in HTML tags.
// Relies on TopMenuManager imported as a global in main.js
import TTEventBus from '@/services/TTEventBus';
// TODO: Add in the wizards and dialog (In/Out) options etc.
// TODO: Check all items are present, compared to old menu. Check permissions!
// TODO: Fix the group duplicate/missing errors in console. This was just after the big menu update of all items.
// TODO: - Previously the link was parent -> subgroup -> item.
// TODO: - And now, the item needs to link direct to the parent, and that association has to be edited manually, so quite a lot to get through.
// TODO: Fix the menu width when the browser is resized down to mobile. This is related to the width override. Perhaps change the width in the SCSS source files.
// TODO: Do the colour of the topbar correctly using SCSS 'theme' files so that the theme can be properly changed in future.
// TODO: Add Account Menu dividers.
// TODO: Build new context menu with PrimeVue buttons, spend about 20 mins on seeing if we can edit an existing button.
// Otherwise use v-if vue options to show hide the Save and Save Next as diff buttons.
// right click menu mirrors the context menu. it has to be completely flat, rather than the grouping for context.
// context manager that controls both formats. start with the main menu class?
// TODO: later on: the CSS changes together with moving the company name and support chat links
// TODO: back burner: Ordering logic needs to be done for main menu. Do this after context menu.
class MenuManager {
constructor() {
this.event_bus = new TTEventBus( {
component_id: 'menu_manager',
} );
this.menu_items = [];
this.menu_locked = false; // Track state of menu built/unbuilt. Menu must be reset before items can be added. Otherwise there will be a mix of built and unbuilt items.
window._main_menu = this; // TODO: Temp for local debugging.
}
lockMenu() {
this.menu_locked = true;
}
unlockMenu() {
this.menu_locked = false;
}
isMenuLocked() {
return Boolean( this.menu_locked );
}
addItem( item ) {
if( this.menu_locked ) {
Debug.Error( 'Menu is built and locked. Reset menu before adding new items.', 'MenuManager.js', 'MenuManager', 'addItem', 2 );
return false;
}
if( typeof item !== 'object' || item === null || item === undefined ) {
Debug.Error( 'Invalid menu item', 'MenuManager.js', 'MenuManager', 'addItem', 2 );
return false;
}
if( this.menu_items.filter( ( menu_item_check ) => menu_item_check.id === item.id ).length !== 0 ) {
Debug.Error( 'Duplicate menu item. Item ID ('+ item.id +') already exists in menu.', 'MenuManager.js', 'MenuManager', 'addItem', 2 );
return false;
}
item = new TTMenuItem( item );
this.menu_items.push( item );
}
/**
* Get the previously built menu model in PrimeVue format without rebuilding the menu on every request.
* @returns {boolean|[]}
*/
getMenu() {
if( !this.menu_locked ) {
Debug.Error( 'Menu has not been built yet. Run convertMenuItemsToPrimeVueFormat() or rebuildMenu()', 'MenuManager.js', 'MenuManager', 'getMenu', 2 );
return false;
}
return this.menu_items;
}
rebuildMenu() {
this.initDefaultMenuItems();
this.getMenu();
return this.menu_items;
}
convertMenuItemsToPrimeVueFormat() {
if( this.menu_locked ) {
Debug.Error( 'Menu is already built and locked. Reset menu before rebuilding.', 'MenuManager.js', 'MenuManager', 'convertMenuItemsToPrimeVueFormat', 2 );
return false;
}
// Starting build process, lock menu.
this.lockMenu();
var menu_output = [];
this.menu_items.forEach(( item ) => {
// Make a copy of the item, by creating a TTMenuItem. Otherwise when items are added to group headers, the item[] array will keep growing on each generation run. Using a class instance also helps be more Object Orientated.
//item = new TTMenuItem( item );
if ( item.url_type === 'view' && item.destination ) {
item.url = Global.getBaseURL() + '#!m=' + item.destination;
} else if ( item.url_type === 'sub_view' && item.destination ) {
item.url = Global.getBaseURL() + '#!m=Home&sm=' + item.destination;
} else if ( !item.url && item.destination ) {
item.url = Global.getBaseURL() + '#!m=Home'; //If view cannot be reached by a URL, go to Home.
} else if ( !item.url ) {
item.url = 'javascript:;'; // This is to prevent apollo-vue from adding a hash to the 'a href' , which forces a refresh of the page. Alternative is to edit AppSubmenu.vue but that involves duplicating the apollo code into TT codebase.
}
// check if permissions allow this icon for this user.
if( item.permission_result === false ) {
return false;
}
// Check if item already exists in menu.
if( menu_output.filter( ( menu_item_check ) => menu_item_check.id === item.id ).length !== 0 ) {
// Error: Item already exists.
Debug.Error( 'Menu item ('+ item.id +') already exists. Duplicate warning.', 'MenuManager.js', 'MenuManager', 'convertMenuItemsToPrimeVueFormat', 2 );
return false;
}
// Handle tt_link data.
if( item.destination && item.tt_link ) {
item.parseTTLink();
}
if ( item.hide_in_main_menu ) {
item.visible = false; //We do not want to show menu items that have been moved elsewhere (such as topbar) in the main menu.
}
// Grouping. Add item to a parent group, or if no group, add as a root menu element.
if( item.parent_id ) {
// Check if needle_value with that group already exists in output. If not error out and say groups must come before items.
// menu_output.forEach(( array_item ) => {
// var group_check = menu_output.map(copy).filter( function recursiveFilter( array_item ) {
var parent_result = this.menu_items.filter( ( parent_item_check ) => parent_item_check.id === item.parent_id )
if ( parent_result.length === 1 ) {
// Group exists. Add item to the group.
parent_result[0].items = parent_result[0].items || []; // By creating a new items array here, rather than earlier (or during addItem), it will always be a fresh array reference on every menu model generation run.
parent_result[0].items.push( item ); // relies on JS pass-by-reference to add the items.
} else {
// Error: Group either does not exist or duplicates.
Debug.Error( 'Menu group ('+ item.parent_id +') for ('+ item.id +') does not exist or there are duplicates. Check addItem() ordering, as group must be added to menu before items can be added.', 'MenuManager.js', 'MenuManager', 'convertMenuItemsToPrimeVueFormat', 2 );
}
} else {
// Item has no parent_id, treat as root menu element.
menu_output.push( item );
}
});
// Return only menu item groups that have passed the following checks.
var validated_items = menu_output.filter( ( validation_item ) => {
if ( validation_item.items ) {
//Each report menu item is a potential dropdown with an array of items if permission checks succeed.
//Checking one level deeper to remove those items if they do not contain items or are a link / separator themselves.
validation_item.items = validation_item.items.filter( ( item, index, items_array ) => {
if ( item.parent_id && !item.destination && !item.separator && ( !item.items || item.items.every( child_item => child_item.separator ) ) ) {
return false;
}
//This fixes issues where due to user permissions there might be unwanted separators.
//For example there might be multiple separators in a row or the first/last item might be a separator.
if ( item.separator && ( index === 0 || index === items_array.length - 1 || items_array[index - 1].separator ) ) {
return false;
}
return true;
} );
}
var contains_items = Boolean( validation_item.items !== undefined && validation_item.items.length !== 0
&& validation_item.items.some( item => !item.separator ) ); //Make sure top level contains an actual menu item and not only separators.
var has_destination = Boolean( validation_item.destination );
var is_separator = Boolean( validation_item.separator );
return ( contains_items || has_destination || is_separator );
} );
this.menu_items = validated_items;
}
initDefaultMenuItems() {
// reset menu before building.
this.menu_items = [];
this.unlockMenu();
this.addItem( {
label: $.i18n._( 'Dashboard' ),
id: 'home',
order: 1000,
icon: 'tticon tticon-speed_black_24dp',
destination: 'Home',
url_type: 'view'
} );
//Attendance Menu
this.addItem( {
label: $.i18n._( 'Attendance' ),
id: 'attendance_menu',
order: 100000,
icon: 'tticon tticon-schedule_black_24dp',
} );
//Attendance Group Sub Menu
this.addItem( {
label: $.i18n._( 'TimeSheet' ),
id: 'TimeSheet',
destination: 'TimeSheet',
url_type: 'view',
parent_id: 'attendance_menu',
sub_group_id: 'attendance_attendance',
permission_result: PermissionManager.checkTopLevelPermission( 'TimeSheet' )
} );
this.addItem( {
label: $.i18n._( 'Punches' ),
id: 'Punches',
destination: 'Punches',
url_type: 'view',
parent_id: 'attendance_menu',
sub_group_id: 'attendance_attendance',
permission_result: PermissionManager.checkTopLevelPermission( 'Punches' )
} );
this.addItem( {
label: $.i18n._( 'Exceptions' ),
id: 'Exception',
destination: 'Exception',
url_type: 'view',
parent_id: 'attendance_menu',
sub_group_id: 'attendance_attendance',
permission_result: PermissionManager.checkTopLevelPermission( 'Exception' )
} );
this.addItem( {
label: $.i18n._( 'Accrual Balances' ),
id: 'AccrualBalance',
destination: 'AccrualBalance',
url_type: 'view',
parent_id: 'attendance_menu',
sub_group_id: 'attendance_attendance',
permission_result: PermissionManager.checkTopLevelPermission( 'AccrualBalance' )
} );
this.addItem( {
label: $.i18n._( 'Accruals' ),
id: 'Accrual',
destination: 'Accrual',
url_type: 'view',
parent_id: 'attendance_menu',
sub_group_id: 'attendance_attendance',
permission_result: PermissionManager.checkTopLevelPermission( 'Accrual' )
} );
this.addItem( {
id: 'separator_attendance_1',
parent_id: 'attendance_menu',
separator: true,
} );
this.addItem( {
label: $.i18n._( 'Jobs' ),
id: 'Job',
destination: 'Job',
url_type: 'view',
parent_id: 'attendance_menu',
sub_group_id: 'attendance_job_tracking',
permission_result: PermissionManager.checkTopLevelPermission( 'Job' )
} );
this.addItem( {
label: $.i18n._( 'Tasks' ),
id: 'JobItem',
destination: 'JobItem',
url_type: 'view',
parent_id: 'attendance_menu',
sub_group_id: 'attendance_job_tracking',
permission_result: PermissionManager.checkTopLevelPermission( 'JobItem' )
} );
this.addItem( {
label: $.i18n._( 'Punch Tags' ),
id: 'PunchTag',
destination: 'PunchTag',
url_type: 'view',
parent_id: 'attendance_menu',
sub_group_id: 'attendance_job_tracking',
permission_result: PermissionManager.checkTopLevelPermission( 'PunchTag' )
} );
//GeoFencing
this.addItem( {
label: $.i18n._( 'GEO Fences' ),
id: 'attendance_GEOFence',
destination: 'GEOFence',
url_type: 'view',
parent_id: 'attendance_menu',
sub_group_id: 'attendance_job_tracking',
permission_result: PermissionManager.checkTopLevelPermission( 'GEOFence' )
} );
this.addItem( {
label: $.i18n._( 'Job Groups' ),
id: 'JobGroup',
destination: 'JobGroup',
url_type: 'view',
parent_id: 'attendance_menu',
sub_group_id: 'attendance_job_tracking',
permission_result: PermissionManager.checkTopLevelPermission( 'JobGroup' )
} );
this.addItem( {
label: $.i18n._( 'Task Groups' ),
id: 'JobItemGroup',
destination: 'JobItemGroup',
url_type: 'view',
parent_id: 'attendance_menu',
sub_group_id: 'attendance_job_tracking',
permission_result: PermissionManager.checkTopLevelPermission( 'JobItemGroup' )
} );
this.addItem( {
label: $.i18n._( 'Punch Tag Groups' ),
id: 'PunchTagGroup',
destination: 'PunchTagGroup',
url_type: 'view',
parent_id: 'attendance_menu',
sub_group_id: 'attendance_job_tracking',
permission_result: PermissionManager.checkTopLevelPermission( 'PunchTagGroup' )
} );
//Schedule Menu
this.addItem( {
label: $.i18n._( 'Schedule' ),
id: 'schedule_menu',
icon: 'tticon tticon-calendar_today_black_24dp',
} );
this.addItem( {
label: $.i18n._( 'Schedules' ),
id: 'Schedule',
destination: 'Schedule',
url_type: 'view',
parent_id: 'schedule_menu',
sub_group_id: 'attendance_schedule',
permission_result: PermissionManager.checkTopLevelPermission( 'Schedule' )
} );
this.addItem( {
label: $.i18n._( 'Scheduled Shifts' ),
id: 'ScheduleShift',
destination: 'ScheduleShift',
url_type: 'view',
parent_id: 'schedule_menu',
sub_group_id: 'attendance_schedule',
permission_result: PermissionManager.checkTopLevelPermission( 'ScheduleShift' )
} );
this.addItem( {
label: $.i18n._( 'Recurring Schedules' ),
id: 'RecurringScheduleControl',
destination: 'RecurringScheduleControl',
url_type: 'view',
parent_id: 'schedule_menu',
sub_group_id: 'attendance_schedule',
permission_result: PermissionManager.checkTopLevelPermission( 'RecurringScheduleControl' )
} );
this.addItem( {
label: $.i18n._( 'Recurring Templates' ),
id: 'RecurringScheduleTemplateControl',
destination: 'RecurringScheduleTemplateControl',
url_type: 'view',
parent_id: 'schedule_menu',
sub_group_id: 'attendance_schedule',
permission_result: PermissionManager.checkTopLevelPermission( 'RecurringScheduleTemplateControl' )
} );
//Employee Menu
this.addItem( {
label: $.i18n._( 'Employee' ),
id: 'employee_menu',
icon: 'tticon tticon-people_alt_black_24dp',
} );
//Employee group Sub Menu
this.addItem( {
label: $.i18n._( 'Employees' ),
id: 'Employee',
destination: 'Employee',
url_type: 'view',
parent_id: 'employee_menu',
sub_group_id: 'employee_employee',
permission_result: PermissionManager.checkTopLevelPermission( 'Employee' )
} );
this.addItem( {
label: $.i18n._( 'Employee Contacts' ),
id: 'UserContact',
destination: 'UserContact',
url_type: 'view',
parent_id: 'employee_menu',
sub_group_id: 'employee_employee',
permission_result: PermissionManager.checkTopLevelPermission( 'UserContact' )
} );
this.addItem( {
label: $.i18n._( 'Preferences' ),
id: 'UserPreference',
destination: 'UserPreference',
url_type: 'view',
parent_id: 'employee_menu',
sub_group_id: 'employee_employee',
permission_result: PermissionManager.checkTopLevelPermission( 'UserPreference' )
} );
this.addItem( {
label: $.i18n._( 'Wages' ),
id: 'Wage',
destination: 'Wage',
url_type: 'view',
parent_id: 'employee_menu',
sub_group_id: 'employee_employee',
permission_result: PermissionManager.checkTopLevelPermission( 'Wage' )
} );
this.addItem( {
label: $.i18n._( 'Pay Methods' ),
id: 'RemittanceDestinationAccount',
destination: 'RemittanceDestinationAccount',
url_type: 'view',
parent_id: 'employee_menu',
sub_group_id: 'employee_employee',
permission_result: PermissionManager.checkTopLevelPermission( 'RemittanceDestinationAccount' )
} );
this.addItem( {
label: $.i18n._( 'Titles' ),
id: 'UserTitle',
destination: 'UserTitle',
url_type: 'view',
parent_id: 'employee_menu',
sub_group_id: 'employee_employee',
permission_result: PermissionManager.checkTopLevelPermission( 'UserTitle' )
} );
this.addItem( {
label: $.i18n._( 'Employee Groups' ),
id: 'UserGroup',
destination: 'UserGroup',
url_type: 'view',
parent_id: 'employee_menu',
sub_group_id: 'employee_employee',
permission_result: PermissionManager.checkTopLevelPermission( 'UserGroup' )
} );
this.addItem( {
label: $.i18n._( 'Ethnic Groups' ),
id: 'EthnicGroup',
destination: 'EthnicGroup',
url_type: 'view',
parent_id: 'employee_menu',
sub_group_id: 'employee_employee',
permission_result: PermissionManager.checkTopLevelPermission( 'EthnicGroup' )
} );
this.addItem( {
label: $.i18n._( 'New Hire Defaults' ),
id: 'UserDefault',
destination: 'UserDefault',
url_type: Global.getProductEdition() > 10 ? 'view' : 'sub_view',
parent_id: 'employee_menu',
sub_group_id: 'employee_employee',
permission_result: PermissionManager.checkTopLevelPermission( 'UserDefault' )
} );
this.addItem( {
label: $.i18n._( 'Record of Employment' ),
id: 'ROE',
destination: 'ROE',
url_type: 'view',
parent_id: 'employee_menu',
sub_group_id: 'employee_employee',
permission_result: PermissionManager.checkTopLevelPermission( 'ROE' )
} );
//Company Menu
this.addItem( {
label: $.i18n._( 'Company' ),
id: 'company_menu',
icon: 'tticon tticon-business_black_24dp'
} );
this.addItem( {
label: $.i18n._( 'Companies' ),
id: 'Companies',
destination: 'Companies',
url_type: 'view',
parent_id: 'company_menu',
sub_group_id: 'company_company',
permission_result: PermissionManager.checkTopLevelPermission( 'Companies' )
} );
this.addItem( {
label: $.i18n._( 'Company Information' ),
id: 'Company',
destination: 'Company',
url_type: 'sub_view',
parent_id: 'company_menu',
sub_group_id: 'company_company',
permission_result: PermissionManager.checkTopLevelPermission( 'Company' )
} );
this.addItem( {
label: ( Global.getProductEdition() >= 15 ) ? $.i18n._( 'Legal Entities' ) : $.i18n._( 'Legal Entity' ),
id: 'LegalEntity',
destination: 'LegalEntity',
url_type: 'view',
parent_id: 'company_menu',
sub_group_id: 'company_company',
permission_result: PermissionManager.checkTopLevelPermission( 'LegalEntity' )
} );
this.addItem( {
label: $.i18n._( 'Branches' ),
id: 'Branch',
destination: 'Branch',
url_type: 'view',
parent_id: 'company_menu',
sub_group_id: 'company_company',
permission_result: PermissionManager.checkTopLevelPermission( 'Branch' )
} );
this.addItem( {
label: $.i18n._( 'Departments' ),
id: 'Department',
destination: 'Department',
url_type: 'view',
parent_id: 'company_menu',
sub_group_id: 'company_company',
permission_result: PermissionManager.checkTopLevelPermission( 'Department' )
} );
this.addItem( {
label: $.i18n._( 'Hierarchy' ),
id: 'HierarchyControl',
destination: 'HierarchyControl',
url_type: 'view',
parent_id: 'company_menu',
sub_group_id: 'company_company',
permission_result: PermissionManager.checkTopLevelPermission( 'HierarchyControl' )
} );
this.addItem( {
label: $.i18n._( 'Secondary Wage Groups' ),
id: 'WageGroup',
destination: 'WageGroup',
url_type: 'view',
parent_id: 'company_menu',
sub_group_id: 'company_company',
permission_result: PermissionManager.checkTopLevelPermission( 'WageGroup' )
} );
this.addItem( {
label: $.i18n._( 'Stations' ),
id: 'Station',
destination: 'Station',
url_type: 'view',
parent_id: 'company_menu',
sub_group_id: 'company_company',
permission_result: PermissionManager.checkTopLevelPermission( 'Station' )
} );
this.addItem( {
label: $.i18n._( 'Permission Groups' ),
id: 'PermissionControl',
destination: 'PermissionControl',
url_type: 'view',
parent_id: 'company_menu',
sub_group_id: 'company_company',
permission_result: PermissionManager.checkTopLevelPermission( 'PermissionControl' )
} );
this.addItem( {
label: $.i18n._( 'Currencies' ),
id: 'Currency',
destination: 'Currency',
url_type: 'view',
parent_id: 'company_menu',
sub_group_id: 'company_company',
permission_result: PermissionManager.checkTopLevelPermission( 'Currency' )
} );
this.addItem( {
label: $.i18n._( 'Custom Fields' ),
id: 'CustomField',
destination: 'CustomField',
url_type: 'view',
parent_id: 'company_menu',
sub_group_id: 'company_company',
permission_result: ( PermissionManager.checkTopLevelPermission( 'CustomField' ) && Global.getFeatureFlag( 'custom_field' ) == true )
} );
this.addItem( {
id: 'separator_company_1',
parent_id: 'company_menu',
separator: true,
} );
this.addItem( {
label: $.i18n._( 'Import' ),
id: 'ImportCSV',
destination: 'ImportCSV',
parent_id: 'company_menu',
sub_group_id: 'company_other',
permission_result: PermissionManager.checkTopLevelPermission( 'ImportCSV' )
} );
this.addItem( {
label: $.i18n._( 'Quick Start' ),
id: 'QuickStartWizard',
destination: 'QuickStartWizard',
parent_id: 'company_menu',
sub_group_id: 'company_other',
permission_result: PermissionManager.checkTopLevelPermission( 'QuickStartWizard' )
} );
this.addItem( {
label: $.i18n._( 'Payroll' ),
id: 'payroll_menu',
icon: 'tticon tticon-attach_money_black_24dp'
} );
this.addItem( {
label: $.i18n._( 'Process Payroll' ),
id: 'ProcessPayrollWizard',
destination: 'ProcessPayrollWizard',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'PayrollProcessWizard' )
} );
this.addItem( {
label: $.i18n._( 'Tax Wizard' ),
id: 'PayrollRemittanceAgencyEventWizardController',
destination: 'PayrollRemittanceAgencyEventWizardController',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'PayrollProcessWizard' )
} );
this.addItem( {
label: $.i18n._( 'Pay Stubs' ),
id: 'PayStub',
destination: 'PayStub',
url_type: 'view',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'PayStub' )
} );
this.addItem( {
label: $.i18n._( 'Pay Stub Transactions' ),
id: 'PayStubTransaction',
destination: 'PayStubTransaction',
url_type: 'view',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'PayStubTransaction' )
} );
this.addItem( {
label: $.i18n._( 'Government Documents' ),
id: 'GovernmentDocument',
destination: 'GovernmentDocument',
url_type: 'view',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'GovernmentDocument' )
} );
this.addItem( {
label: $.i18n._( 'Pay Periods' ),
id: 'PayPeriods',
destination: 'PayPeriods',
url_type: 'view',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'PayPeriods' )
} );
this.addItem( {
label: $.i18n._( 'Pay Stub Amendments' ),
id: 'PayStubAmendment',
destination: 'PayStubAmendment',
url_type: 'view',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'PayStubAmendment' )
} );
this.addItem( {
label: $.i18n._( 'Pay Period Schedules' ),
id: 'payroll_PayPeriodSchedule',
destination: 'PayPeriodSchedule',
url_type: 'view',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'PayPeriodSchedule' )
} );
this.addItem( {
label: $.i18n._( 'Pay Stub Accounts' ),
id: 'PayStubEntryAccount',
destination: 'PayStubEntryAccount',
url_type: 'view',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'PayStubEntryAccount' )
} );
this.addItem( {
label: $.i18n._( 'Taxes & Deductions' ),
id: 'CompanyTaxDeduction',
destination: 'CompanyTaxDeduction',
url_type: 'view',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'CompanyTaxDeduction' )
} );
this.addItem( {
label: $.i18n._( 'Remittance Agencies' ),
id: 'PayrollRemittanceAgency',
destination: 'PayrollRemittanceAgency',
url_type: 'view',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'PayrollRemittanceAgency' )
} );
this.addItem( {
label: $.i18n._( 'Remittance Sources' ),
id: 'RemittanceSourceAccount',
destination: 'RemittanceSourceAccount',
url_type: 'view',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'RemittanceSourceAccount' )
} );
this.addItem( {
label: $.i18n._( 'Expenses' ),
id: 'UserExpense',
destination: 'UserExpense',
url_type: 'view',
parent_id: 'payroll_menu',
sub_group_id: 'payroll_payroll',
permission_result: PermissionManager.checkTopLevelPermission( 'UserExpense' )
} );
this.addItem( {
label: $.i18n._( 'Policy' ),
id: 'policy_menu',
icon: 'tticon tticon-rule_folder_black_24dp'
} );
this.addItem( {
label: $.i18n._( 'Policy Groups' ),
id: 'PolicyGroup',
destination: 'PolicyGroup',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_building_blocks',
permission_result: PermissionManager.checkTopLevelPermission( 'PolicyGroup' )
} );
this.addItem( {
id: 'separator_policy_1',
parent_id: 'policy_menu',
separator: true,
} );
this.addItem( {
label: $.i18n._( 'Pay Codes' ),
id: 'PayCode',
destination: 'PayCode',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_building_blocks',
permission_result: PermissionManager.checkTopLevelPermission( 'PayCode' )
} );
this.addItem( {
label: $.i18n._( 'Pay Formulas' ),
id: 'PayFormulaPolicy',
destination: 'PayFormulaPolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_building_blocks',
permission_result: PermissionManager.checkTopLevelPermission( 'PayFormulaPolicy' )
} );
this.addItem( {
label: $.i18n._( 'Contributing Pay Codes' ),
id: 'ContributingPayCodePolicy',
destination: 'ContributingPayCodePolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_building_blocks',
permission_result: PermissionManager.checkTopLevelPermission( 'ContributingPayCodePolicy' )
} );
this.addItem( {
label: $.i18n._( 'Contributing Shifts' ),
id: 'ContributingShiftPolicy',
destination: 'ContributingShiftPolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_building_blocks',
permission_result: PermissionManager.checkTopLevelPermission( 'ContributingShiftPolicy' )
} );
this.addItem( {
label: $.i18n._( 'Accrual Accounts' ),
id: 'AccrualPolicyAccount',
destination: 'AccrualPolicyAccount',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_building_blocks',
permission_result: PermissionManager.checkTopLevelPermission( 'AccrualPolicy' )
} );
this.addItem( {
label: $.i18n._( 'Recurring Holidays' ),
id: 'RecurringHoliday',
destination: 'RecurringHoliday',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_building_blocks',
permission_result: PermissionManager.checkTopLevelPermission( 'RecurringHoliday' )
} );
this.addItem( {
id: 'separator_policy_2',
parent_id: 'policy_menu',
separator: true,
} );
this.addItem( {
label: $.i18n._( 'Schedule Policies' ),
id: 'SchedulePolicy',
destination: 'SchedulePolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_policy',
permission_result: PermissionManager.checkTopLevelPermission( 'SchedulePolicy' )
} );
this.addItem( {
label: $.i18n._( 'Rounding Policies' ),
id: 'RoundIntervalPolicy',
destination: 'RoundIntervalPolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_policy',
permission_result: PermissionManager.checkTopLevelPermission( 'RoundIntervalPolicy' )
} );
this.addItem( {
label: $.i18n._( 'Meal Policies' ),
id: 'MealPolicy',
destination: 'MealPolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_policy',
permission_result: PermissionManager.checkTopLevelPermission( 'MealPolicy' )
} );
this.addItem( {
label: $.i18n._( 'Break Policies' ),
id: 'BreakPolicy',
destination: 'BreakPolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_policy',
permission_result: PermissionManager.checkTopLevelPermission( 'BreakPolicy' )
} );
this.addItem( {
label: $.i18n._( 'Regular Time Policies' ),
id: 'RegularTimePolicy',
destination: 'RegularTimePolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_policy',
permission_result: PermissionManager.checkTopLevelPermission( 'RegularTimePolicy' )
} );
this.addItem( {
label: $.i18n._( 'Overtime Policies' ),
id: 'OvertimePolicy',
destination: 'OvertimePolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_policy',
permission_result: PermissionManager.checkTopLevelPermission( 'OvertimePolicy' )
} );
this.addItem( {
label: $.i18n._( 'Premium Policies' ),
id: 'PremiumPolicy',
destination: 'PremiumPolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_policy',
permission_result: PermissionManager.checkTopLevelPermission( 'PremiumPolicy' )
} );
this.addItem( {
label: $.i18n._( 'Exception Policies' ),
id: 'ExceptionPolicyControl',
destination: 'ExceptionPolicyControl',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_policy',
permission_result: PermissionManager.checkTopLevelPermission( 'ExceptionPolicyControl' )
} );
this.addItem( {
label: $.i18n._( 'Accrual Policies' ),
id: 'AccrualPolicy',
destination: 'AccrualPolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_policy',
permission_result: PermissionManager.checkTopLevelPermission( 'AccrualPolicy' )
} );
this.addItem( {
label: $.i18n._( 'Absence Policies' ),
id: 'AbsencePolicy',
destination: 'AbsencePolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_policy',
permission_result: PermissionManager.checkTopLevelPermission( 'AbsencePolicy' )
} );
this.addItem( {
label: $.i18n._( 'Expense Policies' ),
id: 'ExpensePolicy',
destination: 'ExpensePolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_policy',
permission_result: PermissionManager.checkTopLevelPermission( 'ExpensePolicy' )
} );
this.addItem( {
label: $.i18n._( 'Holiday Policies' ),
id: 'HolidayPolicy',
destination: 'HolidayPolicy',
url_type: 'view',
parent_id: 'policy_menu',
sub_group_id: 'policy_policy',
permission_result: PermissionManager.checkTopLevelPermission( 'HolidayPolicy' )
} );
// Invoice group
this.addItem( {
label: $.i18n._( 'Invoice' ),
id: 'invoice_menu',
icon: 'tticon tticon-receipt_long_black_24dp'
} );
this.addItem( {
label: $.i18n._( 'Clients' ),
id: 'Client',
destination: 'Client',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_invoice',
permission_result: PermissionManager.checkTopLevelPermission( 'Client' )
} );
this.addItem( {
label: $.i18n._( 'Client Contacts' ),
id: 'ClientContact',
destination: 'ClientContact',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_invoice',
permission_result: PermissionManager.checkTopLevelPermission( 'ClientContact' )
} );
this.addItem( {
label: $.i18n._( 'Invoices' ),
id: 'Invoice',
destination: 'Invoice',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_invoice',
permission_result: PermissionManager.checkTopLevelPermission( 'Invoice' )
} );
this.addItem( {
label: $.i18n._( 'Transactions' ),
id: 'InvoiceTransaction',
destination: 'InvoiceTransaction',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_invoice',
permission_result: PermissionManager.checkTopLevelPermission( 'InvoiceTransaction' )
} );
this.addItem( {
label: $.i18n._( 'Payment Methods' ),
id: 'ClientPayment',
destination: 'ClientPayment',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_invoice',
permission_result: PermissionManager.checkTopLevelPermission( 'ClientPayment' )
} );
this.addItem( {
label: $.i18n._( 'Products' ),
id: 'Product',
destination: 'Product',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_invoice',
permission_result: PermissionManager.checkTopLevelPermission( 'Product' )
} );
this.addItem( {
label: $.i18n._( 'District' ),
id: 'InvoiceDistrict',
destination: 'InvoiceDistrict',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_invoice',
permission_result: PermissionManager.checkTopLevelPermission( 'InvoiceDistrict' )
} );
this.addItem( {
id: 'separator_invoice_1',
parent_id: 'invoice_menu',
separator: true,
} );
this.addItem( {
label: $.i18n._( 'Client Groups' ),
id: 'ClientGroup',
destination: 'ClientGroup',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_groups',
permission_result: PermissionManager.checkTopLevelPermission( 'Client' )
} );
this.addItem( {
label: $.i18n._( 'Product Groups' ),
id: 'ProductGroup',
destination: 'ProductGroup',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_groups',
permission_result: PermissionManager.checkTopLevelPermission( 'Product' )
} );
this.addItem( {
id: 'separator_invoice_2',
parent_id: 'invoice_menu',
separator: true,
} );
this.addItem( {
label: $.i18n._( 'Tax Policies' ),
id: 'TaxPolicy',
destination: 'TaxPolicy',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_policies',
permission_result: PermissionManager.checkTopLevelPermission( 'TaxPolicy' )
} );
this.addItem( {
label: $.i18n._( 'Shipping Policies' ),
id: 'ShippingPolicy',
destination: 'ShippingPolicy',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_policies',
permission_result: PermissionManager.checkTopLevelPermission( 'ShippingPolicy' )
} );
this.addItem( {
label: $.i18n._( 'Area Policies' ),
id: 'AreaPolicy',
destination: 'AreaPolicy',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_policies',
permission_result: PermissionManager.checkTopLevelPermission( 'AreaPolicy' )
} );
this.addItem( {
id: 'separator_invoice_3',
parent_id: 'invoice_menu',
separator: true,
} );
this.addItem( {
label: $.i18n._( 'Payment Gateway' ),
id: 'PaymentGateway',
destination: 'PaymentGateway',
url_type: 'view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_settings',
permission_result: PermissionManager.checkTopLevelPermission( 'PaymentGateway' )
} );
this.addItem( {
label: $.i18n._( 'Settings' ),
id: 'InvoiceConfig',
destination: 'InvoiceConfig',
url_type: 'sub_view',
parent_id: 'invoice_menu',
sub_group_id: 'invoice_settings',
permission_result: PermissionManager.checkTopLevelPermission( 'InvoiceConfig' )
} );
//HR Menu
this.addItem( {
label: $.i18n._( 'HR' ),
id: 'hr_menu',
icon: 'tticon tticon-business_center_black_24dp'
} );
//reviews Group Sub Menu
this.addItem( {
label: $.i18n._( 'Reviews' ),
id: 'UserReviewControl',
destination: 'UserReviewControl',
url_type: 'view',
parent_id: 'hr_menu',
sub_group_id: 'hr_reviews',
permission_result: PermissionManager.checkTopLevelPermission( 'UserReviewControl' )
} );
this.addItem( {
label: $.i18n._( 'KPI' ),
id: 'KPI',
destination: 'KPI',
url_type: 'view',
parent_id: 'hr_menu',
sub_group_id: 'hr_reviews',
permission_result: PermissionManager.checkTopLevelPermission( 'KPI' )
} );
this.addItem( {
label: $.i18n._( 'KPI Groups' ),
id: 'KPIGroup',
destination: 'KPIGroup',
url_type: 'view',
parent_id: 'hr_menu',
sub_group_id: 'hr_reviews',
permission_result: PermissionManager.checkTopLevelPermission( 'KPIGroup' )
} );
this.addItem( {
id: 'separator_hr_1',
parent_id: 'hr_menu',
separator: true,
} );
this.addItem( {
label: $.i18n._( 'Qualifications' ),
id: 'Qualification',
destination: 'Qualification',
url_type: 'view',
parent_id: 'hr_menu',
sub_group_id: 'hr_qualifications',
permission_result: PermissionManager.checkTopLevelPermission( 'Qualification' )
} );
this.addItem( {
label: $.i18n._( 'Qualification Groups' ),
id: 'QualificationGroup',
destination: 'QualificationGroup',
url_type: 'view',
parent_id: 'hr_menu',
sub_group_id: 'hr_qualifications',
permission_result: PermissionManager.checkTopLevelPermission( 'QualificationGroup' )
} );
this.addItem( {
label: $.i18n._( 'Skills' ),
id: 'UserSkill',
destination: 'UserSkill',
url_type: 'view',
parent_id: 'hr_menu',
sub_group_id: 'hr_qualifications',
permission_result: PermissionManager.checkTopLevelPermission( 'UserSkill' )
} );
this.addItem( {
label: $.i18n._( 'Education' ),
id: 'UserEducation',
destination: 'UserEducation',
url_type: 'view',
parent_id: 'hr_menu',
sub_group_id: 'hr_qualifications',
permission_result: PermissionManager.checkTopLevelPermission( 'UserEducation' )
} );
this.addItem( {
label: $.i18n._( 'Memberships' ),
id: 'UserMembership',
destination: 'UserMembership',
url_type: 'view',
parent_id: 'hr_menu',
sub_group_id: 'hr_qualifications',
permission_result: PermissionManager.checkTopLevelPermission( 'UserMembership' )
} );
this.addItem( {
label: $.i18n._( 'Licenses' ),
id: 'UserLicense',
destination: 'UserLicense',
url_type: 'view',
parent_id: 'hr_menu',
sub_group_id: 'hr_qualifications',
permission_result: PermissionManager.checkTopLevelPermission( 'UserLicense' )
} );
this.addItem( {
label: $.i18n._( 'Languages' ),
id: 'UserLanguage',
destination: 'UserLanguage',
url_type: 'view',
parent_id: 'hr_menu',
sub_group_id: 'hr_qualifications',
permission_result: PermissionManager.checkTopLevelPermission( 'UserLanguage' )
} );
this.addItem( {
label: $.i18n._( 'Recruitment' ),
id: 'recruitment_menu',
icon: 'tticon tticon-switch_account_black_24dp'
} );
this.addItem( {
label: $.i18n._( 'Job Vacancies' ),
id: 'JobVacancy',
destination: 'JobVacancy',
url_type: 'view',
parent_id: 'recruitment_menu',
sub_group_id: 'hr_recruitment',
permission_result: PermissionManager.checkTopLevelPermission( 'JobVacancy' )
} );
this.addItem( {
label: $.i18n._( 'Job Applicants' ),
id: 'JobApplicant',
destination: 'JobApplicant',
url_type: 'view',
parent_id: 'recruitment_menu',
sub_group_id: 'hr_recruitment',
permission_result: PermissionManager.checkTopLevelPermission( 'JobApplicant' )
} );
this.addItem( {
label: $.i18n._( 'Job Applications' ),
id: 'JobApplication',
destination: 'JobApplication',
url_type: 'view',
parent_id: 'recruitment_menu',
sub_group_id: 'hr_recruitment',
permission_result: PermissionManager.checkTopLevelPermission( 'JobApplication' )
} );
this.addItem( {
label: $.i18n._( 'Portal Settings' ),
id: 'RecruitmentPortalConfig',
destination: 'RecruitmentPortalConfig',
url_type: 'sub_view',
parent_id: 'recruitment_menu',
sub_group_id: 'hr_recruitment',
permission_result: PermissionManager.checkTopLevelPermission( 'JobApplicant' )
} );
// TODO: Above is done - next: Documents
this.addItem( {
label: $.i18n._( 'Document' ),
id: 'document_menu',
icon: 'tticon tticon-feed_black_24dp'
} );
this.addItem( {
label: $.i18n._( 'Documents' ),
id: 'Document',
destination: 'Document',
url_type: 'view',
parent_id: 'document_menu',
sub_group_id: 'documentsGroup',
permission_result: PermissionManager.checkTopLevelPermission( 'Document' )
} );
this.addItem( {
label: $.i18n._( 'Document Groups' ),
id: 'DocumentGroup',
destination: 'DocumentGroup',
url_type: 'view',
parent_id: 'document_menu',
sub_group_id: 'documentsGroup',
permission_result: PermissionManager.checkTopLevelPermission( 'DocumentGroup' )
} );
// TODO: Above is done - next: Reports
//Reports
this.addItem( {
label: $.i18n._( 'Report' ),
id: 'report_menu',
icon: 'tticon tticon-show_chart_black_24dp'
} );
this.addItem( {
label: $.i18n._( 'Saved Reports' ),
id: 'report_saved_reports',
destination: 'SavedReport',
url_type: 'view',
tt_link: {
type: 'view' // the legacy 'saved reports' triggered the closeEditViews, setSelectSubMenu and openSelectView. Same as the wizard code in parseTTLink etc. Which is currently triggered by 'view'
},
parent_id: 'report_menu',
permission_result: PermissionManager.checkTopLevelPermission( 'SavedReport' )
} );
this.addItem( {
id: 'separator_report_saved_reports_1',
parent_id: 'report_menu',
separator: true,
} );
/**************************************************/
this.addItem( {
label: $.i18n._( 'Employee Reports' ),
id: 'report_employee_reports',
parent_id: 'report_menu',
} );
this.addItem( {
label: $.i18n._( 'Whos In Summary' ),
id: 'ActiveShiftReport',
destination: 'ActiveShiftReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_employee_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'ActiveShiftReport' )
} );
this.addItem( {
label: $.i18n._( 'Employee Information' ),
id: 'UserSummaryReport',
destination: 'UserSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_employee_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'UserSummaryReport' )
} );
this.addItem( {
label: $.i18n._( 'Audit Trail' ),
id: 'AuditTrailReport',
destination: 'AuditTrailReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_employee_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'AuditTrailReport' )
} );
/**************************************************/
this.addItem( {
label: $.i18n._( 'TimeSheet Reports' ),
id: 'report_timesheet_reports',
parent_id: 'report_menu',
} );
this.addItem( {
label: $.i18n._( 'Schedule Summary' ),
id: 'ScheduleSummaryReport',
destination: 'ScheduleSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_timesheet_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'ScheduleSummaryReport' )
} );
this.addItem( {
label: $.i18n._( 'TimeSheet Summary' ),
id: 'TimesheetSummaryReport',
destination: 'TimesheetSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_timesheet_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'TimesheetSummaryReport' )
} );
this.addItem( {
label: $.i18n._( 'TimeSheet Detail' ),
id: 'TimesheetDetailReport',
destination: 'TimesheetDetailReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_timesheet_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'TimesheetDetailReport' )
} );
this.addItem( {
label: $.i18n._( 'Punch Summary' ),
id: 'PunchSummaryReport',
destination: 'PunchSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_timesheet_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'PunchSummaryReport' )
} );
this.addItem( {
label: $.i18n._( 'Accrual Balance Summary' ),
id: 'AccrualBalanceSummaryReport',
destination: 'AccrualBalanceSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_timesheet_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'AccrualBalanceSummaryReport' )
} );
this.addItem( {
label: $.i18n._( 'Exception Summary' ),
id: 'ExceptionSummaryReport',
destination: 'ExceptionSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_timesheet_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'ExceptionSummaryReport' )
} );
/**************************************************/
this.addItem( {
label: $.i18n._( 'Payroll Reports' ),
id: 'report_payroll_reports',
parent_id: 'report_menu',
} );
this.addItem( {
label: $.i18n._( 'Pay Stub Summary' ),
id: 'PayStubSummaryReport',
destination: 'PayStubSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_payroll_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'PayStubSummaryReport' )
} );
this.addItem( {
label: $.i18n._( 'Pay Stub Transaction Summary' ),
id: 'PayStubTransactionSummaryReport',
destination: 'PayStubTransactionSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_payroll_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'PayStubSummaryReport' )
} );
this.addItem( {
label: $.i18n._( 'Payroll Export' ),
id: 'PayrollExportReport',
destination: 'PayrollExportReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_payroll_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'PayrollExportReport' )
} );
this.addItem( {
label: $.i18n._( 'General Ledger Summary' ),
id: 'GeneralLedgerSummaryReport',
destination: 'GeneralLedgerSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_payroll_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'GeneralLedgerSummaryReport' )
} );
this.addItem( {
label: $.i18n._( 'Expense Summary' ),
id: 'ExpenseSummaryReport',
destination: 'ExpenseSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_payroll_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'ExpenseSummaryReport' )
} );
/**************************************************/
this.addItem( {
label: $.i18n._( 'Job Tracking Reports' ),
id: 'report_job_tracking_reports',
parent_id: 'report_menu',
} );
this.addItem( {
label: $.i18n._( 'Job Summary' ),
id: 'JobSummaryReport',
destination: 'JobSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_job_tracking_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'JobSummaryReport' )
} );
this.addItem( {
label: $.i18n._( 'Job Analysis' ),
id: 'JobAnalysisReport',
destination: 'JobAnalysisReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_job_tracking_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'JobAnalysisReport' )
} );
this.addItem( {
label: $.i18n._( 'Job Information' ),
id: 'JobInformationReport',
destination: 'JobInformationReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_job_tracking_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'JobInformationReport' )
} );
this.addItem( {
label: $.i18n._( 'Task Information' ),
id: 'JobItemInformationReport',
destination: 'JobItemInformationReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_job_tracking_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'JobItemInformationReport' )
} );
/**************************************************/
this.addItem( {
label: $.i18n._( 'Invoice Reports' ),
id: 'report_invoice_reports',
parent_id: 'report_menu',
} );
this.addItem( {
label: $.i18n._( 'Transaction Summary' ),
id: 'InvoiceTransactionSummaryReport',
destination: 'InvoiceTransactionSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_invoice_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'InvoiceTransactionSummaryReport' )
} );
/**************************************************/
this.addItem( {
label: $.i18n._( 'Tax Reports' ),
id: 'report_tax_reports',
parent_id: 'report_menu',
} );
this.addItem( {
label: $.i18n._( 'Tax Summary (Generic)' ),
id: 'TaxSummaryReport',
destination: 'TaxSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_tax_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'TaxSummaryReport' )
} );
this.addItem( {
id: 'separator_report_tax_reports_1',
parent_id: 'report_tax_reports',
separator: true,
} );
this.addItem( {
label: $.i18n._( 'Remittance Summary' ),
id: 'RemittanceSummaryReport',
destination: 'RemittanceSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_tax_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'RemittanceSummaryReport' )
} );
this.addItem( {
label: $.i18n._( 'T4 Summary' ),
id: 'T4SummaryReport',
destination: 'T4SummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_tax_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'T4SummaryReport' )
} );
this.addItem( {
label: $.i18n._( 'T4A Summary' ),
id: 'T4ASummaryReport',
destination: 'T4ASummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_tax_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'T4ASummaryReport' )
} );
this.addItem( {
id: 'separator_report_tax_reports_2',
parent_id: 'report_tax_reports',
separator: true,
permission_result: ( PermissionManager.checkTopLevelPermission( 'RemittanceSummaryReport' ) && PermissionManager.checkTopLevelPermission( 'Form941Report' ) ) //Only show the 2nd separator if Canada and US tax forms are displayed too. Otherwise the separator is doubled up.
} );
this.addItem( {
label: $.i18n._( 'US State Unemployment' ),
id: 'USStateUnemploymentReport',
destination: 'USStateUnemploymentReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_tax_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'USStateUnemploymentReport' )
} );
this.addItem( {
label: $.i18n._( 'Form 941' ),
id: 'Form941Report',
destination: 'Form941Report',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_tax_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'Form941Report' )
} );
this.addItem( {
label: $.i18n._( 'Form 940' ),
id: 'Form940Report',
destination: 'Form940Report',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_tax_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'Form940Report' )
} );
this.addItem( {
label: $.i18n._( 'Form 1099-NEC' ),
id: 'Form1099NecReport',
destination: 'Form1099NecReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_tax_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'Form1099NecReport' )
} );
this.addItem( {
label: $.i18n._( 'Form W2/W3' ),
id: 'FormW2Report',
destination: 'FormW2Report',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_tax_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'FormW2Report' )
} );
this.addItem( {
label: $.i18n._( 'Affordable Care' ),
id: 'AffordableCareReport',
destination: 'AffordableCareReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_tax_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'AffordableCareReport' )
} );
/**************************************************/
this.addItem( {
label: $.i18n._( 'HR Reports' ),
id: 'report_hr_reports',
parent_id: 'report_menu',
} );
this.addItem( {
label: $.i18n._( 'Qualification Summary' ),
id: 'UserQualificationReport',
destination: 'UserQualificationReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_hr_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'UserQualificationReport' )
} );
this.addItem( {
label: $.i18n._( 'Review Summary' ),
id: 'KPIReport',
destination: 'KPIReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_hr_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'KPIReport' )
} );
this.addItem( {
label: $.i18n._( 'Recruitment Summary' ),
id: 'UserRecruitmentSummaryReport',
destination: 'UserRecruitmentSummaryReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_hr_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'UserRecruitmentSummaryReport' )
} );
this.addItem( {
label: $.i18n._( 'Recruitment Detail' ),
id: 'UserRecruitmentDetailReport',
destination: 'UserRecruitmentDetailReport',
url_type: 'sub_view',
tt_link: {
type: 'report'
},
parent_id: 'report_hr_reports',
permission_result: PermissionManager.checkTopLevelPermission( 'UserRecruitmentDetailReport' )
} );
/**************************************************/
// End of reports
/**************************************************/
//My Account group
this.addItem( {
label: $.i18n._( 'My Account' ),
id: 'my_account_menu',
icon: 'tticon tticon-person_black_24dp',
hide_in_main_menu: true,
} );
// this.addItem( {
// label: $.i18n._( 'Notifications' ),
// id: 'notification',
// destination: 'Notification',
// parent_id: 'my_account_menu',
// sub_group_id: 'myAccountGroup',
// hide_in_main_menu: true,
// permission_result: true, // Notification always returns true as notifications should always be enabled.
// } );
this.addItem( {
label: $.i18n._( 'Messages' ),
id: 'message',
destination: 'MessageControl',
url_type: 'view',
parent_id: 'my_account_menu',
sub_group_id: 'myAccountGroup',
hide_in_main_menu: true,
permission_result: PermissionManager.checkTopLevelPermission( 'MessageControl' )
} );
this.addItem( {
label: $.i18n._( 'Requests' ),
id: 'request',
destination: 'Request',
url_type: 'view',
parent_id: 'my_account_menu',
sub_group_id: 'myAccountGroup',
hide_in_main_menu: true,
permission_result: PermissionManager.checkTopLevelPermission( 'Request' )
} );
this.addItem( {
label: $.i18n._( 'Expenses' ),
id: 'LoginUserExpense',
destination: 'LoginUserExpense',
url_type: 'view',
parent_id: 'my_account_menu',
sub_group_id: 'myAccountGroup',
hide_in_main_menu: true,
permission_result: PermissionManager.checkTopLevelPermission( 'LoginUserExpense' )
} );
/**************************************************/
this.addItem( {
id: 'separator_my_account_1',
parent_id: 'my_account_menu',
separator: true,
} );
this.addItem( {
label: $.i18n._( 'Request Authorizations' ),
id: 'request_authorization',
destination: 'RequestAuthorization',
url_type: 'view',
parent_id: 'my_account_menu',
sub_group_id: 'authorization',
hide_in_main_menu: true,
permission_result: PermissionManager.checkTopLevelPermission( 'RequestAuthorization' )
} );
this.addItem( {
label: $.i18n._( 'TimeSheet Authorizations' ),
id: 'timesheet_authorization',
destination: 'TimeSheetAuthorization',
url_type: 'view',
parent_id: 'my_account_menu',
sub_group_id: 'authorization',
hide_in_main_menu: true,
permission_result: PermissionManager.checkTopLevelPermission( 'TimeSheetAuthorization' )
} );
this.addItem( {
label: $.i18n._( 'Expense Authorizations' ),
id: 'expense_authorization',
destination: 'ExpenseAuthorization',
url_type: 'view',
parent_id: 'my_account_menu',
sub_group_id: 'authorization',
hide_in_main_menu: true,
permission_result: PermissionManager.checkTopLevelPermission( 'ExpenseAuthorization' )
} );
/**************************************************/
this.addItem( {
id: 'separator_my_account_2',
parent_id: 'my_account_menu',
separator: true,
} );
this.addItem( {
label: $.i18n._( 'Preferences' ),
id: 'LoginUserPreference',
destination: 'LoginUserPreference',
url_type: 'sub_view',
parent_id: 'my_account_menu',
sub_group_id: 'myAccountGroup',
hide_in_main_menu: true,
permission_result: PermissionManager.checkTopLevelPermission( 'LoginUserPreference' )
} );
this.addItem( {
label: $.i18n._( 'Contact Information' ),
id: 'LoginUserContact',
destination: 'LoginUserContact',
url_type: 'sub_view',
parent_id: 'my_account_menu',
sub_group_id: 'myAccountGroup',
hide_in_main_menu: true,
permission_result: PermissionManager.checkTopLevelPermission( 'LoginUserContact' )
} );
this.addItem( {
label: $.i18n._( 'Passwords / Security' ),
id: 'ChangePassword',
destination: 'ChangePassword',
url_type: 'sub_view',
parent_id: 'my_account_menu',
sub_group_id: 'securityGroup',
hide_in_main_menu: true,
permission_result: PermissionManager.checkTopLevelPermission( 'ChangePassword' )
} );
/**************************************************/
this.addItem( {
id: 'separator_my_account_4',
parent_id: 'my_account_menu',
separator: true,
} );
this.addItem( {
label: $.i18n._( 'Logout' ),
id: 'Logout',
icon: 'tticon tticon-logout_black_24dp',
destination: 'Logout',
parent_id: 'my_account_menu',
sub_group_id: 'logoutGroup',
hide_in_main_menu: true,
permission_result: true,
} );
//Help group
this.addItem( {
label: $.i18n._( 'Help' ),
id: 'help_menu',
icon: 'tticon tticon-help_center_black_24dp',
permission_result: true,
hide_in_main_menu: true,
} );
this.addItem( {
label: $.i18n._( 'Administrator Guide' ),
id: 'AdminGuide',
destination: 'AdminGuide',
tt_link: {
type: 'view_no_close'
},
parent_id: 'help_menu',
sub_group_id: 'help_group',
permission_result: PermissionManager.HelpMenuValidateAdmin(),
hide_in_main_menu: true,
} );
this.addItem( {
label: $.i18n._( 'Supervisor Guide' ),
id: 'SupervisorGuide',
destination: 'SupervisorGuide',
tt_link: {
type: 'view_no_close'
},
parent_id: 'help_menu',
sub_group_id: 'help_group',
permission_result: PermissionManager.HelpMenuValidateSupervisor(),
hide_in_main_menu: true,
} );
this.addItem( {
label: $.i18n._( 'Employee Guide' ),
id: 'EmployeeGuide',
destination: 'EmployeeGuide',
tt_link: {
type: 'view_no_close'
},
parent_id: 'help_menu',
sub_group_id: 'help_group',
permission_result: true,
hide_in_main_menu: true,
} );
//Only display one "FAQ" entry for the highest permission level they have. This keeps the menu a little smaller and less confusing.
this.addItem( {
label: $.i18n._( 'FAQs' ),
id: 'AdminFAQS',
destination: 'AdminFAQS',
tt_link: {
type: 'view_no_close'
},
parent_id: 'help_menu',
sub_group_id: 'help_group',
permission_result: PermissionManager.HelpMenuValidateAdmin(),
hide_in_main_menu: true,
} );
this.addItem( {
label: $.i18n._( 'FAQs' ), //Supervisor FAQ
id: 'SupervisorFAQS',
destination: 'SupervisorFAQS',
tt_link: {
type: 'view_no_close'
},
parent_id: 'help_menu',
sub_group_id: 'help_group',
permission_result: ( PermissionManager.HelpMenuValidateSupervisor() && !PermissionManager.HelpMenuValidateAdmin() ), //Supervisor FAQ
hide_in_main_menu: true,
} );
this.addItem( {
label: $.i18n._( 'FAQs' ), //Employee FAQ
id: 'EmployeeFAQS',
destination: 'EmployeeFAQS',
tt_link: {
type: 'view_no_close'
},
parent_id: 'help_menu',
sub_group_id: 'help_group',
permission_result: ( !PermissionManager.HelpMenuValidateSupervisor() && !PermissionManager.HelpMenuValidateAdmin() ), //Employee FAQ
hide_in_main_menu: true,
} );
this.addItem( {
label: $.i18n._( 'Chat w/Support' ),
id: 'LiveChat',
destination: 'LiveChat',
tt_link: {
type: 'view_no_close'
},
parent_id: 'help_menu',
sub_group_id: 'help_group',
permission_result: ( ( PermissionManager.HelpMenuValidateAdmin() || PermissionManager.HelpMenuValidateSupervisor() ) && Global.getFeatureFlag( 'support_chat' ) == true && APIGlobal.pre_login_data.demo_mode === false && Global.getProductEdition() >= 15 ),
hide_in_main_menu: true,
} );
this.addItem( {
label: ( Global.getProductEdition() >= 15 ) ? $.i18n._( 'Email Support' ) : $.i18n._( 'Community Forums' ),
id: 'EmailHelp',
destination: 'EmailHelp',
tt_link: {
type: 'view_no_close'
},
parent_id: 'help_menu',
sub_group_id: 'help_group',
permission_result: ( ( PermissionManager.HelpMenuValidateAdmin() || PermissionManager.HelpMenuValidateSupervisor() ) && ( Global.getProductEdition() == 10 || APIGlobal.pre_login_data.support_email != '' ) ),
hide_in_main_menu: true,
} );
this.addItem( {
label: $.i18n._( 'Screen Share Download' ),
id: 'ScreenSharing',
destination: 'ScreenSharing',
tt_link: {
type: 'view_no_close'
},
parent_id: 'help_menu',
sub_group_id: 'help_group',
permission_result: ( ( PermissionManager.HelpMenuValidateAdmin() || PermissionManager.HelpMenuValidateSupervisor() ) && Global.getFeatureFlag( 'support_chat' ) == true && APIGlobal.pre_login_data.demo_mode === false && Global.getProductEdition() >= 15 ),
hide_in_main_menu: true,
} );
this.addItem( {
label: $.i18n._( 'Testing Sandbox' ),
id: 'Sandbox',
destination: 'Sandbox',
parent_id: 'help_menu',
sub_group_id: 'help_group',
permission_result: ( PermissionManager.HelpMenuValidateAdmin() && Global.getProductEdition() >= 15 && APIGlobal.pre_login_data['sandbox_url'] && APIGlobal.pre_login_data['sandbox_url'] != false && APIGlobal.pre_login_data['sandbox_url'].length > 0 && !APIGlobal.pre_login_data['sandbox'] ),
hide_in_main_menu: true,
} );
this.addItem( {
label: $.i18n._( 'What\'s New' ),
id: 'WhatsNew',
destination: 'WhatsNew',
tt_link: {
type: 'view_no_close'
},
parent_id: 'help_menu',
sub_group_id: 'help_group',
permission_result: ( PermissionManager.HelpMenuValidateAdmin() || PermissionManager.HelpMenuValidateSupervisor() ),
hide_in_main_menu: true,
} );
this.addItem( {
label: $.i18n._( 'About' ),
id: 'About',
destination: 'About',
parent_id: 'help_menu',
sub_group_id: 'help_group',
permission_result: PermissionManager.HelpMenuValidateAdmin(),
hide_in_main_menu: true,
} );
//UI Tests
this.addItem( {
label: $.i18n._( 'UIKit Sample' ),
id: 'ui_kit',
icon: 'tticon tticon-verified_black_24dp',
permission_result: APIGlobal.pre_login_data && APIGlobal.pre_login_data.production == false && Global.UNIT_TEST_MODE == true
} );
this.addItem( {
label: $.i18n._( 'Sample List' ),
id: 'sample_list',
destination: 'UIKitSample',
parent_id: 'ui_kit',
sub_group_id: 'ui_kit',
permission_result: true, //Will not show unless parent is shown.
} );
// Once all menu items added to this.menu_items in raw format, then convert to PrimeVue format.
this.convertMenuItemsToPrimeVueFormat();
// Once menu data is generated, update the profile menu with the items for the 'My Account' sub menu.
this.event_bus.emit( 'tt_topbar','profile_menu_data', {
// Extract the my account menu data and pass it to profile menu.
profile_menu_data: this.menu_items
.find( ( item ) => item.id === 'my_account_menu' ).items
} );
//Not all employees can view help menu, so make sure items exist before attempting to send to tttopbar.
let help_menu = this.menu_items.find( ( item ) => item.id === 'help_menu' );
if ( help_menu ) {
this.event_bus.emit( 'tt_topbar', 'help_menu_data', {
// Extract the help menu data and pass it to the topbar help icon.
help_menu_data: help_menu.items
} );
}
}
//TODO: Jeremy -> Temporarily put the following code here that was originally in ribbonViewController and other files.
//Do we want to export a MenuManager instance? (Currently exporting)
//Have these functions be static?
//Have them in another file?
//The functions in question are - openSelectView(), goToView(), isCurrentView(), doLogout(), setCompanyLogo().
//Replace this switch statement with something else?
openSelectView( name ) {
var $this = this;
Global.setUINotready();
switch ( name ) {
case 'ImportCSV':
IndexViewController.openWizard( 'ImportCSVWizard', null, function() {
//Error: TypeError: LocalCacheData.current_open_primary_controller.search is not a function in interface/html5/framework/jquery.min.js?v=9.0.0-20151016-110437 line 2 > eval line 248
if ( LocalCacheData.current_open_primary_controller && typeof LocalCacheData.current_open_primary_controller.search === 'function' ) {
LocalCacheData.current_open_primary_controller.search();
}
} );
break;
case 'QuickStartWizard':
if ( PermissionManager.checkTopLevelPermission( 'QuickStartWizard' ) ) {
IndexViewController.openWizard( 'QuickStartWizard' );
}
break;
case 'UserDefault':
//Community editions can only have 1 new hire default. For those editions do not show the list view.
if ( Global.getProductEdition() > 10 ) {
defaultCase( name );
break;
}
//Fall through to below cases.
case 'InOut':
case 'Company':
case 'LoginUserContact':
case 'LoginUserPreference':
case 'ChangePassword':
case 'InvoiceConfig':
case 'RecruitmentPortalConfig':
case 'About':
if ( LocalCacheData.current_open_edit_only_controller && LocalCacheData.current_open_edit_only_controller.viewId == name ) { //#2557 - A - Ensure that opening edit only views on top of same edit only view just resets the edit menu
LocalCacheData.current_open_edit_only_controller.setEditMenu();
} else if ( LocalCacheData.current_open_edit_only_controller ) { //#2557 - B - Ensure that opening edit only views on top of different edit only view sets the parent to the existing edit only view
IndexViewController.openEditView( LocalCacheData.current_open_edit_only_controller, name );
} else {
IndexViewController.openEditView( LocalCacheData.current_open_primary_controller, name ); //#2557 - C - Ensure that opening edit views as normal works as before
}
break;
case 'Logout':
this.doLogout();
break;
case 'AdminGuide':
var url = 'https://www.timetrex.com/h?id=admin_guide&v=' + LocalCacheData.getLoginData().application_version + '&e=' + Global.getProductEdition();
window.open( url, '_blank' );
break;
case 'SupervisorGuide':
var url = 'https://www.timetrex.com/h?id=supervisor_guide&v=' + LocalCacheData.getLoginData().application_version + '&e=' + Global.getProductEdition();
window.open( url, '_blank' );
break;
case 'EmployeeGuide':
var url = 'https://www.timetrex.com/h?id=employee_guide&v=' + LocalCacheData.getLoginData().application_version + '&e=' + Global.getProductEdition();
window.open( url, '_blank' );
break;
case 'AdminFAQS':
url = 'https://www.timetrex.com/h?id=admin_faq&v=' + LocalCacheData.getLoginData().application_version + '&e=' + Global.getProductEdition();
window.open( url, '_blank' );
break;
case 'SupervisorFAQS':
url = 'https://www.timetrex.com/h?id=supervisor_faq&v=' + LocalCacheData.getLoginData().application_version + '&e=' + Global.getProductEdition();
window.open( url, '_blank' );
break;
case 'EmployeeFAQS':
url = 'https://www.timetrex.com/h?id=employee_faq&v=' + LocalCacheData.getLoginData().application_version + '&e=' + Global.getProductEdition();
window.open( url, '_blank' );
break;
case 'WhatsNew':
url = 'https://www.timetrex.com/h?id=changelog&v=' + LocalCacheData.getLoginData().application_version + '&e=' + Global.getProductEdition();
window.open( url, '_blank' );
break;
case 'EmailHelp':
if ( Global.getProductEdition() >= 15 ) {
location.href = 'mailto:' + APIGlobal.pre_login_data.support_email + '?subject=Company: ' + LocalCacheData.getCurrentCompany().name + '&body=Company: ' + LocalCacheData.getCurrentCompany().name + ' ' + 'Registration Key: ' + LocalCacheData.getLoginData().registration_key;
} else {
url = 'https://www.timetrex.com/r?id=29';
window.open( url, '_blank' );
}
break;
case 'LiveChat':
if ( APIGlobal.pre_login_data.demo_mode === false && Global.getProductEdition() >= 15 ) {
var current_user = LocalCacheData.getLoginUser();
IndexViewController.testInternetConnection();
if ( PermissionManager.getPermissionLevel() > 40 ) { //40=Supervisor (Subordinates Only)
var check_connection_timer = setInterval( function() {
if ( !is_testing_internet_connection ) {
clearInterval( check_connection_timer );
if ( internet_connection_available && current_user ) {
import(/* webpackChunkName: "live-chat" */'@/global/widgets/live-chat/live-chat' )
.then(function( module ) {
window.LHCChatOptions = module.LHCChatOptions;
window.openSupportChat = module.openSupportChat;
window.openSupportChat();
} ).catch( Global.importErrorHandler );
}
} else {
TAlertManager.showAlert( $.i18n._( 'No internet connection found. Cannot use live chat support.' ), $.i18n._( 'Live Chat Support' ) );
}
}, 500 );
}
}
break;
case 'ScreenSharing':
url = 'https://www.timetrex.com/r.php?id=quicksupport&v=' + LocalCacheData.getLoginData().application_version + '&e=' + Global.getProductEdition();
window.open( url, '_blank' );
break;
case 'Sandbox':
if ( APIGlobal.pre_login_data['sandbox_url'] && APIGlobal.pre_login_data['sandbox_url'].length > 0 ) {
var user = LocalCacheData.getLoginUser();
Global.NewSession( user.user_name, 'SANDBOX', true );
}
break;
case 'ProcessPayrollWizard':
IndexViewController.openWizard( 'ProcessPayrollWizard', null, function() {
//Error: TypeError: LocalCacheData.current_open_primary_controller.search is not a function in interface/html5/framework/jquery.min.js?v=9.0.0-20151016-110437 line 2 > eval line 248
if ( LocalCacheData.current_open_primary_controller && typeof LocalCacheData.current_open_primary_controller.search === 'function' ) {
LocalCacheData.current_open_primary_controller.search();
}
} );
break;
case 'PayrollRemittanceAgencyEventWizardController':
IndexViewController.openWizardController( 'PayrollRemittanceAgencyEventWizardController', null, function() {
//Error: TypeError: LocalCacheData.current_open_primary_controller.search is not a function in interface/html5/framework/jquery.min.js?v=9.0.0-20151016-110437 line 2 > eval line 248
if ( LocalCacheData.current_open_primary_controller && typeof LocalCacheData.current_open_primary_controller.search === 'function' ) {
LocalCacheData.current_open_primary_controller.search();
}
} );
break;
case 'ProcessTransactionsWizard':
IndexViewController.openWizardController( 'ProcessTransactionsWizard', null, function() {
//Error: TypeError: LocalCacheData.current_open_primary_controller.search is not a function in interface/html5/framework/jquery.min.js?v=9.0.0-20151016-110437 line 2 > eval line 248
if ( LocalCacheData.current_open_primary_controller && typeof LocalCacheData.current_open_primary_controller.search === 'function' ) {
LocalCacheData.current_open_primary_controller.search();
}
} );
break;
case 'LegalEntity':
if ( Global.getProductEdition() >= 15 ) {
defaultCase( name );
} else {
IndexViewController.openEditView( LocalCacheData.current_open_primary_controller, name, false );
}
break;
default:
defaultCase( name );
break;
}
//To mitigate duplicate code the default case has been made into it's own function.
//Some cases have multiple pathways. Such as a view that uses a list view or an edit only view.
function defaultCase( name ) {
//#2557 - When opening a view from the submenus, ensure that similarily named edit only views are cancelled (with confirm) first.
if ( LocalCacheData.current_open_edit_only_controller && LocalCacheData.current_open_edit_only_controller.viewId == name ) {
LocalCacheData.current_open_edit_only_controller.onCancelClick();
TTPromise.wait( 'base', 'onCancelClick', function() {
$this.goToView( name );
}.bind( $this ) );
} else {
$this.goToView( name );
}
}
}
goToView( subMenuId, force_refresh ) {
if ( this.isCurrentView( subMenuId ) && force_refresh ) {
IndexViewController.instance.router.reloadView( subMenuId );
} else {
deleteCookie( 'OverrideUserPreference' ); //TimeSheet view has ability to override user preferences for using the employees timezone, make sure we clear this everytime we go to another view.
//#2157 - needed for selenium screenshot test to prevent hanging on
//various combinations of ribbon and topmenu clicks that are not a change to the hash
// Check that we aren't trying to redirect back to the login screen, causing an infinite loop on logout in some cases.
if ( subMenuId != 'Login' && location.hash == ( '#!m=' + subMenuId ) ) {
TTPromise.wait();
//TODO: Replace this jQuery selector.
$( '#refreshBtn:visible' ).click();
}
Global.setURLToBrowser( Global.getBaseURL() + '#!m=' + subMenuId );
}
}
isCurrentView( subMenuId ) {
var sub_menu_id_url = Global.getBaseURL() + '#!m=' + subMenuId;
Debug.Text( 'URL: Current: ' + window.location.href + ' Switching To: ' + sub_menu_id_url, 'MenuManager.js', 'MenuManager', 'isCurrentView', 10 );
//window.location.href.indexOf( sub_menu_id_url ) == 0 doesn't work here, as .../html5/#!m=PayStub matches when on .../html5/#!m=PayStubTransaction view.
//So instead use a RegEx to match the end of the string, or a & in case there are more URL arguments.
var regex_pattern = sub_menu_id_url.replace( /[-\/\\^$*+?.()|[\]{}]/g, '\\$&' ) + '(&.*)?$'; //replace() escapes the URL chars.
if ( window.location.href.match( regex_pattern ) !== null ) {
return true;
}
return false;
}
doLogout() {
this.event_bus.emit( 'app_menu', 'set_active_index', {
index: null
} );
//Don't wait for result of logout in case of slow or disconnected internet. Just clear local cookies and move on.
var current_user_api = TTAPI.APIAuthentication;
if ( typeof current_user_api.Logout !== 'undefined' ) { //Fix JS exception: Uncaught TypeError: current_user_api.Logout is not a function -- Which can occur when offline and clicking Logout.
current_user_api.Logout( {
onResult() {
}
} );
}
Global.setAnalyticDimensions();
//A bare "if" wrapped around lh_inst doesn't work here for some reason.
if ( typeof ( lh_inst ) != 'undefined' ) {
//stop the update loop for live chat with support
clearTimeout( lh_inst.timeoutStatuscheck );
}
Global.Logout();
this.goToView( 'Login' );
TAlertManager.showBrowserTopBanner();
}
}
export default new MenuManager()
export {
MenuManager
}
/**
* A menu item in TimeTrex format. Will contain PrimeVue and TT attributes.
* @property {string} label - Item label
* @property {string} id - Unique menu item reference to use in automated testing.
* @property {string} [parent_id] - ID of the parent group for the item.
* @property {string} [sub_group_id] - legacy id of the ribbon menu groupings. Could be used to decide when a line needs to be placed between nav items.
* @property {string} [destination] - Destination for router when link is clicked.
* @property {boolean} [permission_result] - Decides if a user has access to this icon. Normally controlled by PermissionManager.checkTopLevelPermission()
* @property {TTMenuLink} [tt_link] - Object containing link info.
* @property {TTMenuItem[]} [items] - Array of further sub-menu items.
*/
class TTMenuItem {
constructor( options ) {
if( options && options.destination ) {
// Set default link handling logic if a destination is provided.
options.tt_link = options.tt_link || {};
_.defaults( options.tt_link, {
// destination is required, no default.
type: 'view', // view, wizard, report
target: 'main' // main, left, right, footer, popup
} );
}
Object.keys( options ).forEach( ( key ) => {
this[key] = options[key];
} );
return this;
}
parseTTLink() {
if( !this.destination || !this.tt_link.type || !this.tt_link.target ) {
Debug.Error( 'Unable to parse TTLink without all parameters.', 'MenuManager.js', 'MenuManager', 'convertMenuItemsToPrimeVueFormat', 2 );
return false;
}
switch ( this.tt_link.type ) {
case 'view':
Object.assign( this, this.parseViewLink( this.destination, true ) );
break;
case 'view_no_close':
//Certain links such as "What's New", "Email Support" etc should not close edit views as they do not open new views.
//Kept "view" in type name to be consistent as these types of links have always gone through "openSelectView()"
//But we can rename to something else in future if we break up the "openSelectView()" function.
Object.assign( this, this.parseViewLink( this.destination, false ) );
break;
case 'report':
Object.assign( this, this.parseReportLink( this.destination ) );
break;
default:
}
return true;
}
/* For the different views, reference the following:
* RibbonViewController.onSubMenuNavClick
* RibbonViewController.setSelectSubMenu // might not need this. Is this related to just highlighting the currently clicked menu? Might be a simpler way to do it in vue.
* RibbonViewController.openSelectView // theres lots of intricate logic here. Re-visit and check what we need here.
*
*/
// Add all the various routing type parsers here.
parseViewLink( destination, close_view ) {
return {
command: () => {
if ( close_view ) {
//TODO: After we decide on where openSelectView() should exist. Stop using temp _main_menu variable.
Global.closeEditViews( function() {
_main_menu.openSelectView( destination );
} );
} else {
//Certain links such as "What's new", "Email Support" etc should not close edit views as they do not open new views.
_main_menu.openSelectView( destination );
}
}
};
}
parseReportLink( destination ) {
return {
command: () => {
Global.closeEditViews( function() {
if ( destination === 'AffordableCareReport' && !( Global.getProductEdition() >= 15 ) ) {
TAlertManager.showAlert( Global.getUpgradeMessage() );
} else {
var parent_view = LocalCacheData.current_open_edit_only_controller ? LocalCacheData.current_open_edit_only_controller : LocalCacheData.current_open_primary_controller;
IndexViewController.openReport( parent_view, destination );
}
} );
}
};
}
parseWizardLink( destination ) {
return {
command: () => {
Global.closeEditViews( function() {
//TODO: After we decide on where openSelectView() should exist. Stop using temp _main_menu variable.
_main_menu.openSelectView( destination );
} );
}
};
}
}
/*
Custom types for JSDoc
*/
/**
* A TT link object containing link info as well as TT specific attributes.
* @typedef {Object} TTMenuLink
* @property {string} type - view, wizard, report, popup.
* @property {string} destination - The old-style TT hash reference for destination.
* @property {string} target - Which Vue view container should this link open in. main, right, footer.
*/
// Add the above to an actual class definition of the same. See namespace with defaults on https://jsdoc.app/tags-property.html
/*
Sample Data
{
label: TTi18n::getText(Employee),
icon: null|myicon.svg,
tt_id: 'employee', // Maybe make this ID match the destination by default? but its lowercase.
tt_link: null|{ type: wizard|report|view, destination: employee, target: null|main|left|right|footer }
items: [ {},{},... ]
}
*/