FHEM Forum

FHEM => Frontends => TabletUI => Thema gestartet von: fhainz am 15 März 2018, 18:04:56

Titel: Benötige JS-Hilfe bei eigenem "klappMenu" Widget
Beitrag von: fhainz am 15 März 2018, 18:04:56
Hallo Leute!

Ich bin gerade dabei mir ein "Klapp Menü" Widget zu bauen. Grundsätzlich sollte bei einem Klick auf ein div das die Klasse .trigger besitzt, sich ein anders bisher verstecktes div mit der Klasse .expandable öffnen.
Zu allererst: Ich bin kein JS-Guru, ich glaube ich verstehe was der Code macht und ich glaube auch zu wissen wo das Problem liegt, aber ich hab keine Ahnung wie ich es beheben kann  ;D

Nun zu meinem Problen: Mit meinem bisheriger Code funktioniert das Ein-/Ausklappen nur solange ich jede Instanz des Widgets nacheinander definiere. 

<div data-type="klappMenu" ....></div>
<div data-type="klappMenu" ....></div>
<div data-type="klappMenu" ....></div>
...


Wenn ich aber versuche das Widget zu schachteln (also KlappMenu in KlappMenu) dann bekomm ich ein Problem.

<div data-type="klappMenu" ....></div>
<div data-type="klappMenu" ....>
  <div data-type="klappMenu" ....></div>
</div>
...


Bei einem Klick auf den 1. Trigger öffnet sich das 1. Menü und das 2. Menü. Bei einem Klick auf den jetzt sichbaren 2. Trigger schließt sich das 1. Menü  :o

Ich hab jetzt schon Stunden mit herumprobieren verbracht und ich bekomm's einfach nicht hin.  :'(  Meiner Meinung liegt es daran, dass in den Variablen trigger und expandable (als Array) beide Instanzen des Widgets stehen. Ich schaff es aber nicht nur die jeweils entsprechende Instanz anzusprechen.

Also falls das jemand nachstellen will  :)  hier eine kurze Anleitung:


<div data-type="klappMenue">
  <div class="trigger green">Trigger</div>
  <div class="expandable green">Opened</div>
</div>
<div data-type="klappMenue">
  <div class="trigger red">Trigger 1</div>
  <div class="expandable">
    <div class="red">Opened 1</div>
    <div data-type="klappMenue">
      <div class="trigger orange">Trigger 2</div>
      <div class="expandable orange">Opend 2</div>
    </div>
  </div>
</div>


Das angehängte Widget in den js Ordner kopieren.

Kann mir bitte jemand helfen?  :)

Grüße


Titel: Antw:Benötige JS-Hilfe bei eigenem "klappMenu" Widget
Beitrag von: setstate am 15 März 2018, 18:42:59
Wenn man .trigger immer direkt eine Ebene darunter setzt, könnte man mit der elem.wgid() den Selector besser spezifizieren.


elem.find('[data-wgid="' + elem.wgid() + '"] > .trigger');
       
Titel: Antw:Benötige JS-Hilfe bei eigenem "klappMenu" Widget
Beitrag von: fhainz am 15 März 2018, 19:04:30
Danke für deine schnelle Antwort.

Ich bin mir nicht sicher ob ich deine Antwort richtig verstehe.

Das Trigger div ist im o.g. Beispiel direkt unter dem Widget Aufruf.
Du meinst so, richtig?


...
me.init_attr(elem);

var id = [me.widgetname, me.area, index].join('_');

var trigger = elem.find('[data-wgid="' + elem.wgid() + '"] > .trigger');
var expandable = elem.find('.expandable');

if( !trigger.hasClass('initial-open') ) {
...


Das funktioniert leider noch nicht. Nach einem klick auf das Trigger Device öffnet das expandable div nicht mehr.


Edit:
Das trigger element wird jetzt nicht mehr gefunden, somit ist die variable trigger leer. Eigentlich sollte das aber passen. Hier der DOM:
<div data-type="klappMenue" class="" data-ready="" data-wgid="klappMenue_58bf-bcbe-40b2" data-id="klappMenue_#contentDashboard_0">
  <div class="trigger green">Trigger</div>
  <div class="expandable green" data-id="klappMenue_#contentDashboard_0" style="display: none;">Opened</div>
</div>

Titel: Antw:Benötige JS-Hilfe bei eigenem "klappMenu" Widget
Beitrag von: fhainz am 17 März 2018, 13:31:58
Hast du noch einen Tipp für mich? Ich glaube ich komme alleine nicht darauf woran es liegt  :-[
Titel: Antw:Benötige JS-Hilfe bei eigenem "klappMenu" Widget
Beitrag von: setstate am 17 März 2018, 21:48:02
ich hatte übersehen, dass find() innerhalb sucht. Also muss man erst eine Ebene hoch, damit der Selektor funktioniert.


var trigger = elem.parent().find('[data-wgid="' + elem.wgid() + '"] > .trigger');
            var expandable = elem.parent().find('[data-wgid="' + elem.wgid() + '"] > .expandable');


Ausserdem musst du Groß/Kleinschreibung beim Widgetname stringent einhalten, im Widget-Code selbst (z.B.


var Modul_klappmenue = function () {
...
    var me = $.extend(new Modul_widget(), {
        widgetname: 'klappmenue',


und bei der Benutzung


<div data-type="klappmenue">


und beim Filename
Titel: Antw:Benötige JS-Hilfe bei eigenem "klappMenu" Widget
Beitrag von: fhainz am 17 März 2018, 23:11:54
Danke! So funktioniert es!
Den filename hab ich auch korrigiert!

Grüße