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", ...@@ -24,8 +24,12 @@ virtdb.define_table("foo1",
virtdb.define_table("harvester_selector", virtdb.define_table("harvester_selector",
Field('id_teams', db.teams, label='Team'),
Field('id_projects', db.projects, label='Project'), Field('id_projects', db.projects, label='Project'),
Field('controller', 'string', label='Harvest')) Field('controller', 'string', label='Harvest'))
virtdb.harvester_selector.id_projects.requires = \ virtdb.harvester_selector.id_projects.requires = \
IS_IN_DB(db, 'projects.id', 'projects.project') IS_IN_DB(db, 'projects.id', 'projects.project')
\ No newline at end of file
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']) ...@@ -12,24 +12,24 @@ dbui.configure_forms(db, plugins=['pFormToolTip'])
# #
formModifier = dbui.FormModifier('foo1') formModifier = dbui.FormModifier('foo1')
formModifier.link_comboboxes(masterName='my_axis', formModifier.link_comboboxes(masterName='my_axis',
slaveName='my_granularity', slaveNames='my_granularity',
storeName='axesStore', storeName='axesStore',
displayFieldMaster='axis_local', displayFieldMaster='axis_local',
valueFieldMaster='axis', valueFieldMaster='axis',
displayFieldSlave='granularity_local', displayFieldSlaves='granularity_local',
valueFieldSlave='granularity') valueFieldSlaves='granularity')
# #
# link comboboxes in harvester selector # link comboboxes in harvester selector
# #
formModifier = dbui.FormModifier('harvester_selector') formModifier = dbui.FormModifier('harvester_selector')
formModifier.link_comboboxes(masterName='id_projects', formModifier.link_comboboxes(masterName='id_projects',
slaveName='controller', slaveNames=['controller', 'id_teams'],
storeName='harvestersStore', storeName='harvestersStore',
displayFieldMaster='ProjectsProject', displayFieldMaster='ProjectsProject',
valueFieldMaster='HarvestersId_projects', valueFieldMaster='HarvestersId_projects',
displayFieldSlave='HarvestersController', displayFieldSlaves=['HarvestersController', 'TeamsTeam'],
valueFieldSlave='HarvestersController') valueFieldSlaves=['HarvestersController', 'HarvestersId_teams'])
# #
# Create fieldSet for the publication form # Create fieldSet for the publication form
......
...@@ -5,6 +5,7 @@ import copy ...@@ -5,6 +5,7 @@ import copy
from fieldsmodifier import FieldsModifier from fieldsmodifier import FieldsModifier
from gluon.storage import Storage from gluon.storage import Storage
from helper import as_list
from modifier import Modifier from modifier import Modifier
...@@ -63,8 +64,10 @@ class FormModifier(Modifier): ...@@ -63,8 +64,10 @@ class FormModifier(Modifier):
masterName masterName
field name for the master combobox field name for the master combobox
slaveName slaveNames
field name for the master combobox field name for the master combobox.
Either a string or a list of string when several
slaves are linked to a master.
storeName storeName
name of the store containing values name of the store containing values
...@@ -82,19 +85,26 @@ class FormModifier(Modifier): ...@@ -82,19 +85,26 @@ class FormModifier(Modifier):
Either field for Ext.data.ArrayStore or TableField Either field for Ext.data.ArrayStore or TableField
for a store linked to a database table. for a store linked to a database table.
displayFieldSlave displayFieldSlaves
Name of the field in the store display in the slave combo. Name of the field in the store display in the slave combo.
Either field for Ext.data.ArrayStore or TableField Either field for Ext.data.ArrayStore or TableField
for a store linked to a database table. 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. Name of the field in the store return by the slave combo.
Either field for Ext.data.ArrayStore or TableField Either field for Ext.data.ArrayStore or TableField
for a store linked to a database table. 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 = FieldsModifier(self.tablename)
fieldsModifier.configure_field(kwargs['masterName'], fieldsModifier.configure_field(kwargs['masterName'],
displayField=kwargs['displayFieldMaster'], displayField=kwargs['displayFieldMaster'],
role='master', role='master',
...@@ -102,13 +112,15 @@ class FormModifier(Modifier): ...@@ -102,13 +112,15 @@ class FormModifier(Modifier):
valueField=kwargs['valueFieldMaster'], valueField=kwargs['valueFieldMaster'],
xtype='xlinkedcombobox') xtype='xlinkedcombobox')
fieldsModifier.configure_field(kwargs['slaveName'], # slaves
displayField=kwargs['displayFieldSlave'], for i in range(len(kwargs['slaveNames'])):
mode='local', fieldsModifier.configure_field(kwargs['slaveNames'][i],
role='slave', displayField=kwargs['displayFieldSlaves'][i],
store=kwargs['storeName'], mode='local',
valueField=kwargs['valueFieldSlave'], role='slave',
xtype='xlinkedcombobox') store=kwargs['storeName'],
valueField=kwargs['valueFieldSlaves'][i],
xtype='xlinkedcombobox')
def merge_fields(self, *fields, **kwargs): def merge_fields(self, *fields, **kwargs):
......
...@@ -68,11 +68,8 @@ App.form.LinkedComboBox = Ext.extend(Ext.form.ComboBox, { ...@@ -68,11 +68,8 @@ App.form.LinkedComboBox = Ext.extend(Ext.form.ComboBox, {
this.store = App.getStore(this.store); this.store = App.getStore(this.store);
if (!this.store.getTotalCount()) { if (!this.store.getTotalCount()) {
this.store.load({ this.store.on('load', this.initSlave, this, {single: true});
callback: this.initSlave,
scope: this
});
} else { } else {
this.initSlave(); this.initSlave();
} }
...@@ -105,6 +102,44 @@ App.form.LinkedComboBox = Ext.extend(Ext.form.ComboBox, { ...@@ -105,6 +102,44 @@ App.form.LinkedComboBox = Ext.extend(Ext.form.ComboBox, {
this.masterStore.filter(this.valueField, combo.getValue()); 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 * 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, { ...@@ -126,50 +161,15 @@ App.form.LinkedComboBox = Ext.extend(Ext.form.ComboBox, {
} }
this.store.loadData(data); 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 * Handler to update the content of the slave combobox content and to select
* when a master value is selected * when a master value is selected
*/ */
onDataChanged: function () { onDataChanged: function () {
var value = this.store.getAt(0).get(this.valueField); var value = this.store.getAt(0).get(this.valueField);
this.setValue(value); this.setValue(value);
this.enable(); 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