Uitgebreid Zoeken

From A-Eskwiki
Revision as of 00:00, 7 February 2019 by Timb (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search


In het nieuwe Uitgebreid Zoeken kunnen gebruikers hun eigen kwerries samenstellen door sleuren en pleuren. Dit wordt dan op de server omgezet tot een SQL-query, die op de database uitgevoerd wordt, en waarvoor vervolgens de juiste weergave gekozen wordt. De zoekkwerrie wordt overgestuurd als een JSON-object, als een soort fancy s-expressie.

Front-end: sleuren en pleuren

We gebruiken de Javascriptlibrary HTML5 Dropzone, die een fijne wrapper geeft om de sleur-en-pleurfunctionaliteit in HTML5. Je hebt hier een niet al te antieke browser voor nodig dus. Voor elk soort item die de gebruiker in de query kan doen, maken we een template aan (iets met class "zoek-item"), die de gebruiker kan kopiëren naar gaten (iets met class "zoek-gat") in de query. Deze gaten worden dan gevuld met (maar niet vervangen door) kopietjes van dit item. In dit item mogen ook weer gaten voorkomen, bijvoorbeeld voor de "EN"- en "OF"-operatoren. Omdat we gaten niet vervangen, hebben we ook replacement-functionaliteit: wil je een item vervangen met een ander item, dan pleur je het nieuwe item over het andere item heen. De eventhandlers van het gat zorgen ervoor dat de vervanging goedgaat. De hele state van de query wordt in de structuur van de html-elementen opgeslagen, zodat er niets gedesynct wordt. Een nadeel is dat je niet al te veel fancy's kunt doen met de opmaak, want we gaan ervan uit dat de kwerrie eruit ziet als een .zoek-gat-element met als (direct) kind precies 1 .zoek-root-element, met als (direct) kind een aantal .zoek-gat-elementen, etc. In feite is de hele structuur niets meer dan een s-expressie met pretentie.

De notatie die we nu gaan aanhouden: als je een item hebt met een paar (oningevulde) gaten, schrijven we die op als (zoektype ? ? ... ?), en als er een paar gaten zijn ingevuld, wordt het bijvoorbeeld (en (of (vakid) ?) (niet (actief)))

Op dit moment werkt het verplaatsen van al geplaatste items nog niet heel netjes: bij het pleuren wordt namelijk alleen een nieuw item gemaakt van de wortel van hetgeen wat je sleept. Een kopie van (en (vakid) (actief)) ziet er dus uit als (en ? ?), niet (en (vakid) (actief)).

Om formvelden binnen items te ondersteunen (denk aan "lid sinds <datum>"), kunnen items ook een dict attrs van extra waarden, naast de invulling van gaten, meedragen. In de HTML worden deze weergegeven als attributen van de vorm data-zoek-*, zodat data-zoek-bla overeenkomt met een key bla in de attrs. Je moet in Javascript ervoor zorgen dat deze bij elke update van het formveld dit in de attributen geupdate wordt.

Serialisatie

TODO: documenteer dit

Itemsoorten

TODO: documenteer dit