= [20100414 ←] [20100421 17.-21.04.2010] [20100422 →] =

Die Umstellung auf RESTful ist überraschend aufwändig, und das frustriert mich. Es lohnt sich auch nicht, darüber viel zu schreiben, weil es echt Schlammschipperei ist. Trotzdem bin ich motiviert und hoffe, dass das bald wieder vorbei ist.

20.04. abends:

Uff: die neue URL-Struktur scheint jetzt ([http://code.google.com/p/lino/source/detail?r=753a477a2a0f64b1a463ee57a990886aadd51fb2 revision 753a477a2a]) im Großen und Ganzen zu funktionieren. Einiges an Kleinarbeiten ist noch zu tun, bevor die Funktionalität von vor der großen Lawine wieder hergestellt ist…

21.04.

Zuerst in der lino.js : die Verwaltung von Slave-Fenstern macht noch gelegentliche JS-Fehlermeldungen. Außerdem wird die PDF-Action noch nicht ausgelöst. Die success-Funktion in WindowWrapper.setup_child und Lino.do_action sind teilweise doppelt gemoppelt.

Es gibt Toggle-Slave-Fenster und einfache Slave-Fenster. Erstere müssen den Toggle-Button in ihrem Master kennen, um ihn wieder einschalten zu können, wenn sie durch ihr eigenes close-Tool geschlossen werden. Insert wird ein einfaches Slave-Fenster ohne Toggle sein. Der Master soll alle seine Slaves (auch die nicht toggelnden?) schließen, wenn er geschlossen wird.

Ich kann es auch einfacher machen: ein Insert-Fenster wird nicht geschlossen, wenn der Master geschlossen wird. Dann wären alle Slaves automatisch Toggle-Fenster (d.h. Detail, GridSlaves und Properties).

PDF ist keine Aktion, die ein (Unter-)Fenster öffnet, sondern sie macht ein Redirect zur URL, unter der die pdf-Datei steht (je nach Browsereinstellung bedeutet das ein neues Browser-Fenster oder ein Dialog zum Runterladen der Datei).

Delete sollte je nach Konfiguration des Reports entweder vorher bestätigen oder nicht. Also beim Klicken des Buttons sollte ein Ajax-Request GET /contactsz/Persons/delete.act rausgehen, der z.B. folgendes zurück gibt:

function(caller) {
  if Ext.confirm("Are you sure?") {
    Lino.do_action(caller,
      'DELETE','/api/contacts/Persons',{selection=caller.get_selected()}
    )
  }
}

Momentan gibt z.B. /api/contacts/Persons/projects.act folgendes zurück:

{
  success: true, ...
  open_window: function(caller) { return new Lino.GridSlaveWrapper(caller,{...});}
}

Und Lino.do_action bzw. setup_child machen:

if (result.show_window) {
  var ww = result.show_window(caller);
  ww.show();
}

Das ist ziemlicher Quatsch. Transparenter wäre ein System im Stil:

{
  success: true, ...
  js_code: function(caller) {
    caller.show_slave('projects',new Lino.GridSlaveWrapper(caller,{...}));}
}

und in Lino.do_action bzw. setup_child dann einfach:

if (result.js_code) result.js_code(caller);

js_code ist einfach eine Funktion, die mit einem einzigen Parameter ‘caller’ aufgerufen wird. Ein GridSlaveWrapper kann dann natürlich nicht funktionieren wenn es vom Hauptmenü aus gestartet wird (wo der caller undefined ist).

Wichtig ist zu bedenken, dass /api/contacts/Persons/projects.act natürlich nur einmal aufgerufen werden muss. Deshalb ist Lino.toggle_button_handler da. Der schaut momentan nach, ob der Master-WindowWrapper schon ein Attribut namens ‘projects’ hat. Wenn ja, dann ist das nämlich der zuvor generierte GridSlaveWrapper, der inzwischen geschlossen (d.h. versteckt) worden war und lediglich ein show() angefragt kriegt.