# cat=config/config; type=options[yes,no]; label=Flag Production: Retrieve via '{{flagProduction:Y}}''. Default is 'yes'. Used to differentiate between development & production systems.
flagProduction = yes

# cat=config/config; type=options[single,both]; label=QFQ shows Form and Report at the same time or only one: a) 'single' (default) - only form or report (depending of if a form is given via SIP), b) 'both' at the same time.
render = single

# cat=config/config; type=string; label=Base URL of the current Typo3 installation:Use '{{baseUrl:Y}}' to reference own URL. Important for API calls (load, save, dirty, delete), downloads and PDF conversion. Example: https://your.base.url/including/sub/dir. Separate multiple URLs with comma. Final one will detected dynamically. Skip the scheme if the website needs to be accessible with http and https. Advanced example: first.base.url/sub1,second.example.url
baseUrl =

# cat=config/config; type=string; label=Date format:Default is 'dd.mm.yyyy'. Possible options: 'yyyy-mm-dd', 'dd.mm.yyyy'
dateFormat = dd.mm.yyyy

# cat=config/config; type=boolean; label=Show edit inline reports: In the frontend, for every QFQ Report record an edit symbol is shown. Click on it will open a window to edit the QFQ report.
editInlineReports = 1

# cat=config/config; type=boolean; label=Dark mode for edit inline report editor: Default is off=light mode.
editInlineReportDarkTheme = 0

# cat=config/config; type=string; label=Report as File Auto Export:Default is 'no'. If set to 'yes': When a QFQ tt-content record is rendered which does not contain the "file=" keyword, then its body is exported to a file in the qfq-project directory and the tt-content body is replaced by "file=<path_to_file>".
reportAsFileAutoExport = no

# cat=config/config; type=string; label=Messenger base URL:Base URL of the nchan-messages endpoint (e.g. https://host/messenger/). Empty disables messenger and chat.
websocketUrl =

# cat=config/config; type=string; label=Messenger group:nchan messenger group name used by QFQ FormElements and Reports. Defaults to "qfq" if empty.
messengerGroup =

# cat=config/config; type=string; label=Messenger publish URL:Base URL of the nchan localhost publisher endpoint used by the PHP backend (messenger-local.conf snippet), e.g. http://127.0.0.1/messenger/. Must be reachable from the web server, not from the browser. Empty disables server-side chat notifications.
messengerPublishUrl =

# cat=config/config; type=string; label=Jitsi base URL:Base URL of the Jitsi Meet server used for chat video calls (e.g. https://domain.ch). Empty disables the video-call feature in chat.
jitsiBaseUrl =

# cat=config/config; type=string; label=Renderer:Default is Bootstrap3Renderer. Determines the renderer that will be used by QFQ to render forms and other elements.
renderer = Bootstrap3Renderer

# AI settings grouped into sub-headers.
# customsubcategory=1=RAG / chatbot document retrieval
# customsubcategory=2=AI behaviour (prompt, chatbot answers, thinking)
# customsubcategory=3=Gateway & connection

# --- RAG / chatbot document retrieval (shown LAST) ---
# cat=ai/1/1; type=string; label=AI RAG retrieval URL:Base URL of the RAG retrieval service, e.g. https://domain.com/rag . Empty disables only RAG/document retrieval - the aiChat FormElement still works as a plain LLM chat (no sources). A FormElement that sets aiRagSource needs this URL. Auth uses aiRagApiKey (below), or aiGatewayApiKey if that is empty.
aiRagUrl =

# cat=ai/1/2; type=string; label=AI RAG API key:Optional separate virtual key for the RAG retrieval service - use only when it runs on a different gateway VM than the LLM. Empty: reuse aiGatewayApiKey (same-VM setup).
aiRagApiKey =

# cat=ai/1/3; type=string; label=AI chatbot default source:Default indexed source(s) for the aiChat FormElement, e.g. 'redmine' (comma list for several). Inherited by every aiChat; override per FormElement with parameter aiRagSource (empty there = no document retrieval).
aiRagSource =

# cat=ai/1/4; type=string; label=AI chatbot default ACL:Default aiRagAcl for the aiChat FormElement (e.g. user | public | all | 'redmine:all,kb:user'). Inherited; override per FormElement with parameter aiRagAcl.
aiRagAcl =

# cat=ai/1/5; type=int+; label=AI chatbot context chunks (k):Default number of context chunks retrieved per question. Inherited; override per FormElement with parameter aiRagK.
aiRagK = 8

# --- AI behaviour (shown SECOND) ---
# cat=ai/2/1; type=string; label=AI default prompt:Optional system-prompt addition for AI features (aiAssist + aiChat). Inherited; override per FormElement with parameter aiPrompt (set it empty there to drop this global prompt).
aiPrompt =

# cat=ai/2/2; type=boolean; label=AI chatbot allow general knowledge:If on, the chatbot may answer beyond the retrieved documents (clearly marked as not from the docs). Default off. Inherited; override per FormElement with parameter aiChatAllowGeneralKnowledge.
aiChatAllowGeneralKnowledge = 0

# cat=ai/2/3; type=boolean; label=AI model thinking:If on, enable the model 'thinking'/reasoning phase (chat_template_kwargs.enable_thinking) for AI requests. Default off - editor assist and chatbot both off (thinking adds ~900 tokens + latency). Override per FormElement with parameter aiThinking (1/0).
aiThinking = 0

# --- Gateway & connection (shown FIRST) ---
# cat=ai/3/1; type=boolean; label=AI features enabled:Default is off. If enabled, FormElements with parameter 'aiAssist' offer AI text actions (improve, generate, translate) via the configured AI gateway.
aiEnabled = 0

# cat=ai/3/2; type=string; label=AI gateway URL:Base URL of the OpenAI compatible AI gateway (LiteLLM), e.g. https://domain.com. QFQ calls <url>/v1/chat/completions. Empty disables AI features.
aiGatewayUrl =

# cat=ai/3/3; type=string; label=AI gateway API key:Virtual key of this QFQ instance, generated on the gateway host. Do not use the gateway master key here.
aiGatewayApiKey =

# cat=ai/3/4; type=string; label=AI default model:Logical model name as configured in the gateway. Default is 'qfq-default'. Can be overwritten per FormElement with parameter 'aiModel'.
aiModelDefault = qfq-default

# cat=ai/3/5; type=int+; label=AI request timeout (seconds):Default is 60. Maximum time QFQ waits for the AI gateway per request.
aiTimeoutSeconds = 60

# cat=ai/3/6; type=int+; label=AI max tokens per request:Default is 8192. Upper bound on generated tokens (incl. the model 'thinking' tokens) per AI request - caps a runaway reasoning loop. Per request, not per chat.
aiMaxTokens = 8192

# cat=ai/3/7; type=int+; label=AI max stream seconds:Default is 300 (5 min). Hard wall-clock limit for one streaming AI generation. Unlike the request timeout (an idle timeout) this also stops a continuously streaming reasoning loop.
aiMaxStreamSeconds = 300

# cat=graphics/config; type=string; label=Command 'inkscape':Default is 'inkscape'. Convert SVG to images (png). An empty string disables `inkscape`. If it is not available, `convert` will be used instead.
cmdInkscape = inkscape

# cat=graphics/config; type=string; label=Command 'convert':Default is 'convert'. Convert images to thumbnails and to split PDF to JPEG.
cmdConvert = convert

# cat=graphics/config; type=string; label=Command 'pdf2svg':Default is 'pdf2svg'. Convert PDF to SVG.
cmdPdf2svg = pdf2svg

# cat=graphics/config; type=string; label=Command 'pdftocairo':Default is 'pdftocairo'. Repair broken PDFs to be splitted via convert.
cmdPdftocairo = pdftocairo

# cat=graphics/config; type=string; label=Command 'wkhtmltopdf':Default is '/opt/wkhtmltox/bin/wkhtmltopdf'. Convert a HTML page to a PDF.
cmdWkhtmltopdf = /opt/wkhtmltox/bin/wkhtmltopdf

# cat=graphics/config; type=string; label=Command 'qfqpdf':Default is '/opt/qfqpdf/qfqpdf'. Convert a HTML page to a PDF.
cmdQfqpdf = /opt/qfqpdf/qfqpdf

# cat=graphics/config; type=string; label=Command 'qpdf':Default is 'qpdf'. Convert PDF to PDF (try to repair) if merging of PDF fails.
cmdQpdf = qpdf

# cat=graphics/config; type=string; label=Command 'gs':Default is 'gs'. Decrypt and convert PDF to PDF (try to repair) if merging of PDF fails.
cmdGs = gs

# cat=graphics/config; type=string; label=Command 'pdfunite':Default is 'pdfunite'. Merge PDF.
cmdPdfunite = pdfunite

# cat=graphics/config; type=string; label=Command 'img2pdf':Default is 'img2pdf'. Convert images to PDF.
cmdImg2pdf = img2pdf

# cat=graphics/config; type=string; label=Command 'heif-convert':Default is 'heif-convert'. Convert images from HEIC/HEIF to PNG.
cmdHeifConvert = heif-convert

# cat=graphics/config; type=string; label=Command 'pdf2ps':Default is 'pdf2ps'. Convert images from PDF to PS.
cmdPdf2ps = pdf2ps

# cat=graphics/config; type=string; label=Command 'ps2pdf':Default is 'ps2pdf'. Convert images from PS to PDF.
cmdPs2pdf = ps2pdf

# cat=graphics/config; type=string; label=Command 'pdftotext':Default is 'pdftotext'. Extract PDF text, e.g. for detecting Acrobat-specific files.
cmdPdfToText = pdftotext

# cat=graphics/config; type=string; label=Command 'pdfinfo':Default is 'pdfinfo'. List meta information, like if a PDF is encrypted.
cmdPdfInfo = pdfinfo


# cat=imap/config; type=options[debug,verbose,error,none]; label=IMAP log mode:Default is 'error'. Log mode for IMAP connections (email sync). Modes see 'imapLogMode'.
imapLogMode = error

# cat=imap/config; type=string; label=IMAP log file:By default fileadmin/protected/qfqProject/log/imap.log. A logfile of IMAP connections. PathFile is absolute or relative to '<site path>'.
imapLog =

# cat=imap/config; type=string; label=IMAP re-auth notification email:Default is empty (off). If set, the email-sync daemon sends a mail to this address when a delegated OAuth2 account (e.g. Outlook) needs an interactive re-authorization (key button). At most one mail per account per 24h.
imapNotificationEmail =

# cat=imap/config; type=boolean; label=Sync email attachments:Default is off. If enabled, the email-sync stores attachments (files under fileadmin/protected/qfqProject/emailSync/, metadata JSON in EmailSync.attachment). Attachments over the size limit keep metadata only.
imapSyncAttachments = 0

# cat=imap/config; type=int+; label=IMAP attachment size limit (MB):Default is 25. Attachments larger than this keep metadata only (no file stored). Only relevant if 'imapSyncAttachments' is enabled.
imapAttachmentMaxMB = 25

# cat=imap/config; type=string; label=Microsoft OAuth2 client id:Required for Outlook/Office365 (OAuth2) accounts. Register your own Azure app (public client, device code flow enabled, API permissions IMAP.AccessAsUser.All, SMTP.Send, offline_access) and enter its Application (client) id here. Empty = OAuth2 accounts cannot authorize/authenticate. A per-account client_id in the token file overrides this.
imapOAuth2ClientId =


# cat=debug/debug; type=options[auto,yes,no]; label=Throw exception General Error: Default is 'auto'. If a) 'yes' or b) 'auto' and 'flagProduction!=yes', throw an exception in case of a 'General Error'.
throwExceptionGeneralError = auto

# cat=debug/debug; type=options[all,none]; label=Form submit log mode:Default is 'all'. Form submit requests will be logged in the table FormSubmitLog. 'all' - every form save will be logged. 'none' - no logging. This setting can also be changed per form.
formSubmitLogMode = all

# cat=debug/mail; type=string; label=Redirect all mail to ...:Default is empty. If set, redirect all QFQ generated mails (Form, Report) to the specified email address.
redirectAllMailTo =

# cat=debug/sql; type=options[modify,all,error,none]; label=SQL log mode:Default is 'modify'. A logfile of QFQ fired SQL statements will be written. 'all' - every statement will be logged (this might a lot). 'modify' - log only statements who change data. 'error' - log only DB errors. 'none' - log never.
sqlLogMode = modify

# cat=debug/sql; type=options[modify,all,error,none]; label=SQL log mode for AutoCron:Default is 'error'. Modes see 'sqlLogMode'.
sqlLogModeAutoCron = error

# cat=debug/sql; type=string; label=SQL log file:By default fileadmin/protected/qfqProject/log/sql.log. A logfile of fired SQL statements. PathFile is absolute or relative to '<site path>'.
sqlLog =

# cat=debug/qfq; type=string; label=QFQ log file:By default fileadmin/protected/qfqProject/log/qfq.log directory. A logfile of fired SQL statements. PathFile is absolute or relative to '<site path>'.
qfqLog =

# cat=debug/mail; type=string; label=Mail log file:By default fileadmin/protected/qfqProject/log/mail.log. A logfile of sent mail. PathFile is absolute or relative to '<site path>'.
mailLog =

# cat=debug/merge; type=string; label=Merge log file:By default fileadmin/protected/qfqProject/log/merge.log. A logfile of all data merge actions. PathFile is absolute or relative to '<site path>'.
mergeLog =

# cat=debug/sql; type=options[all,fe_user,none]; label=SIP error log mode:Default is 'fe_user'. Logs an error if the SIP is invalid.
sipErrorLogMode = fe_user

# cat=debug/info; type=string; label=Show debug info:Default is 'auto'. Possible values: [yes|no|auto][,download]. For 'auto': If a BE User is logged in, a debug information will be shown on the FE.
showDebugInfo = auto

# cat=debug/reportMinPhpVersion; type=options[auto,yes,no]; label=Report too low PHP Version:Default is 'auto'. 'auto': If a BE User is logged in, qfq shows message and terminate.
reportMinPhpVersion = auto

# cat=database/db1; type=string; label=Init database:Default is 'set names utf8'. Optional. Might set specific settings.
init = SET names utf8; SET sql_mode = "NO_ENGINE_SUBSTITUTION";

# cat=database/db; type=options[auto,always,once,never]; label=Update QFQ database structures,functions & system forms:Default is 'auto'. After installing a new QFQ version it might be necessary to apply DB updates. 'auto' - apply DB updates only if there is a newer version. 'always' - apply DB updates every time QFQ is called - *not* recommended - slow! 'once' - on next QFQ start, do updates and switch back to 'auto'. 'never' - never apply DB updates.
update = auto

# cat=database/db; type=string; label=Database index for QFQ data:Default is '1'. Retrieve the current setting via {{indexData:Y}} or the database name via {{dbNameData:Y}}
indexData = 1

# cat=database/db; type=string; label=Database index for QFQ system:Default is '1'. Retrieve the current setting via {{indexQfq:Y}} or the database name via {{dbNameQfq:Y}}
indexQfq = 1

# cat=database/db; type=string; label=Database index for QFQ wiki:Default is '1'. Retrieve the current setting via {{indexWiki:Y}} or the database name via {{dbNameWiki:Y}}
indexWiki = 1



# cat=security/security; type=string; label=Session Timeout in seconds:Default is empty to take the php.ini system value (minimum of  'session.cookie_lifetime' and 'session.gc_maxlifetime').
sessionTimeoutSeconds =

# cat=security/security; type=string; label=Escape type default:Default is 'm'. QFQ Variables `{{...}}` without an 'escape type' get this as default.
escapeTypeDefault = m

# cat=security/security; type=string; label=List of honeypot input elements:Default is 'email,username,password'. If empty: no check. All named strings will rendered as hidden INPUT elements. If a form submit contains values for those inputs, the POST is treated as an attack.
securityVarsHoneypot = email,username,password

# cat=security/security; type=string; label=Attack delay in seconds:Default is '5'. After a detected attack, a) clear SIP Store b) wait number of seconds, c) quit PHP process (and therefore the browser request deliver nothing). '-1': Switch off attack detection.
securityAttackDelay = 5

# cat=security/security; type=boolean; label=Show an attack detected message:Default is 'off'. Show (return to browser) a message, that an attack has been detected. Should be 'off' for production sites.
securityShowMessage = 0

# cat=security/security; type=string; label='GET'-Parameter max length:Default is '50'. GET vars longer than 'x' character triggers an `attack-detected`. Minimum: 32.
securityGetMaxLength = 50

# cat=security/security; type=string; label=REST - Failed auth delay in seconds:Default is '3'.
securityFailedAuthDelay = 3

# cat=security/security; type=string; label=Default encryption method:Options: 'AES-128' (default) or 'AES-256'. If value is not valid then error will be shown on page.
encryptionMethod =

# cat=security/security; type=boolean; label=Check for protected folder access from outside
protectedFolderCheck = 1

# cat=security/security; type=string; label=Auth token for endpoint QFQ Version check:Default is empty and no qfq information can be fetched.
qfqVersionApiToken =


# cat=form-config/config; type=string; label=Dirty record lock timeout (seconds):Default is '900'. Time in seconds to lock a record, starting from the first modification. If lock expires, it is acquired again on the next modification.
recordLockTimeoutSeconds = 900

# cat=form-config/config; type=boolean; label=Enter as submit:Default is on. Pressing 'enter' on an input, means 'save form and close'  (exception: 'textarea' and 'editor' elements).
enterAsSubmit = 1


# cat=form-config/config; type=string; label=Form page alias:Default is 'form'. T3 Page slug to edit a form.
editFormPage = form

# cat=form-config/config; type=string; label=Datetimepicker type:Default is 'qfq'. Type of date-time-picker in form. Options: 'no', 'browser', 'qfq'.
dateTimePickerType = qfq

# cat=form-config/config; type=string; label=Form data pattern error message: default is 'Pattern mismatch' for all custom pattern. Customizable message used in validator.js. 'pattern' violation.
formDataPatternError =

# cat=form-config/config; type=string; label=Form data required error message:Default is 'Required'. Customizable error message used in validator.js. 'required' violation.
formDataRequiredError =

# cat=form-config/config; type=string; label=Form data match error message:Default is 'Fields do not match'. Customizable error message used in validator.js. 'match' violation. Typically used to ensure that two given emails or passwords are identically.
formDataMatchError =

# cat=form-config/config; type=string; label=Form data error message:Default is 'Error'. Customizable error message used in validator.js. generic violation.
formDataError =

# cat=form-config/config; type=boolean; label=Show record-id in form title:Default is off (0). If on (1), append the current record id on the title. New records get '(new)'.
showIdInFormTitle = 0

# cat=form-config/config; type=boolean; label=On form load, bring last used pill to front
rememberLastPill = 1

# cat=form-config/config; type=string; label=Do not log column:Default is 'password'. Comma separated more than one column possible.
doNotLogColumn = password

# cat=form-config/config; type=boolean; label=Form - Recent:  Each 'form open' by a user will be logged in table Recent, incl. all SIP parameter. Default: on
recentLog = 1

# cat=form-config/config; type=string; label=Form - History: Options -  "0" (off / Default), "1" (on), "SELECT ...". Example for sql query (empty result set means 0=off) - "SELECT IF(ISNULL(r.id), 0, 1) FROM Person AS p LEFT JOIN Role AS r ON r.pId = p.id AND r.name = 'admin' WHERE p.id='{{pIdUser:Y}}' LIMIT 1"
showHistory = 0

# cat=form-config/config; type=boolean; label=Validate F & FE.parameter:Default is 'on'. Checks if parameters known by qfq and are wrapped correctly where necessary. EXAMPLE => FE.parameter.sqlAfter have to be wrapped by {{ }}. Each parameter uses its own configuration.
validateFormElementParameter = 1



# cat=form-layout/layout; type=string; label=CSS class QFQ container:Default is empty. Empty, if the page content is already wrapped in a Bootstrap container. Else 'container'.
cssClassQfqContainer =

# cat=form-layout/layout; type=string; label=CSS class QFQ form:Default is 'qfq-notify''. If given wrap around QFQ-Form. E.g. 'qfq-color-base'.
cssClassQfqForm =

# cat=form-layout/layout; type=string; label=CSS class of pills on the HTML form:Default is 'qfq-color-grey-1'. Wrap around title bar for pills: CSS Class, typically a background color.
cssClassQfqFormPill =qfq-color-grey-1

# cat=form-layout/layout; type=string; label=CSS class of the body of the HTML form:Default is 'qfq-color-grey-2'. Wrap around FormElements: CSS Class, typically a background color.
cssClassQfqFormBody = qfq-color-grey-2


# cat=form-layout/layout; type=string; label=Bootstrap CSS column class(es) to wrap the 'whole form':Default is 'col-md-12 col-lg-8'.
formBsColumns = col-md-12 col-lg-8

# cat=form-layout/layout; type=string; label=Bootstrap CSS column class(es) to wrap the 'label' column:Default is 'col-md-3 col-lg-3'.
formBsLabelColumns = col-md-3 col-lg-3

# cat=form-layout/layout; type=string; label=Bootstrap CSS column class(es)  to wrap the 'input' column:Default is 'col-md-6 col-lg-6'.
formBsInputColumns = col-md-6 col-lg-6

# cat=form-layout/layout; type=string; label=Bootstrap CSS column class(es)  to wrap the 'note' column:Default is 'col-md-3 col-lg-3'.
formBsNoteColumns = col-md-3 col-lg-3

# cat=form-layout/layout; type=string; label=Fieldset Class:Default is 'qfq-fieldset'. Alternative: 'qfq-fieldset-borderless'
fieldsetClass = qfq-fieldset



# cat=form-language/config; type=string; label=Language A id:Default is empty. ID (Typo3 parameter 'L') for language 'A'
formLanguageAId =

# cat=form-language/config; type=string; label=Language A label:Default is empty.  Label shown in *Form editor*, on the 'basic' tab.
formLanguageALabel =

# cat=form-language/config; type=string; label=Language B id:Default is empty. ID (Typo3 parameter 'L') for language 'A'
formLanguageBId =

# cat=form-language/config; type=string; label=Language B label:Default is empty.  Label shown in *Form editor*, on the 'basic' tab.
formLanguageBLabel =

# cat=form-language/config; type=string; label=Language C id:Default is empty. ID (Typo3 parameter 'L') for language 'A'
formLanguageCId =

# cat=form-language/config; type=string; label=Language C label:Default is empty.  Label shown in *Form editor*, on the 'basic' tab.
formLanguageCLabel =

# cat=form-language/config; type=string; label=Language D id:Default is empty. ID (Typo3 parameter 'L') for language 'A'
formLanguageDId =

# cat=form-language/config; type=string; label=Language D label:Default is empty.  Label shown in *Form editor*, on the 'basic' tab.
formLanguageDLabel =


# cat=form-button/layout; type=string; label=Button Top Wrap 'class':Default '<div class="row"><div class="col-md-12">' - Wraps the entire row above the form. It is used to group any elements you want to place on the top part of the form.
btnTopWrap =

# cat=form-button/layout; type=string; label=Button top Left Wrap 'class':Default '<div class="btn-toolbar pull-left" role="toolbar">' - wraps elements on the left side of the row above the form.
btnTopLeftWrap =

# cat=form-button/layout; type=string; label=Button top right Wrap 'class':Default '<div class="btn-toolbar pull-right" role="toolbar">' - wraps elements on the right side of the row above the form.
btnTopRightWrap =

# cat=form-button/layout; type=string; label=Button top left order :Default 'formView+formElementEdit+formEdit,save+close,delete+new' - Set the button sequence on the top left above your form. Use '+' to group buttons together and ',' to separate different button sets. Example new+close are in a button group.
btnTopLeftOrder =

# cat=form-button/layout; type=string; label=Button top right order :Default 'formView+formElementEdit+formEdit,save+close,delete+new' - Set the button sequence on the top right above your form. Use '+' to group buttons together and ',' to separate different button sets. Example new+close are in a button group.
btnTopRightOrder =

# cat=form-button/layout; type=string; label=Button footer wrap 'class':Default '<div class="row"><div class="col-md-12">' - Wraps the entire row above the form. It is used to group any elements you want to place on the footer part of the form.
btnFooterWrap =

# cat=form-button/layout; type=string; label=Button footer left wrap 'class':Default '<div class="btn-toolbar pull-left" role="toolbar">' - Wraps elements on the left side of row at footer the form.
btnFooterLeftWrap =

# cat=form-button/layout; type=string; label=Button footer right Wrap 'class':Default '<div class="btn-toolbar pull-right" role="toolbar">' - Wraps elements on the right side of row at footer the form.
btnFooterRightWrap =

# cat=form-button/layout; type=string; label=Button footer left order:Default 'formView+formElementEdit+formEdit,save+close,delete+new' - Set the button sequence on the footer left below your form. Use '+' to group buttons together and ',' to separate different button sets. Example new+close are in a button group.
btnFooterLeftOrder =

# cat=form-button/layout; type=string; label=Button footer right order:Default 'formView+formElementEdit+formEdit,save+close,delete+new' - Set the button sequence on the footer right below your form. Use '+' to group buttons together and ',' to separate different button sets. Example new+close are in a button group.
btnFooterRightOrder =

# cat=form-button/layout; type=string; label=Save button :Default p:save|:glyphicon-ok|b|c:navbar-btn - build save button using regular qfq notation.
saveButtonDefault =

# cat=form-button/layout; type=string; label=Delete button :Default p:delete|G:glyphicon-trash|b|c:navbar-btn - build delete button using regular qfq notation.
deleteButtonDefault =

# cat=form-button/layout; type=string; label=Close button :Default p:close|G:glyphicon-remove|b|c:navbar-btn - build close button using regular qfq notation.
closeButtonDefault =

# cat=form-button/layout; type=string; label=New button :Default p:new|G:glyphicon-plus|b|c:navbar-btn - build new button using regular qfq notation.
newButtonDefault =

# cat=form-button/layout; type=string; label=Formedit button :Default p:formEdit|G:glyphicon-wrench|b|c:navbar-btn - build formedit button using regular qfq notation.
formEditButtonDefault =

# cat=form-button/layout; type=string; label=Formview button :Default p:formView|G:glyphicon-eye-open|b|c:navbar-btn - build formview button using regular qfq notation.
formViewButtonDefault =

# cat=form-button/layout; type=string; label=Save button 'text':Default empty - Text for the save button (top of the form).
saveButtonText =

# cat=form-button/layout; type=string; label=Save button 'tooltip':Default 'Save'
saveButtonTooltip = Save

# cat=form-button/layout; type=string; label=Save button 'CSS Class':Default 'btn btn-default navbar-btn'
saveButtonClass = btn btn-default navbar-btn

# cat=form-button/layout; type=string; label=Save button 'CSS class on change':Default 'alert-info btn-info'. If the data in a form has been changed, the save button gets the given class.
saveButtonClassOnChange = alert-info btn-info

# cat=form-button/layout; type=string; label=Save button 'glyph icon':Default 'glyphicon-ok'. Glyph icon shown on the save button.
saveButtonGlyphIcon =

# cat=form-button/layout; type=string; label=Close button 'text':Default empty - Text for the close button (top of the form).
closeButtonText =

# cat=form-button/layout; type=string; label=Close button 'tooltip':Default 'Close'
closeButtonTooltip = Close

# cat=form-button/layout; type=string; label=Close button 'CSS Class':Default 'btn btn-default navbar-btn'
closeButtonClass = btn btn-default navbar-btn

# cat=form-button/layout; type=string; label=close button 'glyph icon':Default 'glyphicon-remove'. Glyph icon shown on the close button.
closeButtonGlyphIcon =


# cat=form-button/layout; type=string; label=Delete button 'text':Default empty - Text for the delete button (top of the form).
deleteButtonText =

# cat=form-button/layout; type=string; label=Delete button 'tooltip':Default 'Delete'
deleteButtonTooltip = Delete

# cat=form-button/layout; type=string; label=Delete button 'CSS Class':Default 'btn btn-default navbar-btn'
deleteButtonClass = btn btn-default navbar-btn

# cat=form-button/layout; type=string; label=Delete button 'glyph icon':Default 'glyphicon-trash'. Glyph icon shown on the delete button.
deleteButtonGlyphIcon =


# cat=form-button/layout; type=string; label=New button 'text':Default empty - Text for the new button (top of the form).
newButtonText =

# cat=form-button/layout; type=string; label=New button 'tooltip':Default 'New'
newButtonTooltip = New

# cat=form-button/layout; type=string; label=New button 'CSS Class':Default 'btn btn-default navbar-btn'
newButtonClass = btn btn-default navbar-btn

# cat=form-button/layout; type=string; label=New button 'glyph icon':Default 'glyphicon-plus'. Glyph icon shown on the new button.
newButtonGlyphIcon =


# cat=form-Element/formelement; type=options[qfq,browser,no]; label=Datetimepicker type:Default is 'qfq'. Type of date-time-picker in form.
dateTimePickerType = qfq

# cat=form-Element/formelement; type=options[hide,mute,show]; label=Subrecord design in case no record exists: Default is 'show'.
emptySubrecord = show

# cat=form-Element/formelement; type=options[dnd,button]; label=Upload type:Default is 'dnd'. 'dnd' - file chooser or drag'n'drop of files. 'button' - the regular file chooser button.
uploadType = dnd

# cat=form-Element/formelement; type=string; label=Form data pattern error message: default is 'Pattern mismatch' for all custom pattern. Customizable message used in validator.js. 'pattern' violation.
formDataPatternError =

# cat=form-Element/formelement; type=string; label=Form data required error message:Default is 'Required'. Customizable error message used in validator.js. 'required' violation.
formDataRequiredError =

# cat=form-Element/formelement; type=string; label=Form data match error message:Default is 'Fields do not match'. Customizable error message used in validator.js. 'match' violation. Typically used to ensure that two given emails or passwords are identically.
formDataMatchError =

# cat=form-Element/formelement; type=string; label=Form data error message:Default is 'Error'. Customizable error message used in validator.js. generic violation.
formDataError =

# cat=form-Element/formelement; type=string; label=Wrap the subrecord column 'id|ID|Id' with the given class: E.g. 'text-muted' is rendered as ...<span class="text-muted">value</span>.
cssClassColumnId = text-muted

# cat=form-Element/formelement; type=boolean; label=Show small 'x' to clear input on all input elements
clearMe = 0

# cat=form-Element/formelement; type=options[left,center,right]; label=FormElement label align:Default is 'left'.
labelAlign = left

# cat=form-Element/formelement; type=string; label=ExtraButtonInfo symbol 'inline':Default is '<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>'. The image appears inside of the formElement. If an `<img src="...">` tag is given, the PathFilename is relative to the Typo3 installation.
extraButtonInfoInline = <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>

# cat=form-Element/formelement; type=string; label=ExtraButtonInfo symbol 'below':Default is '<span class="glyphicon glyphicon-info-sign text-info" aria-hidden="true"></span>'. The Image appears below the formElement. If an `<img src="...">` tag is given, the PathFilename is relative to the Typo3 installation.
extraButtonInfoBelow = <span class="glyphicon glyphicon-info-sign text-info" aria-hidden="true"></span>

# cat=form-Element/formelement; type=options[auto,below]; label=ExtraButtonInfo position:Default is 'auto'. 'auto' - the image appears inline in formElement types  `text`, `date`, `time` or `datetime` and below for all other. 'below' - the image appears always below the formelement.
extraButtonInfoPosition = auto

# cat=form-Element/formelement; type=string; label=ExtraButtonInfoClass:Default is empty. Applies only to FormElements with final 'extraButtonInfoPosition=below'. Typically used to right align the icon. E.g. 'pull-right'
extraButtonInfoClass =

# cat=custom/layout; type=user[IMATHUZH\Qfq\Core\Typo3\TextFieldRenderer->renderLarge]; label=Custom variables:An INI document with additional variables for the system store: "CONTACT_EMAIL = 'john@doe.com'" can be retrieved via '{{CONTACT_EMAIL:Y}}'. Sections are ignored, but comments can be used. Empty by default.
custom =

# cat=custom/layout; type=string; label=Custom variable 01:Default empty. Can be used the centrally define variables. E.g. "CONTACT_EMAIL = 'john@doe.com'". Retrieve them via '{{CONTACT_EMAIL:Y}}'.
custom1 =

# cat=custom/layout; type=string; label=Custom variable 02
custom2 =

# cat=custom/layout; type=string; label=Custom variable 03
custom3 =

# cat=custom/layout; type=string; label=Custom variable 04
custom4 =

# cat=custom/layout; type=string; label=Custom variable 05
custom5 =

# cat=custom/layout; type=string; label=Custom variable 06
custom6 =

# cat=custom/layout; type=string; label=Custom variable 07
custom7 =

# cat=custom/layout; type=string; label=Custom variable 08
custom8 =

# cat=custom/layout; type=string; label=Custom variable 09
custom9 =

# cat=custom/layout; type=string; label=Custom variable 10
custom10 =

# cat=custom/layout; type=string; label=Custom variable 11
custom11 =

# cat=custom/layout; type=string; label=Custom variable 12
custom12 =

# cat=custom/layout; type=string; label=Custom variable 13
custom13 =

# cat=custom/layout; type=string; label=Custom variable 14
custom14 =

# cat=custom/layout; type=string; label=Custom variable 15
custom15 =

# cat=custom/layout; type=string; label=Custom variable 16
custom16 =

# cat=custom/layout; type=string; label=Custom variable 17
custom17 =

# cat=custom/layout; type=string; label=Custom variable 18
custom18 =

# cat=custom/layout; type=string; label=Custom variable 19
custom19 =

# cat=custom/layout; type=string; label=Custom variable 20
custom20 =

# cat=custom/layout; type=string; label=Custom variable 21
custom21 =

# cat=custom/layout; type=string; label=Custom variable 22
custom22 =

# cat=custom/layout; type=string; label=Custom variable 23
custom23 =

# cat=custom/layout; type=string; label=Custom variable 24
custom24 =

# cat=custom/layout; type=string; label=Custom variable 25
custom25 =

# cat=custom/layout; type=string; label=Custom variable 26
custom26 =

# cat=custom/layout; type=string; label=Custom variable 27
custom27 =

# cat=custom/layout; type=string; label=Custom variable 28
custom28 =

# cat=custom/layout; type=string; label=Custom variable 29
custom29 =

# cat=custom/layout; type=string; label=Custom variable 30
custom30 =


# cat=dynamic/config; type=user[IMATHUZH\Qfq\Core\Typo3\TextFieldRenderer->renderSmall]; label=Fill store 'SYSTEM' by SQL Row:Default is empty. SQL query fired during QFQ load. Every row with columns name and value are copied to store 'SYSTEM'. Already defined values are unchanged. Retrieve values via '{{name:Y}}'. Example 'SELECT gr.reference AS name, gr.id AS value FROM Ggroup AS gr WHERE gr.storeSystem="yes"'
fillStoreSystemBySqlRow =

# cat=dynamic/config; type=string; label=Error message for SQL Row:Default is empty. Error message in case the SQL does not return at least one row. Important: if a message is given, QFQ will stop and return the message. Without a message: QFQ run's as there would be no 'fillStoreSystemStoreBySqlRow'.
fillStoreSystemBySqlRowErrorMsg =

# cat=dynamic/config; type=user[IMATHUZH\Qfq\Core\Typo3\TextFieldRenderer->renderSmall]; label=Fill store 'SYSTEM' by SQL Row (Include variable):Default is empty. THE FOLLOWING NEEDS TO BE CLARIFIED - but it is necessary to define 'pIdUser' to replace {{feUser}}. The SQL query executed during QFQ load will also parse the variable. Every row with columns name and value, as well as defined keywords, are copied to the 'SYSTEM' store. Already defined values are unchanged.Retrieve values via '{{name:Y}}'. Example "SELECT 'pIdUser' AS name , p.id AS value FROM Person AS p WHERE p.account = '{{feUser:T}}'" in this case '{{pIdUser:Y}}' is the variable name.
fillStoreSystemBySqlRowVariable =

# cat=dynamic/config; type=string; label=Error message for SQL Row (Include variable):Default is empty. Error message in case the SQL does not return at least one row. Important: if a message is given, QFQ will stop and return the message. Without a message: QFQ run's as there would be no 'fillStoreSystemBySqlRowVariable'.
fillStoreSystemBySqlRowVariableErrorMsg =

# cat=dynamic/config; type=user[IMATHUZH\Qfq\Core\Typo3\TextFieldRenderer->renderSmall]; label=Fill store 'SYSTEM' by SQL 1:Default is empty. SQL query fired during QFQ load. The result have to be exactly one row. That row will be merged to store 'SYSTEM'. Retrieve values via '{{column:Y}}'. Example 'SELECT id AS periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1'
fillStoreSystemBySql1 =

# cat=dynamic/config; type=string; label=Error message for SQL 1:Default is empty. Error message in case the SQL does not return exact one row. Important: if a message is given, QFQ will stop and return the message. Without a message: QFQ run's as there would be no 'fillStoreSystemStoreBySql1'.
fillStoreSystemBySqlErrorMsg1 =

# cat=dynamic/config; type=user[IMATHUZH\Qfq\Core\Typo3\TextFieldRenderer->renderSmall]; label=Fill store 'SYSTEM' by SQL 2:Default is empty. SQL query fired during QFQ load. The result have to be exactly one row. That row will be merged to store 'SYSTEM'. Retrieve values via '{{column:Y}}'. Example 'SELECT id AS periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1'
fillStoreSystemBySql2 =

# cat=dynamic/config; type=string; label=Error message for SQL 2:Default is empty. Error message in case the SQL does not return exact one row. Important: if a message is given, QFQ will stop and return the message. Without a message: QFQ run's as there would be no 'fillStoreSystemStoreBySql2'.
fillStoreSystemBySqlErrorMsg2 =

# cat=dynamic/config; type=user[IMATHUZH\Qfq\Core\Typo3\TextFieldRenderer->renderSmall]; label=Fill store 'SYSTEM' by SQL 3:Default is empty. SQL query fired during QFQ load. The result have to be exactly one row. That row will be merged to store 'SYSTEM'. Retrieve values via '{{column:Y}}'. Example 'SELECT id AS periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1'
fillStoreSystemBySql3 =

# cat=dynamic/config; type=string; label=Error message for SQL 3:Default is empty. Error message in case the SQL does not return exact one row. Important: if a message is given, QFQ will stop and return the message. Without a message: QFQ run's as there would be no 'fillStoreSystemStoreBySql3'.
fillStoreSystemBySqlErrorMsg3 =

# cat=file/file; type=string; label=Upload Action : 'unProtect' => Try to unprotect the file (if it fails, keep original untouched), 'denyProtect' => deny upload of protected files, 'denyAcrobatOnly' => deny upload of 'Adobe Acrobat'-only files, 'none' => no upload actions (no comination with other actions). Default: 'unProtect,denyProtect', Option: Default: 'unProtect:60,denyProtect'
uploadAction = unProtect,denyProtect

# cat=file/file; type=options[auto,error,dummy]; label=Missing file: 'auto' (default) with 'flagProduction = no' return a dummy file, else report an error. 'error': stop and report missing files. 'dummy': return a dummy file. Dummy: typo3conf/ext/qfq/Resources/Public/dummyFiles/dummy.[pdf|xlsx].
missingFile = auto

# cat=file/file; type=boolean; label=Upload File: Force filename of uploaded files to lower case. Default 'on'.
fileNameToLower = 1

# cat=file/file; type=string; label=Cache directory 'secure':Default is 'fileadmin/protected/cache'. Directory to optionally save on-the-fly rendered PDF, Excel, ZIP files. Important: secure the directory against direct access.
cacheDirSecure = fileadmin/protected/cache

# cat=file/file; type=string; label=Purge cached files:Default is 365. Purge files in named cache directory older than x days. '0' disables purge.
cachePurgeFilesOlderDays = 365

# cat=file/file; type=string; label=Max file size for file uploads:If empty, take minimum of 'post_max_size' and 'upload_max_filesize' (PHP.INI).
maxFileSize =

# cat=file/file; type=string; label=Max allowed image size in pixels for uploads. (Width)x(Height). Default: 5000x5000.
maxImageDimension = 5000x5000


# cat=file/file; type=string; label=ImageUpload directory:Default is 'fileadmin/imageUploadDir'. Will be used for TinyMCE Image Upload.
imageUploadDir =

# cat=file/file; type=string; label=Thumbnail directory 'secure':Default is 'fileadmin/protected/qfqThumbnail'. Important: secure the directory against direct access. Will be used by a special columnname '_thumbnail'.
thumbnailDirSecure = fileadmin/protected/qfqThumbnail

# cat=file/file; type=string; label=Thumbnail directory 'public':Default is 'typo3temp/qfqThumbnail'. Will be used by a special columnname '_thumbnail'.
thumbnailDirPublic = typo3temp/qfqThumbnail

# cat=file/file; type=user[IMATHUZH\Qfq\Core\Typo3\TextFieldRenderer->renderLarge]; label=Custom direct download:An INI document with additional queries for the system store: "images = SELECT CONCAT('d:output.pdf|F:', n.pathFileName) FROM notiz AS n WHERE n.id=? AND NOW()<n.expire" can be retrieved via 'image (token)'. No default.
sqlDirect =

# cat=file/file; type=string; label=Error Message [download]: Message shown to the user if record isn't found.
sqlDirectError =


# cat=tools/tools; type=string; label=Force fixed sender email address:Default is empty. Set this ONLY if your SMTP needs one fix sender address. QFQ will then set Reply-To to the initial sender. Realname is optional. E.g.: 'realname <mail@example.com>'
forceSmtpSender =

# cat=tools/tools; type=string; label=Options for SendEMail:Default is empty. General options. Check: http://caspian.dotconf.net/menu/Software/SendEmail. E.g.: 'sendEMail=-o tls=yes'
sendEMailOptions =

# cat=tools/tools; type=string; label=Command 'wget':Default is 'wget >/dev/null 2>&1'. Will be used for trying to get content from protected server.
cmdWget = wget >/dev/null 2>&1


# cat=authentication/service/11; type=boolean; label=Enable authentication: If selected, then QFQ can authenticate a Typo3 user
authEnable = 0

# cat=authentication/service/12; type=int+; label=Service priority: This defines the order of the QFQ authentication service in relation to other authentication services. Higher number wins.
authPriority = 82

# cat=authentication/service/13; type=int+; label=Service quality: This value is used by TYPO3 if two authentication services have the same priority. Higher number wins.
authQuality = 80

# cat=authentication/service/14; type=string; label=User storage: The UID of the page where local users are located. The first UID is used to store new users.
authUserStorage =

# cat=authentication/service/15; type=string; label=User groups: The comma-separated list of UIDs of user groups to be assigned to new users.
authUserGroups =

# cat=authentication/enable/21; type=boolean; label=Create accounts: If selected, then a local account is created if non exists when a user is authenticated by QFQ
authCreateAccount = 0

# cat=authentication/enable/22; type=boolean; label=Unlock accounts: If selected, then a disabled local account is unlocked when a user is authenticated by QFQ
authUnlockAccount = 0

# cat=authentication/enable/23; type=boolean; label=Activate accounts: If selected, then an inactive or expired account is activated when a user is authenticated by QFQ
authActivateAccount = 0

# cat=authentication/enable/24; type=int+; label=Account extension time: The number of days after which an account activated during authentication will expire
authExtendByDays = 7

# cat=authentication/enable/25; type=boolean; label=Update accounts: If selected, then accounts are updated when a user is authenticated by QFQ with provided user data
authUpdateAccount = 0

