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(); $perms = Permissions::Perms();
$limits = array(); $limits = array();
foreach($perms as $k => $v) { foreach($perms as $k => $v) {
if(strstr($k,'view')) if(strstr($k,'view') || $k === 'post_comments')
$limits[$k] = PERMS_PUBLIC; $limits[$k] = PERMS_PUBLIC;
else else
$limits[$k] = PERMS_SPECIFIC; $limits[$k] = PERMS_SPECIFIC;

View File

@ -271,6 +271,7 @@ class Notifier {
// Check for non published items, but allow an exclusion for transmitting hidden file activities // 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))) { ( intval($target_item['item_hidden']) && ($target_item['obj_type'] !== ACTIVITY_OBJ_FILE))) {
logger('notifier: target item not published, so not forwardable', LOGGER_DEBUG); logger('notifier: target item not published, so not forwardable', LOGGER_DEBUG);
return; return;

View File

@ -170,6 +170,7 @@ class Enotify {
xchan_query($p); xchan_query($p);
$moderated = (($p[0]['item_blocked'] = ITEM_MODERATED) ? true : false);
$item_post_type = item_post_type($p[0]); $item_post_type = item_post_type($p[0]);
// $private = $p[0]['item_private']; // $private = $p[0]['item_private'];
@ -208,6 +209,9 @@ class Enotify {
// Before this we have the name of the replier on the subject rendering // Before this we have the name of the replier on the subject rendering
// differents subjects for messages on the same thread. // differents subjects for messages on the same thread.
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']); $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']); $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; $epreamble = $dest_str;
@ -215,6 +219,11 @@ class Enotify {
$sitelink = t('Please visit %s to view and/or reply to the conversation.'); $sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl ); $tsitelink = sprintf( $sitelink, $siteurl );
$hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>'); $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) { if ($params['type'] == NOTIFY_LIKE) {

View File

@ -153,7 +153,7 @@ class ThreadItem {
$response_verbs[] = 'attendyes'; $response_verbs[] = 'attendyes';
$response_verbs[] = 'attendno'; $response_verbs[] = 'attendno';
$response_verbs[] = 'attendmaybe'; $response_verbs[] = 'attendmaybe';
if($this->is_commentable()) { if($this->is_commentable() && $observer) {
$isevent = true; $isevent = true;
$attend = array( t('I will attend'), t('I will not attend'), t('I might attend')); $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[] = 'agree';
$response_verbs[] = 'disagree'; $response_verbs[] = 'disagree';
$response_verbs[] = 'abstain'; $response_verbs[] = 'abstain';
if($this->is_commentable()) { if($this->is_commentable() && $observer) {
$conlabels = array( t('I agree'), t('I disagree'), t('I abstain')); $conlabels = array( t('I agree'), t('I disagree'), t('I abstain'));
$canvote = true; $canvote = true;
} }
@ -265,7 +265,7 @@ class ThreadItem {
if(($item['obj_type'] === ACTIVITY_OBJ_EVENT) && $conv->get_profile_owner() == local_channel()) if(($item['obj_type'] === ACTIVITY_OBJ_EVENT) && $conv->get_profile_owner() == local_channel())
$has_event = true; $has_event = true;
if($this->is_commentable()) { if($this->is_commentable() && $observer) {
$like = array( t("I like this \x28toggle\x29"), t("like")); $like = array( t("I like this \x28toggle\x29"), t("like"));
$dislike = array( t("I don't like this \x28toggle\x29"), t("dislike")); $dislike = array( t("I don't like this \x28toggle\x29"), t("dislike"));
} }
@ -371,7 +371,7 @@ class ThreadItem {
'has_tags' => $has_tags, 'has_tags' => $has_tags,
'reactions' => $this->reactions, 'reactions' => $this->reactions,
// Item toolbar buttons // 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, 'like' => $like,
'dislike' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike : ''), 'dislike' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike : ''),
'share' => $share, 'share' => $share,
@ -743,8 +743,12 @@ class ThreadItem {
'$feature_encrypt' => ((feature_enabled($conv->get_profile_owner(),'content_encrypt')) ? true : false), '$feature_encrypt' => ((feature_enabled($conv->get_profile_owner(),'content_encrypt')) ? true : false),
'$encrypt' => t('Encrypt text'), '$encrypt' => t('Encrypt text'),
'$cipher' => $conv->get_cipher(), '$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; return $comment_box;

View File

@ -158,7 +158,7 @@ class ThreadStream {
if(intval($item->get_data_value('item_nocomment'))) { if(intval($item->get_data_value('item_nocomment'))) {
$item->set_commentable(false); $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'])) 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')); $item->set_commentable(perm_is_allowed($this->profile_owner,$ob_hash,'post_comments'));
else 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 // This will change. Figure out who the observer is and whether or not
// they have permission to post here. Else ignore the post. // 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; return;
$uid = local_channel(); $uid = local_channel();
@ -206,8 +206,27 @@ class Item extends \Zotlabs\Web\Controller {
} }
if(! $observer) $moderated = false;
if(! $observer) {
$observer = \App::get_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) { if($parent) {
logger('mod_item: item_post parent=' . $parent); logger('mod_item: item_post parent=' . $parent);
@ -312,7 +331,7 @@ class Item extends \Zotlabs\Web\Controller {
$walltowall = false; $walltowall = false;
$walltowall_comment = false; $walltowall_comment = false;
if($remote_xchan) if($remote_xchan && ! $moderated)
$observer = $remote_observer; $observer = $remote_observer;
if($observer) { if($observer) {
@ -997,6 +1016,10 @@ class Item extends \Zotlabs\Web\Controller {
logger('post_complete'); logger('post_complete');
if($moderated) {
info(t('Your comment is awaiting approval.') . EOL);
}
// figure out how to return, depending on from whence we came // figure out how to return, depending on from whence we came
if($api_source) if($api_source)

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) { foreach($global_perms as $k => $perm) {
$options = array(); $options = array();
foreach($perm_opts as $opt) { 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; continue;
$options[$opt[1]] = $opt[0]; $options[$opt[1]] = $opt[0];
} }

View File

@ -50,7 +50,7 @@ require_once('include/attach.php');
define ( 'PLATFORM_NAME', 'hubzilla' ); define ( 'PLATFORM_NAME', 'hubzilla' );
define ( 'STD_VERSION', '2.5.3' ); define ( 'STD_VERSION', '2.5.4' );
define ( 'ZOT_REVISION', '1.2' ); define ( 'ZOT_REVISION', '1.2' );
define ( 'DB_UPDATE_VERSION', 1191 ); 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_MOOD', NAMESPACE_ZOT . '/activity/mood' );
define ( 'ACTIVITY_OBJ_COMMENT', NAMESPACE_ACTIVITY_SCHEMA . 'comment' ); 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_NOTE', NAMESPACE_ACTIVITY_SCHEMA . 'note' );
define ( 'ACTIVITY_OBJ_PERSON', NAMESPACE_ACTIVITY_SCHEMA . 'person' ); define ( 'ACTIVITY_OBJ_PERSON', NAMESPACE_ACTIVITY_SCHEMA . 'person' );
define ( 'ACTIVITY_OBJ_PHOTO', NAMESPACE_ACTIVITY_SCHEMA . 'photo' ); define ( 'ACTIVITY_OBJ_PHOTO', NAMESPACE_ACTIVITY_SCHEMA . 'photo' );

View File

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

View File

@ -259,7 +259,7 @@ function get_atom_elements($feed, $item, &$author) {
if(substr($author['author_link'],-1,1) == '/') if(substr($author['author_link'],-1,1) == '/')
$author['author_link'] = substr($author['author_link'],0,-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['title'] = unxmlify($item->get_title());
$res['body'] = unxmlify($item->get_content()); $res['body'] = unxmlify($item->get_content());
$res['plink'] = unxmlify($item->get_link(0)); $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 // No photo/profile-link on the item - look at the feed level
if((! (x($author,'author_link'))) || (! (x($author,'author_photo')))) { if((! (x($author,'author_link'))) || (! (x($author,'author_photo')))) {
$rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author'); $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author');
if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) { 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'); $rawcnv = $item->get_item_tags(NAMESPACE_OSTATUS, 'conversation');
if($rawcnv) { 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); set_iconfig($res,'ostatus','conversation',$ostatus_conversation,true);
} }
@ -602,6 +603,10 @@ function get_atom_elements($feed, $item, &$author) {
if(! $type) if(! $type)
$type = 'application/octet-stream'; $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 ); $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; $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); feed_get_reshare($res,$item);
} }
@ -713,14 +721,14 @@ function feed_get_reshare(&$res,$item) {
if($rawobj) { 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']) { 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']) { 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']) { 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']) 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) if($rawcreated)
$share['created'] = unxmlify($rawcreated[0]['data']); $share['created'] = unxmlify($rawcreated[0]['data']);
else else
@ -766,13 +775,19 @@ function feed_get_reshare(&$res,$item) {
} }
} }
$attach = $rawobj->get_enclosures(); $attach = $share['links'];
if($attach) { if($attach) {
foreach($attach as $att) { foreach($attach as $att) {
$len = intval($att->get_length()); if($att['rel'] === 'alternate') {
$link = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att->get_link())))); $share['alternate'] = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att['href']))));
$title = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att->get_title())))); continue;
$type = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att->get_type())))); }
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,';')) if(strpos($type,';'))
$type = substr($type,0,strpos($type,';')); $type = substr($type,0,strpos($type,';'));
if((! $link) || (strpos($link,'http') !== 0)) if((! $link) || (strpos($link,'http') !== 0))
@ -792,11 +807,12 @@ function feed_get_reshare(&$res,$item) {
$res['body'] = "[share author='" . urlencode($share['author']) . $res['body'] = "[share author='" . urlencode($share['author']) .
"' profile='" . $share['profile'] . "' profile='" . $share['profile'] .
"' avatar='" . $share['avatar'] . "' avatar='" . $share['avatar'] .
"' link='" . $share['link'] . "' link='" . $share['alternate'] .
"' posted='" . $share['created'] . "' posted='" . $share['created'] .
"' message_id='" . $share['message_id'] . "']"; "' 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(); $l = array();
if($link['attribs']['']['rel']) if($link['attribs']['']['rel'])
$l['rel'] = $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']) if($link['attribs']['']['type'])
$l['type'] = $link['attribs']['']['type']; $l['type'] = $link['attribs']['']['type'];
if($link['attribs']['']['href']) if($link['attribs']['']['href'])
@ -938,7 +958,6 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
foreach($items as $item) { foreach($items as $item) {
$is_reply = false; $is_reply = false;
$item_id = normalise_id($item->get_id());
logger('processing ' . $item->get_id(), LOGGER_DEBUG); 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. // Have we seen it? If not, import it.
$item_id = normalise_id($item->get_id());
$author = array(); $author = array();
$datarray = get_atom_elements($feed,$item,$author); $datarray = get_atom_elements($feed,$item,$author);
if($datarray['mid']) if(! $datarray['mid'])
$datarray['mid'] = normalise_id($item->get_id()); continue;
if($contact['xchan_network'] === 'rss') { if($contact['xchan_network'] === 'rss') {
$datarray['public_policy'] = 'specific'; $datarray['public_policy'] = 'specific';
@ -987,7 +1005,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$datarray['owner_xchan'] = $contact['xchan_hash']; $datarray['owner_xchan'] = $contact['xchan_hash'];
$r = q("SELECT edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1", $r = q("SELECT edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
dbesc($item_id), dbesc($datarray['mid']),
intval($importer['channel_id']) intval($importer['channel_id'])
); );
@ -1010,6 +1028,9 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$pmid = ''; $pmid = '';
$conv_id = get_iconfig($datarray,'ostatus','conversation'); $conv_id = get_iconfig($datarray,'ostatus','conversation');
// match conversations - first try ostatus:conversation
// next try thr:in_reply_to
if($conv_id) { 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", $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), dbesc($conv_id),
@ -1020,14 +1041,14 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$datarray['parent_mid'] = $pmid; $datarray['parent_mid'] = $pmid;
} }
} }
else { if(! $pmid) {
$x = q("select mid from item where mid = '%s' and uid = %d limit 1", $x = q("select parent_mid from item where mid = '%s' and uid = %d limit 1",
dbesc($parent_mid), dbesc($parent_mid),
intval($importer['channel_id']) intval($importer['channel_id'])
); );
if($x) { if($x) {
$pmid = $x[0]['mid']; $pmid = $x[0]['parent_mid'];
$datarray['parent_mid'] = $pmid; $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. // Head post of a conversation. Have we seen it? If not, import it.
$item_id = normalise_id($item->get_id());
$author = array(); $author = array();
$datarray = get_atom_elements($feed,$item,$author); $datarray = get_atom_elements($feed,$item,$author);
if($datarray['mid']) if(! $datarray['mid'])
$datarray['mid'] = normalise_id($item->get_id()); continue;
if($contact['xchan_network'] === 'rss') { if($contact['xchan_network'] === 'rss') {
$datarray['public_policy'] = 'specific'; $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", $r = q("SELECT edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
dbesc($item_id), dbesc($datarray['mid']),
intval($importer['channel_id']) intval($importer['channel_id'])
); );
@ -1136,7 +1156,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
continue; continue;
} }
$datarray['parent_mid'] = $item_id; $datarray['parent_mid'] = $datarray['mid'];
$datarray['uid'] = $importer['channel_id']; $datarray['uid'] = $importer['channel_id'];
$datarray['aid'] = $importer['channel_account_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']))) { 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']); $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"; $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; return $ret;
} }

View File

@ -938,7 +938,7 @@ function import_author_unknown($x) {
$photos = import_xchan_photo($x['photo']['src'],$x['url']); $photos = import_xchan_photo($x['photo']['src'],$x['url']);
if($photos) { 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(datetime_convert()),
dbesc($photos[0]), dbesc($photos[0]),
dbesc($photos[1]), 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 { .form-control {
display: block; display: block;
width: 100%; width: 100%;
padding: 0.5rem 1rem; padding: 0.5rem 0.75rem;
font-size: 1rem; font-size: 1rem;
line-height: 1.25; line-height: 1.25;
color: #464a4c; color: #464a4c;
@ -2249,7 +2249,7 @@ select.form-control:focus::-ms-value {
font-size: 1rem; font-size: 1rem;
} }
.form-control-static { .form-control-plaintext {
padding-top: 0.5rem; padding-top: 0.5rem;
padding-bottom: 0.5rem; padding-bottom: 0.5rem;
margin-bottom: 0; margin-bottom: 0;
@ -2258,11 +2258,11 @@ select.form-control:focus::-ms-value {
border-width: 1px 0; border-width: 1px 0;
} }
.form-control-static.form-control-sm, .input-group-sm > .form-control-static.form-control, .form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control,
.input-group-sm > .form-control-static.input-group-addon, .input-group-sm > .form-control-plaintext.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-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-static.input-group-addon, .input-group-lg > .form-control-plaintext.input-group-addon,
.input-group-lg > .input-group-btn > .form-control-static.btn { .input-group-lg > .input-group-btn > .form-control-plaintext.btn {
padding-right: 0; padding-right: 0;
padding-left: 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]), 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 > select.input-group-addon:not([size]):not([multiple]),
.input-group-lg > .input-group-btn > select.btn: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 { .form-group {
@ -2306,6 +2306,24 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
margin-top: 0.25rem; 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 { .form-check {
position: relative; position: relative;
display: block; display: block;
@ -2343,90 +2361,124 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
margin-left: 0.75rem; margin-left: 0.75rem;
} }
.form-control-feedback { .invalid-feedback {
margin-top: 0.25rem; display: none;
} margin-top: .25rem;
font-size: .875rem;
.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 {
color: #d9534f; color: #d9534f;
} }
.has-danger .form-control, .invalid-tooltip {
.has-danger .custom-select, position: absolute;
.has-danger .custom-file-control { 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; 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; 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; border-color: #d9534f;
} }
.has-danger .form-control-danger { .was-validated .custom-file-input:invalid ~ .custom-file-control::before, .custom-file-input.is-invalid ~ .custom-file-control::before {
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"); 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 { .form-inline {
@ -2563,7 +2615,7 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
-ms-user-select: none; -ms-user-select: none;
user-select: none; user-select: none;
border: 1px solid transparent; border: 1px solid transparent;
padding: 0.5rem 1rem; padding: 0.5rem 0.75rem;
font-size: 1rem; font-size: 1rem;
line-height: 1.25; line-height: 1.25;
border-radius: 0.25rem; 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 { .btn:focus, .btn.focus {
outline: 0; outline: 0;
-webkit-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 2px rgba(2, 117, 216, 0.25); box-shadow: 0 0 0 3px rgba(2, 117, 216, 0.25);
} }
.btn.disabled, .btn:disabled { .btn.disabled, .btn:disabled {
@ -2608,8 +2660,8 @@ fieldset[disabled] a.btn {
} }
.btn-primary:focus, .btn-primary.focus { .btn-primary:focus, .btn-primary.focus {
-webkit-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 2px rgba(2, 117, 216, 0.5); box-shadow: 0 0 0 3px rgba(2, 117, 216, 0.5);
} }
.btn-primary.disabled, .btn-primary:disabled { .btn-primary.disabled, .btn-primary:disabled {
@ -2638,8 +2690,8 @@ fieldset[disabled] a.btn {
} }
.btn-secondary:focus, .btn-secondary.focus { .btn-secondary:focus, .btn-secondary.focus {
-webkit-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 2px rgba(204, 204, 204, 0.5); box-shadow: 0 0 0 3px rgba(204, 204, 204, 0.5);
} }
.btn-secondary.disabled, .btn-secondary:disabled { .btn-secondary.disabled, .btn-secondary:disabled {
@ -2668,8 +2720,8 @@ fieldset[disabled] a.btn {
} }
.btn-info:focus, .btn-info.focus { .btn-info:focus, .btn-info.focus {
-webkit-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 2px rgba(91, 192, 222, 0.5); box-shadow: 0 0 0 3px rgba(91, 192, 222, 0.5);
} }
.btn-info.disabled, .btn-info:disabled { .btn-info.disabled, .btn-info:disabled {
@ -2698,8 +2750,8 @@ fieldset[disabled] a.btn {
} }
.btn-success:focus, .btn-success.focus { .btn-success:focus, .btn-success.focus {
-webkit-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 2px rgba(92, 184, 92, 0.5); box-shadow: 0 0 0 3px rgba(92, 184, 92, 0.5);
} }
.btn-success.disabled, .btn-success:disabled { .btn-success.disabled, .btn-success:disabled {
@ -2728,8 +2780,8 @@ fieldset[disabled] a.btn {
} }
.btn-warning:focus, .btn-warning.focus { .btn-warning:focus, .btn-warning.focus {
-webkit-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 2px rgba(240, 173, 78, 0.5); box-shadow: 0 0 0 3px rgba(240, 173, 78, 0.5);
} }
.btn-warning.disabled, .btn-warning:disabled { .btn-warning.disabled, .btn-warning:disabled {
@ -2758,8 +2810,8 @@ fieldset[disabled] a.btn {
} }
.btn-danger:focus, .btn-danger.focus { .btn-danger:focus, .btn-danger.focus {
-webkit-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 2px rgba(217, 83, 79, 0.5); box-shadow: 0 0 0 3px rgba(217, 83, 79, 0.5);
} }
.btn-danger.disabled, .btn-danger:disabled { .btn-danger.disabled, .btn-danger:disabled {
@ -2789,8 +2841,8 @@ fieldset[disabled] a.btn {
} }
.btn-outline-primary:focus, .btn-outline-primary.focus { .btn-outline-primary:focus, .btn-outline-primary.focus {
-webkit-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 2px 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 { .btn-outline-primary.disabled, .btn-outline-primary:disabled {
@ -2819,8 +2871,8 @@ fieldset[disabled] a.btn {
} }
.btn-outline-secondary:focus, .btn-outline-secondary.focus { .btn-outline-secondary:focus, .btn-outline-secondary.focus {
-webkit-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 2px 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 { .btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
@ -2849,8 +2901,8 @@ fieldset[disabled] a.btn {
} }
.btn-outline-info:focus, .btn-outline-info.focus { .btn-outline-info:focus, .btn-outline-info.focus {
-webkit-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 2px 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 { .btn-outline-info.disabled, .btn-outline-info:disabled {
@ -2879,8 +2931,8 @@ fieldset[disabled] a.btn {
} }
.btn-outline-success:focus, .btn-outline-success.focus { .btn-outline-success:focus, .btn-outline-success.focus {
-webkit-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 2px 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 { .btn-outline-success.disabled, .btn-outline-success:disabled {
@ -2909,8 +2961,8 @@ fieldset[disabled] a.btn {
} }
.btn-outline-warning:focus, .btn-outline-warning.focus { .btn-outline-warning:focus, .btn-outline-warning.focus {
-webkit-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 2px 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 { .btn-outline-warning.disabled, .btn-outline-warning:disabled {
@ -2939,8 +2991,8 @@ fieldset[disabled] a.btn {
} }
.btn-outline-danger:focus, .btn-outline-danger.focus { .btn-outline-danger:focus, .btn-outline-danger.focus {
-webkit-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 2px 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 { .btn-outline-danger.disabled, .btn-outline-danger:disabled {
@ -3253,8 +3305,8 @@ tbody.collapse.show {
} }
.btn + .dropdown-toggle-split { .btn + .dropdown-toggle-split {
padding-right: 0.75rem; padding-right: 0.5625rem;
padding-left: 0.75rem; padding-left: 0.5625rem;
} }
.btn + .dropdown-toggle-split::after { .btn + .dropdown-toggle-split::after {
@ -3392,7 +3444,7 @@ tbody.collapse.show {
} }
.input-group-addon { .input-group-addon {
padding: 0.5rem 1rem; padding: 0.5rem 0.75rem;
margin-bottom: 0; margin-bottom: 0;
font-size: 1rem; font-size: 1rem;
font-weight: normal; font-weight: normal;
@ -3629,6 +3681,7 @@ tbody.collapse.show {
} }
.custom-select-sm { .custom-select-sm {
height: calc(1.8125rem + 2px);
padding-top: 0.375rem; padding-top: 0.375rem;
padding-bottom: 0.375rem; padding-bottom: 0.375rem;
font-size: 75%; font-size: 75%;
@ -3762,7 +3815,7 @@ tbody.collapse.show {
} }
.nav-pills .nav-link.active, .nav-pills .nav-link.active,
.show .nav-pills .nav-link { .show > .nav-pills .nav-link {
color: #fff; color: #fff;
background-color: #0275d8; background-color: #0275d8;
} }
@ -3877,11 +3930,8 @@ tbody.collapse.show {
} }
.navbar-nav .dropdown-menu { .navbar-nav .dropdown-menu {
position: static !important; position: static;
float: none; float: none;
-webkit-transform: unset !important;
-o-transform: unset !important;
transform: unset !important;
} }
.navbar-text { .navbar-text {
@ -3951,8 +4001,11 @@ tbody.collapse.show {
flex-direction: row; flex-direction: row;
} }
.navbar-expand-sm .navbar-nav .dropdown-menu { .navbar-expand-sm .navbar-nav .dropdown-menu {
position: absolute !important; position: absolute;
top: 100% !important; }
.navbar-expand-sm .navbar-nav .dropdown-menu-right {
right: 0;
left: auto;
} }
.navbar-expand-sm .navbar-nav .nav-link { .navbar-expand-sm .navbar-nav .nav-link {
padding-right: .5rem; padding-right: .5rem;
@ -4006,8 +4059,11 @@ tbody.collapse.show {
flex-direction: row; flex-direction: row;
} }
.navbar-expand-md .navbar-nav .dropdown-menu { .navbar-expand-md .navbar-nav .dropdown-menu {
position: absolute !important; position: absolute;
top: 100% !important; }
.navbar-expand-md .navbar-nav .dropdown-menu-right {
right: 0;
left: auto;
} }
.navbar-expand-md .navbar-nav .nav-link { .navbar-expand-md .navbar-nav .nav-link {
padding-right: .5rem; padding-right: .5rem;
@ -4061,8 +4117,11 @@ tbody.collapse.show {
flex-direction: row; flex-direction: row;
} }
.navbar-expand-lg .navbar-nav .dropdown-menu { .navbar-expand-lg .navbar-nav .dropdown-menu {
position: absolute !important; position: absolute;
top: 100% !important; }
.navbar-expand-lg .navbar-nav .dropdown-menu-right {
right: 0;
left: auto;
} }
.navbar-expand-lg .navbar-nav .nav-link { .navbar-expand-lg .navbar-nav .nav-link {
padding-right: .5rem; padding-right: .5rem;
@ -4116,8 +4175,11 @@ tbody.collapse.show {
flex-direction: row; flex-direction: row;
} }
.navbar-expand-xl .navbar-nav .dropdown-menu { .navbar-expand-xl .navbar-nav .dropdown-menu {
position: absolute !important; position: absolute;
top: 100% !important; }
.navbar-expand-xl .navbar-nav .dropdown-menu-right {
right: 0;
left: auto;
} }
.navbar-expand-xl .navbar-nav .nav-link { .navbar-expand-xl .navbar-nav .nav-link {
padding-right: .5rem; padding-right: .5rem;
@ -4170,8 +4232,12 @@ tbody.collapse.show {
} }
.navbar-expand .navbar-nav .dropdown-menu { .navbar-expand .navbar-nav .dropdown-menu {
position: absolute !important; position: absolute;
top: 100% !important; }
.navbar-expand .navbar-nav .dropdown-menu-right {
right: 0;
left: auto;
} }
.navbar-expand .navbar-nav .nav-link { .navbar-expand .navbar-nav .nav-link {
@ -4288,12 +4354,14 @@ tbody.collapse.show {
-webkit-flex-direction: column; -webkit-flex-direction: column;
-ms-flex-direction: column; -ms-flex-direction: column;
flex-direction: column; flex-direction: column;
min-width: 0;
word-wrap: break-word;
background-color: #fff; background-color: #fff;
border: 1px solid rgba(0, 0, 0, 0.125); border: 1px solid rgba(0, 0, 0, 0.125);
border-radius: 0.25rem; border-radius: 0.25rem;
} }
.card-block { .card-body {
-webkit-box-flex: 1; -webkit-box-flex: 1;
-webkit-flex: 1 1 auto; -webkit-flex: 1 1 auto;
-ms-flex: 1 1 auto; -ms-flex: 1 1 auto;
@ -4303,7 +4371,6 @@ tbody.collapse.show {
.card-title { .card-title {
margin-bottom: 0.75rem; margin-bottom: 0.75rem;
word-break: break-all;
} }
.card-subtitle { .card-subtitle {
@ -4562,8 +4629,8 @@ tbody.collapse.show {
display: -ms-flexbox; display: -ms-flexbox;
display: flex; display: flex;
-webkit-box-flex: 1; -webkit-box-flex: 1;
-webkit-flex: 1 0 0; -webkit-flex: 1 0 0%;
-ms-flex: 1 0 0px; -ms-flex: 1 0 0%;
flex: 1 0 0%; flex: 1 0 0%;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
-webkit-box-direction: normal; -webkit-box-direction: normal;
@ -4589,8 +4656,8 @@ tbody.collapse.show {
} }
.card-group .card { .card-group .card {
-webkit-box-flex: 1; -webkit-box-flex: 1;
-webkit-flex: 1 0 0; -webkit-flex: 1 0 0%;
-ms-flex: 1 0 0px; -ms-flex: 1 0 0%;
flex: 1 0 0%; flex: 1 0 0%;
} }
.card-group .card + .card { .card-group .card + .card {
@ -4739,6 +4806,7 @@ tbody.collapse.show {
.pagination-lg .page-link { .pagination-lg .page-link {
padding: 0.75rem 1.5rem; padding: 0.75rem 1.5rem;
font-size: 1.25rem; font-size: 1.25rem;
line-height: 1.5;
} }
.pagination-lg .page-item:first-child .page-link { .pagination-lg .page-item:first-child .page-link {
@ -4754,6 +4822,7 @@ tbody.collapse.show {
.pagination-sm .page-link { .pagination-sm .page-link {
padding: 0.25rem 0.5rem; padding: 0.25rem 0.5rem;
font-size: 0.875rem; font-size: 0.875rem;
line-height: 1.5;
} }
.pagination-sm .page-item:first-child .page-link { .pagination-sm .page-item:first-child .page-link {
@ -5024,7 +5093,7 @@ a.badge:focus, a.badge:hover {
-webkit-box-flex: 1; -webkit-box-flex: 1;
-webkit-flex: 1; -webkit-flex: 1;
-ms-flex: 1; -ms-flex: 1;
flex: 1 1 0%; flex: 1;
} }
.list-group { .list-group {
@ -5671,7 +5740,7 @@ button.close {
border-bottom-color: #fff; 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; position: absolute;
top: 0; top: 0;
left: 50%; left: 50%;
@ -5706,7 +5775,7 @@ button.close {
border-left-color: #fff; border-left-color: #fff;
} }
.popover-title { .popover-header {
padding: 8px 14px; padding: 8px 14px;
margin-bottom: 0; margin-bottom: 0;
font-size: 1rem; font-size: 1rem;
@ -5717,11 +5786,11 @@ button.close {
border-top-right-radius: calc(0.3rem - 1px); border-top-right-radius: calc(0.3rem - 1px);
} }
.popover-title:empty { .popover-header:empty {
display: none; display: none;
} }
.popover-content { .popover-body {
padding: 9px 14px; padding: 9px 14px;
color: #292b2c; color: #292b2c;
} }
@ -6013,27 +6082,27 @@ a.bg-inverse:focus, a.bg-inverse:hover {
} }
.rounded { .rounded {
border-radius: 0.25rem; border-radius: 0.25rem !important;
} }
.rounded-top { .rounded-top {
border-top-left-radius: 0.25rem; border-top-left-radius: 0.25rem !important;
border-top-right-radius: 0.25rem; border-top-right-radius: 0.25rem !important;
} }
.rounded-right { .rounded-right {
border-top-right-radius: 0.25rem; border-top-right-radius: 0.25rem !important;
border-bottom-right-radius: 0.25rem; border-bottom-right-radius: 0.25rem !important;
} }
.rounded-bottom { .rounded-bottom {
border-bottom-right-radius: 0.25rem; border-bottom-right-radius: 0.25rem !important;
border-bottom-left-radius: 0.25rem; border-bottom-left-radius: 0.25rem !important;
} }
.rounded-left { .rounded-left {
border-top-left-radius: 0.25rem; border-top-left-radius: 0.25rem !important;
border-bottom-left-radius: 0.25rem; border-bottom-left-radius: 0.25rem !important;
} }
.rounded-circle { .rounded-circle {
@ -7276,11 +7345,13 @@ a.bg-inverse:focus, a.bg-inverse:hover {
z-index: 1030; z-index: 1030;
} }
.sticky-top { @supports ((position: -webkit-sticky) or (position: sticky)) {
.sticky-top {
position: -webkit-sticky; position: -webkit-sticky;
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 1020; z-index: 1020;
}
} }
.sr-only { .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._element = element;
this._config = this._getConfig(config); this._config = this._getConfig(config);
this._triggerArray = $.makeArray($('[data-toggle="collapse"][href="#' + element.id + '"],' + ('[data-toggle="collapse"][data-target="#' + element.id + '"]'))); 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; 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); $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
if (this._triggerArray.length) { 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); this.setTransitioning(true);
@ -1353,11 +1370,14 @@ var Collapse = function ($) {
event.preventDefault(); event.preventDefault();
} }
var target = Collapse._getTargetFromElement(this); var $trigger = $(this);
var data = $(target).data(DATA_KEY); var selector = Util.getSelectorFromElement(this);
var config = data ? 'toggle' : $(this).data(); $(selector).each(function () {
var $target = $(this);
Collapse._jQueryInterface.call($(target), config); 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._popper = null;
this._config = this._getConfig(config); this._config = this._getConfig(config);
this._menu = this._getMenuElement(); this._menu = this._getMenuElement();
this._inNavbar = this._detectNavbar();
this._addEventListeners(); this._addEventListeners();
} }
@ -1515,17 +1536,7 @@ var Dropdown = function ($) {
element = parent; element = parent;
} }
} }
this._popper = new Popper(element, this._menu, { this._popper = new Popper(element, this._menu, this._getPopperConfig());
placement: this._getPlacement(),
modifiers: {
offset: {
offset: this._config.offset
},
flip: {
enabled: this._config.flip
}
}
});
// if this is a touch-enabled device we add extra // if this is a touch-enabled device we add extra
// empty mouseover listeners to the body's immediate children; // empty mouseover listeners to the body's immediate children;
@ -1554,6 +1565,7 @@ var Dropdown = function ($) {
}; };
Dropdown.prototype.update = function update() { Dropdown.prototype.update = function update() {
this._inNavbar = this._detectNavbar();
if (this._popper !== null) { if (this._popper !== null) {
this._popper.scheduleUpdate(); this._popper.scheduleUpdate();
} }
@ -1602,14 +1614,44 @@ var Dropdown = function ($) {
if ($(this._menu).hasClass(ClassName.MENURIGHT)) { if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.TOPEND; placement = AttachmentMap.TOPEND;
} }
} else { } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
placement = AttachmentMap.BOTTOMEND; placement = AttachmentMap.BOTTOMEND;
} }
}
return placement; 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 // static
Dropdown._jQueryInterface = function _jQueryInterface(config) { Dropdown._jQueryInterface = function _jQueryInterface(config) {
@ -1887,7 +1929,7 @@ var Modal = function ($) {
}; };
Modal.prototype.show = function show(relatedTarget) { Modal.prototype.show = function show(relatedTarget) {
var _this10 = this; var _this11 = this;
if (this._isTransitioning) { if (this._isTransitioning) {
return; return;
@ -1918,24 +1960,24 @@ var Modal = function ($) {
this._setResizeEvent(); this._setResizeEvent();
$(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) { $(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 () { $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
$(_this10._element).one(Event.MOUSEUP_DISMISS, function (event) { $(_this11._element).one(Event.MOUSEUP_DISMISS, function (event) {
if ($(event.target).is(_this10._element)) { if ($(event.target).is(_this11._element)) {
_this10._ignoreBackdropClick = true; _this11._ignoreBackdropClick = true;
} }
}); });
}); });
this._showBackdrop(function () { this._showBackdrop(function () {
return _this10._showElement(relatedTarget); return _this11._showElement(relatedTarget);
}); });
}; };
Modal.prototype.hide = function hide(event) { Modal.prototype.hide = function hide(event) {
var _this11 = this; var _this12 = this;
if (event) { if (event) {
event.preventDefault(); event.preventDefault();
@ -1974,7 +2016,7 @@ var Modal = function ($) {
if (transition) { if (transition) {
$(this._element).one(Util.TRANSITION_END, function (event) { $(this._element).one(Util.TRANSITION_END, function (event) {
return _this11._hideModal(event); return _this12._hideModal(event);
}).emulateTransitionEnd(TRANSITION_DURATION); }).emulateTransitionEnd(TRANSITION_DURATION);
} else { } else {
this._hideModal(); this._hideModal();
@ -2009,7 +2051,7 @@ var Modal = function ($) {
}; };
Modal.prototype._showElement = function _showElement(relatedTarget) { Modal.prototype._showElement = function _showElement(relatedTarget) {
var _this12 = this; var _this13 = this;
var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE); var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
@ -2037,11 +2079,11 @@ var Modal = function ($) {
}); });
var transitionComplete = function transitionComplete() { var transitionComplete = function transitionComplete() {
if (_this12._config.focus) { if (_this13._config.focus) {
_this12._element.focus(); _this13._element.focus();
} }
_this12._isTransitioning = false; _this13._isTransitioning = false;
$(_this12._element).trigger(shownEvent); $(_this13._element).trigger(shownEvent);
}; };
if (transition) { if (transition) {
@ -2052,24 +2094,24 @@ var Modal = function ($) {
}; };
Modal.prototype._enforceFocus = function _enforceFocus() { Modal.prototype._enforceFocus = function _enforceFocus() {
var _this13 = this; var _this14 = this;
$(document).off(Event.FOCUSIN) // guard against infinite focus loop $(document).off(Event.FOCUSIN) // guard against infinite focus loop
.on(Event.FOCUSIN, function (event) { .on(Event.FOCUSIN, function (event) {
if (document !== event.target && _this13._element !== event.target && !$(_this13._element).has(event.target).length) { if (document !== event.target && _this14._element !== event.target && !$(_this14._element).has(event.target).length) {
_this13._element.focus(); _this14._element.focus();
} }
}); });
}; };
Modal.prototype._setEscapeEvent = function _setEscapeEvent() { Modal.prototype._setEscapeEvent = function _setEscapeEvent() {
var _this14 = this; var _this15 = this;
if (this._isShown && this._config.keyboard) { if (this._isShown && this._config.keyboard) {
$(this._element).on(Event.KEYDOWN_DISMISS, function (event) { $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
if (event.which === ESCAPE_KEYCODE) { if (event.which === ESCAPE_KEYCODE) {
event.preventDefault(); event.preventDefault();
_this14.hide(); _this15.hide();
} }
}); });
} else if (!this._isShown) { } else if (!this._isShown) {
@ -2078,11 +2120,11 @@ var Modal = function ($) {
}; };
Modal.prototype._setResizeEvent = function _setResizeEvent() { Modal.prototype._setResizeEvent = function _setResizeEvent() {
var _this15 = this; var _this16 = this;
if (this._isShown) { if (this._isShown) {
$(window).on(Event.RESIZE, function (event) { $(window).on(Event.RESIZE, function (event) {
return _this15.handleUpdate(event); return _this16.handleUpdate(event);
}); });
} else { } else {
$(window).off(Event.RESIZE); $(window).off(Event.RESIZE);
@ -2090,16 +2132,16 @@ var Modal = function ($) {
}; };
Modal.prototype._hideModal = function _hideModal() { Modal.prototype._hideModal = function _hideModal() {
var _this16 = this; var _this17 = this;
this._element.style.display = 'none'; this._element.style.display = 'none';
this._element.setAttribute('aria-hidden', true); this._element.setAttribute('aria-hidden', true);
this._isTransitioning = false; this._isTransitioning = false;
this._showBackdrop(function () { this._showBackdrop(function () {
$(document.body).removeClass(ClassName.OPEN); $(document.body).removeClass(ClassName.OPEN);
_this16._resetAdjustments(); _this17._resetAdjustments();
_this16._resetScrollbar(); _this17._resetScrollbar();
$(_this16._element).trigger(Event.HIDDEN); $(_this17._element).trigger(Event.HIDDEN);
}); });
}; };
@ -2111,7 +2153,7 @@ var Modal = function ($) {
}; };
Modal.prototype._showBackdrop = function _showBackdrop(callback) { Modal.prototype._showBackdrop = function _showBackdrop(callback) {
var _this17 = this; var _this18 = this;
var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : ''; var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
@ -2128,17 +2170,17 @@ var Modal = function ($) {
$(this._backdrop).appendTo(document.body); $(this._backdrop).appendTo(document.body);
$(this._element).on(Event.CLICK_DISMISS, function (event) { $(this._element).on(Event.CLICK_DISMISS, function (event) {
if (_this17._ignoreBackdropClick) { if (_this18._ignoreBackdropClick) {
_this17._ignoreBackdropClick = false; _this18._ignoreBackdropClick = false;
return; return;
} }
if (event.target !== event.currentTarget) { if (event.target !== event.currentTarget) {
return; return;
} }
if (_this17._config.backdrop === 'static') { if (_this18._config.backdrop === 'static') {
_this17._element.focus(); _this18._element.focus();
} else { } else {
_this17.hide(); _this18.hide();
} }
}); });
@ -2162,7 +2204,7 @@ var Modal = function ($) {
$(this._backdrop).removeClass(ClassName.SHOW); $(this._backdrop).removeClass(ClassName.SHOW);
var callbackRemove = function callbackRemove() { var callbackRemove = function callbackRemove() {
_this17._removeBackdrop(); _this18._removeBackdrop();
if (callback) { if (callback) {
callback(); callback();
} }
@ -2206,7 +2248,7 @@ var Modal = function ($) {
}; };
Modal.prototype._setScrollbar = function _setScrollbar() { Modal.prototype._setScrollbar = function _setScrollbar() {
var _this18 = this; var _this19 = this;
if (this._isBodyOverflowing) { if (this._isBodyOverflowing) {
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set // 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) { $(Selector.FIXED_CONTENT).each(function (index, element) {
var actualPadding = $(element)[0].style.paddingRight; var actualPadding = $(element)[0].style.paddingRight;
var calculatedPadding = $(element).css('padding-right'); 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 // Adjust navbar-toggler margin
$(Selector.NAVBAR_TOGGLER).each(function (index, element) { $(Selector.NAVBAR_TOGGLER).each(function (index, element) {
var actualMargin = $(element)[0].style.marginRight; var actualMargin = $(element)[0].style.marginRight;
var calculatedMargin = $(element).css('margin-right'); 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 // Adjust body padding
@ -2312,7 +2354,7 @@ var Modal = function ($) {
*/ */
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
var _this19 = this; var _this20 = this;
var target = void 0; var target = void 0;
var selector = Util.getSelectorFromElement(this); var selector = Util.getSelectorFromElement(this);
@ -2334,8 +2376,8 @@ var Modal = function ($) {
} }
$target.one(Event.HIDDEN, function () { $target.one(Event.HIDDEN, function () {
if ($(_this19).is(':visible')) { if ($(_this20).is(':visible')) {
_this19.focus(); _this20.focus();
} }
}); });
}); });
@ -2429,7 +2471,7 @@ var ScrollSpy = function ($) {
var ScrollSpy = function () { var ScrollSpy = function () {
function ScrollSpy(element, config) { function ScrollSpy(element, config) {
var _this20 = this; var _this21 = this;
_classCallCheck(this, ScrollSpy); _classCallCheck(this, ScrollSpy);
@ -2443,7 +2485,7 @@ var ScrollSpy = function ($) {
this._scrollHeight = 0; this._scrollHeight = 0;
$(this._scrollElement).on(Event.SCROLL, function (event) { $(this._scrollElement).on(Event.SCROLL, function (event) {
return _this20._process(event); return _this21._process(event);
}); });
this.refresh(); this.refresh();
@ -2455,7 +2497,7 @@ var ScrollSpy = function ($) {
// public // public
ScrollSpy.prototype.refresh = function refresh() { ScrollSpy.prototype.refresh = function refresh() {
var _this21 = this; var _this22 = this;
var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET; var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;
@ -2491,8 +2533,8 @@ var ScrollSpy = function ($) {
}).sort(function (a, b) { }).sort(function (a, b) {
return a[0] - b[0]; return a[0] - b[0];
}).forEach(function (item) { }).forEach(function (item) {
_this21._offsets.push(item[0]); _this22._offsets.push(item[0]);
_this21._targets.push(item[1]); _this22._targets.push(item[1]);
}); });
}; };
@ -2739,7 +2781,7 @@ var Tab = function ($) {
// public // public
Tab.prototype.show = function show() { 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)) { if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE) || $(this._element).hasClass(ClassName.DISABLED)) {
return; return;
@ -2781,7 +2823,7 @@ var Tab = function ($) {
var complete = function complete() { var complete = function complete() {
var hiddenEvent = $.Event(Event.HIDDEN, { var hiddenEvent = $.Event(Event.HIDDEN, {
relatedTarget: _this22._element relatedTarget: _this23._element
}); });
var shownEvent = $.Event(Event.SHOWN, { var shownEvent = $.Event(Event.SHOWN, {
@ -2789,7 +2831,7 @@ var Tab = function ($) {
}); });
$(previous).trigger(hiddenEvent); $(previous).trigger(hiddenEvent);
$(_this22._element).trigger(shownEvent); $(_this23._element).trigger(shownEvent);
}; };
if (target) { if (target) {
@ -2807,13 +2849,13 @@ var Tab = function ($) {
// private // private
Tab.prototype._activate = function _activate(element, container, callback) { Tab.prototype._activate = function _activate(element, container, callback) {
var _this23 = this; var _this24 = this;
var active = $(container).find(Selector.ACTIVE)[0]; var active = $(container).find(Selector.ACTIVE)[0];
var isTransitioning = callback && Util.supportsTransitionEnd() && active && $(active).hasClass(ClassName.FADE); var isTransitioning = callback && Util.supportsTransitionEnd() && active && $(active).hasClass(ClassName.FADE);
var complete = function complete() { var complete = function complete() {
return _this23._transitionComplete(element, active, isTransitioning, callback); return _this24._transitionComplete(element, active, isTransitioning, callback);
}; };
if (active && isTransitioning) { if (active && isTransitioning) {
@ -3125,7 +3167,7 @@ var Tooltip = function ($) {
}; };
Tooltip.prototype.show = function show() { Tooltip.prototype.show = function show() {
var _this24 = this; var _this25 = this;
if ($(this.element).css('display') === 'none') { if ($(this.element).css('display') === 'none') {
throw new Error('Please use show on visible elements'); throw new Error('Please use show on visible elements');
@ -3183,11 +3225,11 @@ var Tooltip = function ($) {
}, },
onCreate: function onCreate(data) { onCreate: function onCreate(data) {
if (data.originalPlacement !== data.placement) { if (data.originalPlacement !== data.placement) {
_this24._handlePopperPlacementChange(data); _this25._handlePopperPlacementChange(data);
} }
}, },
onUpdate: function onUpdate(data) { onUpdate: function onUpdate(data) {
_this24._handlePopperPlacementChange(data); _this25._handlePopperPlacementChange(data);
} }
}); });
@ -3202,16 +3244,16 @@ var Tooltip = function ($) {
} }
var complete = function complete() { var complete = function complete() {
if (_this24.config.animation) { if (_this25.config.animation) {
_this24._fixTransition(); _this25._fixTransition();
} }
var prevHoverState = _this24._hoverState; var prevHoverState = _this25._hoverState;
_this24._hoverState = null; _this25._hoverState = null;
$(_this24.element).trigger(_this24.constructor.Event.SHOWN); $(_this25.element).trigger(_this25.constructor.Event.SHOWN);
if (prevHoverState === HoverState.OUT) { 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) { Tooltip.prototype.hide = function hide(callback) {
var _this25 = this; var _this26 = this;
var tip = this.getTipElement(); var tip = this.getTipElement();
var hideEvent = $.Event(this.constructor.Event.HIDE); var hideEvent = $.Event(this.constructor.Event.HIDE);
var complete = function complete() { var complete = function complete() {
if (_this25._hoverState !== HoverState.SHOW && tip.parentNode) { if (_this26._hoverState !== HoverState.SHOW && tip.parentNode) {
tip.parentNode.removeChild(tip); tip.parentNode.removeChild(tip);
} }
_this25._cleanTipClass(); _this26._cleanTipClass();
_this25.element.removeAttribute('aria-describedby'); _this26.element.removeAttribute('aria-describedby');
$(_this25.element).trigger(_this25.constructor.Event.HIDDEN); $(_this26.element).trigger(_this26.constructor.Event.HIDDEN);
if (_this25._popper !== null) { if (_this26._popper !== null) {
_this25._popper.destroy(); _this26._popper.destroy();
} }
if (callback) { if (callback) {
@ -3332,28 +3374,28 @@ var Tooltip = function ($) {
}; };
Tooltip.prototype._setListeners = function _setListeners() { Tooltip.prototype._setListeners = function _setListeners() {
var _this26 = this; var _this27 = this;
var triggers = this.config.trigger.split(' '); var triggers = this.config.trigger.split(' ');
triggers.forEach(function (trigger) { triggers.forEach(function (trigger) {
if (trigger === 'click') { if (trigger === 'click') {
$(_this26.element).on(_this26.constructor.Event.CLICK, _this26.config.selector, function (event) { $(_this27.element).on(_this27.constructor.Event.CLICK, _this27.config.selector, function (event) {
return _this26.toggle(event); return _this27.toggle(event);
}); });
} else if (trigger !== Trigger.MANUAL) { } else if (trigger !== Trigger.MANUAL) {
var eventIn = trigger === Trigger.HOVER ? _this26.constructor.Event.MOUSEENTER : _this26.constructor.Event.FOCUSIN; var eventIn = trigger === Trigger.HOVER ? _this27.constructor.Event.MOUSEENTER : _this27.constructor.Event.FOCUSIN;
var eventOut = trigger === Trigger.HOVER ? _this26.constructor.Event.MOUSELEAVE : _this26.constructor.Event.FOCUSOUT; var eventOut = trigger === Trigger.HOVER ? _this27.constructor.Event.MOUSELEAVE : _this27.constructor.Event.FOCUSOUT;
$(_this26.element).on(eventIn, _this26.config.selector, function (event) { $(_this27.element).on(eventIn, _this27.config.selector, function (event) {
return _this26._enter(event); return _this27._enter(event);
}).on(eventOut, _this26.config.selector, function (event) { }).on(eventOut, _this27.config.selector, function (event) {
return _this26._leave(event); return _this27._leave(event);
}); });
} }
$(_this26.element).closest('.modal').on('hide.bs.modal', function () { $(_this27.element).closest('.modal').on('hide.bs.modal', function () {
return _this26.hide(); return _this27.hide();
}); });
}); });
@ -3625,7 +3667,7 @@ var Popover = function ($) {
placement: 'right', placement: 'right',
trigger: 'click', trigger: 'click',
content: '', 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, { var DefaultType = $.extend({}, Tooltip.DefaultType, {
@ -3638,8 +3680,8 @@ var Popover = function ($) {
}; };
var Selector = { var Selector = {
TITLE: '.popover-title', TITLE: '.popover-header',
CONTENT: '.popover-content' CONTENT: '.popover-body'
}; };
var Event = { 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; overflow: auto;
} }
/* this is a hack and needs fixing in bootstrap */
nav .dropdown-menu-right {
right: 0;
left: auto !important;
}
#navbar-collapse-2 { #navbar-collapse-2 {
flex-basis: 100%; flex-basis: 100%;
max-height: 70vh; max-height: 70vh;

View File

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

View File

@ -1339,6 +1339,14 @@ main.fullscreen .section-content-wrapper-np {
} }
/* bootstrap overrides */ /* bootstrap overrides */
.btn,
.rounded-top,
.form-control,
.nav-pills .nav-link,
.nav-tabs .nav-link {
border-radius: $radius;
}
blockquote { blockquote {
font-size: 1rem; font-size: 1rem;
font-style: italic; font-style: italic;
@ -1353,10 +1361,6 @@ blockquote {
border-radius: $radius; border-radius: $radius;
} }
.dropdown-menu img {
border-radius: $radius;
}
.dropdown-item { .dropdown-item {
color: $font_colour; color: $font_colour;
} }
@ -1491,7 +1495,7 @@ dl.bb-dl > dd > li {
.form-group.checkbox > div label { .form-group.checkbox > div label {
display: block; overflow: hidden; cursor: pointer; display: block; overflow: hidden; cursor: pointer;
border: 1px solid #ccc; border: 1px solid #ccc;
border-radius: 4px; border-radius: $radius;
margin:0px; margin:0px;
-webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; -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; -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'); head_add_css('/library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css');
require_once('view/php/theme_init.php'); 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/bootstrap/js/bootstrap.min.js');
head_add_js('/library/bootbox/bootbox.min.js'); head_add_js('/library/bootbox/bootbox.min.js');
head_add_js('/library/bootstrap-tagsinput/bootstrap-tagsinput.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="return" value="{{$return_path}}" />
<input type="hidden" name="jsreload" value="{{$jsreload}}" /> <input type="hidden" name="jsreload" value="{{$jsreload}}" />
<input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" /> <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> <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}} {{if $qcomment}}
<select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});" > <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> <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 class="dropdown-menu">{{$item.attachments}}</div>
</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}} {{/if}}
</div> </div>
</div> </div>