Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge

This commit is contained in:
zotlabs 2017-09-20 22:28:52 -07:00
commit 4372e1fcda
21 changed files with 152 additions and 64 deletions

View File

@ -161,7 +161,7 @@ class Notifier {
$packet_type = 'keychange'; $packet_type = 'keychange';
$normal_mode = false; $normal_mode = false;
} }
elseif($cmd == 'permission_update' || $cmd == 'permission_reject' || $cmd == 'permission_accept' || $cmd == 'permission_create') { elseif(in_array($cmd, [ 'permission_update', 'permission_reject', 'permission_accept', 'permission_create' ])) {
// Get the (single) recipient // Get the (single) recipient
$r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_self = 0", $r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_self = 0",
intval($item_id) intval($item_id)

View File

@ -58,7 +58,7 @@ class ActivityStreams {
$this->saved_recips = $arr; $this->saved_recips = $arr;
} }
function collect_recips($base = '',$namespace = 'https://www.w3.org/ns/activitystreams') { function collect_recips($base = '',$namespace = ACTIVITYSTREAMS_JSONLD_REV) {
$x = []; $x = [];
$fields = [ 'to','cc','bto','bcc','audience']; $fields = [ 'to','cc','bto','bcc','audience'];
foreach($fields as $f) { foreach($fields as $f) {
@ -75,7 +75,7 @@ class ActivityStreams {
return $x; return $x;
} }
function expand($arr,$base = '',$namespace = 'https://www.w3.org/ns/activitystreams') { function expand($arr,$base = '',$namespace = ACTIVITYSTREAMS_JSONLD_REV) {
$ret = []; $ret = [];
// right now use a hardwired recursion depth of 5 // right now use a hardwired recursion depth of 5
@ -135,7 +135,7 @@ class ActivityStreams {
} }
function get_property_obj($property,$base = '',$namespace = 'https://www.w3.org/ns/activitystreams') { function get_property_obj($property,$base = '',$namespace = ACTIVITYSTREAMS_JSONLD_REV ) {
$prefix = $this->get_namespace($base,$namespace); $prefix = $this->get_namespace($base,$namespace);
if($prefix === null) if($prefix === null)
return null; return null;
@ -158,7 +158,7 @@ class ActivityStreams {
return null; return null;
} }
function get_compound_property($property,$base = '',$namespace = 'https://www.w3.org/ns/activitystreams') { function get_compound_property($property,$base = '',$namespace = ACTIVITYSTREAMS_JSONLD_REV) {
$x = $this->get_property_obj($property,$base,$namespace); $x = $this->get_property_obj($property,$base,$namespace);
if($this->is_url($x)) { if($this->is_url($x)) {
$x = $this->fetch_property($x); $x = $this->fetch_property($x);
@ -173,7 +173,7 @@ class ActivityStreams {
return false; return false;
} }
function get_primary_type($base = '',$namespace = 'https://www.w3.org/ns/activitystreams') { function get_primary_type($base = '',$namespace = ACTIVITYSTREAMS_JSONLD_REV) {
if(! $base) if(! $base)
$base = $this->data; $base = $this->data;
$x = $this->get_property_obj('type',$base,$namespace); $x = $this->get_property_obj('type',$base,$namespace);

View File

@ -35,7 +35,9 @@ class LDSignatures {
$options['signatureValue'] = base64_encode(rsa_sign($ohash . $dhash,$channel['channel_prvkey'])); $options['signatureValue'] = base64_encode(rsa_sign($ohash . $dhash,$channel['channel_prvkey']));
$signed = array_merge([ $signed = array_merge([
'@context' => [ 'https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1' ], '@context' => [
ACTIVITYSTREAMS_JSONLD_REV,
'https://w3id.org/security/v1' ],
],$options); ],$options);
return $signed; return $signed;
@ -82,6 +84,8 @@ class LDSignatures {
if(! is_object($data)) if(! is_object($data))
return ''; return '';
jsonld_set_document_loader('jsonld_document_loader');
return jsonld_normalize($data,[ 'algorithm' => 'URDNA2015', 'format' => 'application/nquads' ]); return jsonld_normalize($data,[ 'algorithm' => 'URDNA2015', 'format' => 'application/nquads' ]);
} }

View File

@ -123,7 +123,7 @@ class Channel extends \Zotlabs\Web\Controller {
//$o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']); //$o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
$o .= common_friends_visitor_widget(\App::$profile['profile_uid']); // $o .= common_friends_visitor_widget(\App::$profile['profile_uid']);
if($channel && $is_owner) { if($channel && $is_owner) {
$channel_acl = array( $channel_acl = array(

View File

@ -248,6 +248,10 @@ class Connedit extends \Zotlabs\Web\Controller {
notice( t('Failed to update connection record.') . EOL); notice( t('Failed to update connection record.') . EOL);
if(! intval(\App::$poi['abook_self'])) { if(! intval(\App::$poi['abook_self'])) {
if($new_friend) {
\Zotlabs\Daemon\Master::Summon( [ 'Notifier', 'permission_accept', $contact_id ] );
}
\Zotlabs\Daemon\Master::Summon( [ \Zotlabs\Daemon\Master::Summon( [
'Notifier', 'Notifier',
(($new_friend) ? 'permission_create' : 'permission_update'), (($new_friend) ? 'permission_create' : 'permission_update'),

View File

@ -216,7 +216,8 @@ class Wiki extends \Zotlabs\Web\Controller {
'$deny_cid' => $x['deny_cid'], '$deny_cid' => $x['deny_cid'],
'$deny_gid' => $x['deny_gid'], '$deny_gid' => $x['deny_gid'],
'$typelock' => array('typelock', t('Lock content type'), '', '', array(t('No'), t('Yes'))), '$typelock' => array('typelock', t('Lock content type'), '', '', array(t('No'), t('Yes'))),
'$notify' => array('postVisible', t('Create a status post for this wiki'), '', '', array(t('No'), t('Yes'))) '$notify' => array('postVisible', t('Create a status post for this wiki'), '', '', array(t('No'), t('Yes'))),
'$edit_wiki_name' => t('Edit Wiki Name')
)); ));
return $o; return $o;

View File

@ -0,0 +1,19 @@
<?php
namespace Zotlabs\Widget;
require_once('include/contact_widgets.php');
class Common_friends {
function widget($arr) {
if((! \App::$profile['profile_uid'])
|| (! perm_is_allowed(\App::$profile['profile_uid'],get_observer_hash(),'view_contacts'))) {
return '';
}
return common_friends_visitor_widget(\App::$profile['profile_uid']);
}
}

View File

@ -53,9 +53,12 @@ class Wiki_pages {
'$addnew' => t('Add new page'), '$addnew' => t('Add new page'),
'$typelock' => $typelock, '$typelock' => $typelock,
'$lockedtype' => $w['mimeType'], '$lockedtype' => $w['mimeType'],
'$mimetype' => mimetype_select(0,$w['mimeType'], [ 'text/markdown','text/bbcode', 'text/plain' ]), '$mimetype' => mimetype_select(0,$w['mimeType'],
[ 'text/markdown' => t('Markdown'), 'text/bbcode' => t('BBcode'), 'text/plain' => t('Text') ]),
'$pageName' => array('pageName', t('Page name')), '$pageName' => array('pageName', t('Page name')),
'$refresh' => $arr['refresh'] '$refresh' => $arr['refresh'],
'$options' => t('Options'),
'$submit' => t('Submit')
)); ));
} }
} }

View File

@ -456,6 +456,8 @@ define ( 'NAMESPACE_STATUSNET', 'http://status.net/schema/api/1/' );
define ( 'NAMESPACE_ATOM1', 'http://www.w3.org/2005/Atom' ); define ( 'NAMESPACE_ATOM1', 'http://www.w3.org/2005/Atom' );
define ( 'NAMESPACE_YMEDIA', 'http://search.yahoo.com/mrss/' ); define ( 'NAMESPACE_YMEDIA', 'http://search.yahoo.com/mrss/' );
define ( 'ACTIVITYSTREAMS_JSONLD_REV', 'https://www.w3.org/ns/activitystreams-history/v1.8.jsonld' );
define ( 'ZOT_APSCHEMA_REV', '/apschema/v1.2' );
/** /**
* activity stream defines * activity stream defines
*/ */

View File

@ -278,11 +278,13 @@ function create_identity($arr) {
intval($arr['account_id']) intval($arr['account_id'])
); );
$photo_type = null;
$z = [ 'account' => $a[0], 'channel' => $r[0], 'photo_url' => '' ]; $z = [ 'account' => $a[0], 'channel' => $r[0], 'photo_url' => '' ];
call_hooks('create_channel_photo',$z); call_hooks('create_channel_photo',$z);
if($z['photo_url']) { if($z['photo_url']) {
import_channel_photo_from_url($z['photo_url'],$arr['account_id'],$r[0]['channel_id']); $photo_type = import_channel_photo_from_url($z['photo_url'],$arr['account_id'],$r[0]['channel_id']);
} }
if($role_permissions && array_key_exists('limits',$role_permissions)) if($role_permissions && array_key_exists('limits',$role_permissions))
@ -330,6 +332,7 @@ function create_identity($arr) {
'xchan_guid' => $guid, 'xchan_guid' => $guid,
'xchan_guid_sig' => $sig, 'xchan_guid_sig' => $sig,
'xchan_pubkey' => $key['pubkey'], 'xchan_pubkey' => $key['pubkey'],
'xchan_photo_mimetype' => (($photo_type) ? $photo_type : 'image/png'),
'xchan_photo_l' => z_root() . "/photo/profile/l/{$newuid}", 'xchan_photo_l' => z_root() . "/photo/profile/l/{$newuid}",
'xchan_photo_m' => z_root() . "/photo/profile/m/{$newuid}", 'xchan_photo_m' => z_root() . "/photo/profile/m/{$newuid}",
'xchan_photo_s' => z_root() . "/photo/profile/s/{$newuid}", 'xchan_photo_s' => z_root() . "/photo/profile/s/{$newuid}",

View File

@ -143,7 +143,7 @@ function cardcategories_widget($baseurl,$selected = '') {
function common_friends_visitor_widget($profile_uid) { function common_friends_visitor_widget($profile_uid,$cnt = 10) {
if(local_channel() == $profile_uid) if(local_channel() == $profile_uid)
return; return;
@ -156,19 +156,20 @@ function common_friends_visitor_widget($profile_uid) {
require_once('include/socgraph.php'); require_once('include/socgraph.php');
$t = count_common_friends($profile_uid,$observer_hash); $t = count_common_friends($profile_uid,$observer_hash);
if(! $t) if(! $t)
return; return;
$r = common_friends($profile_uid,$observer_hash,0,5,true); $r = common_friends($profile_uid,$observer_hash,0,$cnt,true);
return replace_macros(get_markup_template('remote_friends_common.tpl'), array( return replace_macros(get_markup_template('remote_friends_common.tpl'), array(
'$desc' => sprintf( tt("%d connection in common", "%d connections in common", $t), $t), '$desc' => sprintf( t('Common connections: %d'), $t),
'$base' => z_root(), '$base' => z_root(),
'$uid' => $profile_uid, '$uid' => $profile_uid,
'$cid' => $observer, '$cid' => $observer,
'$linkmore' => (($t > 5) ? 'true' : ''), '$linkmore' => (($t > $cnt) ? 'true' : ''),
'$more' => t('show more'), '$more' => t('show more'),
'$items' => $r '$items' => $r
)); ));
}; };

View File

@ -1944,3 +1944,34 @@ function getBestSupportedMimeType($mimeTypes = null, $acceptedTypes = false) {
// no mime-type found // no mime-type found
return null; return null;
} }
function jsonld_document_loader($url) {
// perform caching for jsonld normaliser
require_once('library/jsonld/jsonld.php');
$cachepath = 'store/[data]/ldcache';
if(! is_dir($cachepath))
os_mkdir($cachepath,STORAGE_DEFAULT_PERMISSIONS,true);
$filename = $cachepath . '/' . urlencode($url);
if(file_exists($filename) && filemtime($filename) > time() - (12 * 60 * 60)) {
return json_decode(file_get_contents($filename));
}
$r = jsonld_default_document_loader($url);
if($r) {
file_put_contents($filename,json_encode($r));
return $r;
}
logger('not found');
if(file_exists($filename)) {
return json_decode(file_get_contents($filename));
}
return [];
}

View File

@ -135,6 +135,9 @@ function translate_abook_perms_outbound(&$abook) {
$my_perms = 0; $my_perms = 0;
$their_perms = 0; $their_perms = 0;
if(! $abook)
return;
if(array_key_exists('abconfig',$abook) && is_array($abook['abconfig']) && $abook['abconfig']) { if(array_key_exists('abconfig',$abook) && is_array($abook['abconfig']) && $abook['abconfig']) {
foreach($abook['abconfig'] as $p) { foreach($abook['abconfig'] as $p) {
if($p['cat'] === 'their_perms') { if($p['cat'] === 'their_perms') {

View File

@ -666,6 +666,7 @@ function import_channel_photo_from_url($photo,$aid,$uid) {
import_channel_photo($img_str,$type,$aid,$uid); import_channel_photo($img_str,$type,$aid,$uid);
return $type;
} }

View File

@ -1789,21 +1789,21 @@ function layout_select($channel_id, $current = '') {
function mimetype_select($channel_id, $current = 'text/bbcode', $choices = null, $element = 'mimetype') { function mimetype_select($channel_id, $current = 'text/bbcode', $choices = null, $element = 'mimetype') {
$x = (($choices) ? $choices : [ $x = (($choices) ? $choices : [
'text/bbcode', 'text/bbcode' => t('BBcode'),
'text/html', 'text/html' => t('HTML'),
'text/markdown', 'text/markdown' => t('Markdown'),
'text/plain', 'text/plain' => t('Text'),
'application/x-pdl' 'application/x-pdl' => t('Comanche Layout')
]); ]);
if((App::$is_sys) || (channel_codeallowed($channel_id) && $channel_id == local_channel())){ if((App::$is_sys) || (channel_codeallowed($channel_id) && $channel_id == local_channel())){
$x[] = 'application/x-php'; $x['application/x-php'] = t('PHP');
} }
foreach($x as $y) { foreach($x as $y => $z) {
$selected = (($y == $current) ? ' selected="selected" ' : ''); $selected = (($y == $current) ? ' selected="selected" ' : '');
$options .= '<option name="' . $y . '"' . $selected . '>' . $y . '</option>'; $options .= '<option value="' . $y . '"' . $selected . '>' . $z . '</option>';
} }
$o = replace_macros(get_markup_template('field_select_raw.tpl'), array( $o = replace_macros(get_markup_template('field_select_raw.tpl'), array(

View File

@ -33,17 +33,18 @@
width: 100%; width: 100%;
} }
td i {
padding: 7px 5px;
cursor: pointer;
}
#wikis-index th:nth-child(1), #wikis-index th:nth-child(1),
#wikis-index td:nth-child(1){ #wikis-index td:nth-child(1){
padding: 7px 3px 7px 10px; padding: 7px 3px 7px 10px;
} }
#wikis-index th:nth-child(6), #wikis-index th:nth-last-child(1),
#wikis-index td:nth-child(6){ #wikis-index td:nth-last-child(1){
padding: 7px 10px 7px 7px; padding-right: 10px;
}
.wikis-index-tool {
padding: 7px 10px;
} }

View File

@ -7,4 +7,7 @@
[widget=categories][/widget] [widget=categories][/widget]
[widget=tagcloud_wall][var=limit]24[/var][/widget] [widget=tagcloud_wall][var=limit]24[/var][/widget]
[/region] [/region]
[region=content]
[widget=common_friends][/widget]
[/region]

View File

@ -1,4 +1,4 @@
<div class="profile-match-wrapper"> <div class="generic-content-wrapper">
<div class="profile-match-photo"> <div class="profile-match-photo">
<a href="{{$url}}"> <a href="{{$url}}">
<img src="{{$photo}}" alt="{{$name}}" width="80" height="80" title="{{$name}} [{{$url}}]" /> <img src="{{$photo}}" alt="{{$name}}" width="80" height="80" title="{{$name}} [{{$url}}]" />

View File

@ -1,21 +1,28 @@
<div id="remote-friends-in-common" class="bigwidget"> <div class="widget">
<div id="rfic-desc">{{$desc}} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{if $linkmore}}<a href="{{$base}}/common/{{$uid}}">{{$more}}</a>{{/if}}</div> <div class="panel">
{{if $items}} <div class="section-subtitle-wrapper" role="tab" id="common-friends-visitor">
{{foreach $items as $item}} <h3><a data-toggle="collapse" href="#common-friends-collapse">{{$desc}}</a></h3>
<div class="profile-match-wrapper">
<div class="profile-match-photo">
<a href="{{$base}}/chanview?f=&url={{$item.xchan_url}}">
<img src="{{$item.xchan_photo_m}}" width="80" height="80" alt="{{$item.xchan_name}}" title="{{$item.xchan_name}}" />
</a>
</div> </div>
<div class="profile-match-break"></div> <div id="common-friends-collapse" class="collapse" role="tabpanel" aria-labelledby="common-friends-visitor">
<div class="profile-match-name"> {{if $items}}
<a href="{{$base}}/chanview?f=&url={{$item.xchan_url}}" title="{{$item.xchan_name}}">{{$item.xchan_name}}</a> {{foreach $items as $item}}
<div class="profile-match-wrapper">
<div class="profile-match-photo">
<a href="{{$base}}/chanview?f=&url={{$item.xchan_url}}">
<img src="{{$item.xchan_photo_m}}" width="80" height="80" alt="{{$item.xchan_name}}" title="{{$item.xchan_name}}" />
</a>
</div>
<div class="profile-match-break"></div>
<div class="profile-match-name">
<a href="{{$base}}/chanview?f=&url={{$item.xchan_url}}" title="{{$item.xchan_name}}">{{$item.xchan_name}}</a>
</div>
<div class="profile-match-end"></div>
</div>
{{/foreach}}
{{/if}}
<div id="rfic-end" class="clear"></div>
{{if $linkmore}}<button class="btn btn-default"><a href="{{$base}}/common/{{$uid}}">{{$more}}</a></button>{{/if}}
</div> </div>
<div class="profile-match-end"></div>
</div> </div>
{{/foreach}}
{{/if}}
<div id="rfic-end" class="clear"></div>
</div> </div>

View File

@ -17,16 +17,21 @@
<li class="nav-item"><a class="nav-link" href="#" onclick="wiki_show_new_page_form(); return false;"><i class="fa fa-plus-circle"></i>&nbsp;{{$addnew}}</a></li> <li class="nav-item"><a class="nav-link" href="#" onclick="wiki_show_new_page_form(); return false;"><i class="fa fa-plus-circle"></i>&nbsp;{{$addnew}}</a></li>
{{/if}} {{/if}}
{{if $canadd}} {{if $canadd}}
<div id="new-page-form-wrapper" class="sub-menu" style="display:none;"> <div id="new-page-form-wrapper" class="clearfix sub-menu" style="display:none;">
<form id="new-page-form" action="wiki/{{$channel_address}}/create/page" method="post" > <form id="new-page-form" action="wiki/{{$channel_address}}/create/page" method="post" >
<input type="hidden" name="resource_id" value="{{$resource_id}}"> <input type="hidden" name="resource_id" value="{{$resource_id}}">
{{include file="field_input.tpl" field=$pageName}}
{{if $typelock}} {{if $typelock}}
<input id="id_mimetype" type="hidden" name="mimetype" value="{{$lockedtype}}"> <input id="id_mimetype" type="hidden" name="mimetype" value="{{$lockedtype}}">
{{else}} {{else}}
{{$mimetype}} <div id="wiki_page_options" style="display: none">
{{$mimetype}}
</div>
<div class="float-right fakelink" onClick="openClose('wiki_page_options')">
{{$options}}
</div>
{{/if}} {{/if}}
{{include file="field_input.tpl" field=$pageName}} <button id="new-page-submit" class="btn btn-primary" type="submit" name="submit" >{{$submit}}</button>
<button id="new-page-submit" class="btn btn-primary" type="submit" name="submit" >Submit</button>
</form> </form>
</div> </div>
{{/if}} {{/if}}

View File

@ -29,11 +29,11 @@
<tr> <tr>
<th width="96%">{{$name}}</th> <th width="96%">{{$name}}</th>
<th width="1%">{{$type}}</th> <th width="1%">{{$type}}</th>
<th width="1%" class="wikis-index-tool"></th> <th width="1%"></th>
{{if $owner}} {{if $owner}}
<th width="1%" class="wikis-index-tool"></th> <th width="1%"></th>
{{/if}} {{/if}}
<th width="1%" class="wikis-index-tool"></th> <th width="1%"></th>
{{if $owner}} {{if $owner}}
<th width="1%"></th> <th width="1%"></th>
{{/if}} {{/if}}
@ -43,15 +43,15 @@
<td><a href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="{{$view}}"{{if $wiki.active}} class="active"{{/if}}>{{$wiki.title}}</a></td> <td><a href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="{{$view}}"{{if $wiki.active}} class="active"{{/if}}>{{$wiki.title}}</a></td>
<td>{{if $wiki.typelock}}{{$wiki.mimeType}}{{else}}{{$unlocked}}{{/if}}</td> <td>{{if $wiki.typelock}}{{$wiki.mimeType}}{{else}}{{$unlocked}}{{/if}}</td>
{{if $owner}} {{if $owner}}
<td class="wikis-index-tool"><i class="fa fa-pencil" onclick="openCloseTR('wikis-index-edit-{{$wiki.id}}')"></i></td> <td><i class="fa fa-pencil" onclick="openCloseTR('wikis-index-edit-{{$wiki.id}}')"></i></td>
{{/if}} {{/if}}
<td class="wikis-index-tool dropdown"> <td class="dropdown">
{{if $wiki.lockstate == 'lock'}} {{if $wiki.lockstate == 'lock'}}
<i class="fa fa-lock lockview" data-toggle="dropdown" onclick="lockview('item',{{$wiki.id}});"></i> <i class="fa fa-lock lockview" data-toggle="dropdown" onclick="lockview('item',{{$wiki.id}});"></i>
<ul id="panel-{{$wiki.id}}" class="lockview-panel dropdown-menu dropdown-menu-right"></ul> <ul id="panel-{{$wiki.id}}" class="lockview-panel dropdown-menu dropdown-menu-right"></ul>
{{/if}} {{/if}}
</td> </td>
<td class="wikis-index-tool"><i class="fa fa-download" onclick="wiki_download_wiki('{{$wiki.resource_id}}'); return false;"></i></td> <td><i class="fa fa-download" onclick="wiki_download_wiki('{{$wiki.resource_id}}'); return false;"></i></td>
{{if $owner}} {{if $owner}}
<td><i class="fa fa-trash-o drop-icons" onclick="wiki_delete_wiki('{{$wiki.title}}', '{{$wiki.resource_id}}'); return false;"></i></td> <td><i class="fa fa-trash-o drop-icons" onclick="wiki_delete_wiki('{{$wiki.title}}', '{{$wiki.resource_id}}'); return false;"></i></td>
{{/if}} {{/if}}
@ -61,7 +61,7 @@
<td colspan="6"> <td colspan="6">
<form id="edit-wiki-form-{{$wiki.id}}" method="post" action="wiki/{{$channel}}/update/wiki" class="acl-form" data-form_id="edit-wiki-form-{{$wiki.id}}" data-allow_cid='{{$wiki.json_allow_cid}}' data-allow_gid='{{$wiki.json_allow_gid}}' data-deny_cid='{{$wiki.json_deny_cid}}' data-deny_gid='{{$wiki.json_deny_gid}}'> <form id="edit-wiki-form-{{$wiki.id}}" method="post" action="wiki/{{$channel}}/update/wiki" class="acl-form" data-form_id="edit-wiki-form-{{$wiki.id}}" data-allow_cid='{{$wiki.json_allow_cid}}' data-allow_gid='{{$wiki.json_allow_gid}}' data-deny_cid='{{$wiki.json_deny_cid}}' data-deny_gid='{{$wiki.json_deny_gid}}'>
<input type="hidden" name="origRawName" value="{{$wiki.title}}"> <input type="hidden" name="origRawName" value="{{$wiki.title}}">
{{include file="field_input.tpl" field=['updateRawName', 'Edit Wiki Name', $wiki.title]}} {{include file="field_input.tpl" field=['updateRawName', $edit_wiki_name, $wiki.title]}}
<div class="btn-group float-right"> <div class="btn-group float-right">
<button class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" type="button"> <button class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" type="button">
<i class="jot-perms-icon fa fa-{{$wiki.lockstate}}"></i> <i class="jot-perms-icon fa fa-{{$wiki.lockstate}}"></i>