Ext.getCmp('appTab').add(new FR.components.editForm({
title: FR.T('Import Users'),
items: {
xtype: 'tabpanel', ref: 'tabPanel',
activeTab: 0, deferredRender: false,
defaults: {autoScroll: true, bodyStyle:'padding:10px', listeners: {'render': function() {this.doLayout(false, true);}}},
items: [
{
title: FR.T('Step 1: Upload CSV File'),
items: [
{
xtype: 'displayfield', style: 'font-size:11px;color:gray;padding-bottom:10px;',
value: FR.T('The CSV file needs to contain at least two columns, for username and name.')+'
'+
FR.T('You will be asked to map the fields, so the names and the order of the columns are not important.')
},
{
xtype: 'fieldset', labelWidth: 150,
width: 500, defaults: {width: 300},
items: [
{
xtype: 'radiogroup',
fieldLabel: FR.T('Fields are separated by'),
columns: 1,
items: [
{boxLabel: FR.T('Comma'), name: 'delimiter', inputValue: 'comma', value: 'comma', checked: true},
{boxLabel: FR.T('Semicolon'), name: 'delimiter', inputValue: 'semicolon', value: 'semicolon', checked: false},
{boxLabel: FR.T('Tab'), name: 'delimiter', inputValue: 'tab', value: 'tab', checked: false}
]
},
{
xtype: 'panel', layout: 'hbox',
layoutConfig: {padding: 5}, bodyStyle: 'padding-left:150px',
defaults:{margins:'0 5 0 0'},
items: [
{
xtype: 'button', text: FR.T('Upload CSV file'), cls:'fr-btn-primary color-white', iconCls: 'fa fa-fw fa-upload',
listeners: {
'afterrender': function () {
var formPanel = this.ownerCt.ownerCt.ownerCt.ownerCt.ownerCt;
var tabPanel = formPanel.tabPanel;
var uploadTab = tabPanel.items.itemAt(0);
this.flow = new Flow({
target: FR.URLRoot+'/?module=users§ion=import&page=upload',
singleFile: true, startOnSubmit: true,
query: function() {
return {delimiter: formPanel.form.getValues().delimiter};
},
validateChunkResponse: function(status, message) {
if (status != '200') {return 'retry';}
try {var rs = Ext.util.JSON.decode(message);} catch (er){return 'retry';}
if (rs) {if (rs.success) {return 'success';} else {return 'error';}}
}
});
this.flow.on('filesSubmitted', function() {
uploadTab.bwrap.mask(FR.T('Upload starting...'));
});
this.flow.on('progress', function(flow) {
var percent = Math.floor(flow.getProgress()*100);
uploadTab.bwrap.mask(FR.T('Uploading...%1%').replace('%1', percent));
});
this.flow.on('fileSuccess', function(file, message) {
uploadTab.bwrap.unmask();
try {
var rs = Ext.util.JSON.decode(message);
} catch (er){
FR.feedback('Unexpected server reply: '+message);
}
if (rs) {
if (rs.msg) {FR.feedback(rs.msg);}
if (rs.success) {
var mapFieldsTab = tabPanel.items.itemAt(1);
uploadTab.setDisabled(1);
mapFieldsTab.setDisabled(0);
tabPanel.setActiveTab(1);
var comboStore = new Ext.data.SimpleStore({
idIndex: 0,
fields: ['key', 'display'],
data: FR.importColumns
});
// create the Data Store
var fields = ['record_number'];
var columns = [{dataIndex: 'record_number', width:100}];
var comboMappings = [{xtype: 'displayfield', width: 100, value: FR.T('Record number')}];
var gridWidth = 100;
for (var i = 0 ; i < rs.preview[0].length-1; i++) {
gridWidth = gridWidth+130;
fields.push('h'+i);
columns.push({dataIndex: 'h'+i, width: 130});
comboMappings.push({
xtype: 'combo', width: 125,
mode: 'local', editable: false,
triggerAction: 'all', lazyRender: true,
displayField: 'display', valueField: 'key',
listClass: 'x-combo-list-small', store: comboStore,
name: 'mappings', hiddenName: 'mappings['+i+']',
value: ((rs.preset && rs.preset[i]) ? rs.preset[i] : '-')
});
}
var store = new Ext.data.ArrayStore({
idIndex: 0, fields: fields, data: rs.preview
});
var grid = new Ext.grid.GridPanel({
columns: columns, store: store, border: false,
hideHeaders: true, columnLines: true, width: gridWidth
});
var combos = new Ext.form.CompositeField({
items: comboMappings, width: gridWidth
});
mapFieldsTab.add(combos);
mapFieldsTab.add(new Ext.form.DisplayField());
mapFieldsTab.add(grid);
mapFieldsTab.add(new Ext.form.DisplayField({
style: 'font-size:10px;color:gray',
value: FR.T('Only the first 10 records are being displayed here.')
}));
mapFieldsTab.doLayout();
}
}
});
this.flow.on('fileError', function(file, message) {
uploadTab.bwrap.unmask();
try {var rs = Ext.util.JSON.decode(message);} catch (er){
FR.feedback('Unexpected server reply: '+message);
}
if (rs && rs.msg) {FR.feedback(rs.msg);}
});
this.flow.on('complete', function() {
uploadTab.bwrap.unmask();
});
}
},
handler: function() {
this.flow.removeAll();
this.flow.browseFiles();
}
}
]
}
]
}
]
},
{
title: FR.T('Step 2: Map Fields'),
disabled: true,
tbar: [
{
text: FR.T('Import Users'),
cls: 'fr-btn-default fr-btn-primary fr-btn-smaller',
ref: 'saveBtn',
handler: function() {
var fp = this.ownerCt.ownerCt.ownerCt.ownerCt;
fp.el.mask(FR.T('Loading...'));
Ext.Ajax.request({
url: FR.URLRoot+'/?module=users§ion=import&page=import',
params: fp.form.getValues(),
success: function(req) {
this.el.unmask();
try {
var rs = Ext.util.JSON.decode(req.responseText);
} catch (er){
FR.feedback('Error: '+req.responseText);
return false;
}
if (rs.success) {
fp.results.update(rs.msg);
fp.tabPanel.items.itemAt(2).setDisabled(0);
fp.tabPanel.setActiveTab(2);
} else {
FR.feedback(rs.msg);
}
},
failure: function() {FR.feedback('An error was encountered while trying to send the request to the server.');},
scope: fp
});
}
}
],
items: [
{
xtype: 'fieldset',
labelWidth: 200,
width: 500,
items: [
{
xtype: 'combo',
fieldLabel: FR.T('Assign a role to the users'),
name: 'role', hiddenName: 'role', ref: '../role',
autoCreate: true, mode: 'local', editable: false,
displayField: 'name', valueField: 'id', allowBlank: false, forceSelection: true,
triggerAction:'all', disableKeyFilter: true, value: FR.roles[0] ? FR.roles[0][0] : '-',
store: new Ext.data.SimpleStore({fields: ['id', 'name'], data: FR.roles})
},
{
xtype: 'userslistfield', name: 'groups', only: 'groups', value: '',
fieldLabel: FR.T('Add the users to groups'), tcfg: {height: 70, width: 230}
},
{
xtype: 'textfield',
fieldLabel: FR.T('Start with record number'),
name: 'offset', width: 60,
helpText: FR.T('Set this to 2, if your CSV file has a header line.'),
value: 2
},
{
xtype: 'checkbox',
fieldLabel: FR.T('Passwords are in clear text'),
name: 'clear_text_pass', value: 1,
helpText: FR.T('Enable this option if the passwords stored in your CSV files are not encrypted.')
},
{
xtype: 'checkbox',
fieldLabel: FR.T('Automatically generate passwords for the accounts'),
name: 'gen_pass', value: 1
},
{
xtype: 'checkbox',
fieldLabel: FR.T('Require user to change the password'),
name: 'require_password_change', value: 1
},
{
xtype: 'checkbox',
boxLabel: FR.T('Send a notification now'),
helpText: FR.T('An e-mail message with the login information will be sent to the user\'s address.'), inputValue: 1,
name: 'notify', checked: false
}
]
}
]
},
{
title: FR.T('Step 3: Import Users'),
disabled: true,
items: [{ref: '../../results', bodyStyle:'padding:10px', html: ''}]
}
]
}
}));
Ext.getCmp('appTab').doLayout();