Merge pull request #10563 from annando/scheduled-frontend

Issue 8038: Scheduled posts via the frontend
This commit is contained in:
Hypolite Petovan 2021-08-02 10:40:35 -04:00 committed by GitHub
commit 53ce1a8755
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 362 additions and 266 deletions

View file

@ -17,7 +17,7 @@ General
* p - Profile
* n - Network
* c - Community
* s - Search
* s - Search
* a - Admin
* f - Notifications
* u - User menu
@ -35,6 +35,7 @@ General
* v - Videos
* e - Events and Calendar
* t - Personal Notes
* o - Scheduled Posts
* k - View Contacts
../contacts (contact list)
@ -66,7 +67,6 @@ General
* t - Sort by Post Date
* r - Conversation (Posts that mention or involve you)
* w - New posts
* b - Bookmarks
* m - Favourite Posts
../notifications

View file

@ -612,95 +612,87 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o
}
/**
* Fetch all comments from a query. Additionally set the newest resharer as thread owner.
* Adds some information (Causer, post reason, direction) to the fetched post row.
*
* @param mixed $thread_items Database statement with thread posts
* @param boolean $pinned Is the item pinned?
* @param array $activity Contact data of the resharer
* @param array $row Post row
* @param array $activity Contact data of the resharer
*
* @return array items with parents and comments
*/
function conversation_fetch_comments($thread_items, bool $pinned, array $activity) {
function conversation_add_row_information(array $row, array $activity) {
DI::profiler()->startRecording('rendering');
$comments = [];
while ($row = Post::fetch($thread_items)) {
if (!empty($activity)) {
if (($row['gravity'] == GRAVITY_PARENT)) {
$row['post-reason'] = Item::PR_ANNOUNCEMENT;
$row = array_merge($row, $activity);
$contact = Contact::getById($activity['causer-id'], ['url', 'name', 'thumb']);
$row['causer-link'] = $contact['url'];
$row['causer-avatar'] = $contact['thumb'];
$row['causer-name'] = $contact['name'];
} elseif (($row['gravity'] == GRAVITY_ACTIVITY) && ($row['verb'] == Activity::ANNOUNCE) &&
($row['author-id'] == $activity['causer-id'])) {
continue;
}
}
switch ($row['post-reason']) {
case Item::PR_TO:
$row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'to')];
break;
case Item::PR_CC:
$row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'cc')];
break;
case Item::PR_BTO:
$row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'bto')];
break;
case Item::PR_BCC:
$row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'bcc')];
break;
case Item::PR_FOLLOWER:
$row['direction'] = ['direction' => 6, 'title' => DI::l10n()->t('You are following %s.', $row['author-name'])];
break;
case Item::PR_TAG:
$row['direction'] = ['direction' => 4, 'title' => DI::l10n()->t('Tagged')];
break;
case Item::PR_ANNOUNCEMENT:
if (!empty($row['causer-id']) && DI::pConfig()->get(local_user(), 'system', 'display_resharer')) {
$row['owner-id'] = $row['causer-id'];
$row['owner-link'] = $row['causer-link'];
$row['owner-avatar'] = $row['causer-avatar'];
$row['owner-name'] = $row['causer-name'];
}
if (($row['gravity'] == GRAVITY_PARENT) && !empty($row['causer-id'])) {
$causer = ['uid' => 0, 'id' => $row['causer-id'],
'network' => $row['causer-network'], 'url' => $row['causer-link']];
$row['reshared'] = DI::l10n()->t('%s reshared this.', '<a href="'. htmlentities(Contact::magicLinkByContact($causer)) .'">' . htmlentities($row['causer-name']) . '</a>');
}
$row['direction'] = ['direction' => 3, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Reshared') : DI::l10n()->t('Reshared by %s <%s>', $row['causer-name'], $row['causer-link']))];
break;
case Item::PR_COMMENT:
$row['direction'] = ['direction' => 5, 'title' => DI::l10n()->t('%s is participating in this thread.', $row['author-name'])];
break;
case Item::PR_STORED:
$row['direction'] = ['direction' => 8, 'title' => DI::l10n()->t('Stored')];
break;
case Item::PR_GLOBAL:
$row['direction'] = ['direction' => 9, 'title' => DI::l10n()->t('Global')];
break;
case Item::PR_RELAY:
$row['direction'] = ['direction' => 10, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Relayed') : DI::l10n()->t('Relayed by %s <%s>', $row['causer-name'], $row['causer-link']))];
break;
case Item::PR_FETCHED:
$row['direction'] = ['direction' => 2, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Fetched') : DI::l10n()->t('Fetched because of %s <%s>', $row['causer-name'], $row['causer-link']))];
break;
}
if ($row['gravity'] == GRAVITY_PARENT) {
$row['pinned'] = $pinned;
}
$comments[] = $row;
if ($row['uid'] == 0) {
$row['writable'] = in_array($row['network'], Protocol::FEDERATED);
}
DBA::close($thread_items);
if (!empty($activity)) {
if (($row['gravity'] == GRAVITY_PARENT)) {
$row['post-reason'] = Item::PR_ANNOUNCEMENT;
$row = array_merge($row, $activity);
$contact = Contact::getById($activity['causer-id'], ['url', 'name', 'thumb']);
$row['causer-link'] = $contact['url'];
$row['causer-avatar'] = $contact['thumb'];
$row['causer-name'] = $contact['name'];
} elseif (($row['gravity'] == GRAVITY_ACTIVITY) && ($row['verb'] == Activity::ANNOUNCE) &&
($row['author-id'] == $activity['causer-id'])) {
return $row;
}
}
switch ($row['post-reason']) {
case Item::PR_TO:
$row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'to')];
break;
case Item::PR_CC:
$row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'cc')];
break;
case Item::PR_BTO:
$row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'bto')];
break;
case Item::PR_BCC:
$row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'bcc')];
break;
case Item::PR_FOLLOWER:
$row['direction'] = ['direction' => 6, 'title' => DI::l10n()->t('You are following %s.', $row['author-name'])];
break;
case Item::PR_TAG:
$row['direction'] = ['direction' => 4, 'title' => DI::l10n()->t('Tagged')];
break;
case Item::PR_ANNOUNCEMENT:
if (!empty($row['causer-id']) && DI::pConfig()->get(local_user(), 'system', 'display_resharer')) {
$row['owner-id'] = $row['causer-id'];
$row['owner-link'] = $row['causer-link'];
$row['owner-avatar'] = $row['causer-avatar'];
$row['owner-name'] = $row['causer-name'];
}
if (($row['gravity'] == GRAVITY_PARENT) && !empty($row['causer-id'])) {
$causer = ['uid' => 0, 'id' => $row['causer-id'],
'network' => $row['causer-network'], 'url' => $row['causer-link']];
$row['reshared'] = DI::l10n()->t('%s reshared this.', '<a href="'. htmlentities(Contact::magicLinkByContact($causer)) .'">' . htmlentities($row['causer-name']) . '</a>');
}
$row['direction'] = ['direction' => 3, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Reshared') : DI::l10n()->t('Reshared by %s <%s>', $row['causer-name'], $row['causer-link']))];
break;
case Item::PR_COMMENT:
$row['direction'] = ['direction' => 5, 'title' => DI::l10n()->t('%s is participating in this thread.', $row['author-name'])];
break;
case Item::PR_STORED:
$row['direction'] = ['direction' => 8, 'title' => DI::l10n()->t('Stored')];
break;
case Item::PR_GLOBAL:
$row['direction'] = ['direction' => 9, 'title' => DI::l10n()->t('Global')];
break;
case Item::PR_RELAY:
$row['direction'] = ['direction' => 10, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Relayed') : DI::l10n()->t('Relayed by %s <%s>', $row['causer-name'], $row['causer-link']))];
break;
case Item::PR_FETCHED:
$row['direction'] = ['direction' => 2, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Fetched') : DI::l10n()->t('Fetched because of %s <%s>', $row['causer-name'], $row['causer-link']))];
break;
}
DI::profiler()->stopRecording();
return $comments;
return $row;
}
/**
@ -725,70 +717,61 @@ function conversation_add_children(array $parents, $block_authors, $order, $uid)
$max_comments = DI::config()->get('system', 'max_display_comments', 1000);
}
$params = ['order' => ['gravity', 'uid', 'commented' => true]];
$params = ['order' => ['uri-id' => true]];
if ($max_comments > 0) {
$params['limit'] = $max_comments;
}
$items = [];
$activities = [];
$uriids = [];
$commentcounter = [];
$activitycounter = [];
foreach ($parents AS $parent) {
if (!empty($parent['thr-parent-id']) && !empty($parent['gravity']) && ($parent['gravity'] == GRAVITY_ACTIVITY)) {
$condition = ["`parent-uri-id` = ? AND `uid` IN (0, ?) AND (`vid` != ? OR `vid` IS NULL)",
$parent['thr-parent-id'], $uid, Verb::getID(Activity::FOLLOW)];
$uriid = $parent['thr-parent-id'];
if (!empty($parent['author-id'])) {
$activity = ['causer-id' => $parent['author-id']];
$activities[$uriid] = ['causer-id' => $parent['author-id']];
foreach (['commented', 'received', 'created'] as $orderfields) {
if (!empty($parent[$orderfields])) {
$activity[$orderfields] = $parent[$orderfields];
$activities[$uriid][$orderfields] = $parent[$orderfields];
}
}
}
} else {
$condition = ["`parent-uri-id` = ? AND `uid` IN (0, ?) AND (`vid` != ? OR `vid` IS NULL)",
$parent['uri-id'], $uid, Verb::getID(Activity::FOLLOW)];
$activity = [];
$uriid = $parent['uri-id'];
}
$items = conversation_fetch_items($parent, $items, $condition, $block_authors, $params, $activity);
$uriids[] = $uriid;
$commentcounter[$uriid] = 0;
$activitycounter[$uriid] = 0;
}
foreach ($items as $index => $item) {
if ($item['uid'] == 0) {
$items[$index]['writable'] = in_array($item['network'], Protocol::FEDERATED);
}
}
$items = conv_sort($items, $order);
DI::profiler()->stopRecording();
return $items;
}
/**
* Fetch conversation items
*
* @param array $parent Parent Item array
* @param array $items Item array
* @param array $condition SQL condition
* @param boolean $block_authors Don't show posts from contacts that are hidden (used on the community page)
* @param array $params SQL parameters
* @param array $activity Contact data of the resharer
* @return array
*/
function conversation_fetch_items(array $parent, array $items, array $condition, bool $block_authors, array $params, array $activity) {
DI::profiler()->startRecording('rendering');
$condition = ['parent-uri-id' => $uriids];
if ($block_authors) {
$condition[0] .= " AND NOT `author-hidden`";
$condition['author-hidden'] = false;
}
$condition = DBA::mergeConditions($condition,
["`uid` IN (0, ?) AND (`vid` != ? OR `vid` IS NULL)", $uid, Verb::getID(Activity::FOLLOW)]);
$thread_items = Post::selectForUser(local_user(), array_merge(Item::DISPLAY_FIELDLIST, ['pinned', 'contact-uid', 'gravity', 'post-type', 'post-reason']), $condition, $params);
$comments = conversation_fetch_comments($thread_items, $parent['pinned'] ?? false, $activity);
$items = [];
if (count($comments) != 0) {
$items = array_merge($items, $comments);
while ($row = Post::fetch($thread_items)) {
if ($max_comments > 0) {
if (($row['gravity'] == GRAVITY_COMMENT) && (++$commentcounter[$row['parent-uri-id']] > $max_comments)) {
continue;
}
if (($row['gravity'] == GRAVITY_ACTIVITY) && (++$activitycounter[$row['parent-uri-id']] > $max_comments)) {
continue;
}
}
$items[] = conversation_add_row_information($row, $activities[$row['uri-id']] ?? []);
}
DBA::close($thread_items);
$items = conv_sort($items, $order);
DI::profiler()->stopRecording();
return $items;
}
@ -1131,6 +1114,13 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false)
'$placeholdertitle' => DI::l10n()->t('Set title'),
'$category' => $x['category'] ?? '',
'$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? DI::l10n()->t("Categories \x28comma-separated list\x29") : '',
'$scheduled_at' => Temporal::getDateTimeField(
new DateTime(),
DateTime::createFromFormat(DateTimeFormat::MYSQL, DateTimeFormat::local('now + 6 months')),
null,
DI::l10n()->t('Scheduled at'),
'scheduled_at',
),
'$wait' => DI::l10n()->t('Please wait'),
'$permset' => DI::l10n()->t('Permission settings'),
'$shortpermset' => DI::l10n()->t('Permissions'),

View file

@ -436,7 +436,7 @@ function item_post(App $a) {
$original_contact_id = $contact_id;
if (!$toplevel_item_id && !empty($forum_contact) && ($private_forum || $only_to_forum)) {
// we tagged a forum in a top level post. Now we change the post
// we tagged a forum in a top level post. Now we change the post
$private = $private_forum ? Item::PRIVATE : Item::UNLISTED;
if ($only_to_forum) {
@ -629,7 +629,6 @@ function item_post(App $a) {
$datarray['origin'] = $origin;
$datarray['object'] = $object;
$datarray['uri-id'] = ItemURI::getIdByURI($datarray['uri']);
$datarray['attachments'] = $_REQUEST['attachments'] ?? [];
/*
@ -682,8 +681,25 @@ function item_post(App $a) {
$o = conversation($a, [array_merge($contact_record, $datarray)], 'search', false, true);
System::jsonExit(['preview' => $o]);
} elseif (!empty($_REQUEST['scheduled_at'])) {
$scheduled_at = DateTimeFormat::convert($_REQUEST['scheduled_at'], 'UTC', $a->getTimezone());
if ($scheduled_at > DateTimeFormat::utcNow()) {
unset($datarray['created']);
unset($datarray['edited']);
unset($datarray['commented']);
unset($datarray['received']);
unset($datarray['changed']);
unset($datarray['edit']);
unset($datarray['self']);
unset($datarray['api_source']);
Post\Delayed::add($datarray['uri'], $datarray, PRIORITY_HIGH, false, $scheduled_at);
item_post_return(DI::baseUrl(), $api_source, $return_path);
}
}
$datarray['uri-id'] = ItemURI::getIdByURI($datarray['uri']);
Hook::callAll('post_local',$datarray);
if (!empty($datarray['cancel'])) {

View file

@ -1143,6 +1143,9 @@ class Item
if (!$dontcache) {
if ($notify) {
if (!\Friendica\Content\Feature::isEnabled($posted_item['uid'], 'explicit_mentions') && ($posted_item['gravity'] == GRAVITY_COMMENT)) {
Tag::createImplicitMentions($posted_item['uri-id'], $posted_item['thr-parent-id']);
}
Hook::callAll('post_local_end', $posted_item);
} else {
Hook::callAll('post_remote_end', $posted_item);

View file

@ -70,14 +70,15 @@ class BaseProfile extends BaseModule
'id' => 'photo-tab',
'accesskey' => 'h',
],
[
'label' => DI::l10n()->t('Videos'),
'url' => DI::baseUrl() . '/videos/' . $nickname,
'sel' => $current == 'videos' ? 'active' : '',
'title' => DI::l10n()->t('Videos'),
'id' => 'video-tab',
'accesskey' => 'v',
],
// @todo Currently deactivated since it doesn't really work
// [
// 'label' => DI::l10n()->t('Videos'),
// 'url' => DI::baseUrl() . '/videos/' . $nickname,
// 'sel' => $current == 'videos' ? 'active' : '',
// 'title' => DI::l10n()->t('Videos'),
// 'id' => 'video-tab',
// 'accesskey' => 'v',
// ],
];
// the calendar link for the full featured events calendar
@ -112,6 +113,14 @@ class BaseProfile extends BaseModule
'id' => 'notes-tab',
'accesskey' => 't',
];
$tabs[] = [
'label' => DI::l10n()->t('Scheduled Posts'),
'url' => $baseProfileUrl . '/schedule',
'sel' => $current == 'schedule' ? 'active' : '',
'title' => DI::l10n()->t('Posts that are scheduled for publishing'),
'id' => 'schedule-tab',
'accesskey' => 'o',
];
}
if (empty($profile['hide-friends'])) {

View file

@ -21,6 +21,7 @@
namespace Friendica\Module\Item;
use DateTime;
use Friendica\BaseModule;
use Friendica\Content\Feature;
use Friendica\Core\ACL;
@ -34,6 +35,8 @@ use Friendica\Model\User;
use Friendica\Module\Security\Login;
use Friendica\Network\HTTPException\NotImplementedException;
use Friendica\Util\Crypto;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Temporal;
class Compose extends BaseModule
{
@ -162,6 +165,14 @@ class Compose extends BaseModule
'$wait' => DI::l10n()->t('Please wait'),
'$placeholdertitle' => DI::l10n()->t('Set title'),
'$placeholdercategory' => (Feature::isEnabled(local_user(),'categories') ? DI::l10n()->t('Categories (comma-separated list)') : ''),
'$scheduled_at' => Temporal::getDateTimeField(
new DateTime(),
DateTime::createFromFormat(DateTimeFormat::MYSQL, DateTimeFormat::local('now + 6 months')),
null,
DI::l10n()->t('Scheduled at'),
'scheduled_at',
),
'$title' => $title,
'$category' => $category,

View file

@ -0,0 +1,43 @@
<?php
/**
* @copyright Copyright (C) 2010-2021, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Module\Profile;
use Friendica\DI;
use Friendica\Module\BaseProfile;
use Friendica\Network\HTTPException;
class Schedule extends BaseProfile
{
public static function content(array $parameters = [])
{
if (!local_user()) {
throw new HTTPException\ForbiddenException(DI::l10n()->t('Permission denied.'));
}
$a = DI::app();
$o = self::getTabsHTML($a, 'schedule', true, $a->user);
$o .= DI::l10n()->t('Currently here is no functionality here. Please use an app to have a look at your scheduled posts.');
return $o;
}
}

View file

@ -225,7 +225,7 @@ class Temporal
public static function getDateTimeField(
DateTime $minDate,
DateTime $maxDate,
DateTime $defaultDate,
DateTime $defaultDate = null,
$label,
$id = 'datetimepicker',
$pickdate = true,

View file

@ -33,6 +33,7 @@ use Friendica\Module;
$profileRoutes = [
'' => [Module\Profile\Index::class, [R::GET]],
'/profile' => [Module\Profile\Profile::class, [R::GET]],
'/schedule' => [Module\Profile\Schedule::class, [R::GET]],
'/contacts/common' => [Module\Profile\Common::class, [R::GET]],
'/contacts[/{type}]' => [Module\Profile\Contacts::class, [R::GET]],
'/status[/{category}[/{date1}[/{date2}]]]' => [Module\Profile\Status::class, [R::GET]],

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2021.09-dev\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-08-01 10:43+0200\n"
"POT-Creation-Date: 2021-08-02 12:15+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -54,7 +54,7 @@ msgstr ""
msgid "%1$s poked %2$s"
msgstr ""
#: include/conversation.php:140 src/Model/Item.php:2610
#: include/conversation.php:140 src/Model/Item.php:2613
msgid "event"
msgstr ""
@ -62,7 +62,7 @@ msgstr ""
msgid "status"
msgstr ""
#: include/conversation.php:148 mod/tagger.php:90 src/Model/Item.php:2612
#: include/conversation.php:148 mod/tagger.php:90 src/Model/Item.php:2615
msgid "photo"
msgstr ""
@ -104,9 +104,9 @@ msgstr ""
msgid "View in context"
msgstr ""
#: include/conversation.php:539 include/conversation.php:1134
#: include/conversation.php:539 include/conversation.php:1124
#: mod/editpost.php:104 mod/message.php:203 mod/message.php:368
#: mod/photos.php:1523 mod/wallmessage.php:155 src/Module/Item/Compose.php:162
#: mod/photos.php:1523 mod/wallmessage.php:155 src/Module/Item/Compose.php:165
#: src/Object/Post.php:501
msgid "Please wait"
msgstr ""
@ -119,108 +119,108 @@ msgstr ""
msgid "Delete Selected Items"
msgstr ""
#: include/conversation.php:644 include/conversation.php:647
#: include/conversation.php:650 include/conversation.php:653
#: include/conversation.php:645 include/conversation.php:648
#: include/conversation.php:651 include/conversation.php:654
#, php-format
msgid "You had been addressed (%s)."
msgstr ""
#: include/conversation.php:656
#: include/conversation.php:657
#, php-format
msgid "You are following %s."
msgstr ""
#: include/conversation.php:659
#: include/conversation.php:660
msgid "Tagged"
msgstr ""
#: include/conversation.php:672 include/conversation.php:1024
#: include/conversation.php:1062
#: include/conversation.php:673 include/conversation.php:1007
#: include/conversation.php:1045
#, php-format
msgid "%s reshared this."
msgstr ""
#: include/conversation.php:674
#: include/conversation.php:675
msgid "Reshared"
msgstr ""
#: include/conversation.php:674
#: include/conversation.php:675
#, php-format
msgid "Reshared by %s <%s>"
msgstr ""
#: include/conversation.php:677
#: include/conversation.php:678
#, php-format
msgid "%s is participating in this thread."
msgstr ""
#: include/conversation.php:680
#: include/conversation.php:681
msgid "Stored"
msgstr ""
#: include/conversation.php:683
#: include/conversation.php:684
msgid "Global"
msgstr ""
#: include/conversation.php:686
#: include/conversation.php:687
msgid "Relayed"
msgstr ""
#: include/conversation.php:686
#: include/conversation.php:687
#, php-format
msgid "Relayed by %s <%s>"
msgstr ""
#: include/conversation.php:689
#: include/conversation.php:690
msgid "Fetched"
msgstr ""
#: include/conversation.php:689
#: include/conversation.php:690
#, php-format
msgid "Fetched because of %s <%s>"
msgstr ""
#: include/conversation.php:855 view/theme/frio/theme.php:323
#: include/conversation.php:838 view/theme/frio/theme.php:323
msgid "Follow Thread"
msgstr ""
#: include/conversation.php:856 src/Model/Contact.php:1047
#: include/conversation.php:839 src/Model/Contact.php:1047
msgid "View Status"
msgstr ""
#: include/conversation.php:857 include/conversation.php:879
#: include/conversation.php:840 include/conversation.php:862
#: src/Model/Contact.php:973 src/Model/Contact.php:1039
#: src/Model/Contact.php:1048 src/Module/Directory.php:160
#: src/Module/Settings/Profile/Index.php:224
msgid "View Profile"
msgstr ""
#: include/conversation.php:858 src/Model/Contact.php:1049
#: include/conversation.php:841 src/Model/Contact.php:1049
msgid "View Photos"
msgstr ""
#: include/conversation.php:859 src/Model/Contact.php:1040
#: include/conversation.php:842 src/Model/Contact.php:1040
#: src/Model/Contact.php:1050
msgid "Network Posts"
msgstr ""
#: include/conversation.php:860 src/Model/Contact.php:1041
#: include/conversation.php:843 src/Model/Contact.php:1041
#: src/Model/Contact.php:1051
msgid "View Contact"
msgstr ""
#: include/conversation.php:861 src/Model/Contact.php:1053
#: include/conversation.php:844 src/Model/Contact.php:1053
msgid "Send PM"
msgstr ""
#: include/conversation.php:862 src/Module/Admin/Blocklist/Contact.php:84
#: include/conversation.php:845 src/Module/Admin/Blocklist/Contact.php:84
#: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154
#: src/Module/Contact.php:588 src/Module/Contact.php:846
#: src/Module/Contact.php:1126
msgid "Block"
msgstr ""
#: include/conversation.php:863 src/Module/Contact.php:589
#: include/conversation.php:846 src/Module/Contact.php:589
#: src/Module/Contact.php:847 src/Module/Contact.php:1134
#: src/Module/Notifications/Introductions.php:113
#: src/Module/Notifications/Introductions.php:185
@ -228,272 +228,276 @@ msgstr ""
msgid "Ignore"
msgstr ""
#: include/conversation.php:867 src/Object/Post.php:428
#: include/conversation.php:850 src/Object/Post.php:428
msgid "Languages"
msgstr ""
#: include/conversation.php:871 src/Model/Contact.php:1054
#: include/conversation.php:854 src/Model/Contact.php:1054
msgid "Poke"
msgstr ""
#: include/conversation.php:876 mod/follow.php:139 src/Content/Widget.php:76
#: include/conversation.php:859 mod/follow.php:139 src/Content/Widget.php:76
#: src/Model/Contact.php:1042 src/Model/Contact.php:1055
#: view/theme/vier/theme.php:172
msgid "Connect/Follow"
msgstr ""
#: include/conversation.php:1009
#: include/conversation.php:992
#, php-format
msgid "%s likes this."
msgstr ""
#: include/conversation.php:1012
#: include/conversation.php:995
#, php-format
msgid "%s doesn't like this."
msgstr ""
#: include/conversation.php:1015
#: include/conversation.php:998
#, php-format
msgid "%s attends."
msgstr ""
#: include/conversation.php:1018
#: include/conversation.php:1001
#, php-format
msgid "%s doesn't attend."
msgstr ""
#: include/conversation.php:1021
#: include/conversation.php:1004
#, php-format
msgid "%s attends maybe."
msgstr ""
#: include/conversation.php:1030
#: include/conversation.php:1013
msgid "and"
msgstr ""
#: include/conversation.php:1033
#: include/conversation.php:1016
#, php-format
msgid "and %d other people"
msgstr ""
#: include/conversation.php:1041
#: include/conversation.php:1024
#, php-format
msgid "<span %1$s>%2$d people</span> like this"
msgstr ""
#: include/conversation.php:1042
#: include/conversation.php:1025
#, php-format
msgid "%s like this."
msgstr ""
#: include/conversation.php:1045
#: include/conversation.php:1028
#, php-format
msgid "<span %1$s>%2$d people</span> don't like this"
msgstr ""
#: include/conversation.php:1046
#: include/conversation.php:1029
#, php-format
msgid "%s don't like this."
msgstr ""
#: include/conversation.php:1049
#: include/conversation.php:1032
#, php-format
msgid "<span %1$s>%2$d people</span> attend"
msgstr ""
#: include/conversation.php:1050
#: include/conversation.php:1033
#, php-format
msgid "%s attend."
msgstr ""
#: include/conversation.php:1053
#: include/conversation.php:1036
#, php-format
msgid "<span %1$s>%2$d people</span> don't attend"
msgstr ""
#: include/conversation.php:1054
#: include/conversation.php:1037
#, php-format
msgid "%s don't attend."
msgstr ""
#: include/conversation.php:1057
#: include/conversation.php:1040
#, php-format
msgid "<span %1$s>%2$d people</span> attend maybe"
msgstr ""
#: include/conversation.php:1058
#: include/conversation.php:1041
#, php-format
msgid "%s attend maybe."
msgstr ""
#: include/conversation.php:1061
#: include/conversation.php:1044
#, php-format
msgid "<span %1$s>%2$d people</span> reshared this"
msgstr ""
#: include/conversation.php:1093
#: include/conversation.php:1076
msgid "Visible to <strong>everybody</strong>"
msgstr ""
#: include/conversation.php:1094 src/Module/Item/Compose.php:156
#: include/conversation.php:1077 src/Module/Item/Compose.php:159
#: src/Object/Post.php:972
msgid "Please enter a image/video/audio/webpage URL:"
msgstr ""
#: include/conversation.php:1095
#: include/conversation.php:1078
msgid "Tag term:"
msgstr ""
#: include/conversation.php:1096 src/Module/Filer/SaveTag.php:68
#: include/conversation.php:1079 src/Module/Filer/SaveTag.php:68
msgid "Save to Folder:"
msgstr ""
#: include/conversation.php:1097
#: include/conversation.php:1080
msgid "Where are you right now?"
msgstr ""
#: include/conversation.php:1098
#: include/conversation.php:1081
msgid "Delete item(s)?"
msgstr ""
#: include/conversation.php:1108
#: include/conversation.php:1091
msgid "New Post"
msgstr ""
#: include/conversation.php:1111
#: include/conversation.php:1094
msgid "Share"
msgstr ""
#: include/conversation.php:1112 mod/editpost.php:89 mod/photos.php:1372
#: include/conversation.php:1095 mod/editpost.php:89 mod/photos.php:1372
#: src/Module/Contact/Poke.php:156 src/Object/Post.php:963
msgid "Loading..."
msgstr ""
#: include/conversation.php:1113 mod/editpost.php:90 mod/message.php:201
#: include/conversation.php:1096 mod/editpost.php:90 mod/message.php:201
#: mod/message.php:365 mod/wallmessage.php:153
msgid "Upload photo"
msgstr ""
#: include/conversation.php:1114 mod/editpost.php:91
#: include/conversation.php:1097 mod/editpost.php:91
msgid "upload photo"
msgstr ""
#: include/conversation.php:1115 mod/editpost.php:92
#: include/conversation.php:1098 mod/editpost.php:92
msgid "Attach file"
msgstr ""
#: include/conversation.php:1116 mod/editpost.php:93
#: include/conversation.php:1099 mod/editpost.php:93
msgid "attach file"
msgstr ""
#: include/conversation.php:1117 src/Module/Item/Compose.php:148
#: include/conversation.php:1100 src/Module/Item/Compose.php:151
#: src/Object/Post.php:964
msgid "Bold"
msgstr ""
#: include/conversation.php:1118 src/Module/Item/Compose.php:149
#: include/conversation.php:1101 src/Module/Item/Compose.php:152
#: src/Object/Post.php:965
msgid "Italic"
msgstr ""
#: include/conversation.php:1119 src/Module/Item/Compose.php:150
#: include/conversation.php:1102 src/Module/Item/Compose.php:153
#: src/Object/Post.php:966
msgid "Underline"
msgstr ""
#: include/conversation.php:1120 src/Module/Item/Compose.php:151
#: include/conversation.php:1103 src/Module/Item/Compose.php:154
#: src/Object/Post.php:967
msgid "Quote"
msgstr ""
#: include/conversation.php:1121 src/Module/Item/Compose.php:152
#: include/conversation.php:1104 src/Module/Item/Compose.php:155
#: src/Object/Post.php:968
msgid "Code"
msgstr ""
#: include/conversation.php:1122 src/Module/Item/Compose.php:153
#: include/conversation.php:1105 src/Module/Item/Compose.php:156
#: src/Object/Post.php:969
msgid "Image"
msgstr ""
#: include/conversation.php:1123 src/Module/Item/Compose.php:154
#: include/conversation.php:1106 src/Module/Item/Compose.php:157
#: src/Object/Post.php:970
msgid "Link"
msgstr ""
#: include/conversation.php:1124 src/Module/Item/Compose.php:155
#: include/conversation.php:1107 src/Module/Item/Compose.php:158
#: src/Object/Post.php:971
msgid "Link or Media"
msgstr ""
#: include/conversation.php:1125
#: include/conversation.php:1108
msgid "Video"
msgstr ""
#: include/conversation.php:1126 mod/editpost.php:100
#: src/Module/Item/Compose.php:158
#: include/conversation.php:1109 mod/editpost.php:100
#: src/Module/Item/Compose.php:161
msgid "Set your location"
msgstr ""
#: include/conversation.php:1127 mod/editpost.php:101
#: include/conversation.php:1110 mod/editpost.php:101
msgid "set location"
msgstr ""
#: include/conversation.php:1128 mod/editpost.php:102
#: include/conversation.php:1111 mod/editpost.php:102
msgid "Clear browser location"
msgstr ""
#: include/conversation.php:1129 mod/editpost.php:103
#: include/conversation.php:1112 mod/editpost.php:103
msgid "clear location"
msgstr ""
#: include/conversation.php:1131 mod/editpost.php:117
#: src/Module/Item/Compose.php:163
#: include/conversation.php:1114 mod/editpost.php:117
#: src/Module/Item/Compose.php:166
msgid "Set title"
msgstr ""
#: include/conversation.php:1133 mod/editpost.php:119
#: src/Module/Item/Compose.php:164
#: include/conversation.php:1116 mod/editpost.php:119
#: src/Module/Item/Compose.php:167
msgid "Categories (comma-separated list)"
msgstr ""
#: include/conversation.php:1135 mod/editpost.php:105
#: include/conversation.php:1121 src/Module/Item/Compose.php:172
msgid "Scheduled at"
msgstr ""
#: include/conversation.php:1125 mod/editpost.php:105
msgid "Permission settings"
msgstr ""
#: include/conversation.php:1136 mod/editpost.php:133 mod/events.php:583
#: include/conversation.php:1126 mod/editpost.php:133 mod/events.php:583
#: mod/photos.php:959 mod/photos.php:1325
msgid "Permissions"
msgstr ""
#: include/conversation.php:1145 mod/editpost.php:114
#: include/conversation.php:1135 mod/editpost.php:114
msgid "Public post"
msgstr ""
#: include/conversation.php:1149 mod/editpost.php:125 mod/events.php:578
#: include/conversation.php:1139 mod/editpost.php:125 mod/events.php:578
#: mod/photos.php:1371 mod/photos.php:1427 mod/photos.php:1501
#: src/Module/Item/Compose.php:157 src/Object/Post.php:973
#: src/Module/Item/Compose.php:160 src/Object/Post.php:973
msgid "Preview"
msgstr ""
#: include/conversation.php:1152 mod/editpost.php:127 mod/fbrowser.php:105
#: include/conversation.php:1142 mod/editpost.php:127 mod/fbrowser.php:105
#: mod/fbrowser.php:134 mod/follow.php:145 mod/photos.php:1027
#: mod/photos.php:1133 mod/tagrm.php:37 mod/tagrm.php:129 mod/unfollow.php:97
#: src/Module/Contact.php:424 src/Module/RemoteFollow.php:112
msgid "Cancel"
msgstr ""
#: include/conversation.php:1159 mod/editpost.php:131
#: include/conversation.php:1149 mod/editpost.php:131
#: src/Content/Widget/VCard.php:106 src/Model/Profile.php:448
msgid "Message"
msgstr ""
#: include/conversation.php:1160 mod/editpost.php:132
#: include/conversation.php:1150 mod/editpost.php:132
#: src/Module/Settings/TwoFactor/Trusted.php:101
msgid "Browser"
msgstr ""
#: include/conversation.php:1162 mod/editpost.php:135
#: include/conversation.php:1152 mod/editpost.php:135
msgid "Open Compose page"
msgstr ""
@ -824,7 +828,7 @@ msgstr ""
#: mod/api.php:30 mod/api.php:35 mod/editpost.php:37 mod/events.php:236
#: mod/follow.php:56 mod/follow.php:131 mod/item.php:185 mod/item.php:190
#: mod/item.php:917 mod/message.php:69 mod/message.php:111 mod/notes.php:44
#: mod/item.php:933 mod/message.php:69 mod/message.php:111 mod/notes.php:44
#: mod/ostatus_subscribe.php:32 mod/photos.php:159 mod/photos.php:911
#: mod/repair_ostatus.php:31 mod/settings.php:47 mod/settings.php:65
#: mod/settings.php:417 mod/suggest.php:34 mod/uimport.php:32
@ -841,11 +845,11 @@ msgstr ""
#: src/Module/Invite.php:127 src/Module/Notifications/Notification.php:47
#: src/Module/Notifications/Notification.php:76
#: src/Module/Profile/Common.php:56 src/Module/Profile/Contacts.php:57
#: src/Module/Register.php:62 src/Module/Register.php:75
#: src/Module/Register.php:193 src/Module/Register.php:232
#: src/Module/Search/Directory.php:38 src/Module/Settings/Delegation.php:42
#: src/Module/Settings/Delegation.php:70 src/Module/Settings/Display.php:42
#: src/Module/Settings/Display.php:118
#: src/Module/Profile/Schedule.php:33 src/Module/Register.php:62
#: src/Module/Register.php:75 src/Module/Register.php:193
#: src/Module/Register.php:232 src/Module/Search/Directory.php:38
#: src/Module/Settings/Delegation.php:42 src/Module/Settings/Delegation.php:70
#: src/Module/Settings/Display.php:42 src/Module/Settings/Display.php:118
#: src/Module/Settings/Profile/Photo/Crop.php:155
#: src/Module/Settings/Profile/Photo/Index.php:113
#: src/Module/Settings/UserExport.php:59 src/Module/Settings/UserExport.php:94
@ -880,8 +884,8 @@ msgid "Access to this profile has been restricted."
msgstr ""
#: mod/cal.php:251 mod/events.php:422 src/Content/Nav.php:195
#: src/Content/Nav.php:262 src/Module/BaseProfile.php:86
#: src/Module/BaseProfile.php:97 view/theme/frio/theme.php:230
#: src/Content/Nav.php:262 src/Module/BaseProfile.php:87
#: src/Module/BaseProfile.php:98 view/theme/frio/theme.php:230
#: view/theme/frio/theme.php:234
msgid "Events"
msgstr ""
@ -1087,7 +1091,7 @@ msgstr ""
#: src/Module/Delegation.php:152 src/Module/FriendSuggest.php:129
#: src/Module/Install.php:245 src/Module/Install.php:287
#: src/Module/Install.php:324 src/Module/Invite.php:174
#: src/Module/Item/Compose.php:147 src/Module/Profile/Profile.php:244
#: src/Module/Item/Compose.php:150 src/Module/Profile/Profile.php:244
#: src/Module/Settings/Profile/Index.php:221 src/Object/Post.php:962
#: view/theme/duepuntozero/config.php:69 view/theme/frio/config.php:160
#: view/theme/quattro/config.php:71 view/theme/vier/config.php:119
@ -1188,19 +1192,19 @@ msgstr ""
msgid "Empty post discarded."
msgstr ""
#: mod/item.php:724
#: mod/item.php:740
msgid "Post updated."
msgstr ""
#: mod/item.php:734 mod/item.php:739
#: mod/item.php:750 mod/item.php:755
msgid "Item wasn't stored."
msgstr ""
#: mod/item.php:750
#: mod/item.php:766
msgid "Item couldn't be fetched."
msgstr ""
#: mod/item.php:896 src/Module/Admin/Themes/Details.php:39
#: mod/item.php:912 src/Module/Admin/Themes/Details.php:39
#: src/Module/Admin/Themes/Index.php:59 src/Module/Debug/ItemBody.php:41
#: src/Module/Debug/ItemBody.php:56
msgid "Item not found."
@ -1471,7 +1475,7 @@ msgid_plural "%d messages"
msgstr[0] ""
msgstr[1] ""
#: mod/notes.php:51 src/Module/BaseProfile.php:108
#: mod/notes.php:51 src/Module/BaseProfile.php:109
msgid "Personal Notes"
msgstr ""
@ -1735,7 +1739,7 @@ msgid "Rotate CCW (left)"
msgstr ""
#: mod/photos.php:1367 mod/photos.php:1423 mod/photos.php:1497
#: src/Module/Contact.php:1057 src/Module/Item/Compose.php:145
#: src/Module/Contact.php:1057 src/Module/Item/Compose.php:148
#: src/Object/Post.php:959
msgid "This is you"
msgstr ""
@ -2711,7 +2715,7 @@ msgstr ""
msgid "File upload failed."
msgstr ""
#: mod/wall_upload.php:233 src/Model/Photo.php:987
#: mod/wall_upload.php:233 src/Model/Photo.php:1002
msgid "Wall Photos"
msgstr ""
@ -3168,8 +3172,7 @@ msgstr ""
msgid "Your photos"
msgstr ""
#: src/Content/Nav.php:194 src/Module/BaseProfile.php:74
#: src/Module/BaseProfile.php:77 view/theme/frio/theme.php:229
#: src/Content/Nav.php:194 view/theme/frio/theme.php:229
msgid "Videos"
msgstr ""
@ -3241,8 +3244,8 @@ msgid "Tags"
msgstr ""
#: src/Content/Nav.php:239 src/Content/Nav.php:298
#: src/Content/Text/HTML.php:902 src/Module/BaseProfile.php:119
#: src/Module/BaseProfile.php:122 src/Module/Contact.php:818
#: src/Content/Text/HTML.php:902 src/Module/BaseProfile.php:128
#: src/Module/BaseProfile.php:131 src/Module/Contact.php:818
#: src/Module/Contact.php:906 view/theme/frio/theme.php:237
msgid "Contacts"
msgstr ""
@ -3255,8 +3258,8 @@ msgstr ""
msgid "Conversations on this and other servers"
msgstr ""
#: src/Content/Nav.php:262 src/Module/BaseProfile.php:89
#: src/Module/BaseProfile.php:100 view/theme/frio/theme.php:234
#: src/Content/Nav.php:262 src/Module/BaseProfile.php:90
#: src/Module/BaseProfile.php:101 view/theme/frio/theme.php:234
msgid "Events and Calendar"
msgstr ""
@ -3400,8 +3403,8 @@ msgid ""
"<a href=\"%1$s\" target=\"_blank\" rel=\"noopener noreferrer\">%2$s</a> %3$s"
msgstr ""
#: src/Content/Text/BBCode.php:1177 src/Model/Item.php:3138
#: src/Model/Item.php:3144 src/Model/Item.php:3145
#: src/Content/Text/BBCode.php:1177 src/Model/Item.php:3141
#: src/Model/Item.php:3147 src/Model/Item.php:3148
msgid "Link to source"
msgstr ""
@ -4586,33 +4589,33 @@ msgstr ""
msgid "Edit groups"
msgstr ""
#: src/Model/Item.php:1664
#: src/Model/Item.php:1667
#, php-format
msgid "Detected languages in this post:\\n%s"
msgstr ""
#: src/Model/Item.php:2614
#: src/Model/Item.php:2617
msgid "activity"
msgstr ""
#: src/Model/Item.php:2616
#: src/Model/Item.php:2619
msgid "comment"
msgstr ""
#: src/Model/Item.php:2619
#: src/Model/Item.php:2622
msgid "post"
msgstr ""
#: src/Model/Item.php:2756
#: src/Model/Item.php:2759
#, php-format
msgid "Content warning: %s"
msgstr ""
#: src/Model/Item.php:3103
#: src/Model/Item.php:3106
msgid "bytes"
msgstr ""
#: src/Model/Item.php:3132 src/Model/Item.php:3133
#: src/Model/Item.php:3135 src/Model/Item.php:3136
msgid "View on separate page"
msgstr ""
@ -7089,11 +7092,19 @@ msgstr ""
msgid "Profile Details"
msgstr ""
#: src/Module/BaseProfile.php:111
#: src/Module/BaseProfile.php:112
msgid "Only You Can See This"
msgstr ""
#: src/Module/BaseProfile.php:130 src/Module/BaseProfile.php:133
#: src/Module/BaseProfile.php:117
msgid "Scheduled Posts"
msgstr ""
#: src/Module/BaseProfile.php:120
msgid "Posts that are scheduled for publishing"
msgstr ""
#: src/Module/BaseProfile.php:139 src/Module/BaseProfile.php:142
msgid "Tips for New Members"
msgstr ""
@ -8494,35 +8505,35 @@ msgid ""
"important, please visit http://friendi.ca"
msgstr ""
#: src/Module/Item/Compose.php:47
#: src/Module/Item/Compose.php:50
msgid "Please enter a post body."
msgstr ""
#: src/Module/Item/Compose.php:60
#: src/Module/Item/Compose.php:63
msgid "This feature is only available with the frio theme."
msgstr ""
#: src/Module/Item/Compose.php:87
#: src/Module/Item/Compose.php:90
msgid "Compose new personal note"
msgstr ""
#: src/Module/Item/Compose.php:96
#: src/Module/Item/Compose.php:99
msgid "Compose new post"
msgstr ""
#: src/Module/Item/Compose.php:138
#: src/Module/Item/Compose.php:141
msgid "Visibility"
msgstr ""
#: src/Module/Item/Compose.php:159
#: src/Module/Item/Compose.php:162
msgid "Clear the location"
msgstr ""
#: src/Module/Item/Compose.php:160
#: src/Module/Item/Compose.php:163
msgid "Location services are unavailable on your device"
msgstr ""
#: src/Module/Item/Compose.php:161
#: src/Module/Item/Compose.php:164
msgid ""
"Location services are disabled. Please check the website's permissions on "
"your device"
@ -8768,6 +8779,12 @@ msgstr ""
msgid "%s's comments"
msgstr ""
#: src/Module/Profile/Schedule.php:40
msgid ""
"Currently here is no functionality here. Please use an app to have a look at "
"your scheduled posts."
msgstr ""
#: src/Module/Register.php:69
msgid "Only parent users can create additional accounts."
msgstr ""

View file

@ -81,6 +81,8 @@
<div class="jotplugins">
{{$jotplugins nofilter}}
</div>
{{if $scheduled_at}}{{$scheduled_at nofilter}}{{/if}}
{{else}}
<input type="hidden" name="group_allow" value="{{$group_allow}}"/>
<input type="hidden" name="contact_allow" value="{{$contact_allow}}"/>

View file

@ -76,6 +76,7 @@
<div style="display: none;">
<div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;">
{{$acl nofilter}}
{{if $scheduled_at}}{{$scheduled_at nofilter}}{{/if}}
</div>
</div>

View file

@ -133,6 +133,7 @@
<div id="profile-jot-acl-wrapper" class="minimize" aria-labelledby="jot-perms-lnk" role="tabpanel" aria-hidden="true">
{{$acl nofilter}}
{{if $scheduled_at}}{{$scheduled_at nofilter}}{{/if}}
</div>
<div id="jot-preview-content" class="minimize" aria-labelledby="jot-preview-lnk" role="tabpanel" aria-hidden="true"></div>

View file

@ -47,6 +47,7 @@
<div style="display: none;">
<div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;">
{{$acl nofilter}}
{{if $scheduled_at}}{{$scheduled_at nofilter}}{{/if}}
</div>
</div>

View file

@ -71,6 +71,7 @@
<div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;">
{{$acl nofilter}}
{{$jotnets nofilter}}
{{if $scheduled_at}}{{$scheduled_at nofilter}}{{/if}}
</div>
</div>