Skip to content
Snippets Groups Projects
Commit 9e487af8 authored by LE GAC Renaud's avatar LE GAC Renaud
Browse files

Modify linkedcombobox to run with several slaves.

parent 60198cd9
No related branches found
No related tags found
No related merge requests found
......@@ -24,8 +24,12 @@ virtdb.define_table("foo1",
virtdb.define_table("harvester_selector",
Field('id_teams', db.teams, label='Team'),
Field('id_projects', db.projects, label='Project'),
Field('controller', 'string', label='Harvest'))
virtdb.harvester_selector.id_projects.requires = \
IS_IN_DB(db, 'projects.id', 'projects.project')
\ No newline at end of file
IS_IN_DB(db, 'projects.id', 'projects.project')
virtdb.harvester_selector.id_teams.requires = \
IS_IN_DB(db, 'teams.id', 'teams.team')
\ No newline at end of file
......@@ -12,24 +12,24 @@ dbui.configure_forms(db, plugins=['pFormToolTip'])
#
formModifier = dbui.FormModifier('foo1')
formModifier.link_comboboxes(masterName='my_axis',
slaveName='my_granularity',
slaveNames='my_granularity',
storeName='axesStore',
displayFieldMaster='axis_local',
valueFieldMaster='axis',
displayFieldSlave='granularity_local',
valueFieldSlave='granularity')
displayFieldSlaves='granularity_local',
valueFieldSlaves='granularity')
#
# link comboboxes in harvester selector
#
formModifier = dbui.FormModifier('harvester_selector')
formModifier.link_comboboxes(masterName='id_projects',
slaveName='controller',
slaveNames=['controller', 'id_teams'],
storeName='harvestersStore',
displayFieldMaster='ProjectsProject',
valueFieldMaster='HarvestersId_projects',
displayFieldSlave='HarvestersController',
valueFieldSlave='HarvestersController')
displayFieldSlaves=['HarvestersController', 'TeamsTeam'],
valueFieldSlaves=['HarvestersController', 'HarvestersId_teams'])
#
# Create fieldSet for the publication form
......
......@@ -5,6 +5,7 @@ import copy
from fieldsmodifier import FieldsModifier
from gluon.storage import Storage
from helper import as_list
from modifier import Modifier
......@@ -63,8 +64,10 @@ class FormModifier(Modifier):
masterName
field name for the master combobox
slaveName
field name for the master combobox
slaveNames
field name for the master combobox.
Either a string or a list of string when several
slaves are linked to a master.
storeName
name of the store containing values
......@@ -82,19 +85,26 @@ class FormModifier(Modifier):
Either field for Ext.data.ArrayStore or TableField
for a store linked to a database table.
displayFieldSlave
displayFieldSlaves
Name of the field in the store display in the slave combo.
Either field for Ext.data.ArrayStore or TableField
for a store linked to a database table.
Either a string or a list of string when several
slaves are linked to a master.
valueFieldSlave
valueFieldSlaves
Name of the field in the store return by the slave combo.
Either field for Ext.data.ArrayStore or TableField
for a store linked to a database table.
Either a string or a list of string when several
slaves are linked to a master.
"""
for el in ('slaveNames', 'displayFieldSlaves', 'valueFieldSlaves'):
kwargs[el] = as_list(kwargs[el])
# master
fieldsModifier = FieldsModifier(self.tablename)
fieldsModifier.configure_field(kwargs['masterName'],
displayField=kwargs['displayFieldMaster'],
role='master',
......@@ -102,13 +112,15 @@ class FormModifier(Modifier):
valueField=kwargs['valueFieldMaster'],
xtype='xlinkedcombobox')
fieldsModifier.configure_field(kwargs['slaveName'],
displayField=kwargs['displayFieldSlave'],
mode='local',
role='slave',
store=kwargs['storeName'],
valueField=kwargs['valueFieldSlave'],
xtype='xlinkedcombobox')
# slaves
for i in range(len(kwargs['slaveNames'])):
fieldsModifier.configure_field(kwargs['slaveNames'][i],
displayField=kwargs['displayFieldSlaves'][i],
mode='local',
role='slave',
store=kwargs['storeName'],
valueField=kwargs['valueFieldSlaves'][i],
xtype='xlinkedcombobox')
def merge_fields(self, *fields, **kwargs):
......
......@@ -68,11 +68,8 @@ App.form.LinkedComboBox = Ext.extend(Ext.form.ComboBox, {
this.store = App.getStore(this.store);
if (!this.store.getTotalCount()) {
this.store.load({
callback: this.initSlave,
scope: this
});
this.store.on('load', this.initSlave, this, {single: true});
} else {
this.initSlave();
}
......@@ -105,6 +102,44 @@ App.form.LinkedComboBox = Ext.extend(Ext.form.ComboBox, {
this.masterStore.filter(this.valueField, combo.getValue());
},
/**
* Private method to initialise the slave combobox
* A slave is disable at startup.
*
*/
initSlave: function () {
// Reset and disable the combobox.
//
// NOTE
// when the user select a value in the master combobox
// for the first time, the value of the slave are not filtered
// It contains all possible values.
// To fix this issue, the code mimic the click by a user
// on the slave combobox and then it works !!!
//
function initialise(combo) {
combo.onTriggerClick();
combo.collapse();
combo.reset();
combo.disable();
}
if (this.role !== 'slave') {
return;
}
if (this.rendered) {
initialise(this);
} else {
this.on('render', function (combo) {
initialise(combo);
});
}
},
/**
* Private method to load data in the combo store from the master one
*/
......@@ -126,50 +161,15 @@ App.form.LinkedComboBox = Ext.extend(Ext.form.ComboBox, {
}
this.store.loadData(data);
this.fireEvent('masterready');
},
/**
* Private method to initialise the slave combobox
* A slave is disable at startup.
*
*/
initSlave: function () {
if (this.role !== 'slave') {
return;
}
// Reset and disable the combobox.
//
// NOTE
// when the user select a value in the master combobox
// for the first time, the value of the slave are not filtered
// It contains all possible values.
// To fix this issue, the code mimic the click by a user
// on the slave combobox and then it works !!!
//
if (this.rendered) {
this.onTriggerClick();
this.collapse();
this.reset();
this.disable();
} else {
this.on('render', function (combo) {
combo.onTriggerClick();
combo.collapse();
combo.reset();
combo.disable();
});
}
},
/**
* Handler to update the content of the slave combobox content and to select
* when a master value is selected
*/
onDataChanged: function () {
var value = this.store.getAt(0).get(this.valueField);
this.setValue(value);
this.enable();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment