diff --git a/doc/Accesskeys.md b/doc/Accesskeys.md index 9158efd58..599d2b119 100644 --- a/doc/Accesskeys.md +++ b/doc/Accesskeys.md @@ -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 diff --git a/include/conversation.php b/include/conversation.php index 4fdc35737..6a6eff28d 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -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.', '' . htmlentities($row['causer-name']) . ''); - } - $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.', '' . htmlentities($row['causer-name']) . ''); + } + $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'), diff --git a/mod/item.php b/mod/item.php index b62841e47..2a365f3da 100644 --- a/mod/item.php +++ b/mod/item.php @@ -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'])) { diff --git a/src/Model/Item.php b/src/Model/Item.php index 798886ad4..a8105f78c 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -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); diff --git a/src/Module/BaseProfile.php b/src/Module/BaseProfile.php index dca88f01c..832c8fd2f 100644 --- a/src/Module/BaseProfile.php +++ b/src/Module/BaseProfile.php @@ -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'])) { diff --git a/src/Module/Item/Compose.php b/src/Module/Item/Compose.php index e06c4ba0c..db59bfb48 100644 --- a/src/Module/Item/Compose.php +++ b/src/Module/Item/Compose.php @@ -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, diff --git a/src/Module/Profile/Schedule.php b/src/Module/Profile/Schedule.php new file mode 100644 index 000000000..9ea5e0c6b --- /dev/null +++ b/src/Module/Profile/Schedule.php @@ -0,0 +1,43 @@ +. + * + */ + +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; + } +} diff --git a/src/Util/Temporal.php b/src/Util/Temporal.php index af82df4be..b5619cf49 100644 --- a/src/Util/Temporal.php +++ b/src/Util/Temporal.php @@ -225,7 +225,7 @@ class Temporal public static function getDateTimeField( DateTime $minDate, DateTime $maxDate, - DateTime $defaultDate, + DateTime $defaultDate = null, $label, $id = 'datetimepicker', $pickdate = true, diff --git a/static/routes.config.php b/static/routes.config.php index 40739de7e..825be5a94 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -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]], diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index 83d658370..2fb3c01f4 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -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 \n" "Language-Team: LANGUAGE \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 "%2$d people 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 "%2$d people 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 "%2$d people 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 "%2$d people 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 "%2$d people 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 "%2$d people reshared this" msgstr "" -#: include/conversation.php:1093 +#: include/conversation.php:1076 msgid "Visible to everybody" 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 "" "%2$s %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 "" diff --git a/view/templates/item/compose.tpl b/view/templates/item/compose.tpl index df48a1323..7837036b4 100644 --- a/view/templates/item/compose.tpl +++ b/view/templates/item/compose.tpl @@ -81,6 +81,8 @@
{{$jotplugins nofilter}}
+ + {{if $scheduled_at}}{{$scheduled_at nofilter}}{{/if}} {{else}} diff --git a/view/templates/jot.tpl b/view/templates/jot.tpl index 73d341aae..71939e0eb 100644 --- a/view/templates/jot.tpl +++ b/view/templates/jot.tpl @@ -76,6 +76,7 @@
{{$acl nofilter}} + {{if $scheduled_at}}{{$scheduled_at nofilter}}{{/if}}
diff --git a/view/theme/frio/templates/jot.tpl b/view/theme/frio/templates/jot.tpl index a7f63f2db..d8372f3ae 100644 --- a/view/theme/frio/templates/jot.tpl +++ b/view/theme/frio/templates/jot.tpl @@ -133,6 +133,7 @@ diff --git a/view/theme/quattro/templates/jot.tpl b/view/theme/quattro/templates/jot.tpl index 2edd821b8..ba6bf5268 100644 --- a/view/theme/quattro/templates/jot.tpl +++ b/view/theme/quattro/templates/jot.tpl @@ -47,6 +47,7 @@
{{$acl nofilter}} + {{if $scheduled_at}}{{$scheduled_at nofilter}}{{/if}}
diff --git a/view/theme/smoothly/templates/jot.tpl b/view/theme/smoothly/templates/jot.tpl index f2e4f2f0d..38f003908 100644 --- a/view/theme/smoothly/templates/jot.tpl +++ b/view/theme/smoothly/templates/jot.tpl @@ -71,6 +71,7 @@
{{$acl nofilter}} {{$jotnets nofilter}} + {{if $scheduled_at}}{{$scheduled_at nofilter}}{{/if}}