Project @ iMath: Issueshttps://project.math.uzh.ch/https://project.math.uzh.ch/favicon.ico?16668783892019-09-16T09:12:59ZProject @ iMath
Redmine QFQ - Feature #9136 (New): Create ZIP files with dynamic PDFshttps://project.math.uzh.ch/issues/91362019-09-16T09:12:59ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>In #7259 fragt MH nach einen Buld Download fuer die Gesuche.</li>
<li>Check ob man das in QFQ 'on the Fly'-rendern lassen koennte.</li>
<li>Vermutlich wird ein Progress Bar benoetigt.
<ul>
<li>Der koennte sich dynamisch anpassen.: Z.B. 20 Quellen, die erste braucht 5 Sekunden, dann benoetigen alle etwa 100 Sekunden.</li>
<li>Das koennte aber auch via Anzahl Quellen angezeigt werden.</li>
</ul></li>
</ul>
<ul>
<li>Koennte gut zusammen mit dem allgemeinen Umbau Progressbar <a class="issue tracker-2 status-2 priority-2 priority-default overdue behind-schedule" title="Feature: Progress Bar generic / replace old hourglass download popup (In Progress)" href="https://project.math.uzh.ch/issues/9135">#9135</a> gemacht werden.</li>
</ul> QFQ - Feature #9128 (New): Error Message: not replaced variables- a) replace back to '{{', b) und...https://project.math.uzh.ch/issues/91282019-09-14T09:50:32ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Im Feld SQL-Final Feld sind teilweise die '{{' u. '}}' nicht zurueck uebersetzt. Das machen.</li>
<li>Nicht ersetze Variablen bei SQL Final rot unterstreichen.</li>
</ul> QFQ - Feature #8962 (New): allow for form fields with identical nameshttps://project.math.uzh.ch/issues/89622019-08-29T19:41:37ZNicola Chiapolini
<p>We have a form with three Action-Elements all pointing to the same column. Each of them calculates the value based on a different dynamic-update form-field (restricted via requiredList).<br />This works perfectly, but I need to adjust the name directly in the database...</p>
<p>Could this check be removed? (At least for action elements, but I can imagine this to be useful even with native dynamic-update elements.)</p> QFQ - Feature #8719 (New): extraButtonLock: add support for 0/1https://project.math.uzh.ch/issues/87192019-07-12T12:00:10ZCarsten Rosecarsten.rose@math.uzh.ch
<p>extraButtonLock hat aktuell keinen Support fuer 0/1.</p>
<p>Sobald 'extraButtonLock' angegeben ist, ist es aktiv.</p> QFQ - Feature #8336 (New): Form > modified > Close|New: a) Optional disable popup, b) custom text...https://project.math.uzh.ch/issues/83362019-05-14T16:48:53ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Das Popup oeffnet sich wenn das Form 'dirty' ist und auf <strong>close</strong> oder <strong>new</strong> gedrueckt wurde.</p>
<p>Configure via SYSTEM & Form.</p>
<p>a) enable/disable popup. By default enable, can be switched off (unlikely).<br />b) custom text: Message & Buttons<br />c) mode on save: close|stay.</p> QFQ - Feature #8217 (New): if-elseif-else constructhttps://project.math.uzh.ch/issues/82172019-04-16T13:59:06ZNicola Chiapolini
<p>Prio2 für Nicola</p>
<p>Da if-elseif-else situationen ziemlich häuffig vorkommen, wäre es schön, wenn QFQ das direkt anbieten würde und wir nicht jeweils ein Pseudo-Query schreiben müssten.<br />(Intern könnte das aber natürlich problemlos über ein Pseudo-Query gelöst werden).</p>
<p>Mein Vorschlag für die Syntax wäre:</p>
<pre><code><code>10.if = "{{feUser:TE:alnumx:s}}"="nchiapol" <br />10 {<br />1.sql = SELECT shortname, mail FROM persons_ldap<br />[...]<br />}<br />11.elseif = "{{feUser:TE:alnumx:s}}"="crose" <br />[...]<br />12.else<br />[...]</code></code></pre>
<p>sollte identisch sein mit</p>
<pre><code><code>10.sql = SELECT 1 AS _ FROM (SELECT "") AS fake WHERE ("{{feUser:TE:alnumx:s}}"="nchiapol") LIMIT 1<br />10.1.sql = SELECT shortname FROM persons_ldap<br />[...]<br />11.sql = SELECT 1 AS _ FROM (SELECT "") AS fake WHERE NOT ("{{feUser:TE:alnumx:s}}"="nchiapol") AND ("{{feUser:TE:alnumx:s}}"="crose") LIMIT 1<br />[...]<br />12.sql = SELECT 1 AS _ FROM (SELECT "") AS fake WHERE NOT ("{{feUser:TE:alnumx:s}}"="nchiapol") OR ("{{feUser:TE:alnumx:s}}"="crose") LIMIT 1<br />[...]</code></code></pre>
<p>Falls für if-elseif-else statt 10-11-12 drei mal 10 verwendet werden kann, wäre das natürlich noch eleganter. Aber ich glaube schon diese Lösung wäre ein grosser Fortschritt.</p>
<p>Vorteile: * viel intuitivere Syntax * leichter lesbar * falls später Probleme entdeckt werden, können diese Zentral behoben werden.</p>
<p>Use Cases von Nicola: <a class="attachment" href="https://project.math.uzh.ch/attachments/3804">use-cases_conditions-functions.txt</a></p> QFQ - Feature #8204 (New): Position 'required mark'https://project.math.uzh.ch/issues/82042019-04-15T11:35:32ZCarsten Rosecarsten.rose@math.uzh.ch
<p>labelcolumns=0 oder label=''</p> QFQ - Feature #8089 (New): Copy/Paste for FormElementshttps://project.math.uzh.ch/issues/80892019-03-19T12:03:07ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Wir brauchen dringend die Moeglichkeit einzelne FormElemente kopieren zu koennen.</li>
<li>Ueber Form-Grenzen hinweg.</li>
</ul>
<p>Subrecords:</p>
<ul>
<li>Eine Generische Loesung fuer Subrecords waere gut. Pro Zeile gibt es rechts/links einen Copy Button.</li>
<li>In der Titelzeile des Subrecords gibt es einen Paste Button.</li>
</ul>
<p>Form (optional):</p>
<ul>
<li>Pro Form gibt es einen Copy Button (ersetzt Button Form 'duplizieren'). Der kopiert den aktuellen Record. Ggfs. kann ein Target gewaehlt werden oder ein neuer Formularname oder '.....-copy'</li>
</ul>
<p>Allgemein:</p>
<ul>
<li>Copy Button werden nur angezeigt wenn ein CopyForm hinterlegt ist.</li>
<li>Paste Button werden nur angezeigt wenn ein passender Record in der Zwischenablage ist.</li>
</ul> QFQ - Feature #8082 (New): Contact form without saving recordhttps://project.math.uzh.ch/issues/80822019-03-18T13:13:09ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Fuer z.B. Kontaktformulare waere es sinnvoll wenn man eine Form konfigurieren koennte das keinen Record speichert.</p>
<p>Z.B. in dem man keine Primary Table spezifiziert.</p>
<p>Das gleiche koennte man in einem Passwort Reset Form benoetigen (#7164).</p> QFQ - Feature #7924 (New): Radio/Checkbox with Tooltiphttps://project.math.uzh.ch/issues/79242019-02-21T09:16:45ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Es sollte einfach moeglich sein tooltips auf einzelene Radios/Checkboxen zu legen:</p>
<p>Test wie sich das mit dem Tooltip pro FE verhaelt.</p>
<p>key:value:tooltip</p> QFQ - Feature #7920 (New): FE: Syntax Highlight, Zeinlenumbruchhttps://project.math.uzh.ch/issues/79202019-02-20T15:48:33ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Im FormEditor ist es sehr muehsam ohne Syntax Highlight und ohne Zeilenumbruch (SQl Query auf mehrere Zeilen verteilen) arbeiten zu muessen.</p> QFQ - Feature #7850 (New): Upload records: non 'pathFileName' columnhttps://project.math.uzh.ch/issues/78502019-02-10T08:15:31ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Bei Forkred koennen wir fuer Uploads nur mit Aufwand eine Spalte mit dem Namen 'pathFileName' definieren. Besser waere wenn wir den bestehenden Spaltenamen 'note' verwenden koenenn.</p>
<p>Problem:</p>
<ul>
<li>Beim loeschen des Records via Formular muss geprueft werden ob eine Datei existiert die auch geloescht werden muss. Das muesste einfach sein, dann anhand des fe.type=upload weiss man welche Spalten einen pathFileName enthalten.</li>
<li>Bei Advanced Upload wird es schwieriger - evtl. ist ein neuer Bezeichner 'fileDelete=table|column|id' eine Alternative.</li>
<li>Bei '... AS _paged' muss ein Form angegeben werden das nach fe.type=upload elementen sucht. Diese Spalten werden dann auf Dateien geprueft.</li>
</ul> QFQ - Feature #7812 (New): FE 'Subrecord' - new option 'subrecordShowFilter', 'subrecordPaging'https://project.math.uzh.ch/issues/78122019-02-05T10:58:00ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Wird die Option angezeigt wird automatisch der tablesorter Filter angezeigt.</li>
<li>Alternativ kann eine Zahl angegeben werden. Sobald die Anzahl der Records >=der Zahl ist, wird der Filter eingeblendet.</li>
<li>Eine Option 'subrecordPaging'</li>
</ul> QFQ - Feature #7683 (New): Special column names in '{{ SELECT ... AS _link }}' should be detectedhttps://project.math.uzh.ch/issues/76832019-01-19T13:51:40ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Aktuell ist es nur moeglich '{{ ... AS _link}}' zu schreiben. Gut waeren auch alle anderen Links.</li>
<li>Liefert das Select mehr als ein Record und hat Special Columnnames, sollten diese alle einzeln gerendert werden - damit koennte man im Titel eines Forms mehrere Buttons erzeugen, z.B. beim IK Tool Links auf beliebig viele alte Antraege.</li>
</ul> QFQ - Feature #7681 (New): Optional switch off 'check for modified record'https://project.math.uzh.ch/issues/76812019-01-19T09:41:20ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Aktuell wird in Form bei 'aquireLock' geprueft ob sich der Record zwischen FormLoad und FirstChange veraendert hat.</p>
<p>Es waere gut wenn man den Check pro Form abschalten koennte, besser noch wenn man die Spalten definieren koennte, die zu einem Check herangezogen werden.</p>
<p>checkModified=off|*|id,name,modified,...</p>
<p>Grund: es koennte die Situation geben das eine Spalte veraendert wurde, dies aber keinen Einfluss auf das Formular hat. Dann waere es unguenstig wenn es keine Moeglichkeit gaebe den Check abzuschalten.</p> QFQ - Feature #7602 (New): Multi Select: with checkboxeshttps://project.math.uzh.ch/issues/76022019-01-04T19:25:18ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Fuer Mult-Select waere es gut, wenn QFQ pro Item, eine Checkbox anbieten koennte. Siehe Screenshot von Redmine.</p>
<p><a class="external" href="https://codepen.io/elmahdim/pen/hlmri">https://codepen.io/elmahdim/pen/hlmri</a></p> QFQ - Feature #7521 (New): TemplateGroup: fe.type=uploadhttps://project.math.uzh.ch/issues/75212018-12-20T16:45:56ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Aktuell werden in TemplateGroups keine File Upload Felder unterstuetzt.</p>
<p>Das sollte implementiert werden oder zumindest verhindert werden das man das im FormEditor konfiguieren kann.</p> QFQ - Feature #7520 (New): QR Code: ... AS _qr (... AS _link) https://project.math.uzh.ch/issues/75202018-12-20T16:40:21ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Als link() implementieren.</li>
<li>Diverse Typen: URL, Contact, Termin, WLAN ...</li>
<li>Optional: zum auf/zuklappen oder via mouse over?</li>
</ul> QFQ - Feature #7519 (New): Select: Multihttps://project.math.uzh.ch/issues/75192018-12-20T16:30:01ZCarsten Rosecarsten.rose@math.uzh.ch
<p>BBe benoetigt eine Select Liste mit 'Multi select' Moeglichkeit</p>
<p>Bsp: Aus einer Liste mit 30 Elementen sollen 5 ausgewaehlt werden.</p> QFQ - Feature #7342 (New): add content = hide_thishttps://project.math.uzh.ch/issues/73422018-11-23T10:19:19ZNicola Chiapolini
<p>When using a super-/subquery combination as an if-then construct, I want to hide the content of the super-query but show the result of sub-queries. At the moment this is not possible with the <code>content</code>-keyword. It would be nice to have the option to not hide the subqueries.</p>
<p>Personlly I would think it most logical to make this the default for <code>hide</code> and use e.g. <code>hide_all</code> to include subqueries. For backwards compatibility however, the new behaviour should probably get the new keyword. I suggest something like <code>hide_this</code></p> QFQ - Feature #7336 (New): PDF Upload: disallow PDFs with specific Meta informationhttps://project.math.uzh.ch/issues/73362018-11-22T15:49:01ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Es waere gut wenn man den Upload von PDF's ablehnen koennte, konfigurierbar pro Problemfall.</li>
<li>Beispiel: das folgende PDF ist im A0 Format und Creator ist 'Drawboard PDF'<br /><pre>
Title: New Document
Author: Claudio Broger
Creator: Drawboard PDF
Producer: Drawboard PDF
CreationDate: Sun Nov 18 10:38:02 2018
ModDate: Tue Nov 20 17:49:23 2018
Tagged: no
UserProperties: no
Suspects: no
Form: none
JavaScript: no
Pages: 6
Encrypted: no
Page size: 2384 x 3370 pts (A0)
Page rot: 0
File size: 4162449 bytes
Optimized: yes
PDF version: 1.7
</pre></li>
</ul>
Vorschlag:<br /><pre>
# Beispiel, Es kann nur einmal pdfInfoDeny anagegeben werden
pdfInfoDeny=Creator:Drawboard PDF
pdfInfoDeny=Page size:(A0)
pdfInfoDeny=Creator:Drawboard PDF,Page size:(A0)
pdfInfoDeny=Creator:Drawboard PDF,Page size:(A0)|Creator:Microsoft Office 365|...
pdfInfoMessage=Note zu Bedingung 1|Note zu Bedingung 2| ...
</pre>
<ul>
<li>Die mit '|' getrennten Strings werden einzeln getestet (||). Damit koennen mehrere Bedingungen angegeben werden.</li>
<li>Die mit ',' aufgefuehreten Elemente muessen alle erfuellt sein, damit 'Deny' erkannt wird (&&).</li>
<li>Soltle pdfInfoMessage nicht genuegend Elemente enthalten wird das erste Element genommen.</li>
</ul> QFQ - Feature #7280 (New): recently used tablehttps://project.math.uzh.ch/issues/72802018-11-18T08:55:10ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Neue Tabelle 'RecentlyUsed'</li>
<li>Wird bei formLoad (!) automatisch gefuellt.</li>
<li>Columns
<ul>
<li>feUser, (cookie falls kein feUser eingeloggt)</li>
<li>form</li>
<li>table</li>
<li>recordId</li>
<li>misc (z.B. 'switchUser')</li>
</ul></li>
</ul> QFQ - Feature #7175 (New): Upload: md5 hash as filenamehttps://project.math.uzh.ch/issues/71752018-11-05T16:59:00ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Fuer w3/my wird eine Funktion benoetigt, das ein Student nicht ausversehen zweimal die gleiche Datei hochlaedt.</li>
<li>Theoretisch koennte es auch moeglich, das Dateien mit unterschiedlichem Dateinamen identisch sind.</li>
<li>Eine Loesung waere ueber den Dateiinhalt einen MD5 Hash zu erzeugen und die Datei dann mit dem hash als Namen zu speichern (fileReplace=no).</li>
<li>Vorschlag:
<ul>
<li>Neue Option im Upload FE: `fileNameMD5= filename+TimeStamp | content`</li>
</ul></li>
</ul>
<ul>
<li>Netter Nebeneffekt: aus dem Dateinamen kann nicht erkannt werden worum es im Inhalt geht.</li>
<li>Es muesste eine neue STORE_VARS variable definiert werden: 'md5'</li>
<li>In fe.paramter.fileDestination = fileadmin/uploads/{{md5:V}}</li>
</ul> QFQ - Feature #7119 (New): Upload: scaleDownWidth, scaleDownHeighthttps://project.math.uzh.ch/issues/71192018-10-28T09:51:51ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Bei Pixel Bildern die hochgeladen werden, waere es gut wenn man eine maximale Breite/Hoehe angeben kann.</p> QFQ - Feature #7109 (New): Dynamic Updates: row/element hidehttps://project.math.uzh.ch/issues/71092018-10-27T10:04:10ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Erkennung ob ein oder mehrere Elemente per ROW anhand og im FE 'row' und '/row' aktiv sind.</li>
<li>FE.parameter 'modeHide' kontrolliert ob nur das element ausgeblendet werden soll, oder die ganze row.
<ul>
<li>modeHide=row|element
<ul>
<li>default bei row mit einem element: row</li>
<li>default bei row mit mehreren elemente: element</li>
</ul></li>
</ul></li>
</ul>
<ul>
<li>row, ein element
<ul>
<li>ganze zeile kann ein/ausgeblendet werden.</li>
</ul></li>
</ul>
<ul>
<li>row, mehrere elemente
<ul>
<li>einzelne elemente koennen ein/ausgblendet werden (by default bleibt die ganze row sichtbar)</li>
<li>das erste element der row bestimmt die htmlId der ganzen row</li>
<li>falls beim ersten element ein flag gesetzt ist: bestimmt dieses element ob die ganze row ein/ausgeblendet werden soll.</li>
</ul></li>
</ul>
<ul>
<li>Es ist wichtig, das elemente, die ein und ausgeblendet werden sollen, durch QFQ in col-md gewrapped werden. Das impliziert das nicht mehrere FE einer col-md gruppe ein/ausgeblendet werden koennen.</li>
</ul> QFQ - Feature #7102 (New): Comment sign in report: '#' and '--'https://project.math.uzh.ch/issues/71022018-10-27T08:55:24ZCarsten Rosecarsten.rose@math.uzh.ch
<p><a class="external" href="https://www.w3schools.com/Sql/sql_comments.asp">https://www.w3schools.com/Sql/sql_comments.asp</a></p>
<ul>
<li>Laut SQL Spec kann '--' am Zeilenanfang, aber auch mitten in der Zeile stehen.</li>
<li>Wenn es im SQL Statement steht, wird SQL das haendeln und alles richtig machen</li>
<li>Steht es am Zeilenanfang, sollte QFQ den Rest gar nicht parsen.</li>
<li>Atom unterstuetzt mit Ctl-/ das auskommentieren via '--' am Zeilenanfang</li>
<li>'/*' ist fuer den QFQ Parser schwer umzusetzen - es SQL daher ueberlassen. In QFQ Doku darauf eingehen.</li>
</ul> QFQ - Feature #7099 (New): FormEditor > subrecord FE: list FE according their nesting in containerhttps://project.math.uzh.ch/issues/70992018-10-27T08:42:10ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>In der Liste der FormElemente sollen die FE Records vom Typ 'Container' ('pill/fieldset/template-group') automatisch direkt ueber den nativen FEs angezeigt werden.</li>
<li>Beim Speichern eines FE's wird der ORD Wert automatisch korrekt gesetzt.</li>
<li>Es ist nicht noetig in der ORD Spalte die ParentChild Bedingung abzubilden, wenn sichergestellt ist das die 'ord' immer gemaess der aktuellen Hierarchie gesetzt wird. Dazu gehoert das ein manuell gesetzte ORD Wert angepasst wird.</li>
<li>FYI: Vermutlich werden wir nie eine Verschachtelungstiefe > 5 erreichen: Form>Pill>Fieldset>TemplateGroup>FE</li>
<li>Wird ein Sub Element per Drag'n'Drop nach ausserhalb des aktuellen Containers verschoben, sollte das FE die containerId des FE bekommen auf dem es gedroppt wurde.</li>
<li>Wird ein Container verschoben, werden alle Childs ebenfalls angepasst - innerhalb des Containers bleibt die Reihenfolge bestehen.</li>
<li>Die hierachiesche Logik koennte vermutlich erkannt/respektiert werden in dem ein neues Keyword definiert wird: <code>FE.parameter.ordColumnHierarchy=feIdContainer</code>. Sobald dieser Parameter gesetzt ist, wird auf die Hierachie Ruecksicht genommen und das Renumbering via PHP entsprechend durchgefuehrt.</li>
<li>Wird manuell eine 'ord' gesetzt, kann dadurch der aktuelle Container nicht verlassen werden.
<ul>
<li>Das Feld "ord" bekommt dynamisch berechnete min/max Werte: min=outercontainer.ord, max=nextoutercontainer.ord-1. Diese Funktion ist optional. Auch wenn min/max nicht gesetzt werden sollte das setzen von 'ORD' nur in den erlaubten Grenzen moeglich sein. Dazu muss dem Detail Form vermutlich mitgeteilt werden (Aufruf erfolgte via einem Subrecord aus dem 'Form'-Form) das die Begrenzung auf dem aktuellen Container beizubehalten ist.</li>
<li>Damit koennen nur ord Werte gesetzt werden, die die bestehende Container Reihenfolge beruecksichtigen.</li>
</ul></li>
</ul> QFQ - Feature #6855 (New): With {{feUser:U}}!={{feUser:T}}: Save / Delete: only possible with {{...https://project.math.uzh.ch/issues/68552018-09-27T20:55:38ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Sollte {{feUser:U}}!='' UND {{feUser:U}}!={{feUser:T}} sein:</p>
<p>- Dann darf speichern nur moeglich sein wenn {{feUserSave:U}}='yes' gesetzt ist.<br />- Dann darf loeschen nur moeglich sein wenn {{feUserDelete:U}}='yes' gesetzt ist.</p>
<p>Hintergrund: damit kann einfach sichergestellt werden das man Dozenten, die die Identiaet eines Users uebernehmen, keine Daten veraendern koennen.</p>
<p>Das Form sollte dann einen disabled 'save', 'delete' Button haben, mit einem Hinweis warum das nicht geht.</p> QFQ - Feature #6765 (New): Moeglichkeit via QFQ eigene Logs zu schreibenhttps://project.math.uzh.ch/issues/67652018-09-19T20:08:48ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Es waere gut fuer das IK Tool ein zentrales Logfile zu haben wer wann was angestossen hat.</li>
<li>Das Logfile sollte via Browser einsehbar sein.</li>
<li>Evtl. ist es auch eine LOG Tabelle. ggfs. Wird die MailLog & JSON FormSubmit Log Tabelle aufgeloest.</li>
</ul> QFQ - Feature #6723 (New): Report QFQ Installation and Versionhttps://project.math.uzh.ch/issues/67232018-09-16T09:25:53ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Es waere gut wenn man eine Uebersicht haette wo welche Installation mit welche QFQ version laufen.</p>
<p>In der Configuration eintragen:</p>
<pre>
serviceReportQfqVersion = https://qfq.io/index.php?id=service&version={{qfqVersion:Y}}[,<next reporting URL>]
</pre>
<ul>
<li>Die Variable {{qfqVersion}} gibt es vermutlich noch nicht.</li>
<li>Der Aufruf erfolgt via wget (nicht via file_get_content, da dort allow_url_fopen benoetigt wird)
<ul>
<li>bei der Erstinstallation </li>
<li>bei jedem QFQ Update</li>
</ul></li>
</ul>
<ul>
<li>Das sollte einfach zu implementieren sein: QFQ checkt die Versionsnummer bei jedem Start, dort koennte der Hook eingbaut werden.</li>
<li>Es koennen mit Komma getrennt mehrere Service URLs angegeben werden - so koennte MNF z.B. ein eigenes Reporting haben und I-MATH bekommt auch was davon mit.</li>
</ul> QFQ - Feature #6609 (New): Formlet: JSON API erweiternhttps://project.math.uzh.ch/issues/66092018-09-04T08:28:51ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Im QFQ 'PROTOCOL.md' ist ein Standard QFQ API mit einigen wenigen Feldern definiert.</p>
<p>Gut waere wenn die folgenden supported waeren:</p>
<p>"status": "success"|"error",<br />"message": "<message>" <br />"redirect": "no" | "url" | "url-skip-history" | "auto" | "close" <br />"redirect-url": "<url>"</p>
<p>Die waeren dann also auf der gleichen (obersten) Ebene wie 'elements'.</p> QFQ - Feature #6602 (New): Inline-Edit (Formlet): in Report auf Mausklick ein mini-form oeffnenhttps://project.math.uzh.ch/issues/66022018-09-02T21:57:01ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Anforderung: im Report soll der User an einer beliebigen Stelle ein Miniform oeffnen koennen (AJAX), ohne das er die Seite verlaesst. </li>
<li>Beispiel:
<ul>
<li>PhpMyadmin</li>
<li>Tabelle in <a class="external" href="https://editor.datatables.net/examples/inline-editing/simple">https://editor.datatables.net/examples/inline-editing/simple</a></li>
</ul></li>
</ul> QFQ - Feature #6594 (New): Excel: on download, check if there is a valid siphttps://project.math.uzh.ch/issues/65942018-08-31T21:55:24ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Um sich vor unerlaubten Zugriff zu schuetzen, kann bei 'XLS?' output getestet werden (qfq content record, special column name), ob der Aufruf via einer SIP erfolgt ist (downloads sind immer via sip encrypted):</p>
<ul>
<li>Sollte die SIP nicht existieren, bricht QFQ ab.</li>
<li>Zum debuggen wird eine Excel export Seite auch direkt aufgerufen. In dem Fall ist womoeglich keine SIP in der URL. Aber dann gibt es einen BE User > die BE existenz autorisiert den Aufruf.</li>
<li>Optional: Die Erlaubnis zum Zugriff sollte nur fuer die erste _XLS? Spalte getestet werden.</li>
</ul>
<ul>
<li>Option: es gibt es ein Flag auf dem QFQ, der den Check ausschaltet: downloadCheckSipExist=0</li>
</ul> QFQ - Feature #6437 (New): Neuer Mode Button bei FormElementenhttps://project.math.uzh.ch/issues/64372018-07-17T13:47:38ZStefan Willi
<p>Es ist verwirrend, wenn man einer der 4 Mode (show, required, readonly, hidden) anwählt und trotzdem bei 'Mode sql' etwas eingibt, dass die Funktionalität der Buttons nicht mehr wirkt.</p>
<p>Kann man nicht ein 5. Button ('custom' oder sowas in der Art) erstellen und das Mode sql Feld als dynamic update nur dann anzeigen, falls man bei 'Mode' custom anwählt?</p> QFQ - Feature #6292 (New): Download: File speichern mit Hash aber original Filename in der Datenb...https://project.math.uzh.ch/issues/62922018-06-22T11:01:47ZBenjamin Baerbenjamin.baer@math.uzh.ch
<p>Die Idee:</p>
<ul>
<li>Datei wird hochgeladen</li>
<li>QFQ speichert die Datei unter md5 hash in einem Ordner (auch ohne Datei Endungen)</li>
<li>QFQ schreibt im Datensatz der auf das file verlinkt auch den original Filenamen rein</li>
<li>Bei korrektem Download ueber die Download API wird der richtige filename aus der Datenbank zurueck geliefert</li>
</ul>
<p>Probleme mit den leserlichen Filenamen ist das diese meist Informationen ueber den Inhalt liefern (bsp: Arztzeugnis_Max_Muster.pdf).</p>
<p>Dies ist natuerlich nur sinnvoll fuer Dateien die sicher gespeichert werden muessen, nicht zB. den Flyer oder ein Bild das direkt auf die Homepage kommt.</p> QFQ - Feature #6289 (New): Form: Loghttps://project.math.uzh.ch/issues/62892018-06-20T21:54:37ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Ziel: der Developer bekommt ein detailliertes Log angezeigt, mit den Deatils was in einem Form alles passiert.</li>
<li>Das Log wird in eine Datei geschrieben.</li>
<li>Ist eine Person im BE eingeloggt, erscheint auf dem Form ein neuer Button, um das Log zu anzuzeigen. </li>
<li>Die Anzeige aktiviert das Log.</li>
<li>Ein Log bleibt max. 30 Minuten aktiv, danach muss es erneut gestartet werden.</li>
<li>Bei jedem Neustart eines Logs, wird das alte Log ueberschrieben.</li>
<li>Ein Form befindet sich im Debug mode, wenn eine Logdatei existiert und juenger als 30 mins ist.</li>
<li>Pro Form gibt es ein:
<ul>
<li>Log all user: <t3>/tmp/form.<formname>.log</li>
<li>Log current user: <t3>/tmp/form.<formname>.<beuser>.log</li>
<li>mit dem 'all user'-Log kann ein Developer einen non-Developer debuggen.</li>
</ul></li>
</ul>
<ul>
<li>Das Log wird via 'monitor' angezeigt.</li>
<li>Evtl. via dem Record, der auch den FormEditor anzeigt. Page 'form'</li>
<li>Aufruf:
<ul>
<li>form=formname&_formLog=logSession</li>
<li>form=formname&_formLog=logAll</li>
</ul></li>
</ul> QFQ - Feature #6261 (New): Persistent SIPhttps://project.math.uzh.ch/issues/62612018-06-18T13:08:14ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Mitunter (z.B. auf Seiten die ohne Login sind) waere es gut wenn 'persistente' SIP's (=SIPP) genutzt werden koennten fuer z.B. Downloads.</p>
<p>Solche SIPPs verfallen nicht (oder zu einem vorgegebenen Zeitpunkt).</p>
<ul>
<li>Variablennamen fuer SIPP: 'S' (grosses S anstelle von kleinem).</li>
<li>Optional kann eine Verfallzeit spezifiziert werden: 'S:<timestamp>'. No limit: 'S' oder 'S:0'</li>
<li>Wird per Report ein Downloadlink fuer so eine Datei gerendert, via " '..|S|..' as _link", wird das in eine 'SipPersistent' Tabelle geschrieben.</li>
<li>Der Parameter 'S' triggert, das der regulaere SIP Store aus der Persistent Table gefuellt wird. Gibt es zusaetzlich ein kleines 's' werden die Stores gemerged. SIP hat Vorrang vor SIPP.</li>
<li>download.php und qfq.php koennen so implizit neu mit den SIPP umgehen.</li>
<li>Option: es kann eine (oder mehrere) FE Group angegeben werden. Die SIPP ist nur dann gueltig wenn die FE Group matcht. Bsp: 'none', 'any','group1', 'group1,group2,...'. Die Gruppe wird via '_feGroup=...' in den URL Parametern uebergeben. Beim fuellen von STORE_SIP kann QFQ die feGroup abfragen und den STORE_SIP ggfs. nicht fuellen.</li>
<li>Ist z.B. ein Download (notiz record) einmal mit so einer SIPP erzeugt worden, bleibt dieser Record via download.php erreichbar.</li>
<li>Es waere gut wenn eine SIPP (z.B. fuer einen Downloadlink), nachdem er verfallen ist und anschliessend neu generiert wird, den <strong>GLEICHEN</strong> Hash erhaelt. Damit koennen Links dann verfallen und regeneriert werden.</li>
<li>Caching create SIPP - wird nicht implementiert, solange es keine Performance Impacts gibt.</li>
<li>Das kopieren einer SIPP von einer QFQ Installation zu einer anderen bringt keinen Erfolg: die SIPP muss in der lokalen SIPP Tabelle existieren.</li>
</ul>
SIPP per User
<ul>
<li>SIPP koennten auch einem User zugeordnet werden. </li>
<li>Die SIPP ist nur gueltig fuer den angegeben User ({{fe_user:UT}}=SipPersistent.feUser)</li>
<li>Anwendung: Links auf dem Dashboard die zu einem spezifischen Antrag gehen (Antrage mit 'heart' zusagen bookmarken).</li>
</ul>
<p>Anwendung:</p>
<ul>
<li>Fuer gewisse Bewerbungen koennen so Links gebaut werden, die man per Mail versenden kann.</li>
<li>Beim Download der Uebungszettel (oeffentlicher Bereich) fuehrt ein Verfall der Session nicht dazu, das die Seite neu geladen werden muss um neue gueltige SIPs zu bekommen.</li>
</ul> QFQ - Feature #5805 (New): TypeAHead SQL value instead of key storedhttps://project.math.uzh.ch/issues/58052018-04-10T13:16:59ZNicola Chiapolini
<p>Ich habe ein Textfeld mit folgenden Parametern:</p>
<p><code><br />typeAheadSql = SELECT shortname AS 'id', CONCAT(firstname, ' ', lastname, ', ', shortname) AS 'value' FROM _right_to_confer_phd WHERE lastname LIKE ? OR firstname LIKE ? or shortname LIKE ? ORDER BY lastname<br />typeAheadSqlPrefetch = SELECT CONCAT(firstname, ' ', lastname, ', ', shortname) AS value FROM _right_to_confer_phd WHERE shortname=?<br />typeAheadMinLength = 1<br />typeAheadLimit = 20<br />typeAheadPedantic = 0<br /></code></p>
<p>Die Suche funktioniert, aber beim Speichern wird der Value (firstname lastname, shortname) statt der id (shortname) gespeichert.<br />Problem scheint, dass JS im hidden Feld den Value statt der id einfügt...</p> QFQ - Feature #5782 (New): NextCloud APIhttps://project.math.uzh.ch/issues/57822018-04-05T14:31:41ZCarsten Rosecarsten.rose@math.uzh.ch
Via QFQ koennen
<ul>
<li>Verzeichnisse und Dateien erzeugt werden, in einem Order der via Nextcloud / Owncloud synchronisiert wird.</li>
<li>Koennen Shares verwaltet werden.</li>
<li>Koennen Aenderungen an Files/Verzeichnissen erkannt werden und eine Reaktion in der Db ausloesen.</li>
</ul>
Beispiel:
<ul>
<li>Via QFQ wird ein neues Nextcloud Verzeichnis angelegt.</li>
<li>In QFQ sind Personen hinterlegt. Diese Personen bekommen eine Freigabe (API). Die Personen werden via API informiert.</li>
<li>Ein QFQ Upload Dialog speichert eine Datei direkt in einem Nextcloud Verzeichnis/Share - dadurch erhalten alle User des Shares direkt Zugriff auf die Datei.</li>
<li>Ein User speichert ein File in einem Share - QFQ erkennt die Aenderung und koennte z.B. einen Import starten.</li>
</ul> QFQ - Feature #5131 (New): Activate Spin Gear ('wait/busy' indicator) via LINK attributehttps://project.math.uzh.ch/issues/51312017-12-16T20:41:30ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Pages die z.B. Mails mit Attachments versenden benoetigen teilweise etliche Sekunden.</p>
<p>Es waere gut wenn man in der Zeit das 'spinning gear' wie beim 'download' Link anzeigen koennte.</p> QFQ - Feature #4869 (New): Dynamic Update (show, hide, readonly?, required?) for Template Group E...https://project.math.uzh.ch/issues/48692017-11-04T10:36:18ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Requested in <a class="issue tracker-1 status-5 priority-3 priority-high3 closed behind-schedule" title="Bug: Dynamic updates Pill - show/hide (Closed)" href="https://project.math.uzh.ch/issues/4865">#4865</a></li>
<li>Die Umsetzung sollte nicht so schwierig sein um eine komplette TG-Group aus/einzublenden.</li>
<li>Ob 'readonly' und 'required' Sinn machen ist nicht klar.</li>
<li>Dynamic Update innerhalb einer TG pro FE ist vermutlich schwierig - wird aber benoetigt (siehe unten)</li>
</ul> QFQ - Feature #4365 (New): Multi Language: new way of config https://project.math.uzh.ch/issues/43652017-09-04T12:40:57ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Vorschlag von Benj</p>
<p>a) config.qfq.ini: mehrere Elemente in einer Zeile ablegen (dann ist es nicht noetig LANGUAGA_A, B...) zu schreiben:</p>
<p>FORM_LANGUAGE = {languages : { id: 1, name:english }, { id: 2, name:spain } }</p>
<p>b) Im Form und FormElement Editor:</p>
<ul>
<li>Nur noch eine Spalte 'languageParameter'.</li>
<li>Pro Eintrag die Spalte mit angeben, durch Punkt getrennt. Bsp:</li>
</ul>
<p>english.label = Firstname<br />spain.label = ....</p>
<ul>
<li>Gibt es nur eine zusaetzliche Sprache, ist es ok den Qualifier 'english.' wegzulassen.</li>
</ul> QFQ - Feature #4250 (New): AutoCron in QFQ via PHPhttps://project.math.uzh.ch/issues/42502017-08-17T20:23:25ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Die AutoCron Features in PHP implementieren, ohne das eine T3 Seite benoetigt wird.</p>
Verbesserungen:
<ul>
<li>Massiv einfacheres Setup.</li>
<li>Evtl. koennte das PHP Skript durch Typo3 Cron aufgerufen werden - dann entfaellt sogar System Console Eintrag.</li>
<li>Aus dem PHP Skript koennen auch Mails versendet werden (kein dediziertes Skript noetig) - damit koennen einfach grId und xId gesetzt werden.</li>
<li>DB Credentials sind in PHP bekannt (zentrale Konfiguration).</li>
</ul>
Neu:
<ul>
<li>AutoCron Formular wird by default mit ausgeliefert.</li>
<li>In T3 Doku ist ein Beispiel QFQ Report fuer CrontEdit aufgefuehrt.</li>
<li>Es gibt Cron.grIdTyp, die im Beispiel aber nicht benutzt wird um Croneintraege zu klassifizieren.</li>
</ul> QFQ - Feature #4082 (New): Dynamic Update: modeSql - useful defaulthttps://project.math.uzh.ch/issues/40822017-07-08T09:40:12ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Liefert die 'modeSql' keinen Record (z.B. bei r=0) wird das FE immer angezeigt. Gut waere wenn in so einem Fall des statische Setting (show, hidden ,... ) verwendet wird.
<ul>
<li>Verhalten im Manual beschreiben.</li>
</ul>
</li>
<li>Status Quo: FE mit 'hidden' werden nicht im Client gerendert - die koennen anschliessend nicht eingeschaltet werden. Loesungsvorschlag: falls ein modeSql angegeben, das Element trotzdem rendern.</li>
</ul> QFQ - Feature #4050 (New): sql.log: 1) FormElement ID which causes a specific action , 2) Result ...https://project.math.uzh.ch/issues/40502017-07-05T06:36:04ZCarsten Rosecarsten.rose@math.uzh.chQFQ - Feature #4023 (New): prepared statements - FE action: salveId, sqlInsert, sqlUpdate, sqlDel...https://project.math.uzh.ch/issues/40232017-07-02T14:01:33ZCarsten Rosecarsten.rose@math.uzh.ch
<p>For every sql query, add a new element 'Arg'. Eg.:</p>
<pre>
slaveId = {{SELECT id FROM Person WHERE id=?}}
slaveIdArg = {{id}}
sqlInsert = {{INSERT INTO Person (name, firstName) VALUES (?,?)}}
sqlInsertArg = {{name:F:allbut}}, {{firstName:F:allbut}}
</pre>
* The ...Arg definition should not be fired directly. Instead search for all (non wrapped) ',' , split, replace every by it's onw, build array with the values, fire the prepared statement. QFQ - Feature #3727 (New): Security: Session Hijacking erschwerenhttps://project.math.uzh.ch/issues/37272017-05-14T13:43:45ZCarsten Rosecarsten.rose@math.uzh.ch
<ol>
<li>Problem 1: durch '[FE][lockIP] = 0' wird der Schutz gegen Session Hijacking fuer FE-User verringert.</li>
<li>Problem 2: in QFQ ist kein 'Session Hijacking' based on changed IP detection implementiert.</li>
</ol>
Beides koennte leicht implementiert werden:
<ul>
<li>Zu 1)
<ul>
<li>Entweder eine Extension schreiben die gewisse IPs immer zulaesst (z.B. die lokalen IPs) - es gab entsrpechende Extensions.</li>
<li>Oder in QFQ diesen Check implementieren (z.B. in dem sich QFQ beendet, sollte der aktuelle FE User einer FE Gruppe angehoeren)</li>
</ul></li>
</ul>
<ul>
<li>Zu 2) implementieren. Am besten aehnlich konfiguriert wird '[FE][lockIP]'</li>
</ul> QFQ - Feature #3504 (New): Logging: welche Action FEs werden wann wie ausgefuehrthttps://project.math.uzh.ch/issues/35042017-04-04T08:36:30ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Es waere gut wenn es Logfile geben wuerde in dem notiert wird welche Action FE ausgefuehrt wird und wie. Aktuell gibt es das Problem das wenn bei templatgroups die maxlength nicht gesetzt ist, die Elemente zwar korrekt angezeigt werden, beim speichern aber kein postprocessing erfolgt. das ist fuer einen entwickler, der keine debugging moeglichkeit hat, kaum nachzuvollziehen.</p>
Idee:
<ul>
<li>Ein Form kann in einen Debug Log Modus versetzt werden, in dem auf dem Form der neue 'debug' button geklickt wird. Nur BE User sehen diesen Button.</li>
<li>Dies oeffnet die Seite 'debug' mit einer 'monitor' Spalte, um das Logfile konstant anzuzeigen.</li>
<li>Alle Requests in der aktuellen Session auf diesem From werden gelogged.</li>
<li>In der php session wird vermerkt, das fuer dieses Form das Logging aktiviert ist.</li>
<li>Wird ein Form ge'debug'ed, und existieren Files fuer diese Form, und sind die 'last modified' timestamps der Datei aelter als 4h, werden die alten Dateien geloescht.</li>
<li>Wird die PHP Session beendet, verfaellt das debug Flag.</li>
<li>Name der Logdatei: fileadmin/protected/log/<formname>+<uniq timestamp>.log. Der Name sollte damit ausreichend eindeutig sein, das sich mehrere user/debug session nicht in den Weg kommen.</li>
</ul> QFQ - Feature #3432 (New): subrecord: dynamicUpdatehttps://project.math.uzh.ch/issues/34322017-03-26T12:59:55ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>subrecords reagieren zur Zeit gar nicht auf 'dynamicUpdates'</li>
<li>Als Update wird immer eine komplette HTML Tabelle kommen.</li>
<li>Neu sollte die Moeglichkeit bestehen, das Subrecords auch ohne primary record gerendert werden koennen.
<ul>
<li>Beispiel (QFQ / formWithFeType): Ein Formular mit einem TypeAheadSql auf FormElement.type um alle Formulare mit dem selektieren Type anzuzeigen (subrecord).</li>
</ul></li>
</ul> QFQ - Feature #880 (New): Security: PHP, SQL Injection, XSShttps://project.math.uzh.ch/issues/8802015-08-13T14:46:51ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li><a class="external" href="http://www.heise.de/security/artikel/XSS-Bremse-Content-Security-Policy-1888522.html">http://www.heise.de/security/artikel/XSS-Bremse-Content-Security-Policy-1888522.html</a></li>
<li><a class="external" href="http://www.heise.de/thema/XSS">http://www.heise.de/thema/XSS</a></li>
<li><a class="external" href="https://www.acunetix.com/websitesecurity/php-security-1/">https://www.acunetix.com/websitesecurity/php-security-1/</a></li>
<li><a class="external" href="https://docs.php.earth/security/intro/">https://docs.php.earth/security/intro/</a></li>
<li><a class="external" href="https://www.butterfly.com.au/blog/website-development/web-application-security-essentials-for-php-developers-the-art-of-not-getting-hacked">https://www.butterfly.com.au/blog/website-development/web-application-security-essentials-for-php-developers-the-art-of-not-getting-hacked</a></li>
<li><a class="external" href="https://www.cloudways.com/blog/php-security/">https://www.cloudways.com/blog/php-security/</a></li>
</ul>