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

This commit is contained in:
zotlabs 2017-06-20 18:34:17 -07:00
commit 08c0729f5f
30 changed files with 1417 additions and 3242 deletions

View File

@ -10,7 +10,7 @@ class PermissionLimits {
$perms = Permissions::Perms();
$limits = array();
foreach($perms as $k => $v) {
if(strstr($k,'view'))
if(strstr($k,'view') || $k === 'post_comments')
$limits[$k] = PERMS_PUBLIC;
else
$limits[$k] = PERMS_SPECIFIC;

View File

@ -270,7 +270,8 @@ class Notifier {
// Check for non published items, but allow an exclusion for transmitting hidden file activities
if(intval($target_item['item_unpublished']) || intval($target_item['item_delayed']) ||
if(intval($target_item['item_unpublished']) || intval($target_item['item_delayed']) ||
intval($target_item['item_blocked']) ||
( intval($target_item['item_hidden']) && ($target_item['obj_type'] !== ACTIVITY_OBJ_FILE))) {
logger('notifier: target item not published, so not forwardable', LOGGER_DEBUG);
return;

View File

@ -170,6 +170,7 @@ class Enotify {
xchan_query($p);
$moderated = (($p[0]['item_blocked'] = ITEM_MODERATED) ? true : false);
$item_post_type = item_post_type($p[0]);
// $private = $p[0]['item_private'];
@ -208,13 +209,21 @@ class Enotify {
// Before this we have the name of the replier on the subject rendering
// differents subjects for messages on the same thread.
$subject = sprintf( t('[$Projectname:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']);
if($moderated)
$subject = sprintf( t('[$Projectname:Notify] Moderated Comment to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']);
else
$subject = sprintf( t('[$Projectname:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']);
$preamble = sprintf( t('%1$s, %2$s commented on an item/conversation you have been following.'), $recip['channel_name'], $sender['xchan_name']);
$epreamble = $dest_str;
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
$hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
if($moderated) {
$tsitelink .= "\n\n" . sprintf( t('Please visit %s to approve or reject this comment.'), z_root() . '/moderate' );
$hsitelink .= "<br><br>" . sprintf( t('Please visit %s to approve or reject this comment.'), '<a href="' . z_root() . '/moderate">' . z_root() . '/moderate</a>' );
}
}
if ($params['type'] == NOTIFY_LIKE) {

View File

@ -153,7 +153,7 @@ class ThreadItem {
$response_verbs[] = 'attendyes';
$response_verbs[] = 'attendno';
$response_verbs[] = 'attendmaybe';
if($this->is_commentable()) {
if($this->is_commentable() && $observer) {
$isevent = true;
$attend = array( t('I will attend'), t('I will not attend'), t('I might attend'));
}
@ -164,7 +164,7 @@ class ThreadItem {
$response_verbs[] = 'agree';
$response_verbs[] = 'disagree';
$response_verbs[] = 'abstain';
if($this->is_commentable()) {
if($this->is_commentable() && $observer) {
$conlabels = array( t('I agree'), t('I disagree'), t('I abstain'));
$canvote = true;
}
@ -265,7 +265,7 @@ class ThreadItem {
if(($item['obj_type'] === ACTIVITY_OBJ_EVENT) && $conv->get_profile_owner() == local_channel())
$has_event = true;
if($this->is_commentable()) {
if($this->is_commentable() && $observer) {
$like = array( t("I like this \x28toggle\x29"), t("like"));
$dislike = array( t("I don't like this \x28toggle\x29"), t("dislike"));
}
@ -371,7 +371,7 @@ class ThreadItem {
'has_tags' => $has_tags,
'reactions' => $this->reactions,
// Item toolbar buttons
'emojis' => (($this->is_toplevel() && $this->is_commentable() && feature_enabled($conv->get_profile_owner(),'emojis')) ? '1' : ''),
'emojis' => (($this->is_toplevel() && $this->is_commentable() && $observer && feature_enabled($conv->get_profile_owner(),'emojis')) ? '1' : ''),
'like' => $like,
'dislike' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike : ''),
'share' => $share,
@ -743,8 +743,12 @@ class ThreadItem {
'$feature_encrypt' => ((feature_enabled($conv->get_profile_owner(),'content_encrypt')) ? true : false),
'$encrypt' => t('Encrypt text'),
'$cipher' => $conv->get_cipher(),
'$sourceapp' => \App::$sourcename
'$sourceapp' => \App::$sourcename,
'$observer' => get_observer_hash(),
'$anoncomments' => (($conv->get_mode() === 'channel' && perm_is_allowed($conv->get_profile_owner(),'','post_comments')) ? true : false),
'$anonname' => [ 'anonname', t('Your full name (required)'),'','' ],
'$anonmail' => [ 'anonmail', t('Your email address (required)'),'','' ],
'$anonurl' => [ 'anonurl', t('Your website URL (optional)'),'','' ]
));
return $comment_box;

View File

@ -158,7 +158,7 @@ class ThreadStream {
if(intval($item->get_data_value('item_nocomment'))) {
$item->set_commentable(false);
}
elseif(($this->observer) && (! $item->is_commentable())) {
elseif(! $item->is_commentable()) {
if((array_key_exists('owner',$item->data)) && intval($item->data['owner']['abook_self']))
$item->set_commentable(perm_is_allowed($this->profile_owner,$ob_hash,'post_comments'));
else

View File

@ -33,7 +33,7 @@ class Item extends \Zotlabs\Web\Controller {
// This will change. Figure out who the observer is and whether or not
// they have permission to post here. Else ignore the post.
if((! local_channel()) && (! remote_channel()) && (! x($_REQUEST,'commenter')))
if((! local_channel()) && (! remote_channel()) && (! x($_REQUEST,'anonname')))
return;
$uid = local_channel();
@ -77,7 +77,7 @@ class Item extends \Zotlabs\Web\Controller {
call_hooks('post_local_start', $_REQUEST);
// logger('postvars ' . print_r($_REQUEST,true), LOGGER_DATA);
// logger('postvars ' . print_r($_REQUEST,true), LOGGER_DATA);
$api_source = ((x($_REQUEST,'api_source') && $_REQUEST['api_source']) ? true : false);
@ -205,10 +205,29 @@ class Item extends \Zotlabs\Web\Controller {
$route = $parent_item['route'];
}
$moderated = false;
if(! $observer)
if(! $observer) {
$observer = \App::get_observer();
if(! $observer) {
$observer = anon_identity_init($_REQUEST);
if($observer) {
$moderated = true;
$remote_xchan = $remote_observer = $observer;
}
}
}
if(! $observer) {
notice( t('Permission denied.') . EOL) ;
if($api_source)
return ( [ 'success' => false, 'message' => 'permission denied' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
}
if($parent) {
logger('mod_item: item_post parent=' . $parent);
$can_comment = false;
@ -312,7 +331,7 @@ class Item extends \Zotlabs\Web\Controller {
$walltowall = false;
$walltowall_comment = false;
if($remote_xchan)
if($remote_xchan && ! $moderated)
$observer = $remote_observer;
if($observer) {
@ -996,6 +1015,10 @@ class Item extends \Zotlabs\Web\Controller {
\Zotlabs\Daemon\Master::Summon(array('Notifier', $notify_type, $post_id));
logger('post_complete');
if($moderated) {
info(t('Your comment is awaiting approval.') . EOL);
}
// figure out how to return, depending on from whence we came

View File

@ -0,0 +1,77 @@
<?php
namespace Zotlabs\Module;
require_once('include/conversation.php');
class Moderate extends \Zotlabs\Web\Controller {
function get() {
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
return;
}
if(argc() > 2) {
$post_id = intval(argv(1));
if(! $post_id)
goaway(z_root() . '/moderate');
$action = argv(2);
$r = q("select * from item where uid = %d and id = %d and item_blocked = %d limit 1",
intval(local_channel()),
intval($post_id),
intval(ITEM_MODERATED)
);
if($r) {
if($action === 'approve') {
q("update item set item_blocked = 0 where uid = %d and id = %d",
intval(local_channel()),
intval($post_id)
);
notice( t('Comment approved') . EOL);
}
elseif($action === 'drop') {
drop_item($post_id,false);
notice( t('Comment deleted') . EOL);
}
$r = q("select * from item where id = %d",
intval($post_id)
);
if($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
build_sync_packet(local_channel(),array('item' => array(encode_item($sync_item[0],true))));
}
if($action === 'approve') {
\Zotlabs\Daemon\Master::Summon(array('Notifier', 'comment-new', $post_id));
}
goaway(z_root() . '/moderate');
}
}
$r = q("select item.id as item_id, item.* from item where item.uid = %d and item_blocked = %d and item_deleted = 0 order by created desc limit 60",
intval(local_channel()),
intval(ITEM_MODERATED)
);
if($r) {
xchan_query($r);
$items = fetch_post_tags($r,true);
}
else {
$items = array();
}
$o = conversation($a,$items,'moderate',false,'traditional');
return $o;
}
}

View File

@ -324,7 +324,7 @@ class Channel {
foreach($global_perms as $k => $perm) {
$options = array();
foreach($perm_opts as $opt) {
if((! strstr($k,'view')) && $opt[1] == PERMS_PUBLIC)
if(((! strstr($k,'view')) && $k !== 'post_comments') && $opt[1] == PERMS_PUBLIC)
continue;
$options[$opt[1]] = $opt[0];
}

View File

@ -50,7 +50,7 @@ require_once('include/attach.php');
define ( 'PLATFORM_NAME', 'hubzilla' );
define ( 'STD_VERSION', '2.5.3' );
define ( 'STD_VERSION', '2.5.4' );
define ( 'ZOT_REVISION', '1.2' );
define ( 'DB_UPDATE_VERSION', 1191 );
@ -499,6 +499,7 @@ define ( 'ACTIVITY_POKE', NAMESPACE_ZOT . '/activity/poke' );
define ( 'ACTIVITY_MOOD', NAMESPACE_ZOT . '/activity/mood' );
define ( 'ACTIVITY_OBJ_COMMENT', NAMESPACE_ACTIVITY_SCHEMA . 'comment' );
define ( 'ACTIVITY_OBJ_ACTIVITY',NAMESPACE_ACTIVITY_SCHEMA . 'activity' );
define ( 'ACTIVITY_OBJ_NOTE', NAMESPACE_ACTIVITY_SCHEMA . 'note' );
define ( 'ACTIVITY_OBJ_PERSON', NAMESPACE_ACTIVITY_SCHEMA . 'person' );
define ( 'ACTIVITY_OBJ_PHOTO', NAMESPACE_ACTIVITY_SCHEMA . 'photo' );

View File

@ -2323,3 +2323,73 @@ function channel_codeallowed($channel_id) {
return false;
}
function anon_identity_init($reqvars) {
$x = [ 'request_vars' => $reqvars, 'xchan' => null, 'success' => 'unset' ];
call_hooks('anon_identity_init',$x);
if($x['success'] !== 'unset' && intval($x['success']) && $x['xchan'])
return $x['xchan'];
// allow a captcha handler to over-ride
if($x['success'] !== 'unset' && (intval($x['success']) === 0))
return false;
$anon_name = strip_tags(trim($reqvars['anonname']));
$anon_email = strip_tags(trim($reqvars['anonmail']));
$anon_url = strip_tags(trim($reqvars['anonurl']));
if(! ($anon_name && $anon_email)) {
logger('anonymous commenter did not complete form');
return false;
}
if(! validate_email($anon_email)) {
logger('enonymous email not valid');
return false;
}
if(! $anon_url)
$anon_url = z_root();
$hash = hash('md5',$anon_email);
$x = q("select * from xchan where xchan_guid = '%s' and xchan_hash = '%s' and xchan_network = 'unknown' limit 1",
dbesc($anon_email),
dbesc($hash)
);
if(! $x) {
xchan_store_lowlevel([
'xchan_guid' => $anon_email,
'xchan_hash' => $hash,
'xchan_name' => $anon_name,
'xchan_url' => $anon_url,
'xchan_network' => 'unknown',
'xchan_name_date' => datetime_convert()
]);
$x = q("select * from xchan where xchan_guid = '%s' and xchan_hash = '%s' and xchan_network = 'unknown' limit 1",
dbesc($anon_email),
dbesc($hash)
);
$photo = z_root() . '/' . get_default_profile_photo(300);
$photos = import_xchan_photo($photo,$hash);
$r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_guid = '%s' and xchan_hash = '%s' and xchan_network = 'unknown' ",
dbesc(datetime_convert()),
dbesc($photos[0]),
dbesc($photos[1]),
dbesc($photos[2]),
dbesc($photos[3]),
dbesc($anon_email),
dbesc($hash)
);
}
return $x[0];
}

View File

@ -533,6 +533,10 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
$live_update_div = '<div id="live-search"></div>' . "\r\n";
}
elseif ($mode === 'moderate') {
$profile_owner = local_channel();
}
elseif ($mode === 'photos') {
$profile_onwer = App::$profile['profile_uid'];
$page_writeable = ($profile_owner == local_channel());
@ -577,7 +581,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
if($items) {
if($mode === 'network-new' || $mode === 'search' || $mode === 'community') {
if(in_array($mode, [ 'network-new', 'search', 'community', 'moderate' ])) {
// "New Item View" on network page or search page results
// - just loop through the items and format them minimally for display
@ -609,14 +613,14 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
if(((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE)))
&& ($item['id'] != $item['parent']))
continue;
$nickname = $item['nickname'];
// $nickname = $item['nickname'];
}
else
$nickname = App::$user['nickname'];
// else
// $nickname = App::$user['nickname'];
$profile_name = ((strlen($item['author-name'])) ? $item['author-name'] : $item['name']);
if($item['author-link'] && (! $item['author-name']))
$profile_name = $item['author-link'];
// $profile_name = ((strlen($item['author-name'])) ? $item['author-name'] : $item['name']);
// if($item['author-link'] && (! $item['author-name']))
// $profile_name = $item['author-link'];
$sp = false;
$profile_link = best_link_url($item,$sp);
@ -625,7 +629,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
else
$profile_link = zid($profile_link);
$normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
// $normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
$profile_name = $item['author']['xchan_name'];
$profile_link = $item['author']['xchan_url'];
@ -679,6 +683,8 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
'template' => $tpl,
'toplevel' => 'toplevel_item',
'mode' => $mode,
'approve' => t('Approve'),
'delete' => t('Delete'),
'id' => (($preview) ? 'P0' : $item['item_id']),
'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, $profile_url),
'profile_url' => $profile_link,

View File

@ -259,7 +259,7 @@ function get_atom_elements($feed, $item, &$author) {
if(substr($author['author_link'],-1,1) == '/')
$author['author_link'] = substr($author['author_link'],0,-1);
$res['mid'] = unxmlify($item->get_id());
$res['mid'] = normalise_id(unxmlify($item->get_id()));
$res['title'] = unxmlify($item->get_title());
$res['body'] = unxmlify($item->get_content());
$res['plink'] = unxmlify($item->get_link(0));
@ -354,6 +354,7 @@ function get_atom_elements($feed, $item, &$author) {
// No photo/profile-link on the item - look at the feed level
if((! (x($author,'author_link'))) || (! (x($author,'author_photo')))) {
$rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author');
if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
@ -390,7 +391,7 @@ function get_atom_elements($feed, $item, &$author) {
$rawcnv = $item->get_item_tags(NAMESPACE_OSTATUS, 'conversation');
if($rawcnv) {
$ostatus_conversation = unxmlify($rawcnv[0]['attribs']['']['ref']);
$ostatus_conversation = normalise_id(unxmlify($rawcnv[0]['attribs']['']['ref']));
set_iconfig($res,'ostatus','conversation',$ostatus_conversation,true);
}
@ -602,6 +603,10 @@ function get_atom_elements($feed, $item, &$author) {
if(! $type)
$type = 'application/octet-stream';
if(($ostatus_protocol) && (strpos($type,'image') === 0) && (strpos($res['body'],$link) === false) && (strpos($link,'http') === 0)) {
$res['body'] .= "\n\n" . '[img]' . $link . '[/img]';
}
$res['attach'][] = array('href' => $link, 'length' => $len, 'type' => $type, 'title' => $title );
}
}
@ -683,7 +688,10 @@ function get_atom_elements($feed, $item, &$author) {
$res['target'] = $obj;
}
if(array_key_exists('verb',$res) && $res['verb'] === ACTIVITY_SHARE) {
if(array_key_exists('verb',$res) && $res['verb'] === ACTIVITY_SHARE
&& array_key_exists('obj_type',$res) && $res['obj_type'] === ACTIVITY_OBJ_NOTE) {
feed_get_reshare($res,$item);
}
@ -713,14 +721,14 @@ function feed_get_reshare(&$res,$item) {
if($rawobj) {
$rawauthor = $rawobj->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
$rawauthor = $rawobj[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['author'];
if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name']) {
$share['author'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name']);
$share['author'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']);
}
if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri']) {
$share['profile'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri']);
$share['profile'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']);
}
if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
@ -744,9 +752,10 @@ function feed_get_reshare(&$res,$item) {
if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'link') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['link'])
$share['link'] = encode_rel_links($child[SIMPLEPIE_NAMESPACE_ATOM_10]['link']);
$share['links'] = encode_rel_links($child[SIMPLEPIE_NAMESPACE_ATOM_10]['link']);
$rawcreated = $rawobj[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['published'];
$rawcreated = $rawobj->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published');
if($rawcreated)
$share['created'] = unxmlify($rawcreated[0]['data']);
else
@ -766,13 +775,19 @@ function feed_get_reshare(&$res,$item) {
}
}
$attach = $rawobj->get_enclosures();
$attach = $share['links'];
if($attach) {
foreach($attach as $att) {
$len = intval($att->get_length());
$link = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att->get_link()))));
$title = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att->get_title()))));
$type = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att->get_type()))));
if($att['rel'] === 'alternate') {
$share['alternate'] = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att['href']))));
continue;
}
if($att['rel'] !== 'enclosure')
continue;
$len = intval($att['length']);
$link = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att['href']))));
$title = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att['title']))));
$type = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att['type']))));
if(strpos($type,';'))
$type = substr($type,0,strpos($type,';'));
if((! $link) || (strpos($link,'http') !== 0))
@ -792,11 +807,12 @@ function feed_get_reshare(&$res,$item) {
$res['body'] = "[share author='" . urlencode($share['author']) .
"' profile='" . $share['profile'] .
"' avatar='" . $share['avatar'] .
"' link='" . $share['link'] .
"' link='" . $share['alternate'] .
"' posted='" . $share['created'] .
"' message_id='" . $share['message_id'] . "']";
$o .= $body;
$o .= "[/share]";
$res['body'] .= $body;
$res['body'] .= "[/share]";
}
}
@ -818,6 +834,10 @@ function encode_rel_links($links) {
$l = array();
if($link['attribs']['']['rel'])
$l['rel'] = $link['attribs']['']['rel'];
if($link['attribs']['']['length'])
$l['length'] = $link['attribs']['']['length'];
if($link['attribs']['']['title'])
$l['title'] = $link['attribs']['']['title'];
if($link['attribs']['']['type'])
$l['type'] = $link['attribs']['']['type'];
if($link['attribs']['']['href'])
@ -938,7 +958,6 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
foreach($items as $item) {
$is_reply = false;
$item_id = normalise_id($item->get_id());
logger('processing ' . $item->get_id(), LOGGER_DEBUG);
@ -955,12 +974,11 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
// Have we seen it? If not, import it.
$item_id = normalise_id($item->get_id());
$author = array();
$datarray = get_atom_elements($feed,$item,$author);
if($datarray['mid'])
$datarray['mid'] = normalise_id($item->get_id());
if(! $datarray['mid'])
continue;
if($contact['xchan_network'] === 'rss') {
$datarray['public_policy'] = 'specific';
@ -987,7 +1005,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$datarray['owner_xchan'] = $contact['xchan_hash'];
$r = q("SELECT edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
dbesc($item_id),
dbesc($datarray['mid']),
intval($importer['channel_id'])
);
@ -1010,6 +1028,9 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$pmid = '';
$conv_id = get_iconfig($datarray,'ostatus','conversation');
// match conversations - first try ostatus:conversation
// next try thr:in_reply_to
if($conv_id) {
$c = q("select parent_mid from item left join iconfig on item.id = iconfig.iid where iconfig.cat = 'ostatus' and iconfig.k = 'conversation' and iconfig.v = '%s' and item.uid = %d order by item.id limit 1",
dbesc($conv_id),
@ -1020,14 +1041,14 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$datarray['parent_mid'] = $pmid;
}
}
else {
$x = q("select mid from item where mid = '%s' and uid = %d limit 1",
if(! $pmid) {
$x = q("select parent_mid from item where mid = '%s' and uid = %d limit 1",
dbesc($parent_mid),
intval($importer['channel_id'])
);
if($x) {
$pmid = $x[0]['mid'];
$pmid = $x[0]['parent_mid'];
$datarray['parent_mid'] = $pmid;
}
}
@ -1056,12 +1077,11 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
// Head post of a conversation. Have we seen it? If not, import it.
$item_id = normalise_id($item->get_id());
$author = array();
$datarray = get_atom_elements($feed,$item,$author);
if($datarray['mid'])
$datarray['mid'] = normalise_id($item->get_id());
if(! $datarray['mid'])
continue;
if($contact['xchan_network'] === 'rss') {
$datarray['public_policy'] = 'specific';
@ -1116,7 +1136,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$r = q("SELECT edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
dbesc($item_id),
dbesc($datarray['mid']),
intval($importer['channel_id'])
);
@ -1136,7 +1156,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
continue;
}
$datarray['parent_mid'] = $item_id;
$datarray['parent_mid'] = $datarray['mid'];
$datarray['uid'] = $importer['channel_id'];
$datarray['aid'] = $importer['channel_account_id'];
@ -1505,6 +1525,10 @@ function atom_entry($item, $type, $author, $owner, $comment = false, $cid = 0, $
if(($item['parent'] != $item['id']) || ($item['parent_mid'] !== $item['mid']) || (($item['thr_parent'] !== '') && ($item['thr_parent'] !== $item['mid']))) {
$parent_item = (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']);
// ensure it's a legal uri and not just a message-id
if(! strpos($parent_item,':'))
$parent_item = 'X-ZOT:' . $parent_item;
$o .= '<thr:in-reply-to ref="' . xmlify($parent_item) . '" type="text/html" href="' . xmlify($item['plink']) . '" />' . "\r\n";
}
@ -1720,3 +1744,4 @@ function asencode_person($p) {
return $ret;
}

View File

@ -938,7 +938,7 @@ function import_author_unknown($x) {
$photos = import_xchan_photo($x['photo']['src'],$x['url']);
if($photos) {
$r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_url = '%s' and xchan_network = 'unknown'",
$r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s' and xchan_network = 'unknown'",
dbesc(datetime_convert()),
dbesc($photos[0]),
dbesc($photos[1]),

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -2156,7 +2156,7 @@ pre code {
.form-control {
display: block;
width: 100%;
padding: 0.5rem 1rem;
padding: 0.5rem 0.75rem;
font-size: 1rem;
line-height: 1.25;
color: #464a4c;
@ -2249,7 +2249,7 @@ select.form-control:focus::-ms-value {
font-size: 1rem;
}
.form-control-static {
.form-control-plaintext {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
margin-bottom: 0;
@ -2258,11 +2258,11 @@ select.form-control:focus::-ms-value {
border-width: 1px 0;
}
.form-control-static.form-control-sm, .input-group-sm > .form-control-static.form-control,
.input-group-sm > .form-control-static.input-group-addon,
.input-group-sm > .input-group-btn > .form-control-static.btn, .form-control-static.form-control-lg, .input-group-lg > .form-control-static.form-control,
.input-group-lg > .form-control-static.input-group-addon,
.input-group-lg > .input-group-btn > .form-control-static.btn {
.form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control,
.input-group-sm > .form-control-plaintext.input-group-addon,
.input-group-sm > .input-group-btn > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control,
.input-group-lg > .form-control-plaintext.input-group-addon,
.input-group-lg > .input-group-btn > .form-control-plaintext.btn {
padding-right: 0;
padding-left: 0;
}
@ -2294,7 +2294,7 @@ select.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.for
select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),
.input-group-lg > select.input-group-addon:not([size]):not([multiple]),
.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {
height: calc(2.875rem + 2px);
height: calc(2.3125rem + 2px);
}
.form-group {
@ -2306,6 +2306,24 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
margin-top: 0.25rem;
}
.form-row {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
margin-right: -5px;
margin-left: -5px;
}
.form-row > .col,
.form-row > [class*="col-"] {
padding-right: 5px;
padding-left: 5px;
}
.form-check {
position: relative;
display: block;
@ -2343,90 +2361,124 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
margin-left: 0.75rem;
}
.form-control-feedback {
margin-top: 0.25rem;
}
.form-control-success,
.form-control-warning,
.form-control-danger {
padding-right: 3rem;
background-repeat: no-repeat;
background-position: center right 0.5625rem;
-webkit-background-size: 1.125rem 1.125rem;
background-size: 1.125rem 1.125rem;
}
.has-success .form-control-feedback,
.has-success .form-control-label,
.has-success .col-form-label,
.has-success .form-check-label,
.has-success .custom-control {
color: #5cb85c;
}
.has-success .form-control,
.has-success .custom-select,
.has-success .custom-file-control {
border-color: #5cb85c;
}
.has-success .input-group-addon {
color: #5cb85c;
background-color: #eaf6ea;
border-color: #5cb85c;
}
.has-success .form-control-success {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");
}
.has-warning .form-control-feedback,
.has-warning .form-control-label,
.has-warning .col-form-label,
.has-warning .form-check-label,
.has-warning .custom-control {
color: #f0ad4e;
}
.has-warning .form-control,
.has-warning .custom-select,
.has-warning .custom-file-control {
border-color: #f0ad4e;
}
.has-warning .input-group-addon {
color: #f0ad4e;
background-color: white;
border-color: #f0ad4e;
}
.has-warning .form-control-warning {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E");
}
.has-danger .form-control-feedback,
.has-danger .form-control-label,
.has-danger .col-form-label,
.has-danger .form-check-label,
.has-danger .custom-control {
.invalid-feedback {
display: none;
margin-top: .25rem;
font-size: .875rem;
color: #d9534f;
}
.has-danger .form-control,
.has-danger .custom-select,
.has-danger .custom-file-control {
.invalid-tooltip {
position: absolute;
top: 100%;
z-index: 5;
display: none;
width: 250px;
padding: .5rem;
margin-top: .1rem;
font-size: .875rem;
line-height: 1;
color: #fff;
background-color: rgba(217, 83, 79, 0.8);
border-radius: .2rem;
}
.was-validated .form-control:valid, .form-control.is-valid, .was-validated
.custom-select:valid,
.custom-select.is-valid {
border-color: #5cb85c;
}
.was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated
.custom-select:valid:focus,
.custom-select.is-valid:focus {
-webkit-box-shadow: 0 0 0 0.2rem rgba(92, 184, 92, 0.25);
box-shadow: 0 0 0 0.2rem rgba(92, 184, 92, 0.25);
}
.was-validated .form-control:valid ~ .invalid-feedback,
.was-validated .form-control:valid ~ .invalid-tooltip, .form-control.is-valid ~ .invalid-feedback,
.form-control.is-valid ~ .invalid-tooltip, .was-validated
.custom-select:valid ~ .invalid-feedback,
.was-validated
.custom-select:valid ~ .invalid-tooltip,
.custom-select.is-valid ~ .invalid-feedback,
.custom-select.is-valid ~ .invalid-tooltip {
display: block;
}
.was-validated .form-check-input:valid + .form-check-label, .form-check-input.is-valid + .form-check-label {
color: #5cb85c;
}
.was-validated .custom-control-input:valid ~ .custom-control-indicator, .custom-control-input.is-valid ~ .custom-control-indicator {
background-color: rgba(92, 184, 92, 0.25);
}
.was-validated .custom-control-input:valid ~ .custom-control-description, .custom-control-input.is-valid ~ .custom-control-description {
color: #5cb85c;
}
.was-validated .custom-file-input:valid ~ .custom-file-control, .custom-file-input.is-valid ~ .custom-file-control {
border-color: #5cb85c;
}
.was-validated .custom-file-input:valid ~ .custom-file-control::before, .custom-file-input.is-valid ~ .custom-file-control::before {
border-color: inherit;
}
.was-validated .custom-file-input:valid:focus, .custom-file-input.is-valid:focus {
-webkit-box-shadow: 0 0 0 0.2rem rgba(92, 184, 92, 0.25);
box-shadow: 0 0 0 0.2rem rgba(92, 184, 92, 0.25);
}
.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated
.custom-select:invalid,
.custom-select.is-invalid {
border-color: #d9534f;
}
.has-danger .input-group-addon {
.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated
.custom-select:invalid:focus,
.custom-select.is-invalid:focus {
-webkit-box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.25);
box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.25);
}
.was-validated .form-control:invalid ~ .invalid-feedback,
.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,
.form-control.is-invalid ~ .invalid-tooltip, .was-validated
.custom-select:invalid ~ .invalid-feedback,
.was-validated
.custom-select:invalid ~ .invalid-tooltip,
.custom-select.is-invalid ~ .invalid-feedback,
.custom-select.is-invalid ~ .invalid-tooltip {
display: block;
}
.was-validated .form-check-input:invalid + .form-check-label, .form-check-input.is-invalid + .form-check-label {
color: #d9534f;
background-color: #fdf7f7;
}
.was-validated .custom-control-input:invalid ~ .custom-control-indicator, .custom-control-input.is-invalid ~ .custom-control-indicator {
background-color: rgba(217, 83, 79, 0.25);
}
.was-validated .custom-control-input:invalid ~ .custom-control-description, .custom-control-input.is-invalid ~ .custom-control-description {
color: #d9534f;
}
.was-validated .custom-file-input:invalid ~ .custom-file-control, .custom-file-input.is-invalid ~ .custom-file-control {
border-color: #d9534f;
}
.has-danger .form-control-danger {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E");
.was-validated .custom-file-input:invalid ~ .custom-file-control::before, .custom-file-input.is-invalid ~ .custom-file-control::before {
border-color: inherit;
}
.was-validated .custom-file-input:invalid:focus, .custom-file-input.is-invalid:focus {
-webkit-box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.25);
box-shadow: 0 0 0 0.2rem rgba(217, 83, 79, 0.25);
}
.form-inline {
@ -2563,7 +2615,7 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
-ms-user-select: none;
user-select: none;
border: 1px solid transparent;
padding: 0.5rem 1rem;
padding: 0.5rem 0.75rem;
font-size: 1rem;
line-height: 1.25;
border-radius: 0.25rem;
@ -2578,8 +2630,8 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
.btn:focus, .btn.focus {
outline: 0;
-webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);
box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);
-webkit-box-shadow: 0 0 0 3px rgba(2, 117, 216, 0.25);
box-shadow: 0 0 0 3px rgba(2, 117, 216, 0.25);
}
.btn.disabled, .btn:disabled {
@ -2608,8 +2660,8 @@ fieldset[disabled] a.btn {
}
.btn-primary:focus, .btn-primary.focus {
-webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
-webkit-box-shadow: 0 0 0 3px rgba(2, 117, 216, 0.5);
box-shadow: 0 0 0 3px rgba(2, 117, 216, 0.5);
}
.btn-primary.disabled, .btn-primary:disabled {
@ -2638,8 +2690,8 @@ fieldset[disabled] a.btn {
}
.btn-secondary:focus, .btn-secondary.focus {
-webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
-webkit-box-shadow: 0 0 0 3px rgba(204, 204, 204, 0.5);
box-shadow: 0 0 0 3px rgba(204, 204, 204, 0.5);
}
.btn-secondary.disabled, .btn-secondary:disabled {
@ -2668,8 +2720,8 @@ fieldset[disabled] a.btn {
}
.btn-info:focus, .btn-info.focus {
-webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
-webkit-box-shadow: 0 0 0 3px rgba(91, 192, 222, 0.5);
box-shadow: 0 0 0 3px rgba(91, 192, 222, 0.5);
}
.btn-info.disabled, .btn-info:disabled {
@ -2698,8 +2750,8 @@ fieldset[disabled] a.btn {
}
.btn-success:focus, .btn-success.focus {
-webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
-webkit-box-shadow: 0 0 0 3px rgba(92, 184, 92, 0.5);
box-shadow: 0 0 0 3px rgba(92, 184, 92, 0.5);
}
.btn-success.disabled, .btn-success:disabled {
@ -2728,8 +2780,8 @@ fieldset[disabled] a.btn {
}
.btn-warning:focus, .btn-warning.focus {
-webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
-webkit-box-shadow: 0 0 0 3px rgba(240, 173, 78, 0.5);
box-shadow: 0 0 0 3px rgba(240, 173, 78, 0.5);
}
.btn-warning.disabled, .btn-warning:disabled {
@ -2758,8 +2810,8 @@ fieldset[disabled] a.btn {
}
.btn-danger:focus, .btn-danger.focus {
-webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
-webkit-box-shadow: 0 0 0 3px rgba(217, 83, 79, 0.5);
box-shadow: 0 0 0 3px rgba(217, 83, 79, 0.5);
}
.btn-danger.disabled, .btn-danger:disabled {
@ -2789,8 +2841,8 @@ fieldset[disabled] a.btn {
}
.btn-outline-primary:focus, .btn-outline-primary.focus {
-webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
-webkit-box-shadow: 0 0 0 3px rgba(2, 117, 216, 0.5);
box-shadow: 0 0 0 3px rgba(2, 117, 216, 0.5);
}
.btn-outline-primary.disabled, .btn-outline-primary:disabled {
@ -2819,8 +2871,8 @@ fieldset[disabled] a.btn {
}
.btn-outline-secondary:focus, .btn-outline-secondary.focus {
-webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
-webkit-box-shadow: 0 0 0 3px rgba(204, 204, 204, 0.5);
box-shadow: 0 0 0 3px rgba(204, 204, 204, 0.5);
}
.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
@ -2849,8 +2901,8 @@ fieldset[disabled] a.btn {
}
.btn-outline-info:focus, .btn-outline-info.focus {
-webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
-webkit-box-shadow: 0 0 0 3px rgba(91, 192, 222, 0.5);
box-shadow: 0 0 0 3px rgba(91, 192, 222, 0.5);
}
.btn-outline-info.disabled, .btn-outline-info:disabled {
@ -2879,8 +2931,8 @@ fieldset[disabled] a.btn {
}
.btn-outline-success:focus, .btn-outline-success.focus {
-webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
-webkit-box-shadow: 0 0 0 3px rgba(92, 184, 92, 0.5);
box-shadow: 0 0 0 3px rgba(92, 184, 92, 0.5);
}
.btn-outline-success.disabled, .btn-outline-success:disabled {
@ -2909,8 +2961,8 @@ fieldset[disabled] a.btn {
}
.btn-outline-warning:focus, .btn-outline-warning.focus {
-webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
-webkit-box-shadow: 0 0 0 3px rgba(240, 173, 78, 0.5);
box-shadow: 0 0 0 3px rgba(240, 173, 78, 0.5);
}
.btn-outline-warning.disabled, .btn-outline-warning:disabled {
@ -2939,8 +2991,8 @@ fieldset[disabled] a.btn {
}
.btn-outline-danger:focus, .btn-outline-danger.focus {
-webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
-webkit-box-shadow: 0 0 0 3px rgba(217, 83, 79, 0.5);
box-shadow: 0 0 0 3px rgba(217, 83, 79, 0.5);
}
.btn-outline-danger.disabled, .btn-outline-danger:disabled {
@ -3253,8 +3305,8 @@ tbody.collapse.show {
}
.btn + .dropdown-toggle-split {
padding-right: 0.75rem;
padding-left: 0.75rem;
padding-right: 0.5625rem;
padding-left: 0.5625rem;
}
.btn + .dropdown-toggle-split::after {
@ -3392,7 +3444,7 @@ tbody.collapse.show {
}
.input-group-addon {
padding: 0.5rem 1rem;
padding: 0.5rem 0.75rem;
margin-bottom: 0;
font-size: 1rem;
font-weight: normal;
@ -3629,6 +3681,7 @@ tbody.collapse.show {
}
.custom-select-sm {
height: calc(1.8125rem + 2px);
padding-top: 0.375rem;
padding-bottom: 0.375rem;
font-size: 75%;
@ -3762,7 +3815,7 @@ tbody.collapse.show {
}
.nav-pills .nav-link.active,
.show .nav-pills .nav-link {
.show > .nav-pills .nav-link {
color: #fff;
background-color: #0275d8;
}
@ -3877,11 +3930,8 @@ tbody.collapse.show {
}
.navbar-nav .dropdown-menu {
position: static !important;
position: static;
float: none;
-webkit-transform: unset !important;
-o-transform: unset !important;
transform: unset !important;
}
.navbar-text {
@ -3951,8 +4001,11 @@ tbody.collapse.show {
flex-direction: row;
}
.navbar-expand-sm .navbar-nav .dropdown-menu {
position: absolute !important;
top: 100% !important;
position: absolute;
}
.navbar-expand-sm .navbar-nav .dropdown-menu-right {
right: 0;
left: auto;
}
.navbar-expand-sm .navbar-nav .nav-link {
padding-right: .5rem;
@ -4006,8 +4059,11 @@ tbody.collapse.show {
flex-direction: row;
}
.navbar-expand-md .navbar-nav .dropdown-menu {
position: absolute !important;
top: 100% !important;
position: absolute;
}
.navbar-expand-md .navbar-nav .dropdown-menu-right {
right: 0;
left: auto;
}
.navbar-expand-md .navbar-nav .nav-link {
padding-right: .5rem;
@ -4061,8 +4117,11 @@ tbody.collapse.show {
flex-direction: row;
}
.navbar-expand-lg .navbar-nav .dropdown-menu {
position: absolute !important;
top: 100% !important;
position: absolute;
}
.navbar-expand-lg .navbar-nav .dropdown-menu-right {
right: 0;
left: auto;
}
.navbar-expand-lg .navbar-nav .nav-link {
padding-right: .5rem;
@ -4116,8 +4175,11 @@ tbody.collapse.show {
flex-direction: row;
}
.navbar-expand-xl .navbar-nav .dropdown-menu {
position: absolute !important;
top: 100% !important;
position: absolute;
}
.navbar-expand-xl .navbar-nav .dropdown-menu-right {
right: 0;
left: auto;
}
.navbar-expand-xl .navbar-nav .nav-link {
padding-right: .5rem;
@ -4170,8 +4232,12 @@ tbody.collapse.show {
}
.navbar-expand .navbar-nav .dropdown-menu {
position: absolute !important;
top: 100% !important;
position: absolute;
}
.navbar-expand .navbar-nav .dropdown-menu-right {
right: 0;
left: auto;
}
.navbar-expand .navbar-nav .nav-link {
@ -4288,12 +4354,14 @@ tbody.collapse.show {
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
min-width: 0;
word-wrap: break-word;
background-color: #fff;
border: 1px solid rgba(0, 0, 0, 0.125);
border-radius: 0.25rem;
}
.card-block {
.card-body {
-webkit-box-flex: 1;
-webkit-flex: 1 1 auto;
-ms-flex: 1 1 auto;
@ -4303,7 +4371,6 @@ tbody.collapse.show {
.card-title {
margin-bottom: 0.75rem;
word-break: break-all;
}
.card-subtitle {
@ -4562,8 +4629,8 @@ tbody.collapse.show {
display: -ms-flexbox;
display: flex;
-webkit-box-flex: 1;
-webkit-flex: 1 0 0;
-ms-flex: 1 0 0px;
-webkit-flex: 1 0 0%;
-ms-flex: 1 0 0%;
flex: 1 0 0%;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
@ -4589,8 +4656,8 @@ tbody.collapse.show {
}
.card-group .card {
-webkit-box-flex: 1;
-webkit-flex: 1 0 0;
-ms-flex: 1 0 0px;
-webkit-flex: 1 0 0%;
-ms-flex: 1 0 0%;
flex: 1 0 0%;
}
.card-group .card + .card {
@ -4739,6 +4806,7 @@ tbody.collapse.show {
.pagination-lg .page-link {
padding: 0.75rem 1.5rem;
font-size: 1.25rem;
line-height: 1.5;
}
.pagination-lg .page-item:first-child .page-link {
@ -4754,6 +4822,7 @@ tbody.collapse.show {
.pagination-sm .page-link {
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
line-height: 1.5;
}
.pagination-sm .page-item:first-child .page-link {
@ -5024,7 +5093,7 @@ a.badge:focus, a.badge:hover {
-webkit-box-flex: 1;
-webkit-flex: 1;
-ms-flex: 1;
flex: 1 1 0%;
flex: 1;
}
.list-group {
@ -5671,7 +5740,7 @@ button.close {
border-bottom-color: #fff;
}
.popover.bs-popover-bottom .popover-title::before, .popover.bs-popover-auto[x-placement^="bottom"] .popover-title::before {
.popover.bs-popover-bottom .popover-header::before, .popover.bs-popover-auto[x-placement^="bottom"] .popover-header::before {
position: absolute;
top: 0;
left: 50%;
@ -5706,7 +5775,7 @@ button.close {
border-left-color: #fff;
}
.popover-title {
.popover-header {
padding: 8px 14px;
margin-bottom: 0;
font-size: 1rem;
@ -5717,11 +5786,11 @@ button.close {
border-top-right-radius: calc(0.3rem - 1px);
}
.popover-title:empty {
.popover-header:empty {
display: none;
}
.popover-content {
.popover-body {
padding: 9px 14px;
color: #292b2c;
}
@ -6013,27 +6082,27 @@ a.bg-inverse:focus, a.bg-inverse:hover {
}
.rounded {
border-radius: 0.25rem;
border-radius: 0.25rem !important;
}
.rounded-top {
border-top-left-radius: 0.25rem;
border-top-right-radius: 0.25rem;
border-top-left-radius: 0.25rem !important;
border-top-right-radius: 0.25rem !important;
}
.rounded-right {
border-top-right-radius: 0.25rem;
border-bottom-right-radius: 0.25rem;
border-top-right-radius: 0.25rem !important;
border-bottom-right-radius: 0.25rem !important;
}
.rounded-bottom {
border-bottom-right-radius: 0.25rem;
border-bottom-left-radius: 0.25rem;
border-bottom-right-radius: 0.25rem !important;
border-bottom-left-radius: 0.25rem !important;
}
.rounded-left {
border-top-left-radius: 0.25rem;
border-bottom-left-radius: 0.25rem;
border-top-left-radius: 0.25rem !important;
border-bottom-left-radius: 0.25rem !important;
}
.rounded-circle {
@ -7276,11 +7345,13 @@ a.bg-inverse:focus, a.bg-inverse:hover {
z-index: 1030;
}
.sticky-top {
position: -webkit-sticky;
position: sticky;
top: 0;
z-index: 1020;
@supports ((position: -webkit-sticky) or (position: sticky)) {
.sticky-top {
position: -webkit-sticky;
position: sticky;
top: 0;
z-index: 1020;
}
}
.sr-only {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1107,6 +1107,14 @@ var Collapse = function ($) {
this._element = element;
this._config = this._getConfig(config);
this._triggerArray = $.makeArray($('[data-toggle="collapse"][href="#' + element.id + '"],' + ('[data-toggle="collapse"][data-target="#' + element.id + '"]')));
var tabToggles = $(Selector.DATA_TOGGLE);
for (var i = 0; i < tabToggles.length; i++) {
var elem = tabToggles[i];
var selector = Util.getSelectorFromElement(elem);
if (selector !== null && $(selector).filter(element).length > 0) {
this._triggerArray.push(elem);
}
}
this._parent = this._config.parent ? this._getParent() : null;
@ -1225,7 +1233,16 @@ var Collapse = function ($) {
$(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
if (this._triggerArray.length) {
$(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
for (var i = 0; i < this._triggerArray.length; i++) {
var trigger = this._triggerArray[i];
var selector = Util.getSelectorFromElement(trigger);
if (selector !== null) {
var $elem = $(selector);
if (!$elem.hasClass(ClassName.SHOW)) {
$(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
}
}
}
}
this.setTransitioning(true);
@ -1353,11 +1370,14 @@ var Collapse = function ($) {
event.preventDefault();
}
var target = Collapse._getTargetFromElement(this);
var data = $(target).data(DATA_KEY);
var config = data ? 'toggle' : $(this).data();
Collapse._jQueryInterface.call($(target), config);
var $trigger = $(this);
var selector = Util.getSelectorFromElement(this);
$(selector).each(function () {
var $target = $(this);
var data = $target.data(DATA_KEY);
var config = data ? 'toggle' : $trigger.data();
Collapse._jQueryInterface.call($target, config);
});
});
/**
@ -1475,6 +1495,7 @@ var Dropdown = function ($) {
this._popper = null;
this._config = this._getConfig(config);
this._menu = this._getMenuElement();
this._inNavbar = this._detectNavbar();
this._addEventListeners();
}
@ -1515,17 +1536,7 @@ var Dropdown = function ($) {
element = parent;
}
}
this._popper = new Popper(element, this._menu, {
placement: this._getPlacement(),
modifiers: {
offset: {
offset: this._config.offset
},
flip: {
enabled: this._config.flip
}
}
});
this._popper = new Popper(element, this._menu, this._getPopperConfig());
// if this is a touch-enabled device we add extra
// empty mouseover listeners to the body's immediate children;
@ -1554,6 +1565,7 @@ var Dropdown = function ($) {
};
Dropdown.prototype.update = function update() {
this._inNavbar = this._detectNavbar();
if (this._popper !== null) {
this._popper.scheduleUpdate();
}
@ -1602,14 +1614,44 @@ var Dropdown = function ($) {
if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.TOPEND;
}
} else {
if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.BOTTOMEND;
}
} else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.BOTTOMEND;
}
return placement;
};
Dropdown.prototype._detectNavbar = function _detectNavbar() {
return $(this._element).closest('.navbar').length > 0;
};
Dropdown.prototype._getPopperConfig = function _getPopperConfig() {
var _this10 = this;
var popperConfig = {
placement: this._getPlacement(),
modifiers: {
offset: {
offset: this._config.offset
},
flip: {
enabled: this._config.flip
}
}
};
if (this._inNavbar) {
popperConfig.modifiers.AfterApplyStyle = {
enabled: true,
order: 901, // ApplyStyle order + 1
fn: function fn() {
// reset Popper styles
$(_this10._menu).attr('style', '');
}
};
}
return popperConfig;
};
// static
Dropdown._jQueryInterface = function _jQueryInterface(config) {
@ -1887,7 +1929,7 @@ var Modal = function ($) {
};
Modal.prototype.show = function show(relatedTarget) {
var _this10 = this;
var _this11 = this;
if (this._isTransitioning) {
return;
@ -1918,24 +1960,24 @@ var Modal = function ($) {
this._setResizeEvent();
$(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
return _this10.hide(event);
return _this11.hide(event);
});
$(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
$(_this10._element).one(Event.MOUSEUP_DISMISS, function (event) {
if ($(event.target).is(_this10._element)) {
_this10._ignoreBackdropClick = true;
$(_this11._element).one(Event.MOUSEUP_DISMISS, function (event) {
if ($(event.target).is(_this11._element)) {
_this11._ignoreBackdropClick = true;
}
});
});
this._showBackdrop(function () {
return _this10._showElement(relatedTarget);
return _this11._showElement(relatedTarget);
});
};
Modal.prototype.hide = function hide(event) {
var _this11 = this;
var _this12 = this;
if (event) {
event.preventDefault();
@ -1974,7 +2016,7 @@ var Modal = function ($) {
if (transition) {
$(this._element).one(Util.TRANSITION_END, function (event) {
return _this11._hideModal(event);
return _this12._hideModal(event);
}).emulateTransitionEnd(TRANSITION_DURATION);
} else {
this._hideModal();
@ -2009,7 +2051,7 @@ var Modal = function ($) {
};
Modal.prototype._showElement = function _showElement(relatedTarget) {
var _this12 = this;
var _this13 = this;
var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
@ -2037,11 +2079,11 @@ var Modal = function ($) {
});
var transitionComplete = function transitionComplete() {
if (_this12._config.focus) {
_this12._element.focus();
if (_this13._config.focus) {
_this13._element.focus();
}
_this12._isTransitioning = false;
$(_this12._element).trigger(shownEvent);
_this13._isTransitioning = false;
$(_this13._element).trigger(shownEvent);
};
if (transition) {
@ -2052,24 +2094,24 @@ var Modal = function ($) {
};
Modal.prototype._enforceFocus = function _enforceFocus() {
var _this13 = this;
var _this14 = this;
$(document).off(Event.FOCUSIN) // guard against infinite focus loop
.on(Event.FOCUSIN, function (event) {
if (document !== event.target && _this13._element !== event.target && !$(_this13._element).has(event.target).length) {
_this13._element.focus();
if (document !== event.target && _this14._element !== event.target && !$(_this14._element).has(event.target).length) {
_this14._element.focus();
}
});
};
Modal.prototype._setEscapeEvent = function _setEscapeEvent() {
var _this14 = this;
var _this15 = this;
if (this._isShown && this._config.keyboard) {
$(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
if (event.which === ESCAPE_KEYCODE) {
event.preventDefault();
_this14.hide();
_this15.hide();
}
});
} else if (!this._isShown) {
@ -2078,11 +2120,11 @@ var Modal = function ($) {
};
Modal.prototype._setResizeEvent = function _setResizeEvent() {
var _this15 = this;
var _this16 = this;
if (this._isShown) {
$(window).on(Event.RESIZE, function (event) {
return _this15.handleUpdate(event);
return _this16.handleUpdate(event);
});
} else {
$(window).off(Event.RESIZE);
@ -2090,16 +2132,16 @@ var Modal = function ($) {
};
Modal.prototype._hideModal = function _hideModal() {
var _this16 = this;
var _this17 = this;
this._element.style.display = 'none';
this._element.setAttribute('aria-hidden', true);
this._isTransitioning = false;
this._showBackdrop(function () {
$(document.body).removeClass(ClassName.OPEN);
_this16._resetAdjustments();
_this16._resetScrollbar();
$(_this16._element).trigger(Event.HIDDEN);
_this17._resetAdjustments();
_this17._resetScrollbar();
$(_this17._element).trigger(Event.HIDDEN);
});
};
@ -2111,7 +2153,7 @@ var Modal = function ($) {
};
Modal.prototype._showBackdrop = function _showBackdrop(callback) {
var _this17 = this;
var _this18 = this;
var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
@ -2128,17 +2170,17 @@ var Modal = function ($) {
$(this._backdrop).appendTo(document.body);
$(this._element).on(Event.CLICK_DISMISS, function (event) {
if (_this17._ignoreBackdropClick) {
_this17._ignoreBackdropClick = false;
if (_this18._ignoreBackdropClick) {
_this18._ignoreBackdropClick = false;
return;
}
if (event.target !== event.currentTarget) {
return;
}
if (_this17._config.backdrop === 'static') {
_this17._element.focus();
if (_this18._config.backdrop === 'static') {
_this18._element.focus();
} else {
_this17.hide();
_this18.hide();
}
});
@ -2162,7 +2204,7 @@ var Modal = function ($) {
$(this._backdrop).removeClass(ClassName.SHOW);
var callbackRemove = function callbackRemove() {
_this17._removeBackdrop();
_this18._removeBackdrop();
if (callback) {
callback();
}
@ -2206,7 +2248,7 @@ var Modal = function ($) {
};
Modal.prototype._setScrollbar = function _setScrollbar() {
var _this18 = this;
var _this19 = this;
if (this._isBodyOverflowing) {
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
@ -2216,14 +2258,14 @@ var Modal = function ($) {
$(Selector.FIXED_CONTENT).each(function (index, element) {
var actualPadding = $(element)[0].style.paddingRight;
var calculatedPadding = $(element).css('padding-right');
$(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this18._scrollbarWidth + 'px');
$(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this19._scrollbarWidth + 'px');
});
// Adjust navbar-toggler margin
$(Selector.NAVBAR_TOGGLER).each(function (index, element) {
var actualMargin = $(element)[0].style.marginRight;
var calculatedMargin = $(element).css('margin-right');
$(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this18._scrollbarWidth + 'px');
$(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this19._scrollbarWidth + 'px');
});
// Adjust body padding
@ -2312,7 +2354,7 @@ var Modal = function ($) {
*/
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
var _this19 = this;
var _this20 = this;
var target = void 0;
var selector = Util.getSelectorFromElement(this);
@ -2334,8 +2376,8 @@ var Modal = function ($) {
}
$target.one(Event.HIDDEN, function () {
if ($(_this19).is(':visible')) {
_this19.focus();
if ($(_this20).is(':visible')) {
_this20.focus();
}
});
});
@ -2429,7 +2471,7 @@ var ScrollSpy = function ($) {
var ScrollSpy = function () {
function ScrollSpy(element, config) {
var _this20 = this;
var _this21 = this;
_classCallCheck(this, ScrollSpy);
@ -2443,7 +2485,7 @@ var ScrollSpy = function ($) {
this._scrollHeight = 0;
$(this._scrollElement).on(Event.SCROLL, function (event) {
return _this20._process(event);
return _this21._process(event);
});
this.refresh();
@ -2455,7 +2497,7 @@ var ScrollSpy = function ($) {
// public
ScrollSpy.prototype.refresh = function refresh() {
var _this21 = this;
var _this22 = this;
var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;
@ -2491,8 +2533,8 @@ var ScrollSpy = function ($) {
}).sort(function (a, b) {
return a[0] - b[0];
}).forEach(function (item) {
_this21._offsets.push(item[0]);
_this21._targets.push(item[1]);
_this22._offsets.push(item[0]);
_this22._targets.push(item[1]);
});
};
@ -2739,7 +2781,7 @@ var Tab = function ($) {
// public
Tab.prototype.show = function show() {
var _this22 = this;
var _this23 = this;
if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE) || $(this._element).hasClass(ClassName.DISABLED)) {
return;
@ -2781,7 +2823,7 @@ var Tab = function ($) {
var complete = function complete() {
var hiddenEvent = $.Event(Event.HIDDEN, {
relatedTarget: _this22._element
relatedTarget: _this23._element
});
var shownEvent = $.Event(Event.SHOWN, {
@ -2789,7 +2831,7 @@ var Tab = function ($) {
});
$(previous).trigger(hiddenEvent);
$(_this22._element).trigger(shownEvent);
$(_this23._element).trigger(shownEvent);
};
if (target) {
@ -2807,13 +2849,13 @@ var Tab = function ($) {
// private
Tab.prototype._activate = function _activate(element, container, callback) {
var _this23 = this;
var _this24 = this;
var active = $(container).find(Selector.ACTIVE)[0];
var isTransitioning = callback && Util.supportsTransitionEnd() && active && $(active).hasClass(ClassName.FADE);
var complete = function complete() {
return _this23._transitionComplete(element, active, isTransitioning, callback);
return _this24._transitionComplete(element, active, isTransitioning, callback);
};
if (active && isTransitioning) {
@ -3125,7 +3167,7 @@ var Tooltip = function ($) {
};
Tooltip.prototype.show = function show() {
var _this24 = this;
var _this25 = this;
if ($(this.element).css('display') === 'none') {
throw new Error('Please use show on visible elements');
@ -3183,11 +3225,11 @@ var Tooltip = function ($) {
},
onCreate: function onCreate(data) {
if (data.originalPlacement !== data.placement) {
_this24._handlePopperPlacementChange(data);
_this25._handlePopperPlacementChange(data);
}
},
onUpdate: function onUpdate(data) {
_this24._handlePopperPlacementChange(data);
_this25._handlePopperPlacementChange(data);
}
});
@ -3202,16 +3244,16 @@ var Tooltip = function ($) {
}
var complete = function complete() {
if (_this24.config.animation) {
_this24._fixTransition();
if (_this25.config.animation) {
_this25._fixTransition();
}
var prevHoverState = _this24._hoverState;
_this24._hoverState = null;
var prevHoverState = _this25._hoverState;
_this25._hoverState = null;
$(_this24.element).trigger(_this24.constructor.Event.SHOWN);
$(_this25.element).trigger(_this25.constructor.Event.SHOWN);
if (prevHoverState === HoverState.OUT) {
_this24._leave(null, _this24);
_this25._leave(null, _this25);
}
};
@ -3224,20 +3266,20 @@ var Tooltip = function ($) {
};
Tooltip.prototype.hide = function hide(callback) {
var _this25 = this;
var _this26 = this;
var tip = this.getTipElement();
var hideEvent = $.Event(this.constructor.Event.HIDE);
var complete = function complete() {
if (_this25._hoverState !== HoverState.SHOW && tip.parentNode) {
if (_this26._hoverState !== HoverState.SHOW && tip.parentNode) {
tip.parentNode.removeChild(tip);
}
_this25._cleanTipClass();
_this25.element.removeAttribute('aria-describedby');
$(_this25.element).trigger(_this25.constructor.Event.HIDDEN);
if (_this25._popper !== null) {
_this25._popper.destroy();
_this26._cleanTipClass();
_this26.element.removeAttribute('aria-describedby');
$(_this26.element).trigger(_this26.constructor.Event.HIDDEN);
if (_this26._popper !== null) {
_this26._popper.destroy();
}
if (callback) {
@ -3332,28 +3374,28 @@ var Tooltip = function ($) {
};
Tooltip.prototype._setListeners = function _setListeners() {
var _this26 = this;
var _this27 = this;
var triggers = this.config.trigger.split(' ');
triggers.forEach(function (trigger) {
if (trigger === 'click') {
$(_this26.element).on(_this26.constructor.Event.CLICK, _this26.config.selector, function (event) {
return _this26.toggle(event);
$(_this27.element).on(_this27.constructor.Event.CLICK, _this27.config.selector, function (event) {
return _this27.toggle(event);
});
} else if (trigger !== Trigger.MANUAL) {
var eventIn = trigger === Trigger.HOVER ? _this26.constructor.Event.MOUSEENTER : _this26.constructor.Event.FOCUSIN;
var eventOut = trigger === Trigger.HOVER ? _this26.constructor.Event.MOUSELEAVE : _this26.constructor.Event.FOCUSOUT;
var eventIn = trigger === Trigger.HOVER ? _this27.constructor.Event.MOUSEENTER : _this27.constructor.Event.FOCUSIN;
var eventOut = trigger === Trigger.HOVER ? _this27.constructor.Event.MOUSELEAVE : _this27.constructor.Event.FOCUSOUT;
$(_this26.element).on(eventIn, _this26.config.selector, function (event) {
return _this26._enter(event);
}).on(eventOut, _this26.config.selector, function (event) {
return _this26._leave(event);
$(_this27.element).on(eventIn, _this27.config.selector, function (event) {
return _this27._enter(event);
}).on(eventOut, _this27.config.selector, function (event) {
return _this27._leave(event);
});
}
$(_this26.element).closest('.modal').on('hide.bs.modal', function () {
return _this26.hide();
$(_this27.element).closest('.modal').on('hide.bs.modal', function () {
return _this27.hide();
});
});
@ -3625,7 +3667,7 @@ var Popover = function ($) {
placement: 'right',
trigger: 'click',
content: '',
template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-title"></h3>' + '<div class="popover-content"></div></div>'
template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
});
var DefaultType = $.extend({}, Tooltip.DefaultType, {
@ -3638,8 +3680,8 @@ var Popover = function ($) {
};
var Selector = {
TITLE: '.popover-title',
CONTENT: '.popover-content'
TITLE: '.popover-header',
CONTENT: '.popover-body'
};
var Event = {

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

3
library/popper/popper.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -46,12 +46,6 @@ nav .dropdown-menu {
overflow: auto;
}
/* this is a hack and needs fixing in bootstrap */
nav .dropdown-menu-right {
right: 0;
left: auto !important;
}
#navbar-collapse-2 {
flex-basis: 100%;
max-height: 70vh;

View File

@ -13,6 +13,7 @@ function commentOpenUI(obj, id) {
$("#comment-edit-text-" + id).attr('tabindex','9');
$("#comment-edit-submit-" + id).attr('tabindex','10');
$("#comment-tools-" + id).show();
$("#comment-edit-anon-" + id).show();
}
};
@ -41,6 +42,7 @@ function commentOpen(obj, id) {
$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
$("#mod-cmnt-wrap-" + id).show();
$("#comment-edit-anon-" + id).show();
openMenu("comment-tools-" + id);
return true;
}

View File

@ -1339,6 +1339,14 @@ main.fullscreen .section-content-wrapper-np {
}
/* bootstrap overrides */
.btn,
.rounded-top,
.form-control,
.nav-pills .nav-link,
.nav-tabs .nav-link {
border-radius: $radius;
}
blockquote {
font-size: 1rem;
font-style: italic;
@ -1353,10 +1361,6 @@ blockquote {
border-radius: $radius;
}
.dropdown-menu img {
border-radius: $radius;
}
.dropdown-item {
color: $font_colour;
}
@ -1491,7 +1495,7 @@ dl.bb-dl > dd > li {
.form-group.checkbox > div label {
display: block; overflow: hidden; cursor: pointer;
border: 1px solid #ccc;
border-radius: 4px;
border-radius: $radius;
margin:0px;
-webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;

View File

@ -8,7 +8,7 @@ head_add_css('/library/datetimepicker/jquery.datetimepicker.css');
head_add_css('/library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css');
require_once('view/php/theme_init.php');
head_add_js('/library/popper/popper.js');
head_add_js('/library/popper/popper.min.js');
head_add_js('/library/bootstrap/js/bootstrap.min.js');
head_add_js('/library/bootbox/bootbox.min.js');
head_add_js('/library/bootstrap-tagsinput/bootstrap-tagsinput.js');

View File

@ -10,6 +10,14 @@
<input type="hidden" name="return" value="{{$return_path}}" />
<input type="hidden" name="jsreload" value="{{$jsreload}}" />
<input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" />
{{if $anoncomments && ! $observer}}
<div id="comment-edit-anon-{{$id}}" style="display: none;" >
{{include file="field_input.tpl" field=$anonname}}
{{include file="field_input.tpl" field=$anonmail}}
{{include file="field_input.tpl" field=$anonurl}}
{{$anon_extras}}
</div>
{{/if}}
<textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" onFocus="commentOpenUI(this,{{$id}});" onBlur="commentCloseUI(this,{{$id}});" ondragenter="linkdropper(event);" ondragleave="linkdropexit(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >{{$comment}}</textarea>
{{if $qcomment}}
<select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});" >

View File

@ -101,6 +101,17 @@
<button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
<div class="dropdown-menu">{{$item.attachments}}</div>
</div>
{{/if}}
{{if $item.mode === 'moderate'}}
<div class="wall-item-tools-left btn-group">
<a href="moderate/{{$item.id}}/approve" class="btn btn-outline-secondary btn-small">{{$item.approve}}</a>
<a href="moderate/{{$item.id}}/drop" class="btn btn-outline-secondary btn-small">{{$item.delete}}</a>
</div>
{{/if}}
</div>
</div>