diff --git a/boot.php b/boot.php
index 1e8880306f..6794a1f9f5 100644
--- a/boot.php
+++ b/boot.php
@@ -9,6 +9,7 @@ require_once('include/pgettext.php');
require_once('include/nav.php');
require_once('include/cache.php');
require_once('library/Mobile_Detect/Mobile_Detect.php');
+require_once('include/features.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_VERSION', '3.0.1534' );
@@ -359,6 +360,7 @@ if(! class_exists('App')) {
public $category;
+
// Allow themes to control internal parameters
// by changing App values in theme.php
@@ -1232,7 +1234,7 @@ if(! function_exists('profile_sidebar')) {
// show edit profile to yourself
- if ($profile['uid'] == local_user()) {
+ if ($profile['uid'] == local_user() && feature_enabled(local_user(),'multi_profiles')) {
$profile['edit'] = array($a->get_baseurl(). '/profiles', t('Profiles'),"", t('Manage/edit profiles'));
$r = q("SELECT * FROM `profile` WHERE `uid` = %d",
diff --git a/include/contact_selectors.php b/include/contact_selectors.php
index 4b3ca987a6..7e2f81dffe 100644
--- a/include/contact_selectors.php
+++ b/include/contact_selectors.php
@@ -83,6 +83,8 @@ function network_to_name($s) {
NETWORK_LINKEDIN => t('LinkedIn'),
NETWORK_XMPP => t('XMPP/IM'),
NETWORK_MYSPACE => t('MySpace'),
+ NETWORK_MAIL2 => t('Email'),
+ NETWORK_GPLUS => t('Google+')
);
call_hooks('network_to_name', $nets);
diff --git a/include/contact_widgets.php b/include/contact_widgets.php
index ea71b3b707..9401adccad 100644
--- a/include/contact_widgets.php
+++ b/include/contact_widgets.php
@@ -47,6 +47,8 @@ function networks_widget($baseurl,$selected = '') {
if(! local_user())
return '';
+ if(! feature_enabled(local_user(),'networks'))
+ return '';
$r = q("select distinct(network) from contact where uid = %d and self = 0",
intval(local_user())
@@ -80,6 +82,9 @@ function fileas_widget($baseurl,$selected = '') {
if(! local_user())
return '';
+ if(! feature_enabled(local_user(),'filing'))
+ return '';
+
$saved = get_pconfig(local_user(),'system','filetags');
if(! strlen($saved))
return;
@@ -106,8 +111,12 @@ function fileas_widget($baseurl,$selected = '') {
}
function categories_widget($baseurl,$selected = '') {
+
$a = get_app();
+ if(! feature_enabled($a->profile['profile_uid'],'categories'))
+ return '';
+
$saved = get_pconfig($a->profile['profile_uid'],'system','filetags');
if(! strlen($saved))
return;
@@ -196,4 +205,4 @@ function common_friends_visitor_widget($profile_uid) {
'$items' => $r
));
-};
\ No newline at end of file
+};
diff --git a/include/conversation.php b/include/conversation.php
index 1de77feb1b..e4f3ec9ff6 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -686,7 +686,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
'$mode' => $mode,
'$user' => $a->user,
'$threads' => $threads,
- '$dropping' => ($page_dropping?t('Delete Selected Items'):False),
+ '$dropping' => ($page_dropping && feature_enabled(local_user(),'multi_delete') ? t('Delete Selected Items') : False),
));
return $o;
@@ -887,9 +887,12 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
$geotag = (($x['allow_location']) ? get_markup_template('jot_geotag.tpl') : '');
- $plaintext = false;
- if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
- $plaintext = true;
+/* $plaintext = false;
+ if( local_user() && (intval(get_pconfig(local_user(),'system','plaintext')) || !feature_enabled(local_user(),'richtext')) )
+ $plaintext = true;*/
+ $plaintext = true;
+ if( local_user() && feature_enabled(local_user(),'richtext') )
+ $plaintext = false;
$tpl = get_markup_template('jot-header.tpl');
$a->page['htmlhead'] .= replace_macros($tpl, array(
@@ -958,7 +961,7 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
if($notes_cid)
$jotnets .= '';
- $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+// $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
$o .= replace_macros($tpl,array(
'$return_path' => $a->query_string,
@@ -981,7 +984,7 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
'$title' => "",
'$placeholdertitle' => t('Set title'),
'$category' => "",
- '$placeholdercategory' => t('Categories (comma-separated list)'),
+ '$placeholdercategory' => (feature_enabled(local_user(),'categories') ? t('Categories (comma-separated list)') : ''),
'$wait' => t('Please wait'),
'$permset' => t('Permission settings'),
'$shortpermset' => t('permissions'),
@@ -1000,7 +1003,8 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
'$acl' => $x['acl'],
'$bang' => $x['bang'],
'$profile_uid' => $x['profile_uid'],
- '$preview' => t('Preview'),
+ '$preview' => ((feature_enabled($x['profile_uid'],'preview')) ? t('Preview') : ''),
+ '$jotplugins' => $jotplugins,
'$sourceapp' => t($a->sourcename),
'$cancel' => t('Cancel'),
'$rand_num' => random_digits(12)
diff --git a/include/features.php b/include/features.php
new file mode 100644
index 0000000000..9decef49cd
--- /dev/null
+++ b/include/features.php
@@ -0,0 +1,67 @@
+ $uid, 'feature' => $feature, 'enabled' => $x);
+ call_hooks('feature_enabled',$arr);
+ return($arr['enabled']);
+}
+
+function get_features() {
+
+ $arr = array(
+
+ // General
+ 'general' => array(
+ 'General Features',
+ //array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')),
+ array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles')),
+ ),
+
+ // Post composition
+ 'composition' => array(
+ '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')),
+ ),
+
+ // Network sidebar widgets
+ 'widgets' => array(
+ 'Network Sidebar Widgets',
+ array('archives', t('Search by Date'), t('Ability to select posts by date ranges')),
+ array('groups', t('Group Filter'), t('Enable widget to display Network posts only from selected group')),
+ array('networks', t('Network Filter'), t('Enable widget to display Network posts only from selected network')),
+ array('savedsearch', t('Saved Searches'), t('Save search terms for re-use')),
+ ),
+
+ // Network tabs
+ 'net_tabs' => array(
+ 'Network Tabs',
+ array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on')),
+ array('new_tab', t('Network New Tab'), t('Enable tab to display only new Network posts (from the last 12 hours)')),
+ array('link_tab', t('Network Shared Links Tab'), t('Enable tab to display only Network posts with links in them')),
+ ),
+
+ // Item tools
+ 'tools' => array(
+ 'Post/Comment Tools',
+ array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once')),
+ array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending')),
+ array('commtag', t('Tagging'), t('Ability to tag existing posts')),
+ array('categories', t('Post Categories'), t('Add categories to your posts')),
+ array('filing', t('Saved Folders'), t('Ability to file posts under folders')),
+ array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments')),
+ array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator')),
+ ),
+ );
+
+ call_hooks('get_features',$arr);
+ return $arr;
+}
diff --git a/include/items.php b/include/items.php
index 95676ac056..fb7a7e25d1 100755
--- a/include/items.php
+++ b/include/items.php
@@ -4031,10 +4031,13 @@ function posted_dates($uid,$wall) {
function posted_date_widget($url,$uid,$wall) {
$o = '';
+ if(! feature_enabled($uid,'archives'))
+ return $o;
+
// For former Facebook folks that left because of "timeline"
- if($wall && intval(get_pconfig($uid,'system','no_wall_archive_widget')))
- return $o;
+/* if($wall && intval(get_pconfig($uid,'system','no_wall_archive_widget')))
+ return $o;*/
$ret = posted_dates($uid,$wall);
if(! count($ret))
diff --git a/include/nav.php b/include/nav.php
index e26cc8889a..3c058e04f6 100644
--- a/include/nav.php
+++ b/include/nav.php
@@ -111,6 +111,7 @@ function nav(&$a) {
if(local_user()) {
$nav['network'] = array('network', t('Network'), "", t('Conversations from your friends'));
+ $nav['net_reset'] = array('network/0?f=&order=comment&nets=all', t('Network Reset'), "", t('Load Network page with no filters'));
$nav['home'] = array('profile/' . $a->user['nickname'], t('Home'), "", t('Your posts and conversations'));
@@ -135,7 +136,9 @@ function nav(&$a) {
}
$nav['settings'] = array('settings', t('Settings'),"", t('Account settings'));
- $nav['profiles'] = array('profiles', t('Profiles'),"", t('Manage/edit profiles'));
+ if(feature_enabled(local_user(),'multi_profiles'))
+ $nav['profiles'] = array('profiles', t('Profiles'),"", t('Manage/Edit Profiles'));
+
$nav['contacts'] = array('contacts', t('Contacts'),"", t('Manage/edit friends and contacts'));
}
diff --git a/mod/editpost.php b/mod/editpost.php
index 1dc6aea21e..d6539e1078 100644
--- a/mod/editpost.php
+++ b/mod/editpost.php
@@ -28,9 +28,12 @@ function editpost_content(&$a) {
return;
}
- $plaintext = false;
- if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
- $plaintext = true;
+/* $plaintext = false;
+ if( local_user() && intval(get_pconfig(local_user(),'system','plaintext')) || !feature_enabled(local_user(),'richtext') )
+ $plaintext = true;*/
+ $plaintext = true;
+ if( local_user() && feature_enabled(local_user(),'richtext') )
+ $plaintext = false;
$o .= '
' . t('Edit post') . '
';
@@ -130,7 +133,7 @@ function editpost_content(&$a) {
'$title' => $itm[0]['title'],
'$placeholdertitle' => t('Set title'),
'$category' => file_tag_file_to_list($itm[0]['file'], 'category'),
- '$placeholdercategory' => t('Categories (comma-separated list)'),
+ '$placeholdercategory' => (feature_enabled(local_user(),'categories') ? t('Categories (comma-separated list)') : ''),
'$emtitle' => t('Example: bob@example.com, mary@example.com'),
'$lockstate' => $lockstate,
'$acl' => '', // populate_acl((($group) ? $group_acl : $a->user), $celeb),
diff --git a/mod/item.php b/mod/item.php
index 6bd856b96d..2ed1b812a4 100644
--- a/mod/item.php
+++ b/mod/item.php
@@ -309,7 +309,11 @@ function item_post(&$a) {
// First figure out if it's a status post that would've been
// created using tinymce. Otherwise leave it alone.
- $plaintext = (local_user() ? intval(get_pconfig(local_user(),'system','plaintext')) : 0);
+/* $plaintext = (local_user() ? intval(get_pconfig(local_user(),'system','plaintext')) || !feature_enabled($profile_uid,'richtext') : 0);
+ if((! $parent) && (! $api_source) && (! $plaintext)) {
+ $body = fix_mce_lf($body);
+ }*/
+ $plaintext = (local_user() ? !feature_enabled($profile_uid,'richtext') : 0);
if((! $parent) && (! $api_source) && (! $plaintext)) {
$body = fix_mce_lf($body);
}
diff --git a/mod/message.php b/mod/message.php
index 97c6586320..744a3eb3f7 100644
--- a/mod/message.php
+++ b/mod/message.php
@@ -46,7 +46,11 @@ function message_post(&$a) {
// Work around doubled linefeeds in Tinymce 3.5b2
- $plaintext = intval(get_pconfig(local_user(),'system','plaintext'));
+/* $plaintext = intval(get_pconfig(local_user(),'system','plaintext') && !feature_enabled(local_user(),'richtext'));
+ if(! $plaintext) {
+ $body = fix_mce_lf($body);
+ }*/
+ $plaintext = intval(!feature_enabled(local_user(),'richtext'));
if(! $plaintext) {
$body = fix_mce_lf($body);
}
@@ -229,9 +233,12 @@ function message_content(&$a) {
$o .= $header;
- $plaintext = false;
+/* $plaintext = false;
if(intval(get_pconfig(local_user(),'system','plaintext')))
- $plaintext = true;
+ $plaintext = true;*/
+ $plaintext = true;
+ if( local_user() && feature_enabled(local_user(),'richtext') )
+ $plaintext = false;
$tpl = get_markup_template('msg-header.tpl');
diff --git a/mod/network.php b/mod/network.php
index bbdd0130d7..2ab5b6de35 100644
--- a/mod/network.php
+++ b/mod/network.php
@@ -181,7 +181,7 @@ function network_init(&$a) {
$a->page['content'] .= '' . t('Search Results For:') . ' ' . $search . '
';
}
- $a->page['aside'] .= group_side('network/0','network',true,$group_id);
+ $a->page['aside'] .= (feature_enabled(local_user(),'groups') ? group_side('network/0','network',true,$group_id) : '');
$a->page['aside'] .= posted_date_widget($a->get_baseurl() . '/network',local_user(),false);
$a->page['aside'] .= networks_widget($a->get_baseurl(true) . '/network',(x($_GET, 'nets') ? $_GET['nets'] : ''));
$a->page['aside'] .= saved_searches($search);
@@ -191,6 +191,9 @@ function network_init(&$a) {
function saved_searches($search) {
+ if(! feature_enabled(local_user(),'savedsearch'))
+ return '';
+
$a = get_app();
$srchurl = '/network?f='
@@ -403,30 +406,30 @@ function network_content(&$a, $update = 0) {
'title' => t('Sort by Post Date'),
),
- array(
+/* array(
'label' => t('Personal'),
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&conv=1',
'sel' => $conv_active,
'title' => t('Posts that mention or involve you'),
- ),
- array(
+ ),*/
+/* array(
'label' => t('New'),
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ($len_naked_cmd ? '/' : '') . 'new' . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : ''),
'sel' => $new_active,
'title' => t('Activity Stream - by date'),
- ),
- array(
+ ),*/
+/* array(
'label' => t('Starred'),
'url'=>$a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&star=1',
'sel'=>$starred_active,
'title' => t('Favourite Posts'),
- ),
- array(
+ ),*/
+/* array(
'label' => t('Shared Links'),
'url'=>$a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&bmark=1',
'sel'=>$bookmarked_active,
'title'=> t('Interesting Links'),
- ),
+ ), */
// array(
// 'label' => t('Spam'),
// 'url'=>$a->get_baseurl(true) . '/network?f=&spam=1'
@@ -436,6 +439,53 @@ function network_content(&$a, $update = 0) {
);
+ if(feature_enabled(local_user(),'personal_tab')) {
+ $tabs[] = array(
+ 'label' => t('Personal'),
+ 'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&conv=1',
+ 'sel' => $conv_active,
+ 'title' => t('Posts that mention or involve you'),
+ );
+ }
+
+ if(feature_enabled(local_user(),'new_tab')) {
+ $tabs[] = array(
+ 'label' => t('New'),
+ 'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ($len_naked_cmd ? '/' : '') . 'new' . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : ''),
+ 'sel' => $new_active,
+ 'title' => t('Activity Stream - by date'),
+ );
+ }
+
+ if(feature_enabled(local_user(),'link_tab')) {
+ $tabs[] = array(
+ 'label' => t('Shared Links'),
+ 'url'=>$a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&bmark=1',
+ 'sel'=>$bookmarked_active,
+ 'title'=> t('Interesting Links'),
+ );
+ }
+
+ if(feature_enabled(local_user(),'star_posts')) {
+ $tabs[] = array(
+ 'label' => t('Starred'),
+ 'url'=>$a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&star=1',
+ 'sel'=>$starred_active,
+ 'title' => t('Favourite Posts'),
+ );
+ }
+
+ // Not yet implemented
+
+/* if(feature_enabled(local_user(),'spam_filter')) {
+ $tabs[] = array(
+ 'label' => t('Spam'),
+ 'url'=>$a->get_baseurl(true) . '/network?f=&spam=1',
+ 'sel'=> $spam_active,
+ 'title' => t('Posts flagged as SPAM'),
+ );
+ }*/
+
// save selected tab, but only if not in search or file mode
if(!x($_GET,'search') && !x($_GET,'file')) {
set_pconfig( local_user(), 'network.view','tab.selected',array($all_active, $postord_active, $conv_active, $new_active, $starred_active, $bookmarked_active, $spam_active) );
diff --git a/mod/profiles.php b/mod/profiles.php
index 013e8e8200..e30c982182 100644
--- a/mod/profiles.php
+++ b/mod/profiles.php
@@ -554,9 +554,12 @@ function profiles_content(&$a) {
require_once('include/profile_selectors.php');
- $editselect = 'textareas';
- if(intval(get_pconfig(local_user(),'system','plaintext')))
- $editselect = 'none';
+/* $editselect = 'textareas';
+ if( intval(get_pconfig(local_user(),'system','plaintext')) || !feature_enabled(local_user(),'richtext') )
+ $editselect = 'none';*/
+ $editselect = 'none';
+ if( feature_enabled(local_user(),'richtext') )
+ $editselect = 'textareas';
$a->page['htmlhead'] .= replace_macros(get_markup_template('profed_head.tpl'), array(
'$baseurl' => $a->get_baseurl(true),
diff --git a/mod/search.php b/mod/search.php
index ac848a0cec..d572750986 100644
--- a/mod/search.php
+++ b/mod/search.php
@@ -4,6 +4,9 @@ function search_saved_searches() {
$o = '';
+ if(! feature_enabled(local_user(),'savedsearch'))
+ return $o;
+
$r = q("select `id`,`term` from `search` WHERE `uid` = %d",
intval(local_user())
);
diff --git a/mod/settings.php b/mod/settings.php
index bd5e81e2e9..1e464de18c 100644
--- a/mod/settings.php
+++ b/mod/settings.php
@@ -31,6 +31,11 @@ function settings_init(&$a) {
'url' => $a->get_baseurl(true).'/settings',
'selected' => (($a->argc == 1)?'active':''),
),
+ array(
+ 'label' => t('Additional features'),
+ 'url' => $a->get_baseurl(true).'/settings/features',
+ 'selected' => (($a->argc > 1) && ($a->argv[1] === 'features') ? 'active' : ''),
+ ),
array(
'label' => t('Display settings'),
'url' => $a->get_baseurl(true).'/settings/display',
@@ -231,7 +236,18 @@ function settings_post(&$a) {
return;
}
- if(($a->argc > 1) && ($a->argv[1] == 'display')) {
+ if(($a->argc > 1) && ($a->argv[1] === 'features')) {
+ check_form_security_token_redirectOnErr('/settings/features', 'settings_features');
+ foreach($_POST as $k => $v) {
+ if(strpos($k,'feature_') === 0) {
+ set_pconfig(local_user(),'feature',substr($k,8),((intval($v)) ? 1 : 0));
+ }
+ }
+ info( t('Features updated') . EOL);
+ return;
+ }
+
+ if(($a->argc > 1) && ($a->argv[1] === 'display')) {
check_form_security_token_redirectOnErr('/settings/display', 'settings_display');
@@ -612,6 +628,7 @@ function settings_content(&$a) {
return $o;
}
+
if(($a->argc > 1) && ($a->argv[1] === 'addon')) {
$settings_addons = "";
@@ -631,6 +648,30 @@ function settings_content(&$a) {
return $o;
}
+ if(($a->argc > 1) && ($a->argv[1] === 'features')) {
+
+ $arr = array();
+ $features = get_features();
+ foreach($features as $fname => $fdata) {
+ $arr[$fname] = array();
+ $arr[$fname][0] = $fdata[0];
+ foreach(array_slice($fdata,1) as $f) {
+ $arr[$fname][1][] = array('feature_' .$f[0],$f[1],((intval(get_pconfig(local_user(),'feature',$f[0]))) ? "1" : ''),$f[2],array(t('Off'),t('On')));
+ }
+ }
+
+
+ $tpl = get_markup_template("settings_features.tpl");
+ $o .= replace_macros($tpl, array(
+ '$form_security_token' => get_form_security_token("settings_features"),
+ '$title' => t('Additional Features'),
+ '$features' => $arr,
+ '$submit' => t('Submit'),
+ '$field_yesno' => 'field_yesno.tpl',
+ ));
+ return $o;
+ }
+
if(($a->argc > 1) && ($a->argv[1] === 'connectors')) {
$settings_connectors = "";
diff --git a/object/Item.php b/object/Item.php
index 2799291111..9cc9fe15a6 100644
--- a/object/Item.php
+++ b/object/Item.php
@@ -113,7 +113,7 @@ class Item extends BaseObject {
$drop = array(
'dropping' => $dropping,
- 'pagedrop' => $item['pagedrop'],
+ 'pagedrop' => ((feature_enabled($conv->get_profile_owner(),'multi_delete')) ? $item['pagedrop'] : ''),
'select' => t('Select'),
'delete' => t('Delete'),
);
@@ -184,9 +184,14 @@ class Item extends BaseObject {
'classdo' => (($item['starred']) ? "hidden" : ""),
'classundo' => (($item['starred']) ? "" : "hidden"),
'starred' => t('starred'),
- 'tagger' => t("add tag"),
- 'classtagger' => "",
);
+ $tagger = '';
+ if(feature_enabled($conv->get_profile_owner(),'commtag')) {
+ $tagger = array(
+ 'add' => t("add tag"),
+ 'class' => "",
+ );
+ }
}
} else {
$indent = 'comment';
@@ -195,7 +200,7 @@ class Item extends BaseObject {
if($conv->is_writable()) {
$buttons = array(
'like' => array( t("I like this \x28toggle\x29"), t("like")),
- 'dislike' => array( t("I don't like this \x28toggle\x29"), t("dislike")),
+ 'dislike' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? array( t("I don't like this \x28toggle\x29"), t("dislike")) : ''),
);
if ($shareable) $buttons['share'] = array( t('Share this'), t('share'));
}
@@ -249,14 +254,15 @@ class Item extends BaseObject {
'owner_photo' => $this->get_owner_photo(),
'owner_name' => template_escape($this->get_owner_name()),
'plink' => get_plink($item),
- 'edpost' => $edpost,
+ 'edpost' => ((feature_enabled($conv->get_profile_owner(),'edit_posts')) ? $edpost : ''),
'isstarred' => $isstarred,
- 'star' => $star,
- 'filer' => $filer,
+ 'star' => ((feature_enabled($conv->get_profile_owner(),'star_posts')) ? $star : ''),
+ 'tagger' => $tagger,
+ 'filer' => ((feature_enabled($conv->get_profile_owner(),'filing')) ? $filer : ''),
'drop' => $drop,
'vote' => $buttons,
'like' => $like,
- 'dislike' => $dislike,
+ 'dislike' => $dislike,
'switchcomment' => t('Comment'),
'comment' => $this->get_comment_box($indent),
'previewing' => ($conv->is_preview() ? ' preview ' : ''),
@@ -570,7 +576,7 @@ class Item extends BaseObject {
'$edimg' => t('Image'),
'$edurl' => t('Link'),
'$edvideo' => t('Video'),
- '$preview' => t('Preview'),
+ '$preview' => ((feature_enabled($conv->get_profile_owner(),'preview')) ? t('Preview') : ''),
'$indent' => $indent,
'$sourceapp' => t($a->sourcename),
'$ww' => (($conv->get_mode() === 'network') ? $ww : ''),
diff --git a/view/jot.tpl b/view/jot.tpl
index 0f21766812..61d7273070 100644
--- a/view/jot.tpl
+++ b/view/jot.tpl
@@ -16,7 +16,9 @@
+ {{ if $placeholdercategory }}
+ {{ endif }}
diff --git a/view/settings_features.tpl b/view/settings_features.tpl
new file mode 100644
index 0000000000..4065d8fc77
--- /dev/null
+++ b/view/settings_features.tpl
@@ -0,0 +1,20 @@
+
$title
+
+
+
+
diff --git a/view/theme/diabook/jot.tpl b/view/theme/diabook/jot.tpl
index 1d94cb6d3c..bd2cb30e80 100644
--- a/view/theme/diabook/jot.tpl
+++ b/view/theme/diabook/jot.tpl
@@ -14,7 +14,9 @@
+ {{ if $placeholdercategory }}
+ {{ endif }}
diff --git a/view/theme/diabook/wall_thread.tpl b/view/theme/diabook/wall_thread.tpl
index 70c8f1d9b4..21e0c747b9 100644
--- a/view/theme/diabook/wall_thread.tpl
+++ b/view/theme/diabook/wall_thread.tpl
@@ -100,7 +100,9 @@
{{ if $item.vote }}
$item.vote.like.1
+ {{ if $item.vote.dislike }}
+ {{ endif }}
{{ endif }}
{{ if $item.vote.share }}
@@ -111,7 +113,10 @@
{{ if $item.star }}
-
+ {{ endif }}
+
+ {{ if $item.tagger }}
+
{{ endif }}
{{ if $item.filer }}
diff --git a/view/theme/dispy/jot.tpl b/view/theme/dispy/jot.tpl
index 5809044859..193872f182 100644
--- a/view/theme/dispy/jot.tpl
+++ b/view/theme/dispy/jot.tpl
@@ -12,7 +12,9 @@
+ {{ if $placeholdercategory }}
+ {{ endif }}
diff --git a/view/theme/dispy/wall_thread.tpl b/view/theme/dispy/wall_thread.tpl
index 44517fabce..3524c95684 100644
--- a/view/theme/dispy/wall_thread.tpl
+++ b/view/theme/dispy/wall_thread.tpl
@@ -49,13 +49,19 @@
{{ if $item.star }}
-
+
+ {{ endif }}
+ {{ if $item.tagger }}
+
+
{{ endif }}
{{ if $item.vote }}
+ {{ if $item.vote.dislike }}
+ {{ endif }}
{{ if $item.vote.share }}
{{ endif }}
diff --git a/view/theme/frost-mobile/jot.tpl b/view/theme/frost-mobile/jot.tpl
index 7dd6893783..d8dd44990a 100644
--- a/view/theme/frost-mobile/jot.tpl
+++ b/view/theme/frost-mobile/jot.tpl
@@ -17,7 +17,9 @@
+ {{ if $placeholdercategory }}
+ {{ endif }}
diff --git a/view/theme/frost-mobile/nav.tpl b/view/theme/frost-mobile/nav.tpl
index 38f78c5c76..8425640a70 100644
--- a/view/theme/frost-mobile/nav.tpl
+++ b/view/theme/frost-mobile/nav.tpl
@@ -117,6 +117,12 @@
{{ endif }}
+ {{ if $nav.network }}
+
+
+
+ {{ endif }}
+
{{ if $nav.home }}
$nav.home.1
diff --git a/view/theme/frost-mobile/style.css b/view/theme/frost-mobile/style.css
index b38fdceb87..9cf97e0a7a 100644
--- a/view/theme/frost-mobile/style.css
+++ b/view/theme/frost-mobile/style.css
@@ -278,6 +278,7 @@ nav .nav-link {
}
#network-menu-list {
+ width: 9em;
left: 3px;
}
@@ -2750,7 +2751,7 @@ aside input[type='text'] {
margin-left: 100px;
margin-bottom: 20px;
}
-.settings-submit, .profile-edit-submit-button {
+.settings-submit, .profile-edit-submit-button, .settings-features-submit {
padding: 0.25em 0.5em;
margin-bottom: 10px;
font-size: 18px;
@@ -3420,7 +3421,7 @@ aside input[type='text'] {
display: block;
margin-left: 20px;
color: #666666;
-
+ clear: left;
}
@@ -3457,7 +3458,7 @@ aside input[type='text'] {
}
.hidden { display: none!important; }
-.field.radio .field_help { clear: left; margin-left: 20px; }
+.field.radio .field_help { margin-left: 20px; }
/**
* ADMIN
diff --git a/view/theme/frost-mobile/wall_thread.tpl b/view/theme/frost-mobile/wall_thread.tpl
index dec5a7183c..2b3b3d42d8 100644
--- a/view/theme/frost-mobile/wall_thread.tpl
+++ b/view/theme/frost-mobile/wall_thread.tpl
@@ -67,7 +67,9 @@
{{ if $item.vote }}
@@ -81,7 +83,9 @@
{{ if $item.star }}
-
+ {{ endif }}
+ {{ if $item.tagger }}
+
{{ endif }}
{{ if $item.filer }}
diff --git a/view/theme/frost/images/net-reset.png b/view/theme/frost/images/net-reset.png
new file mode 100644
index 0000000000..8ea1afc5f3
Binary files /dev/null and b/view/theme/frost/images/net-reset.png differ
diff --git a/view/theme/frost/jot.tpl b/view/theme/frost/jot.tpl
index 9f7b71c531..48187b4430 100644
--- a/view/theme/frost/jot.tpl
+++ b/view/theme/frost/jot.tpl
@@ -16,7 +16,9 @@
+ {{ if $placeholdercategory }}
+ {{ endif }}
diff --git a/view/theme/frost/nav.tpl b/view/theme/frost/nav.tpl
index 1e14b1e722..e25f9a1219 100644
--- a/view/theme/frost/nav.tpl
+++ b/view/theme/frost/nav.tpl
@@ -130,6 +130,14 @@
+ {{ if $nav.network }}
+
+ {{ endif }}
+
$banner
diff --git a/view/theme/frost/style.css b/view/theme/frost/style.css
index 4878e25310..58c960d733 100644
--- a/view/theme/frost/style.css
+++ b/view/theme/frost/style.css
@@ -3204,6 +3204,9 @@ aside input[type='text'] {
float: left;
width: 200px;
}
+.field.yesno label {
+ font-weight: 700;
+}
.field input,
.field textarea {
diff --git a/view/theme/frost/wall_thread.tpl b/view/theme/frost/wall_thread.tpl
index e82657583f..b8e77d7fa8 100644
--- a/view/theme/frost/wall_thread.tpl
+++ b/view/theme/frost/wall_thread.tpl
@@ -66,7 +66,9 @@
{{ if $item.vote }}
@@ -80,7 +82,9 @@
{{ if $item.star }}
-
+ {{ endif }}
+ {{ if $item.tagger }}
+
{{ endif }}
{{ if $item.filer }}
diff --git a/view/theme/quattro/jot.tpl b/view/theme/quattro/jot.tpl
index 55fc322d74..55de92d08f 100644
--- a/view/theme/quattro/jot.tpl
+++ b/view/theme/quattro/jot.tpl
@@ -1,7 +1,10 @@