Project @ iMath: Issueshttps://project.math.uzh.ch/https://project.math.uzh.ch/favicon.ico?16668783892021-09-06T15:15:38ZProject @ iMath
Redmine QFQ - Bug #12989 (Priorize): empty string does not trigger dynamic updatehttps://project.math.uzh.ch/issues/129892021-09-06T15:15:38ZMarc Egger
<p>A note whose value is rendered using dynamic update is not updated if the return value changes from "something" to "".</p>
<p>e.g.</p>
<p>In the "value" field of a dynamicly updated FormElement of type "note":</p>
<pre>
#!report
10.sql = SELECT "something" FROM (SELECT '') AS _fake WHERE "{{select:F}}"="a"
</pre>
<p>If "select" changes from "a" to "b" then the note still contains "something".</p>
<p>This bug was found by Philipp.</p> QFQ - Feature #12611 (Some day maybe): Refactoring: Bootstrap with Lazy Loadinghttps://project.math.uzh.ch/issues/126112021-05-31T12:43:19ZMarc Egger
<p>statische klassen und lazy loading fuer DB und store</p>
<ul>
<li>DB:
<ul>
<li>alle DBs werden aus config geladen</li>
<li>verbidnungen werden erst geoeffenet wenn noetig</li>
</ul>
</li>
<li>Store:
<ul>
<li>jeder store wird separat lazy geloadet</li>
<li>S T Y stores muessen initialisiert werden</li>
</ul></li>
</ul> QFQ - Support #12551 (Closed): Diagram erstellen: Bootstrap Prozesshttps://project.math.uzh.ch/issues/125512021-05-17T11:14:21ZMarc Egger
<p>Verschiedene Grafiken erstellen (DrawIO) die den bootstrap prozess aus verschiedenen accesspoints darstellen.</p>
Accesspoints
<ul>
<li>API (typo3conf/ext/qfq/Classes/Api): save, download, load, delete, </li>
<li>API typeAhead</li>
<li>Typo3 ( {{baseDir}})</li>
<li>unit test</li>
<li>cron</li>
</ul>
Komponenten
<ul>
<li>Pfade</li>
<li>Config</li>
<li>Database</li>
<li>Store</li>
</ul> QFQ - Bug #12516 (Closed): Password Hashing Exception Forkredhttps://project.math.uzh.ch/issues/125162021-05-10T08:57:31ZMarc Egger
<p>When the password reset form is saved, the following Exception is shown:</p>
<pre>
General Error: passwordHashing configuration of FE broken
</pre>
<p>The password hashing does work if it is used in a report. Problem only seems to appear when QFQ is called via API.</p> QFQ - Feature #12347 (Closed): Copy FormElement as Jsonhttps://project.math.uzh.ch/issues/123472021-04-09T09:51:39ZMarc Egger
<p>Wenn man als backend admin im Typo3 eingeloggt ist, wird neben jedem FormularElement ein "copy formElement as Json" angezeigt. Wenn man ihn drückt, wird das json in die zwischenablage kopiert.</p> QFQ - Feature #12345 (Closed): Form File Sync "Lite"https://project.math.uzh.ch/issues/123452021-04-08T18:33:38ZMarc Egger
<p>Habe mir Gedanken gemacht zum Form sync, falls wir ihn irgendwann wieder aktivieren wollen.</p>
<p>Durch das Requirement, dass Datenbank-Forms und Form Files zu jeder Zeit perfekt synchronisiert sind, ist der sync code sehr verstrickt.</p>
<p>Auch wenn der Form sync stabil ist, würde ich davon abraten ihn wieder zu aktivieren, so wie er jetzt ist.</p>
<p>Stattdessen würde ich eine "Lite" Version vorschlagen.</p>
<p>Vorschlag für eine "Lite" Variante des Form File Sync die einfacher nachzuvollziehen und stabiler ist:</p>
<ul>
<li>Add <strong>sync button</strong> for all forms and for single form to form-editor report (see mockup)
<ul>
<li>Edit Marc: I don't think the single form sync button is necessary.</li>
</ul>
</li>
<li><strong>Sync is performed only manually</strong> when a developer presses the sync button</li>
<li>Sync buttons are only active when file and database for that form of for all forms respectively are out of sync</li>
<li>When the sync button is pressed <strong>QFQ decides whether to import the file or export the form from database by comparing the fileStats</strong> column with the current file stats
<ul>
<li>the newer one is kept </li>
<li>file stats column format: {"modified":1617090967,"size":26634,"inode":1310848}</li>
</ul>
</li>
<li>Every time the form-editor report is loaded QFQ checks whether any forms are out of sync. If yes then an empty file named <strong>FORM_OUT_OF_SYNC</strong> is created in qfqProject.
<ul>
<li>As soon as all forms are back in sync the file is removed (the next time form-editor report is loaded)</li>
<li>The existence of this file can be checked in our bash sync scripts to warn the user</li>
</ul></li>
</ul>
<p>Advantage of this approach:</p>
<ul>
<li>There is a lot less hidden magic</li>
<li>The code involved is a lot less intrusive, if this feature breaks everything else still works</li>
<li>Added features to QFQ are a lot less likely to break this feature than the original form sync</li>
<li>We can still decide to offer an auto sync option where sync is executed automatically every time the form-editor report is opened
<ul>
<li>this is still a lot less complex than the current form sync</li>
</ul></li>
</ul>
<p>Ich würde den Aufwand für dieses Feature auf ca. 2 Arbeitstage für mich schätzen. Vieles ist schon da. Weniger "neues" als der json form-editor benötigt hat.</p>
<p>Mockup:<br /><img src="https://project.math.uzh.ch/attachments/download/4779/20210408-201711-420.png" alt="" /></p> QFQ - Feature #12337 (Some day maybe): Database.php: better cachinghttps://project.math.uzh.ch/issues/123372021-04-07T16:40:55ZMarc Egger
<p>Currently only the mysqli handle is cached but the Database object is recreated often.</p>
<p>Possible changes</p>
<ul>
<li>switch to singleton pattern for Database class (call Database::getInstance() instead of new Database)</li>
<li>make Database a static class (?)</li>
</ul>
<p>Both changes need a lot of refactoring.</p> QFQ - Bug #12325 (Priorize): MultiDB form.dbIndex not working for report syntaxhttps://project.math.uzh.ch/issues/123252021-04-06T17:01:14ZMarc Egger
<p>Ausgangspunkt:</p>
<ul>
<li>in der Config: indexQFQ ist 2, indexData ist 1</li>
<li>form.parameter.dbIndex={{indexQfq:Y}}</li>
<li>formElement.value enhält ein report (report syntax mit #!report)
<ul>
<li>in report ist gesetzt dbIndex={{indexQfq:Y}}</li>
</ul></li>
</ul>
<p>Verhalten:</p>
<ul>
<li>Laden des Forms funktioniert</li>
<li>Speichern funktioniert, aber nach dem speichern wird ein Fehler ausgegeben, da in dem oben genanten report trotzdem die falsche datenbank gewählt wird, beim updaten des forms mit den neu gespeicherten Daten.</li>
</ul> QFQ - Feature #12315 (New): Form History (Diffs) / Backupshttps://project.math.uzh.ch/issues/123152021-04-06T07:38:10ZMarc Egger
<p>Änderungen an den Forms und FormElements können im FormEditor oder Json FormEditor eingesehen werden und allenfalls zurückgesetzt.</p>
<p>Falls möglich wäre eine History die direkt mit der Datenbank arbeitet bevorzugt zu file diffs.</p>
<ul>
<li>(?) Special Column _diff fuer strings und files definieren</li>
<li>Eine Schnelle Lösung wäre auch beim Editiren via normalen Form Editor ein backup in qfqProject/form/.backup zu legen</li>
</ul> QFQ - Feature #12159 (Closed): Typo3 v9, QFQ htaccess einschub dokumentieren oder raus nehmenhttps://project.math.uzh.ch/issues/121592021-03-16T18:14:05ZMarc Egger
<p>URL Pfade mittels Base path absolut machen. (Carsten hat OK gegeben)</p>
<p>oder htaccess in QFQ doku aufnehmen.</p> QFQ - Bug #12153 (Closed): Gitlab Pipeline broken (Composer outdadted)https://project.math.uzh.ch/issues/121532021-03-16T11:06:47ZMarc Egger
<p>The Snapshot pipeline throws an exception.<br />Probably Composer on alfred16 is too old.</p>
<p>Current version of composer on alfred16:<br />1228-0> composer -V<br />Composer version <code>package_branch_alias_version</code> (1.0.0-beta2) 2016-03-27 16:00:34</p>
<p>will upgrade composer</p> QFQ - Bug #12016 (Closed): Password hashing fallback for Typo3 v8 not working in API requesthttps://project.math.uzh.ch/issues/120162021-02-15T11:05:16ZMarc Egger
<p>Typo3 v8:<br />When the Password hash is computed in a QFQ API request, then the Argon fallback is used.<br />But we expect it to use the algorithm defined by Typo3.</p> QFQ - Bug #12015 (Closed): Form instead of form in old form list reporthttps://project.math.uzh.ch/issues/120152021-02-15T09:17:19ZMarc Egger
<p><strong>Problem:</strong><br />Form names are case sensitive since the introduction of form as file.<br />In the old form list reports the form "form" is referred to as "Form" which is invalid.</p>
<p><strong>Solution:</strong> <br />Instead of updating all form-list reports we internalize the form-list report into the qfq extension.</p>
<ul>
<li>the default form-list report is saved in: qfq/extension/Resources/Private/Report/formEditor.qfqr</li>
<li>If the line "file=_formEditor" is present in a report then the above report file is rendered instead of the tt-content bodytext.</li>
<li>To enforce usage of the new form-list we throw an exception on QFQ update if the line "file=_formEditor" is not present in any tt-content bodytext.</li>
</ul> QFQ - Feature #11980 (Closed): Check if directory `protected` is really protected against direct ...https://project.math.uzh.ch/issues/119802021-02-09T10:39:55ZMarc Egger
<ul>
<li>mit dem qfqProject ordner ist es nun umso wichtiger, dass fileadmin/protected nicht von apache ausgeliefert wird.</li>
</ul>
<ul>
<li>zur zeit ist der hinweis zum protected verzeichnis in der doku ziemlich versteckt
<ul>
<li><a class="external" href="https://docs.qfq.io/en/master/Security.html?highlight=protected#secure-direct-file-access">https://docs.qfq.io/en/master/Security.html?highlight=protected#secure-direct-file-access</a></li>
</ul>
<ul>
<li>Ich würde vorschlagen den Hinweis prominenter zu machen.</li>
</ul></li>
</ul>
<ul>
<li>Wir könnten auch einen Test einbauen, ob dokumente unterhalb protected ausgeliefert werden. Ich habe das bei Dokuwiki gesehen</li>
</ul>
<p><strong>DOKUWIKI LOESUNG:</strong> In Dokuwiki wird ein Bild in Admin interface angezeigt, falls der Zugriff auf den Geschuetzten Ordner moeglich ist. Wir koennten dies im Form Editor Report auch machen. Der Form Editor report ist definiert in extension/resources/private/report</p>
<ul>
<li>möglicherweise kann man ab tzpo3 8 dies auch über das typo3 routing schützen</li>
</ul>
<ul>
<li>ein simpler zusatzschutz: automatisch eine .htaccess datei mit 'Deny from all' in protected verzeichnis legen</li>
</ul> QFQ - Support #11953 (Closed): überall absolue anstatt relative pfade verwenden für Filesystem pfadehttps://project.math.uzh.ch/issues/119532021-02-05T11:14:59ZMarc Egger
<p>anstatt cwdToApp zu setzen bei jedem Entrypoint, setzen wir absolutApp in Path:setMainPaths<br />Somit sind wir nicht mehr abhängig von dem CWD oder der art und weise wie ein Entrypoint aufgerufen wird.<br />Speziell für Unittests sollte dies eine grosse erleichterung sein.</p> QFQ - Feature #11890 (Closed): option to disable form as file synchttps://project.math.uzh.ch/issues/118902021-01-22T10:33:37ZMarc Egger
<p>Carsten: ein Status pro Form (in der DB) mit 'in sync','ignore and dont sync','sync to file' gut.</p>
<p>a) In dem Fall koennte man via DB die Form & FormElemente duplizieren (brauchen wir sowieso), und man setzt zuerst 'ignore and dont sync', dann kopiert man, dann setzt man 'sync to file' und der sync prozess setzt den status dann zurueck auf 'in sync'?<br />b) beim sync via script (dev > preview, ...) koennten anschnliessend der status auf 'sync to file' gesetzt werden.<br />Option kann pro Form im Form Editor als select geändert werden.</p> QFQ - Bug #11752 (New): checkbox renders multiple input elements with same namehttps://project.math.uzh.ch/issues/117522020-12-17T13:58:59ZMarc Egger
<p>The checkbox form element intentionally renders an additional hidden input element with the same name.<br />This leads to issues in the frontend where input elements are selected by name. see <a class="issue tracker-1 status-5 priority-4 priority-high2 closed" title="Bug: Checkbox does not work together correctly with required fields (Closed)" href="https://project.math.uzh.ch/issues/11750">#11750</a></p>
<p>The reason for the double input element is a workaround produced by Carsten in the PHP funciton AbstractBuildForm->buildCheckbox<br />It would be best if the hidden input element had a different unique name.</p> QFQ - Feature #11747 (New): Maintenance Page with Redirecthttps://project.math.uzh.ch/issues/117472020-12-16T15:35:23ZMarc Egger
<p>Create Simple maintenance page for the upgrade of forkred/production instance.</p>
<p>Find a way to redirect all but our requests to a maintenance page.</p>
<p>Solution1:<br />Use apache htaccess with mod_rewrite to rewrite all requests if they have a special directory. otherwise make redirect</p>
<p>Research:</p>
<p>apache - htaccess redirect all pages to single page - Stack Overflow<br /><a class="external" href="https://stackoverflow.com/questions/3522921/htaccess-redirect-all-pages-to-single-page">https://stackoverflow.com/questions/3522921/htaccess-redirect-all-pages-to-single-page</a></p>
<p>Simple HTML Maintenance Page for Apache using rewrite_module · GitHub<br /><a class="external" href="https://gist.github.com/jdeathe/206919260c8bd7e8b609471be9486ada">https://gist.github.com/jdeathe/206919260c8bd7e8b609471be9486ada</a></p> QFQ - Support #11741 (Closed): upgrade Typo3 9.5.22 (forkred)https://project.math.uzh.ch/issues/117412020-12-15T10:59:31ZMarc Egger
<p>Steps to upgrade Typo3 to 9.5.22 with QFQ and UZH CD taken for Forkred Project.</p>
<a name="Upgrade-Typo3-v8-to-most-recent-version"></a>
<h2 >Upgrade Typo3 v8 (to most recent version)<a href="#Upgrade-Typo3-v8-to-most-recent-version" class="wiki-anchor">¶</a></h2>
<ul>
<li>Backup LocalConfiguration.php!</li>
<li>download 8.7.32<br /><pre>
wget --content-disposition https://get.typo3.org/8.7.32
tar -xzf typo3_src-8.7.32.tar.gz
rm typo3_src-8.7.32.tar.gz
</pre></li>
</ul>
<ul>
<li>replace symlink typo3_src<br /><pre>
rm typo3_src
ln -s /var/www/typo3_src-8.7.32/ typo3_src
</pre></li>
</ul>
<ul>
<li>open T3 backend > install > upgraade wizard</li>
</ul>
<a name="Upgrade-Typo3-v9"></a>
<h2 >Upgrade Typo3 v9<a href="#Upgrade-Typo3-v9" class="wiki-anchor">¶</a></h2>
<ul>
<li>Backup LocalConfiguration.php!</li>
<li>update reference index:
<ul>
<li>“System” > “DB check” module and use the “Check and update global reference index” function.
<ul>
<li><a class="external" href="https://docs.typo3.org/m/typo3/guide-installation/master/en-us/Upgrade/UpdateReferenceIndex/Index.html">https://docs.typo3.org/m/typo3/guide-installation/master/en-us/Upgrade/UpdateReferenceIndex/Index.html</a></li>
</ul>
</li>
</ul>
</li>
<li>download 9.5.22<br /><pre>
wget --content-disposition https://get.typo3.org/9.5.22
tar -xzf typo3_src-9.5.22.tar.gz
rm typo3_src-9.5.22.tar.gz
</pre></li>
</ul>
<ul>
<li>replace symlink<br /><pre>
rm typo3_src
ln -s /var/www/typo3_src-9.5.22 typo3_src
</pre></li>
</ul>
<ul>
<li>upgrade wizzard
<ul>
<li>go install tool: install.php</li>
<li>upgrade > run upgrade wizard</li>
<li>execute all except the ones that install extensions
<ul>
<li>side note: executed but not sure if good: Merge be_groups access rights from pages_language_overlay to pages</li>
<li>side note: interesting: Introduce URL parts ("slugs") to all existing pages
<ul>
<li>TYPO3 includes native URL handling. Every page record has its own speaking URL path called "slug" which can be edited in TYPO3 Backend. However, it is necessary that all pages have a URL pre-filled. This is done by evaluating the page title / navigation title and all of its rootline.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Database analyze tool
<ul>
<li>go to install tool: install.php</li>
<li>Analyze Database Structure > apply all changes
<ul>
<li>removed tables renamed to: zzz_tableName</li>
<li>removed fields renamed to: zzz_fieldName</li>
<li>completely dropped one field: DROP INDEX `sys_log_uid` ON `sys_history` (Not done on forkred-simon !)</li>
</ul>
</li>
</ul>
</li>
<li>Optional (not done): Clear User Settings
<ul>
<li><a class="external" href="https://docs.typo3.org/m/typo3/guide-installation/master/en-us/Upgrade/ClearCachesAndUserSettings/Index.html">https://docs.typo3.org/m/typo3/guide-installation/master/en-us/Upgrade/ClearCachesAndUserSettings/Index.html</a></li>
</ul>
</li>
<li>clear caches
<ul>
<li>Maintanance > Flush Cache</li>
</ul>
</li>
<li>look at change log (just for info)
<ul>
<li>Upgrade > View Upgrade Documentation</li>
</ul>
</li>
<li>delete the other temporary files, which TYPO3 saves in typo3temp/ by doing:
<ul>
<li>Install tool > Maintanance > Remove Temporary Assets</li>
</ul>
</li>
<li>upgrade ldap manually (current version breaks Typo3>Extension)
<ul>
<li>extract newest version of ig_ldap_sso_aut to ext<br /><pre>
wget --content-disposition https://extensions.typo3.org/extension/download/ig_ldap_sso_auth/3.6.0/zip/
unzip ig_ldap_sso_auth_3.6.0.zip -d ig_ldap_sso_auth
rm ig_ldap_sso_auth_3.6.0.zip
chown -R www-data ig_ldap_sso_auth
</pre></li>
</ul></li>
</ul>
<ul>
<li>upgrad extensions in typo3>Extensions:
<ul>
<li>qfq (FAF)</li>
<li>uzh cd</li>
<li>static_info_tables: kollektion von tabellen mit sprache und country data</li>
<li>rdct: deprecated url routing with hash index.php?RDCT=$hash</li>
</ul>
</li>
<li>make sure that the upgraded extensions are activated</li>
<li>restore LDAP settings (check exactly these boxes):
<ul>
<li>Throw exception if configured incorrectly</li>
<li>Backend LDAP authentication</li>
<li>Backend user must exist</li>
<li>Enable local Backend users</li>
<li>Disable Backend group synchronization</li>
<li>Keep Backend groups</li>
<li>Frontend LDAP authentication</li>
<li>Disable Frontend group synchronization</li>
<li>Keep Frontend groups</li>
</ul>
</li>
<li>check if qfq settings are still there
<ul>
<li>if not: use var_export(unserialize('<qfq settings string>')) on the old qfq settings and replace the ones in LocalConfiguration.php</li>
<li>chown www-data LocalConfiguration.php</li>
</ul>
</li>
<li>Choose backend layout in Home>Edit>Appearance>Backend Layout > UZH CD - 4 column</li>
<li>search and replace title object removal by doing:
<ul>
<li>(Explenation: the line "cd.content.title >" causes exception!)</li>
<li>Typo3 > DB check: search for: "cd.content.title >" </li>
<li>replace all occurrences in templates with:<br /><pre>
# Hide the content title
cd.content.title >
cd.content.title = TEXT
cd.content.title.value =
</pre></li>
</ul></li>
</ul>
<ul>
<li>Typo3 routing
<ul>
<li>enable apache modules
<ul>
<li>Liste der modules: <a class="external" href="https://docs.typo3.org/m/typo3/guide-installation/master/en-us/In-depth/SystemRequirements/Index.html#apache">https://docs.typo3.org/m/typo3/guide-installation/master/en-us/In-depth/SystemRequirements/Index.html#apache</a><br /><pre>
a2enmod alias
a2enmod authz_core
a2enmod autoindex
a2enmod deflate
a2enmod expires
a2enmod filter
a2enmod headers
a2enmod rewrite
a2enmod setenvif
</pre></li>
</ul></li>
</ul></li>
</ul>
<ul>
<li>edit apache config<br /><pre>
vi /etc/apache2/apache2.conf
</pre></li>
</ul>
<ul>
<li>in apache config add directory and AllowOverride rule (adjust for your setup)<br /><pre>
<Directory /var/www/html/forkred-simon/>
Options Indexes FollowSymLinks
AllowOverride Indexes FileInfo AuthConfig Options=MultiViews,Indexes
Require all granted
</Directory>
</pre></li>
</ul>
<ul>
<li>.htaccess
<ul>
<li>copy from here to page root: <a class="external" href="https://github.com/TYPO3/TYPO3.CMS/blob/master/typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/root-htaccess">https://github.com/TYPO3/TYPO3.CMS/blob/master/typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/root-htaccess</a></li>
<li>Add redirect for Extensions for english language before line "# Stop rewrite processing, [...]" (not neccessary anymore since QFQ now creates correct absolute urls)<br /><pre>
# Marc: remove 'en' directory from url if path leads to extension directory and requested file does not exist,
# e.g.: en/typo3conf/ext/qfq/example.jpg ---> typo3conf/ext/qfq/example.jpg
# Explenation of used flags for RewritteRule:
# QSA: Appends any query string from the original request URL to any query string created in the rewrite target
# L: Stop the rewriting process immediately and don't apply any more rules.
# NC: Makes the pattern comparison case-insensitive.
# NE: Prevent mod_rewrite from applying hexcode escaping of special characters in the result of the rewrite.
# R=307: Forces an external redirect, with the specified HTTP status code: 307 (temporary redirect, keep http request method e.g. POST stays POST)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^en/typo3conf/ext/(.*)$ %{ENV:CWD}typo3conf/ext/$1 [QSA,L,NC,NE,R=307]
</pre></li>
</ul></li>
</ul>
<ul>
<li>restart apache
<ul>
<li>service apache2 reload</li>
<li>service apache2 restart</li>
</ul>
</li>
</ul>
<ul>
<li>add site configuration:
<ul>
<li>Typo3 > Sites (left) > Add new site configuration for this site
<ul>
<li>entry point: " <a class="external" href="https://webwork16.math.uzh.ch/forkred-simon/">https://webwork16.math.uzh.ch/forkred-simon/</a>" (adjust for your setup)</li>
<li>site identifier: forkred (adjust for your setup)</li>
<li>Languages
<ul>
<li>Deutsch
<ul>
<li>Entry Point: '/'</li>
<li>Language key: English</li>
<li>Locale: de_DE</li>
<li>Two leter ... : German</li>
<li>Navigation Title: Deutsch</li>
</ul>
</li>
<li>English
<ul>
<li>Entry Point: '/en/'</li>
<li>Language key: English</li>
<li>Locale: en_US.UTF-8</li>
<li>Two leter ... : English</li>
<li>Navigation Title: English</li>
<li>Fallback Type: Fallback ...</li>
<li>Fallback to language: Default Language</li>
</ul>
</li>
</ul>
</li>
<li>Error Page for 403 forbidden (shown when login expired):
<ul>
<li>Error Handling > Create New
<ul>
<li>HTTP Error status code: 403</li>
<li>How to handle Errors: Show Content from Page</li>
<li>Show Content from Page: t3://page?uid=1
<ul>
<li>this is the home page with the login form</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Edit root page > fill in "/" as URL Segment</li>
<li>remove typo3conf/ENABLE_INSTALL_TOOL</li>
<li>flush all cashes</li>
<li>Test if all is well
<ul>
<li>excel export testen</li>
<li>pdf generation testen</li>
<li>email testen</li>
<li>login english und deutsch</li>
</ul>
</li>
<li>delete backup files <strong><--- forkred/preview</strong></li>
</ul> QFQ - Feature #11516 (New): Multi Page Form (Previous/Next Buttons)https://project.math.uzh.ch/issues/115162020-11-13T09:58:46ZMarc Egger
<p>Feature Request von Simon.</p>
<p>Anstatt ein Formular in Pills aufzuteilen, wird es auf mehrere Seiten aufgeteilt, zwischen denen man mit einem Previous und Next Button hin und her schalten kann.<br /><strong>Das teilweise ausgefüllte Formular wird zwischengespeichert.</strong></p>
Variante1 (least effort)
<ul>
<li>Mittels QFQ report soll es möglich sein, einen Link zu erstellen, der das Formular speichert und dann auf eine gegebene Seite redirected</li>
<li>Das Formular wird auf mehre Formulare aufgeteilt und die Previous/Next Logik wird via QFQ links im report implementiert</li>
</ul>
Variante2 (high effort)
<ul>
<li>Optionale Funktion für ein Formular: Automatisch speichern des Forms bei jedem Verlassen eines Formularfeldes oder alle 30 sek.</li>
<li>Neue Optionale Buttons im Formular header: Anzeigen von Previous/Next button um zwischen Pills zu wechseln</li>
</ul>
<p><img alt="Diagram multi-page-form_1.png" class="drawioDiagram" style="" src="data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAV8AAADdCAYAAAAcunHmAAAEVHRFWHRteGZpbGUAJTNDbXhmaWxlJTIwaG9zdCUzRCUyMmVtYmVkLmRpYWdyYW1zLm5ldCUyMiUyMG1vZGlmaWVkJTNEJTIyMjAyMC0xMS0xM1QxMCUzQTAyJTNBNTYuMjg4WiUyMiUyMGFnZW50JTNEJTIyNS4wJTIwKFgxMSUzQiUyMExpbnV4JTIweDg2XzY0KSUyMEFwcGxlV2ViS2l0JTJGNTM3LjM2JTIwKEtIVE1MJTJDJTIwbGlrZSUyMEdlY2tvKSUyMENocm9tZSUyRjg2LjAuNDI0MC4xMTElMjBTYWZhcmklMkY1MzcuMzYlMjIlMjBldGFnJTNEJTIyRjAzNFkwaEUzMW5aVDh2ZFN0V3IlMjIlMjB2ZXJzaW9uJTNEJTIyMTMuOS43JTIyJTIwdHlwZSUzRCUyMmVtYmVkJTIyJTNFJTNDZGlhZ3JhbSUyMG5hbWUlM0QlMjJQYWdlLTElMjIlMjBpZCUzRCUyMjAlMjIlM0V6WmRCYzZNZ0ZNYyUyRmpYY1FZNUxqSnB1bWw4eDBKb2VlV1gxVnBpQVpRbXJTVDc4UVVhUFk2Ujdjb1NmaCUyRjBEZSUyRndlU2w0aHN4WFd2NktrOHlCeDRGS1A4R3BIZlVSekhLRTNNd3lxM1JzR1lyQnVsVUN4M1dpOGMyU2M0RVRuMXduSTREd1pxS2JsbXA2R1l5YXFDVEE4MHFwU3NoOFBlSkIlMkJ1ZXFJRmVNSXhvOXhYWDFtdXkwWmR4V212UHdNcnluWmxuRHAlMkZmMmoyWGloNXFkeDZsYXlnaVFqYXZzWjVQSmMwbCUyRldEUkhZUjJTb3BkZE1TMXkxd3k3VWwxc3g3JTJCaUxhcGF5ZzB2OHlnZUJGTSUyQldEOG92ejdUTFR0eGJFM1FyWUdTZ2ltN3BrR280bm10bG9iZmJlYUtVVzNQU3dhZm9adUtRJTJCUUdtNFBrZ3VvejFJQVZyZHpCQVhYVGc0N3VDc1hiZnVONEcwUThxSERlaWdVcmZ4UmZmbW5vQnBPQWhmQUVHcm53ZGtPUVNDeVFRUlBFRWtuUVhJZWdKSVNvVzF5WFZuTUNDZTFRaFBzdkR4VE5BaGM5QnBzVSUyRlJLWDRFSFpLRXhJTTlQQyUyQk1jeHljQ2w0a0FhbkVrMVRDWHpReENrbUZURkloNGFrRVBTdUpSJTJCVmdjM3VTU25oa2pDRTl0SCUyRldTcjdEVm5LcGpIS3ZSTWpteldBZFNaU3pvakxkekdBQ28yOHNIbWFLb1Y4dUlGaWUyMlVtZVE5M1pJN1BjelZDanZ5ZnZHWHFJNSUyQmxCTUNwaDd5aGpYWWNoRFVWbyUyRkEzMktnbzZLeCUyRlZ4VE1jeXFYM3lNS2Y1Mk5FYVglMkZENUhwOWxYN1BmYnd0NGpzJTJGZ0klM0QlM0MlMkZkaWFncmFtJTNFJTNDJTJGbXhmaWxlJTNFYMd3XgAAGsBJREFUeF7tnAuQj9X7wB8/97vBFBOaZIqQUiZFpbTIuOZW0YgkJs0olyiaComQkJBbSSg0aJRIF+VaEhFGEZIa6YKGwv7mOTP7nV3sOrt7vvue930/78x//j+7Z895ns/zfD/fZ89um09EUoUHAhCAAATylEA+lW9qKv7NU+ocBgEIxJpAvnz5BPnGugVIHgIQCIIA8g2COmdCAAKxJ4B8Y98CAIAABIIggHyDoM6ZEIBA7Akg39i3AAAgAIEgCCDfIKhzJgQgEHsCyDf2LQAACEAgCALINwjqnAkBCMSeAPKNfQsAAAIQCIIA8g2COmdCAAKxJ4B8Y98CAIAABIIggHyDoM6ZEIBA7Akg39i3AAAgAIEgCCDfIKhzJgQgEHsCyDf2LQAACEAgCALINwjqMTizWrVqcvDgQTl8+LCUKVMmkfHs2bOlW7duMm/ePLn33nutSKxatUpSUlKkcOHCGdYPGDBAhg0bZrUHiyDgGwHk61tFIhKPyve///6TIUOGyMMPP5zI6s4775QdO3bI+PHjsyXfHj16yL59+yJChzQgIIJ86YKkEFD5duzYUb788kv57LPPzBk//fSTdOjQQYoVKya9evWSM2fOyOTJk80affbv3y/169c3ki1UqFAiLp18s5LvjBkzjMz/97//ySWXXCITJ06U6tWry4svvihffPGFfPfdd3LDDTfIzTffLOvXr5eTJ0/K77//btbefffd8uGHH8r3338vAwcOlIceeigpPNgUAucSQL70RFIIqHxVivfdd58RXpUqVWT48OFSunRpWbRokZHvPffcI5UrV5bVq1dLzZo15ZlnnjHT8siRIzPEpPJt0qSJlCpVKvHxSy+9VHbt2mXk2qVLF9mwYYPox9566y15/vnnzXQ9ZswYmTZtmmzdulUKFixopDxlyhTZsmWLFC9eXKpWrWpiGDt2rPlY8+bN5dChQ0nhwaYQQL70QJ4QUPnq/a6KVqU4aNAgqVWrlpmC27VrZ+Srd75PP/20/PPPP0aUV1xxhfm8/v/0T1aTrwr7xIkTRqBpT7ly5YyUlyxZYiT85ptvmk/pGfrvmTNnmn83bNhQ+vfvL23atJEjR45IpUqVzFTMA4G8IMDkmxeUY3hGmnz1iqFr164ydepUI7/FixdLo0aNEvI9cOCA1KtXz0ykOqUuX778PFpZyVflferUKbN32lO2bFn59NNPzV76Q79JkyYl5Ltnzx5zVpp89U2hRYsWyDeGPRp0ysg36ApE9Pw0+ep0qROvTqP9+vWTVq1aZZCvpt+2bVvzbf+ECROkZcuW2ZLv559/Lg888IBs3LjRTNhvv/22ubvVe2MVMvKNaINFIC3kG4Ei+phCevmOGjXKXAv8/PPP5u41/eSrsS9dulT69Okje/fulfz582dLvrpYJ2a9zz179qyUL1/eSLxOnTrmB27I18fuICYlgHzpg0AJqDBVvJdffrk8+eSTgcbC4RDISwLINy9pc1YGAseOHTO/BdGgQQN59913pWjRohCCQGwIIN/YlJpEIQABnwggX5+qQSwQgEBsCCDf2JSaRCEAAZ8IIF+fqkEsEIBAbAgg39iUmkQhAAGfCCBfn6pBLBCAQGwIIN/YlJpEIQABnwggX5+qQSwQgEBsCCDf2JSaRCEAAZ8IIF+fqkEsEIBAbAgg39iUmkQhAAGfCCBfn6pBLBCAQGwIIN/YlJpEIQABnwgkRb66KQ8EIACBqBFITU11llLS5OsySGfZshEEIACBHBJQWbr0GvLNYSH4MghAIF4EkG+86k22EICAJwSQryeFIAwIQCBeBJBvvOpNthCAgCcEkK8nhSAMCEAgXgSQb7zqTbYQgIAnBJCvJ4UgDAhAIF4EkG+86k22EICAJwSQryeFIAwIQCBeBJBvvOpNthCAgCcEkK8nhSAMCEAgXgSQb7zqTbYQgIAnBJCvJ4UgDAhAIF4EIiXfIP/0pMu/TpTsFowKJ/LIfaeEqW+zm63v/RE5+QbRTK4hZrfJsrs+qHhdn+t6P1uOrs91vV9Qediem1frfOfqOr5A/6Sk62RsmySoc23jO3ddUPG6Ptf1frY8XZ/rer+g8rA9N6/W+c7VdXzIN686KxfnuC66bSiuz3W9H3nYEgjHOt/7w3V8yDcEfem66LYpuz7X9X7kYUsgHOt87w/X8SHfEPSl66Lbpuz6XNf7kYctgXCs870/XMeHfEPQl66Lbpuy63Nd70cetgTCsc73/nAdH/INQV+6Lrptyq7Pdb0fedgSCMc63/vDdXzINwR96brotim7Ptf1fuRhSyAc63zvD9fxId8Q9KXrotum7Ppc1/uRhy2BcKzzvT9cx4d8Q9CXrotum7Lrc13vRx62BMKxzvf+cB0f8g1BX7ouum3Krs91vR952BIIxzrf+8N1fMg3BH15btEXLlwoHTt2lEKFCokpYL58Ur16dRk1apSkpKTImDFjZOfOnTJ9+nQpUKCAHD582Py7V69e8t133yUyPnbsmNxxxx0yadIkqV+//nkkktFs6f9z8tzm8d9//0nfvn3l448/NrFfe+21MmXKFClbtmyGXHzP499//5XHHntMPvnkE1PLFi1ayOjRoyV//vxJzcO31nddJ9v8bM+1XZedc/OJSKrLv7FgG6TtusyS2bx5s6xYsUIGDx5sm69Zl9tzs3WYg8UXku/w4cNly5Ytid3feOMN6dOnj+zfv1+LKfqCrlChQqbyXbVqlXnB7927Vz799NPA5JubPMaNGyeax5IlS0yevXv3NrlPnTo1qdJyXQ99s/z888/lvffek7Nnz0rDhg3Nm8p9992X1DwctKbTLbL7uhw5cqQ0bdpU6tatm6s4bM+1XWcbTOgmX53W5s2bJ6+//rqZ/FQ45zbpxZJ3DfFi5+X28zYvdj2jcOHCsn79ejMJXmzybd26tTz55JPSs2dPMyEHNfmeK9/s5LFu3TopWbKk1KpVyyCeNWuWLF68WJYtW5ZUabmuhwr31KlTUrRoUTl69Kjceuut5ruXu+++O6l55LYvXX99dl+X6oGJEyeKfgf08MMPGw9oP2T3sT3Xdp3t+aGSr8pCv1Vt27atPPTQQ1KjRg3bPEPdxBd7seuUO3PmTBk6dKj89NNPMnny5IvKNw2IissX+eYmjyNHjsgtt9wiOg21a9cuqfVOVj2effZZcwWkNfnggw+MjNM/rl/8OXrxJPGLcprfjh07ZMaMGeY7hw4dOpjrt+w8tufarrM9O1Ty1euFNPn26NFDrrrqKts8Q93EF3qxd+rUKfEur5/XNyIVz+23325956tQgpavizx2796deEN+4oknzuuJZLxozr27dpGHBn769Gnp3r27ue/VSR75XvwlvmvXLjNA6Hc9+rMQfR1k57HtD9t1tmeHSr6a1PHjx2Xu3Lkybdo0KV68uLl2UODZeVxDzM7ZOVl7sUnr3D1tf+Dmg3wvdO2Qlo9NHnrnr99yTpgwQdq0aXNBvK7r7boeeud+6aWXJr6T+/DDD2XAgAGybds25JvFC+add94x3ymcOHHCXJ917txZSpQoke2XmG1/2K6zDSB08k2f2KZNm0QbVb/dzs7jGmJ2zs7JWtcv9vQxBD355ka+a9euFZ04VcDXXHNNpmhd19t1PV544QVZs2aNLF261PwwuGvXrlK+fHl55ZVXkG8WL5hhw4ZJs2bNpF69ejl5WSW+xrY/bNfZBhNq+domee461xBzGoft17l+sUdFvg0aNJCNGzeaHzSmPfqTb/3NgfSP63q7rof+wEivS1auXGnk26hRIxk7dqwUK1YsqXnY9l9erXNdJ9u4bc+1XZedc0P7q2a2SUZNvjnNO7tfl4xmc/krjbb5kIctqWDXua6TbTa259quy865yNeWVkDrXBfdNg3X57rejzxsCYRjne/94To+rh1C0Jeui26bsutzXe9HHrYEwrHO9/5wHR/yDUFfui66bcquz3W9H3nYEgjHOt/7w3V8yDcEfem66LYpuz7X9X7kYUsgHOt87w/X8SHfEPSl66Lbpuz6XNf7kYctgXCs870/XMeHfEPQl66Lbpuy63Nd70cetgTCsc73/nAdH/INQV+6Lrptyq7Pdb0fedgSCMc63/vDdXzINwR96brotim7Ptf1fuRhSyAc63zvD9fxId8Q9KXrotum7Ppc1/uRhy2BcKzzvT9cxxe4fINqiyD+S6uc5qpFCupxyYk8cl9Fl/XIfTRud/C9PyIlX7elYzcIQAACySOAfJPHlp0hAAEIZEoA+dIcEIAABAIggHwDgM6REIAABJAvPQABCEAgAALINwDoHAkBCEAA+dIDEIAABAIggHwDgM6REIAABJAvPQABCEAgAALINwDoHAkBCEAA+dIDEIAABAIggHwDgM6REIAABJAvPQABCEAgAALINwDoHAkBCEAgNPKlVBCAAASiRsDln/RMyt/zjRpw8oEABCDgmgDydU2U/SAAAQhYEEC+FpBYAgEIQMA1AeTrmij7QQACELAggHwtILEEAhCAgGsCyNc1UfaDAAQgYEEA+VpAYgkEIAAB1wSQr2ui7AcBCEDAggDytYDEEghAAAKuCSBf10TZDwIQgIAFAeRrAYklEIAABFwTQL6uibIfBCAAAQsCyNcCEksgAAEIuCaAfF0TZT8IQAACFgSQrwUklkAAAhBwTQD5uibKfhCAAAQsCCBfC0gsgQAEIOCaAPJ1TZT9IAABCFgQQL4WkFgCAQhAwDUB5OuaKPtBAAIQsCCAfC0gsQQCEICAawLI1zVR9oMABCBgQQD5WkBiCQQgAAHXBJCva6LsBwEIQMCCAPK1gMQSCEAAAq4JIF/XRNkPAhCAgAUB5GsBiSUQgAAEXBNAvq6Jsh8EIAABCwLI1wISSyAAAQi4JpAU+eqmPBCAAASiRiA1NdVZSkmTr8sgnWXLRhCAAARySEBl6dJryDeHheDLIACBeBFAvvGqN9lCAAKeEEC+nhSCMCAAgXgRQL7xqjfZQgACnhBAvp4UgjAgAIF4EUC+8ao32UIAAp4QQL6eFIIwIACBeBFAvvGqN9lCAAKeEEC+nhSCMCAAgXgRQL7xqjfZQgACnhBAvp4UIuphNGzYUDZs2CD58+fPkOpff/0lhQsXTmr677//vrRq1UoKFSqU4ZwKFSrIvn37ZPjw4XL48GGZNGlSUuPIavOhQ4fKbbfdJikpKZkue+SRR+SKK66QQYMGBRYnB7sjgHzdsWSnLAiofHv06CEPPvhgnnNS+fbv31927tx5wbN9kK/yGTJkiDRr1uy8GPfs2SOPPvqofPHFF6KSRr553kJJORD5JgUrm55LICv5nj592sjxo48+MpNxvXr1ZPz48VKqVCkpUaKEtG3bVlasWCHLli2Tpk2bik6A3377rRw6dEj69Okja9askf3798uZM2dERVumTJkMx2dHvt988408/vjj8vfff4u+OAYPHizt27eXr776Snr27Ck1atSQX3/9VXRi13ULFy6UvXv3mpinTZtmzp0/f76MGTNGzp49K6VLlza51KlTx3xs48aNcvLkSfnjjz+kYMGCMmfOHFmyZIkR6mWXXSYTJ06Uu+66K0P8yqZ27dqyadMmqVSpEvKNyMsL+UakkL6nofLdvHlzhm/9X375ZenWrZuMGDFC1q9fL4sWLZICBQpIr169RIU8c+ZMKVKkiIwdO9aIT8WsQn7ppZekd+/eMmvWLCPfH374QfQKoU2bNtK8eXOzNv2j8m3durWULFkyw8e7d+8u48aNS1w7jB492khu6dKlUrNmTTly5IjcdNNNsnz5cjl27JjUr19ftmzZIrVq1ZKuXbuaSXrt2rVG+pUrVzZvAidOnDCf0/+t4tWrlk6dOhlBax5Tp06VrVu3StGiRUXPr1ixosk/q8k3LWjNFfn63un28SFfe1aszAWBrCZfvescMGCAtGzZ0pywbds2M/3phKny3bFjh1StWtV8Tidh/XeVKlVk1apVZmJWIeqTmZxsJ9/7779fGjduLFdffXUi0z///FNGjRolV155pXTs2FF+/PFH8zm9Ijh+/LiZavVRIU+fPl1Wr14t+qaiU2za89tvvxkJL1iwQLZv327eNPTRSVjfOF577TXkm4veCuuXIt+wVi5kcWcl3wYNGphv71u0aGGy0smwUaNGcvToUSPfgwcPSvny5RPy1TtQnXRVvvrtul4JuJCvTqgq4AMHDiTo/vLLL1KuXDkTU5cuXRL3xipfvT5QgaaX78qVK2X37t3mOiHt0SsRnYx18tXYp0yZkpBv2r+ZfEPW0A7CRb4OILLFxQlkJd9hw4aZu1C9dtB7UL1S0DtRnRTzUr4jR46UatWqmauIzp07G1HeeOONsm7dOnOdYCNfJdGkSRNzP6sTtOag07leO+iUnJl89c2mb9++5uoks4drh4v3WZhWIN8wVSvEsWYl31OnTsnAgQPNJKt3vSo8/cFT2bJlnclXf9WsWLFi5xHUKVXvltN+1Uzvnvv162fuePUHZk899ZSZhnW6tpGv3gvPnj3bTLn64tIzJ0+eLHXr1jVTcmby1fXPPfecTJgwIdPfCEG+IX4BXCB05ButepINBCAQEgLINySFIkwIQCBaBJBvtOpJNhCAQEgIIN+QFIowIQCBaBFAvtGqJ9lAAAIhIYB8Q1IowoQABKJFAPlGq55kAwEIhIQA8g1JoQgTAhCIFgHkG616kg0EIBASAsg3JIUiTAhAIFoEQiPfaGEnGwhAAAIiqampzjCozPOJ2dPdps6iYyMIQAACESWAfCNaWNKCAAT8JoB8/a4P0UEAAhElgHwjWljSggAE/CaAfP2uD9FBAAIRJYB8I1pY0oIABPwmgHz9rg/RQQACESWAfCNaWNKCAAT8JoB8/a4P0UEAAhElkBT56qY8EIAABKJGwOV/jJY0+boMMmoFJB8IQCB8BELztx2Qb/iai4ghAIHMCSBfugMCEIBAAASQbwDQORICEIAA8qUHIAABCARAAPkGAJ0jIQABCCBfegACEIBAAASQbwDQORICEIAA8qUHIAABCARAAPkGAJ0jIQABCCBfegACEIBAAASQbwDQ43hkw4YNZcOGDZI/f/4M6f/1119SuHDhpCJ5//33pVWrVlKoUKEM51SoUEH27dsnw4cPl8OHD8ukSZOSGkdWmw8dOlRuu+02SUlJOW/ZlClTZOLEiebjZcqUkVdffVWuu+66wGLlYDcEkK8bjuxyEQIq3x49esiDDz6Y56xUvv3795edO3de8Gwf5Kt8hgwZIs2aNcsQ49dffy2tW7eWzZs3yyWXXCLz5s2TZ599Vnbt2pXnHDnQLQHk65Ynu2VCICv5nj592sjxo48+MpNxvXr1ZPz48VKqVCkpUaKEtG3bVlasWCHLli2Tpk2byiOPPCLffvutHDp0SPr06SNr1qyR/fv3y5kzZ0RFq9Nh+ic78v3mm2/k8ccfl7///lv0xTF48GBp3769fPXVV9KzZ0+pUaOG/Prrr6ITu65buHCh7N2718Q8bdo0c+z8+fNlzJgxcvbsWSldurTJpU6dOuZjGzdulJMnT8off/whBQsWlDlz5siSJUtk0KBBctlll5kJ96677kqE/+OPP4r+X9rH9CzdS8/nr/2F++WGfMNdv9BEr/LV6S39t/4vv/yydOvWTUaMGCHr16+XRYsWSYECBaRXr16iQp45c6YUKVJExo4da8SnYlYhv/TSS9K7d2+ZNWuWke8PP/wgeoXQpk0bad68uVl7rnx1eixZsmSGj3fv3l3GjRuXuHYYPXq01K5dW5YuXSo1a9aUI0eOyE033STLly+XY8eOSf369WXLli1Sq1Yt6dq1q5mk165da6RfuXJl8yZw4sQJ8zn93ypevWrp1KmTEbTmMXXqVNm6dasULVpU9PyKFSua/DObfNMHrDLv2LGj+Zq0a4jQNACBnkcA+dIUeUIgq8lX7zoHDBggLVu2NLFs27bNTHo6Yap8d+zYIVWrVjWf00lY/12lShVZtWqVmZhViPqoiCtVqmSmyJxMvvfff780btxYrr766sSX//nnnzJq1Ci58sorjfh0CtVHrwiOHz9uplp9VMjTp0+X1atXi76p6BSb9vz2229GwgsWLJDt27ebNw19dBLWN47XXnvtovJV+T/wwAPmzWvu3LlmauYJNwHkG+76hSb6rOTboEED8+19ixYtTD46GTZq1EiOHj1q5Hvw4EEpX758Qr579uwxk67KV0WrVwIu5KsTqgr4wIEDCa6//PKLlCtXzsTUpUuXxL2xylevD1Sg6eW7cuVK2b17t7lOSHv0SkQnY518NXb9AVqafNP+ndXkq8LXHxjq9cvzzz/PdUNouj7rQJFvRArpexpZyXfYsGHmLlSvHXSi0ysFvRPVSTEv5Tty5EipVq2auYro3LmzEeWNN94o69atM9cJNvLVOjRp0kQ2bdpkJmjNQadzvXbQKTkz+eqbTd++fc3VSfpHOVx//fWiVyI6efNEhwDyjU4tvc4kK/meOnVKBg4caCZZvetV4emdZtmyZZ3JVyfHYsWKncdIp1S9W077VTO9e+7Xr5+549U71qeeespMwzpd28hX74Vnz55tplx9cemZkydPlrp165opOTP56vrnnntOJkyYkOE3Qp5++mnRN4VzY9crmeLFi3tdc4Jj8qUHIAABCHhHgMnXu5IQEAQgEAcCyDcOVSZHCEDAOwLI17uSEBAEIBAHAsg3DlUmRwhAwDsCyNe7khAQBCAQBwLINw5VJkcIQMA7AsjXu5IQEAQgEAcCyDcOVSZHCEDAOwLI17uSEBAEIBAHAqGRbxyKQY4QgEC8CKSmpjpLWGWeT0RSXW7qLDo2ggAEIBBRAsg3ooUlLQhAwG8CyNfv+hAdBCAQUQLIN6KFJS0IQMBvAsjX7/oQHQQgEFECyDeihSUtCEDAbwLI1+/6EB0EIBBRAsg3ooUlLQhAwG8CyNfv+hAdBCAQUQLIN6KFJS0IQMBvAsjX7/oQHQQgEFECyDeihSUtCEDAbwLI1+/6EB0EIBBRAsg3ooUlLQhAwG8CyNfv+hAdBCAQUQLIN6KFJS0IQMBvAsjX7/oQHQQgEFECyDeihSUtCEDAbwLI1+/6EB0EIBBRAgn5RjQ/0oIABCDgLYH/A47rYh7JMniTAAAAAElFTkSuQmCC" /></p> QFQ - Bug #11430 (Closed): phpSpreadsheet Exception: Numeric value is not a numberhttps://project.math.uzh.ch/issues/114302020-10-30T16:39:58ZMarc Egger
<p>New version of phpSpreadsheet throws an exception when an empty string is passed for a number i.e. 'n='.</p>
<p>This was not the case before, so we have alot of applications where this error occurs.</p>
<p>We have decided to treat this situtation before writing the value to the excel the following way:</p>
<ul>
<li>If the value is an empty string or consists only of spaces: change the value to empty string and type string. i.e. 's='</li>
<li>otherwise, if the value is not a number then replace the value by 'not a number' and set type to string. i.e. 's=not a number'</li>
</ul> QFQ - Feature #11323 (Closed): Report Frontend Editor Modal + Codemirrorhttps://project.math.uzh.ch/issues/113232020-10-15T08:42:57ZMarc Egger
<p>Report Frontend editor in einem Modal anzeigen damit auch reports editiert werden koennen, die im Rand dargestellt werden.</p>
<p>Codemirror im editor benutzen mit syntax highlighting</p> QFQ - Feature #11322 (Some day maybe): Form Element JSON - (multiline parameter field)https://project.math.uzh.ch/issues/113222020-10-15T08:41:02ZMarc Egger
<p>Problem: SQL Queries im Paramter Feld von Form und FormElement muessen auf einer Zeile sein. Newline wird nicht unterstuetzt.</p>
<p>Moegliche Loesung: Einfuehren von neuem FormElment typ 'JSON' und diesen benutzen fuer das Parameter Feld</p>
<p>FormElement-JSON:</p>
<ul>
<li>Parameter werden neu als JSON key>value gespeichert</li>
<li>das JSON FormElement erhaelt das JSON aus der Datenbank als Value und erstellt pro key>value paar eine eigene textbox</li>
<li>zusatzlich wird immer eine leere textbox angezeigt, in die man ein neues key>value paar eintragen kann. Wird etwas in diese box geschrieben, erscheint automatisch eine weitere leere textbox</li>
<li>beim abspeichern des forms werden die Inhalte der dynamischen textboxen als JSON encodiert und als Value von dem FormElement-JSON geschickt.</li>
</ul> QFQ - Feature #11320 (Rejected): Typo3 Version 10 supporthttps://project.math.uzh.ch/issues/113202020-10-15T08:29:01ZMarc Egger
<p>QFQ auf Typo3 10 testen und kompatibel machen.</p> QFQ - Feature #11217 (Some day maybe): Extend Script Functionalityhttps://project.math.uzh.ch/issues/112172020-09-29T11:19:30ZMarc Egger
<p><strong>Script Keyword:</strong></p>
<p><strong>10.script =</strong> path/to/script.php|call:my_function|arg:myVar=hello&myVar2=world</p>
<ul>
<li>Zusaetzlich zur special column "_script" kann man direkt das keyword "script" im report benutzen</li>
<li>Reihenfolge der keyword Ausfuehrung:
<ul>
<li>10.sql existiert:
<ul>
<li>10.script wird nach 10.sql und vor 10.tail und 10.twig ausgefuehrt</li>
<li>Falls in 10.sql kein record selektiert wird, wird 10.script auch nicht ausgefuerht!</li>
</ul>
</li>
<li>10.sql existiert nicht:
<ul>
<li>10.script wird immer ausgefuehrt</li>
</ul></li>
</ul></li>
</ul>
<p><strong>Neue QFQ Funktionalitaeten im script:</strong></p>
<ul>
<li>SQL statement feuern: <strong>$qfq::sql('SELECT "Hello World"');</strong>
<ul>
<li>QFQ Variabeln {{myVar:R}} werden ersetzt vor dem abfeueren.
<ul>
<li>dies kann mit einem zusaetlichen flag ausgeschaltet werden</li>
</ul>
</li>
</ul>
</li>
<li>Twig template rendern: <strong>$qfq::twig('...')</strong></li>
</ul> QFQ - Bug #11134 (Closed): Set samesite header for cookies correctlyhttps://project.math.uzh.ch/issues/111342020-09-08T16:07:06ZMarc Egger
<p>Firefox warnt, dass das qfq cookie bald abgelehnt wird, weil das samesite attribute nicht richtig gesetzt wurde.</p>
<p>Ab PHP 7.3 kann der default in php.ini festgelegt werden.</p>
Todo:
<ul>
<li>Default samesite in QFQ setzen, allenfalls in den settings konfigurierbar machen</li>
</ul>
<p><strong>info zu samesite</strong> : "allows you to declare if your cookie should be restricted to a first-party or same-site context. " (<a class="external" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite">https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite</a>)<br /><strong>samesite in php setzen</strong> : <a class="external" href="https://stackoverflow.com/a/51128675">https://stackoverflow.com/a/51128675</a></p>
<p><strong>Firefox warning</strong> : Cookie “qfq” will be soon rejected because it has the “SameSite” attribute set to “None” or an invalid value, without the “secure” attribute. To know more about the “SameSite“ attribute, read <a class="external" href="https://developer.mozilla.org/docs/Web/HTTP/Headers/Set-Cookie/SameSite">https://developer.mozilla.org/docs/Web/HTTP/Headers/Set-Cookie/SameSite</a></p> QFQ - Feature #11036 (New): inline report editor permissionshttps://project.math.uzh.ch/issues/110362020-08-18T09:21:54ZMarc Egger
<p>Add the possibility to give and take users permission to edit qfq reports in the frontend.</p>
<p>Carsten wish list:<br />- frontend edit komplett auschalten koennen (CR)<br />- frontend editor wird nicht pauschal ausgeliefert, sondern nur wenn auch angezeigt. (CR)<br />- zentrale konfig, ob es angezeigt wird. (sekreteaerin soll nicht sehen obwohl BE login) (CR)<br />- pro user option, ob gezeigt wird. (CR)</p> QFQ - Feature #11035 (Closed): QFQ without Typo3https://project.math.uzh.ch/issues/110352020-08-18T09:06:13ZMarc Egger
<p>Provide an optional way of rendering QFQ reports without Typo3.</p>
<p><strong>BRANCH</strong>: F11035QfqWithoutTypo3</p>
<p><strong>STATUS</strong>: Das File extension/NoT3Page/index.php (in dem obigen Branch) ist ein erster Test um einen QFQ Report zu rendern, ohne T3. Es funktioniert, aber es sind einige hacks involiviert. Der Branch ist nicht mehr in sync mit dem aktuellen Dev.</p>
<hr />
<p>Especially useful for selenium tests.</p>
<p>Use a template engine like Twig or PhpCake or plain PHP.</p>
<p>Possible hurdles:<br />- Config<br />- Typo3 Variables<br />- User management<br />- Page ID and Link</p> QFQ - Feature #11034 (Closed): Separate Config store from store classhttps://project.math.uzh.ch/issues/110342020-08-18T09:02:39ZMarc Egger
<p>Since we need config very early in the bootstrap process of QFQ, we want to separate it from the Store class.</p> QFQ - Feature #10745 (Some day maybe): Tablesorter Excel Exporthttps://project.math.uzh.ch/issues/107452020-06-11T15:33:14ZMarc Egger
<p>Export tablesorter content to CSV or JSON file.<br />Either everything or only the filtered view.</p>
<p>Plugin: <a class="external" href="https://mottie.github.io/tablesorter/docs/example-widget-output.html">https://mottie.github.io/tablesorter/docs/example-widget-output.html</a></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 - Feature #10716 (Some day maybe): Business Logic mit Externen Skriptenhttps://project.math.uzh.ch/issues/107162020-06-04T17:52:19ZMarc Egger
<p>Auführen von separaten Skripten und Programmen via _exec ist Fehleranfällig. Hauptsächlich weil das Character Encoding und das Sanitizen Probleme machen kann.</p>
<p>Schön wäre eine Möglichkeit, um Programme oder Funktionen in Skripten dirkekt auszuführen, ohne die Argumente Sanitizen oder encoden zu muessen.</p>
<p>Eine Möglichkeit wäre auch, dass man PHP als Skriptsprache für kompliziertere business-logic einbinden könnte.</p>
<p>Dieses feature ist nach verwandt mit QFQ Funktionen und Conditions und würde diese allenfalls ersetzen. >>> Brainstormen!</p>
<p>Varianten</p>
<ul>
<li>PHP als Skriptsprache einbinden</li>
<li>Javascript mit node.js oder deno.land ausführen</li>
</ul> QFQ - Feature #10715 (Closed): wkhtmltopdf ersetzen: puppeteerhttps://project.math.uzh.ch/issues/107152020-06-04T17:41:06ZMarc Egger
<p>Prio4 von Nicola</p>
<p>Varianten:</p>
<ul>
<li>pupeteer <a class="external" href="https://pptr.dev/">https://pptr.dev/</a>
<ul>
<li>wkhtmltopdf VS pupeteer: <a class="external" href="https://medium.com/coletiv-stories/puppeteer-vs-wkhtmltopdf-and-why-i-created-a-new-module-9466eb1db7d1">https://medium.com/coletiv-stories/puppeteer-vs-wkhtmltopdf-and-why-i-created-a-new-module-9466eb1db7d1</a></li>
<li><a class="external" href="https://crpdf.evens.eu/">https://crpdf.evens.eu/</a> (alt)</li>
</ul>
</li>
<li>Pandoc</li>
<li>generate latex using a twig template (actually a separate feature)</li>
<li>Chrome Headless: <a class="external" href="https://developers.google.com/web/updates/2017/04/headless-chrome#create_a_pdf_dom">https://developers.google.com/web/updates/2017/04/headless-chrome#create_a_pdf_dom</a></li>
</ul>
<a name="Tools"></a>
<h2 >Tools<a href="#Tools" class="wiki-anchor">¶</a></h2>
<ul>
<li>Artikel zum Thema: <a class="external" href="https://www.paperplane.app/blog/modern-html-to-pdf-conversion-2019/">https://www.paperplane.app/blog/modern-html-to-pdf-conversion-2019/</a></li>
</ul>
<p>Diese koennen vermutlich alle kein JS, sind dafuer aber als LIB oder API sehr schnell:</p>
<ul>
<li><a class="external" href="https://weasyprint.org/">https://weasyprint.org/</a></li>
<li><a class="external" href="https://www.pagedjs.org">https://www.pagedjs.org</a></li>
<li><a class="external" href="https://github.com/esbenp/pdf-bot">https://github.com/esbenp/pdf-bot</a></li>
</ul> QFQ - Feature #10714 (New): multi Table Formhttps://project.math.uzh.ch/issues/107142020-06-04T17:36:39ZMarc Egger
<p>Prio3 von Nicola</p>
<p>Brainstorming mit Nicola machen bevor implementieren!</p>
<p>Forms auf mehrere Tabellen (statt mit Action-Element)</p>
<p>Vorschlag:</p>
<ul>
<li>Neuer FormElement Container namens "TableSwitch" (?).</li>
<li>Der Container hat zwei parameter: den Tabellennamen und die record id der subtabelle</li>
<li>Falls der Container den namen einer bestehenden spalte in der tabelle des forms hat, dann wird automatisch die record id aus dieser spalte genommen</li>
<li>Alle FormElemnts in dem Container speichern in der Tabelle die im Container angegeben wurde.</li>
</ul> QFQ - Feature #10713 (Rejected): QFQ functions (reusable reports)https://project.math.uzh.ch/issues/107132020-06-04T17:22:37ZMarc Egger
<p>Prio2 für Nicola</p>
<p>QFQ Report code als Funktion verpacken mit parameter. Diese Funktion kann dann in anderern Reports benutzt werden.</p>
<p>Ist nahe an dem QFQ patterns Vorschlag von Benj: <a href="https://project.math.uzh.ch/issues/10345" class="external">#10345</a></p>
<p>Angefragt durch Nicola. Use Cases Nicola: <a class="attachment" href="https://project.math.uzh.ch/attachments/3805">use-cases_conditions-functions.txt</a></p>
<p>Gedanken von Nicola zum Thema:</p>
<blockquote>
<p>*) Ich denke auch, dass wir vermeiden sollten QFQ zu stark auszubauen. Für<br />mich wäre es also auch ok, wenn wir zur Einsicht kommen, dass wir Student<br />Admin auf eine andere Lösung migrieren müssen. (Wäre eine spannende Frage, wie<br />das möglichst weitgehend automatisiert werden kann. :-)<br /> *) Die Idee, volle <abbr title="Python">PHP</abbr>-Funktionen einzubinden finde ich ziemlich<br />vielversprechend. Damit könnte die Komplexität von QFQ selbst hoffentlich tief<br />gehalten werden. Wichtig wäre aber sicher, dass in diesen Funktionen effizient<br />QFQ-Funktionalität genutzt werden kann (z.B. den QFQ-Mailer aufrufen oder die<br />QFQ-DB-Verbindung nutzen.)</p>
</blockquote> QFQ - Feature #10648 (Closed): Dokumentation direkt rendern mit Sphinxhttps://project.math.uzh.ch/issues/106482020-05-26T07:23:46ZMarc Egger
<p>Todo:<br />x Warnings raus bringen (Sphinx)<br />x Ein file pro Kapitel<br />x auf OK von Carsten warten<br />x merge branch in develop<br />x readthedocs build settings auf master und develop branch umstellen<br />x Weiterleitung qfq.io/doc und doc.qfq.io nach qfq.readthedocs.io<br />x documentation rendering webhook einrichten bei einem push auf master<br />x new user suport@math for readthedocs >>> Password is in kpdev!</p> QFQ - Feature #10569 (ToDo): link _blank more safehttps://project.math.uzh.ch/issues/105692020-05-13T13:57:56ZMarc Egger
<p>Add <br /><pre><code class="html syntaxhl">rel="noopener noreferrer"
</code></pre><br />to every qfq link with target _blank</p>
<p>This avoids certain attacks:<br /><a class="external" href="https://dev.to/olasheni/using-target-blank-the-malicious-way-3bif">https://dev.to/olasheni/using-target-blank-the-malicious-way-3bif</a></p> QFQ - Bug #10213 (Closed): Dokumentation rendert ohne Navigation (Docker)https://project.math.uzh.ch/issues/102132020-03-03T18:37:10ZMarc Egger
<p>Das bauen der QFQ Doku via Docker macht Probleme - es sieht nun etwas anders aus und vor allem hat die Navigation keine Sub-Menus mehr. Koenntest Du Dir das mal anschauen? ` <code>make qfq-local</code> `. Vielen Dank</p> QFQ - Feature #10120 (Closed): Form als Filehttps://project.math.uzh.ch/issues/101202020-02-13T18:45:44ZMarc Egger
<p>Prio1 für Nicola!</p>
<p>TODO:<br />- Beispiel mit Multiline String<br />- Was hat sich von TOML 0.4 auf 1.0 geandert?<br />- FormElements > FormElement_ (Einzahl)<br />- script PHP: Form aus Datenbank lesen und in JSON/TOML abspeichern<br />- SQL SELECTs in Form rendering mit JSON/TOML auslesen ersetzen</p>
<p>FRAGEN:<br />- Wie ordnen wir FormElements im TOML?<br /> - immer nach ord?<br /> - was wenn ord in file geändert wurde und dann in QFQ geladen? Automatisch FormElemente neu nach ord ordnen und in file speichern?</p>
<p>Mögliche JSON formatierung von einem Form:</p>
<pre>
{
"name" : "personFormular",
"title" : "Person editieren",
"sqlAfter" : : "{{INSERT ... }}",
"..." : "...",
"..." : "...",
"formElements" : [
{
"name" : "vormane",
"label" : "Vorname",
"type" : "text",
"value" : "{{SELECT p.vorname FROM p AS PERSON where ... }}",
"sqlAfter" : "..."
"currentValue" : "Marc"
"..." : "...",
"..." : "...",
}]
}
</code></pre>
<p><strong>Nice to have: Frontend mit VUE</strong><br />QFQ Frontend das fuer die Formulare verantwortlich is, mit Vue neu schreiben.</p>
<ul>
<li>Die Kommunikation zwischen Vue und Backend sollte auschliesslich ueber API stattfinden. Das Frontend entscheidet sich, ein Formular zu rendern und holt dann die noetigen Daten zu dem Formular via REST vom Backend</li>
<li>Pro Formular gibt es eine JSON struktur die sowohl fuer die Beschreibung des Formulars als auch fuer dessen Inhalte genutzt wird. (dies setzt voraus, dass Formulare nicht mehr in der Datenbank sondern in Dateien gespeichert werden)
<ul>
<li>Beispielsweise existiert das Feld "value" wie bisher. Dieses enthaelt weiterhin die SQL query, die von dem Backend interpretiert wird. Zusaetlzlich enthaelt das JSON Formularelement aber auch noch das Attribut "currentValue", dieses enthaelt dann den Inhalt, der tatsaechlich im Formularelement steht und dem Benutzer angezeigt wird. Beim Submitten eines Formulars wird dann auch das "currentValue" in der gleichen JSON Struktur uebergeben.</li>
</ul></li>
</ul>
<ul>
<li>der name von Formular und Formularelementen dient als eindeutige referenz, bzw. als eindeutige ID. Die namen muessen also weiterhin eindeutig bleiben.</li>
<li>das Backend sendet nur die JSON felder mit, die das Frontend benoetigt. Beispielsweise sendet das Backend das "value" feld nicht mit, aber das "currentValue" berechnet er und sendet es in dieser Struktur mit.</li>
<li>das Absenden eines Formulars wird wahrscheinlich auch gleich per REST api und nicht mehr ueber POST passieren, damit man ueberall mit der JSON struktur arbeiten kann.</li>
<li>Das Parameter Feld wird aufgeloest und die moeglichen Parameter werden direkt attribute des Felds</li>
<li>Das Vue Frontend enthaelt das Formular als JSON mit den fuer das Frontend relevanten Attributen.</li>
<li>Fuer jeden Typen eines Formularelements wird ein Component von Vue gerendert</li>
<li>Die JSON daten zu einem Formularelement werden direkt an das Component weitergereicht.
<ul>
<li>So koennen zwischen Backend und Formularelementen "parameter" definiert werden, ohne dass man am rest vom Code etwas anpassen muss.</li>
</ul></li>
</ul> QFQ - Bug #10118 (Closed): Tablesorter error when not usedhttps://project.math.uzh.ch/issues/101182020-02-13T11:49:41ZMarc Egger
<p>Error when tablesorter is not used on page</p>
<p>Error on line:</p>
<p>$.tablesorter.themes.bootstrap.table = "";</p>
<p>I've only seen this in Typahead mockup. Does it happen in production?</p> QFQ - Feature #10095 (Some day maybe): Generic Gitlab Integration into QFQhttps://project.math.uzh.ch/issues/100952020-02-11T14:03:13ZMarc Egger
<p>Abstract the Gitlab API functions used in the Python script for LESU to create a generic gitlab integraion into QFQ.</p>
<p>It might make sense to call the python script with <strong>passthru()</strong> instead of exec() since this would allow us to pass binary data from the repository directly. (such as images stored in the repo). However, there is no use case for this yet.</p> QFQ - Feature #9777 (New): Logging QFQ Variableshttps://project.math.uzh.ch/issues/97772019-12-16T16:17:48ZMarc Egger
<p>We need the ability to see how a variable is replaced and also which variables exist at a certain point in time in a specific store.</p>
<p>Solutions:</p>
<ul>
<li>Introduce the '?' syntax:
<ul>
<li>{{? someVariable:VR0}}, {{? SELECT ... }}, {{?! SELECT ... }}, ...</li>
<li>the parser will replace the variable as usual and write the result to qfq.log</li>
<li>{{? * :V}} will output all the V-store variables</li>
</ul>
</li>
<li>Introduce '?' as a variable:
<ul>
<li>{{ ? : VR }}</li>
<li>All variables in stores V and R will be written to qfq.log</li>
</ul></li>
</ul>
<p>Marc preferes the first variant, since it is more powerfull.</p> QFQ - Bug #9773 (New): form.parameter.formModeGlobal=requiredOffhttps://project.math.uzh.ch/issues/97732019-12-16T13:37:31ZMarc Egger
<p>When form parameter formModeGlobal is set to requiredOff then the required fields should not be marked orange, if they are not filled out. But they are marked orange.</p> QFQ - Bug #9371 (Closed): Multiform: _id does not workhttps://project.math.uzh.ch/issues/93712019-10-16T08:36:41ZMarc Egger
<a name="_id-does-not-work"></a>
<h2 >_id does not work<a href="#_id-does-not-work" class="wiki-anchor">¶</a></h2>
<p>minimal example that does not work:</p>
<p>in field 'Multi SQL' of Multiform:</p>
<pre><code class="sql syntaxhl"><span class="err">{{</span><span class="o">!</span> <span class="k">SELECT</span> <span class="n">p</span><span class="p">.</span><span class="n">id</span> <span class="k">AS</span> <span class="n">_id</span><span class="p">,</span> <span class="n">p</span><span class="p">.</span><span class="n">name</span> <span class="k">FROM</span> <span class="n">person</span> <span class="k">AS</span> <span class="n">p</span> <span class="k">ORDER</span> <span class="k">BY</span> <span class="n">p</span><span class="p">.</span><span class="n">id</span> <span class="k">LIMIT</span> <span class="mi">4</span> <span class="err">}}</span>
</code></pre> QFQ - Bug #9298 (Closed): file_get_content Timeout Errorhttps://project.math.uzh.ch/issues/92982019-10-04T11:54:48ZMarc Egger
<p>Timeout file_get_contents</p>
<p>Minimales Skript um Fehler zu reproduzieren:</p>
<pre><code class="php syntaxhl"><span class="cp"><?php</span>
<span class="nb">file_get_contents</span><span class="p">(</span><span class="s1">'https://w16.math.uzh.ch/my?id=updateGitlabPrivileges&token=78ysna3uuryvmvw5&nId=all'</span><span class="p">)</span>
</code></pre>
<p>mit curl funktioniert:</p>
<pre><code class="php syntaxhl"><span class="cp"><?php</span>
<span class="nv">$curl_handle</span><span class="o">=</span><span class="nb">curl_init</span><span class="p">();</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$curl_handle</span><span class="p">,</span> <span class="no">CURLOPT_URL</span><span class="p">,</span><span class="s1">'https://w16.math.uzh.ch/my?id=updateGitlabPrivileges&token=78ysna3uuryvmvw5&nId=all'</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$curl_handle</span><span class="p">,</span> <span class="no">CURLOPT_CONNECTTIMEOUT</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$curl_handle</span><span class="p">,</span> <span class="no">CURLOPT_RETURNTRANSFER</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$curl_handle</span><span class="p">,</span> <span class="no">CURLOPT_FOLLOWLOCATION</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
<span class="nb">curl_setopt</span><span class="p">(</span><span class="nv">$curl_handle</span><span class="p">,</span> <span class="no">CURLOPT_USERAGENT</span><span class="p">,</span> <span class="s1">'Your application name'</span><span class="p">);</span>
<span class="nv">$query</span> <span class="o">=</span> <span class="nb">curl_exec</span><span class="p">(</span><span class="nv">$curl_handle</span><span class="p">);</span>
<span class="nb">curl_close</span><span class="p">(</span><span class="nv">$curl_handle</span><span class="p">);</span>
<span class="k">print</span><span class="p">(</span><span class="nv">$query</span><span class="p">);</span>
</code></pre> QFQ - Feature #8894 (Some day maybe): Documentation Tags Usable in QFQ Applicationhttps://project.math.uzh.ch/issues/88942019-08-23T10:51:03ZMarc Egger
<p><strong>Simple:</strong></p>
<ul>
<li>In the Form Editor one can deposit tags which link to the a specific entry inside the wiki of the application.</li>
<li>The same should be possible within a QFQ report.</li>
<li>The links to the wiki entries are only rendered for developers</li>
</ul>
<p><strong>Advanced:</strong></p>
<ul>
<li>QFQ implements its own documentation page which also supports the tag feature explained above.</li>
<li>On the QFQ documentation page we could also render the sql table and column comments.</li>
<li>When hovering over a dokumentation-tag-link (e.g. inside form editor) then a preview of the respective documentation text is shown.</li>
</ul>
<p><strong>BPMN:</strong></p>
<ul>
<li>On the qfq documentation page a BPMN editor is integrated. </li>
<li>Documentation tags may also be used inside a BPMN bubble which is then automatically linked to the respective documentaiton</li>
</ul> QFQ - Bug #8166 (Rejected): Select Required "0" counts as emptyhttps://project.math.uzh.ch/issues/81662019-03-29T12:43:28ZMarc Egger
<p>If the option "0" is selected in a select form element and the form element is required then the error: "Missing required value: ..." is shown.</p> QFQ - Bug #8091 (Closed): multi checkbox required bughttps://project.math.uzh.ch/issues/80912019-03-19T17:23:32ZMarc Egger
<p>When a checkbox form element is set to 'required' one has to check not at least one but all the available options.</p> QFQ - Support #7612 (Closed): Run Unittests in Gitlab Pipelinehttps://project.math.uzh.ch/issues/76122019-01-07T10:20:25ZMarc Egger
<p>Questions:<br />On which server are tests run?<br />Some tests need Database access. What about that?</p> QFQ - Bug #7456 (Some day maybe): Todos in Code: solve or make tickethttps://project.math.uzh.ch/issues/74562018-12-11T09:23:08ZMarc Egger