MudGuard: 2 abhängige Dropdowns - wann auf ungültige Kombination testen?

Hi,

folgende Situation:
Dropdown1 mit den möglichen Werten A, B, C, D, E, F, G
Dropdown2 mit den möglichen Werten X, Y, Z
Ein Button, mit dem eine Aktion ausgelöst wird.

Und dazu noch folgende Bedingungen:
Ist in Dropdown1 einer der Werte A, B, C, D gewählt, ist in Dropdown2 einer der Werte X, Y, Z erlaubt.
Ist in Dropdown1 einer der Werte E, F, G    gewählt, ist in Dropdown2 einer der Werte X, Y    erlaubt.

Oder aus Sicht von Dropdown2:
Ist in Dropdown2 einer der Werte X, Y  gewählt, ist in Dropdown1 einer der Werte A, B, C, D, E, F, G erlaubt.
Ist in Dropdown2 der Wert Z gewählt, ist in Dropdown1 einer der Werte A, B, C, D erlaubt.

Jetzt gibt es ja mehrere Möglichkeiten, die ungültigen Kombinationen auszuschließen:

1. Dropdown1 bestimmt, was Sache ist: bei Auswahl eines Wertes in Dropdown1 wird in Dropdown2 die Werteliste angepaßt.

2. Dropdown2 bestimmt, was Sache ist: bei Auswahl eines Wertes in Dropdown2 wird in Dropdown1 die Werteliste angepaßt.

3. beide Dropdowns bestimmen, was Sache ist: bei Auswahl eines Wertes in einer der Dropdowns wird die Werteliste des anderen Dropdowns angepaßt.

4. beide Dropdowns enthalten immer die komplette Liste der Werte, erst wenn der Button ausgelöst wird, wird auf zulässige Kombinationen getestet und entweder (bei zulässiger Kombination) die Aktion ausgelöst oder (bei unzulässiger Kombination) eine Fehlermeldung angezeigt.

Welche Variante würdet Ihr benutzen? Und warum?
Performance-Aspekte dürften zu vernachlässigen sein, es geht tatsächlich nur um 7 und 3 Werte, ggf. kommen in beiden Dropdowns noch ein oder zwei Werte hinzu, aber es bleibt bei sehr wenigen Werten.

Oder gibt es noch andere Varianten?

cu,
Andreas

--
Warum nennt sich Andreas hier MudGuard?
Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  1. Tag MudGuard.

    Welche Variante würdet Ihr benutzen?

    Es kommt darauf an.

    Und warum?

    Es ist eine Frage der Relation, also was wovon warum abhängig ist bzw. wie die logische Folge ist. Also entweder du sagst: wähle etwas aus Dropdown1, dann hast du folgende Möglichkeiten (Dropdown2) oder umgekehrt. Mal ein Beispiel:

    Drop1

    • Äpfel
    • Birnen
    • Pflaumen
    • Melonen
    • Bananen

    Drop2

    • einheimisch
    • Steinobst
    • exotisch

    Wo ist jetzt dein Einstieg? Willst du dem Benutzer alles offen lassen, bleibt m.E. nur Variante 3.

    [dsf 3.6]
    Siechfred

    --
    »Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«
    1. Hi,

      Es ist eine Frage der Relation, also was wovon warum abhängig ist bzw. wie die logische Folge ist. Also entweder du sagst: wähle etwas aus Dropdown1, dann hast du folgende Möglichkeiten (Dropdown2) oder umgekehrt. Mal ein Beispiel:

      Also - es geht darum, für eine Tabelle mit zig Spalten und zigtausend Zeilen Filter zu definieren.
      Das ganze ist so konzipiert, daß es möglichst unabhängig von der konkreten Tabelle genutzt werden kann ...
      Insgesamt gibt es - neben den beiden verbunddenen Dropdowns noch 3 weitere Controls, also insgesamt 6 Teile:

      1. Dropdown für die Auswahl der Spalten
      2. Auswahl des Vergleichsoperators (mein dropdown1, im Bild "Operator"), das enthält: ==, <, >, beginswith, contains, endswith, matchesregex
      3. Auswahl des Vergleichsverfahrens (mein dropdown2, im Bild "Modifier"), das enthält: StringCaseSensitive, StringIgnoreCase, Numeric (plus evtl. noch date)
      4. Eine Checkbox zum Invertieren der Bedingung (damit kann also !=, <=, >=  usw. bewirkt werden)
      5. Ein Editfeld für die Eingabe des Vergleichswertes
      6. Der Button, der den Filter in die Filterliste einfügt und auf die Tabelle anwendet.

      Sieht dann so aus:

      beginswith, contains, endswith, matchesregex sind natürlich für numerische Vergleiche sinnlos.
      Ist einer von diesen ausgewählt, sollte also bei den Vergleichsverfahren numeric wegfallen.

      Umgekehrt: ist numeric ausgewählt, sind beginswith, contains, endswith, matchesregex sinnlos, sollten also wegfallen.

      Ursprünglich hatte ich alles in ein Dropdown gepackt, aber das erschien mir zu unübersichtlich - 7 Operatoren für Strings mal 2 Varianten (case) mal 2 (invertiert) sind 28 Einträge, dazu noch 4 * 2 numerische, also bereits 36 Einträge.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Hallo!

    1. Dropdown1 bestimmt, was Sache ist: bei Auswahl eines Wertes in Dropdown1 wird in Dropdown2 die Werteliste angepaßt.

    So habe ich es bei einem Archivsystem gemacht und läuft unkompliziert. Ich baue serverseitig ein mehrdimensionales JS-Array auf. Clientseitig fülle ich dann die Dropdown's.

    var a = new Array();
    a['A'] = new Array('X', 'Y', 'Z');
    a['B'] = new Array('X', 'Y', 'Z');
    a['C'] = new Array('X', 'Y', 'Z');
    a['D'] = new Array('X', 'Y', 'Z');
    a['E'] = new Array('X', 'Y');
    a['F'] = new Array('X', 'Y');
    a['G'] = new Array('X', 'Y');

    Per JavaScript ändere ich dann im Dopdown B die Liste je nach dem was im Dropdown A ausgewählt wurde.

    Die 2. 3. und 4. Variante sind umständlich und machen nur zuviel arbeit.

    MfG, André Laugks

    --
    L-Andre @ gmx.de
    1. Hi,

      1. Dropdown1 bestimmt, was Sache ist: bei Auswahl eines Wertes in Dropdown1 wird in Dropdown2 die Werteliste angepaßt.

      So habe ich es bei einem Archivsystem gemacht und läuft unkompliziert. Ich baue serverseitig ein mehrdimensionales JS-Array auf. Clientseitig fülle ich dann die Dropdown's.

      Danke - es geht mir aber nicht um die Implementierung, sondern mehr darum, was für den User am besten ist.
      Server/Client oder Javascript sind im konkreten Anwendungsfall nicht vorhanden.

      var a = new Array();
      a['A'] = new Array('X', 'Y', 'Z');
      a['B'] = new Array('X', 'Y', 'Z');
      a['C'] = new Array('X', 'Y', 'Z');
      a['D'] = new Array('X', 'Y', 'Z');
      a['E'] = new Array('X', 'Y');
      a['F'] = new Array('X', 'Y');
      a['G'] = new Array('X', 'Y');

      Ineffektiv - 8 Arrays, wo maximal 3 nötig wären ...

      Die 2. 3. und 4. Variante sind umständlich und machen nur zuviel arbeit.

      Die 2. Variante ist genauso aufwendig wie die erste - ist ja dasselbe nur mit vertauschten Positionen.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hallo!

        var a = new Array();
        a['A'] = new Array('X', 'Y', 'Z');
        a['B'] = new Array('X', 'Y', 'Z');
        a['C'] = new Array('X', 'Y', 'Z');
        a['D'] = new Array('X', 'Y', 'Z');
        a['E'] = new Array('X', 'Y');
        a['F'] = new Array('X', 'Y');
        a['G'] = new Array('X', 'Y');

        Ineffektiv - 8 Arrays, wo maximal 3 nötig wären ...

        Ist doch wurscht bei Deinen paar Werten. So ist es aber am einfachsten umzusetzen.

        Bei den paar Werten würde ich mir auch nicht so die Gedanken machen.

        Die 2. Variante ist genauso aufwendig wie die erste - ist ja dasselbe nur mit vertauschten Positionen.

        Richtig....

        MfG, André Laugks

        --
        L-Andre @ gmx.de
  3. Hallo MudGuard,

    Ich würde Variante 1 bevorzugen.

    Variante 2 ist ja eigentlich das Selbe, nur dass die Reihenfolge verwirrend ist. Man erwartet, dass das wichtigere Feld zu erst kommt.

    Variante 3 ist auch verwirrend. Wenn ich aus einem eingeschränkten Menü etwas auswähle, müssen in diesem Menü wieder alle Punkte eingeblendet werden, da immer nur eines der beiden Menüs eingeschränkt sein kann, weil man sonst manche Kombinationen nie wieder erreichen kann. Wenn ich mich nun beim Auswählen verklicke und das korrigieren will, habe ich plötzlich alle Möglichkeiten wieder da drin und weiß nicht mehr, was ich auswählen darf.

    Variante 4 ist nervig, da ich die zulässigen Kombinationen nur durch ausprobieren rausbekommen kann.

    Wenn Variante 1 nicht flexibel genug ist, kann man Variante 3 evt. so implementieren, dass Auswahlmöglichkeiten, die durch die Einstellung im anderen Feld gerade nicht zulässig sind, rot hinterlegt werden.

    Grüße

    Daniel

    1. Hi,

      Ich würde Variante 1 bevorzugen.

      Ok.

      Variante 2 ist ja eigentlich das Selbe, nur dass die Reihenfolge verwirrend ist. Man erwartet, dass das wichtigere Feld zu erst kommt.

      Ich würde im konkreten Anwendungsfall (siehe https://forum.selfhtml.org/?t=96706&m=588459) die Wichtigkeit gleich hoch einstufen.

      Variante 3 ist auch verwirrend. Wenn ich aus einem eingeschränkten Menü etwas auswähle, müssen in diesem Menü wieder alle Punkte eingeblendet werden, da immer nur eines der beiden Menüs eingeschränkt sein kann, weil man sonst manche Kombinationen nie wieder erreichen kann. Wenn ich mich nun beim Auswählen verklicke und das korrigieren will, habe ich plötzlich alle Möglichkeiten wieder da drin und weiß nicht mehr, was ich auswählen darf.

      Der Fall, daß nicht mehr alle Kombinationen erreichbar sind, kann im konkreten Anwendungsfall nicht auftreten.

      Variante 4 ist nervig, da ich die zulässigen Kombinationen nur durch ausprobieren rausbekommen kann.

      Ok.

      Wenn Variante 1 nicht flexibel genug ist, kann man Variante 3 evt. so implementieren, dass Auswahlmöglichkeiten, die durch die Einstellung im anderen Feld gerade nicht zulässig sind, rot hinterlegt werden.

      Vielleicht machbar, aber wenn, dann mit ziemlichem Aufwand ...

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. beide Dropdowns bestimmen, was Sache ist: bei Auswahl eines Wertes in einer der Dropdowns wird die Werteliste des anderen Dropdowns angepaßt.

    Ich würde es so machen, zusätzlich musst du dann halt bei onfocus dem aktiven Dropdown wieder alle Auswahlmöglichkeiten anbieten und nach dem wählen die anderen entsprechend ändern. Was aber verwirren könnte (je nachdem wie kompliziert das auswahlverfahren ist blickt der Anwender nicht mehr durch).

    Falls die Möglichkeiten zu viele sind (so wie es aussieht, da es nicht nur 2 Felder sind) würde ich auch noch die 4. Möglichkeit in Betracht ziehen.

    Struppi.

    1. Hi,

      1. beide Dropdowns bestimmen, was Sache ist: bei Auswahl eines Wertes in einer der Dropdowns wird die Werteliste des anderen Dropdowns angepaßt.

      Ich würde es so machen, zusätzlich musst du dann halt bei onfocus dem aktiven Dropdown wieder alle Auswahlmöglichkeiten anbieten und nach dem wählen die anderen entsprechend ändern. Was aber verwirren könnte (je nachdem wie kompliziert das auswahlverfahren ist blickt der Anwender nicht mehr durch).

      Falls die Möglichkeiten zu viele sind (so wie es aussieht, da es nicht nur 2 Felder sind) würde ich auch noch die 4. Möglichkeit in Betracht ziehen.

      Die anderen Felder haben aber keinen Einfluß auf diese beiden Dropdowns - es ist explizit gewünscht, daß numeric bei allen Spalten verwendet werden darf, auch wenn die Spalte immer nur Texte enthält (dann wird halt NaN benutzt) ==> die Spaltenauswahl beeinflußt nicht. Ebensowenig die Invertierung der Bedingung, diese soll immer möglich sein. Und für den Vergleichswert gilt das gleiche wie für die Spalte.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.