From c24ca57f215efa4c0d41eb92ac25f86ae0caed7f Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 14 Jul 2019 21:49:38 -0400 Subject: [PATCH] Add frio-specific /compose module --- src/App/Router.php | 1 + src/Module/Item/Compose.php | 176 +++++++++++++++++++ view/templates/item/compose-footer.tpl | 227 +++++++++++++++++++++++++ view/templates/item/compose.tpl | 129 ++++++++++++++ view/theme/frio/css/style.css | 6 +- 5 files changed, 537 insertions(+), 2 deletions(-) create mode 100644 src/Module/Item/Compose.php create mode 100644 view/templates/item/compose-footer.tpl create mode 100644 view/templates/item/compose.tpl diff --git a/src/App/Router.php b/src/App/Router.php index a54f3a711..50b208792 100644 --- a/src/App/Router.php +++ b/src/App/Router.php @@ -94,6 +94,7 @@ class Router $this->routeCollector->addRoute(['GET'], '/attach/{item:\d+}', Module\Attach::class); $this->routeCollector->addRoute(['GET'], '/babel', Module\Debug\Babel::class); $this->routeCollector->addRoute(['GET'], '/bookmarklet', Module\Bookmarklet::class); + $this->routeCollector->addRoute(['GET', 'POST'], '/compose[/{type}]', Module\Item\Compose::class); $this->routeCollector->addGroup('/contact', function (RouteCollector $collector) { $collector->addRoute(['GET'], '[/]', Module\Contact::class); $collector->addRoute(['GET', 'POST'], '/{id:\d+}[/]', Module\Contact::class); diff --git a/src/Module/Item/Compose.php b/src/Module/Item/Compose.php new file mode 100644 index 000000000..750a29c49 --- /dev/null +++ b/src/Module/Item/Compose.php @@ -0,0 +1,176 @@ +getCurrentTheme() !== 'frio') { + throw new NotImplementedException(L10n::t('This feature is only available with the frio theme.')); + } + + /// @TODO Retrieve parameter from router + $posttype = $a->argv[1] ?? Item::PT_ARTICLE; + if (!in_array($posttype, [Item::PT_ARTICLE, Item::PT_PERSONAL_NOTE])) { + switch ($posttype) { + case 'note': $posttype = Item::PT_PERSONAL_NOTE; break; + default: $posttype = Item::PT_ARTICLE; break; + } + } + + $user = User::getById(local_user(), ['allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'default-location']); + + switch ($posttype) { + case Item::PT_PERSONAL_NOTE: + $compose_title = L10n::t('Compose new personal note'); + $type = 'note'; + $contact_allow = $a->contact['id']; + $group_allow = ''; + break; + default: + $compose_title = L10n::t('Compose new post'); + $type = 'post'; + $contact_allow = implode(',', expand_acl($user['allow_cid'])); + $group_allow = implode(',', expand_acl($user['allow_gid'])) ?: Group::FOLLOWERS; + break; + } + + $title = $_REQUEST['title'] ?? ''; + $category = $_REQUEST['category'] ?? ''; + $body = $_REQUEST['body'] ?? ''; + $location = $_REQUEST['location'] ?? $user['default-location']; + $wall = $_REQUEST['wall'] ?? $type == 'post'; + $contact_allow = $_REQUEST['contact_allow'] ?? $contact_allow; + $group_allow = $_REQUEST['group_allow'] ?? $group_allow; + $contact_deny = $_REQUEST['contact_deny'] ?? implode(',', expand_acl($user['deny_cid'])); + $group_deny = $_REQUEST['group_deny'] ?? implode(',', expand_acl($user['deny_gid'])); + $visibility = ($contact_allow . $user['allow_gid'] . $user['deny_cid'] . $user['deny_gid']) ? 'custom' : 'public'; + + $acl_contacts = Contact::select(['id', 'name', 'addr', 'micro'], ['uid' => local_user(), 'pending' => false, 'rel' => [Contact::FOLLOWER, Contact::FRIEND]]); + array_walk($acl_contacts, function (&$value) { + $value['type'] = 'contact'; + }); + + $acl_groups = [ + [ + 'id' => Group::FOLLOWERS, + 'name' => L10n::t('Followers'), + 'addr' => '', + 'micro' => 'images/twopeople.png', + 'type' => 'group', + ], + [ + 'id' => Group::MUTUALS, + 'name' => L10n::t('Mutuals'), + 'addr' => '', + 'micro' => 'images/twopeople.png', + 'type' => 'group', + ] + ]; + foreach (Group::getByUserId(local_user()) as $group) { + $acl_groups[] = [ + 'id' => $group['id'], + 'name' => $group['name'], + 'addr' => '', + 'micro' => 'images/twopeople.png', + 'type' => 'group', + ]; + } + + $acl = array_merge($acl_groups, $acl_contacts); + + $jotplugins = ''; + Hook::callAll('jot_tool', $jotplugins); + + // Output + + $a->registerFooterScript('view/js/ajaxupload.js'); + $a->registerFooterScript('view/js/linkPreview.js'); + $a->registerFooterScript('view/asset/typeahead.js/dist/typeahead.bundle.js'); + $a->registerFooterScript('view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput.js'); + $a->registerStylesheet('view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput.css'); + $a->registerStylesheet('view/theme/frio/frameworks/friendica-tagsinput/friendica-tagsinput-typeahead.css'); + + $tpl = Renderer::getMarkupTemplate('item/compose-footer.tpl'); + $a->page['footer'] .= Renderer::replaceMacros($tpl, [ + '$acl_contacts' => $acl_contacts, + '$acl_groups' => $acl_groups, + '$acl' => $acl, + ]); + + $tpl = Renderer::getMarkupTemplate('item/compose.tpl'); + return Renderer::replaceMacros($tpl, [ + '$compose_title'=> $compose_title, + '$id' => 0, + '$posttype' => $posttype, + '$type' => $type, + '$wall' => $wall, + '$default' => L10n::t(''), + '$mylink' => $a->removeBaseURL($a->contact['url']), + '$mytitle' => L10n::t('This is you'), + '$myphoto' => $a->removeBaseURL($a->contact['thumb']), + '$submit' => L10n::t('Submit'), + '$edbold' => L10n::t('Bold'), + '$editalic' => L10n::t('Italic'), + '$eduline' => L10n::t('Underline'), + '$edquote' => L10n::t('Quote'), + '$edcode' => L10n::t('Code'), + '$edimg' => L10n::t('Image'), + '$edurl' => L10n::t('Link'), + '$edattach' => L10n::t('Link or Media'), + '$prompttext' => L10n::t('Please enter a image/video/audio/webpage URL:'), + '$preview' => L10n::t('Preview'), + '$location_set' => L10n::t('Set your location'), + '$location_clear' => L10n::t('Clear the location'), + '$location_unavailable' => L10n::t('Location services are unavailable on your device'), + '$location_disabled' => L10n::t('Location services are disabled. Please check the website\'s permissions on your device'), + '$wait' => L10n::t('Please wait'), + '$placeholdertitle' => L10n::t('Set title'), + '$placeholdercategory' => (Feature::isEnabled(local_user(),'categories') ? L10n::t('Categories (comma-separated list)') : ''), + '$title' => $title, + '$category' => $category, + '$body' => $body, + '$location' => $location, + '$visibility' => $visibility, + '$contact_allow'=> $contact_allow, + '$group_allow' => $group_allow, + '$contact_deny' => $contact_deny, + '$group_deny' => $group_deny, + '$jotplugins' => $jotplugins, + '$sourceapp' => L10n::t($a->sourcename), + '$rand_num' => Crypto::randomDigits(12) + ]); + } +} diff --git a/view/templates/item/compose-footer.tpl b/view/templates/item/compose-footer.tpl new file mode 100644 index 000000000..8a854238a --- /dev/null +++ b/view/templates/item/compose-footer.tpl @@ -0,0 +1,227 @@ + diff --git a/view/templates/item/compose.tpl b/view/templates/item/compose.tpl new file mode 100644 index 000000000..959464562 --- /dev/null +++ b/view/templates/item/compose.tpl @@ -0,0 +1,129 @@ +
+

{{$compose_title}}

+
+
+ {{**}} + + + + + +
+ +
+ {{if $placeholdercategory}} +
+ +
+ {{/if}} + +

+ + + + + + + + + + + +

+

+ +

+ +

+{{if $type == 'post'}} + + + + +{{/if}} + + + + + {{if $preview}} + + {{/if}} + +

+ + + + + + + +{{if $type == 'post'}} +

Visibility

+
+
+ +
+
+

This post will be sent to all your followers and can be seen in the community pages and by anyone with its link.

+
+
+
+
+ +
+
+

This post will be sent only to the people in the first box, to the exception of the people mentioned in the second box. + It won't be visible in the community pages nor with its link.

+ +
+ + +
+ +
+ + +
+
+
+
+
+
+ {{$jotplugins nofilter}} +
+{{/if}} +
+
+
\ No newline at end of file diff --git a/view/theme/frio/css/style.css b/view/theme/frio/css/style.css index 19c4035f8..30268701a 100644 --- a/view/theme/frio/css/style.css +++ b/view/theme/frio/css/style.css @@ -1371,7 +1371,8 @@ section #jotOpen { #jot-text-wrap .preview textarea { width: 100%; } -#preview_profile-jot-text { +#preview_profile-jot-text, +.comment-edit-form .preview { position: relative; padding: 0px 10px; margin-top: -2px; @@ -1382,7 +1383,8 @@ section #jotOpen { background: #fff; color: #555; } -textarea#profile-jot-text:focus + #preview_profile-jot-text { +textarea#profile-jot-text:focus + #preview_profile-jot-text, +textarea.comment-edit-text:focus + .comment-edit-form .preview { border: 2px solid #6fdbe8; border-top: none; }