Commit 466a4178 authored by Carsten  Rose's avatar Carsten Rose
Browse files

Merge branch 'develop' into 'fieldset-improvements'

# Conflicts:
#   less/qfq-bs.css.less
parents 9a628f37 e681f952
Pipeline #3080 failed with stages
in 7 minutes and 7 seconds
# EditorConfig is awesome:
# Use as master:
# top-most EditorConfig file
root = false
[{*.rst, *.rst.txt}]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 3
# MD-Files
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 4
# ignore generated documentation
# ignore typical clutter of IDEs and editors (this could be added in .git/info/exclude,
# but we add it here for convenience)
# Created by .ignore support plugin (
......@@ -13,23 +28,32 @@
......@@ -37,3 +61,10 @@ test.php
- VERSION=`cat ./version`
- RELDATE=`date '+%Y%m%d%H%M'`
- mkdir build || true
SELENIUM_LOGS_PATH: "/scratch/tmp/7/"
- before
- build
- selenium
stage: before
- docker pull t3docs/render-documentation
- source <(docker run --rm t3docs/render-documentation show-shell-commands)
- dockrun_t3rd makehtml
stage: build
- tags
expire_in: 1 week
- build/
- make VERSION=$VERSION phpunit_snapshot
- chmod a+r qfq_$VERSION_*.zip
- scp qfq_$VERSION_*.zip w16:qfq/snapshots/
- make VERSION=${VERSION} phpunit_snapshot
- chmod a+r qfq_${VERSION}_*.zip
- echo "mv qfq_${VERSION}_*.zip qfq_${VERSION}_${RELDATE}-${CI_BUILD_REF_NAME}.zip"
- mv qfq_${VERSION}_*.zip qfq_${VERSION}_${RELDATE}-${CI_BUILD_REF_NAME}.zip
- scp qfq_${VERSION}_*.zip w16:qfq/snapshots/
- mv qfq_${VERSION}_*.zip build/
stage: build
- tags
expire_in: 1 week
- build/
- make VERSION=$VERSION phpunit_release
- chmod a+r qfq_$VERSION_*.zip
- scp qfq_$VERSION_*.zip w16:qfq/releases/
- make VERSION=${VERSION} phpunit_release
- chmod a+r qfq_${VERSION}_*.zip
- scp qfq_${VERSION}_*.zip w16:qfq/releases/
- mv qfq_${VERSION}_*.zip build/
stage: selenium
- unzip -q build/ -d qfq
- cd docker/
- ./ -no-deploy
- ./ ../qfq
- ./
- echo "hello"
# remove containers and move logs to persistent location
- cd docker; ./ <<< "y"
- cd ..
- umask 002
- cp extension/Tests/selenium/selenium_logs/* "$SELENIUM_LOGS_PATH/$CI_COMMIT_SHORT_SHA/"
- echo "Selenium Logs copied to $SELENIUM_LOGS_PATH/$CI_COMMIT_SHORT_SHA/"
- echo "Or download result (log/screenshot) in gitlab under CI/CD > Pipelines <job> > right side 'Artifacts'"
expire_in: 1 week
- extension/Tests/selenium/selenium_logs/
This diff is collapsed.
......@@ -280,8 +280,8 @@ FORM_LOG_EXPIRE (typically 1800 seconds).
* Correspondig expired logfiles will be deleted.
* Active logfiles will be filled.
Errormessages & Exceptions
Error Messages & Exceptions
* Exception types:
* Code
Neuer Build
* release: Wird ein *Tag* vergeben (egal welcher Branch) der mit 'v' beginnt, erzeugt das automatisch einen Build -
* snapshot: Jeder Commit (egal welcher Branch) erzeugt einen Snapshot -
* nightly: Nach einem Commit auf Branch 'master' tagsueber, wird um 23:55 ein 'nightly' Build erstellt -
......@@ -40,25 +41,25 @@ Neue Versionsnummer
**Auto**: ./ <MAJOR>.<MINOR>.<MICRO>
* extension/Documentation/_make/ release, version
* extension/Documentation/Settings.cfg: version
* extension/Documentation/_make/ release, version-
* Documentation/Settings.cfg: version
* extension/ext_emconf.php: version
4) Im Projektverzeichnis: **Doc**
4) **Documentation**
make t3sphinx (dadurch fallen Fehler in der RESTdoc Syntax auf)
make doc-local (dadurch fallen Fehler in der RESTdoc Syntax auf)
5) **Update Version & Commit**
* Update the version number in this document (topic 6)
* Commit & Push new version changes to master branch:
New version 19.2.3
New version 19.12.0
6) **New Tag**:
git tag v19.2.3
git push -u origin v19.2.3
git tag v19.12.0
git push -u origin v19.12.0
7) Tickets:
* Schliessen und der QFQ Version zuweisen.
......@@ -66,7 +67,7 @@ Neue Versionsnummer
8) T3 Doc aktualisieren
make update-qfq-doc
Sollte durch den WebHook passieren.
9) Extension hochladen
......@@ -80,7 +81,7 @@ Neue Versionsnummer
Update Doku auf
1) Copy 'qfq' doc to github project 'qfq-doc'. Commit changes. Push changes to github::
......@@ -91,4 +92,4 @@ Upload new version to TER
* > Log in > My Extensions.
* Rename the ZIP file to be TER compatible: e.g.
* Upload - that's all.
\ No newline at end of file
* Upload - that's all.
......@@ -518,6 +518,13 @@ On `"conflict"` the Client opens the alert as modal dialog (user can't change an
form' button.
On `"conflict_allow_force"` the Client opens the alert non-modal (default).
### tabUniqId
Every tab get's a uniq id (timestamp) on page load:
This 'tabUniqId' is saved in dirty record on lock acquire.
On page reload, when the 'release' comes after 'acquire' (unwished async behaviour), the locking is skipped (if same user
session) - on reload there is no variable 'tabUniqId'. On real lock acquire, the tab ID is compared and will be denied
if not matching. The 'tabUniqId' might not work in IE - doesn't matter: it's a seldom special situation.
### Drag And Drop (sort)
......@@ -563,3 +570,30 @@ Current Page
: Issued by the Server. It is a command prompting the Client to
navigate away from the Current Page.
### Tablesorter Save View
To save a table view the client sends a post request with the following data:
"name": "<name of view>",
"public": <boolean>,
"tableId": "<id of table to which view belongs>",
"view": {
"columnSelection": <array of chosen column ids>,
"filters": <array of strings>,
"sortList": <array of arrays of length 2>
Request URL
: api/save.php
Request Method
URL Parameters
: `s=<SIP>` - to prove permission.
Server Response
: The response contains at least a [Minimal Response].
......@@ -12,11 +12,11 @@ General Concept
* There is one PHP file to handle all REST calls:
* All further endpoints are appended after rest.php, seperated by '/'. Example:
The argument 'myEmail' is just to show how GET variables will be submitted.
......@@ -39,7 +39,7 @@ GET - export
curl -X GET "http://localhost/qfq/typo3conf/ext/qfq/Source/api/rest.php/restPerson"
curl -X GET "http://localhost/qfq/typo3conf/ext/qfq/Classes/Api/rest.php/restPerson"
......@@ -55,7 +55,7 @@ POST - insert
curl -X POST "http://localhost/qfq/typo3conf/ext/qfq/Source/api/rest.php/restPerson" -d '{"name":"Miller","firstname":"Jonni"}'
curl -X POST "http://localhost/qfq/typo3conf/ext/qfq/Classes/Api/rest.php/restPerson" -d '{"name":"Miller","firstname":"Jonni"}'
......@@ -69,7 +69,7 @@ PUT - update
curl -X PUT "http://localhost/qfq/typo3conf/ext/qfq/Source/api/rest.php/restPerson/1" -d '{"name":"Miller","firstname":"Jonni"}'
curl -X PUT "http://localhost/qfq/typo3conf/ext/qfq/Classes/Api/rest.php/restPerson/1" -d '{"name":"Miller","firstname":"Jonni"}'
......@@ -83,7 +83,7 @@ Delete
curl -X DELETE "http://localhost/qfq/typo3conf/ext/qfq/Source/api/rest.php/restPerson/1"
curl -X DELETE "http://localhost/qfq/typo3conf/ext/qfq/Classes/Api/rest.php/restPerson/1"
......@@ -97,7 +97,7 @@ Header Token Authorization
curl -X GET -H 'Authorization: Token token="mySuperSecretToken"' "http://localhost/qfq/typo3conf/ext/qfq/Source/api/rest.php/restPerson/"
curl -X GET -H 'Authorization: Token token="mySuperSecretToken"' "http://localhost/qfq/typo3conf/ext/qfq/Classes/Api/rest.php/restPerson/"
Static token
......@@ -120,6 +120,6 @@ Append the GET variable `?XDEBUG_SESSION_START=1`
curl -X POST "http://localhost/qfq/typo3conf/ext/qfq/Source/api/rest.php/restPerson?XDEBUG_SESSION_START=1" -d '{"name":"Miller","firstname":"Jonni"}'
curl -X POST "http://localhost/qfq/typo3conf/ext/qfq/Classes/Api/rest.php/restPerson?XDEBUG_SESSION_START=1" -d '{"name":"Miller","firstname":"Jonni"}'
PhpStorm with activated debugger will stop at any breakpoint and 'stepping' through the code is possible.
**To run/update SELENIUM test, please check docker/**
Create new Tests
* Set up new forms and reports.
* Dump new database.
* Copy dump to become now initial database
* Update SELENIUM Python tests
T3 Documentation
* QFQ Documentation:
* Build local documentation: ``make doc-local``
* Example Code Documentation:
* Pushing a tag on the project triggers a rebuild.
Manual trigger of documentation rebuild
* > QFQ > Settings > Integrations > Webhook: Test
Log errors
* >> Recent Actions
* > QFQ > Settings > Integrations > Webhook: > Edit: Recent Deliveries
Best Practice T3 reST
* Best Practice T3 reST:
* Reference:
General Concept
Tablesorter supports filter, column on/off and sort.
A QFQ enhancement allows save/delete/activate of custom tablesorter `views`. This feature is described in this document.
QFQ uses the table 'Setting' to store per user, public and readonly settings. At time of writing only 'tablesorter' settings
are supported. Further settings might come in the future.
Show table with tablesorter activate/save/delete
A page with a HTML table includes the command `{{'<uniqueName>' AS _tablesorter-view-saver}}` inside of the HTML table tag.
QFQ will replace the command::
<table {{ 'allperson' AS _tablesorter-view-saver }} class="tablesorter tablesorter-filter tablesorter-column-selector"> ... </table>
<table data-tablesorter-id='allperson' data-tablesorter-sip='5d0e29c4eacc2'
data-tablesorter-view='[{"name":"test","public":false,"tableId":"mytable","view":"eyJjb2x1bW5TZWxlY3Rpb24iOlswLDEsMiwzXSwiZmlsdGVycyI6WyIiLCIiLCIiLCIiXSwic29ydExpc3QiOltdfQ=="}]' class="table tablesorter tablesorter-column-selector tablesorter-filter tablesorter-pager">
tableId: the '<uniqueName>', in the example it's 'allperson'
feUser: the current logged in FE user. If no FE user is logged in, take the QFQ cookie. With this workaround, it's at
least possible to work with 'views' during a browser session.
data-tablesorter-view: JSON encoded array
Array of views.
Each view:
['name'] - Name of the view. Value is html entity encoded.
['public'] - true or false. false mean's 'private'.
['tableId'] - '<uniqueName>' - this is the filter to assign views to a specific HTML table.
['view'] - base64 encoded JSON array. It's base64 encoded for two reasons:
a) we do not have to take care about SQL injection (the user might supply filter strings, incl. regex expressions)
b) the JSON array will contain '}}', which confuses QFQ/evaluate.
QFQ will collect all views:
a) all private views of the current table and FE User,
b) all public views of the current table.
Save tablesorter view
The user might click on 'Save Private View' or 'Save Public View'.
A Ajax Post request to
The SIP is the one given by `data-tablesorter-sip` and contains `tableId` and `feUser`. The SIP is right to manipulate the views.
The POST contains:
feUser - fe user login name
mode - missing or 'delete' if the given view should be deleted
public - true|false
name - name of the view
view - base64 encoded tablesorter filter/order/column selector.
Response setting.php
setting.php will always answer with a JSON stream (Minimal response):
"status": "success"|"error",
"message": "<message>"
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment