Commit 1bb75cfd authored by hannes's avatar hannes

better logout, link color settings and api

parent d4240edf
......@@ -6,10 +6,11 @@
* actions/apicheckhub.php New api action (not used yet)
* actions/apiexternalprofileshow.php New api action
* actions/apigroupadmins.php New api action
* actions/apiaccountupdatelinkcolor.php New api action
* lib/apiaction.php
- add urls to larger avatars and groupcount field
- add urls to larger avatars, groupcount and linkcolor field
~LINE 213
$avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
......@@ -23,6 +24,7 @@
Avatar::defaultImage(AVATAR_PROFILE_SIZE);
$twitter_user['groups_count'] = $profile->getGroups(0, null)->N;
$twitter_user['linkcolor'] = $user->linkcolor;
- add the uri-field
......@@ -85,6 +87,9 @@
array('action' => 'ApiGroupAdmins',
'id' => Nickname::INPUT_FMT,
'format' => '(xml|json)'));
$m->connect('api/account/update_link_color.json',
array('action' => 'ApiAccountUpdateLinkColor'));
- also, tags need regexp to work with unicode charachters, e.g. farsi and arabic:
......@@ -173,3 +178,12 @@
// $final = common_shorten_links($content);
// }
* classes/User.php
- add field "linkcolor" to user table (do this is the db too!)
~ line 64 public $linkcolor; // varchar(6)
~ line 105 'linkcolor' => array('type' => 'varchar', 'length' => 6, 'description' => 'hex link color'),
<?php
/**
* StatusNet, the distributed open-source microblogging tool
*
* Update a user's link color
*
* PHP version 5
*
* LICENCE: This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category API
* @package StatusNet
* @author Hannes Mannerheim <h@nnesmannerhe.im>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
exit(1);
}
require_once INSTALLDIR . '/lib/apiauth.php';
class ApiAccountUpdateLinkColorAction extends ApiAuthAction
{
var $linkcolor = null;
/**
* Take arguments for running
*
* @param array $args $_REQUEST args
*
* @return boolean success flag
*/
function prepare($args)
{
parent::prepare($args);
$this->user = $this->auth_user;
$this->linkcolor = $this->trimmed('linkcolor');
return true;
}
/**
* Handle the request
*
* Try to save the user's colors in her design. Create a new design
* if the user doesn't already have one.
*
* @param array $args $_REQUEST data (unused)
*
* @return void
*/
function handle($args)
{
parent::handle($args);
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
$this->clientError(
_('This method requires a POST.'),
400, $this->format
);
return;
}
$validhex = preg_match('/^[a-f0-9]{6}$/i',$this->linkcolor);
if($validhex === false || $validhex == 0) {
$this->clientError(_('Not a valid hex color.'),404,'json');
return;
}
// save the new color
$original = clone($this->user);
$this->user->linkcolor = $this->linkcolor;
if (!$this->user->update($original)) {
$this->clientError(_('Error updating user.'),404,'json');
return;
}
$profile = $this->user->getProfile();
if (empty($profile)) {
$this->clientError(_('User has no profile.'),'json');
return;
}
$twitter_user = $this->twitterUserArray($profile, true);
$this->initDocument('json');
$this->showJsonObjects($twitter_user);
$this->endDocument('json');
}
}
This diff is collapsed.
......@@ -220,11 +220,13 @@ class ApiAction extends Action
$twitter_user['profile_image_url_original'] = ($avatar) ? $avatar->displayUrl() :
Avatar::defaultImage(AVATAR_PROFILE_SIZE);
$twitter_user['groups_count'] = $profile->getGroups(0, null)->N;
$twitter_user['groups_count'] = $profile->getGroups(0, null)->N;
$twitter_user['linkcolor'] = $user->linkcolor;
$twitter_user['url'] = ($profile->homepage) ? $profile->homepage : null;
$twitter_user['protected'] = (!empty($user) && $user->private_stream) ? true : false;
$twitter_user['followers_count'] = $profile->subscriberCount();
// Note: some profiles don't have an associated user
......
......@@ -483,7 +483,10 @@ class Router
$m->connect('api/statusnet/groups/admins/:id.:format',
array('action' => 'ApiGroupAdmins',
'id' => Nickname::INPUT_FMT,
'format' => '(xml|json)'));
'format' => '(xml|json)'));
$m->connect('api/account/update_link_color.json',
array('action' => 'ApiAccountUpdateLinkColor'));
// users
......
......@@ -47,7 +47,6 @@ body {
}
a, a:visited, a:active {
text-decoration:none;
color:#0084B4;
}
ul, li {
margin:0;
......@@ -74,6 +73,10 @@ button.icon.nav-search {
background-image:url("../img/logo.png");
}
#settingslink {
display:none;
}
.topbar {
box-shadow: 0 2px 3px rgba(0, 0, 0, 0.25);
left: 0;
......@@ -346,6 +349,12 @@ button.icon.nav-search span {
color: #FFFFFF;
text-decoration: none;
}
.dropdown-menu li.dropdown-divider {
border-bottom: 1px solid #DDDDDD;
margin: 5px 1px 6px;
padding-top: 1px;
width:123px;
}
#birds-top {
display:block;
......@@ -667,7 +676,6 @@ button#submit-login:hover {
margin-bottom:10px;
}
#user-header:hover #user-name {
color: #0084B4;
text-decoration:underline;
}
......@@ -692,7 +700,6 @@ button#submit-login:hover {
.menu-container div {
cursor:pointer;
background-color: #FFFFFF;
color: #0084B4;
text-decoration: none;
padding: 8px 12px;
position: relative;
......@@ -743,6 +750,40 @@ button#submit-login:hover {
#history-container {
display:none;
}
#settings-container {
padding:10px 10px 300px 10px;
}
#settings-container label {
float: left;
padding-top: 5px;
text-align: right;
width: 120px;
color: #333333;
cursor: pointer;
display: block;
margin-bottom: 5px;
padding-right:10px;
font-size: 13px;
line-height: 20px;
font-family: "Helvetica Neue",Arial,sans-serif;
}
#settings-container input {
font-family: "Helvetica Neue",Arial,sans-serif;
font-size: 13px;
line-height: 20px;
background-color: #FFFFFF;
border: 1px solid #CCCCCC;
border-radius: 3px 3px 3px 3px;
display: inline-block;
outline: 0 none;
height:26px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05) inset, 0 1px 0 rgba(255, 255, 255, 0.075);
transition: background 0.2s linear 0s;
padding-right: 5px;
}
#feed {
display:none;
......@@ -849,7 +890,6 @@ button#submit-login:hover {
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.6);
top: -1px;
z-index: 2;
color: #0084B4;
}
#new-queets-bar:hover {
background-color: #eee;
......@@ -905,7 +945,6 @@ button#submit-login:hover {
font-style:italic;
}
.show-full-conversation:hover {
color:#0084B4;
text-decoration:underline;
}
.queet {
......@@ -959,7 +998,6 @@ body.rtl .queet:not(.rtl) .stream-item-header {
background-color:#F6F6F6;
}
.queet:hover .stream-item-expand {
color:#0084B4;
}
.queet:hover .stream-item-expand:hover {
text-decoration:underline;
......@@ -1032,8 +1070,7 @@ body.rtl .view-more-container-bottom { direction:rtl; }
}
.stream-item-header a.account-group:hover .name {
text-decoration:underline;
color:#0084B4;
text-decoration:underline;
}
.stream-item-header .avatar {
......@@ -1101,7 +1138,6 @@ body.rtl .view-more-container-bottom { direction:rtl; }
}
.stream-item-header .created-at a:hover {
text-decoration: underline;
color:#0084B4;
}
.dogear {
......@@ -1163,8 +1199,7 @@ body.rtl .view-more-container-bottom { direction:rtl; }
margin:0;padding:0;
}
.queet-text span.attachment.more {
color:#0084B4;
.queet-text span.attachment.more {
}
.queet-text span.attachment.more:hover {
text-decoration:underline;
......@@ -1240,8 +1275,7 @@ ul.queet-actions {
ul.queet-actions li {
display:inline;
}
ul.queet-actions li .with-icn {
color: #0084B4;
ul.queet-actions li .with-icn {
margin-left: 8px;
}
ul.queet-actions li .with-icn b {
......@@ -1253,7 +1287,6 @@ ul.queet-actions li .with-icn b:hover {
text-decoration:underline;
}
ul.queet-actions li .icon {
background-color: #0084B4;
background-repeat: no-repeat;
display: inline-block;
vertical-align: text-top;
......@@ -1392,7 +1425,6 @@ ul.queet-actions li .icon.sm-fav {
}
.stream-item-footer .with-icn .requeet-text a b:hover {
text-decoration:underline;
color:#0084B4;
}
.stream-item-expand {
......@@ -1413,7 +1445,6 @@ ul.queet-actions li .icon.sm-fav {
transition: all 0.1s ease;
}
.stream-item.expanded > .queet .stream-item-expand {
color: #0084B4;
}
.stream-item.expanded .stream-item-expand:hover {
text-decoration:underline;
......@@ -1564,7 +1595,6 @@ ul.stats .avatar-row .avatar {
}
.permalink-link:hover {
text-decoration:underline;
color:#0084B4;
}
.inline-reply-queetbox {
......@@ -1800,7 +1830,6 @@ ul.stats li:hover a,
ul.stats li:hover a strong,
#user-body a:hover div strong,
#user-body a:hover div div {
color:#0084B4;
}
#user-footer {
......@@ -2051,23 +2080,23 @@ ul.stats li:hover a strong,
background-position:0 0;
cursor:pointer;
}
#logolink:hover #logo {
#logo:hover {
background-position: 0 34px;
}
#logolink:hover i.nav-session {
#settingslink:hover i.nav-session {
background-position: -160px -80px;
}
#logolink:hover .caret {
#settingslink:hover .caret {
border-top:4px solid #fff;
}
#logolink .dropdown-toggle {
#settingslink .dropdown-toggle {
left: 50%;
margin-left: -340px;
position: fixed;
z-index: 1001;
}
#logolink .caret {
#settingslink .caret {
display:block;
position:absolute;
margin-left:25px;
......@@ -2628,6 +2657,15 @@ body.rtl .modal-footer div.right {
border-color: #096EB3;
color: #FFFFFF;
}
.modal-footer button.primary.disabled {
background-color: #DDDDDD;
background-image: none;
border-color: #CCCCCC;
color: #777777;
cursor: default;
opacity: 0.65;
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
}
body.rtl .modal-footer button {
font-family:Tahoma,Arial,sans-serif;
margin-left: 10px;
......@@ -2820,18 +2858,18 @@ body.rtl .dropdown-toggle .caret {
margin-left:0;
}
body.rtl #logolink .dropdown-toggle {
body.rtl #settingslink .dropdown-toggle {
left: auto;
right:50%;
margin-left:0;
margin-right: -343px;
direction:rtl;
}
body.rtl #logolink .nav-session {
body.rtl #settingslink .nav-session {
margin-left:6px;
margin-right:0;
}
body.rtl #logolink .caret {
body.rtl #settingslink .caret {
display:block;
position:absolute;
margin-left:0;
......@@ -2920,10 +2958,10 @@ body.rtl #feed-header-inner h2 {
body.rtl #logo {
margin-right:-265px;
}
#logolink .dropdown-toggle {
#settingslink .dropdown-toggle {
margin-left: -187px;
}
body.rtl #logolink .dropdown-toggle {
body.rtl #settingslink .dropdown-toggle {
margin-right: -189px;
margin-left:0;
}
......@@ -2949,7 +2987,7 @@ body.rtl #feed-header-inner h2 {
#logo{
margin-left: -48.5%;
}
#logolink .dropdown-toggle {
#settingslink .dropdown-toggle {
left:0;
padding-left:5px;
margin-left: 95px;
......@@ -2964,7 +3002,7 @@ body.rtl #feed-header-inner h2 {
margin-left:0;
margin-right:15px;
}
body.rtl #logolink .dropdown-toggle {
body.rtl #settingslink .dropdown-toggle {
left:auto;
right:0;
padding-left:0;
......@@ -3023,10 +3061,10 @@ body.rtl #feed-header-inner h2 {
#logo {
display:none;
}
#logolink .dropdown-toggle {
#settingslink .dropdown-toggle {
margin-left:5px;
}
body.rtl #logolink .dropdown-toggle {
body.rtl #settingslink .dropdown-toggle {
margin-right:5px;
}
......
.minicolors {
position: relative;
}
.minicolors-swatch {
position: absolute;
vertical-align: middle;
background: url(../img/jquery.minicolors.png) -80px 0;
border: solid 1px #ccc;
cursor: text;
padding: 0;
margin: 0;
display: inline-block;
}
.minicolors-swatch-color {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.minicolors input[type=hidden] + .minicolors-swatch {
width: 28px;
position: static;
cursor: pointer;
}
/* Panel */
.minicolors-panel {
position: absolute;
width: 173px;
height: 152px;
background: white;
border: solid 1px #CCC;
box-shadow: 0 0 20px rgba(0, 0, 0, .2);
z-index: 99999;
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
display: none;
}
.minicolors-panel.minicolors-visible {
display: block;
}
/* Panel positioning */
.minicolors-position-top .minicolors-panel {
top: -154px;
}
.minicolors-position-right .minicolors-panel {
right: 0;
}
.minicolors-position-bottom .minicolors-panel {
top: auto;
}
.minicolors-position-left .minicolors-panel {
left: 0;
}
.minicolors-with-opacity .minicolors-panel {
width: 194px;
}
.minicolors .minicolors-grid {
position: absolute;
top: 1px;
left: 1px;
width: 150px;
height: 150px;
background: url(../img/jquery.minicolors.png) -120px 0;
cursor: crosshair;
}
.minicolors .minicolors-grid-inner {
position: absolute;
top: 0;
left: 0;
width: 150px;
height: 150px;
background: none;
}
.minicolors-slider-saturation .minicolors-grid {
background-position: -420px 0;
}
.minicolors-slider-saturation .minicolors-grid-inner {
background: url(../img/jquery.minicolors.png) -270px 0;
}
.minicolors-slider-brightness .minicolors-grid {
background-position: -570px 0;
}
.minicolors-slider-brightness .minicolors-grid-inner {
background: black;
}
.minicolors-slider-wheel .minicolors-grid {
background-position: -720px 0;
}
.minicolors-slider,
.minicolors-opacity-slider {
position: absolute;
top: 1px;
left: 152px;
width: 20px;
height: 150px;
background: white url(../img/jquery.minicolors.png) 0 0;
cursor: row-resize;
}
.minicolors-slider-saturation .minicolors-slider {
background-position: -60px 0;
}
.minicolors-slider-brightness .minicolors-slider {
background-position: -20px 0;
}
.minicolors-slider-wheel .minicolors-slider {
background-position: -20px 0;
}
.minicolors-opacity-slider {
left: 173px;
background-position: -40px 0;
display: none;
}
.minicolors-with-opacity .minicolors-opacity-slider {
display: block;
}
/* Pickers */
.minicolors-grid .minicolors-picker {
position: absolute;
top: 70px;
left: 70px;
width: 12px;
height: 12px;
border: solid 1px black;
border-radius: 10px;
margin-top: -6px;
margin-left: -6px;
background: none;
}
.minicolors-grid .minicolors-picker > div {
position: absolute;
top: 0;
left: 0;
width: 8px;
height: 8px;
border-radius: 8px;
border: solid 2px white;
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
.minicolors-picker {
position: absolute;
top: 0;
left: 0;
width: 18px;
height: 2px;
background: white;
border: solid 1px black;
margin-top: -2px;
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
/* Inline controls */
.minicolors-inline {
display: inline-block;
}
.minicolors-inline .minicolors-input {
display: none !important;
}
.minicolors-inline .minicolors-panel {
position: relative;
top: auto;
left: auto;
box-shadow: none;
z-index: auto;
display: inline-block;
}
/* Default theme */
.minicolors-theme-default .minicolors-swatch {
top: 5px;
left: 5px;
width: 18px;
height: 18px;
}
.minicolors-theme-default.minicolors-position-right .minicolors-swatch {
left: auto;
right: 5px;
}
.minicolors-theme-default.minicolors {
width: auto;
display: inline-block;
}
.minicolors-theme-default .minicolors-input {
height: 20px;
width: auto;
display: inline-block;
padding-left: 26px;
}
.minicolors-theme-default.minicolors-position-right .minicolors-input {
padding-right: 26px;
padding-left: inherit;
}
/* Bootstrap theme */
.minicolors-theme-bootstrap .minicolors-swatch {
top: 3px;
left: 3px;
width: 28px;
height: 28px;
border-radius: 3px;
}
.minicolors-theme-bootstrap.minicolors-position-right .minicolors-swatch {
left: auto;
right: 3px;
}
.minicolors-theme-bootstrap .minicolors-input {
padding-left: 44px;
}
.minicolors-theme-bootstrap.minicolors-position-right .minicolors-input {
padding-right: 44px;
padding-left: 12px;
}
\ No newline at end of file
......@@ -39,6 +39,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="<?php print $qvitterpath; ?>css/1.css" />
<link rel="stylesheet" type="text/css" href="<?php print $qvitterpath; ?>css/jquery.minicolors.css" />
<link rel="shortcut icon" type="image/x-icon" href="<?php print $qvitterpath; ?>favicon.ico">
<script>
window.timeBetweenPolling = <?php print $timebetweenpolling; ?>;
......@@ -46,11 +47,35 @@
window.siteRootDomain = '<?php print $siterootdomain; ?>';
window.useHistoryPushState = <?php if($usehistorypushstate) print 'true'; else print 'false'; ?>;
</script>
<style>
a, a:visited, a:active,
ul.stats li:hover a,
ul.stats li:hover a strong,
#user-body a:hover div strong,
#user-body a:hover div div,
.permalink-link:hover,
.stream-item.expanded > .queet .stream-item-expand,
.stream-item-footer .with-icn .requeet-text a b:hover,
ul.queet-actions li .with-icn,
.queet-text span.attachment.more,
.stream-item-header .created-at a:hover,
.stream-item-header a.account-group:hover .name,
.queet:hover .stream-item-expand,
.show-full-conversation:hover,
#new-queets-bar,
.menu-container div,
#user-header:hover #user-name {
color:#0084B4;/*COLOREND*/
}
ul.queet-actions li .icon {
background-color:#0084B4;/*BACKGROUNDCOLOREND*/
}
</style>
</head>