]> git.mxchange.org Git - friendica.git/commitdiff
Fix new private message recipient input
authorHypolite Petovan <hypolite@mrpetovan.com>
Thu, 3 Sep 2020 14:01:58 +0000 (10:01 -0400)
committerHypolite Petovan <hypolite@mrpetovan.com>
Thu, 3 Sep 2020 14:01:58 +0000 (10:01 -0400)
- Add new private message recipient ACL template
- Remove now redundant theme private message templates

mod/message.php
src/Core/ACL.php
view/templates/acl/message_recipient.tpl [new file with mode: 0644]
view/templates/message-head.tpl
view/theme/duepuntozero/style.css
view/theme/duepuntozero/templates/prv_message.tpl [deleted file]
view/theme/frio/templates/prv_message.tpl
view/theme/quattro/templates/prv_message.tpl [deleted file]

index f04bdaecd72dfb4284ce5cd7e68169655e93da7b..6326bb9ea5ffb282e4b3b85645d9e8e89492f5a3 100644 (file)
@@ -74,7 +74,7 @@ function message_post(App $a)
        $replyto   = !empty($_REQUEST['replyto'])   ? Strings::escapeTags(trim($_REQUEST['replyto'])) : '';
        $subject   = !empty($_REQUEST['subject'])   ? Strings::escapeTags(trim($_REQUEST['subject'])) : '';
        $body      = !empty($_REQUEST['body'])      ? Strings::escapeHtml(trim($_REQUEST['body']))    : '';
-       $recipient = !empty($_REQUEST['messageto']) ? intval($_REQUEST['messageto'])                  : 0;
+       $recipient = !empty($_REQUEST['recipient']) ? intval($_REQUEST['recipient'])                  : 0;
 
        $ret = Mail::send($recipient, $body, $subject, $replyto);
        $norecip = false;
@@ -215,50 +215,14 @@ function message_content(App $a)
                        '$linkurl' => DI::l10n()->t('Please enter a link URL:')
                ]);
 
-               $preselect = isset($a->argv[2]) ? [$a->argv[2]] : [];
+               $recipientId = $a->argv[2] ?? null;
 
-               $prename = $preurl = $preid = '';
-
-               if ($preselect) {
-                       $r = q("SELECT `name`, `url`, `id` FROM `contact` WHERE `uid` = %d AND `id` = %d LIMIT 1",
-                               intval(local_user()),
-                               intval($a->argv[2])
-                       );
-                       if (!DBA::isResult($r)) {
-                               $r = q("SELECT `name`, `url`, `id` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' LIMIT 1",
-                                       intval(local_user()),
-                                       DBA::escape(Strings::normaliseLink(base64_decode($a->argv[2])))
-                               );
-                       }
-
-                       if (!DBA::isResult($r)) {
-                               $r = q("SELECT `name`, `url`, `id` FROM `contact` WHERE `uid` = %d AND `addr` = '%s' LIMIT 1",
-                                       intval(local_user()),
-                                       DBA::escape(base64_decode($a->argv[2]))
-                               );
-                       }
-
-                       if (DBA::isResult($r)) {
-                               $prename = $r[0]['name'];
-                               $preid = $r[0]['id'];
-                               $preselect = [$preid];
-                       } else {
-                               $preselect = [];
-                       }
-               }
-
-               $prefill = $preselect ? $prename : '';
-
-               // the ugly select box
-               $select = ACL::getMessageContactSelectHTML('messageto', 'message-to-select', $preselect, 4, 10);
+               $select = ACL::getMessageContactSelectHTML($recipientId);
 
                $tpl = Renderer::getMarkupTemplate('prv_message.tpl');
                $o .= Renderer::replaceMacros($tpl, [
                        '$header'     => DI::l10n()->t('Send Private Message'),
                        '$to'         => DI::l10n()->t('To:'),
-                       '$showinputs' => 'true',
-                       '$prefill'    => $prefill,
-                       '$preid'      => $preid,
                        '$subject'    => DI::l10n()->t('Subject:'),
                        '$subjtxt'    => $_REQUEST['subject'] ?? '',
                        '$text'       => $_REQUEST['body'] ?? '',
@@ -413,7 +377,7 @@ function message_content(App $a)
                        $seen = $message['seen'];
                }
 
-               $select = $message['name'] . '<input type="hidden" name="messageto" value="' . $contact_id . '" />';
+               $select = $message['name'] . '<input type="hidden" name="recipient" value="' . $contact_id . '" />';
                $parent = '<input type="hidden" name="replyto" value="' . $message['parent-uri'] . '" />';
 
                $tpl = Renderer::getMarkupTemplate('mail_display.tpl');
@@ -429,7 +393,6 @@ function message_content(App $a)
                        // reply
                        '$header' => DI::l10n()->t('Send Reply'),
                        '$to' => DI::l10n()->t('To:'),
-                       '$showinputs' => '',
                        '$subject' => DI::l10n()->t('Subject:'),
                        '$subjtxt' => $message['title'],
                        '$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ',
index 504e5d847d2366a1ce044d1bc4eeb01a4d7376db..4df15dc536906a31e6a8c64b245140830c910854 100644 (file)
@@ -33,75 +33,52 @@ use Friendica\Model\Group;
 class ACL
 {
        /**
-        * Returns a select input tag with all the contact of the local user
+        * Returns a select input tag for private message recipient
         *
-        * @param string $selname     Name attribute of the select input tag
-        * @param string $selclass    Class attribute of the select input tag
-        * @param array  $preselected Contact IDs that should be already selected
-        * @param int    $size        Length of the select box
-        * @param int    $tabindex    Select input tag tabindex attribute
+        * @param int  $selected Existing recipien contact ID
         * @return string
         * @throws \Exception
         */
-       public static function getMessageContactSelectHTML($selname, $selclass, array $preselected = [], $size = 4, $tabindex = null)
+       public static function getMessageContactSelectHTML(int $selected = null)
        {
-               $a = DI::app();
-
                $o = '';
 
-               // When used for private messages, we limit correspondence to mutual DFRN/Friendica friends and the selector
-               // to one recipient. By default our selector allows multiple selects amongst all contacts.
-               $sql_extra = sprintf(" AND `rel` = %d ", intval(Contact::FRIEND));
-               $sql_extra .= sprintf(" AND `network` IN ('%s' , '%s') ", Protocol::DFRN, Protocol::DIASPORA);
-
-               $tabindex_attr = !empty($tabindex) ? ' tabindex="' . intval($tabindex) . '"' : '';
+               $page = DI::page();
 
-               $hidepreselected = '';
-               if ($preselected) {
-                       $sql_extra .= " AND `id` IN (" . implode(",", $preselected) . ")";
-                       $hidepreselected = ' style="display: none;"';
-               }
+               $page->registerFooterScript(Theme::getPathForFile('asset/typeahead.js/dist/typeahead.bundle.js'));
+               $page->registerFooterScript(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput.js'));
+               $page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput.css'));
+               $page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput-typeahead.css'));
 
-               $o .= "<select name=\"$selname\" id=\"$selclass\" class=\"$selclass\" size=\"$size\"$tabindex_attr$hidepreselected>\r\n";
+               // When used for private messages, we limit correspondence to mutual DFRN/Friendica friends and the selector
+               // to one recipient. By default our selector allows multiple selects amongst all contacts.
+               $condition = [
+                       'uid' => local_user(),
+                       'self' => false,
+                       'blocked' => false,
+                       'pending' => false,
+                       'archive' => false,
+                       'deleted' => false,
+                       'rel' => [Contact::FOLLOWER, Contact::SHARING, Contact::FRIEND],
+                       'network' => Protocol::FEDERATED,
+               ];
 
-               $stmt = DBA::p("SELECT `id`, `name`, `url`, `network` FROM `contact`
-                       WHERE `uid` = ? AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND NOT `deleted` AND `notify` != ''
-                       $sql_extra
-                       ORDER BY `name` ASC ", intval(local_user())
+               $contacts = Contact::selectToArray(
+                       ['id', 'name', 'addr', 'micro'],
+                       DBA::mergeConditions($condition, ["`notify` != ''"])
                );
 
-               $contacts = DBA::toArray($stmt);
-
                $arr = ['contact' => $contacts, 'entry' => $o];
 
-               // e.g. 'network_pre_contact_deny', 'profile_pre_contact_allow'
-               Hook::callAll(DI::module()->getName() . '_pre_' . $selname, $arr);
+               Hook::callAll(DI::module()->getName() . '_pre_recipient', $arr);
 
-               $receiverlist = [];
-
-               if (DBA::isResult($contacts)) {
-                       foreach ($contacts as $contact) {
-                               if (in_array($contact['id'], $preselected)) {
-                                       $selected = ' selected="selected"';
-                               } else {
-                                       $selected = '';
-                               }
-
-                               $trimmed = Protocol::formatMention($contact['url'], $contact['name']);
-
-                               $receiverlist[] = $trimmed;
-
-                               $o .= "<option value=\"{$contact['id']}\"$selected title=\"{$contact['name']}|{$contact['url']}\" >$trimmed</option>\r\n";
-                       }
-               }
-
-               $o .= '</select>' . PHP_EOL;
-
-               if ($preselected) {
-                       $o .= implode(', ', $receiverlist);
-               }
+               $tpl = Renderer::getMarkupTemplate('acl/message_recipient.tpl');
+               $o = Renderer::replaceMacros($tpl, [
+                       '$contacts' => $contacts,
+                       '$selected' => $selected,
+               ]);
 
-               Hook::callAll(DI::module()->getName() . '_post_' . $selname, $o);
+               Hook::callAll(DI::module()->getName() . '_post_recipient', $o);
 
                return $o;
        }
diff --git a/view/templates/acl/message_recipient.tpl b/view/templates/acl/message_recipient.tpl
new file mode 100644 (file)
index 0000000..07c22f4
--- /dev/null
@@ -0,0 +1,54 @@
+<select name="recipient" class="form-control input-lg" id="recipient">
+       {{foreach $contacts as $contact}}
+               <option value="{{$contact.id}}"{{if $contact.id == $selected}} selected{{/if}}>{{$contact.name}}</option>
+       {{/foreach}}
+</select>
+<script type="text/javascript">
+       $(function() {
+               let $recipient_input = $('[name="recipient"]');
+
+               let acl = new Bloodhound({
+                       local: {{$contacts|@json_encode nofilter}},
+                       identify: function(obj) { return obj.id.toString(); },
+                       datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
+                       queryTokenizer: Bloodhound.tokenizers.whitespace,
+                       sorter: function (itemA, itemB) {
+                               if (itemA.name === itemB.name) {
+                                       return 0;
+                               } else if (itemA.name > itemB.name) {
+                                       return 1;
+                               } else {
+                                       return -1;
+                               }
+                       },
+               });
+               acl.initialize();
+
+               let suggestionTemplate = function (item) {
+                       return '<div><img src="' + item.micro + '" alt="" style="float: left; width: auto; height: 2.8em; margin-right: 0.5em;"><p style="margin-left: 3.3em;"><strong>' + item.name + '</strong><br /><em>' + item.addr + '</em></p></div>';
+               };
+
+               $recipient_input.tagsinput({
+                       confirmKeys: [13, 44],
+                       freeInput: false,
+                       tagClass: 'label label-info',
+                       itemValue: function (item) { return item.id.toString(); },
+                       itemText: 'name',
+                       itemThumb: 'micro',
+                       itemTitle: function(item) {
+                               return item.addr;
+                       },
+                       typeaheadjs: {
+                               name: 'contacts',
+                               displayKey: 'name',
+                               templates: {
+                                       suggestion: suggestionTemplate
+                               },
+                               source: acl.ttAdapter()
+                       }
+               });
+
+               // Import existing ACL into the tags input fields.
+               $recipient_input.tagsinput('add', acl.get({{$selected}})[0]);
+       });
+</script>
index fe71bc425b6b9f11e693014bba888567926d7b6d..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,8 +0,0 @@
-
-<script>
-$(document).ready(function() {
-       $("#recip").name_autocomplete(baseurl + '/search/acl', 'm', false, function(data) {
-               $("#recip-complete").val(data.id);
-       });
-});
-</script>
index 3c8a18c88e2e2f37c68d4f75134f76b462ce9888..85669be9ff58efd56fb0ad9fa78bc03e8c4d7e7a 100644 (file)
@@ -3228,9 +3228,6 @@ div.jGrowl div.info {
        width:100px;
 }
 
-#recip {
-
-}
 .autocomplete-w1 { background: #ffffff no-repeat bottom right; position:absolute; top:0px; left:0px; margin:6px 0 0 6px; /* IE6 fix: */ _background:none; _margin:1px 0 0 0; }
 .autocomplete { color:#000; border:1px solid #999; background:#FFF; cursor:default; text-align:left; max-height:350px; overflow:auto; margin:-6px 6px 6px -6px; /* IE6 specific: */ _height:350px;  _margin:0; _overflow-x:hidden; }
 .autocomplete .selected { background:#F0F0F0; }
diff --git a/view/theme/duepuntozero/templates/prv_message.tpl b/view/theme/duepuntozero/templates/prv_message.tpl
deleted file mode 100644 (file)
index 3f658ef..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-<h3>{{$header}}</h3>
-
-<div id="prvmail-wrapper" >
-<form id="prvmail-form" action="message" method="post" >
-
-{{$parent nofilter}}
-
-<div id="prvmail-to-label">{{$to}}</div>
-
-{{if $showinputs}}
-<input type="text" id="recip" name="messagerecip" value="{{$prefill}}" maxlength="255" size="64" tabindex="10" />
-<input type="hidden" id="recip-complete" name="messageto" value="{{$preid}}">
-{{else}}
-{{$select nofilter}}
-{{/if}}
-
-<div id="prvmail-subject-label">{{$subject}}</div>
-<input type="text" size="64" maxlength="255" id="prvmail-subject" name="subject" value="{{$subjtxt}}" {{$readonly}} tabindex="11" />
-
-<div id="prvmail-message-label">{{$yourmessage}}</div>
-<textarea rows="8" cols="72" class="prvmail-text" id="prvmail-text" name="body" tabindex="12">{{$text}}</textarea>
-
-
-<div id="prvmail-submit-wrapper" >
-       <input type="submit" id="prvmail-submit" name="submit" value="{{$submit}}" tabindex="13" />
-       <div id="prvmail-upload-wrapper" >
-               <div id="prvmail-upload" class="icon border camera" title="{{$upload}}" ></div>
-       </div> 
-       <div id="prvmail-link-wrapper" >
-               <div id="prvmail-link" class="icon border link" title="{{$insert}}" onclick="jotGetLink();" ></div>
-       </div> 
-       <div id="prvmail-rotator-wrapper" >
-               <img id="prvmail-rotator" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
-       </div> 
-</div>
-<div id="prvmail-end"></div>
-</form>
-</div>
index 68db2568a27883e9c2df09b55738f01d54a44664..f936741c02eba565621d580e197d587564f50ad0 100644 (file)
@@ -2,21 +2,12 @@
 <div id="prvmail-wrapper">
 <form id="prvmail-form" action="message" method="post" >
 
-       {{* Disable the header. We will see if we will need it
-       <h3>{{$header}}</h3>
-       *}}
-
        {{$parent nofilter}}
 
        {{* The To: form-group which contains the message recipient *}}
        <div id="prvmail-to-label" class="form-group">
-               <label for="recip">{{$to}}</label><br>
-               {{if $showinputs}}
-               <input type="text" id="recip" class="form-control" name="messagerecip" value="{{$prefill}}" tabindex="10" {{if $prefill}}disabled{{else}}aria-required="true"{{/if}} />
-               <input type="hidden" id="recip-complete" name="messageto" value="{{$preid}}">
-               {{else}}
+               <label for="recipient">{{$to}}</label><br>
                {{$select nofilter}}
-               {{/if}}
        </div>
 
        {{* The subject input field *}}
diff --git a/view/theme/quattro/templates/prv_message.tpl b/view/theme/quattro/templates/prv_message.tpl
deleted file mode 100644 (file)
index c956fbf..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-<h3>{{$header}}</h3>
-
-<div id="prvmail-wrapper" >
-<form id="prvmail-form" action="message" method="post" >
-
-{{$parent nofilter}}
-
-<div id="prvmail-to-label">{{$to}}</div>
-{{if $showinputs}}
-<input type="text" id="recip" name="messagerecip" value="{{$prefill}}" maxlength="255" size="64" tabindex="10" />
-<input type="hidden" id="recip-complete" name="messageto" value="{{$preid}}">
-{{else}}
-{{$select nofilter}}
-{{/if}}
-
-<div id="prvmail-subject-label">{{$subject}}</div>
-<input type="text" size="64" maxlength="255" id="prvmail-subject" name="subject" value="{{$subjtxt}}" {{$readonly}} tabindex="11" />
-
-<div id="prvmail-message-label">{{$yourmessage}}</div>
-<textarea rows="20" cols="72" class="prvmail-text" id="prvmail-text" name="body" tabindex="12">{{$text}}</textarea>
-
-
-<div id="prvmail-submit-wrapper" >
-       <input type="submit" id="prvmail-submit" name="submit" value="{{$submit}}" tabindex="13" />
-       <div id="prvmail-upload-wrapper" >
-               <div id="prvmail-upload" class="icon border camera" title="{{$upload}}" ></div>
-       </div> 
-       <div id="prvmail-link-wrapper" >
-               <div id="prvmail-link" class="icon border link" title="{{$insert}}" onclick="jotGetLink();" ></div>
-       </div> 
-       <div id="prvmail-rotator-wrapper" >
-               <img id="prvmail-rotator" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
-       </div> 
-</div>
-<div id="prvmail-end"></div>
-</form>
-</div>