Commit 3413d6ff authored by Carsten  Rose's avatar Carsten Rose
Browse files

Merge branch 'develop' into 'master'

Develop

See merge request !338
parents 3336cd91 b29da985
Pipeline #5184 passed with stages
in 3 minutes and 50 seconds
......@@ -12,7 +12,7 @@ Neue Versionsnummer
1) Fuer jede neue Version ein Ticket erstellen. Template: #6994
2) * Merge 'open Branches' to **Develop**.
* Merge 'Develop' to **Master**.
* Merge 'Develop' to **Master**.
* Checkout **Master**.
3) Die aktuellen Commits anschauen und wichtige Topics uebernehmen (git log > ~/qfq.log, alles bis zum letzten TAG anschauen):
......
......@@ -72,8 +72,16 @@ QFQ content record
# Normalize variables
sql = SELECT '{{country:SE}}' AS _country
# List selected persons
# List selected persons per country
20.sql = SELECT p.name FROM Person AS p WHERE p.country LIKE '{{country:R}}'
}
* Always comment the queries like shown above.
QFQ Form
--------
* Mandatory SIP parameter have to be mentioned in Form.requiredNew and/or Form.requiredEdit.
* If the title of a FormElement isn't descriptive enough, use tooltip, note or extraButtonInfo to explain to a user.
* Every Form should show a descriptive title to identify the task and current record. E.g. Not 'Person' but 'Person: John Doe'.
* Often the length of a pill title if not sufficient, use a tooltip to give a more descriptive hint.
......@@ -89,81 +89,98 @@ QFQ Keywords (Bodytext)
**All of these parameters are optional.**
+-------------------+---------------------------------------------------------------------------------+
| Name | Explanation |
+===================+=================================================================================+
| form | | Formname. |
| | | Static: **form = person** |
| | | By SIP: **form = {{form:SE}}** |
| | | By SQL: **form = {{SELECT c.form FROM Config AS c WHERE c.id={{a:C}} }}** |
+-------------------+---------------------------------------------------------------------------------+
| r | | <record id>. The form will load the record with the specified id. |
| | | Static: **r = 123** |
| | | By SQL: **r = {{SELECT ...}}** |
| | | If not specified, the SIP parameter 'r' is used. |
+-------------------+---------------------------------------------------------------------------------+
| dbIndex | E.g. `dbIndex = {{indexQfq:Y}}` Select a DB index. Only necessary if a |
| | different than the standard DB should be used. |
+-------------------+---------------------------------------------------------------------------------+
| debugShowBodyText | If='1' and :ref:`configuration`:*showDebugInfo: yes*, shows a |
| | tooltip with bodytext |
+-------------------+---------------------------------------------------------------------------------+
| sqlLog | Overwrites :ref:`configuration`: :ref:`SQL_LOG` . Only affects `Report`, |
| | not `Form`. |
+-------------------+---------------------------------------------------------------------------------+
| sqlLogMode | Overwrites :ref:`configuration`: :ref:`SQL_LOG_MODE<SQL_LOG_MODE>` . |
| | Only affects `Report`, not `Form`. |
+-------------------+---------------------------------------------------------------------------------+
| render | See :ref:`report-render`. Overwrites :ref:`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 | 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`. |
+-------------------+---------------------------------------------------------------------------------+
| <level>.stail | Static end token for whole <level>, independent if records are selected. |
| | Shown after `tail`. |
+-------------------+---------------------------------------------------------------------------------+
| <level>.head | Dynamic start token for whole <level>. Only if at least one record is select. |
+-------------------+---------------------------------------------------------------------------------+
| <level>.tail | Dynamic end token for whole <level>. Only if at least one record is select. |
+-------------------+---------------------------------------------------------------------------------+
| <level>.rbeg | Start token for row. |
+-------------------+---------------------------------------------------------------------------------+
| <level>.rbgd | Alternating (per row) token. |
+-------------------+---------------------------------------------------------------------------------+
| <level>.rend | End token for row. Will be rendered **before** subsequent levels are processed |
+-------------------+---------------------------------------------------------------------------------+
| <level>.renr | End token for row. Will be rendered **after** subsequent levels are processed |
+-------------------+---------------------------------------------------------------------------------+
| <level>.rsep | Seperator token between rows |
+-------------------+---------------------------------------------------------------------------------+
| <level>.sql | SQL Query |
+-------------------+---------------------------------------------------------------------------------+
| <level>.twig | Twig Template |
+-------------------+---------------------------------------------------------------------------------+
| <level>.althead | If <level>.sql has no rows selected (empty), these token will be rendered. |
+-------------------+---------------------------------------------------------------------------------+
| <level>.altsql | If <level>.sql has no rows selected (empty) or affected (delete, update, insert)|
| | the <altsql> will be fired. Note: Sub queries of <level> are not fired, even if |
| | <altsql> selects some rows. |
+-------------------+---------------------------------------------------------------------------------+
| <level>.content | | *show* (default): content of current and sub level are directly shown. |
| | | *hide*: content of current and sub levels are stored and not shown. |
| | | *hideLevel*: content of current and sub levels are stored and only sub levels |
| | | are shown. |
| | | *store*: content of current and sub levels are stored and shown. |
| | | To retrieve the content: `{{<level>.line.content}}`. |
| | | See :ref:`syntax-of-report` |
+-------------------+---------------------------------------------------------------------------------+
+-------------------------+---------------------------------------------------------------------------------+
| Name | Explanation |
+=========================+=================================================================================+
| form | | Formname. |
| | | Static: **form = person** |
| | | By SIP: **form = {{form:SE}}** |
| | | By SQL: **form = {{SELECT c.form FROM Config AS c WHERE c.id={{a:C}} }}** |
+-------------------------+---------------------------------------------------------------------------------+
| r | | <record id>. The form will load the record with the specified id. |
| | | Static: **r = 123** |
| | | By SQL: **r = {{SELECT ...}}** |
| | | If not specified, the SIP parameter 'r' is used. |
+-------------------------+---------------------------------------------------------------------------------+
| dbIndex | E.g. `dbIndex = {{indexQfq:Y}}` Select a DB index. Only necessary if a |
| | different than the standard DB should be used. |
+-------------------------+---------------------------------------------------------------------------------+
| debugShowBodyText | If='1' and :ref:`configuration`:*showDebugInfo: yes*, shows a |
| | tooltip with bodytext |
+-------------------------+---------------------------------------------------------------------------------+
| sqlLog | Overwrites :ref:`configuration`: :ref:`SQL_LOG` . Only affects `Report`, |
| | not `Form`. |
+-------------------------+---------------------------------------------------------------------------------+
| sqlLogMode | Overwrites :ref:`configuration`: :ref:`SQL_LOG_MODE<SQL_LOG_MODE>` . |
| | Only affects `Report`, not `Form`. |
+-------------------------+---------------------------------------------------------------------------------+
| render | See :ref:`report-render`. Overwrites :ref:`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 | 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`. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.stail | Static end token for whole <level>, independent if records are selected. |
| | Shown after `tail`. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.head | Dynamic start token for whole <level>. Only if at least one record is select. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.tail | Dynamic end token for whole <level>. Only if at least one record is select. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.rbeg | Start token for row. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.rbgd | Alternating (per row) token. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.rend | End token for row. Will be rendered **before** subsequent levels are processed |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.renr | End token for row. Will be rendered **after** subsequent levels are processed |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.rsep | Seperator token between rows |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.sql | SQL Query |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.twig | Twig Template |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.althead | If <level>.sql has no rows selected (empty), these token will be rendered. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.altsql | If <level>.sql has no rows selected (empty) or affected (delete, update, insert)|
| | the <altsql> will be fired. Note: Sub queries of <level> are not fired, even if |
| | <altsql> selects some rows. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.content | | *show* (default): content of current and sub level are directly shown. |
| | | *hide*: content of current and sub levels are **stored** and not shown. |
| | | *hideLevel*: content of current and sub levels are **stored** and only sub |
| | | levels are shown. |
| | | *store*: content of current and sub levels are **stored** and shown. |
| | | To retrieve the content: `{{<level>.line.content}}`. |
| | | See :ref:`syntax-of-report` |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.line.count | Current row index. Will be replaced before the query is fired in case of |
| | ``<level>`` is an outer/previous level or it will be replaced after a query is |
| | fired in case ``<level>`` is the current level. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.line.total | Total rows (MySQL ``num_rows`` for *SELECT* and *SHOW*, MySQL ``affected_rows`` |
| | for *UPDATE* and *INSERT*. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.line.insertId | Last insert id for *INSERT*. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.line.content | Show content of `<level>` (content have to be stored via <level>.content=....) |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.line.altCount | Like 'line.count' but for 'alt' query. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.line.altTotal | Like 'line.total' but for 'alt' query. |
+-------------------------+---------------------------------------------------------------------------------+
| <level>.line.altInsertId| Like 'line.insertId' but for 'alt' query. |
+-------------------------+---------------------------------------------------------------------------------+
.. _`report-render`:
......
......@@ -2463,10 +2463,15 @@ Type: sendmail
* For debugging, please check :ref:`REDIRECT_ALL_MAIL_TO`.
Example to attach one file1.pdf (with the attachment filename 'readme.pdf') and concatenate two PDF, created on the fly
.. tip::
If you encounter ``\r`` at EOL character in your emails, you probably use a QFQ variable for the *body*.
Switch of the escaping by using ``-`` as escape/action class. E.g.: ``{{body:F:all:-}}``
Example to attach one ``file1.pdf`` (with the attachment filename ``readme.pdf``) and concatenate two PDF, created on the fly
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
sendMailAttachment = 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
^^^^^^^^^^^
......
......@@ -383,7 +383,7 @@ Extension Manager: QFQ Configuration
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| Keyword | Default / Example | Description |
+===================================+=======================================================+============================================================================+
| Config |
| **Config** |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| flagProduction | yes | yes|no: used to differentiate production and development site. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
......@@ -423,7 +423,7 @@ Extension Manager: QFQ Configuration
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| reportAsFileAutoExport | no | Auto export of qfq reports to files. See :ref:`reportAsFile` |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| Dynamic |
| **Dynamic** |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| fillStoreSystemBySql1/2/3 | SELECT s.id AS ... | Specific values read from the database to fill the system store during QFQ |
| | | load. See :ref:`fillStoreSystemBySql` for a usecase. |
......@@ -431,7 +431,7 @@ Extension Manager: QFQ Configuration
| fillStoreSystemBySqlErrorMsg1/2/3 | No current period found | Only define an error message, if QFQ should stop running |
| | | in case of an SQL error or not exact one record. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| Debug |
| **Debug** |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| throwExceptionGeneralError | auto | | *yes*: 'general errors' in QFQ (PHP) will throw an exception. |
| | | | *auto*: becomes 'yes', if 'flagProduction'!='yes', else 'no'. |
......@@ -467,7 +467,7 @@ Extension Manager: QFQ Configuration
| reportMinPhpVersion | auto | Possible values: yes|no|auto. For 'auto': If a BE User is logged in, it |
| | | becomes 'yes'. If installed PHP version is too low, report and stop QFQ. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| Database |
| **Database** |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| init | init=SET names utf8; SET sql_mode = | Global init for using the database. For 'sql_mode="NO_ENGINE_SUBSTITUTION"'|
| | "NO_ENGINE_SUBSTITUTION" | see #7407. |
......@@ -481,7 +481,7 @@ Extension Manager: QFQ Configuration
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| indexQfq | 1 | Optional. Default: 1. Retrieve the current setting via {{dbNameQfq:Y}}. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| Security |
| **Security** |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| escapeTypeDefault | m | All variables `{{...}}` get this escape class by default. |
| | | See :ref:`variable-escape`. |
......@@ -497,7 +497,7 @@ Extension Manager: QFQ Configuration
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| securityFailedAuthDelay | 3 | If REST authorization fails, sleep 'x' seconds before answering. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| Form-Config |
| **Form-Config** |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| recordLockTimeoutSeconds | 900 | Timeout for record locking. After this time, a record will be replaced. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
......@@ -515,7 +515,7 @@ Extension Manager: QFQ Configuration
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| formDataError | generic error | Customizable error message used in validator.js. 'no specific' given. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| Form-Layout |
| **Form-Layout** |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| labelAlign | left | Label align (left/center/right)/ Default: left. Will be inherited to Form. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
......@@ -544,7 +544,7 @@ Extension Manager: QFQ Configuration
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| extraButtonInfoClass | pull-right | '' (default) or 'pull-right'. See :ref:`extraButtonInfo`. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| Form-Language |
| **Form-Language** |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
| formLanguage[ABCD]Id | E.g.: 1 | In Typo3 configured pageLanguage id. The number after the 'L' parameter. |
+-----------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
......
......@@ -38,6 +38,11 @@
Report
======
QFQ Report Keywords
-------------------
See :ref:`qfq_keywords`.
QFQ content element
-------------------
......@@ -142,26 +147,7 @@ There is a set of **variables** that will get replaced before ('count' also afte
``{{<level>.<columnName>}}``
Similar to ``{{<name>:R}}`` but more specific. There is no sanitize class, escape mode or default value.
``{{<level>.line.count}}`` - Current row index
This variable is specific, as it will be replaced before the query is fired in case of ``<level>`` is an outer/previous
level or it will be replaced after a query is fired in case ``<level>`` is the current level.
``{{<level>.line.total}}``
Total rows (MySQL ``num_rows`` for *SELECT* and *SHOW*, MySQL ``affected_rows`` for *UPDATE* and *INSERT*.
``{{<level>.line.insertId}}``
Last insert id for *INSERT*.
``{{<level>.line.content}}``
If the content of `<level>` have been stored, e.g. `<level>.content=hide`.
``{{<level>.line.altCount}}`` - Like 'line.count' but for 'alt' query.
``{{<level>.line.altTotal}}`` - Like 'line.total' but for 'alt' query.
``{{<level>.line.altInsertId}}`` - Like 'line.insertId' but for 'alt' query.
See :ref:`qfq_keywords` for a full list.
See :ref:`variables` for a full list of all available variables.
......
......@@ -201,7 +201,7 @@ Example::
Escape/Action class
^^^^^^^^^^^^^^^^^^^
{{name:store:**sanitize**:escape:default:message}}
{{name:store:sanitize:**escape**:default:message}}
The following `escape` & `action` types are available:
......
......@@ -5,4 +5,5 @@ ADD requirements.txt /docs
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y git
RUN pip3 install -r requirements.txt
\ No newline at end of file
RUN pip3 install -r requirements.txt
RUN rm requirements.txt
......@@ -750,13 +750,32 @@ class Save {
if (isset($formElement[FE_ACCEPT_ZERO_AS_REQUIRED]) && $formElement[FE_ACCEPT_ZERO_AS_REQUIRED] != '0' &&
isset($clientValues[$formElement[FE_NAME]]) && $clientValues[$formElement[FE_NAME]] == '0') {
$mode = 'fake'; // The next if() should never be true.
continue;
}
// Upload needs special action to check for empty.
if ($mode == FE_MODE_REQUIRED && $formElement[FE_TYPE] == FE_TYPE_UPLOAD) {
// Get new upload state
$statusUpload = $this->store->getVar($clientValues[$formElement[FE_NAME]] ?? '', STORE_EXTRA);
// Check if there is a new upload
if ($statusUpload[FILES_TMP_NAME] != '') {
continue;// Upload given: continue with next FE
}
// Check if there is no already given upload or such upload has not to be deleted
if (empty($this->store->getVar($formElement[FE_NAME], STORE_RECORD)) || ($statusUpload[FILES_FLAG_DELETE] ?? 0) == '1') {
// Fake to trigger the next if( .. empty...)
$clientValues[$formElement[FE_NAME]] = '';
}
}
if ($mode == FE_MODE_REQUIRED && empty($clientValues[$formElement[FE_NAME]])) {
$flagAllRequiredGiven = 0;
if ($reportRequiredFailed) {
throw new \UserFormException("Missing required value: " . $formElement[FE_LABEL], ERROR_REQUIRED_VALUE_EMPTY);
$name = ($formElement[FE_LABEL] == '') ? $formElement[FE_NAME] : $formElement[FE_LABEL];
throw new \UserFormException("Missing required value: $name", ERROR_REQUIRED_VALUE_EMPTY);
}
}
......
......@@ -353,8 +353,10 @@ class FillStoreForm {
default:
if ($formElement[FE_TYPE] == FE_TYPE_EDITOR) {
//This is probably not needed anymore. Breaks if: <p>...</p><p>....</p>.
// Tiny MCE always wrap a '<p>' around the content. Remove it before saving.
$value = Support::unWrapTag('<p>', $value);
// $value = Support::unWrapTag('<p>', $value);
}
// Check only if there is something.
......
......@@ -29,7 +29,7 @@
"parameterLanguageD": "",
"recordLockTimeoutSeconds": 900,
"deleted": "no",
"modified": "2021-04-08 19:54:44",
"modified": "2021-04-09 11:38:15",
"created": "2021-03-22 11:42:00",
"FormElement_ff": [
{
......@@ -69,11 +69,11 @@
"clientJs": "",
"feGroup": "",
"deleted": "no",
"modified": "2021-04-08 19:54:44",
"modified": "2021-04-09 11:38:15",
"created": "2021-03-22 11:57:51"
},
{
"dynamicUpdate": "yes",
"dynamicUpdate": "no",
"enabled": "yes",
"name": "myJson",
"label": "Json",
......@@ -99,7 +99,7 @@
"adminNote": "",
"tooltip": "",
"placeholder": "",
"value": "#!report\r\n\r\n10.sql = SELECT CONCAT('fid:{{r:S0}}', IF('{{myReduce:FE:alnumx}}'='yes', '|reduce', '')) AS _formJson\r\n\r\n15.sql = SELECT IF({{r:S0}}=0, 'Please save this form first.', '')",
"value": "#!report\r\n\r\n10.sql = SELECT 'fid:{{r:S0}}' AS _formJson\r\n\r\n15.sql = SELECT IF({{r:S0}}=0, 'Please save this form first.', '')",
"sql1": "",
"parameter": "",
"parameterLanguageA": "",
......@@ -109,39 +109,39 @@
"clientJs": "",
"feGroup": "",
"deleted": "no",
"modified": "2021-04-09 11:06:46",
"modified": "2021-04-22 15:27:31",
"created": "2021-03-22 11:44:22"
},
{
"dynamicUpdate": "yes",
"dynamicUpdate": "no",
"enabled": "yes",
"name": "myReduce",
"label": "Filter keys",
"name": "myBackupNote",
"label": "Backups",
"mode": "show",
"modeSql": "",
"class": "native",
"type": "radio",
"type": "note",
"subrecordOption": "",
"encode": "specialchar",
"checkType": "auto",
"checkPattern": "",
"onChange": "",
"ord": 22,
"ord": 25,
"tabindex": 0,
"size": "",
"maxLength": "",
"labelAlign": "default",
"bsLabelColumns": "",
"bsInputColumns": "col-md-1",
"bsNoteColumns": "col-md-10",
"bsInputColumns": "",
"bsNoteColumns": "",
"rowLabelInputNote": "row,label,\/label,input,\/input,note,\/note,\/row",
"note": "Filter out 'modified' and 'created' as well as all keys holding default values. \r\n<br><b>Caution:<\/b> Edits to the json above are lost on switch.",
"note": "",
"adminNote": "",
"tooltip": "",
"placeholder": "",
"value": "no",
"value": "{{ SELECT IF('{{id:RE}}'!='', 'Form backup location: {{qfqProjectPath:Y}}\/form\/.backup\/{{id:RE}}\/', 'Please save this form first.') }}",
"sql1": "",
"parameter": "buttonClass\r\nitemList=yes,no",
"parameter": "",
"parameterLanguageA": "",
"parameterLanguageB": "",
"parameterLanguageC": "",
......@@ -149,15 +149,15 @@
"clientJs": "",
"feGroup": "",
"deleted": "no",
"modified": "2021-04-09 11:18:52",
"created": "2021-04-09 09:46:38"
"modified": "2021-04-09 11:38:15",
"created": "2021-04-08 10:40:09"
},
{
"dynamicUpdate": "no",
"enabled": "yes",
"name": "myBackupNote",
"label": "Backups",
"mode": "show",
"name": "myJsonReduced",
"label": "Json reduced",
"mode": "readonly",
"modeSql": "",
"class": "native",
"type": "note",
......@@ -166,7 +166,7 @@
"checkType": "auto",
"checkPattern": "",
"onChange": "",
"ord": 25,
"ord": 27,
"tabindex": 0,
"size": "",
"maxLength": "",
......@@ -179,7 +179,7 @@
"adminNote": "",
"tooltip": "",
"placeholder": "",
"value": "{{ SELECT IF('{{id:RE}}'!='', 'Form backup location: {{qfqProjectPath:Y}}\/form\/.backup\/{{id:RE}}\/', 'Please save this form first.') }}",
"value": "#!report\r\n\r\n# Use Data URI to download given base64 encoded json string as text file\r\n\r\n10.sql = SELECT \r\n \"Json version without 'modified' and 'created' and without keys holding default values: \"\r\n , '<a download=\"{{name:R}}.json\" class=\"btn btn-default\" href=\"data:application\/octet-stream;base64,'\r\n , 'fid:{{r:S0}}|b64|reduce' AS _formJson\r\n , '\"><i class=\"fas fa-file-download\"><\/i><\/a>'\r\n FROM (SELECT '') AS _fake WHERE {{r:S0}}!=0",
"sql1": "",
"parameter": "",
"parameterLanguageA": "",
......@@ -189,8 +189,8 @@
"clientJs": "",
"feGroup": "",
"deleted": "no",
"modified": "2021-04-09 09:47:27",
"created": "2021-04-08 10:40:09"
"modified": "2021-04-22 15:30:18",
"created": "2021-04-22 15:11:12"
},
{
"dynamicUpdate": "no",
......@@ -229,7 +229,7 @@
"clientJs": "",
"feGroup": "",
"deleted": "no",
"modified": "2021-04-08 19:54:44",
"modified": "2021-04-09 11:38:15",
"created": "2021-03-24 14:44:04"
},
{
......@@ -269,7 +269,7 @@
"clientJs": "",
"feGroup": "",
"deleted": "no",
"modified": "2021-04-08 19:54:44",
"modified": "2021-04-09 11:38:15",
"created": "2021-03-30 09:13:40"
},
{
......@@ -309,7 +309,7 @@
"clientJs": "",
"feGroup": "",
"deleted": "no",
"modified": "2021-04-08 19:54:44",
"modified": "2021-04-09 11:38:15",
"created": "2021-03-30 09:14:48"
}
]
......
Markdown is supported
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