Project @ iMath: Issueshttps://project.math.uzh.ch/https://project.math.uzh.ch/favicon.ico?16668783892023-01-12T11:48:36ZProject @ iMath
Redmine QFQ - Feature #15362 (Some day maybe): Add button to text inputs in Form (Element) Editor to swit...https://project.math.uzh.ch/issues/153622023-01-12T11:48:36ZJan Haller
<p>Neben bestimmten Textinputs (z.B. Title) im Form (Element) Editor soll ein Button eingebaut werden, der das Umschalten des entprechenden Inputfelds von type=input zu type=editor (und zurück) ermöglicht. Für SQL Abfragen steht dann die entsprechende Syntax zur Verfügung.</p> QFQ - Feature #10738 (Some day maybe): CORS headers for external API requestshttps://project.math.uzh.ch/issues/107382020-06-10T12:00:34ZMarc Egger
<p>Optionally allow setting the CORS headers inside a QFQ API Form such that the API may be called from a website hosted under a different domain.</p>
<p>Working example: <a class="external" href="https://stackoverflow.com/a/9866124">https://stackoverflow.com/a/9866124</a><br /><pre><code class="php syntaxhl"><span class="cd">/**
* An example CORS-compliant method. It will allow any GET, POST, or OPTIONS requests from any
* origin.
*
* In a production environment, you probably want to be more restrictive, but this gives you
* the general idea of what is involved. For the nitty-gritty low-down, read:
*
* - https://developer.mozilla.org/en/HTTP_access_control
* - http://www.w3.org/TR/cors/
*
*/</span>
<span class="k">function</span> <span class="n">cors</span><span class="p">()</span> <span class="p">{</span>
<span class="c1">// Allow from any origin</span>
<span class="k">if</span> <span class="p">(</span><span class="k">isset</span><span class="p">(</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'HTTP_ORIGIN'</span><span class="p">]))</span> <span class="p">{</span>
<span class="c1">// Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one</span>
<span class="c1">// you want to allow, and if so:</span>
<span class="nb">header</span><span class="p">(</span><span class="s2">"Access-Control-Allow-Origin: </span><span class="si">{</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'HTTP_ORIGIN'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">);</span>
<span class="nb">header</span><span class="p">(</span><span class="s1">'Access-Control-Allow-Credentials: true'</span><span class="p">);</span>
<span class="nb">header</span><span class="p">(</span><span class="s1">'Access-Control-Max-Age: 86400'</span><span class="p">);</span> <span class="c1">// cache for 1 day</span>
<span class="p">}</span>
<span class="c1">// Access-Control headers are received during OPTIONS requests</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'REQUEST_METHOD'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'OPTIONS'</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="k">isset</span><span class="p">(</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'HTTP_ACCESS_CONTROL_REQUEST_METHOD'</span><span class="p">]))</span>
<span class="c1">// may also be using PUT, PATCH, HEAD etc</span>
<span class="nb">header</span><span class="p">(</span><span class="s2">"Access-Control-Allow-Methods: GET, POST, OPTIONS"</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="k">isset</span><span class="p">(</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'HTTP_ACCESS_CONTROL_REQUEST_HEADERS'</span><span class="p">]))</span>
<span class="nb">header</span><span class="p">(</span><span class="s2">"Access-Control-Allow-Headers: </span><span class="si">{</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'HTTP_ACCESS_CONTROL_REQUEST_HEADERS'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">);</span>
<span class="k">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">echo</span> <span class="s2">"You have CORS!"</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></p> QFQ - Bug #9126 (Some day maybe): hidden Form elements are present in page sourcehttps://project.math.uzh.ch/issues/91262019-09-14T07:51:58ZNicola Chiapolini
<p>Hidden Content elements are still present in the page source. This might be a security problem, if the hidden element contains a link (button) with a SIP. The link is not displayed in the in the form, but a user could find the working link in the source,</p> QFQ - Bug #9024 (Some day maybe): QFQ Einarbeitunghttps://project.math.uzh.ch/issues/90242019-09-05T07:37:03ZAnonymous
<ul>
<li>Stores
<ul>
<li><a class="external" href="https://qfq.io/doc/Manual.html#store">https://qfq.io/doc/Manual.html#store</a></li>
</ul></li>
</ul>
<ul>
<li>Variable
<ul>
<li>Sanitize: <a class="external" href="https://qfq.io/doc/Manual.html#sanitize-class">https://qfq.io/doc/Manual.html#sanitize-class</a></li>
<li>Store (s.o.)
<ul>
<li>Mehrere Stores: Prio / Fallback</li>
</ul></li>
</ul></li>
</ul>
<ul>
<li>Aufgabe:
<ul>
<li>Eine T3 Beispielseite erstellen mit der Ausgabe einiger Variablen aus z.B. STORE_SYSTEM , STORE_RECORD, STORE_CLIENT, STORE_VAR</li>
</ul></li>
</ul>
<ul>
<li>Nested Query:
<ul>
<li>Parameter Uebergabe: Spaltenname >> {{id:R}}</li>
</ul>
<ul>
<li><a class="external" href="https://qfq.io/doc/Manual.html#qfq-keywords-bodytext">https://qfq.io/doc/Manual.html#qfq-keywords-bodytext</a></li>
<li>Wrap mit HTML Elementen: head, tail, rbeg, rend, renr, fbeg, fend</li>
</ul>
<ul>
<li>Aufgabe: geschaltete HTML Tabelle - Person, pro Person Tabelle mit Adressen</li>
</ul></li>
</ul> QFQ - Bug #9020 (Some day maybe): radio mit buttonClass und dynamicUpdate lassen sich nicht kombi...https://project.math.uzh.ch/issues/90202019-09-04T12:55:38ZNicola Chiapolini
<p>Wenn ich meinem Radio-Element eine buttonClass gebe um die Bootstrap-Buttons zu erhalten, funktioniert dynamic update nicht mehr.</p> QFQ - Feature #8056 (Some day maybe): Termin Organisation (Reservation)https://project.math.uzh.ch/issues/80562019-03-15T07:05:55ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Fuer das Consulting Tool <a class="external" href="https://project.math.uzh.ch/projects/as-consulting-rf/wiki">https://project.math.uzh.ch/projects/as-consulting-rf/wiki</a> waere eine unabhaengige Terminplanung gut.</p>
<p>Unter <a class="external" href="https://www.terminland.de/online-terminplaner/">https://www.terminland.de/online-terminplaner/</a> kann man kostenlos einen Kalender managen. Man kann auch Fragen stellen die beantwortet werden.</p>
<p>Erste Idee</p>
<ul>
<li>Ein Modul innerhalb von QFQ (Alternativ gibt es evtl. T3 Extensions?).</li>
<li>Es wird nur ein Kalender angezeigt und ein Form um den Termin einzutragen.</li>
<li>Reduzierung auf das noetigste, da nicht klar ist ob das wirlich ein Requirement ist (UZH verwendet Lotus).</li>
<li>Nice to have:
<ul>
<li>Owner traegt seine verfuegbaren Timeslots in einem dedizierten Zimbra Kalender ein.</li>
<li>Client kann aus diesen Terminen auswaehlen.</li>
<li>Das UI Reserviert den Termin im Zimbra Kalender</li>
<li>Falls alles mittels einer 'externen DB' (=Zimbra Kalender) laeuft, muesste QFQ nichts lokal speichern. Evtl. spiegelt Zimbra den Kalender in eine lokale Tabelle.</li>
</ul></li>
</ul>
<p>Zweite Idee</p>
<ul>
<li>Open source service selber hosten. Variante: <a class="external" href="https://demo.easyappointments.org/index.php">https://demo.easyappointments.org/index.php</a></li>
</ul>
<p>Use cases:</p>
<ul>
<li>Terminplanung fuer Prof / Studenten (nutzen i.d.R. keinen Lotus Kalender)</li>
<li>Heterogene Gruppen UZH, ETHZ, ... - typischerweise in einer 1:1 Beziehung (falls mehr als 2 Parteien involviert sind, ist doodle bessser).</li>
</ul> QFQ - Feature #7921 (Some day maybe): Rest API Export: URL kuerzer machenhttps://project.math.uzh.ch/issues/79212019-02-20T15:49:11ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Kann man die REST URL kuerzer machen durch einen Symlink oder eine Apache Config 'Alias'?</li>
</ul> QFQ - Bug #7402 (Some day maybe): thumbnail cache: outdated picture when permission denied and pe...https://project.math.uzh.ch/issues/74022018-11-30T16:11:17ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Wird ein Image ersetzt, hat neu aber den Owner 'root', ist folgendes Verhalten zu beobachten wenn QFQ das thumbnail neu rendert (versucht).</p>
<ul>
<li>QFQ erzeugt von einem Image ein thumbnail.</li>
<li>Der Webmaster kopiert eine neue Datei, mit dem gleichen Namen ueber die alte Datei.</li>
<li>Die neue Datei hat faelchslicherweise als owner=root gesetzt. Der Apache Prozess kann nicht darauf zugreifen.
<ul>
<li>Obwohl der Zugriff nicht funktioniert, gibt es keine Fehlermeldung (im Client) - gut waere ein 'broken image'.</li>
</ul></li>
</ul>
<ul>
<li>Der Browser zeigt die thumbnails nicht an (weiss).</li>
<li>Anschliessend werden die Permissions/Owner korrekt gesetzt.</li>
<li>Nach einem Reload im Browser werden die urspruenglichen Thmumbnails angezeigt (also von den alten Bildern)!</li>
</ul> QFQ - Bug #7281 (Some day maybe): Subrecords: on large screen separator line too shorthttps://project.math.uzh.ch/issues/72812018-11-18T09:09:38ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Subrecords: bei besonders breiten Seiten und keinem subrecord, wird die Linie unter dem plus Zeichen nur auf halbe Breite gerendert.</p> QFQ - Feature #7278 (Some day maybe): Form: Wert vordefinieren der immer gesetzt wirdhttps://project.math.uzh.ch/issues/72782018-11-16T11:55:41ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Tabelle mit Vor/Nachteilen</li>
</ul>
<p>Varianten</p>
<ul>
<li>via SIP uebergeben, in Report: sql = SELECT '{{pageAlias}}&form=person&r={{pId}}&column=123|s=1' AS _pagee</li>
<li>fe.type=extra. fe.value=123</li>
<li>fe.type=afterSave, `fe.paramter.sqlAfter = UPDATE 'table' SET 'column'=123 WEHRE id={{id:R}}`</li>
<li>fe.type=text, fe.mode='hidden'</li>
</ul>
<p>Vorschlag:</p>
<ul>
<li>form.parameter.setColumn = <column1>:<value1>,<column2>:<value2>,...</li>
<li>Beim speichern wird geprueft ob es die gleiche Spalte in 'setColumn' und als FE gibt - dann einen Fehler melden.</li>
<li><value..> koennen auch Variablen sein.</li>
<li>Die columns werden genau so gehandhabt, als waeren sie FE mit einem fixen Wert.</li>
<li>Check das datetime und timestamp korrekt gehandelt werden.</li>
</ul> QFQ - Feature #7229 (Some day maybe): New FormElement.type: Buttonhttps://project.math.uzh.ch/issues/72292018-11-12T11:46:31ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Erscheint im Form als normales Formularelement</li>
<li>Kann oben in der Buttonleiste erscheinen</li>
<li>Button kann ein normaler Link sein</li>
<li>Button kann eine Download sein</li>
<li>Button kann speichern, loeschen, schliessen</li>
<li>Button kann ein Custom redirect haben</li>
<li>Button kann optional den 'wollen sie speichern'-Dialog unterdruecken.</li>
<li>Es muss sichergestellt sein das 'Dirty' Records abgeraeumt werden.</li>
<li>Es sollte moeglich sein mehrere Buttons in einer Gruppe darzustellen. Neu koennten die bestehenden Gruppen ein Label bekommen, so dass man neue Buttons zu den Systemgruppen hinzufuegen kann.</li>
</ul> QFQ - Feature #7108 (Some day maybe): QFQ Wrap Elementshttps://project.math.uzh.ch/issues/71082018-10-27T10:01:32ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>erklaeren wie welche elemente gewrapped werden.</li>
<li>Screenshots
<ul>
<li>static: untereinander, hinteinander</li>
<li>dynamicUpdate: innerhalb einer Zeile ein/ausblenden</li>
</ul></li>
</ul>
<ul>
<li>Optionen
<ul>
<li>BS Columns. Insbesondere was passiert wenn bscolumns=0</li>
<li>row, label, /label, input, /input, note, /note, /row</li>
<li>FE.parameter: FE_WRAP_ROW, FE_WRAP_LABEL, FE_WRAP_INPUT, FE_WRAP_NOTE</li>
</ul></li>
</ul>
<ul>
<li>Unit Test ob ALLE Kombinationen funktioneren.</li>
</ul> QFQ - Feature #7106 (Some day maybe): Beispiel Nummerierung von Rows in Reporthttps://project.math.uzh.ch/issues/71062018-10-27T09:21:06ZCarsten Rosecarsten.rose@math.uzh.ch
<p>In Report Nummerierung von Zeilen:</p>
<ul>
<li>via SQL Variable<br />∘ via Report: line.count</li>
</ul> QFQ - Feature #7105 (Some day maybe): Beispiel wie man in einer zweiten Tabelle speichert.https://project.math.uzh.ch/issues/71052018-10-27T09:18:24ZCarsten Rosecarsten.rose@math.uzh.chQFQ - Feature #7104 (Some day maybe): Manual: hint about escaping if '\r' appears in mail bodyhttps://project.math.uzh.ch/issues/71042018-10-27T09:16:26ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Werden Mails versendet und der Body durch einen Record geladen und via {{body:R}} eingesetzt, erscheinen im Text '\r' an den Zeilenenden.</p>
<p>Problem: {{body:R}} wird escaped</p>
<p>Abhilfe: {{body:R::-}}</p>
<p>Das in der FAQ Sektion erklaeren.</p> QFQ - Bug #7101 (Some day maybe): 'form' in SIP and 'report' - breakshttps://project.math.uzh.ch/issues/71012018-10-27T08:47:43ZCarsten Rosecarsten.rose@math.uzh.ch
<p>falls in der SIP ein form ist und um qfq record ein form defineirt ist (wrid dynamisch berechnet) kommt qfq beim defintinve laden des form durcheinander.</p> QFQ - Feature #7100 (Some day maybe): Download: log access, max downloads, time limithttps://project.math.uzh.ch/issues/71002018-10-27T08:45:40ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Logging wer/wann von wo zugegriffen hat</li>
<li>max anzahl an downloads begrenzen</li>
<li>zeitlich begrenzen.</li>
<li>anonymer download</li>
<li>kann theoretisch via qfq/report geloest werden</li>
<li>vermutlich praktischer wenn eine logtabelle angegben werden kann</li>
<li>in SIP logtabelle angeben</li>
</ul> QFQ - Feature #6992 (Some day maybe): DB exception: Syntax Highlight https://project.math.uzh.ch/issues/69922018-10-13T09:12:32ZCarsten Rosecarsten.rose@math.uzh.ch
<p>siehe punkt 2 <a class="issue tracker-2 status-5 priority-2 priority-default closed" title="Feature: DB Exception: highlight problematic text position, SQL syntax highlight (Closed)" href="https://project.math.uzh.ch/issues/5450">#5450</a></p> QFQ - Feature #6704 (Some day maybe): Upload Mode: Bilder in Notizen rechts sollen aktuellen Uplo...https://project.math.uzh.ch/issues/67042018-09-14T11:11:06ZElias Villiger
<p><p><a href="{{pathFileName:FR0:allbut:d}}"><img style="height: 48px;" src="{{pathFileName:FR0:allbut:d}}" /></a></p></p> QFQ - Feature #6515 (Some day maybe): Formular: Felder dynamisch ein/ausblendenhttps://project.math.uzh.ch/issues/65152018-08-15T09:23:42ZCarsten Rosecarsten.rose@math.uzh.ch
1) New Record
<ul>
<li>Feld 1 ist leer</li>
<li>Feld 2 ist ausgblendet</li>
</ul>
2) Edit Record
<ul>
<li>Feld 1 = A</li>
<li>Feld 2: Dropdownliste mit Werten die zu 'A' passen</li>
</ul>
3) Edit Record
<ul>
<li>Feld 1 = B</li>
<li>Feld 2: Dropdownliste mit Werten die zu 'B' passen</li>
</ul> QFQ - Feature #6299 (Some day maybe): Attack detection: log table with invalid SIP access https://project.math.uzh.ch/issues/62992018-06-23T16:32:22ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Die Abwehrmassnahmen fuer SIP brute force sollen wie folgt verbessert werden.</p>
<ul>
<li>Es gibt eine Tabelle die alle mis-hit auf SIP oder Persistent SIP notiert:
<ul>
<li>IP</li>
<li>PHP Session</li>
<li>feUser</li>
<li>UserAgent</li>
<li>pageId</li>
<li>Zeitpunkt</li>
</ul></li>
</ul>
<ul>
<li>QFQ prueft bei jedem Start ob ein Full Stop (Attack detected) noetig ist:
<ul>
<li>Hits pro Sekunde, pro Minute, pro 5 Minuten, pro Stunde, pro Tag, pro Monat</li>
<li>Count pro IP, count pro PHP Session, count pro feUser</li>
<li>Fuer jede 'Hit/pro Zeit'-Klasse gibt es einen Schwellwert.</li>
<li>Ist der Schwellwert ueberschritten, wird die IP gesperrt, resp. die PHP Session gesperrt. </li>
<li>Eintraege aelter als einen Monat werden geloescht.</li>
</ul></li>
</ul>
<ul>
<li>Es wird nicht erwartet das viele Daten in der Tabelle stehen.</li>
</ul> QFQ - Feature #6288 (Some day maybe): Best Practice: Erklaeren wie man ein Formular ganz in 'weis...https://project.math.uzh.ch/issues/62882018-06-20T16:35:27ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Mit den Klassen classPill, classBody, classTitle kann man ein Formular ganz in weiss machen</p>
<p>Lehrkredit/Form: requestApprove</p>
<p>classBody=qfq-color-white</p> QFQ - Feature #6084 (Some day maybe): New escape type: 'D' - convert datehttps://project.math.uzh.ch/issues/60842018-05-26T16:50:16ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Wenn das default date Format nicht 'yyyy-mm-dd' ist, wird eine Variable mit diesem Typ in der MySQL Format gewandelt.</p>
<p>projektStart='11.12.1314 01:23:45'</p>
<p>{{projektStart:F:alnumx:D}} >> '1314-12-11 01:23:45'</p>
<p>Die Variable muss ein gueltiges Datum sein, sonst ist die sanatize class verletzt.</p> QFQ - Feature #6083 (Some day maybe): Dynamic Update: Value Check via SQLhttps://project.math.uzh.ch/issues/60832018-05-26T16:39:52ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Um z.B. die Eingabe eines Start/Ende Datums via 'dynamic update' kontrollieren zu koennen, waere es gut wenn man eine SQL query dafuer definieren koennte.</p>
<p>Bsp: projektStart und projektEnde duerfen nur maximal 24 Monate umfassen.</p>
Implementierungsidee:
<ul>
<li>Es gibt einen neuen FormElementTyp 'dynamicUpdateCheck' mit type='action'.</li>
<li>Im zu ueberpruefenden FE gibt es im Parameterfeld<br /><pre>
dynamicUpdateCheckFeId = 123 # FormElement.id eines FE mit type='dynamicUpdateCheck'
</pre></li>
<li>Die Notation ist identisch zu 'beforeSave'.</li>
</ul> QFQ - Feature #5923 (Some day maybe): fillStoreSystemBySqlLatehttps://project.math.uzh.ch/issues/59232018-05-06T18:51:19ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Neben fillStoreSystemBySql1-3 soll es neu auch fillStoreSystemBySqlLate1-3 geben (inkl. Fehlermeldung).</p>
<p>Diese werden ausgewertet nachdem alle Stores gefuellt wurden. Damit koennen dort auch feUser und STORE_CLIENT Values verwendet werden.</p> QFQ - Feature #5895 (Some day maybe): Tutorial: List of all QFQ Featureshttps://project.math.uzh.ch/issues/58952018-05-01T15:00:23ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Link to 'Best Practice' - Beispiel(e) im Tutorial.md.</li>
<li>Link zu Manual.rst an die Stelle wo das Feature vollstaendig beschrieben wird.</li>
</ul>
<ul>
<li><a class="external" href="https://git.math.uzh.ch/typo3/qfq/blob/master/Documentation/Tutorial.rst">https://git.math.uzh.ch/typo3/qfq/blob/master/Documentation/Tutorial.rst</a></li>
</ul> QFQ - Feature #5893 (Some day maybe): Edit on double-clickhttps://project.math.uzh.ch/issues/58932018-05-01T14:20:31ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Oft gibt es Reports, bei denen pro Row nur wenige Zellen manipuliert werden soll. Dort waere es gut (wie bei phpMyAdmin) das ein Doppelklick einen edit mode fuer die aktuelle Zelle oeffnet.</p>
<p>Bei diesen mini-edit gibt es kein Submit. Stattdessen ist ein 'lost focus' der Submit.</p>
<p>Vermutlich waere es gut, wenn via Ajax der ganze report nachgeladen werden koennte.</p>
<p>Anwendung: pro Record die Reihenfolge oder einen Status setzen.</p> QFQ - Feature #5892 (Some day maybe): QFQ should use T3 API to manipulate FE GROUP membershiphttps://project.math.uzh.ch/issues/58922018-05-01T13:20:51ZCarsten Rosecarsten.rose@math.uzh.ch
<p>QFQ sollte eine Moeglichkeit anbieten, die FE Groups in T3 zu einem User setzen zu koennen.</p>
<ul>
<li>Das setzen passiert beim aktuell eingeloggten User. </li>
<li>Die Aenderungen sollten sofort sichtbar sein.</li>
<li>Ein oder mehrere Gruppen setzen.</li>
<li>Falls Gruppen nicht angegeben sind, diese Membership loeschen.</li>
<li>Ein Best Practice sollte in der LDAP Extension zu finden sein.</li>
<li>Column '_feGroup'</li>
<li>Modifier:
<ul>
<li>add:<feGroup[,feGroup]> - add feGroup membership for current user.</li>
<li>delete:<feGroup[,feGroup]> - delete feGroup membership for current user.</li>
<li>set:<feGroup[,feGroup]> - set (remove non given) feGroup</li>
<li><string>_:<feGroup[,feGroup]> - set (remove non given) <string>_* classes. E.g. 'auto_:auto_admin,auto_reviewer' will remove all non given 'auto_*' groups and set the given one.</li>
<li>user:<feUser> - optional. If not given take the current user. If there is no user, do nothing.</li>
</ul></li>
</ul> QFQ - Bug #5877 (Some day maybe): FE.type=note:bsColumn strange behaviourhttps://project.math.uzh.ch/issues/58772018-04-26T16:32:42ZCarsten Rosecarsten.rose@math.uzh.ch
<p>SW hat auf der GRC Seite ein spezielles Verhalten gehabt.</p>
<ul>
<li>FE Element (kein Dynamic Update) type=note</li>
<li>In der Note gab es kein Label und Input.</li>
<li>Die Note Spalte war 9 spalten breit. Label=3, Input=0</li>
<li>Nachdem 'modeSql' gesetzt wurde, so dass nur bei gewissen Grants das FE angezeigt werden soll (show/hidden), war der Button linksbuendig, obwohl er in der 4. Spalte beginnen soltle.</li>
<li>Wurde Label=2, Input=1 oder Label=0, Input=3 gesetzt, trat der Effekt nicht auf.</li>
</ul> QFQ - Feature #5851 (Some day maybe): Queue System implementieren: MQTT, RabbitMQhttps://project.math.uzh.ch/issues/58512018-04-21T12:47:24ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Parallel zu AutoCron soll ein Queue System fuer QFQ zur Verfuegung stehen.</p>
Ziele:
<ul>
<li>Vereinzelung von eingehenden Tickets. Bsp.: mehrere Tickets treffen quasi gleichzeitig ein, es soll aber immer nur eine Anfrage zu einer Zeit bearbeitet werden.</li>
<li>Monitoring welche Tickets bereits abgearbeitet sind. Neu erstellte Tickets bekommen eine ID, die angefragt werden kann.</li>
<li>Zugriffs Beschraenkung.</li>
<li>Tickets einstellen, von ausserhalb QFQ.</li>
</ul>
Anwendung:
<ul>
<li>Ein OS Cronjob erstellt ein Ticket, das PDFs auf Vorrat gerendert werden sollen. </li>
<li>Der Apache haelt keine Verbindung zum Client offen. </li>
<li>Ggfs. wird QFQ ohne Apache via Commandline aufgerufen. </li>
<li>Es muesste eine tt_content ID uebergeben werden.</li>
</ul> QFQ - Feature #5850 (Some day maybe): Deployment: In QFQ Doc best practice fuer zeitgemaesses Dep...https://project.math.uzh.ch/issues/58502018-04-21T11:37:16ZCarsten Rosecarsten.rose@math.uzh.ch
<p><a class="external" href="https://docs.typo3.org/typo3cms/TellMeSomethingAbout/Topics/Deployment.html">https://docs.typo3.org/typo3cms/TellMeSomethingAbout/Topics/Deployment.html</a><br /><a class="external" href="https://docs.typo3.org/typo3cms/TellMeSomethingAbout/Topics/Docker.html">https://docs.typo3.org/typo3cms/TellMeSomethingAbout/Topics/Docker.html</a><br /><a class="external" href="https://blog.chriwo.de/tagged/PhpStorm">https://blog.chriwo.de/tagged/PhpStorm</a> (PhpStorm / composer)<br /><a class="external" href="https://github.com/martin-helmich/docker-typo3">https://github.com/martin-helmich/docker-typo3</a></p> QFQ - Feature #5783 (Some day maybe): BPMN View/Edithttps://project.math.uzh.ch/issues/57832018-04-05T14:50:40ZCarsten Rosecarsten.rose@math.uzh.ch
<p>QFQ soll BPMN Workflows anzeigen und editieren koennen:</p>
<ul>
<li>BPMN Edit:
<ul>
<li><a class="external" href="https://github.com/bpmn-io/bpmn-js">https://github.com/bpmn-io/bpmn-js</a></li>
<li><a class="external" href="https://github.com/bpmn-io/bpmn-moddle">https://github.com/bpmn-io/bpmn-moddle</a> </li>
<li><a class="external" href="https://github.com/bpmn-io/diagram-js">https://github.com/bpmn-io/diagram-js</a></li>
</ul></li>
</ul>
<ul>
<li>Beispiel fuer BPMN Anzeige via JQuery: <a class="external" href="https://www.pleus.net/blog/?p=2142">https://www.pleus.net/blog/?p=2142</a></li>
</ul> QFQ - Feature #5455 (Some day maybe): Mail Redirects grId abhaengighttps://project.math.uzh.ch/issues/54552018-02-16T14:07:00ZElias Villiger
<p>Beim Entwickeln von Email-abhaengigen Loesungen waere es zum Testen bequem, wenn man die Mails des sich in Entwicklung befindenden Bereichs abfangen und weiterleiten kann (aehnlich wie REDIRECT_ALL_MAIL_TO).<br />Dazu koennte man zusaetzlich zum Feld REDIRECT_ALL_MAIL_TO (evtl umbenennen in REDIRECT_MAIL_TO) ein Feld REDIRECT_MAIL_GRIDS einfuehren, bei dem die grIds der weiterzuleitenden Mails angegeben werden. Wenn REDIRECT_MAIL_GRIDS auf 0 steht, werden alle Mails abgefangen.</p>
<p><a class="issue tracker-2 status-5 priority-2 priority-default closed" title="Feature: config.qfq.ini via ExtManager (Closed)" href="https://project.math.uzh.ch/issues/5175">#5175</a> abwarten.</p> QFQ - Feature #5452 (Some day maybe): Thumbnails from PDF: bad qualityhttps://project.math.uzh.ch/issues/54522018-02-16T09:34:55ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Wird ein Thumbnail von einem PDF gerendert (nur bei der ersten Seite) passiert das aktuell via GraphicsMagic.</p>
<p>Bei kleinen Thumbnails ist das kein Problem. Bei groesseren Bilder (width>500) sieht es nicht mehr gut aus.</p>
<p>Wird inkscape verwendet, sieht es anders schlecht aus: by default hat inkscape Probleme mit den LaTeX Schriften beim Import von PDF. Inkscape kann zusaetzlich importieren 'with poppler' - dann sieht es gut auch. Auf die schnelle haben BB,CR aber keine Commandline Option gefunden, das auch bei 'without-gui' zu aktivieren.</p> QFQ - Feature #5342 (Some day maybe): _link - with HTML Attributeshttps://project.math.uzh.ch/issues/53422018-02-02T17:50:28ZBenjamin Baerbenjamin.baer@math.uzh.ch
<p>data Attributes need to be set sometime.</p>
<p>Carsten proposed a general attribute option:</p>
<pre>
'p:...|c:someClass|a:data-target="www.google.ch" data-payload="stuff"' AS _link
</pre> QFQ - Feature #5160 (Some day maybe): QFQ collaborative / together.js, ShareJS, y-js, collaborati...https://project.math.uzh.ch/issues/51602017-12-23T16:04:11ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li><a class="external" href="https://togetherjs.com">https://togetherjs.com</a></li>
<li><a class="external" href="https://github.com/josephg/ShareJS">https://github.com/josephg/ShareJS</a></li>
<li><a class="external" href="http://y-js.org/#!/examples">http://y-js.org/#!/examples</a> (incl. RTE)</li>
<li><a class="external" href="https://www.npmjs.com/package/collaborative">https://www.npmjs.com/package/collaborative</a></li>
<li><a class="external" href="https://blog.pusher.com/build-collaborative-text-editor-javascript/">https://blog.pusher.com/build-collaborative-text-editor-javascript/</a></li>
</ul> QFQ - Feature #5129 (Some day maybe): Reports: SQL fuer x Achse und y Achsehttps://project.math.uzh.ch/issues/51292017-12-15T14:08:56ZBenjamin Baerbenjamin.baer@math.uzh.ch
<p>Moeglichkeit x und y Achse in einer SQL Stufe zu generieren und Kinder dann beide Values zu vererben</p>
<p>Nuetzlich fuer Tabellen die Horizontal und Vertikal generiert werden, bsp. Overview Points</p>
<p>Beispiel:<br /><pre>
10 {
xsql = SELECT id FROM Exercises
ysql = SELECT id FROM Students
rbeg = <tr>
xhead = <thead>
yhead = <tbody>
xfbeg = <th>
xfend = </th>
yfbeg = <td>
...
20 {
sql = SELECT grade FROM Grades WHERE idExercise = {{10x.id}} AND idStudent = {{10y.id}}
}
</pre></p> QFQ - Feature #4974 (Some day maybe): Long polling - inform all listening clients of changeshttps://project.math.uzh.ch/issues/49742017-11-21T08:23:46ZBenjamin Baerbenjamin.baer@math.uzh.ch
<p><a class="external" href="https://stackoverflow.com/questions/333664/how-do-i-implement-basic-long-polling">https://stackoverflow.com/questions/333664/how-do-i-implement-basic-long-polling</a></p>
<pre>
<?php
if(rand(1,3) == 1){
/* Fake an error */
header("HTTP/1.0 404 Not Found");
die();
}
/* Send a string after a random number of seconds (2-10) */
sleep(rand(2,10));
echo("Hi! Have a random number: " . rand(1,10));
?>
</pre>
<p>Note: With a real site, running this on a regular web-server like Apache will quickly tie up all the "worker threads" and leave it unable to respond to other requests.. There are ways around this, but it is recommended to write a "long-poll server" in something like Python's twisted, which does not rely on one thread per request. cometD is an popular one (which is available in several languages), and Tornado is a new framework made specifically for such tasks (it was built for FriendFeed's long-polling code)... but as a simple example, Apache is more than adequate! This script could easily be written in any language (I chose Apache/PHP as they are very common, and I happened to be running them locally)</p>
<p>Javascript:</p>
<pre>
<script type="text/javascript" charset="utf-8">
function addmsg(type, msg){
/* Simple helper to add a div.
type is the name of a CSS class (old/new/error).
msg is the contents of the div */
$("#messages").append(
"<div class='msg "+ type +"'>"+ msg +"</div>"
);
}
function waitForMsg(){
/* This requests the url "msgsrv.php"
When it complete (or errors)*/
$.ajax({
type: "GET",
url: "msgsrv.php",
async: true, /* If set to non-async, browser shows page as "Loading.."*/
cache: false,
timeout:50000, /* Timeout in ms */
success: function(data){ /* called when request to barge.php completes */
addmsg("new", data); /* Add response to a .msg div (with the "new" class)*/
setTimeout(
waitForMsg, /* Request next message */
1000 /* ..after 1 seconds */
);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
addmsg("error", textStatus + " (" + errorThrown + ")");
setTimeout(
waitForMsg, /* Try again after.. */
15000); /* milliseconds (15seconds) */
}
});
};
$(document).ready(function(){
waitForMsg(); /* Start the inital request */
});
</script>
</pre> QFQ - Feature #4816 (Some day maybe): Templates for QFQ Reports (Tables, Radios, ..)https://project.math.uzh.ch/issues/48162017-10-25T11:33:18ZBenjamin Baerbenjamin.baer@math.uzh.ch
<p>Easy way to create bootstrap tables and other template based fluff.</p>
<p>Now:<br /><pre>
10 {
sql = SELECT v.id AS _id, m.nr, CONCAT(v.name, ' (', v.gr_id, ')'), CONCAT('p:cassignment&grId=', v.gr_id, '&semId=',
v.sem_id, '|S|s') AS _link, CONCAT('p:exercisesheets&vId=', v.id, '&gr_id=', v.gr_id, '&semId=', v.sem_id,
'|E|s') AS _link
FROM vorlesung AS v, gruppe_member AS gm, modul AS m
WHERE v.sem_id = 35
AND v.v_typ = 'VL'
AND v.id = gm.x_id2
AND gm.gr_id = 896
AND m.id = gm.x_id
head = <table class="table table-condensed table-striped">
<thead>
<tr>
<th width="70">Modul</th>
<th>Name</th>
<th width="50"></th>
<th width="50"></th>
</tr>
</thead>
<tbody>
rbeg = <tr>
rend = </tr>
fbeg = <td>
fend = </td>
tail = </tbody></table>
}
</pre></p>
<p>Then:</p>
<pre>
10 {
sql = SELECT v.id AS _id, m.nr, CONCAT(v.name, ' (', v.gr_id, ')'), CONCAT('p:cassignment&grId=', v.gr_id, '&semId=',
v.sem_id, '|S|s') AS _link, CONCAT('p:exercisesheets&vId=', v.id, '&gr_id=', v.gr_id, '&semId=', v.sem_id,
'|E|s') AS _link
FROM vorlesung AS v, gruppe_member AS gm, modul AS m
WHERE v.sem_id = 35
AND v.v_typ = 'VL'
AND v.id = gm.x_id2
AND gm.gr_id = 896
AND m.id = gm.x_id
type = table
head = <th width="70">Modul</th>
<th>Name</th>
<th width="50"></th>
<th width="50"></th>
}
</pre>
<p>list</p>
<p>Now:<br /><pre>
10 {
sql = SELECT p.name, ', ', p.vorname
FROM person AS p
WHERE ....
head = <ul>
rbeg = <li>
rend = </li>
tail = </ul>
}
</pre></p>
<p>Then: <br /><pre>
10 {
sql = SELECT p.name, ', ', p.vorname
FROM person AS p
WHERE ....
type = list
}
</pre></p> QFQ - Feature #4719 (Some day maybe): Custom Message in Client in case of 'Browser tab close, mod...https://project.math.uzh.ch/issues/47192017-10-05T18:53:50ZCarsten Rosecarsten.rose@math.uzh.chQFQ - Feature #4640 (Some day maybe): Rename System Formshttps://project.math.uzh.ch/issues/46402017-09-25T14:22:33ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Form, FormElement, Cron ... umbenennen zu _Form, _FormElement, _Cron</p> QFQ - Feature #4627 (Some day maybe): dbupdate: all tables - check 'create', 'modified' if it is ...https://project.math.uzh.ch/issues/46272017-09-24T07:52:22ZCarsten Rosecarsten.rose@math.uzh.chQFQ - Feature #4626 (Some day maybe): Mobile View: 'classBody=qfq-form-right' makes no sensehttps://project.math.uzh.ch/issues/46262017-09-24T07:47:41ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Es waere gut wenn die Labelausrichtung zwischen Mobile und Desktop unterschiedlich sein koennte. Bei Desktop macht es durchaus Sinn das die Label right-aligned sind - im Mobile View sieht das dann aber nicht mehr schoen aus.</p>
<p>classBody=qfq-form-righ</p>
<p>Mit Benj besprechen wie wir das loesen.</p> QFQ - Feature #4551 (Some day maybe): Set 'pills' via dynamicUpdate to show/hide/disabledhttps://project.math.uzh.ch/issues/45512017-09-17T15:43:07ZCarsten Rosecarsten.rose@math.uzh.chQFQ - Bug #4546 (Some day maybe): NH: SIP storage is destroyed https://project.math.uzh.ch/issues/45462017-09-16T09:00:14ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Nicolas hatte einige Tage lang den Effekt, das die SIPs immer mal wieder ungueltig waren. Vermutlich hat QFQ die SIP storage abgeraeumt weil ein Angriff erkannt wurde.</p> QFQ - Feature #4536 (Some day maybe): FE upload: problem with delete if mutliple uploads an FE.na...https://project.math.uzh.ch/issues/45362017-09-15T13:20:33ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Bei GRC in Form='requestPM' gibt es 3 Uploadfelder (advanced: Tabelle 'Note')</li>
<li>Ist nur ein Upload Feld 'enabled' funktioniert Laden/Speichern/Loeschen gut.</li>
<li>Ist ein weiteres FE Upload Feld 'enabled', funktioniert das Loeschen eines Uploads nicht mehr: 'Trash > Speichern > Reload' zeigt den Record wieder an.</li>
<li>Werden den Upload Felder Namen gegeben, fe.name='my....' funktioniert das loeschen sauber.</li>
</ul> QFQ - Feature #4446 (Some day maybe): New FE get same feIdContainerId as last modifed FEhttps://project.math.uzh.ch/issues/44462017-09-09T15:10:40ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Wenn ein neues FE angelegt wird, als container denjenigen Vorschlagen, den das zuletzt editierte FE hat.</p> QFQ - Feature #4445 (Some day maybe): template group: Option to simulate fieldsethttps://project.math.uzh.ch/issues/44452017-09-09T15:07:37ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Macht es Sinn das Label zu rendern ( so dass kein fieldset aufwendig angelegt werden muss)?</p>
<p>Man koennte eine Option setzen, um eine TemplateGroup das Verhalten eines Fieldsets zu geben.</p> QFQ - Feature #4444 (Some day maybe): FE.type=upload: detect mime typehttps://project.math.uzh.ch/issues/44442017-09-09T15:04:53ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Falls kein 'file' installiert ist: Fallback auf filename extension</p>
config.qfq.ini:
<ul>
<li>mimetype=file (default)</li>
<li>mimetype= (detection off)</li>
</ul>
<ul>
<li>persoenliche notiz
<ul>
<li>-b (brief)</li>
<li>--extension</li>
<li>--mime</li>
<li>--keep-going</li>
</ul></li>
</ul> QFQ - Feature #4443 (Some day maybe): Form: multiple secondary tableshttps://project.math.uzh.ch/issues/44432017-09-09T14:44:08ZCarsten Rosecarsten.rose@math.uzh.ch
Um einfacher auf mehrere Tabellen schreiben zu koennen, und das womoeglich via 'prepared statement':
<ul>
<li>Im Form koennen zusaetzliche Tabellen definiert werden.
<ul>
<li>Z.B. mit FE.type=table, Auf dem Element wird 'slaveId,sqlInsert,sqlDelete,sqlUpdate' definiert. </li>
<li>Pro Form Element kann dann die Tabelle und der aktuelle Spaltenname ausgewaehlt werden.</li>
</ul></li>
</ul>