13.04.2010 ============= Weiter mit Issue 119 (remove lino.dialogs). Hier die Punkte, die ich heute hoffentlich schaffe: # Bei Delete oder PDF sagt er "No selection. Nothing to do." auch wenn man eine Zeile markiert hat. # "Insert" funktioniert noch nicht. # "Properties" und "Detail" öffnen sich zwar, aber haben keinen Titel. # "Properties" und "Detail" werden nicht aktualisiert, wenn man in der Grid einen Record anklickt. # permalink funktioniert nicht, weil die default_action ('grid') jetzt im URL stehen muss. # Namenskonvention zum Speichern der Fensterkonfigurationen ist noch durcheinander. Beim Arbeiten stören mich aber noch einige aufdringliche Fragen: Mir ist noch nicht ganz klar, wie ich die URLs strukturieren soll. Meine Reports (bzw. Actors) entsprechen den "Resources" im RESTful-Modell. Wie aber werden meine "Actions" mit denen aus dem RESTful-Modell gemappt? Arten von Fenstern: * Hauptfenster mit Menü * GridMaster * DetailSlave * GridSlave * Properties * Insert (todo) Arten von Actions: * lino.reports.GridEdit * lino.reports.InsertRow * lino.reports.DeleteSelected * lino.reports.DetailAction * lino.reports.SlaveGridAction * lino.reports.PropertiesAction * sales.invoices.Sign * documents.utils.AsPdf Lino benutzt folgende Arten von Responses: * JS-Code, den der Client ausführen soll * Daten im JSON-Format * Daten im CSV-Format Jede Action (außer die default_action) erzeugt im GridMaster-Fenster einen entsprechenden Button. Die Buttons eines Slave-Fensters, sind Toggle-Buttons. Beim ersten Klicken auf so einen Button wird per Ajax der JS-Code zum Erstellen des Slave-Fensters angefragt und ausgeführt, und das resultat wird im WindowWrapper des Masters (callers) gespeichert. Wenn man das Slave-Fenster schließt, dann wird es nur versteckt. Und wenn man es dann nochmals öffnet, ist kein Ajax-Call mehr nötig, weil es schon existiert. Ein Report kennt die Actions, die er anbietet. Die folgenden URLs scheinen mir klar: - POST /contacts/Persons (name=foo,...) - PUT /contacts/Persons (pk=1,name=foo,...) - DELETE /contacts/Persons (selected=1,2,3) - GET /contacts/Persons.json oder GET /contacts/Persons?fmt=json -> Daten als JSON - GET /contacts/Persons.csv oder GET /contacts/Persons?fmt=csv -> Daten als CSV Unschlüssig bin ich noch bei den URLs, die JS-Code zurückgeben sollen: - GET /contacts/Persons - GET /contacts/Persons/insert oder GET /contacts/Persons?action=insert - GET /contacts/Persons/delete - GET /contacts/Persons/detail - GET /contacts/Persons/projects Müsste nicht auch jedesmal ein `fmt=extjs` mit gegeben werden, weil Lino ja nicht unbedingt nur mit ExtJS-clients funktionieren soll? Es könnte z.B. auch `GET /contacts/Persons?fmt=txt` geben, die reinen Text zurückgibt. Also am klarsten scheint mir ein einziges URL `GET /contacts/Persons`, das zwei wichtige Parameter `action` und `fmt` kriegen muss. Muss? Ich könnte für beide Parameter auch Default-Werte vorsehen, aber das wäre weniger klar. Wenn beide Parameter obligatorisch sind, dann kann ich sie auch gleich über den Patch angeben: `GET /contacts/Persons/.` Mit anderen Worten: - GET /contacts/Persons/grid.js - GET /contacts/Persons/insert.js - GET /contacts/Persons/delete.js - GET /contacts/Persons/detail.js - GET /contacts/Persons/projects.js Statt `GET /contacts/Persons/projects.js` wäre es irgendwie logischer, gleich `GET /projects/ProjectsByPerson/grid.js?mk=1` anzufragen. Dann müsste `GET /contacts/Persons/pdf.js` wohl auch ersetzt werden durch `GET /documents/AsPdf.js ?mt=1&mk=2`. Oder `GET /contacts/Persons/invoices/grid.js` durch `GET /sales/InvoicesByPerson/grid.js`. Aber ist es nicht verwirrend, wenn manche Actions keine eigene URL haben? Nee, dann ist es schon besser, dass nur Master-Reports eine URL kriegen. Das hieße aber wiederum, dass Slave-Reports gar keine Actors zu sein brauchen. Oder zumindest kein eigenes URL brauchen. Also `/projects/ProjectsByPerson/` müsste dann einen 404 zurückgeben. Was ist mit InvoicesByJournal? Das ist ein Slave-Report mit festem Master. Also der muss ein eigenes URL kriegen.