diff --git a/include/acl_selectors.php b/include/acl_selectors.php index 6c0222e1c..3306871d0 100644 --- a/include/acl_selectors.php +++ b/include/acl_selectors.php @@ -1,6 +1,7 @@ json_encode($perms['allow_gid']), '$denycid' => json_encode($perms['deny_cid']), '$denygid' => json_encode($perms['deny_gid']), + '$features' => array( + "aclautomention"=>(feature_enabled($user,"aclautomention")?"true":"false") + ), )); @@ -474,14 +478,15 @@ function acl_lookup(&$a, $out_type = 'json') { "name" => $g['name'], "id" => intval($g['id']), "uids" => array_map("intval", explode(",",$g['uids'])), - "link" => '' + "link" => '', + "forum" => '0' ); } } if ($type=='' || $type=='c'){ - $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag` FROM `contact` + $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, forum FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != '' $sql_extra2 ORDER BY `name` ASC ", @@ -541,6 +546,7 @@ function acl_lookup(&$a, $out_type = 'json') { "network" => $g['network'], "link" => $g['url'], "nick" => ($g['attag']) ? $g['attag'] : $g['nick'], + "forum" => $g['forum'] ); } } diff --git a/include/features.php b/include/features.php index b2712665e..24955ba10 100644 --- a/include/features.php +++ b/include/features.php @@ -30,6 +30,7 @@ function get_features() { t('Post Composition Features'), array('richtext', t('Richtext Editor'), t('Enable richtext editor')), array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them')), + array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a fourm page is selected/deselected in ACL window.')), ), // Network sidebar widgets diff --git a/include/network.php b/include/network.php index a4538e88e..a663a6d94 100644 --- a/include/network.php +++ b/include/network.php @@ -617,7 +617,6 @@ function fetch_xrd_links($url) { if(! function_exists('validate_url')) { function validate_url(&$url) { - // no naked subdomains (allow localhost for tests) if(strpos($url,'.') === false && strpos($url,'/localhost/') === false) return false; diff --git a/js/acl.js b/js/acl.js index fc6a6c0c1..b57a92546 100644 --- a/js/acl.js +++ b/js/acl.js @@ -1,7 +1,8 @@ -function ACL(backend_url, preset){ +function ACL(backend_url, preset, automention){ that = this; that.url = backend_url; + that.automention = automention; that.kp_timer = null; @@ -26,10 +27,45 @@ function ACL(backend_url, preset){ $("#acl-search").keypress(that.on_search); $("#acl-wrapper").parents("form").submit(that.on_submit); + /* add/remove mentions */ + that.element = $("#profile-jot-text"); + that.htmlelm = that.element.get()[0]; + /* startup! */ that.get(0,100); } +ACL.prototype.remove_mention = function(id) { + if (!that.aclautomention) return; + var nick = that.data[id].nick; + var searchText = "@"+nick+"+"+id+" "; + if (tinyMCE.activeEditor===null) { + start = that.element.val().indexOf(searchText); + if ( start<0) return; + end = start+searchText.length; + that.element.setSelection(start,end).replaceSelectedText('').collapseSelection(false); + } else { + start = tinyMCE.activeEditor.getContent({format : 'raw'}).search( searchText ); + if ( start<0 ) return; + txt = tinyMCE.activeEditor.getContent(); + newtxt = txt.replace(searchText, ''); + tinyMCE.activeEditor.setContent(newtxt); + } +} + +ACL.prototype.add_mention = function(id) { + if (!that.aclautomention) return; + var nick = that.data[id].nick; + var searchText = "@"+nick+"+"+id+" "; + if (tinyMCE.activeEditor===null) { + if ( that.element.val().indexOf( searchText) >= 0 ) return; + that.element.val( searchText + that.element.val() ); + } else { + if ( tinyMCE.activeEditor.getContent({format : 'raw'}).search(searchText) >= 0 ) return; + tinyMCE.activeEditor.dom.add(tinyMCE.activeEditor.getBody(), 'span', {}, searchText); + } +} + ACL.prototype.on_submit = function(){ aclfileds = $("#acl-fields").html(""); $(that.allow_gid).each(function(i,v){ @@ -105,7 +141,8 @@ ACL.prototype.on_button_hide = function(event){ ACL.prototype.set_allow = function(itemid){ type = itemid[0]; - id = parseInt(itemid.substr(1)); + id = parseInt(itemid.substr(1)); + switch(type){ case "g": if (that.allow_gid.indexOf(id)<0){ @@ -118,8 +155,10 @@ ACL.prototype.set_allow = function(itemid){ case "c": if (that.allow_cid.indexOf(id)<0){ that.allow_cid.push(id) + if (that.data[id].forum=="1") that.add_mention(id); } else { that.allow_cid.remove(id); + if (that.data[id].forum=="1") that.remove_mention(id); } if (that.deny_cid.indexOf(id)>=0) that.deny_cid.remove(id); break; @@ -129,7 +168,8 @@ ACL.prototype.set_allow = function(itemid){ ACL.prototype.set_deny = function(itemid){ type = itemid[0]; - id = parseInt(itemid.substr(1)); + id = parseInt(itemid.substr(1)); + switch(type){ case "g": if (that.deny_gid.indexOf(id)<0){ @@ -140,6 +180,7 @@ ACL.prototype.set_deny = function(itemid){ if (that.allow_gid.indexOf(id)>=0) that.allow_gid.remove(id); break; case "c": + if (that.data[id].forum=="1") that.remove_mention(id); if (that.deny_cid.indexOf(id)<0){ that.deny_cid.push(id) } else { @@ -151,9 +192,13 @@ ACL.prototype.set_deny = function(itemid){ that.update_view(); } +ACL.prototype.is_show_all = function() { + return (that.allow_gid.length==0 && that.allow_cid.length==0 && + that.deny_gid.length==0 && that.deny_cid.length==0); +} + ACL.prototype.update_view = function(){ - if (that.allow_gid.length==0 && that.allow_cid.length==0 && - that.deny_gid.length==0 && that.deny_cid.length==0){ + if (this.is_show_all()){ that.showall.addClass("selected"); /* jot acl */ $('#jot-perms-icon').removeClass('lock').addClass('unlock'); @@ -246,17 +291,20 @@ ACL.prototype.get = function(start,count, search){ ACL.prototype.populate = function(data){ var height = Math.ceil(data.tot / that.nw) * 42; that.list_content.height(height); + that.data = {}; $(data.items).each(function(){ - html = "