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

2537 lines
79 KiB
JavaScript
Raw Permalink Normal View History

2022-12-13 07:10:06 +01:00
// 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: [ {},{},... ]
}
*/