diff --git a/models/virtdb.py b/models/virtdb.py index 991519ce1e87881d285e1f04ed477a3a5a7fd54c..d7df9f5e234fec3979d41876da62cede144fc0d5 100644 --- a/models/virtdb.py +++ b/models/virtdb.py @@ -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 diff --git a/models/widgets_forms.py b/models/widgets_forms.py index d3990fb301e87e971982669c22a5372d4f3c9628..f0c99ff701f0bba109f9dc0d38ad8888bec59a24 100644 --- a/models/widgets_forms.py +++ b/models/widgets_forms.py @@ -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 diff --git a/modules/plugin_dbui/formmodifier.py b/modules/plugin_dbui/formmodifier.py index dfa2a8bb03927bd07b1ee4632cb936316366059d..262cb5f89ff7c4fd5987f3aa2df80cd7af3d1621 100644 --- a/modules/plugin_dbui/formmodifier.py +++ b/modules/plugin_dbui/formmodifier.py @@ -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): diff --git a/static/plugin_dbui/src/linkedcombobox.js b/static/plugin_dbui/src/linkedcombobox.js index 5d033784bb257e553c8ed462db5d19fe6f245fd9..95b1fbecaf2c7303618c53bcdb2bf9723f6d601c 100644 --- a/static/plugin_dbui/src/linkedcombobox.js +++ b/static/plugin_dbui/src/linkedcombobox.js @@ -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();