TimeTrex/interface/html5/views/company/permission_control/PermissionControlViewController.js

554 lines
15 KiB
JavaScript

export class PermissionControlViewController extends BaseViewController {
constructor( options = {} ) {
_.defaults( options, {
el: '#permission_control_view_container',
level_array: null,
user_api: null,
permission_array: null,
quick_search_dic: {},
//Save multi key typed when quick search
quick_search_typed_keys: '',
//use to juedge if need to clear quick_search_this.quick_search_typed_keyss
quick_search_timer: null
} );
super( options );
}
init( options ) {
//this._super('initialize', options );
this.edit_view_tpl = 'PermissionControlEditView.html';
this.permission_id = 'permission';
this.viewId = 'PermissionControl';
this.script_name = 'PermissionControlView';
this.table_name_key = 'permission_control';
this.context_menu_name = $.i18n._( 'Permission Group' );
this.navigation_label = $.i18n._( 'Permission Group' );
this.api = TTAPI.APIPermissionControl;
this.user_api = TTAPI.APIUser;
this.render();
this.buildContextMenu();
this.initData();
}
onKeyDown( e ) {
var focus = $( ':focus' );
var $this = this;
if ( this.edit_view_tab_selected_index === 0 && !LocalCacheData.openAwesomeBox &&
( focus.length < 1 || focus[0].localName !== 'input' ) ) {
var a_dropdown = this.edit_view_ui_dic.permission;
if ( e.keyCode === 39 ) { //right
e.preventDefault();
if ( a_dropdown.getAllowMultipleSelection() ) {
a_dropdown.onUnSelectGridDoubleClick();
}
} else if ( e.keyCode === 37 ) { //left
e.preventDefault();
if ( a_dropdown.getAllowMultipleSelection() ) {
a_dropdown.onSelectGridDoubleClick();
}
} else {
if ( e.keyCode === 16 ||
e.keyCode === 17 ||
e.keyCode === 91 ) {
return;
}
if ( this.quick_search_timer ) {
clearTimeout( this.quick_search_timer );
}
this.quick_search_timer = setTimeout( function() {
$this.quick_search_typed_keys = '';
}, 200 );
e.preventDefault();
var target_grid;
var next_index;
var next_select_item;
this.quick_search_typed_keys = this.quick_search_typed_keys + Global.KEYCODES[e.which];
if ( a_dropdown.getAllowMultipleSelection() || a_dropdown.getTreeMode() ) {
if ( this.quick_search_typed_keys ) {
target_grid = a_dropdown.getFocusInSeletGrid() ? a_dropdown.getSelectGrid() : a_dropdown.getUnSelectGrid();
var search_index = this.quick_search_dic[this.quick_search_typed_keys] ? this.quick_search_dic[this.quick_search_typed_keys] : 0;
var tds = $( target_grid.grid.find( 'tr' ).find( 'td:eq(1)' ).filter( function() {
return $.text( [this] ).toLowerCase().indexOf( $this.quick_search_typed_keys ) == 0;
} ) );
var td;
if ( search_index > 0 && search_index < tds.length ) {
} else {
search_index = 0;
}
td = $( tds[search_index] );
a_dropdown.unSelectAll( target_grid, true );
next_index = td.parent().index() - 1;
next_select_item = target_grid.grid.jqGrid( 'getGridParam', 'data' )[next_index];
a_dropdown.setSelectItem( next_select_item, target_grid );
this.quick_search_dic = {};
this.quick_search_dic[this.quick_search_typed_keys] = search_index + 1;
}
} else {
if ( this.quick_search_typed_keys ) {
search_index = this.quick_search_dic[this.quick_search_typed_keys] ? this.quick_search_dic[this.quick_search_typed_keys] : 0;
tds = $( a_dropdown.getUnSelectGrid().find( 'tr' ).find( 'td:first' ).filter( function() {
return $.text( [this] ).toLowerCase().indexOf( $this.quick_search_typed_keys ) == 0;
} ) );
if ( search_index > 0 && search_index < tds.length ) {
} else {
search_index = 0;
}
td = $( tds[search_index] );
next_index = td.parent().index() - 1;
next_select_item = this.getItemByIndex( next_index );
a_dropdown.setSelectItem( next_select_item );
this.quick_search_dic = {};
this.quick_search_dic[this.quick_search_typed_keys] = search_index + 1;
}
}
}
}
}
setSubLogViewFilter() {
if ( !this.sub_log_view_controller ) {
return false;
}
this.sub_log_view_controller.getSubViewFilter = function( filter ) {
filter['table_name_object_id'] = {
'permission_user': [this.parent_edit_record.id],
'permission': [this.parent_edit_record.id],
'permission_control': [this.parent_edit_record.id]
};
return filter;
};
return true;
}
getCustomContextMenuModel() {
var context_menu_model = {
exclude: ['mass_edit'],
include: [
{
label: '', //Empty label. vue_icon is displayed instead of text.
id: 'other_header',
menu_align: 'right',
action_group: 'other',
action_group_header: true,
vue_icon: 'tticon tticon-more_vert_black_24dp',
},
{
label: $.i18n._( 'Permission Wizard' ),
id: 'permission_wizard',
menu_align: 'right',
action_group: 'other'
}
]
};
return context_menu_model;
}
setEditViewTabHeight() {
super.setEditViewTabHeight();
var permission_grid = this.edit_view_ui_dic.permission;
permission_grid.setHeight( ( this.edit_view_tab.find( '.context-border' ).height() - permission_grid[0].getBoundingClientRect().top ) - 80 );
}
onCustomContextClick( context_menu_id ) {
var $this = this;
$this.current_edit_record.permission = this.buildAPIFormPermissionResult();
if ( $.type( $this.current_edit_record.permission ) !== 'array' ) {
$this.current_edit_record.permission = [];
}
switch ( context_menu_id ) {
case 'permission_wizard':
IndexViewController.openWizard( 'PermissionWizard', null, function( result, action ) {
if ( result ) {
switch ( action ) {
case 'allow':
var new_permission_array = $this.convertPermissionData( result );
//Issue #2954 - Attempt to fix: Uncaught TypeError: i.current_edit_record.permission.concat is not a function
if ( !Array.isArray( $this.current_edit_record.permission ) ) {
$this.current_edit_record.permission = [];
}
$this.current_edit_record.permission = $this.current_edit_record.permission.concat( new_permission_array );
$this.removeDuplicatePermission();
$this.edit_view_ui_dic.permission.setValue( $this.current_edit_record.permission );
$this.edit_view_ui_dic.permission.setSelectGridHighlight( new_permission_array );
break;
case 'highlight':
new_permission_array = $this.convertPermissionData( result );
$this.edit_view_ui_dic.permission.setSelectGridHighlight( new_permission_array );
$this.edit_view_ui_dic.permission.setUnSelectGridHighlight( new_permission_array );
break;
case 'deny':
new_permission_array = $this.convertPermissionData( result );
$this.edit_view_ui_dic.permission.setSelectGridHighlight( new_permission_array );
$this.edit_view_ui_dic.permission.moveItems( false, new_permission_array );
$this.edit_view_ui_dic.permission.setUnSelectGridHighlight( new_permission_array );
$this.current_edit_record.permission = $this.edit_view_ui_dic.permission.getValue();
break;
}
}
} );
}
}
removeDuplicatePermission() {
var new_array = [];
$.each( this.current_edit_record.permission, function( i, el ) {
if ( $.inArray( el, new_array ) === -1 ) {
new_array.push( el );
}
} );
this.current_edit_record.permission = new_array;
}
buildPermissionArray( result, valueOnly ) {
var arr = [];
var val_array = [];
var id = 1000;
for ( var key in result ) {
var sArr = [];
for ( var cKey in result[key] ) {
var item = result[key];
var resItem = {};
resItem.value = key + '->' + cKey;
val_array.push( resItem.value );
resItem.sortKey = key;
resItem.label = item[cKey];
resItem.id = resItem.value;
sArr.push( resItem );
id++;
}
arr = arr.concat( sArr );
}
arr.sort( function( a, b ) {
return Global.compare( a, b, 'label' );
} );
if ( !valueOnly ) {
return arr;
} else {
return val_array;
}
}
initOptions() {
var $this = this;
this.initDropDownOption( 'level', 'level' );
this.api.getPermissionOptions( {
onResult: function( res ) {
res = res.getResult();
res = $this.buildPermissionArray( res );
$this.permission_array = res;
}
} );
}
setCurrentEditRecordData() {
//Set current edit record data to all widgets
for ( var key in this.current_edit_record ) {
var widget = this.edit_view_ui_dic[key];
if ( Global.isSet( widget ) ) {
switch ( key ) {
case 'permission':
if ( this.current_edit_record.permission ) {
this.current_edit_record.permission = this.convertPermissionData( this.current_edit_record.permission );
widget.setValue( this.current_edit_record.permission );
}
break;
default:
widget.setValue( this.current_edit_record[key] );
break;
}
}
}
this.collectUIDataToCurrentEditRecord();
this.edit_view_ui_dic.permission.setGridColumnsWidths();
this.setEditViewDataDone();
}
convertPermissionData( permission ) {
var result = [];
for ( var key in permission ) {
var ar = [];
for ( var cKey in permission[key] ) {
if ( permission[key][cKey] === true ) {
ar.push( key + '->' + cKey );
}
}
result = result.concat( ar );
}
return result;
}
buildSelectItems() {
var items = [];
var len = this.permission_array.length;
for ( var key in this.current_edit_record.permission ) {
var select_value = this.current_edit_record.permission[key];
for ( var i = 0; i < len; i++ ) {
var item = this.permission_array[i];
if ( select_value === item.value ) {
items.push( item );
break;
}
}
}
return items;
}
buildEditViewUI() {
super.buildEditViewUI();
var $this = this;
this.edit_view.children().eq( 0 ).css( 'min-width', 1170 );
var tab_model = {
'tab_permission_group': {
'label': $.i18n._( 'Permission Group' )
},
'tab_audit': true,
};
this.setTabModel( tab_model );
this.navigation.AComboBox( {
api_class: TTAPI.APIPermissionControl,
id: this.script_name + '_navigation',
allow_multiple_selection: false,
layout_name: 'global_permission_control',
navigation_mode: true,
show_search_inputs: true
} );
this.setNavigation();
//Tab 0 start
var tab_permission_group = this.edit_view_tab.find( '#tab_permission_group' );
var tab_permission_group_column1 = tab_permission_group.find( '.first-column' );
this.edit_view_tabs[0] = [];
this.edit_view_tabs[0].push( tab_permission_group_column1 );
//Name
var form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
form_item_input.TTextInput( { field: 'name', width: '100%' } );
this.addEditFieldToColumn( $.i18n._( 'Name' ), form_item_input, tab_permission_group_column1, '' );
form_item_input.parent().width( '45%' );
// Description
form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );
form_item_input.TTextInput( { field: 'description', width: '100%' } );
this.addEditFieldToColumn( $.i18n._( 'Description' ), form_item_input, tab_permission_group_column1 );
form_item_input.parent().width( '45%' );
// Level
form_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );
form_item_input.TComboBox( { field: 'level' } );
form_item_input.setSourceData( $this.level_array );
this.addEditFieldToColumn( $.i18n._( 'Level' ), form_item_input, tab_permission_group_column1 );
//Employee
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );
form_item_input.AComboBox( {
api_class: TTAPI.APIUser,
allow_multiple_selection: true,
layout_name: 'global_user',
show_search_inputs: true,
set_empty: true,
field: 'user'
} );
this.addEditFieldToColumn( $.i18n._( 'Employees' ), form_item_input, tab_permission_group_column1, '' );
//Permissions
form_item_input = Global.loadWidgetByName( FormItemType.AWESOME_DROPDOWN );
var display_columns = ALayoutCache.getDefaultColumn( 'global_option_column' ); //Get Default columns base on different layout name
display_columns = Global.convertColumnsTojGridFormat( display_columns, 'global_option_column' ); //Convert to jQgrid format
form_item_input.ADropDown( {
field: 'permission',
display_show_all: false,
id: 'permission_dropdown',
key: 'value',
allow_drag_to_order: false,
display_close_btn: false,
auto_sort: true,
display_column_settings: false,
default_height: ( this.edit_view_tab.height() - 325 ),
show_search_inputs: true
} );
form_item_input.addClass( 'splayed-adropdown' );
this.addEditFieldToColumn( $.i18n._( 'Permissions' ), form_item_input, tab_permission_group_column1, '', null, true, true );
form_item_input.setColumns( display_columns );
form_item_input.setUnselectedGridData( this.permission_array );
}
_continueDoCopyAsNew() {
//Issue #3206 - Copy as new causes selected permissions to be lost
//Overriding this function to make sure uniformVariable is called, otherwise permission data will be
//in the wrong format when setCurrentEditRecord is called. onSaveAndNew() calls uniformVariable() however copyAsNew() does not.
if ( this.is_viewing || this.is_edit ) {
this.uniformVariable( this.current_edit_record );
}
super._continueDoCopyAsNew();
}
onSaveDone( result ) {
if ( Array.isArray( this.current_edit_record.user ) && this.current_edit_record.user.includes( LocalCacheData.getLoginUser().id ) ) {
Global.refreshPermissions();
}
super.onSaveDone( result );
}
uniformVariable( records ) {
records.permission = this.buildAPIFormPermissionResult();
return records;
}
buildAPIFormPermissionResult() {
var val = this.edit_view_ui_dic.permission.getValue();
var permission = {};
var key = '';
for ( var i = 0; i < val.length; i++ ) {
var item = val[i].value;
key = item.split( '->' )[0];
if ( !permission[key] ) {
permission[key] = {};
}
permission[key][item.split( '->' )[1]] = true;
}
return permission;
}
buildSearchFields() {
super.buildSearchFields();
this.search_fields = [
new SearchField( {
label: $.i18n._( 'Name' ),
in_column: 1,
field: 'name',
basic_search: true,
adv_search: false,
form_item_type: FormItemType.TEXT_INPUT
} ),
new SearchField( {
label: $.i18n._( 'Description' ),
in_column: 1,
field: 'description',
basic_search: true,
adv_search: false,
form_item_type: FormItemType.TEXT_INPUT
} ),
new SearchField( {
label: $.i18n._( 'Created By' ),
in_column: 2,
field: 'created_by',
layout_name: 'global_user',
api_class: TTAPI.APIUser,
multiple: true,
basic_search: true,
adv_search: false,
form_item_type: FormItemType.AWESOME_BOX
} ),
new SearchField( {
label: $.i18n._( 'Updated By' ),
in_column: 2,
field: 'updated_by',
layout_name: 'global_user',
api_class: TTAPI.APIUser,
multiple: true,
basic_search: true,
adv_search: false,
form_item_type: FormItemType.AWESOME_BOX
} )
];
}
setDefaultMenuPermissionWizardIcon( context_btn, pId ) {
ContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false );
}
}