diff --git a/composer.json b/composer.json
index e4e6aa6f03..509605b1ca 100644
--- a/composer.json
+++ b/composer.json
@@ -29,6 +29,7 @@
"asika/simple-console": "^1.0",
"bacon/bacon-qr-code": "^2.0.0",
"divineomega/password_exposed": "^2.8",
+ "enyo/dropzone": "^5.9",
"ezyang/htmlpurifier": "^4.7",
"friendica/json-ld": "^1.0",
"geekwright/po": "^2.0",
diff --git a/composer.lock b/composer.lock
index f9b96b1d9d..3e8ec70de2 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "5af9ac9003f4653f3aa1860dd5a4d821",
+ "content-hash": "c9e005c79c8556215c30a66c470659eb",
"packages": [
{
"name": "asika/simple-console",
@@ -550,6 +550,42 @@
"description": "This PHP package provides a `password_exposed` helper function, that uses the haveibeenpwned.com API to check if a password has been exposed in a data breach.",
"time": "2019-01-25T12:00:28+00:00"
},
+ {
+ "name": "enyo/dropzone",
+ "version": "v5.9.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dropzone/dropzone-packagist.git",
+ "reference": "286b2dc1f1195bd12169e4c9d5f91cfbe46e245f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dropzone/dropzone-packagist/zipball/286b2dc1f1195bd12169e4c9d5f91cfbe46e245f",
+ "reference": "286b2dc1f1195bd12169e4c9d5f91cfbe46e245f",
+ "shasum": ""
+ },
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Matias Meno",
+ "email": "m@tias.me",
+ "homepage": "http://www.yesmeno.com"
+ }
+ ],
+ "description": "Handles drag and drop of files for you.",
+ "homepage": "http://www.dropzonejs.com",
+ "keywords": [
+ "drag and drop",
+ "dragndrop",
+ "file upload",
+ "upload"
+ ],
+ "time": "2021-09-21T17:03:36+00:00"
+ },
{
"name": "ezyang/htmlpurifier",
"version": "v4.14.0",
diff --git a/mod/photos.php b/mod/photos.php
index 050a254af3..18db9c15d9 100644
--- a/mod/photos.php
+++ b/mod/photos.php
@@ -1139,7 +1139,7 @@ function photos_content(App $a)
'$preview' => DI::l10n()->t('Preview'),
'$loading' => DI::l10n()->t('Loading...'),
'$qcomment' => $qcomment,
- '$rand_num' => Crypto::randomDigits(12)
+ '$rand_num' => Crypto::randomDigits(12),
]);
}
}
@@ -1194,7 +1194,7 @@ function photos_content(App $a)
'$submit' => DI::l10n()->t('Submit'),
'$preview' => DI::l10n()->t('Preview'),
'$qcomment' => $qcomment,
- '$rand_num' => Crypto::randomDigits(12)
+ '$rand_num' => Crypto::randomDigits(12),
]);
}
@@ -1268,7 +1268,7 @@ function photos_content(App $a)
'$submit' => DI::l10n()->t('Submit'),
'$preview' => DI::l10n()->t('Preview'),
'$qcomment' => $qcomment,
- '$rand_num' => Crypto::randomDigits(12)
+ '$rand_num' => Crypto::randomDigits(12),
]);
}
}
diff --git a/src/App/Page.php b/src/App/Page.php
index 965c04915c..23f542f7de 100644
--- a/src/App/Page.php
+++ b/src/App/Page.php
@@ -253,11 +253,14 @@ class Page implements ArrayAccess
'$touch_icon' => $touch_icon,
'$block_public' => intval($config->get('system', 'block_public')),
'$stylesheets' => $this->stylesheets,
- '$likeError' => $l10n->t('Like not successfull'),
- '$dislikeError' => $l10n->t('Dislike not successfull'),
- '$announceError' => $l10n->t('Sharing not successfull'),
- '$srvError' => $l10n->t('Backend error'),
- '$netError' => $l10n->t('Network error'),
+ '$likeError' => $l10n->t('Like not successfull'),
+ '$dislikeError' => $l10n->t('Dislike not successfull'),
+ '$announceError' => $l10n->t('Sharing not successfull'),
+ '$srvError' => $l10n->t('Backend error'),
+ '$netError' => $l10n->t('Network error'),
+ // Dropzone
+ '$max_imagesize' => round(\Friendica\Util\Strings::getBytesFromShorthand($config->get('system', 'maximagesize')) / 1000000, 1),
+
]) . $this->page['htmlhead'];
}
diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php
index 81e1476b58..b72dcc3c4e 100644
--- a/src/Content/Text/BBCode.php
+++ b/src/Content/Text/BBCode.php
@@ -1475,8 +1475,8 @@ class BBCode
$text = preg_replace("/\[list=((?-i)I)\](.*?)\[\/list\]/ism", '
', $text);
$text = preg_replace("/\[list=((?-i)a)\](.*?)\[\/list\]/ism", '
', $text);
$text = preg_replace("/\[list=((?-i)A)\](.*?)\[\/list\]/ism", '
', $text);
- $text = preg_replace("/\[ul\](.*?)\[\/ul\]/ism", '
', $text);
- $text = preg_replace("/\[ol\](.*?)\[\/ol\]/ism", '
', $text);
+ $text = preg_replace("/\[ul\](.*?)\[\/ul\]/ism", '
', $text);
+ $text = preg_replace("/\[ol\](.*?)\[\/ol\]/ism", '
$1 ', $text);
$text = preg_replace("/\[li\](.*?)\[\/li\]/ism", '
$1 ', $text);
}
diff --git a/src/Content/Text/HTML.php b/src/Content/Text/HTML.php
index f9f340135c..c1bcb0b5b0 100644
--- a/src/Content/Text/HTML.php
+++ b/src/Content/Text/HTML.php
@@ -281,9 +281,9 @@ class HTML
self::tagToBBCode($doc, 'div', [], "\r", "\r");
self::tagToBBCode($doc, 'p', [], "\n", "\n");
- self::tagToBBCode($doc, 'ul', [], "[list]", "[/list]");
- self::tagToBBCode($doc, 'ol', [], "[list=1]", "[/list]");
- self::tagToBBCode($doc, 'li', [], "[*]", "");
+ self::tagToBBCode($doc, 'ul', [], "[ul]", "\n[/ul]");
+ self::tagToBBCode($doc, 'ol', [], "[ol]", "\n[/ol]");
+ self::tagToBBCode($doc, 'li', [], "\n[*]", "");
self::tagToBBCode($doc, 'hr', [], "[hr]", "");
@@ -349,33 +349,6 @@ class HTML
$message = str_replace("\n\n\n", "\n\n", $message);
} while ($oldmessage != $message);
- do {
- $oldmessage = $message;
- $message = str_replace(
- [
- "[/size]\n\n",
- "\n[hr]",
- "[hr]\n",
- "\n[list",
- "[/list]\n",
- "\n[/",
- "[list]\n",
- "[list=1]\n",
- "\n[*]"],
- [
- "[/size]\n",
- "[hr]",
- "[hr]",
- "[list",
- "[/list]",
- "[/",
- "[list]",
- "[list=1]",
- "[*]"],
- $message
- );
- } while ($message != $oldmessage);
-
$message = str_replace(
['[b][b]', '[/b][/b]', '[i][i]', '[/i][/i]'],
['[b]', '[/b]', '[i]', '[/i]'],
diff --git a/src/Core/Session/Factory/Session.php b/src/Core/Session/Factory/Session.php
index a93cf6631e..239b050e77 100644
--- a/src/Core/Session/Factory/Session.php
+++ b/src/Core/Session/Factory/Session.php
@@ -55,19 +55,17 @@ class Session
* @param LoggerInterface $logger
* @param Profiler $profiler
* @param array $server
+ * @return IHandleSessions
*/
- public function createSession(App\Mode $mode, App\BaseURL $baseURL, IManageConfigValues $config, Database $dba, Cache $cacheFactory, LoggerInterface $logger, Profiler $profiler, array $server = []): IHandleSessions
+ public function create(App\Mode $mode, App\BaseURL $baseURL, IManageConfigValues $config, Database $dba, Cache $cacheFactory, LoggerInterface $logger, Profiler $profiler, array $server = []): IHandleSessions
{
$profiler->startRecording('session');
- $session = null;
+ $session_handler = $config->get('system', 'session_handler', self::HANDLER_DEFAULT);
try {
if ($mode->isInstall() || $mode->isBackend()) {
$session = new Type\Memory();
} else {
- $session_handler = $config->get('system', 'session_handler', self::HANDLER_DEFAULT);
- $handler = null;
-
switch ($session_handler) {
case self::HANDLER_DATABASE:
$handler = new Handler\Database($dba, $logger, $server);
@@ -82,10 +80,15 @@ class Session
$handler = new Handler\Cache($cache, $logger);
}
break;
+ default:
+ $handler = null;
}
$session = new Type\Native($baseURL, $handler);
}
+ } catch (\Throwable $e) {
+ $logger->notice('Unable to create session', ['mode' => $mode, 'session_handler' => $session_handler, 'exception' => $e]);
+ $session = new Type\Memory();
} finally {
$profiler->stopRecording();
return $session;
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 93ad4fd8f0..12184a3a55 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -589,7 +589,7 @@ class Item
public static function isValid(array $item): bool
{
// When there is no content then we don't post it
- if (($item['body'] . $item['title'] == '') && empty($item['quote-uri-id']) && (empty($item['uri-id']) || !Post\Media::existsByURIId($item['uri-id']))) {
+ if (($item['body'] . $item['title'] == '') && empty($item['quote-uri-id']) && empty($item['attachments']) && (empty($item['uri-id']) || !Post\Media::existsByURIId($item['uri-id']))) {
Logger::notice('No body, no title.');
return false;
}
diff --git a/src/Model/Profile.php b/src/Model/Profile.php
index b30cca8a6e..e2857947c0 100644
--- a/src/Model/Profile.php
+++ b/src/Model/Profile.php
@@ -334,7 +334,7 @@ class Profile
if (!$local_user_is_self) {
if (!$visitor_is_authenticated) {
// Remote follow is only available for local profiles
- if (!empty($profile['nickname']) && strpos($profile_url, DI::baseUrl()) === 0) {
+ if (!empty($profile['nickname']) && strpos($profile_url, (string)DI::baseUrl()) === 0) {
$follow_link = 'profile/' . $profile['nickname'] . '/remote_follow';
}
} else {
diff --git a/src/Module/Media/Attachment/Upload.php b/src/Module/Media/Attachment/Upload.php
index 046d85bc90..b837b8df7b 100644
--- a/src/Module/Media/Attachment/Upload.php
+++ b/src/Module/Media/Attachment/Upload.php
@@ -25,7 +25,7 @@ use Friendica\App;
use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core\L10n;
use Friendica\Core\Session\Capability\IHandleUserSessions;
-use Friendica\Database\Database;
+use Friendica\Core\System;
use Friendica\Model\Attach;
use Friendica\Model\User;
use Friendica\Module\Response;
@@ -42,9 +42,6 @@ use Psr\Log\LoggerInterface;
*/
class Upload extends \Friendica\BaseModule
{
- /** @var Database */
- private $database;
-
/** @var IHandleUserSessions */
private $userSession;
@@ -57,31 +54,32 @@ class Upload extends \Friendica\BaseModule
/** @var bool */
private $isJson;
- public function __construct(SystemMessages $systemMessages, IManageConfigValues $config, IHandleUserSessions $userSession, Database $database, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = [])
+ /** @var App\Page */
+ private $page;
+
+ public function __construct(App\Page $page, SystemMessages $systemMessages, IManageConfigValues $config, IHandleUserSessions $userSession, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = [])
{
parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
- $this->database = $database;
$this->userSession = $userSession;
$this->config = $config;
$this->systemMessages = $systemMessages;
+ $this->page = $page;
}
protected function post(array $request = [])
{
- if ($this->isJson = !empty($request['response']) && $request['response'] == 'json') {
- $this->response->setType(Response::TYPE_JSON, 'application/json');
- }
+ $this->isJson = !empty($request['response']) && $request['response'] == 'json';
$owner = User::getOwnerDataById($this->userSession->getLocalUserId());
if (!$owner) {
$this->logger->warning('Owner not found.', ['uid' => $this->userSession->getLocalUserId()]);
- return $this->return(401, $this->t('Invalid request.'));
+ $this->return(401, $this->t('Invalid request.'));
}
if (empty($_FILES['userfile'])) {
$this->logger->warning('No file uploaded (empty userfile)');
- return $this->return(401, $this->t('Invalid request.'), true);
+ $this->return(401, $this->t('Invalid request.'), true);
}
$tempFileName = $_FILES['userfile']['tmp_name'];
@@ -98,14 +96,14 @@ class Upload extends \Friendica\BaseModule
@unlink($tempFileName);
$msg = $this->t('Sorry, maybe your upload is bigger than the PHP configuration allows') . ' ' . $this->t('Or - did you try to upload an empty file?');
$this->logger->warning($msg, ['fileSize' => $fileSize]);
- return $this->return(401, $msg, true);
+ $this->return(401, $msg, true);
}
if ($maxFileSize && $fileSize > $maxFileSize) {
@unlink($tempFileName);
$msg = $this->t('File exceeds size limit of %s', Strings::formatBytes($maxFileSize));
$this->logger->warning($msg, ['fileSize' => $fileSize]);
- return $this->return(401, $msg);
+ $this->return(401, $msg);
}
$newid = Attach::storeFile($tempFileName, $owner['uid'], $fileName, '<' . $owner['id'] . '>');
@@ -115,16 +113,16 @@ class Upload extends \Friendica\BaseModule
if ($newid === false) {
$msg = $this->t('File upload failed.');
$this->logger->warning($msg);
- return $this->return(500, $msg);
+ $this->return(500, $msg);
}
if ($this->isJson) {
- $content = json_encode(['ok' => true, 'id' => $newid], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+ $content = $newid;
} else {
$content = "\n\n" . '[attachment]' . $newid . '[/attachment]' . "\n";
}
- return $this->response->addContent($content);
+ $this->return(200, $content);
}
/**
@@ -136,16 +134,23 @@ class Upload extends \Friendica\BaseModule
*/
private function return(int $httpCode, string $message, bool $systemMessage = false): void
{
- $this->response->setStatus($httpCode, $message);
-
if ($this->isJson) {
- $this->response->addContent(json_encode(['error' => $message], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
+ $message = $httpCode >= 400 ? ['error' => $message] : ['ok' => true, 'id' => $message];
+ $this->response->setType(Response::TYPE_JSON, 'application/json');
+ $this->response->addContent(json_encode($message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
} else {
if ($systemMessage) {
$this->systemMessages->addNotice($message);
}
+ if ($httpCode >= 400) {
+ $this->response->setStatus($httpCode, $message);
+ }
+
$this->response->addContent($message);
}
+
+ $this->page->exit($this->response->generate());
+ System::exit();
}
}
diff --git a/src/Module/Media/Photo/Upload.php b/src/Module/Media/Photo/Upload.php
index 2b04d3582d..8b56540f43 100644
--- a/src/Module/Media/Photo/Upload.php
+++ b/src/Module/Media/Photo/Upload.php
@@ -25,10 +25,9 @@ use Friendica\App;
use Friendica\Core\Config\Capability\IManageConfigValues;
use Friendica\Core\L10n;
use Friendica\Core\Session\Capability\IHandleUserSessions;
-use Friendica\Database\Database;
+use Friendica\Core\System;
use Friendica\Model\Photo;
use Friendica\Model\User;
-use Friendica\Module\BaseApi;
use Friendica\Module\Response;
use Friendica\Navigation\SystemMessages;
use Friendica\Network\HTTPException\InternalServerErrorException;
@@ -45,9 +44,6 @@ use Psr\Log\LoggerInterface;
*/
class Upload extends \Friendica\BaseModule
{
- /** @var Database */
- private $database;
-
/** @var IHandleUserSessions */
private $userSession;
@@ -60,14 +56,17 @@ class Upload extends \Friendica\BaseModule
/** @var bool */
private $isJson = false;
- public function __construct(IManageConfigValues $config, SystemMessages $systemMessages, IHandleUserSessions $userSession, Database $database, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = [])
+ /** @var App\Page */
+ private $page;
+
+ public function __construct(App\Page $page, IManageConfigValues $config, SystemMessages $systemMessages, IHandleUserSessions $userSession, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = [])
{
parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
- $this->database = $database;
$this->userSession = $userSession;
$this->systemMessages = $systemMessages;
$this->config = $config;
+ $this->page = $page;
}
protected function post(array $request = [])
@@ -80,12 +79,12 @@ class Upload extends \Friendica\BaseModule
if (!$owner) {
$this->logger->warning('Owner not found.', ['uid' => $this->userSession->getLocalUserId()]);
- return $this->return(401, $this->t('Invalid request.'));
+ $this->return(401, $this->t('Invalid request.'));
}
if (empty($_FILES['userfile']) && empty($_FILES['media'])) {
$this->logger->warning('Empty "userfile" and "media" field');
- return $this->return(401, $this->t('Invalid request.'));
+ $this->return(401, $this->t('Invalid request.'));
}
$src = '';
@@ -134,7 +133,7 @@ class Upload extends \Friendica\BaseModule
if ($src == '') {
$this->logger->warning('File source (temporary file) cannot be determined', ['$_FILES' => $_FILES]);
- return $this->return(401, $this->t('Invalid request.'), true);
+ $this->return(401, $this->t('Invalid request.'), true);
}
$filetype = Images::getMimeTypeBySource($src, $filename, $filetype);
@@ -152,7 +151,7 @@ class Upload extends \Friendica\BaseModule
if (!$image->isValid()) {
@unlink($src);
$this->logger->warning($this->t('Unable to process image.'), ['imagedata[]' => gettype($imagedata), 'filetype' => $filetype]);
- return $this->return(401, $this->t('Unable to process image.'));
+ $this->return(401, $this->t('Unable to process image.'));
}
$image->orient($src);
@@ -185,7 +184,7 @@ class Upload extends \Friendica\BaseModule
if ($filesize > $maximagesize) {
@unlink($src);
$this->logger->notice('Image size is too big', ['size' => $filesize, 'max' => $maximagesize]);
- return $this->return(401, $this->t('Image exceeds size limit of %s', Strings::formatBytes($maximagesize)));
+ $this->return(401, $this->t('Image exceeds size limit of %s', Strings::formatBytes($maximagesize)));
}
}
@@ -203,7 +202,7 @@ class Upload extends \Friendica\BaseModule
$result = Photo::store($image, $owner['uid'], 0, $resource_id, $filename, $album, 0, Photo::DEFAULT, $allow_cid);
if (!$result) {
$this->logger->warning('Photo::store() failed', ['result' => $result]);
- return $this->return(401, $this->t('Image upload failed.'));
+ $this->return(401, $this->t('Image upload failed.'));
}
if ($width > 640 || $height > 640) {
@@ -223,7 +222,7 @@ class Upload extends \Friendica\BaseModule
}
$this->logger->info('upload done');
- return $this->return(200, "\n\n" . '[url=' . $this->baseUrl . '/photos/' . $owner['nickname'] . '/image/' . $resource_id . '][img]' . $this->baseUrl . "/photo/$resource_id-$smallest." . $image->getExt() . "[/img][/url]\n\n");
+ $this->return(200, "\n\n" . '[url=' . $this->baseUrl . '/photos/' . $owner['nickname'] . '/image/' . $resource_id . '][img]' . $this->baseUrl . "/photo/$resource_id-$smallest." . $image->getExt() . "[/img][/url]\n\n");
}
/**
@@ -250,5 +249,8 @@ class Upload extends \Friendica\BaseModule
$this->response->addContent($message);
}
+
+ $this->page->exit($this->response->generate());
+ System::exit();
}
}
diff --git a/static/dependencies.config.php b/static/dependencies.config.php
index 42f193ba53..0891166424 100644
--- a/static/dependencies.config.php
+++ b/static/dependencies.config.php
@@ -237,7 +237,7 @@ return [
IHandleSessions::class => [
'instanceOf' => \Friendica\Core\Session\Factory\Session::class,
'call' => [
- ['createSession', [$_SERVER], Dice::CHAIN_CALL],
+ ['create', [$_SERVER], Dice::CHAIN_CALL],
['start', [], Dice::CHAIN_CALL],
],
],
diff --git a/tests/src/Content/Text/BBCodeTest.php b/tests/src/Content/Text/BBCodeTest.php
index a7de2388e2..b7328d67d7 100644
--- a/tests/src/Content/Text/BBCodeTest.php
+++ b/tests/src/Content/Text/BBCodeTest.php
@@ -158,21 +158,21 @@ class BBCodeTest extends FixtureTest
{
return [
'bug-7271-condensed-space' => [
- 'expectedHtml' => '',
+ 'expectedHtml' => ' http://example.com/ ',
'text' => '[ol][*] http://example.com/[/ol]',
],
'bug-7271-condensed-nospace' => [
- 'expectedHtml' => '',
+ 'expectedHtml' => 'http://example.com/ ',
'text' => '[ol][*]http://example.com/[/ol]',
],
'bug-7271-indented-space' => [
- 'expectedHtml' => '',
+ 'expectedHtml' => '',
'text' => '[ul]
[*] http://example.com/
[/ul]',
],
'bug-7271-indented-nospace' => [
- 'expectedHtml' => '',
+ 'expectedHtml' => '',
'text' => '[ul]
[*]http://example.com/
[/ul]',
@@ -259,13 +259,21 @@ Karl Marx - Die ursprüngliche Akkumulation
'text' => '[emoji=https://fedi.underscore.world/emoji/custom/custom/heart_nb.png]:heart_nb:[/emoji]',
],
'task-12900-multiple-paragraphs' => [
- 'expectedHTML' => 'Header This is a paragraph with a line feed.
Second Chapter
',
+ 'expectedHTML' => 'Header This is a paragraph with a line feed.
Second Chapter
',
'text' => "[h1]Header[/h1][ul][*]One[*]Two[/ul]\n\nThis is a paragraph\nwith a line feed.\n\nSecond Chapter",
],
'task-12900-header-with-paragraphs' => [
'expectedHTML' => 'Header Some Chapter
',
'text' => '[h1]Header[/h1]Some Chapter',
- ]
+ ],
+ 'bug-12842-ul-newlines' => [
+ 'expectedHTML' => 'This is:
',
+ 'text' => "This is:\r\n[ul]\r\n[*]some\r\n[*]amazing\r\n[*]list\r\n[/ul]",
+ ],
+ 'bug-12842-ol-newlines' => [
+ 'expectedHTML' => 'This is:
some amazing list ',
+ 'text' => "This is:\r\n[ol]\r\n[*]some\r\n[*]amazing\r\n[*]list\r\n[/ol]",
+ ],
];
}
@@ -282,8 +290,9 @@ Karl Marx - Die ursprüngliche Akkumulation
*
* @throws InternalServerErrorException
*/
- public function testConvert(string $expectedHtml, string $text, $try_oembed = false, int $simpleHtml = 0, bool $forPlaintext = false)
+ public function testConvert(string $expectedHtml, string $text, bool $try_oembed = true, int $simpleHtml = BBCode::INTERNAL, bool $forPlaintext = false)
{
+ // This assumes system.remove_multiplicated_lines = false
$actual = BBCode::convert($text, $try_oembed, $simpleHtml, $forPlaintext);
self::assertEquals($expectedHtml, $actual);
diff --git a/tests/src/Content/Text/HTMLTest.php b/tests/src/Content/Text/HTMLTest.php
index 3225d7f60a..dc55ad0f0b 100644
--- a/tests/src/Content/Text/HTMLTest.php
+++ b/tests/src/Content/Text/HTMLTest.php
@@ -88,6 +88,24 @@ its surprisingly good",
'expectedBBCode' => '[url=https://dev-friendica.mrpetovan.com/profile/hypolite]@hypolite[/url] 0',
'html' => '@hypolite 0
',
],
+ 'bug-12842-ul-new-lines' => [
+ 'expectedBBCode' => 'This is:
+[ul]
+[*]some
+[*]amazing
+[*]list
+[/ul]',
+ 'html'=> 'This is:
',
+ ],
+ 'bug-12842-ol-new-lines' => [
+ 'expectedBBCode' => 'This is:
+[ol]
+[*]some
+[*]amazing
+[*]list
+[/ol]',
+ 'html'=> 'This is:
some amazing list ',
+ ],
];
}
@@ -627,13 +645,13 @@ its surprisingly good",
e.preventDefault();
// console.log('[id=\"' + this.getAttribute('href') + '\"]');
// console.log(document.getElementById('[id=\"' + this.getAttribute('href') + '\"]'));
-
+
document.querySelector('[ez-toc-data-id=\"' + decodeURI(this.getAttribute('href')) + '\"]').scrollIntoView({
behavior: 'smooth'
});
});
});
-};
+};
document.addEventListener('DOMContentLoaded', ezTocScrollScriptJS, false);
diff --git a/view/theme/frio/css/dropzone.frio.css b/view/theme/frio/css/dropzone.frio.css
new file mode 100644
index 0000000000..80dbc88330
--- /dev/null
+++ b/view/theme/frio/css/dropzone.frio.css
@@ -0,0 +1,467 @@
+@-webkit-keyframes passing-through {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(40px);
+ -moz-transform: translateY(40px);
+ -ms-transform: translateY(40px);
+ -o-transform: translateY(40px);
+ transform: translateY(40px);
+ }
+ 30%, 70% {
+ opacity: 1;
+ -webkit-transform: translateY(0px);
+ -moz-transform: translateY(0px);
+ -ms-transform: translateY(0px);
+ -o-transform: translateY(0px);
+ transform: translateY(0px);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-40px);
+ -moz-transform: translateY(-40px);
+ -ms-transform: translateY(-40px);
+ -o-transform: translateY(-40px);
+ transform: translateY(-40px);
+ }
+}
+@-moz-keyframes passing-through {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(40px);
+ -moz-transform: translateY(40px);
+ -ms-transform: translateY(40px);
+ -o-transform: translateY(40px);
+ transform: translateY(40px);
+ }
+ 30%, 70% {
+ opacity: 1;
+ -webkit-transform: translateY(0px);
+ -moz-transform: translateY(0px);
+ -ms-transform: translateY(0px);
+ -o-transform: translateY(0px);
+ transform: translateY(0px);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-40px);
+ -moz-transform: translateY(-40px);
+ -ms-transform: translateY(-40px);
+ -o-transform: translateY(-40px);
+ transform: translateY(-40px);
+ }
+}
+@keyframes passing-through {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(40px);
+ -moz-transform: translateY(40px);
+ -ms-transform: translateY(40px);
+ -o-transform: translateY(40px);
+ transform: translateY(40px);
+ }
+ 30%, 70% {
+ opacity: 1;
+ -webkit-transform: translateY(0px);
+ -moz-transform: translateY(0px);
+ -ms-transform: translateY(0px);
+ -o-transform: translateY(0px);
+ transform: translateY(0px);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-40px);
+ -moz-transform: translateY(-40px);
+ -ms-transform: translateY(-40px);
+ -o-transform: translateY(-40px);
+ transform: translateY(-40px);
+ }
+}
+@-webkit-keyframes slide-in {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(40px);
+ -moz-transform: translateY(40px);
+ -ms-transform: translateY(40px);
+ -o-transform: translateY(40px);
+ transform: translateY(40px);
+ }
+ 30% {
+ opacity: 1;
+ -webkit-transform: translateY(0px);
+ -moz-transform: translateY(0px);
+ -ms-transform: translateY(0px);
+ -o-transform: translateY(0px);
+ transform: translateY(0px);
+ }
+}
+@-moz-keyframes slide-in {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(40px);
+ -moz-transform: translateY(40px);
+ -ms-transform: translateY(40px);
+ -o-transform: translateY(40px);
+ transform: translateY(40px);
+ }
+ 30% {
+ opacity: 1;
+ -webkit-transform: translateY(0px);
+ -moz-transform: translateY(0px);
+ -ms-transform: translateY(0px);
+ -o-transform: translateY(0px);
+ transform: translateY(0px);
+ }
+}
+@keyframes slide-in {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(40px);
+ -moz-transform: translateY(40px);
+ -ms-transform: translateY(40px);
+ -o-transform: translateY(40px);
+ transform: translateY(40px);
+ }
+ 30% {
+ opacity: 1;
+ -webkit-transform: translateY(0px);
+ -moz-transform: translateY(0px);
+ -ms-transform: translateY(0px);
+ -o-transform: translateY(0px);
+ transform: translateY(0px);
+ }
+}
+@-webkit-keyframes pulse {
+ 0% {
+ -webkit-transform: scale(1);
+ -moz-transform: scale(1);
+ -ms-transform: scale(1);
+ -o-transform: scale(1);
+ transform: scale(1);
+ }
+ 10% {
+ -webkit-transform: scale(1.1);
+ -moz-transform: scale(1.1);
+ -ms-transform: scale(1.1);
+ -o-transform: scale(1.1);
+ transform: scale(1.1);
+ }
+ 20% {
+ -webkit-transform: scale(1);
+ -moz-transform: scale(1);
+ -ms-transform: scale(1);
+ -o-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@-moz-keyframes pulse {
+ 0% {
+ -webkit-transform: scale(1);
+ -moz-transform: scale(1);
+ -ms-transform: scale(1);
+ -o-transform: scale(1);
+ transform: scale(1);
+ }
+ 10% {
+ -webkit-transform: scale(1.1);
+ -moz-transform: scale(1.1);
+ -ms-transform: scale(1.1);
+ -o-transform: scale(1.1);
+ transform: scale(1.1);
+ }
+ 20% {
+ -webkit-transform: scale(1);
+ -moz-transform: scale(1);
+ -ms-transform: scale(1);
+ -o-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@keyframes pulse {
+ 0% {
+ -webkit-transform: scale(1);
+ -moz-transform: scale(1);
+ -ms-transform: scale(1);
+ -o-transform: scale(1);
+ transform: scale(1);
+ }
+ 10% {
+ -webkit-transform: scale(1.1);
+ -moz-transform: scale(1.1);
+ -ms-transform: scale(1.1);
+ -o-transform: scale(1.1);
+ transform: scale(1.1);
+ }
+ 20% {
+ -webkit-transform: scale(1);
+ -moz-transform: scale(1);
+ -ms-transform: scale(1);
+ -o-transform: scale(1);
+ transform: scale(1);
+ }
+}
+.dropzone, .dropzone * {
+ box-sizing: border-box;
+}
+
+.dropzone {
+ min-height: 150px;
+ border: 1px solid rgba(0, 0, 0, 0.3);
+ background: white;
+ padding: 2px 2px;
+}
+.dropzone.dz-clickable {
+ cursor: pointer;
+}
+.dropzone.dz-clickable * {
+ cursor: default;
+}
+.dropzone.dz-clickable .dz-message, .dropzone.dz-clickable .dz-message * {
+ cursor: pointer;
+}
+.dropzone.dz-started .dz-message {
+ display: none;
+}
+.dropzone.dz-drag-hover {
+ border-style: solid;
+}
+.dropzone.dz-drag-hover .dz-message {
+ opacity: 0.5;
+}
+.dropzone .dz-message {
+ text-align: center;
+}
+.dropzone .dz-message .dz-button {
+ background: none;
+ color: inherit;
+ border: none;
+ padding: 0;
+ font: inherit;
+ cursor: pointer;
+ outline: inherit;
+}
+.dropzone .dz-preview {
+ position: relative;
+ display: inline-block;
+ vertical-align: top;
+ margin: 16px;
+ min-height: 100px;
+}
+.dropzone .dz-preview:hover {
+ z-index: 1000;
+}
+.dropzone .dz-preview:hover .dz-details {
+ opacity: 1;
+}
+.dropzone .dz-preview.dz-file-preview .dz-image {
+ border-radius: 20px;
+ background: #999;
+ background: linear-gradient(to bottom, #eee, #ddd);
+}
+.dropzone .dz-preview.dz-file-preview .dz-details {
+ opacity: 1;
+}
+.dropzone .dz-preview.dz-image-preview {
+ background: white;
+}
+.dropzone .dz-preview.dz-image-preview .dz-details {
+ -webkit-transition: opacity 0.2s linear;
+ -moz-transition: opacity 0.2s linear;
+ -ms-transition: opacity 0.2s linear;
+ -o-transition: opacity 0.2s linear;
+ transition: opacity 0.2s linear;
+}
+.dropzone .dz-preview .dz-remove {
+ font-size: 14px;
+ text-align: center;
+ display: block;
+ cursor: pointer;
+ border: none;
+}
+.dropzone .dz-preview .dz-remove:hover {
+ text-decoration: underline;
+}
+.dropzone .dz-preview:hover .dz-details {
+ opacity: 1;
+}
+.dropzone .dz-preview .dz-details {
+ z-index: 20;
+ position: absolute;
+ top: 0;
+ left: 0;
+ opacity: 0;
+ font-size: 13px;
+ min-width: 100%;
+ max-width: 100%;
+ padding: 2em 1em;
+ text-align: center;
+ color: rgba(0, 0, 0, 0.9);
+ line-height: 150%;
+}
+.dropzone .dz-preview .dz-details .dz-size {
+ margin-bottom: 1em;
+ font-size: 16px;
+}
+.dropzone .dz-preview .dz-details .dz-filename {
+ white-space: nowrap;
+}
+.dropzone .dz-preview .dz-details .dz-filename:hover span {
+ border: 1px solid rgba(200, 200, 200, 0.8);
+ background-color: rgba(255, 255, 255, 0.8);
+}
+.dropzone .dz-preview .dz-details .dz-filename:not(:hover) {
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.dropzone .dz-preview .dz-details .dz-filename:not(:hover) span {
+ border: 1px solid transparent;
+}
+.dropzone .dz-preview .dz-details .dz-filename span, .dropzone .dz-preview .dz-details .dz-size span {
+ background-color: rgba(255, 255, 255, 0.4);
+ padding: 0 0.4em;
+ border-radius: 3px;
+}
+.dropzone .dz-preview:hover .dz-image img {
+ -webkit-transform: scale(1.05, 1.05);
+ -moz-transform: scale(1.05, 1.05);
+ -ms-transform: scale(1.05, 1.05);
+ -o-transform: scale(1.05, 1.05);
+ transform: scale(1.05, 1.05);
+ -webkit-filter: blur(8px);
+ filter: blur(8px);
+}
+.dropzone .dz-preview .dz-image {
+ border-radius: 20px;
+ overflow: hidden;
+ width: 120px;
+ height: 120px;
+ position: relative;
+ display: block;
+ z-index: 10;
+}
+.dropzone .dz-preview .dz-image img {
+ display: block;
+}
+.dropzone .dz-preview.dz-success .dz-success-mark {
+ -webkit-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
+ -moz-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
+ -ms-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
+ -o-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
+ animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);
+}
+.dropzone .dz-preview.dz-error .dz-error-mark {
+ opacity: 1;
+ -webkit-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
+ -moz-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
+ -ms-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
+ -o-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
+ animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);
+}
+.dropzone .dz-preview .dz-success-mark, .dropzone .dz-preview .dz-error-mark {
+ pointer-events: none;
+ opacity: 0;
+ z-index: 500;
+ position: absolute;
+ display: block;
+ top: 50%;
+ left: 50%;
+ margin-left: -27px;
+ margin-top: -27px;
+}
+.dropzone .dz-preview .dz-success-mark svg, .dropzone .dz-preview .dz-error-mark svg {
+ display: block;
+ width: 54px;
+ height: 54px;
+}
+.dropzone .dz-preview.dz-processing .dz-progress {
+ opacity: 1;
+ -webkit-transition: all 0.2s linear;
+ -moz-transition: all 0.2s linear;
+ -ms-transition: all 0.2s linear;
+ -o-transition: all 0.2s linear;
+ transition: all 0.2s linear;
+}
+.dropzone .dz-preview.dz-complete .dz-progress {
+ opacity: 0;
+ -webkit-transition: opacity 0.4s ease-in;
+ -moz-transition: opacity 0.4s ease-in;
+ -ms-transition: opacity 0.4s ease-in;
+ -o-transition: opacity 0.4s ease-in;
+ transition: opacity 0.4s ease-in;
+}
+.dropzone .dz-preview:not(.dz-processing) .dz-progress {
+ -webkit-animation: pulse 6s ease infinite;
+ -moz-animation: pulse 6s ease infinite;
+ -ms-animation: pulse 6s ease infinite;
+ -o-animation: pulse 6s ease infinite;
+ animation: pulse 6s ease infinite;
+}
+.dropzone .dz-preview .dz-progress {
+ opacity: 1;
+ z-index: 1000;
+ pointer-events: none;
+ position: absolute;
+ height: 16px;
+ left: 50%;
+ top: 50%;
+ margin-top: -8px;
+ width: 80px;
+ margin-left: -40px;
+ background: rgba(255, 255, 255, 0.9);
+ -webkit-transform: scale(1);
+ border-radius: 8px;
+ overflow: hidden;
+}
+.dropzone .dz-preview .dz-progress .dz-upload {
+ background: #333;
+ background: linear-gradient(to bottom, #666, #444);
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ width: 0;
+ -webkit-transition: width 300ms ease-in-out;
+ -moz-transition: width 300ms ease-in-out;
+ -ms-transition: width 300ms ease-in-out;
+ -o-transition: width 300ms ease-in-out;
+ transition: width 300ms ease-in-out;
+}
+.dropzone .dz-preview.dz-error .dz-error-message {
+ display: block;
+}
+.dropzone .dz-preview.dz-error:hover .dz-error-message {
+ opacity: 1;
+ pointer-events: auto;
+}
+.dropzone .dz-preview .dz-error-message {
+ pointer-events: none;
+ z-index: 1000;
+ position: absolute;
+ display: block;
+ display: none;
+ opacity: 0;
+ -webkit-transition: opacity 0.3s ease;
+ -moz-transition: opacity 0.3s ease;
+ -ms-transition: opacity 0.3s ease;
+ -o-transition: opacity 0.3s ease;
+ transition: opacity 0.3s ease;
+ border-radius: 8px;
+ font-size: 13px;
+ top: 130px;
+ left: -10px;
+ width: 140px;
+ background: #be2626;
+ background: linear-gradient(to bottom, #be2626, #a92222);
+ padding: 0.5em 1.2em;
+ color: white;
+}
+.dropzone .dz-preview .dz-error-message:after {
+ content: "";
+ position: absolute;
+ top: -6px;
+ left: 64px;
+ width: 0;
+ height: 0;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #be2626;
+}
diff --git a/view/theme/frio/css/dropzone.min.frio.css b/view/theme/frio/css/dropzone.min.frio.css
new file mode 100644
index 0000000000..ff1454c3b9
--- /dev/null
+++ b/view/theme/frio/css/dropzone.min.frio.css
@@ -0,0 +1 @@
+@-webkit-keyframes passing-through{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%,70%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}100%{opacity:0;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px)}}@-moz-keyframes passing-through{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%,70%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}100%{opacity:0;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px)}}@keyframes passing-through{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%,70%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}100%{opacity:0;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px)}}@-webkit-keyframes slide-in{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}}@-moz-keyframes slide-in{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}}@keyframes slide-in{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}20%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}20%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}20%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}.dropzone,.dropzone *{box-sizing:border-box}.dropzone{min-height:150px;border:1px solid rgba(0,0,0,.3);background:#fff;padding:2px 2px}.dropzone.dz-clickable{cursor:pointer}.dropzone.dz-clickable *{cursor:default}.dropzone.dz-clickable .dz-message,.dropzone.dz-clickable .dz-message *{cursor:pointer}.dropzone.dz-started .dz-message{display:none}.dropzone.dz-drag-hover{border-style:solid}.dropzone.dz-drag-hover .dz-message{opacity:.5}.dropzone .dz-message{text-align:center}.dropzone .dz-message .dz-button{background:none;color:inherit;border:none;padding:0;font:inherit;cursor:pointer;outline:inherit}.dropzone .dz-preview{position:relative;display:inline-block;vertical-align:top;margin:16px;min-height:100px}.dropzone .dz-preview:hover{z-index:1000}.dropzone .dz-preview:hover .dz-details{opacity:1}.dropzone .dz-preview.dz-file-preview .dz-image{border-radius:20px;background:#999;background:linear-gradient(to bottom, #eee, #ddd)}.dropzone .dz-preview.dz-file-preview .dz-details{opacity:1}.dropzone .dz-preview.dz-image-preview{background:#fff}.dropzone .dz-preview.dz-image-preview .dz-details{-webkit-transition:opacity 0.2s linear;-moz-transition:opacity 0.2s linear;-ms-transition:opacity 0.2s linear;-o-transition:opacity 0.2s linear;transition:opacity 0.2s linear}.dropzone .dz-preview .dz-remove{font-size:14px;text-align:center;display:block;cursor:pointer;border:none}.dropzone .dz-preview .dz-remove:hover{text-decoration:underline}.dropzone .dz-preview:hover .dz-details{opacity:1}.dropzone .dz-preview .dz-details{z-index:20;position:absolute;top:0;left:0;opacity:0;font-size:13px;min-width:100%;max-width:100%;padding:2em 1em;text-align:center;color:rgba(0,0,0,.9);line-height:150%}.dropzone .dz-preview .dz-details .dz-size{margin-bottom:1em;font-size:16px}.dropzone .dz-preview .dz-details .dz-filename{white-space:nowrap}.dropzone .dz-preview .dz-details .dz-filename:hover span{border:1px solid rgba(200,200,200,.8);background-color:rgba(255,255,255,.8)}.dropzone .dz-preview .dz-details .dz-filename:not(:hover){overflow:hidden;text-overflow:ellipsis}.dropzone .dz-preview .dz-details .dz-filename:not(:hover) span{border:1px solid transparent}.dropzone .dz-preview .dz-details .dz-filename span,.dropzone .dz-preview .dz-details .dz-size span{background-color:rgba(255,255,255,.4);padding:0 .4em;border-radius:3px}.dropzone .dz-preview:hover .dz-image img{-webkit-transform:scale(1.05, 1.05);-moz-transform:scale(1.05, 1.05);-ms-transform:scale(1.05, 1.05);-o-transform:scale(1.05, 1.05);transform:scale(1.05, 1.05);-webkit-filter:blur(8px);filter:blur(8px)}.dropzone .dz-preview .dz-image{border-radius:20px;overflow:hidden;width:120px;height:120px;position:relative;display:block;z-index:10}.dropzone .dz-preview .dz-image img{display:block}.dropzone .dz-preview.dz-success .dz-success-mark{-webkit-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);-moz-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);-ms-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);-o-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1)}.dropzone .dz-preview.dz-error .dz-error-mark{opacity:1;-webkit-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);-moz-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);-ms-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);-o-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1)}.dropzone .dz-preview .dz-success-mark,.dropzone .dz-preview .dz-error-mark{pointer-events:none;opacity:0;z-index:500;position:absolute;display:block;top:50%;left:50%;margin-left:-27px;margin-top:-27px}.dropzone .dz-preview .dz-success-mark svg,.dropzone .dz-preview .dz-error-mark svg{display:block;width:54px;height:54px}.dropzone .dz-preview.dz-processing .dz-progress{opacity:1;-webkit-transition:all 0.2s linear;-moz-transition:all 0.2s linear;-ms-transition:all 0.2s linear;-o-transition:all 0.2s linear;transition:all 0.2s linear}.dropzone .dz-preview.dz-complete .dz-progress{opacity:0;-webkit-transition:opacity 0.4s ease-in;-moz-transition:opacity 0.4s ease-in;-ms-transition:opacity 0.4s ease-in;-o-transition:opacity 0.4s ease-in;transition:opacity 0.4s ease-in}.dropzone .dz-preview:not(.dz-processing) .dz-progress{-webkit-animation:pulse 6s ease infinite;-moz-animation:pulse 6s ease infinite;-ms-animation:pulse 6s ease infinite;-o-animation:pulse 6s ease infinite;animation:pulse 6s ease infinite}.dropzone .dz-preview .dz-progress{opacity:1;z-index:1000;pointer-events:none;position:absolute;height:16px;left:50%;top:50%;margin-top:-8px;width:80px;margin-left:-40px;background:rgba(255,255,255,.9);-webkit-transform:scale(1);border-radius:8px;overflow:hidden}.dropzone .dz-preview .dz-progress .dz-upload{background:#333;background:linear-gradient(to bottom, #666, #444);position:absolute;top:0;left:0;bottom:0;width:0;-webkit-transition:width 300ms ease-in-out;-moz-transition:width 300ms ease-in-out;-ms-transition:width 300ms ease-in-out;-o-transition:width 300ms ease-in-out;transition:width 300ms ease-in-out}.dropzone .dz-preview.dz-error .dz-error-message{display:block}.dropzone .dz-preview.dz-error:hover .dz-error-message{opacity:1;pointer-events:auto}.dropzone .dz-preview .dz-error-message{pointer-events:none;z-index:1000;position:absolute;display:block;display:none;opacity:0;-webkit-transition:opacity 0.3s ease;-moz-transition:opacity 0.3s ease;-ms-transition:opacity 0.3s ease;-o-transition:opacity 0.3s ease;transition:opacity 0.3s ease;border-radius:8px;font-size:13px;top:130px;left:-10px;width:140px;background:#be2626;background:linear-gradient(to bottom, #be2626, #a92222);padding:.5em 1.2em;color:#fff}.dropzone .dz-preview .dz-error-message:after{content:"";position:absolute;top:-6px;left:64px;width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #be2626}
diff --git a/view/theme/frio/js/modal.js b/view/theme/frio/js/modal.js
index c3c4009b05..905e787434 100644
--- a/view/theme/frio/js/modal.js
+++ b/view/theme/frio/js/modal.js
@@ -291,6 +291,10 @@ function editpost(url) {
$("#profile-jot-form #jot-category-wrap").hide();
}
+ // To make dropzone fileupload work on editing a comment, we need to
+ // attach a new dropzone to modal
+ dzFactory.setupDropzone('#jot-text-wrap', 'profile-jot-text');
+
modal.show();
$("#jot-popup").show();
linkPreview = $("#profile-jot-text").linkPreview();
diff --git a/view/theme/frio/templates/comment_item.tpl b/view/theme/frio/templates/comment_item.tpl
index 7bce14ee1b..2d977d807c 100644
--- a/view/theme/frio/templates/comment_item.tpl
+++ b/view/theme/frio/templates/comment_item.tpl
@@ -37,12 +37,14 @@
-
-
-
-
-{{if $qcomment}}
-
+
+
+ {{if $qcomment}}
+
{{/if}}
-
+
diff --git a/view/theme/frio/templates/head.tpl b/view/theme/frio/templates/head.tpl
index 7851dacbd4..8c5e0a999d 100644
--- a/view/theme/frio/templates/head.tpl
+++ b/view/theme/frio/templates/head.tpl
@@ -55,6 +55,8 @@
media="screen" />
+
{{foreach $stylesheets as $stylesheetUrl => $media}}
@@ -137,6 +139,9 @@
{{/if}}
+
+
+
{{* Include the strings which are needed for some js functions (e.g. translation)
They are loaded into the html so that js functions can use them *}}
diff --git a/view/theme/frio/templates/jot.tpl b/view/theme/frio/templates/jot.tpl
index c38e8531c6..5c18afa86f 100644
--- a/view/theme/frio/templates/jot.tpl
+++ b/view/theme/frio/templates/jot.tpl
@@ -99,7 +99,7 @@
{{/if}}
{{* The jot text field in which the post text is inserted *}}
-
+
@@ -152,6 +152,7 @@
+
{{if $content}}{{/if}}
@@ -162,9 +163,9 @@
{{* The jot modal - We use a own modal for the jot and not the standard modal
from the page template. This is because the special structure of the jot
(e.g.jot navigation tabs in the modal titel area).
-The in the frio theme the jot will loaded regulary and is hidden by default.)
+Then in the frio theme the jot will loaded regulary and is hidden by default.)
The js function jotShow() loads the jot into the modal. With this structure we
-can load different content into the jot moadl (e.g. the item edit jot)
+can load different content into the jot modal (e.g. the item edit jot)
*}}
@@ -172,9 +173,12 @@ can load different content into the jot moadl (e.g. the item edit jot)
-
+
+