misc: dynamically update first option to alternative label (#60217) #907
|
@ -2188,22 +2188,12 @@ class WidgetListOfRoles(WidgetList):
|
|||
element_type=SingleSelectWidget,
|
||||
element_kwargs={
|
||||
'render_br': False,
|
||||
'options': [(None, '---', None)] + roles or [],
|
||||
'options': [(None, '---', '')] + roles or [],
|
||||
'attrs': {'data-first-element-empty-label': self.first_element_empty_label},
|
||||
},
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
def get_widgets(self):
|
||||
seen = False
|
||||
for widget in super().get_widgets():
|
||||
# change first option (empty value) of first element to use a specific label
|
||||
if not seen and isinstance(widget, SingleSelectWidget):
|
||||
widget.full_options = widget.full_options[:]
|
||||
widget.full_options[0] = list(widget.full_options[0])
|
||||
widget.full_options[0][1] = self.first_element_empty_label
|
||||
|
||||
seen = True
|
||||
yield widget
|
||||
|
||||
|
||||
class WidgetDict(quixote.form.widget.WidgetDict):
|
||||
# Fix the title and hint setting
|
||||
|
|
|
@ -80,6 +80,20 @@ $(function() {
|
|||
});
|
||||
}
|
||||
|
||||
function prepare_select_empty_label() {
|
||||
$('[data-first-element-empty-label]').off('change').on('change', function() {
|
||||
var $widgets = $(this).parents('.widget');
|
||||
if ($widgets.length > 1) {
|
||||
var values = $widgets.find('select').map((idx, elt) => {return $(elt).val()}).toArray().slice(1)
|
||||
if (values.every(v => (v === ""))) { // all empty
|
||||
$widgets.find('select').first().find('option[value=""]').text($(this).attr('data-first-element-empty-label'));
|
||||
} else {
|
||||
$widgets.find('select').first().find('option[value=""]').text('---');
|
||||
fpeters
commented
Le comportement maintenant : si le choix vide est choisi dans tous les select au-delà du premier, on modifie le libellé de l'option vide du premier select (pour par exemple afficher "Tout le monde"), sinon c'est --- pour bien marquer que ça va "vider" l'option. Ça permet à la fois d'avoir l'indication sur le comportement particulier quand tout est vide (ex ici "Tout le monde", mais on l'utilise aussi pour "API ouverte") et d'être clair sur l'effet du choix vide quand les autres select contiennent des valeurs. Le comportement maintenant : si le choix vide est choisi dans tous les select au-delà du premier, on modifie le libellé de l'option vide du premier select (pour par exemple afficher "Tout le monde"), sinon c'est --- pour bien marquer que ça va "vider" l'option. Ça permet à la fois d'avoir l'indication sur le comportement particulier quand tout est vide (ex ici "Tout le monde", mais on l'utilise aussi pour "API ouverte") et d'être clair sur l'effet du choix vide quand les autres select contiennent des valeurs.
|
||||
}
|
||||
}
|
||||
}).trigger('change');
|
||||
}
|
||||
|
||||
$('[data-content-url]').each(function(idx, elem) {
|
||||
$.ajax({url: $(elem).data('content-url'),
|
||||
xhrFields: { withCredentials: true },
|
||||
|
@ -95,6 +109,7 @@ $(function() {
|
|||
prepare_dynamic_widgets();
|
||||
prepare_autocomplete_widgets();
|
||||
prepate_select_or_other_widgets();
|
||||
prepare_select_empty_label();
|
||||
prepare_confirmation_buttons();
|
||||
}
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ function prepare_widget_list_elements() {
|
|||
if (name_attr == 'to$add_element' || name_attr == 'roles$add_element') {
|
||||
/* replace 1st list element by an empty label, as it's used
|
||||
* to remove an actual selection */
|
||||
$(new_row).find('option[value="None"]').first().text('----');
|
||||
$(new_row).find('option[value=""]').first().text('----');
|
||||
}
|
||||
|
||||
/* add new row after the last row */
|
||||
|
|
Loading…
Reference in New Issue
Plus de modification via le python, gestion via le js.