mirror of
https://codeberg.org/streams/streams.git
synced 2024-09-21 19:55:16 +00:00
Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge
This commit is contained in:
commit
75471ba10f
12 changed files with 426 additions and 21 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -19,10 +19,11 @@
|
|||
Thumbs.db
|
||||
|
||||
|
||||
## Ignore RedMatrix site specific files and folders
|
||||
## Ignore site specific files and folders
|
||||
.htconfig.php
|
||||
favicon.*
|
||||
addon/
|
||||
widget/
|
||||
custom/
|
||||
/store/
|
||||
# site apps
|
||||
|
|
|
@ -69,6 +69,8 @@ class Cal extends \Zotlabs\Web\Controller {
|
|||
notice( t('Permissions denied.') . EOL);
|
||||
return;
|
||||
}
|
||||
|
||||
nav_set_selected('Calendar');
|
||||
|
||||
$sql_extra = permissions_sql($channel['channel_id'],get_observer_hash(),'event');
|
||||
|
||||
|
|
267
Zotlabs/Module/Defperms.php
Normal file
267
Zotlabs/Module/Defperms.php
Normal file
|
@ -0,0 +1,267 @@
|
|||
<?php
|
||||
namespace Zotlabs\Module;
|
||||
|
||||
|
||||
require_once('include/socgraph.php');
|
||||
require_once('include/selectors.php');
|
||||
require_once('include/group.php');
|
||||
require_once('include/photos.php');
|
||||
|
||||
|
||||
class Defperms extends \Zotlabs\Web\Controller {
|
||||
|
||||
/* @brief Initialize the connection-editor
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
function init() {
|
||||
|
||||
if(! local_channel())
|
||||
return;
|
||||
|
||||
$r = q("SELECT abook.*, xchan.*
|
||||
FROM abook left join xchan on abook_xchan = xchan_hash
|
||||
WHERE abook_self = 1 and abook_id = %d LIMIT 1",
|
||||
intval(local_channel())
|
||||
);
|
||||
if($r) {
|
||||
\App::$poi = $r[0];
|
||||
}
|
||||
|
||||
$channel = \App::get_channel();
|
||||
if($channel)
|
||||
head_set_icon($channel['xchan_photo_s']);
|
||||
}
|
||||
|
||||
|
||||
/* @brief Evaluate posted values and set changes
|
||||
*
|
||||
*/
|
||||
|
||||
function post() {
|
||||
|
||||
if(! local_channel())
|
||||
return;
|
||||
|
||||
$contact_id = intval(argv(1));
|
||||
if(! $contact_id)
|
||||
return;
|
||||
|
||||
$channel = \App::get_channel();
|
||||
|
||||
$orig_record = q("SELECT * FROM abook WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
|
||||
intval($contact_id),
|
||||
intval(local_channel())
|
||||
);
|
||||
|
||||
if(! $orig_record) {
|
||||
notice( t('Could not access contact record.') . EOL);
|
||||
goaway(z_root() . '/connections');
|
||||
return; // NOTREACHED
|
||||
}
|
||||
|
||||
|
||||
if(intval($orig_record[0]['abook_self'])) {
|
||||
$autoperms = intval($_POST['autoperms']);
|
||||
$is_self = true;
|
||||
}
|
||||
else {
|
||||
$autoperms = null;
|
||||
$is_self = false;
|
||||
}
|
||||
|
||||
|
||||
$all_perms = \Zotlabs\Access\Permissions::Perms();
|
||||
|
||||
if($all_perms) {
|
||||
foreach($all_perms as $perm => $desc) {
|
||||
|
||||
$checkinherited = \Zotlabs\Access\PermissionLimits::Get(local_channel(),$perm);
|
||||
$inherited = (($checkinherited & PERMS_SPECIFIC) ? false : true);
|
||||
|
||||
if(array_key_exists('perms_' . $perm, $_POST)) {
|
||||
set_abconfig($channel['channel_id'],$orig_record[0]['abook_xchan'],'my_perms',$perm,
|
||||
intval($_POST['perms_' . $perm]));
|
||||
if($autoperms) {
|
||||
set_pconfig($channel['channel_id'],'autoperms',$perm,intval($_POST['perms_' . $perm]));
|
||||
}
|
||||
}
|
||||
else {
|
||||
set_abconfig($channel['channel_id'],$orig_record[0]['abook_xchan'],'my_perms',$perm,0);
|
||||
if($autoperms) {
|
||||
set_pconfig($channel['channel_id'],'autoperms',$perm,0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(! is_null($autoperms))
|
||||
set_pconfig($channel['channel_id'],'system','autoperms',$autoperms);
|
||||
|
||||
|
||||
notice( t('Settings updated.') . EOL);
|
||||
|
||||
|
||||
// Refresh the structure in memory with the new data
|
||||
|
||||
$r = q("SELECT abook.*, xchan.*
|
||||
FROM abook left join xchan on abook_xchan = xchan_hash
|
||||
WHERE abook_channel = %d and abook_id = %d LIMIT 1",
|
||||
intval(local_channel()),
|
||||
intval($contact_id)
|
||||
);
|
||||
if($r) {
|
||||
\App::$poi = $r[0];
|
||||
}
|
||||
|
||||
|
||||
$this->defperms_clone($a);
|
||||
|
||||
goaway(z_root() . '/defperms');
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
/* @brief Clone connection
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
function defperms_clone(&$a) {
|
||||
|
||||
if(! \App::$poi)
|
||||
return;
|
||||
|
||||
$channel = \App::get_channel();
|
||||
|
||||
$r = q("SELECT abook.*, xchan.*
|
||||
FROM abook left join xchan on abook_xchan = xchan_hash
|
||||
WHERE abook_channel = %d and abook_id = %d LIMIT 1",
|
||||
intval(local_channel()),
|
||||
intval(\App::$poi['abook_id'])
|
||||
);
|
||||
if($r) {
|
||||
\App::$poi = array_shift($r);
|
||||
}
|
||||
|
||||
$clone = \App::$poi;
|
||||
|
||||
unset($clone['abook_id']);
|
||||
unset($clone['abook_account']);
|
||||
unset($clone['abook_channel']);
|
||||
|
||||
$abconfig = load_abconfig($channel['channel_id'],$clone['abook_xchan']);
|
||||
if($abconfig)
|
||||
$clone['abconfig'] = $abconfig;
|
||||
|
||||
build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone)));
|
||||
}
|
||||
|
||||
/* @brief Generate content of connection default permissions page
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
function get() {
|
||||
|
||||
$sort_type = 0;
|
||||
$o = '';
|
||||
|
||||
if(! local_channel()) {
|
||||
notice( t('Permission denied.') . EOL);
|
||||
return login();
|
||||
}
|
||||
|
||||
$section = ((array_key_exists('section',$_REQUEST)) ? $_REQUEST['section'] : '');
|
||||
$channel = \App::get_channel();
|
||||
|
||||
$yes_no = array(t('No'),t('Yes'));
|
||||
|
||||
$connect_perms = \Zotlabs\Access\Permissions::connect_perms(local_channel());
|
||||
|
||||
$o .= "<script>function connectDefaultShare() {
|
||||
\$('.abook-edit-me').each(function() {
|
||||
if(! $(this).is(':disabled'))
|
||||
$(this).prop('checked', false);
|
||||
});\n\n";
|
||||
foreach($connect_perms['perms'] as $p => $v) {
|
||||
if($v) {
|
||||
$o .= "\$('#me_id_perms_" . $p . "').prop('checked', true); \n";
|
||||
}
|
||||
}
|
||||
$o .= " }\n</script>\n";
|
||||
|
||||
if(\App::$poi) {
|
||||
|
||||
$sections = [];
|
||||
|
||||
$self = false;
|
||||
|
||||
$tpl = get_markup_template('defperms.tpl');
|
||||
|
||||
|
||||
$perms = array();
|
||||
$channel = \App::get_channel();
|
||||
|
||||
$contact = \App::$poi;
|
||||
|
||||
$global_perms = \Zotlabs\Access\Permissions::Perms();
|
||||
|
||||
$existing = get_all_perms(local_channel(),$contact['abook_xchan']);
|
||||
$hidden_perms = [];
|
||||
|
||||
foreach($global_perms as $k => $v) {
|
||||
$thisperm = get_abconfig(local_channel(),$contact['abook_xchan'],'my_perms',$k);
|
||||
|
||||
$checkinherited = \Zotlabs\Access\PermissionLimits::Get(local_channel(),$k);
|
||||
|
||||
$inherited = (($checkinherited & PERMS_SPECIFIC) ? false : true);
|
||||
|
||||
$perms[] = [ 'perms_' . $k, $v, intval($thisperm), '', $yes_no, (($inherited) ? ' disabled="disabled" ' : '') ];
|
||||
if($inherited) {
|
||||
$hidden_perms[] = [ 'perms_' . $k, intval($thisperm) ];
|
||||
}
|
||||
}
|
||||
|
||||
$pcat = new \Zotlabs\Lib\Permcat(local_channel());
|
||||
$pcatlist = $pcat->listing();
|
||||
$permcats = [];
|
||||
if($pcatlist) {
|
||||
foreach($pcatlist as $pc) {
|
||||
$permcats[$pc['name']] = $pc['localname'];
|
||||
}
|
||||
}
|
||||
|
||||
$o .= replace_macros($tpl, [
|
||||
'$header' => t('Connection Default Permissions'),
|
||||
'$autoperms' => array('autoperms',t('Apply these permissions automatically'), ((get_pconfig(local_channel(),'system','autoperms')) ? 1 : 0), t('If enabled, connection requests will be approved without your interaction'), $yes_no),
|
||||
'$permcat' => [ 'permcat', t('Permission role'), '', '',$permcats ],
|
||||
'$permcat_new' => t('Add permission role'),
|
||||
'$permcat_enable' => feature_enabled(local_channel(),'permcats'),
|
||||
'$section' => $section,
|
||||
'$sections' => $sections,
|
||||
'$autolbl' => t('The permissions indicated on this page will be applied to all new connections.'),
|
||||
'$autoapprove' => t('Automatic approval settings'),
|
||||
'$unapproved' => $unapproved,
|
||||
'$inherited' => t('inherited'),
|
||||
'$submit' => t('Submit'),
|
||||
'$me' => t('My Settings'),
|
||||
'$perms' => $perms,
|
||||
'$hidden_perms' => $hidden_perms,
|
||||
'$permlbl' => t('Individual Permissions'),
|
||||
'$permnote_self' => t('Some individual permissions may have been preset or locked based on your channel type and privacy settings.'),
|
||||
'$contact_id' => $contact['abook_id'],
|
||||
'$name' => $contact['xchan_name'],
|
||||
]);
|
||||
|
||||
$arr = array('contact' => $contact,'output' => $o);
|
||||
|
||||
call_hooks('contact_edit', $arr);
|
||||
|
||||
return $arr['output'];
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -107,7 +107,7 @@ class Settings_menu {
|
|||
if($role === false || $role === 'custom') {
|
||||
$tabs[] = array(
|
||||
'label' => t('Connection Default Permissions'),
|
||||
'url' => z_root() . '/connedit/' . $abook_self_id,
|
||||
'url' => z_root() . '/defperms',
|
||||
'selected' => ''
|
||||
);
|
||||
}
|
||||
|
|
|
@ -27,6 +27,8 @@ function nav($template = 'default') {
|
|||
</script>
|
||||
EOT;
|
||||
|
||||
$is_owner = (((local_channel()) && ((App::$profile_uid == local_channel()) || (App::$profile_uid == 0))) ? true : false);
|
||||
|
||||
if(local_channel()) {
|
||||
$channel = App::get_channel();
|
||||
$observer = App::get_observer();
|
||||
|
@ -39,17 +41,17 @@ EOT;
|
|||
intval(get_account_id())
|
||||
);
|
||||
}
|
||||
$sitelocation = (($is_owner) ? '' : App::$profile['reddress']);
|
||||
}
|
||||
elseif(remote_channel())
|
||||
elseif(remote_channel()) {
|
||||
$observer = App::get_observer();
|
||||
$sitelocation = ((App::$profile['reddress']) ? App::$profile['reddress'] : '@' . App::get_hostname());
|
||||
}
|
||||
|
||||
require_once('include/conversation.php');
|
||||
$is_owner = (((local_channel()) && ((App::$profile_uid == local_channel()) || (App::$profile_uid == 0))) ? true : false);
|
||||
|
||||
$channel_apps[] = channel_apps($is_owner, App::$profile['channel_address']);
|
||||
|
||||
$myident = (($channel) ? $channel['xchan_addr'] : '');
|
||||
|
||||
$sitelocation = (($myident) ? $myident : App::get_hostname());
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -438,10 +440,10 @@ function channel_apps($is_owner = false, $nickname = null) {
|
|||
|
||||
if($p['view_stream'] && $cal_link) {
|
||||
$tabs[] = [
|
||||
'label' => t('Events'),
|
||||
'label' => t('Calendar'),
|
||||
'url' => z_root() . $cal_link,
|
||||
'sel' => ((argv(0) == 'cal' || argv(0) == 'events') ? 'active' : ''),
|
||||
'title' => t('Events'),
|
||||
'sel' => ((argv(0) == 'cal') ? 'active' : ''),
|
||||
'title' => t('Calendar'),
|
||||
'id' => 'event-tab',
|
||||
'icon' => 'calendar'
|
||||
];
|
||||
|
|
2
view/css/bootstrap-red.css
vendored
2
view/css/bootstrap-red.css
vendored
|
@ -19,7 +19,6 @@ nav .dropdown-menu {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
.navbar {
|
||||
padding: .5rem 7px;
|
||||
|
@ -41,6 +40,7 @@ nav .dropdown-menu {
|
|||
|
||||
.navbar-toggler-right {
|
||||
padding: 0.2rem 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#navbar-collapse-1 i {
|
||||
|
|
|
@ -32,7 +32,12 @@ function handle_comment_form(e) {
|
|||
var fields_empty = true;
|
||||
|
||||
if(form.find('.comment-edit-text').length) {
|
||||
form.find('.comment-edit-text').addClass('expanded').removeAttr('placeholder');
|
||||
var commentElm = form.find('.comment-edit-text').attr('id');
|
||||
var submitElm = commentElm.replace(/text/,'submit');
|
||||
|
||||
$('#' + commentElm).addClass('expanded').removeAttr('placeholder');
|
||||
$('#' + commentElm).attr('tabindex','9');
|
||||
$('#' + submitElm).attr('tabindex','10');
|
||||
form.find(':not(:visible)').show();
|
||||
}
|
||||
|
||||
|
@ -43,7 +48,12 @@ function handle_comment_form(e) {
|
|||
fields_empty = false;
|
||||
});
|
||||
if(fields_empty) {
|
||||
form.find('.comment-edit-text').removeClass('expanded').attr('placeholder', aStr.comment);
|
||||
var emptyCommentElm = form.find('.comment-edit-text').attr('id');
|
||||
var emptySubmitElm = commentElm.replace(/text/,'submit');
|
||||
|
||||
$('#' + emptyCommentElm).removeClass('expanded').attr('placeholder', aStr.comment);
|
||||
$('#' + emptyCommentElm).removeAttr('tabindex');
|
||||
$('#' + emptySubmitElm).removeAttr('tabindex');
|
||||
form.find(':not(.comment-edit-text)').hide();
|
||||
}
|
||||
});
|
||||
|
|
32
view/js/mod_defperms.js
Normal file
32
view/js/mod_defperms.js
Normal file
|
@ -0,0 +1,32 @@
|
|||
$(document).ready(function() {
|
||||
|
||||
$('#id_permcat').change(function() {
|
||||
$('.loading-role-rotator').show();
|
||||
var permName = $('#id_permcat').val();
|
||||
loadConnectionRole(permName);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
function loadConnectionRole(name) {
|
||||
|
||||
if(! name)
|
||||
name = 'default';
|
||||
|
||||
$('.defperms-edit input').each(function() {
|
||||
if(! $(this).is(':disabled'))
|
||||
$(this).removeAttr('checked');
|
||||
});
|
||||
|
||||
$.get('permcat/' + name, function(data) {
|
||||
$(data.perms).each(function() {
|
||||
if(this.value)
|
||||
$('#id_perms_' + this.name).attr('checked','checked');
|
||||
});
|
||||
$('.loading-role-rotator').hide();
|
||||
});
|
||||
}
|
||||
|
||||
|
6
view/pdl/mod_defperms.pdl
Normal file
6
view/pdl/mod_defperms.pdl
Normal file
|
@ -0,0 +1,6 @@
|
|||
[region=aside]
|
||||
[widget=settings_menu][/widget]
|
||||
[/region]
|
||||
[region=right_aside]
|
||||
[widget=notifications][/widget]
|
||||
[/region]
|
|
@ -161,10 +161,6 @@ nav {
|
|||
filter:alpha(opacity=$nav_percent_min_opacity);
|
||||
}
|
||||
|
||||
#nav-app-link {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#powered-by {
|
||||
font-size: 0.5rem;
|
||||
position: absolute;
|
||||
|
@ -977,6 +973,11 @@ a .drop-icons:hover {
|
|||
color: #FF0000;
|
||||
}
|
||||
|
||||
.perm-inherited {
|
||||
color: #FF0000;
|
||||
}
|
||||
|
||||
|
||||
#menulist {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
@ -1255,6 +1256,12 @@ img.mail-conv-sender-photo {
|
|||
border-radius: $radius;
|
||||
}
|
||||
|
||||
#nav-app-link {
|
||||
padding: 0 !important;
|
||||
line-height: 1.175;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.page-title {
|
||||
margin: 7px 0px;
|
||||
}
|
||||
|
@ -1492,6 +1499,11 @@ blockquote {
|
|||
left: 0px;
|
||||
}
|
||||
|
||||
#nav-app-link-wrapper {
|
||||
min-width: 0;
|
||||
flex-basis: 25%;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.shareable_element_text {
|
||||
|
@ -1639,6 +1651,17 @@ dl.bb-dl > dd > li {
|
|||
background-color: #0275d8;
|
||||
}
|
||||
|
||||
|
||||
.form-group.checkbox > div > input:disabled + label .onoffswitch-switch {
|
||||
background-color: red;
|
||||
border-radius: 3px;
|
||||
opacity: 0.3;
|
||||
filter:alpha(opacity=30);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
.help-searchlist {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
|
55
view/tpl/defperms.tpl
Executable file
55
view/tpl/defperms.tpl
Executable file
|
@ -0,0 +1,55 @@
|
|||
<div class="generic-content-wrapper">
|
||||
<div class="section-title-wrapper">
|
||||
<h2>{{$header}}</h2>
|
||||
</div>
|
||||
<div class="section-content-wrapper-np">
|
||||
<form id="abook-edit-form" action="defperms/{{$contact_id}}" method="post" >
|
||||
|
||||
<input type="hidden" name="contact_id" value="{{$contact_id}}">
|
||||
<input type="hidden" name="section" value="{{$section}}">
|
||||
|
||||
<div class="panel-group" id="contact-edit-tools" role="tablist" aria-multiselectable="true">
|
||||
<div class="panel">
|
||||
<div id="perms-tool-collapse" class="panel-collapse collapse show" role="tabpanel" aria-labelledby="perms-tool">
|
||||
<div class="section-content-tools-wrapper">
|
||||
<div class="section-content-warning-wrapper">
|
||||
<p>{{$autolbl}}</p>
|
||||
<p>{{$permnote_self}}</p>
|
||||
</div>
|
||||
{{if $permcat_enable}}
|
||||
<div class="loading-role-rotator spinner-wrapper"></div>
|
||||
<a href="settings/permcats" class="pull-right"><i class="fa fa-plus"></i> {{$permcat_new}}</a>
|
||||
{{include file="field_select.tpl" field=$permcat}}
|
||||
{{/if}}
|
||||
|
||||
<div class="defperms-edit">
|
||||
{{foreach $perms as $prm}}
|
||||
{{include file="field_checkbox.tpl" field=$prm}}
|
||||
{{/foreach}}
|
||||
</div>
|
||||
|
||||
{{if $hidden_perms}}
|
||||
{{foreach $hidden_perms as $prm}}
|
||||
<input type="hidden" name="{{$prm.0}}" value="{{$prm.1}}" >
|
||||
{{/foreach}}
|
||||
{{/if}}
|
||||
|
||||
|
||||
|
||||
<div>
|
||||
<div class="section-content-info-wrapper">
|
||||
{{$autoapprove}}
|
||||
</div>
|
||||
{{include file="field_checkbox.tpl" field=$autoperms}}
|
||||
</div>
|
||||
|
||||
<div class="settings-submit-wrapper" >
|
||||
<button type="submit" name="done" value="{{$submit}}" class="btn btn-primary">{{$submit}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
|
@ -17,8 +17,8 @@
|
|||
</div>
|
||||
{{/if}}
|
||||
{{if $userinfo}}
|
||||
<div class="dropdown usermenu">
|
||||
<div class="fakelink" data-toggle="dropdown">
|
||||
<div class="dropdown">
|
||||
<div class="fakelink usermenu" data-toggle="dropdown">
|
||||
<img id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}">
|
||||
<i class="fa fa-caret-down"></i>
|
||||
</div>
|
||||
|
@ -59,10 +59,17 @@
|
|||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="navbar-nav mr-auto">
|
||||
<div><a id="nav-app-link" href="{{$url}}" class="nav-link">{{$sel.name}}</a></div>
|
||||
{{if $sel.name}}
|
||||
<div id="nav-app-link-wrapper" class="navbar-nav mr-auto">
|
||||
<a id="nav-app-link" href="{{$url}}" class="nav-link text-truncate">
|
||||
{{$sel.name}}
|
||||
{{if $sitelocation}}
|
||||
<br><small class="text-muted">{{$sitelocation}}</small>
|
||||
{{/if}}
|
||||
</a>
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
<div class="navbar-toggler-right">
|
||||
{{if $nav.help.6}}
|
||||
<button id="context-help-btn" class="navbar-toggler border-0" type="button" onclick="contextualHelp(); return false;">
|
||||
|
|
Loading…
Reference in a new issue