misc: dynamically update first option to alternative label (#60217) #907

Merged
fpeters merged 1 commits from wip/60217-redo-first-element-empty-label into main 2024-01-12 14:56:27 +01:00
3 changed files with 18 additions and 13 deletions

View File

@ -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
Review

Plus de modification via le python, gestion via le js.

Plus de modification via le python, gestion via le js.
seen = True
yield widget
class WidgetDict(quixote.form.widget.WidgetDict):
# Fix the title and hint setting

View File

@ -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('---');
Review

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();
}

View File

@ -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 */