2010-09-21…23 VBorderPanel und Layout-Editor

Bin noch immer mit den Grids in der vbox dran. Es war nicht leicht, Lino dazu zu bringen, dass der generierte Code das neue VBorderPanel dann auch korrekt benutzt…

Ich sollte unbedingt mal anfangen, automatisierte test cases zu schreiben für diese Layout-Probleme.

Das passt zusammen mit dem Plan, Layouts online ändern zu können ohne Server-Restart.

22.09.

Also ran an den Speck. Lino geht in Vollnarkose.

In einem ersten Schritt will ich die Layouts komplett aus dem Python-Code raus verlagern. Also die Layouts wären dann gar keine Python-Klassen mehr, sondern einfache Strings. Denn das Feature der Vererbbarkeit von Layout-Elementen erweist sich als unpraktisch und unwichtig.

23.09.

10.20 Uhr. Na das ging ja noch relativ flink: Check-in.

Layouts sind jetzt keine Actors mehr, sondern werden mit der class method reports.Report.add_detail definiert. Wobei der Parameter desc die wichtigste Neuerung ist: es ist jetzt ein einziger String, den ich mit einem primitiven selbstgemachten Parser interpretiere.

Also statt:

class ProjectDetail(layouts.DetailLayout):
    datalink = 'projects.Project'
    main = """
    name type
    started stopped
    text
    """

Mach ich:

Projects.add_detail(desc="""
main =
    name type
    started stopped
    text
""")

Hier noch ein komplexeres Beispiel:

main =
  intro_box
  address_box
  bottom_box

intro_box = box1 box2
address_box = box3 box4 box5
bottom_box = remarks:70 image:30

box1 = last_name first_name:15 title:10
box2 = id language
box3 =
  country region
  city zip_code:10
  street:25 street_no street_box
  addr1:40

box4 =
  email:30
  phone
  fax
  gsm

box5 =
  url:30
  bank_account1
  bank_account2
  gesdos_id

Syntax-Regeln: Leere Zeilen werden ignoriert. Felder und SlaveReports stehen als Elemente automatisch zur Verfügung und brauchen nicht definiert zu werden. Mit NAME = WERT wird ein neues Element definiert, das dann ein Panel wird. NAME muss ein neuer Name sein. WERT is a space-delimited List of element names. Es muss ein Element namens main definiert werden. Man kann beliebig viele sonstige Elemente definieren. Zeilen, die mit Whitespace beginnen, sind Fortsetzungen einer zuvor begonnenen Definition.

11.15 Uhr : Der Permalink eines mehrtabbigen Details enthält jetzt auch den aktiven Tab. Super. Check-in.

24.09.

Bisher wurde die lokale Report-Konfigurationsdatei in ExtUI.save_grid_config generiert. Das wird jetzt in Report.save_config gemacht, weil da jetzt auch die detail_layouts rein kommen. Neue URL mit Methoden GET und PUT und Parameter tab

Die Operation ist fast fertig: Detail-Fenster haben jetzt einen Button “Layout Editor”, wenn man darauf klickt kommt ein Fenster mit einem Texteditor, der das Layout (das des aktuellen Tabs) zum Bearbeiten anbietet. Der Editor kriegt dieses Layout mit GET /layout_config/contacts/Persons?tab=X. Und wenn man auf Save klickt, macht er ein PUT zur gleichen Adresse, der Server speichert das in der Report-Konfigurations-Datei und generiert dann seinen site.js neu. Der Save-Button schließt das Editorfenster und lädt document.location neu, damit man gleich das Resultat sehen kann. Super! Ich kann beruhigt ins Wochenende gehen. Check-In.

TODO:

  • Der Layout-Editor wird noch nicht mit dem richtigen tab-Parameter aufgerufen.
  • Das Neuladen funktioniert noch nicht. Er generiert zwar die site.js neu, aber die hat die Änderung noch nicht mitbekommen.