Commit f116b3b5 authored by Carsten  Rose's avatar Carsten Rose
Browse files

Merge branch 'master' into F10013CodeMirror

parents 59844782 ced8891f
Pipeline #3230 passed with stages
in 5 minutes and 1 second
......@@ -22,7 +22,7 @@
Release
=======
Version 19.x.x
Version 20.x.x
--------------
Date: <date>
......@@ -36,6 +36,63 @@ Features
Bug Fixes
^^^^^^^^^
Version 20.2.0
--------------
Date: 02.02.2020
Notes
^^^^^
* Add new keyword 'render' in tt-content Report and QFQ config. 'render' will control if a) only Form OR Report will be
rendered (render=single) or b) as previous Form AND Report together (render=both).
Advantage: with 'render=single' no more SELECT ... FROM (SELECT '') AS fake WHERE '{{form:SE}}'=''.
Attention: NEW default behaviour in new QFQ installations - render=single. Behaviour in old installations is unchanged.
* tt-content records with 'render = api' can stay on the same page as the link to get the content (e.g. Excel Export).
* Change default doc page to qfq.io/doc.
* Add new specialColumnName: '_noWrap' - skips wrapping of fbeg,fsep,fend.
* First version of 'FullCalendar.io' - new SpecialColumnName will follow in the future.
Features
^^^^^^^^
* #9929 / New keyword '_noWrap' for column names (alias) - skips wrapping of fbeg/fskip/fend.
* #9905 / Keyword 'render' in Report. Final implementation. Doc updated.
* #9959 / Update QFQ Config on the fly.
* #9990 / Describe order of FormElement processing - https://qfq.io/doc/#form-process-order.
* #8658 / FullCalendar.io V3 implemented.
* #9535 / VerticalText new implementation.
* Manual.rst: Add list of icons. Enhance sendmail doc.
* Change color of qfq-info-* from blue to light-blue. Add qfq-primary, qfq-danger.
Bug Fixes
^^^^^^^^^
* #5869 / Table names not properly escaped.
* #10010 / FE.type=sendmail will now be fired together with fe.type=after* (not after).
* Fixed problem with border showing when qfq-color-white is set.
* Fix selenium tests, remove chromedriver from npm.
* Log problem that crashes qfq when calendar dependencies are missing.
* Fixed gruntfile problem.
Version 20.1.1
--------------
Date: 13.01.2020
Bug Fixes
^^^^^^^^^
* #7705 / Fix problem with wrong value after save and form update.
* #8587 / A form triggers a save only, if there are real table columns.
Version 20.1.0
--------------
Date: 09.01.2020
Notes
......
......@@ -11,7 +11,11 @@ Neue Versionsnummer
0) Fuer jede neue Version ein Ticket erstellen. Template: #6994
1) Alle offenen Branches auf **Develop** und dann auf **Master mergen**.
1) Alle offenen Branches auf **Develop** mergen.
1a) Develop auf **Master mergen**.
1b) Wechseln auf **Master**.
2) Die aktuellen Commits anschauen und wichtige Topics uebernehmen (git log > ~/qfq.log, alles bis zum letzten TAG anschauen):
......@@ -43,7 +47,7 @@ Neue Versionsnummer
**Achtung**: die Release Minor darf KEINE fuehrenden Nullen enthalten!!! Ansonsten funktioniert die Verteilung vie TER nicht.
**Auto**: ./setVersion.sh <MAJOR>.<MINOR>.<MICRO>
**Auto**: ./setVersion.sh 20.2.0
Manuell:
* extension/Documentation/_make/conf.py: release, version-
......@@ -59,12 +63,12 @@ Neue Versionsnummer
* Update the version number in this document (topic 6)
* Commit & Push new version changes to master branch:
New version 20.1.1
New version 20.2.0
6) **New Tag**:
git tag v20.1.1
git push -u origin v20.1.1
git tag v20.2.0
git push -u origin v20.2.0
7) Tickets:
* Schliessen und der QFQ Version zuweisen.
......
......@@ -22,7 +22,7 @@ Quick Form Query Extension
en
:Copyright:
2017-2019
2017-2020
:Authors:
Carsten Rose, Benjamin Baer, Marc Egger
......@@ -63,7 +63,7 @@ Quick Form Query Extension
**Extension Manual**
This documentation is for the TYPO3 extension qfq.
This documentation is for the TYPO3 extension **qfq**.
**Sitemap:**
......@@ -80,3 +80,4 @@ Quick Form Query Extension
README
License
Sitemap
......@@ -274,11 +274,8 @@ Setup a *report* to manage all *forms*:
dbIndex = {{indexQfq:Y}}
 
10 {
# List of Forms: Do not show this list of forms if there is a form given by SIP.
# Table header.
sql = SELECT CONCAT('p:{{pageAlias:T}}&form=form|A:data-reference=newForm') as _pagen, '#', 'Name', 'Title', 'Table', ''
FROM (SELECT 1) AS fake
WHERE '{{form:SE}}'=''
head = {{'b|p:id={{pageAlias:T}}&form=copyFormFromExt|t:Copy form from ExtForm|A:data-reference=copyForm' AS _link}}
<table class="table table-hover qfq-table-50 tablesorter tablesorter-filter" id="{{pageAlias:T}}-form">
tail = </table>
......@@ -385,6 +382,10 @@ Extension Manager: QFQ Configuration
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| flagProduction | yes | yes|no: used to differentiate production and development site. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| render | single | both|single: QFQ will show form and/or report. In most cases only one at a |
| | | time is needed. Options: 'single' (default) or 'both' (legacy). In mode |
| | | 'single' prefer 'form' over 'report'. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| maxFileSize | 10M | If empty, take minimum of 'post_max_size' and 'upload_max_filesize'. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| baseUrl | http://example.com | URL where wkhtmltopdf will fetch the HTML (no parameter, those comes later)|
......@@ -698,21 +699,6 @@ Every access to QFQ related content resets the timeout.
 
After FE login, the next access to QFQ related content starts the timeout counter.
 
.. _local-documentation:
Local Documentation
-------------------
A HTML rendered version is available under: <your site>/typo3conf/ext/qfq/Documentation/html/Index.html
If you get a 'Page forbidden / not found' there might be some Webserver restrictions. E.g. the Typo3 example of `.htaccess`
in the Typo3 installation folder will forbid access to any extension documentation (which is a good idea on a productive
server). For a development server instead, deactivate the forbid rule of 'documentation'. In `.htaccess` (snippet from
Typo3 7.6 _.htaccess): ::
production: RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F]
development: RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|docs?)/ - [F]
.. _concept:
 
Concept
......@@ -767,7 +753,7 @@ backend for orientation.
QFQ Keywords (Bodytext)
^^^^^^^^^^^^^^^^^^^^^^^
 
**All of the named parameter are optional.**
**All of these parameters are optional.**
 
+-------------------+---------------------------------------------------------------------------------+
| Name | Explanation |
......@@ -791,13 +777,17 @@ QFQ Keywords (Bodytext)
+-------------------+---------------------------------------------------------------------------------+
| sqlLogMode | Overwrites configuration_: `SQL_LOG_MODE`_ . Only affects `Report`, not `Form`. |
+-------------------+---------------------------------------------------------------------------------+
| render | See `report-render`_. Overwrites configuration_: render. |
+-------------------+---------------------------------------------------------------------------------+
| <level>.fbeg | Start token for every field (=column) |
+-------------------+---------------------------------------------------------------------------------+
| <level>.fend | End token for every field (=column) |
+-------------------+---------------------------------------------------------------------------------+
| <level>.fsep | Separator token between fields (=columns) |
+-------------------+---------------------------------------------------------------------------------+
| <level>.fskipwrap | Comma separated list of column id's. Skip wrapping of indexed columns. |
| <level>.fskipwrap | Skip wrapping (via fbeg, fsep, fend) of named columns. Comma separated list of |
| | column id's (starting at 1). See also the special column name '_noWrap' to |
| | suppress wrapping. |
+-------------------+---------------------------------------------------------------------------------+
| <level>.shead | Static start token for whole <level>, independent if records are selected |
| | Shown before `head`. |
......@@ -837,6 +827,33 @@ QFQ Keywords (Bodytext)
| | | To retrieve the content: `{{<level>.line.content}}`. See `syntax-of-report`_ |
+-------------------+---------------------------------------------------------------------------------+
 
.. _`report-render`:
Report: render
--------------
QFQ will render Report or Form in three situations:
#. Browser: The QFQ content is described by QFQ-Report syntax.
#. Browser: The QFQ content is described by a QFQ-Form.
#. API: The QFQ content is handled without Typo3. Typically a single tt-content record is specified in the request - only
that one is rendered by QFQ. This mode is typically used to export data like Excel Export.
Option 1 and 2 are distinguished by the parameter `form` (STORE_SIP or STORE_TYPO3). If 'form' is given, in most cases only a Form
should be shown (not the report).
+--------+-------------------------------------------------------------------------+
| render | Use |
+========+=========================================================================+
| single | Display Form or Report, but not both at the same time. If |
| | a SIP parameter 'form' is given, the form is rendered, else the report. |
+--------+-------------------------------------------------------------------------+
| both | Display Form and Report, both at the same time. |
+--------+-------------------------------------------------------------------------+
| api | Create output only when called via API (no Typo3). |
+--------+-------------------------------------------------------------------------+
.. _`qfq-database`:
 
QFQ Database
......@@ -1363,15 +1380,15 @@ The following `escape` & `action` types are available:
+=======+==================================================================================================================================+
| c | Config - the escape type configured in `configuration`_. |
+-------+----------------------------------------------------------------------------------------------------------------------------------+
| C | Colon ':' will be escaped against \\: |
| C | Colon ``:`` will be escaped by ``\:`` |
+-------+----------------------------------------------------------------------------------------------------------------------------------+
| d | Double ticks " will be escaped against \\\". |
| d | Double ticks ``"`` will be escaped by ``\"``. |
+-------+----------------------------------------------------------------------------------------------------------------------------------+
| l | LDAP search filter values: `ldap-escape() <http://php.net/manual/en/function.ldap-escape.php>`_ (LDAP_ESCAPE_FILTER). |
+-------+----------------------------------------------------------------------------------------------------------------------------------+
| L | LDAP DN values. `ldap-escape() <http://php.net/manual/en/function.ldap-escape.php>`_ (LDAP_ESCAPE_DN). |
+-------+----------------------------------------------------------------------------------------------------------------------------------+
| s | Single ticks ' will be escaped against \\\'. |
| s | Single ticks ``'`` will be escaped by ``\'``. |
+-------+----------------------------------------------------------------------------------------------------------------------------------+
| S | Stop replace. If the replaced value contains nested variables, they won't be replaced. |
+-------+----------------------------------------------------------------------------------------------------------------------------------+
......@@ -1606,7 +1623,7 @@ Get Parameter
Post Parameter
--------------
 
Per `FormElement` (HTML input) the default is to `htmlspecialchars()` the input. This means &<>'" will be encoded as htmlentity
Per `FormElement` (HTML input) the default is to `htmlspecialchars()` the input. This means ``&<>'"`` will be encoded as htmlentity
and saved as a htmlentity in the database. In case any of these characters (e.g. for HTML tags) are
required, the encoding can be disabled per FormElement: `encode=none` (default is `specialchar`).
 
......@@ -2245,10 +2262,11 @@ General
* Inside the QFQ record: `form = <formname>`. E.g.:
 
* Static: `form = Person`
* Dynamic: `form = {{form:SE}}` (the left `form` is a keyword for QFQ, the right `form` is a free chooseable variable name)
* Dynamic 1: `form = {{form:SE}}` (the left `form` is a keyword for QFQ, the right `form` is a variable name)
* Dynamic 2: `form = {{SELECT f.name FROM Form AS f WHERE f.id=...}}` (the left `form` is a keyword for QFQ, the right `form` is a variable name)
 
* With the `Dynamic` option, it's easily possible to use one Typo3 page and display different forms on that specific
page. This is nice to configure few Typo 3 pages. The disadvantage is that the user might loose the navigation.
page.
 
Form process order
------------------
......@@ -4387,15 +4405,15 @@ Type: sendmail
 
* saving the record ,
* processing all uploads,
* processing `afterSave` action `FormElements`.
* together with `after...` action `FormElements` in the given order.
 
 
* *FormElement.value* = `<string>` - Body of the email. See also: `html-formatting`_
 
* *FormElement.parameter*:
 
* *sendMailTo* = `<string>` - Comma-separated list of receiver email addresses. Optional: 'realname <john@doe.com>. If there
is no recipient email address, *no* mail will be sent.
* *sendMailTo* = `<string>` - Comma-separated list of receiver email addresses. Optional: 'realname <john@doe.com>.
If there is no recipient email address, **no** mail will be sent.
* *sendMailCc* = `<string>` - Comma-separated list of receiver email addresses. Optional: 'realname <john@doe.com>.
* *sendMailBcc* = `<string>` - Comma-separated list of receiver email addresses. Optional: 'realname <john@doe.com>.
* *sendMailFrom* = `<string>` - Sender of the email. Optional: 'realname <john@doe.com>'. **Mandatory**.
......@@ -4414,6 +4432,8 @@ Type: sendmail
* *sendMailBodyHtmlEntity*= `<string>` - **encode|decode|none** - the mail body will be htmlspecialchar() encoded, decoded (default) or none (untouched).
* *sqlBefore* / *sqlAfter* = `<string>` - can be used like with other action elements (will be fired before/after sending the e-mail).
 
* An **empty** *sendMailTo* will **cancel** any sendmail action, even if *sendMailCc|Bcc* is set. This can be used to
determine during runtime if sending is wished.
* To use values of the submitted form, use the STORE_FORM. E.g. `{{name:F:allbut}}`
* To use the `id` of a new created or already existing primary record, use the STORE_RECORD. E.g. `{{id:R}}`.
* By default, QFQ stores values 'htmlspecialchars()' encoded. If such values have to send by email, the html entities are
......@@ -4428,7 +4448,7 @@ from the www.example.com and ?export (with the attachment filename 'personal.pdf
sendMailAttachmemt = F:fileadmin/file1.pdf|d:readme.pdf|C|u:http://www.example.com|p:?id=export&r=123&_sip=1|d:personal.pdf
 
Type: paste
"""""""""""
^^^^^^^^^^^
 
See also `copy-form`_.
 
......@@ -4897,6 +4917,29 @@ already a lock for a `tablename` / `record id` pair, the most restrictive will b
Best practice
-------------
 
View: List vs. Detail
^^^^^^^^^^^^^^^^^^^^^
As 'list' a number of data/rows shown on the page is meant.
As 'detail' a form is meant, which shows one single data record and let the user edit it.
To provide an easy understandable navigation structure, it's nice for the user to stay on the same page, even the user is
in 'detail' or 'list' mode. Create a single QFQ tt-content record on a fresh page::
form = {{form:SE}}
10.sql = SELECT p.name, CONCAT('p:{{pageAlias:T}}&form=Person&r=', p.id) AS _pagee FROM Person AS p
10.rend = <br>
* If the page is called without any parameter, a list of persons is shown.
* Behind each name, a button is shown. A click on it opens the form 'Person' (with the selected person record) on the same page.
Mode 'list' or 'detail' is detected automatically: if a form is given via STORE_SIP or STORE_TYPO3, the form (=detail) is
shown else the report (=list).
Custom default value only for 'new records'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
......@@ -6016,7 +6059,7 @@ Special column names
Twig: respect that the 'special column name'-columns are rendered before Twig becomes active. The recommended
way by using Twig is *not to use* special column names at all. Use the Twig version *qfqLink*.
 
QFQ typically don't care about the content of any SQL-Query - it just copy the content to the output (=Browser).
QFQ don't care about the content of any SQL-Query - it just copy the content to the output (=Browser).
 
One exception are columns, whose name starts with '_'. E.g.::
 
......@@ -6027,6 +6070,16 @@ One exception are columns, whose name starts with '_'. E.g.::
content will be hidden.
* The fourth column (alias name 'link') uses a QFQ special column name. Here, only in this example, it has no
further meaning.
* All columns in a row with the same special column name (e.g. ``... AS _page``) will have the same column name: 'page'.
To access individual columns a uniq column title can be added::
10.sql = SELECT '..1..' AS '_page|column1', '..2..' AS '_page|column2'
Those columns can be accessed via ``{{10.column1}}`` , ``{{10.column2}}`` or ``{{column1:R}}`` , ``{{column2:R}}``
* To skip wrapping via ``fbeg``, ``fsep``, ``fend`` for dedicated columns, add the keyword ``|_noWrap`` to the column alias.
Example::
10.sql = SELECT 'world' AS 'title|_noWrap'
 
Summary:
 
......@@ -6036,9 +6089,9 @@ Summary:
* SQL hint: If there is no column alias defined, the column name becomes the value
of the first row. E.g. if the first selected row contains a '_' as the first
character, the column name becomes '_....' - which will be hidden! To be safe: always define an alias!
* Access to 'hidden' columns via {{<level>.<column>}} or {{<column>:R}} are possible and often used.
* Important: to reference a column, the name has to be given without '_'. E.g. `SELECT 'cat' AS _pet` will be used with
`{{pet:R}}` (notice the missing '_').
* Access to 'hidden' columns via ``{{<level>.<column>}}`` or ``{{<column>:R}}`` are possible and often used.
* Important: to reference a column, the name has to be given without '_'. E.g. ``SELECT 'cat' AS _pet`` will be used with
``{{pet:R}}`` (notice the missing '_').
* For 'special column names': the column name together with the value controls how QFQ processes the column.
 
+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
......@@ -6096,6 +6149,10 @@ Summary:
+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| _XLSn |Used for Excel export. Prepend 'n=' and append a `newline` character around the string. See `excel-export`_. |
+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| _noWrap |Skip wrapping via `fbeg`, ``fsep``, ``fend``. |
+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| _hide |Column is hidden. |
+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| _+<html-tag attributes>|The content will be wrapped with '<html-tag attributes>'. Example: SELECT 'example' AS '_+a href="http://example.com"' creates '<a href="http://example.com">example</a>' |
+------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| _=<varname> |The content will be saved in store 'user' under 'varname'. Retrieve it later via {{varname:U}}. Example: 'SELECT "Hello world" AS _=text'. See `STORE_USER`_, `store_user_examples`_ |
......@@ -6789,11 +6846,11 @@ Run any command on the web server.
 
 
 
+-------------+--------------------------------------------------+-----------------+
|**Parameter**|**Description** |**Default value**|
+=============+==================================================+=================+
|<command> |The command that should be executed on the server.|none |
+-------------+--------------------------------------------------+-----------------+
+-------------+---------------------------------------------------+-----------------+
|**Parameter**| **Description** |**Default value**|
+=============+===================================================+=================+
|<command> | The command that should be executed on the server.|none |
+-------------+---------------------------------------------------+-----------------+
 
 
**Minimal Examples** ::
......@@ -7372,10 +7429,10 @@ Excel export
 
This chapter explains how to create Excel files on the fly.
 
Hint: For up/downloading of excel files (without modification), check the generic Form
Hint: For just up/downloading of excel files (without modification), check the generic Form
`input-upload`_ element and the report 'download' (`column_pdf`_) function.
 
The Excel file is build in the moment when the user request it by clicking on a
The Excel file is build in the moment when the user request it, by clicking on a
download link.
 
Mode building:
......@@ -7404,7 +7461,7 @@ Setup
result as the instructions for filling the excel file.
* Parameters can be passed: `uid:<tt-content record id>?param=<value1>&param2=<value2>` and will be accessible in the SIP Store (S) in the
QFQ PageContent.
* Use the regular QFQ Report syntax to create some output.
* Use the regular QFQ Report syntax to create output.
* The newline at the end of every line needs to be CHAR(10). To make it simpler, the special column name `... AS _XLS`
(see _XLS, _XLSs, _XLSb, _XLSn) can be used.
* One option per line.
......@@ -7448,26 +7505,26 @@ This fills D11, E11, F11, D12
In Report Syntax::
 
# With ... AS _XLS (token explicit given)
10.sql = SELECT 'position=D10' AS _XLS,
's=Hello' AS _XLS,
's=World' AS _XLS,
's=First Line' AS _XLS,
'newline' AS _XLS,
's=Second line' AS _XLS,
'n=123' AS _XLS,
10.sql = SELECT 'position=D10' AS _XLS
, 's=Hello' AS _XLS
, 's=World' AS _XLS
, 's=First Line' AS _XLS
, 'newline' AS _XLS
, 's=Second line' AS _XLS
, 'n=123' AS _XLS
 
# With ... AS _XLSs (token generated internally)
20.sql = SELECT 'position=D20' AS _XLS,
'Hello' AS _XLSs,
'World' AS _XLSs,
'First Line' AS _XLSs,
'newline' AS _XLS,
'Second line' AS _XLSs,
'n=123' AS _XLS,
20.sql = SELECT 'position=D20' AS _XLS
, 'Hello' AS _XLSs
, 'World' AS _XLSs
, 'First Line' AS _XLSs
, 'newline' AS _XLS
, 'Second line' AS _XLSs
, 'n=123' AS _XLS
 
# With ... AS _XLSb (token generated internally and content is base64 encoded)
30.sql = SELECT 'position=D30' AS _XLS,
'<some content with special characters like newline/carriage return>' AS _XLSb
30.sql = SELECT 'position=D30' AS _XLS
, '<some content with special characters like newline/carriage return>' AS _XLSb
 
.. _`excel-export-sample`:
 
......@@ -7483,6 +7540,35 @@ Excel export samples (54 is a example <tt-content record id>)::
# With parameter (via SIP) - get the Parameter on page 'exceldata' with '{{arg1:S}}' and '{{arg2:S}}'
SELECT CONCAT('d:final.xlsx|t:Excel (parameter)|uid:54&arg1=hello&arg2=world') AS _excel
 
Best practice
"""""""""""""
To keep the link of the Excel export close to the Excel export definition, the option `report-render`_ can be used.
On a **single** T3 page create **two** QFQ tt-content records:
tt-content record 1:
* Type: QFQ
* Content::
render = single
10.sql = SELECT CONCAT('d:new.xlsx|t:Excel (new)|uid:54|M:excel|s:1') AS _link
tt-content record 2 (uid=54):
* Type: QFQ
* Content::
render = api
10.sql = SELECT 'position=D10' AS _XLS
, 's=Hello' AS _XLS
, 's=World' AS _XLS
, 's=First Line' AS _XLS
, 'newline' AS _XLS
, 's=Second line' AS _XLS
, 'n=123' AS _XLS
.. _dropdownMenu:
 
Dropdown Menu
......@@ -7698,6 +7784,20 @@ QFQ iterates over the result set of `dragAndDropOrderSql`. The value of column `
 
If you find that the reorder does not work at expected, those two sql queries are not identical.
 
QFQ Icons
---------
Located under ` typo3conf/ext/qfq/Resources/Public/icons`::
black_dot.png bullet-red.gif checked-red.gif emoji.svg mail.gif pointer.svg up.gif
blue_dot.png bullet-yellow.gif checked-yellow.gif gear.svg marker.svg rectangle.svg upload.gif
bulb.png checkboxinvert.gif construction.gif help.gif new.gif resize.svg wavy-underline.gif
bullet-blue.gif checked-blue.gif copy.gif home.gif note.gif show.gif zoom.svg
bullet-gray.gif checked-gray.gif delete.gif icons.svg pan.svg trash.svg
bullet-green.gif checked-green.gif down.gif info.gif paste.gif turnLeft.svg
bullet-pink.gif checked-pink.gif edit.gif loading.gif pencil.svg turnRight.svg
QFQ CSS Classes
---------------
 
......@@ -8122,7 +8222,7 @@ Best practice *recommendation* for using parameter - see `access-column-values`_
}
}
 
Create HTML tables::
Create HTML tables. Each column is wrapped in ``<td>``, each row is wrapped in ``<tr>``::
 
10 {
sql = SELECT p.firstName, p.lastName, p.country FROM Person AS p
......@@ -8134,9 +8234,9 @@ Create HTML tables::
fend = </td>
}
 
Maybe a few columns belongs together and should be in one column.
Maybe a few columns belongs together and should be in one table column.
 
Joining columns, variant A: firstName and lastName in one column::
Joining columns, variant A: firstName and lastName in one table column::
 
10 {
sql = SELECT CONCAT(p.firstName, ' ', p.lastName), p.country FROM Person AS p
......@@ -8148,7 +8248,7 @@ Joining columns, variant A: firstName and lastName in one column::
fend = </td>
}
 
Joining columns, variant B: firstName and lastName in one column::
Joining columns, variant B: firstName and lastName in one table column::
 
10 {
sql = SELECT '<td>', p.firstName, ' ', p.lastName, '</td><td>', p.country, '</td>' FROM Person AS p
......@@ -8158,7 +8258,7 @@ Joining columns, variant B: firstName and lastName in one column::
rend = </tr>
}
 
Joining columns, variant C: firstName and lastName in one column::
Joining columns, variant C: firstName and lastName in one table column. Notice ``fbeg``, ``fend` and ``fskipwrap``::
 
10 {
sql = SELECT '<td>', p.firstName, ' ', p.lastName, '</td>', p.country FROM Person AS p
......@@ -8171,6 +8271,18 @@ Joining columns, variant C: firstName and lastName in one column::
fskipwrap = 1,2,3,4,5
}
 
Joining columns, variant D: firstName and lastName in one table column. Notice ``fbeg``, ``fend` and ``fskipwrap``::
10 {
sql = SELECT CONCAT('<td>', p.firstName, ' ', p.lastName, '</td>') AS '_noWrap', p.country FROM Person AS p
head = <table class="table">
tail = </table>
rbeg = <tr>
rend = </tr>
fbeg = <td>
fend = </td>
}
Recent List
^^^^^^^^^^^
 
......@@ -8292,11 +8404,14 @@ last used (STORE_USER) or (first time call during browser session) takes the def
, ' <button class="btn disabled ', IF({{semId:Y0}}=sc.id, 'btn-success', 'btn-default'), '">',sc.name, '</button> '
, CONCAT('p:{{pageAlias:T}}&semId=', sn.id, '|t:', QBAR(sn.name), '|s|b|G:glyphicon-chevron-right|R') AS _link
FROM Semester AS sc
LEFT JOIN semester AS sp
ON sp.id=sc.id-1
LEFT JOIN semester AS sn
ON sc.id+1=sn.id AND sn.show_semester_from<=CURDATE()
WHERE sc.id={{semId:SUY}} AND '{{form:SE}}'=''
WHERE sc.id={{semId:SUY}}
ORDER BY sc.semester_von
head = <div class="btn-group" style="position: absolute; top: 15px; right: 25px;">
tail = </div><p></p>
......@@ -8630,8 +8745,7 @@ has the form be used. The following report includes the regular `form-editor`_ a
, '</th><th><em>Last</em>'
, '</th><th><em>PageId</em></th>'
FROM (SELECT '') AS fake
WHERE '{{form:SE}}'=''
AND {{formIdHistory:S0}}=0
WHERE {{formIdHistory:S0}}=0
head = <table class="table table-hover qfq-table-50 tablesorter tablesorter-filter" id="{{pageAlias:T}}-form">
rbeg = <thead class="qfq-sticky"><tr>
rend = </tr></thead><tbody>
......@@ -8739,7 +8853,7 @@ to edit `AutoCron` jobs::
10 {
# Table header.
sql = SELECT CONCAT('p:{{pageAlias:T}}&form=cron') AS _pagen, 'id', 'Next run','Frequency','Comment'
, 'Last run','In progress', 'Status', 'Auto generated' FROM (SELECT 1) AS fake WHERE '{{form:SE}}'=''
, 'Last run','In progress', 'Status', 'Auto generated'
head = <table class='table table-hover qfq-table-50'>
tail = </table>
rbeg = <thead><tr>
......
......@@ -36,6 +36,50 @@ Features
Bug Fixes
^^^^^^^^^
Version 20.2.0
--------------
Date: 02.02.2020
Notes
^^^^^
* Add new keyword 'render' in tt-content Report and QFQ config. 'render' will control if a) only Form OR Report will be
rendered (render=single) or b) as previous Form AND Report together (render=both).
Advantage: with 'render=single' no more SELECT ... FROM (SELECT '') AS fake WHERE '{{form:SE}}'=''.
Attention: NEW default behaviour in new QFQ installations - render=single. Behaviour in old installations is unchanged.
* tt-content records with 'render = api' can stay on the same page as the link to get the content (e.g. Excel Export).
* Change default doc page to qfq.io/doc.
* Add new specialColumnName: '_noWrap' - skips wrapping of fbeg,fsep,fend.
* First version of 'FullCalendar.io' - new SpecialColumnName will follow in the future.
Features
^^^^^^^^
* #9929 / New keyword '_noWrap' for column names (alias) - skips wrapping of fbeg/fskip/fend.
* #9905 / Keyword 'render' in Report. Final implementation. Doc updated.
* #9959 / Update QFQ Config on the fly.
* #9990 / Describe order of FormElement processing - https://qfq.io/doc/#form-process-order.
* #8658 / FullCalendar.io V3 implemented.
* #9535 / VerticalText new implementation.
* Manual.rst: Add list of icons. Enhance sendmail doc.
* Change color of qfq-info-* from blue to light-blue. Add qfq-primary, qfq-danger.
Bug Fixes