Merge branch '0.8.x' of git@gitorious.org:+laconica-developers/laconica/dev into 0.8.x

This commit is contained in:
Evan Prodromou 2009-06-18 07:45:06 -07:00
commit 3a0c6d6c6d
22 changed files with 931 additions and 207 deletions

View File

@ -41,7 +41,7 @@ if (!defined('LACONICA')) {
* @link http://laconi.ca/ * @link http://laconi.ca/
*/ */
class BlockedfromgroupAction extends Action class BlockedfromgroupAction extends GroupDesignAction
{ {
var $page = null; var $page = null;

View File

@ -23,6 +23,7 @@
* @package Laconica * @package Laconica
* @author Evan Prodromou <evan@controlyourself.ca> * @author Evan Prodromou <evan@controlyourself.ca>
* @author Sarven Capadisli <csarven@controlyourself.ca> * @author Sarven Capadisli <csarven@controlyourself.ca>
* @author Zach Copley <zach@controlyourself.ca>
* @copyright 2008-2009 Control Yourself, Inc. * @copyright 2008-2009 Control Yourself, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://laconi.ca/ * @link http://laconi.ca/
@ -40,14 +41,15 @@ if (!defined('LACONICA')) {
* @category Group * @category Group
* @package Laconica * @package Laconica
* @author Evan Prodromou <evan@controlyourself.ca> * @author Evan Prodromou <evan@controlyourself.ca>
* @author Zach Copley <zach@controlyourself.ca>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://laconi.ca/ * @link http://laconi.ca/
*/ */
class EditgroupAction extends Action class EditgroupAction extends GroupDesignAction
{ {
var $msg; var $msg;
var $group = null;
function title() function title()
{ {

View File

@ -151,19 +151,17 @@ class GroupblockAction extends Action
function areYouSureForm() function areYouSureForm()
{ {
$id = $this->profile->id; $id = $this->profile->id;
$this->elementStart('form', array('id' => 'block-' . $id,
'method' => 'post',
'class' => 'form_settings form_entity_block',
'action' => common_local_url('groupblock')));
$this->elementStart('fieldset');
$this->hidden('token', common_session_token());
$this->element('legend', null, _('Block user'));
$this->element('p', null, $this->element('p', null,
sprintf(_('Are you sure you want to block user "%s" from the group "%s"? '. sprintf(_('Are you sure you want to block user "%s" from the group "%s"? '.
'They will be removed from the group, unable to post, and '. 'They will be removed from the group, unable to post, and '.
'unable to subscribe to the group in the future.'), 'unable to subscribe to the group in the future.'),
$this->profile->getBestName(), $this->profile->getBestName(),
$this->group->getBestName())); $this->group->getBestName()));
$this->elementStart('form', array('id' => 'block-' . $id,
'method' => 'post',
'class' => 'block',
'action' => common_local_url('groupblock')));
$this->hidden('token', common_session_token());
$this->hidden('blockto-' . $this->profile->id, $this->hidden('blockto-' . $this->profile->id,
$this->profile->id, $this->profile->id,
'blockto'); 'blockto');
@ -175,9 +173,8 @@ class GroupblockAction extends Action
$this->hidden($k, $v); $this->hidden($k, $v);
} }
} }
$this->submit('form_action-no', _('No'), 'submit form_action-primary', 'no', _("Do not block this user from this group")); $this->submit('no', _('No'));
$this->submit('form_action-yes', _('Yes'), 'submit form_action-secondary', 'yes', _('Block this user from this group')); $this->submit('yes', _('Yes'));
$this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }

View File

@ -0,0 +1,330 @@
<?php
/**
* Laconica, the distributed open-source microblogging tool
*
* Change user password
*
* 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 Settings
* @package Laconica
* @author Sarven Capadisli <csarven@controlyourself.ca>
* @author Zach Copley <zach@controlyourself.ca>
* @copyright 2008-2009 Control Yourself, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://laconi.ca/
*/
if (!defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR . '/lib/designsettings.php';
class GroupDesignSettingsAction extends DesignSettingsAction
{
var $group = null;
/**
* Prepare to run
*/
function prepare($args)
{
parent::prepare($args);
if (!common_config('inboxes','enabled')) {
$this->serverError(_('Inboxes must be enabled for groups to work'));
return false;
}
if (!common_logged_in()) {
$this->clientError(_('You must be logged in to edit a group.'));
return false;
}
$nickname_arg = $this->trimmed('nickname');
$nickname = common_canonical_nickname($nickname_arg);
// Permanent redirect on non-canonical nickname
if ($nickname_arg != $nickname) {
$args = array('nickname' => $nickname);
common_redirect(common_local_url('groupdesignsettings', $args), 301);
return false;
}
if (!$nickname) {
$this->clientError(_('No nickname'), 404);
return false;
}
$groupid = $this->trimmed('groupid');
if ($groupid) {
$this->group = User_group::staticGet('id', $groupid);
} else {
$this->group = User_group::staticGet('nickname', $nickname);
}
if (!$this->group) {
$this->clientError(_('No such group'), 404);
return false;
}
$cur = common_current_user();
if (!$cur->isAdmin($this->group)) {
$this->clientError(_('You must be an admin to edit the group'), 403);
return false;
}
$this->submitaction = common_local_url('groupdesignsettings',
array('nickname' => $this->group->nickname));
return true;
}
/**
* A design for this action
*
* if the group attribute has been set, returns that group's
* design.
*
* @return Design a design object to use
*/
function getDesign()
{
if (empty($this->group)) {
return null;
}
return $this->group->getDesign();
}
/**
* Title of the page
*
* @return string Title of the page
*/
function title()
{
return _('Group design');
}
/**
* Instructions for use
*
* @return instructions for use
*/
function getInstructions()
{
return _('Customize the way your group looks ' .
'with a background image and a colour palette of your choice.');
}
/**
* Override to show group nav stuff
*
* @return nothing
*/
function showLocalNav()
{
$nav = new GroupNav($this, $this->group);
$nav->show();
}
/**
* Get the design we want to edit
*
* @return Design
*/
function getWorkingDesign() {
$design = null;
if (isset($this->group)) {
$design = $this->group->getDesign();
}
if (empty($design)) {
$design = $this->defaultDesign();
}
return $design;
}
/**
* Content area of the page
*
* Shows a form for changing the design
*
* @return void
*/
function showContent()
{
$this->showDesignForm($this->getWorkingDesign());
}
/**
* Save or update the group's design settings
*
* @return void
*/
function saveDesign()
{
try {
$bgcolor = new WebColor($this->trimmed('design_background'));
$ccolor = new WebColor($this->trimmed('design_content'));
$sbcolor = new WebColor($this->trimmed('design_sidebar'));
$tcolor = new WebColor($this->trimmed('design_text'));
$lcolor = new WebColor($this->trimmed('design_links'));
} catch (WebColorException $e) {
$this->showForm($e->getMessage());
return;
}
$onoff = $this->arg('design_background-image_onoff');
$on = false;
$off = false;
$tile = false;
if ($onoff == 'on') {
$on = true;
} else {
$off = true;
}
$repeat = $this->boolean('design_background-image_repeat');
if ($repeat) {
$tile = true;
}
$design = $this->group->getDesign();
if (!empty($design)) {
// update design
$original = clone($design);
$design->backgroundcolor = $bgcolor->intValue();
$design->contentcolor = $ccolor->intValue();
$design->sidebarcolor = $sbcolor->intValue();
$design->textcolor = $tcolor->intValue();
$design->linkcolor = $lcolor->intValue();
$design->backgroundimage = $filepath;
$design->setDisposition($on, $off, $tile);
$result = $design->update($original);
if ($result === false) {
common_log_db_error($design, 'UPDATE', __FILE__);
$this->showForm(_('Couldn\'t update your design.'));
return;
}
} else {
$this->group->query('BEGIN');
// save new design
$design = new Design();
$design->backgroundcolor = $bgcolor->intValue();
$design->contentcolor = $ccolor->intValue();
$design->sidebarcolor = $sbcolor->intValue();
$design->textcolor = $tcolor->intValue();
$design->linkcolor = $lcolor->intValue();
$design->backgroundimage = $filepath;
$design->setDisposition($on, $off, $tile);
$id = $design->insert();
if (empty($id)) {
common_log_db_error($id, 'INSERT', __FILE__);
$this->showForm(_('Unable to save your design settings!'));
return;
}
$original = clone($this->group);
$this->group->design_id = $id;
$result = $this->group->update($original);
if (empty($result)) {
common_log_db_error($original, 'UPDATE', __FILE__);
$this->showForm(_('Unable to save your design settings!'));
$this->group->query('ROLLBACK');
return;
}
$this->group->query('COMMIT');
}
$this->saveBackgroundImage($design);
$this->showForm(_('Design preferences saved.'), true);
}
/**
* Handle input and output a page (overrided)
*
* @param array $args $_REQUEST arguments
*
* @return void
*/
function handle($args)
{
parent::handle($args);
if (!common_logged_in()) {
$this->clientError(_('Not logged in.'));
return;
} else if (!common_is_real_login()) {
// Cookie theft means that automatic logins can't
// change important settings or see private info, and
// _all_ our settings are important
common_set_returnto($this->selfUrl());
$user = common_current_user();
if ($user->hasOpenID()) {
common_redirect(common_local_url('openidlogin'), 303);
} else {
common_redirect(common_local_url('login'), 303);
}
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$this->handlePost();
} else {
$this->showForm();
}
}
}

View File

@ -50,7 +50,7 @@ define('MAX_ORIGINAL', 480);
* @link http://laconi.ca/ * @link http://laconi.ca/
*/ */
class GrouplogoAction extends Action class GrouplogoAction extends GroupDesignAction
{ {
var $mode = null; var $mode = null;
var $imagefile = null; var $imagefile = null;

View File

@ -44,7 +44,7 @@ require_once INSTALLDIR.'/lib/publicgroupnav.php';
* @link http://laconi.ca/ * @link http://laconi.ca/
*/ */
class GroupmembersAction extends Action class GroupmembersAction extends GroupDesignAction
{ {
var $page = null; var $page = null;

View File

@ -47,10 +47,9 @@ define('MEMBERS_PER_SECTION', 27);
* @link http://laconi.ca/ * @link http://laconi.ca/
*/ */
class ShowgroupAction extends Action class ShowgroupAction extends GroupDesignAction
{ {
/** group we're viewing. */
var $group = null;
/** page we're viewing. */ /** page we're viewing. */
var $page = null; var $page = null;

View File

@ -0,0 +1,208 @@
<?php
/**
* Laconica, the distributed open-source microblogging tool
*
* Change user password
*
* 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 Settings
* @package Laconica
* @author Sarven Capadisli <csarven@controlyourself.ca>
* @author Zach Copley <zach@controlyourself.ca>
* @copyright 2008-2009 Control Yourself, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://laconi.ca/
*/
if (!defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR . '/lib/designsettings.php';
class UserDesignSettingsAction extends DesignSettingsAction
{
function prepare($args)
{
parent::prepare($args);
$this->submitaction = common_local_url('userdesignsettings');
return true;
}
/**
* Title of the page
*
* @return string Title of the page
*/
function title()
{
return _('Profile design');
}
/**
* Instructions for use
*
* @return instructions for use
*/
function getInstructions()
{
return _('Customize the way your profile looks ' .
'with a background image and a colour palette of your choice.');
}
/**
* Get the design we want to edit
*
* @return Design
*/
function getWorkingDesign() {
$user = common_current_user();
$design = $user->getDesign();
if (empty($design)) {
$design = $this->defaultDesign();
}
return $design;
}
/**
* Content area of the page
*
* Shows a form for changing the design
*
* @return void
*/
function showContent()
{
$this->showDesignForm($this->getWorkingDesign());
}
/**
* Save or update the user's design settings
*
* @return void
*/
function saveDesign()
{
try {
$bgcolor = new WebColor($this->trimmed('design_background'));
$ccolor = new WebColor($this->trimmed('design_content'));
$sbcolor = new WebColor($this->trimmed('design_sidebar'));
$tcolor = new WebColor($this->trimmed('design_text'));
$lcolor = new WebColor($this->trimmed('design_links'));
} catch (WebColorException $e) {
$this->showForm($e->getMessage());
return;
}
$onoff = $this->arg('design_background-image_onoff');
$on = false;
$off = false;
$tile = false;
if ($onoff == 'on') {
$on = true;
} else {
$off = true;
}
$repeat = $this->boolean('design_background-image_repeat');
if ($repeat) {
$tile = true;
}
$user = common_current_user();
$design = $user->getDesign();
if (!empty($design)) {
$original = clone($design);
$design->backgroundcolor = $bgcolor->intValue();
$design->contentcolor = $ccolor->intValue();
$design->sidebarcolor = $sbcolor->intValue();
$design->textcolor = $tcolor->intValue();
$design->linkcolor = $lcolor->intValue();
$design->backgroundimage = $filepath;
$design->setDisposition($on, $off, $tile);
$result = $design->update($original);
if ($result === false) {
common_log_db_error($design, 'UPDATE', __FILE__);
$this->showForm(_('Couldn\'t update your design.'));
return;
}
// update design
} else {
$user->query('BEGIN');
// save new design
$design = new Design();
$design->backgroundcolor = $bgcolor->intValue();
$design->contentcolor = $ccolor->intValue();
$design->sidebarcolor = $sbcolor->intValue();
$design->textcolor = $tcolor->intValue();
$design->linkcolor = $lcolor->intValue();
$design->backgroundimage = $filepath;
$design->setDisposition($on, $off, $tile);
$id = $design->insert();
if (empty($id)) {
common_log_db_error($id, 'INSERT', __FILE__);
$this->showForm(_('Unable to save your design settings!'));
return;
}
$original = clone($user);
$user->design_id = $id;
$result = $user->update($original);
if (empty($result)) {
common_log_db_error($original, 'UPDATE', __FILE__);
$this->showForm(_('Unable to save your design settings!'));
$user->query('ROLLBACK');
return;
}
$user->query('COMMIT');
}
$this->saveBackgroundImage($design);
$this->showForm(_('Design preferences saved.'), true);
}
}

View File

@ -19,6 +19,7 @@ class User_group extends Memcached_DataObject
public $homepage_logo; // varchar(255) public $homepage_logo; // varchar(255)
public $stream_logo; // varchar(255) public $stream_logo; // varchar(255)
public $mini_logo; // varchar(255) public $mini_logo; // varchar(255)
public $design_id; // int(4)
public $created; // datetime() not_null public $created; // datetime() not_null
public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP
@ -239,4 +240,10 @@ class User_group extends Memcached_DataObject
} }
return null; return null;
} }
function getDesign()
{
return Design::staticGet('id', $this->design_id);
}
} }

View File

@ -468,6 +468,7 @@ original_logo = 2
homepage_logo = 2 homepage_logo = 2
stream_logo = 2 stream_logo = 2
mini_logo = 2 mini_logo = 2
design_id = 1
created = 142 created = 142
modified = 384 modified = 384

View File

@ -387,6 +387,7 @@ create table user_group (
homepage_logo varchar(255) comment 'homepage (profile) size logo', homepage_logo varchar(255) comment 'homepage (profile) size logo',
stream_logo varchar(255) comment 'stream-sized logo', stream_logo varchar(255) comment 'stream-sized logo',
mini_logo varchar(255) comment 'mini logo', mini_logo varchar(255) comment 'mini logo',
design_id integer comment 'id of a design' references design(id),
created datetime not null comment 'date this record was created', created datetime not null comment 'date this record was created',
modified timestamp comment 'date this record was modified', modified timestamp comment 'date this record was modified',

View File

@ -115,7 +115,7 @@ class AccountSettingsNav extends Widget
'openidsettings' => 'openidsettings' =>
array(_('OpenID'), array(_('OpenID'),
_('Add or remove OpenIDs')), _('Add or remove OpenIDs')),
'designsettings' => 'userdesignsettings' =>
array(_('Design'), array(_('Design'),
_('Design your profile')), _('Design your profile')),
'othersettings' => 'othersettings' =>

View File

@ -243,6 +243,42 @@ class AttachmentListItem extends Widget
class Attachment extends AttachmentListItem class Attachment extends AttachmentListItem
{ {
function showLink() {
$this->out->elementStart('a', $this->linkAttr());
$this->out->element('span', null, $this->linkTitle());
$this->showRepresentation();
$this->out->elementEnd('a');
if (empty($this->oembed->author_name) && empty($this->oembed->provider)) {
return;
}
$this->out->elementStart('dl', 'oembed_info');
if (!empty($this->oembed->author_name)) {
$this->out->element('dt', null, _('Author:'));
$this->out->elementStart('dd');
if (empty($this->oembed->author_url)) {
$this->out->text($this->oembed->author_name);
} else {
$this->out->element('a', array('href' => $this->oembed->author_url), $this->oembed->author_name);
}
$this->out->elementEnd('dd');
}
if (!empty($this->oembed->provider)) {
$this->out->element('dt', null, _('Provider:'));
$this->out->elementStart('dd');
if (empty($this->oembed->provider_url)) {
$this->out->text($this->oembed->provider);
} else {
$this->out->element('a', array('href' => $this->oembed->provider_url), $this->oembed->provider);
}
$this->out->elementEnd('dd');
}
$this->out->elementEnd('dl');
}
function show() { function show() {
$this->showNoticeAttachment(); $this->showNoticeAttachment();
} }

View File

@ -35,8 +35,11 @@ if (!defined('LACONICA')) {
require_once INSTALLDIR . '/lib/accountsettingsaction.php'; require_once INSTALLDIR . '/lib/accountsettingsaction.php';
require_once INSTALLDIR . '/lib/webcolor.php'; require_once INSTALLDIR . '/lib/webcolor.php';
class DesignsettingsAction extends AccountSettingsAction class DesignSettingsAction extends AccountSettingsAction
{ {
var $submitaction = null;
/** /**
* Title of the page * Title of the page
* *
@ -60,29 +63,14 @@ class DesignsettingsAction extends AccountSettingsAction
'with a background image and a colour palette of your choice.'); 'with a background image and a colour palette of your choice.');
} }
/** function showDesignForm($design)
* Content area of the page
*
* Shows a form for changing the password
*
* @return void
*/
function showContent()
{ {
$user = common_current_user();
$design = $user->getDesign();
if (empty($design)) {
$design = $this->defaultDesign();
}
$this->elementStart('form', array('method' => 'post', $this->elementStart('form', array('method' => 'post',
'enctype' => 'multipart/form-data', 'enctype' => 'multipart/form-data',
'id' => 'form_settings_design', 'id' => 'form_settings_design',
'class' => 'form_settings', 'class' => 'form_settings',
'action' => 'action' => $this->submitaction));
common_local_url('designsettings')));
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
@ -370,108 +358,7 @@ class DesignsettingsAction extends AccountSettingsAction
return $design; return $design;
} }
/** function saveBackgroundImage($design) {
* Save or update the user's design settings
*
* @return void
*/
function saveDesign()
{
try {
$bgcolor = new WebColor($this->trimmed('design_background'));
$ccolor = new WebColor($this->trimmed('design_content'));
$sbcolor = new WebColor($this->trimmed('design_sidebar'));
$tcolor = new WebColor($this->trimmed('design_text'));
$lcolor = new WebColor($this->trimmed('design_links'));
} catch (WebColorException $e) {
$this->showForm($e->getMessage());
return;
}
$onoff = $this->arg('design_background-image_onoff');
$on = false;
$off = false;
$tile = false;
if ($onoff == 'on') {
$on = true;
} else {
$off = true;
}
$repeat = $this->boolean('design_background-image_repeat');
if ($repeat) {
$tile = true;
}
$user = common_current_user();
$design = $user->getDesign();
if (!empty($design)) {
$original = clone($design);
$design->backgroundcolor = $bgcolor->intValue();
$design->contentcolor = $ccolor->intValue();
$design->sidebarcolor = $sbcolor->intValue();
$design->textcolor = $tcolor->intValue();
$design->linkcolor = $lcolor->intValue();
$design->backgroundimage = $filepath;
$design->setDisposition($on, $off, $tile);
$result = $design->update($original);
if ($result === false) {
common_log_db_error($design, 'UPDATE', __FILE__);
$this->showForm(_('Couldn\'t update your design.'));
return;
}
// update design
} else {
$user->query('BEGIN');
// save new design
$design = new Design();
$design->backgroundcolor = $bgcolor->intValue();
$design->contentcolor = $ccolor->intValue();
$design->sidebarcolor = $sbcolor->intValue();
$design->textcolor = $tcolor->intValue();
$design->linkcolor = $lcolor->intValue();
$design->backgroundimage = $filepath;
$design->setDisposition($on, $off, $tile);
$id = $design->insert();
if (empty($id)) {
common_log_db_error($id, 'INSERT', __FILE__);
$this->showForm(_('Unable to save your design settings!'));
return;
}
$original = clone($user);
$user->design_id = $id;
$result = $user->update($original);
if (empty($result)) {
common_log_db_error($original, 'UPDATE', __FILE__);
$this->showForm(_('Unable to save your design settings!'));
$user->query('ROLLBACK');
return;
}
$user->query('COMMIT');
}
// Now that we have a Design ID we can add a file to the design. // Now that we have a Design ID we can add a file to the design.
// XXX: This is an additional DB hit, but figured having the image // XXX: This is an additional DB hit, but figured having the image
@ -510,8 +397,6 @@ class DesignsettingsAction extends AccountSettingsAction
return; return;
} }
} }
$this->showForm(_('Design preferences saved.'), true);
} }
} }

87
lib/groupdesignaction.php Normal file
View File

@ -0,0 +1,87 @@
<?php
/**
* Laconica, the distributed open-source microblogging tool
*
* Base class for actions that use the current user's design
*
* 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 Action
* @package Laconica
* @author Zach Copley <zach@controlyourself.ca>
* @copyright 2009 Control Yourself, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://laconi.ca/
*/
if (!defined('LACONICA')) {
exit(1);
}
/**
* Base class for actions that use a group's design
*
* Pages related to groups can be themed with a design.
* This superclass returns that design.
*
* @category Action
* @package Laconica
* @author Zach Copley <zach@controlyourself.ca>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://laconi.ca/
*
*/
class GroupDesignAction extends Action {
/** The group in question */
var $group = null;
/**
* Show the groups's design stylesheet
*
* @return nothing
*/
function showStylesheets()
{
parent::showStylesheets();
$design = $this->getDesign();
if (!empty($design)) {
$design->showCSS($this);
}
}
/**
* A design for this action
*
* if the group attribute has been set, returns that group's
* design.
*
* @return Design a design object to use
*/
function getDesign()
{
if (empty($this->group)) {
return null;
}
return $this->group->getDesign();
}
}

View File

@ -113,6 +113,12 @@ class GroupNav extends Widget
sprintf(_('Add or edit %s logo'), $nickname), sprintf(_('Add or edit %s logo'), $nickname),
$action_name == 'grouplogo', $action_name == 'grouplogo',
'nav_group_logo'); 'nav_group_logo');
$this->out->menuItem(common_local_url('groupdesignsettings', array('nickname' =>
$nickname)),
_('Design'),
sprintf(_('Add or edit %s design'), $nickname),
$action_name == 'groupdesignsettings',
'nav_group_design');
} }
$this->out->elementEnd('ul'); $this->out->elementEnd('ul');
} }

View File

@ -132,7 +132,7 @@ class Router
// settings // settings
foreach (array('profile', 'avatar', 'password', 'openid', 'im', foreach (array('profile', 'avatar', 'password', 'openid', 'im',
'email', 'sms', 'twitter', 'design', 'other') as $s) { 'email', 'sms', 'twitter', 'userdesign', 'other') as $s) {
$m->connect('settings/'.$s, array('action' => $s.'settings')); $m->connect('settings/'.$s, array('action' => $s.'settings'));
} }
@ -223,7 +223,7 @@ class Router
array('nickname' => '[a-zA-Z0-9]+')); array('nickname' => '[a-zA-Z0-9]+'));
} }
foreach (array('members', 'logo', 'rss') as $n) { foreach (array('members', 'logo', 'rss', 'designsettings') as $n) {
$m->connect('group/:nickname/'.$n, $m->connect('group/:nickname/'.$n,
array('action' => 'group'.$n), array('action' => 'group'.$n),
array('nickname' => '[a-zA-Z0-9]+')); array('nickname' => '[a-zA-Z0-9]+'));

View File

@ -1284,3 +1284,9 @@ display:none;
.guide { .guide {
clear:both; clear:both;
} }
dl.oembed_info dt,
dl.oembed_info dd {
display: inline;
}

View File

@ -244,7 +244,7 @@ div.notice-options a,
div.notice-options input { div.notice-options input {
font-family:sans-serif; font-family:sans-serif;
} }
.notices li:hover { #content .notices li:hover {
background-color:#FCFCFC; background-color:#FCFCFC;
} }
#conversation .notices li:hover { #conversation .notices li:hover {

View File

@ -244,7 +244,7 @@ div.notice-options a,
div.notice-options input { div.notice-options input {
font-family:sans-serif; font-family:sans-serif;
} }
.notices li:hover { #content .notices li:hover {
background-color:#FCFCFC; background-color:#FCFCFC;
} }
#conversation .notices li:hover { #conversation .notices li:hover {

View File

@ -12,9 +12,9 @@ img { display:block; border:0; }
a abbr { cursor: pointer; border-bottom:0; } a abbr { cursor: pointer; border-bottom:0; }
table { border-collapse:collapse; } table { border-collapse:collapse; }
ol { list-style-position:inside; } ol { list-style-position:inside; }
html { font-size: 87.5%; background-color:#fff; } html { font-size: 87.5%; }
body { body {
background-color:#fff; background-color:#FFFFFF;
color:#000; color:#000;
font-family:sans-serif; font-family:sans-serif;
font-size:1em; font-size:1em;
@ -78,7 +78,8 @@ margin:0 0 18px 0;
form label { form label {
font-weight:bold; font-weight:bold;
} }
input.checkbox { input.checkbox,
input.radio {
position:relative; position:relative;
top:2px; top:2px;
left:0; left:0;
@ -155,7 +156,8 @@ font-weight:bold;
#form_invite legend, #form_invite legend,
#form_notice_delete legend, #form_notice_delete legend,
#form_password_recover legend, #form_password_recover legend,
#form_password_change legend { #form_password_change legend,
.form_entity_block legend {
display:none; display:none;
} }
@ -181,13 +183,19 @@ margin-left:11px;
float:left; float:left;
width:90%; width:90%;
} }
.form_settings label.radio {
margin-top:0;
margin-right:47px;
margin-left:11px;
width:auto;
}
#form_login p.form_guide, #form_login p.form_guide,
#form_register #settings_rememberme p.form_guide, #form_register #settings_rememberme p.form_guide,
#form_openid_login #settings_rememberme p.form_guide, #form_openid_login #settings_rememberme p.form_guide,
#settings_twitter_remove p.form_guide, #settings_twitter_remove p.form_guide,
#form_search ul.form_data #q { #form_search ul.form_data #q,
#design_background-image_onoff p.form_guide {
margin-left:0; margin-left:0;
} }
@ -375,10 +383,10 @@ margin-bottom:1em;
} }
#content { #content {
width:50.009%; width:49.009%;
min-height:259px; min-height:259px;
float:left; float:left;
margin-left:18px; padding:0 18px;
} }
#shownotice #content { #shownotice #content {
min-height:0; min-height:0;
@ -421,6 +429,8 @@ width:80.789%;
height:46px; height:46px;
line-height:1.5; line-height:1.5;
padding:7px 7px 16px 7px; padding:7px 7px 16px 7px;
position:relative;
z-index:2;
} }
#form_notice label { #form_notice label {
display:block; display:block;
@ -428,8 +438,22 @@ float:left;
font-size:1.3em; font-size:1.3em;
margin-bottom:7px; margin-bottom:7px;
} }
#form_notice #notice_submit label { #form_notice label[for=notice_data-attach],
display:none; #form_notice #notice_data-attach {
position:absolute;
top:25px;
cursor:pointer;
}
#form_notice label[for=notice_data-attach] {
text-indent:-9999px;
left:394px;
width:16px;
height:16px;
}
#form_notice #notice_data-attach {
left:183px;
padding:0;
height:16px;
} }
#form_notice .form_note { #form_notice .form_note {
position:absolute; position:absolute;
@ -509,12 +533,15 @@ margin-bottom:4px;
.entity_profile .entity_nickname { .entity_profile .entity_nickname {
margin-left:11px; margin-left:11px;
display:inline; display:inline;
font-weight:bold;
} }
.entity_profile .entity_nickname { .entity_profile .entity_nickname {
margin-left:0; margin-left:0;
} }
.entity_profile .fn,
.entity_profile .nickname {
font-size:1.1em;
font-weight:bold;
}
.entity_profile .entity_fn dd:before { .entity_profile .entity_fn dd:before {
content: "("; content: "(";
font-weight:normal; font-weight:normal;
@ -574,10 +601,13 @@ display:block;
.form_user_block input.submit, .form_user_block input.submit,
.form_user_unblock input.submit, .form_user_unblock input.submit,
.form_group_block input.submit,
.form_group_unblock input.submit,
.entity_send-a-message a, .entity_send-a-message a,
.entity_edit a, .entity_edit a,
.form_user_nudge input.submit, .form_user_nudge input.submit,
.entity_nudge p { .entity_nudge p,
.form_make_admin input.submit {
border:0; border:0;
padding-left:20px; padding-left:20px;
} }
@ -640,6 +670,7 @@ list-style-type:none;
float:left; float:left;
margin-right:7px; margin-right:7px;
margin-bottom:7px; margin-bottom:7px;
display:inline;
} }
.section .entities li .photo { .section .entities li .photo {
margin-right:0; margin-right:0;
@ -712,12 +743,17 @@ float:left;
width:96.41%; width:96.41%;
border-width:1px; border-width:1px;
border-style:solid; border-style:solid;
padding:1.795%;
margin-bottom:11px; margin-bottom:11px;
} }
.notices li { .notices li {
list-style-type:none; list-style-type:none;
} }
.notices .notices {
margin-top:7px;
margin-left:5%;
width:95%;
float:left;
}
#aside_primary .notice, #aside_primary .notice,
#aside_primary .profile { #aside_primary .profile {
@ -773,6 +809,9 @@ float:left;
width:100%; width:100%;
overflow:hidden; overflow:hidden;
} }
.notice .entry-title.ov {
overflow:visible;
}
#shownotice .notice .entry-title { #shownotice .notice .entry-title {
font-size:2.2em; font-size:2.2em;
} }
@ -797,7 +836,7 @@ clear:left;
float:left; float:left;
font-size:0.95em; font-size:0.95em;
margin-left:59px; margin-left:59px;
width:65%; width:60%;
} }
#showstream .notice div.entry-content, #showstream .notice div.entry-content,
#shownotice .notice div.entry-content { #shownotice .notice div.entry-content {
@ -827,15 +866,12 @@ display:inline-block;
text-transform:lowercase; text-transform:lowercase;
} }
.notice-options { .notice-options {
padding-left:2%;
float:left;
width:50%;
position:relative; position:relative;
font-size:0.95em; font-size:0.95em;
width:12.5%; width:90px;
float:right; float:right;
margin-right:11px;
} }
.notice-options a { .notice-options a {
@ -896,6 +932,74 @@ border:0;
padding:0; padding:0;
} }
.notice .attachment {
position:relative;
padding-left:16px;
}
#attachments .attachment {
padding-left:0;
}
.notice .attachment img {
position:absolute;
top:18px;
left:0;
z-index:99;
}
#shownotice .notice .attachment img {
position:static;
}
#attachments {
clear:both;
float:left;
width:100%;
margin-top:18px;
}
#attachments dt {
font-weight:bold;
font-size:1.3em;
margin-bottom:4px;
}
#attachments ol li {
margin-bottom:18px;
list-style-type:decimal;
float:left;
clear:both;
}
#jOverlayContent,
#jOverlayContent #content,
#jOverlayContent #content_inner {
width: auto !important;
margin-bottom:0;
}
#jOverlayContent #content {
padding:11px;
min-height:auto;
}
#jOverlayContent .external span {
display:block;
margin-bottom:11px;
}
#jOverlayContent button {
position:absolute;
top:0;
right:0;
width:29px;
height:29px;
text-align:center;
font-weight:bold;
padding:0;
}
#jOverlayContent h1 {
max-width:475px;
}
#jOverlayContent #content {
border-radius:7px;
-moz-border-radius:7px;
-webkit-border-radius:7px;
}
#usergroups #new_group { #usergroups #new_group {
float: left; float: left;
@ -1019,8 +1123,6 @@ margin-left:18px;
} }
/* TOP_POSTERS */ /* TOP_POSTERS */
.section tbody td { .section tbody td {
padding-right:11px; padding-right:11px;
@ -1140,6 +1242,18 @@ width:400px;
margin-right:28px; margin-right:28px;
} }
#settings_design_color .form_data li {
width:33%;
}
#settings_design_color .form_data label {
float:none;
display:block;
}
#settings_design_color .form_data .swatch {
padding:11px;
margin-left:0;
}
.instructions ul { .instructions ul {
list-style-position:inside; list-style-position:inside;
} }

View File

@ -10,7 +10,7 @@
@import url(base.css); @import url(base.css);
html { html {
background:#fff url(../images/illustrations/illu_pigeons-01.png) no-repeat 0 100%; background:url(../images/illustrations/illu_pigeons-01.png) no-repeat 0 100%;
} }
body, body,
@ -30,10 +30,10 @@ font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
} }
input, textarea, select, input, textarea, select,
.entity_remote_subscribe { .entity_remote_subscribe {
border-color:#aaa; border-color:#AAAAAA;
} }
#filter_tags ul li { #filter_tags ul li {
border-color:#ddd; border-color:#DDDDDD;
} }
.form_settings input.form_action-primary { .form_settings input.form_action-primary {
@ -50,35 +50,41 @@ background-color:#8F0000;
input:focus, textarea:focus, select:focus, input:focus, textarea:focus, select:focus,
#form_notice.warning #notice_data-text { #form_notice.warning #notice_data-text {
border-color:#8F0000; border-color:#8F0000;
box-shadow:3px 3px 3px rgba(194, 194, 194, 0.3);
-moz-box-shadow:3px 3px 3px rgba(194, 194, 194, 0.3);
-webkit-box-shadow:3px 3px 3px rgba(194, 194, 194, 0.3);
} }
input.submit, input.submit,
.entity_remote_subscribe { .entity_remote_subscribe {
color:#fff; color:#FFFFFF;
} }
a, a,
div.notice-options input, div.notice-options input,
.form_user_block input.submit, .form_user_block input.submit,
.form_user_unblock input.submit, .form_user_unblock input.submit,
.form_group_block input.submit,
.form_group_unblock input.submit,
.entity_send-a-message a, .entity_send-a-message a,
.form_user_nudge input.submit, .form_user_nudge input.submit,
.entity_nudge p, .entity_nudge p,
.form_settings input.form_action-primary { .form_settings input.form_action-primary,
color:#000; .form_make_admin input.submit {
color:#000000;
} }
.notice, .notice,
.profile { .profile {
border-color:#000; border-color:#000000;
} }
.notice a, .notice a,
.profile a { .profile a {
color:#fff; color:#FFFFFF;
} }
.notice:nth-child(3n-1), .notice:nth-child(3n-1),
.profile:nth-child(3n-1) { .profile:nth-child(3n-1) {
border-color:#fff; border-color:#FFFFFF;
} }
.notice:nth-child(3n-1) a, .notice:nth-child(3n-1) a,
.profile:nth-child(3n-1) a { .profile:nth-child(3n-1) a {
@ -90,7 +96,7 @@ border-color:#7F1114;
} }
.notice:nth-child(3n) a, .notice:nth-child(3n) a,
.profile:nth-child(3n) a { .profile:nth-child(3n) a {
color:#000; color:#000000;
} }
.aside .section .notice, .aside .section .notice,
@ -100,30 +106,30 @@ color:#000;
.aside .section .notice:nth-child(3n), .aside .section .notice:nth-child(3n),
.aside .section .profile:nth-child(3n) { .aside .section .profile:nth-child(3n) {
background-color:transparent; background-color:transparent;
color:#000; color:#000000;
} }
.aside .section { .aside .section {
border-color:#fff; border-color:#FFFFFF;
background-color:#fff; background-color:#FFFFFF;
color:#000; color:#000000;
} }
.aside .section:nth-child(n) { .aside .section:nth-child(n) {
border-color:#000; border-color:#000000;
background-color:#000; background-color:#000000;
color:#fff; color:#FFFFFF;
} }
.aside .section:nth-child(3n-1) { .aside .section:nth-child(3n-1) {
border-color:#fff; border-color:#FFFFFF;
background-color:#fff; background-color:#FFFFFF;
color:#000; color:#000000;
} }
.aside .section:nth-child(3n) { .aside .section:nth-child(3n) {
background-color:#7F1114; background-color:#7F1114;
border-color:#7F1114; border-color:#7F1114;
color:#000; color:#000000;
} }
.aside .section a { .aside .section a {
color:#7F1114; color:#7F1114;
@ -132,7 +138,7 @@ color:#7F1114;
color:#7F1114; color:#7F1114;
} }
.aside .section:nth-child(3n) a { .aside .section:nth-child(3n) a {
color:#fff; color:#FFFFFF;
} }
@ -145,33 +151,43 @@ background:url(../images/illustrations/illu_pigeons-02.png) no-repeat 10% 100%;
} }
#notice_text-count { #notice_text-count {
color:#333; color:#333333;
} }
#form_notice.warning #notice_text-count { #form_notice.warning #notice_text-count {
color:#000; color:#000000;
} }
#form_notice label[for=notice_data-attach] {
background:transparent url(../../base/images/icons/twotone/green/clip-01.gif) no-repeat 0 45%;
}
#form_notice #notice_data-attach {
opacity:0;
}
#form_notice.processing #notice_action-submit { #form_notice.processing #notice_action-submit {
background:#fff url(../../base/images/icons/icon_processing.gif) no-repeat 47% 47%; background:#FFFFFF url(../../base/images/icons/icon_processing.gif) no-repeat 47% 47%;
cursor:wait; cursor:wait;
text-indent:-9999px; text-indent:-9999px;
} }
#content, #content,
#site_nav_local_views a { #site_nav_local_views a {
border-color:#fff; border-color:#FFFFFF;
} }
#site_nav_local_views .current a { #site_nav_local_views .current a {
background-color:rgba(143, 0, 0, 0.8); background-color:rgba(143, 0, 0, 0.8);
color:#fff; color:#FFFFFF;
} }
#site_nav_local_views a { #site_nav_local_views a {
background-color:rgba(255, 255, 255, 0.3); background-color:rgba(255, 255, 255, 0.5);
} }
#site_nav_local_views a:hover { #site_nav_local_views a:hover {
background-color:#fff; background-color:rgba(255, 255, 255, 0.9);
color:#8F0000; color:#8F0000;
} }
#site_nav_local_views .current a {
text-shadow: rgba(194,194,194,0.5) 1px 1px 1px;
}
.error { .error {
background-color:#F7E8E8; background-color:#F7E8E8;
@ -181,7 +197,7 @@ background-color:#EFF3DC;
} }
#anon_notice { #anon_notice {
color:#000; color:#000000;
} }
@ -204,7 +220,10 @@ background-image:url(../../base/images/icons/icon_foaf.gif);
.form_user_nudge input.submit, .form_user_nudge input.submit,
.form_user_block input.submit, .form_user_block input.submit,
.form_user_unblock input.submit, .form_user_unblock input.submit,
.entity_nudge p { .form_group_block input.submit,
.form_group_unblock input.submit,
.entity_nudge p,
.form_make_admin input.submit {
background-position: 0 40%; background-position: 0 40%;
background-repeat: no-repeat; background-repeat: no-repeat;
background-color:transparent; background-color:transparent;
@ -214,7 +233,7 @@ background-color:transparent;
.form_user_subscribe input.submit, .form_user_subscribe input.submit,
.form_user_unsubscribe input.submit { .form_user_unsubscribe input.submit {
background-color:#8F0000; background-color:#8F0000;
color:#fff; color:#FFFFFF;
} }
.form_user_unsubscribe input.submit, .form_user_unsubscribe input.submit,
.form_group_leave input.submit, .form_group_leave input.submit,
@ -233,15 +252,22 @@ background-image:url(../../base/images/icons/twotone/green/quote.gif);
background-image:url(../../base/images/icons/twotone/green/mail.gif); background-image:url(../../base/images/icons/twotone/green/mail.gif);
} }
.form_user_block input.submit, .form_user_block input.submit,
.form_user_unblock input.submit { .form_user_unblock input.submit,
.form_group_block input.submit,
.form_group_unblock input.submit {
background-image:url(../../base/images/icons/twotone/green/shield.gif); background-image:url(../../base/images/icons/twotone/green/shield.gif);
} }
.form_make_admin input.submit {
background-image:url(../../base/images/icons/twotone/green/admin.gif);
}
/* NOTICES */ /* NOTICES */
.notices li.over { .notice .attachment {
background-color:#fcfcfc; background:transparent url(../../base/images/icons/twotone/green/clip-02.gif) no-repeat 0 45%;
}
#attachments .attachment {
background:none;
} }
.notice-options .notice_reply a, .notice-options .notice_reply a,
.notice-options form input.submit { .notice-options form input.submit {
background-color:transparent; background-color:transparent;
@ -263,17 +289,36 @@ background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-r
.notices div.notice-options { .notices div.notice-options {
opacity:0.4; opacity:0.4;
} }
.notices li.hover div.entry-content, .notices li:hover div.entry-content,
.notices li.hover div.notice-options { .notices li:hover div.notice-options {
opacity:1; opacity:1;
} }
div.entry-content { div.entry-content {
color:#333; color:#333333;
} }
div.notice-options a, div.notice-options a,
div.notice-options input { div.notice-options input {
font-family:sans-serif; font-family:sans-serif;
} }
#content .notices li:hover {
background-color:transparent;
}
#conversation .notices li:hover {
background-color:transparent;
}
.notices .notices {
background-color:rgba(200, 200, 200, 0.050);
}
.notices .notices .notices {
background-color:rgba(200, 200, 200, 0.100);
}
.notices .notices .notices .notices {
background-color:rgba(200, 200, 200, 0.150);
}
.notices .notices .notices .notices .notices {
background-color:rgba(200, 200, 200, 0.300);
}
/*END: NOTICES */ /*END: NOTICES */
#new_group a { #new_group a {
@ -283,7 +328,7 @@ background:transparent url(../../base/images/icons/twotone/green/news.gif) no-re
.pagination .nav_prev a, .pagination .nav_prev a,
.pagination .nav_next a { .pagination .nav_next a {
background-repeat:no-repeat; background-repeat:no-repeat;
border-color:#000; border-color:#000000;
} }
.pagination .nav_prev a { .pagination .nav_prev a {
background-image:url(../../base/images/icons/twotone/green/arrow-left.gif); background-image:url(../../base/images/icons/twotone/green/arrow-left.gif);