diff --git a/extension/Documentation/Manual.rst b/extension/Documentation/Manual.rst index 6cbe739435472ef0c7264f4a134480858f160eca..56cd4a92b75e29ab6a538f788d467368acce23df 100644 --- a/extension/Documentation/Manual.rst +++ b/extension/Documentation/Manual.rst @@ -3268,11 +3268,11 @@ Type: annotate Annotate image or text. Typically the image or text has been uploaded during a previous step. The annotation will be saved in *FormElement.name* column of the current record. The uploaded file itself will not be modified. The annotations -can be shown in edit or readonly mode and modified again. +can be shown in edit (and might be modified) or in readonly mode. Two modes are available: -image +grafic A simple grafic editor to paint on top of the image (best by a tablet with pen or grafic tablet). The uploaded image is shown in the background. All drawings are saved as a JSON fabric.js data string. Supported file types: **png, svg**. PDF files can be easily divided into per page SVG files during upload - see `split-pdf-upload`_ @@ -3287,11 +3287,11 @@ text Drawing with fabric.js might produce a lot data. Take care the column type/size is big enough (>=64kB). -Image -""""" +Grafic +"""""" -An image, specified by `FormElement.parameter`: imageSource={{pathFileName}}, will be displayed in the background. On -form load, both, the image and an optional already given JSON fabric.js data string, will be displayed. The image is SIP +An image, specified by ``FormElement.parameter.imageSource={{pathFileName}}``, will be displayed in the background. On +form load, both, the image and an optional already given grafical annotations, will be displayed. The image is SIP protected and will be loaded on demand. **Form.parameter** @@ -3301,9 +3301,9 @@ protected and will be loaded on demand. +===================+=======================+==================================================================================+ | annotateType | grafic | *grafic|text*. Default is *grafic*. Select mode. | +-------------------+-----------------------+----------------------------------------------------------------------------------+ -| imageSource | {{pathFileName2}} | Background image. E.g. `fileadmin/images/scan.png` | +| imageSource | <path filename> | Background image. E.g. `fileadmin/images/scan.png` | +-------------------+-----------------------+----------------------------------------------------------------------------------+ -| defaultPenColor | <rgb hex value> | Pen default color, after loading the fabric element. Default is '0000FF' (blue). | +| defaultPenColor | <rgb hex value> | Pen default color, after loading the fabric element. Default is '0000FF' (blue). | +-------------------+----------------------------------------------------------------------------------------------------------+ .. note:: @@ -3321,7 +3321,7 @@ Code +====================+=======================+==================================================================================+ | annotateType | text | *grafic|text*. Default is *grafic*. Select mode. | +--------------------+-----------------------+----------------------------------------------------------------------------------+ -| textSource | <fileadmin/code.m> | Text file to annotate. | +| textSource | <path filename> | Text file to annotate. | +--------------------+-----------------------+----------------------------------------------------------------------------------+ | annotateUserName | <john doe> | Will be shown at annotation line. | +--------------------+-----------------------+----------------------------------------------------------------------------------+ diff --git a/extension/Source/core/AbstractBuildForm.php b/extension/Source/core/AbstractBuildForm.php index 34b64340f7046668aa66a67f03bb0c4d95259144..05ab91f44ac18fd38836e78468befb4ed5b7c13b 100644 --- a/extension/Source/core/AbstractBuildForm.php +++ b/extension/Source/core/AbstractBuildForm.php @@ -3192,7 +3192,7 @@ abstract class AbstractBuildForm { Support::setIfNotSet($formElement, FE_ANNOTATE_USER_NAME); Support::setIfNotSet($formElement, FE_ANNOTATE_USER_AVATAR); - $dataHighlight=HelperFile::getFileTypeHighlight($formElement[FE_HIGHLIGHT]??'',$formElement[FE_TEXT_SOURCE] ); + $dataHighlight = HelperFile::getFileTypeHighlight($formElement[FE_HIGHLIGHT] ?? '', $formElement[FE_TEXT_SOURCE]); // <div class="codeCorrection" data-uid='{"uid": 1, "name": "Reginald Commenter", "avatar": "http://www"}' data-file="../javascript/src/CodeCorrection.js" data-target="codeCorrection-output1"> @@ -3209,11 +3209,12 @@ abstract class AbstractBuildForm { $attributeDiv .= Support::doAttribute('data-file', $this->fileToSipUrl($formElement[FE_TEXT_SOURCE])); $attributeDiv .= Support::doAttribute('data-target', $formElement[FE_HTML_ID]); $attributeDiv .= Support::doAttribute('data-highlight', $dataHighlight); - - $attributeDiv .= Support::doAttribute('data-view-only', 'true'); - $attributeDiv .= $this->getAttributeFeMode($formElement[FE_MODE]); - $htmlAnnotate = Support::wrapTag('<div ' . $attributeDiv . ' data-uid=\''. $jsonDataUid . '\' >', '', false); + if ($formElement[FE_MODE] == FE_MODE_READONLY) { + $attributeDiv .= Support::doAttribute('data-view-only', 'true'); + } + + $htmlAnnotate = Support::wrapTag('<div ' . $attributeDiv . ' data-uid=\'' . $jsonDataUid . '\' >', '', false); // $htmlAnnotate = Support::wrapTag('<div ' . $attributeDiv .'>', '', false); $attributeInput = Support::doAttribute('id', $formElement[FE_HTML_ID]); @@ -3274,6 +3275,9 @@ abstract class AbstractBuildForm { $attributeFabric .= Support::doAttribute('data-emojis', 'typo3conf/ext/qfq/Resources/Public/Json/qfq.emoji.json'); $attributeFabric .= Support::doAttribute('data-fabric-color', HelperFormElement::penColorToHex($formElement)); $attributeFabric .= $this->getAttributeFeMode($formElement[FE_MODE]); + if ($formElement[FE_MODE] == FE_MODE_READONLY) { + $attributeFabric .= Support::doAttribute('data-view-only', 'true'); + } $htmlFabric = Support::wrapTag('<div ' . $attributeFabric . ' >', '', false); $attributeInput = Support::doAttribute('id', $formElement[FE_HTML_ID]); @@ -3304,8 +3308,7 @@ abstract class AbstractBuildForm { * @throws CodeException * @throws UserFormException */ - public - function buildImageCut(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { + public function buildImageCut(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { $htmlImage = ''; if ($mode == FORM_LOAD && !empty($formElement[FE_IMAGE_SOURCE])) { @@ -3343,6 +3346,7 @@ abstract class AbstractBuildForm { } $attributeFabric .= Support::doAttribute('data-image-output', $htmlFabricImageId); $attributeFabric .= $this->getAttributeFeMode($formElement[FE_MODE]); + $htmlFabric = Support::wrapTag('<div ' . $attributeFabric . ' >', '', false); // <input id="fabric-output" name="fabric-data" type="hidden"> @@ -3375,8 +3379,7 @@ abstract class AbstractBuildForm { * @throws CodeException * @throws UserFormException */ - private - function fileToSipUrl($pathFileName) { + private function fileToSipUrl($pathFileName) { $param[DOWNLOAD_MODE] = DOWNLOAD_MODE_FILE; $param[SIP_DOWNLOAD_PARAMETER] = base64_encode(TOKEN_FILE . PARAM_TOKEN_DELIMITER . $pathFileName); @@ -3402,8 +3405,7 @@ abstract class AbstractBuildForm { * @throws UserFormException * @throws UserReportException */ - public - function buildDateTime(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { + public function buildDateTime(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { $attribute = ''; $placeholder = ''; @@ -3525,8 +3527,7 @@ abstract class AbstractBuildForm { * @throws CodeException * @throws UserFormException */ - public - function buildDateJQW(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { + public function buildDateJQW(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { $arrMinMax = null; // if ($formElement[FE_PLACEHOLDER] == '') { @@ -3611,8 +3612,7 @@ abstract class AbstractBuildForm { * @throws UserFormException * @throws UserReportException */ - public - function buildEditor(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { + public function buildEditor(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { $attribute = ''; //TODO plugin autoresize nutzen um Editorgroesse anzugeben @@ -3655,8 +3655,7 @@ abstract class AbstractBuildForm { * * @return array */ - private - function setEditorConfig(array $formElement, $htmlFormElementName) { + private function setEditorConfig(array $formElement, $htmlFormElementName) { $flagMaxHeight = false; // plugins @@ -3711,8 +3710,7 @@ abstract class AbstractBuildForm { * @return string * @throws \qfq\UserFormException */ - private - function getPrefixedElementsAsJSON($prefix, array $formElement) { + private function getPrefixedElementsAsJSON($prefix, array $formElement) { $settings = array(); // E.g.: $key = editor-plugins @@ -3749,8 +3747,7 @@ abstract class AbstractBuildForm { * * @throws UserFormException */ - public - function buildGridJQW(array $formElement, $htmlFormElementName, $value, $fake, $mode = FORM_LOAD) { + public function buildGridJQW(array $formElement, $htmlFormElementName, $value, $fake, $mode = FORM_LOAD) { // TODO: implement throw new UserFormException("Not implemented yet: buildGridJQW()", ERROR_NOT_IMPLEMENTED); } @@ -3768,8 +3765,7 @@ abstract class AbstractBuildForm { * @throws CodeException * @throws UserFormException */ - public - function buildNote(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { + public function buildNote(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { $json = $this->getFormElementForJson($htmlFormElementName, $value, $formElement); @@ -3789,8 +3785,7 @@ abstract class AbstractBuildForm { * * @return mixed */ - public - function buildPill(array $formElement, $htmlFormElementName, $value, array &$json) { + public function buildPill(array $formElement, $htmlFormElementName, $value, array &$json) { return $value; } @@ -3813,8 +3808,7 @@ abstract class AbstractBuildForm { * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ - public - function buildFieldset(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { + public function buildFieldset(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { $attribute = ''; // save parent processed FE's @@ -3859,8 +3853,7 @@ abstract class AbstractBuildForm { * * @return array */ - private - function fillFeSpecNativeCheckboxWithTgMax(array $formElementArr, $tgMaxCopies) { + private function fillFeSpecNativeCheckboxWithTgMax(array $formElementArr, $tgMaxCopies) { foreach ($formElementArr as $key => $formElement) { if ($formElement[FE_TYPE] == FE_TYPE_CHECKBOX) { @@ -3891,8 +3884,7 @@ abstract class AbstractBuildForm { * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ - public - function buildTemplateGroup(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { + public function buildTemplateGroup(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { $attribute = ''; $html = ''; @@ -4015,8 +4007,7 @@ EOT; * @throws \PhpOffice\PhpSpreadsheet\Reader\Exception * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ - private - function templateGroupCollectFilledElements($max, $htmlDelete, array &$json) { + private function templateGroupCollectFilledElements($max, $htmlDelete, array &$json) { $record = $this->store->getStore(STORE_RECORD); // current values if ($record === false || count($record) === 0) { @@ -4102,8 +4093,7 @@ EOT; * @throws UserFormException * @throws UserReportException */ - private - function templateGroupDoValue() { + private function templateGroupDoValue() { // Fire 'value' statement $tgMax = 0;