From d25bc74d717e62a537e2e15ce960300e9f25ce0f Mon Sep 17 00:00:00 2001 From: Thomas Keller Date: Sat, 9 Oct 2010 10:09:51 +0000 Subject: [PATCH 01/12] If no branch certificates are attached to a revision, we do not get an empty array back from _getCerts(), but no entry for 'branch' at all. --- src/IDF/Scm/Monotone.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/IDF/Scm/Monotone.php b/src/IDF/Scm/Monotone.php index 13a33e1..74c6b78 100644 --- a/src/IDF/Scm/Monotone.php +++ b/src/IDF/Scm/Monotone.php @@ -413,7 +413,7 @@ class IDF_Scm_Monotone extends IDF_Scm $certs = $scm->_getCerts($revs[0]); // for the very seldom case that a revision // has no branch certificate - if (count($certs['branch']) == 0) { + if (!array_key_exists('branch', $certs)) { $branch = '*'; } else From b51838596248ee17b634f46943c9ec9e7d8b338d Mon Sep 17 00:00:00 2001 From: Thomas Keller Date: Sat, 9 Oct 2010 10:40:30 +0000 Subject: [PATCH 02/12] Introduce a per-project issue template to hint a reporter to provide certain information in his issue report (closes issue 540). --- src/IDF/Form/Admin/ProjectCreate.php | 1 + src/IDF/Form/IssueCreate.php | 5 ++++- src/IDF/Form/IssueTrackingConf.php | 20 +++++++++++++++++-- src/IDF/Views/Project.php | 5 +++-- .../templates/idf/admin/issue-tracking.html | 6 ++++++ 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/IDF/Form/Admin/ProjectCreate.php b/src/IDF/Form/Admin/ProjectCreate.php index d297f14..f6b75a8 100644 --- a/src/IDF/Form/Admin/ProjectCreate.php +++ b/src/IDF/Form/Admin/ProjectCreate.php @@ -313,6 +313,7 @@ class IDF_Form_Admin_ProjectCreate extends Pluf_Form 'labels_download_one_max' => IDF_Form_UploadConf::init_one_max, 'labels_wiki_predefined' => IDF_Form_WikiConf::init_predefined, 'labels_wiki_one_max' => IDF_Form_WikiConf::init_one_max, + 'labels_issue_template' => IDF_Form_IssueTrackingConf::init_template, 'labels_issue_open' => IDF_Form_IssueTrackingConf::init_open, 'labels_issue_closed' => IDF_Form_IssueTrackingConf::init_closed, 'labels_issue_predefined' => IDF_Form_IssueTrackingConf::init_predefined, diff --git a/src/IDF/Form/IssueCreate.php b/src/IDF/Form/IssueCreate.php index 56f9ceb..3c38e7b 100644 --- a/src/IDF/Form/IssueCreate.php +++ b/src/IDF/Form/IssueCreate.php @@ -45,6 +45,9 @@ class IDF_Form_IssueCreate extends Pluf_Form or $this->user->hasPerm('IDF.project-member', $this->project)) { $this->show_full = true; } + $contentTemplate = $this->project->getConf()->getVal( + 'labels_issue_template', IDF_Form_IssueTrackingConf::init_template + ); $this->fields['summary'] = new Pluf_Form_Field_Varchar( array('required' => true, 'label' => __('Summary'), @@ -57,7 +60,7 @@ class IDF_Form_IssueCreate extends Pluf_Form $this->fields['content'] = new Pluf_Form_Field_Varchar( array('required' => true, 'label' => __('Description'), - 'initial' => '', + 'initial' => $contentTemplate, 'widget' => 'Pluf_Form_Widget_TextareaInput', 'widget_attrs' => array( 'cols' => 58, diff --git a/src/IDF/Form/IssueTrackingConf.php b/src/IDF/Form/IssueTrackingConf.php index ae7a9d0..0aa4f59 100644 --- a/src/IDF/Form/IssueTrackingConf.php +++ b/src/IDF/Form/IssueTrackingConf.php @@ -31,6 +31,15 @@ class IDF_Form_IssueTrackingConf extends Pluf_Form * Defined as constants to easily access the value in the * IssueUpdate/Create form in the case nothing is in the db yet. */ + const init_template = 'Steps to reproduce the problem: +1. +2. +3. + +Expected result: + +Actual result: +'; const init_open = 'New = Issue has not had initial review yet Accepted = Problem reproduced / Need acknowledged Started = Work on this issue has begun'; @@ -66,6 +75,15 @@ Maintainability = Hinders future changes'; public function initFields($extra=array()) { + $this->fields['labels_issue_template'] = new Pluf_Form_Field_Varchar( + array('required' => false, + 'label' => __('Define an issue template to hint the reporter to provide certain information'), + 'initial' => self::init_template, + 'widget_attrs' => array('rows' => 7, + 'cols' => 75), + 'widget' => 'Pluf_Form_Widget_TextareaInput', + )); + $this->fields['labels_issue_open'] = new Pluf_Form_Field_Varchar( array('required' => true, 'label' => __('Open issue status values'), @@ -99,8 +117,6 @@ Maintainability = Hinders future changes'; 'widget_attrs' => array('size' => 60), )); - - } } diff --git a/src/IDF/Views/Project.php b/src/IDF/Views/Project.php index 48ed153..a12bafd 100644 --- a/src/IDF/Views/Project.php +++ b/src/IDF/Views/Project.php @@ -277,7 +277,8 @@ class IDF_Views_Project } } else { $params = array(); - $keys = array('labels_issue_open', 'labels_issue_closed', + $keys = array('labels_issue_template', + 'labels_issue_open', 'labels_issue_closed', 'labels_issue_predefined', 'labels_issue_one_max'); foreach ($keys as $key) { $_val = $conf->getVal($key, false); @@ -535,4 +536,4 @@ class IDF_Views_Project ), $request); } -} \ No newline at end of file +} diff --git a/src/IDF/templates/idf/admin/issue-tracking.html b/src/IDF/templates/idf/admin/issue-tracking.html index f835a68..fb5766c 100644 --- a/src/IDF/templates/idf/admin/issue-tracking.html +++ b/src/IDF/templates/idf/admin/issue-tracking.html @@ -4,6 +4,12 @@
+ + +
{$form.f.labels_issue_template.labelTag}:
+{if $form.f.labels_issue_template.errors}{$form.f.labels_issue_template.fieldErrors}{/if} +{$form.f.labels_issue_template|unsafe} +
{$form.f.labels_issue_open.labelTag}:
{if $form.f.labels_issue_open.errors}{$form.f.labels_issue_open.fieldErrors}{/if} {$form.f.labels_issue_open|unsafe} From 5af2ab4d97e8fb99ae9d4c345b241a96d6c3ef52 Mon Sep 17 00:00:00 2001 From: Thomas Keller Date: Sat, 9 Oct 2010 11:53:01 +0000 Subject: [PATCH 03/12] Make the timeline view and RSS feeds filterable by model (closes issue 543). --- src/IDF/Views/Project.php | 151 +++++++++++--------- src/IDF/conf/urls.php | 6 +- src/IDF/templates/idf/js-hotkeys.html | 2 +- src/IDF/templates/idf/project/home.html | 2 +- src/IDF/templates/idf/project/timeline.html | 24 +--- 5 files changed, 94 insertions(+), 91 deletions(-) diff --git a/src/IDF/Views/Project.php b/src/IDF/Views/Project.php index a12bafd..20854d9 100644 --- a/src/IDF/Views/Project.php +++ b/src/IDF/Views/Project.php @@ -61,6 +61,66 @@ class IDF_Views_Project $request); } + /** + * Returns an associative array with available model filters + * + * @return array + */ + private static function getAvailableModelFilters() + { + return array( + 'all' => __('All Updates'), + 'commits' => __('Commits'), + 'issues' => __('Issues and Comments'), + 'downloads' => __('Downloads'), + 'documents' => __('Documents'), + 'reviews' => __('Reviews and Patches'), + ); + } + + /** + * Returns an array of model classes for which the current user + * has rights and which should be used according to his filter + * + * @param object $request + * @param string $model_filter + * @return array + */ + private static function determineModelClasses($request, $model_filter = 'all') + { + $classes = array(); + if (true === IDF_Precondition::accessSource($request) && + ($model_filter == 'all' || $model_filter == 'commits')) { + $classes[] = '\'IDF_Commit\''; + // FIXME: this looks like a hack... + IDF_Scm::syncTimeline($request->project); + } + if (true === IDF_Precondition::accessIssues($request) && + ($model_filter == 'all' || $model_filter == 'issues')) { + $classes[] = '\'IDF_Issue\''; + $classes[] = '\'IDF_IssueComment\''; + } + if (true === IDF_Precondition::accessDownloads($request) && + ($model_filter == 'all' || $model_filter == 'downloads')) { + $classes[] = '\'IDF_Upload\''; + } + if (true === IDF_Precondition::accessWiki($request) && + ($model_filter == 'all' || $model_filter == 'documents')) { + $classes[] = '\'IDF_WikiPage\''; + $classes[] = '\'IDF_WikiRevision\''; + } + if (true === IDF_Precondition::accessReview($request) && + ($model_filter == 'all' || $model_filter == 'reviews')) { + $classes[] = '\'IDF_Review_Comment\''; + $classes[] = '\'IDF_Review_Patch\''; + } + if (count($classes) == 0) { + $classes[] = '\'IDF_Dummy\''; + } + + return $classes; + } + /** * Timeline of the project. */ @@ -68,38 +128,21 @@ class IDF_Views_Project public function timeline($request, $match) { $prj = $request->project; - $title = sprintf(__('%s Updates'), (string) $prj); - $team = $prj->getMembershipData(); + + $model_filter = @$match[2]; + $all_model_filters = self::getAvailableModelFilters(); + if (!array_key_exists($model_filter, $all_model_filters)) { + $model_filter = 'all'; + } + $title = (string)$prj . ' ' . $all_model_filters[$model_filter]; $pag = new IDF_Timeline_Paginator(new IDF_Timeline()); $pag->class = 'recent-issues'; $pag->item_extra_props = array('request' => $request); $pag->summary = __('This table shows the project updates.'); - // Need to check the rights - $rights = array(); - if (true === IDF_Precondition::accessSource($request)) { - $rights[] = '\'IDF_Commit\''; - IDF_Scm::syncTimeline($request->project); - } - if (true === IDF_Precondition::accessIssues($request)) { - $rights[] = '\'IDF_Issue\''; - $rights[] = '\'IDF_IssueComment\''; - } - if (true === IDF_Precondition::accessDownloads($request)) { - $rights[] = '\'IDF_Upload\''; - } - if (true === IDF_Precondition::accessWiki($request)) { - $rights[] = '\'IDF_WikiPage\''; - $rights[] = '\'IDF_WikiRevision\''; - } - if (true === IDF_Precondition::accessReview($request)) { - $rights[] = '\'IDF_Review_Comment\''; - $rights[] = '\'IDF_Review_Patch\''; - } - if (count($rights) == 0) { - $rights[] = '\'IDF_Dummy\''; - } - $sql = sprintf('model_class IN (%s)', implode(', ', $rights)); + + $classes = self::determineModelClasses($request, $model_filter); + $sql = sprintf('model_class IN (%s)', implode(', ', $classes)); $pag->forced_where = new Pluf_SQL('project=%s AND '.$sql, array($prj->id)); $pag->sort_order = array('creation_dtime', 'ASC'); @@ -113,32 +156,23 @@ class IDF_Views_Project $pag->items_per_page = 20; $pag->no_results_text = __('No changes were found.'); $pag->setFromRequest($request); - $downloads = array(); - if ($request->rights['hasDownloadsAccess']) { - $tags = IDF_Views_Download::getDownloadTags($prj); - // the first tag is the featured, the last is the deprecated. - $downloads = $tags[0]->get_idf_upload_list(); - } - $pages = array(); - if ($request->rights['hasWikiAccess']) { - $tags = IDF_Views_Wiki::getWikiTags($prj); - $pages = $tags[0]->get_idf_wikipage_list(); - } + if (!$request->user->isAnonymous() and $prj->isRestricted()) { $feedurl = Pluf_HTTP_URL_urlForView('idf_project_timeline_feed_auth', array($prj->shortname, + $model_filter, IDF_Precondition::genFeedToken($prj, $request->user))); } else { $feedurl = Pluf_HTTP_URL_urlForView('idf_project_timeline_feed', - array($prj->shortname)); + array($prj->shortname, $model_filter)); } return Pluf_Shortcuts_RenderToResponse('idf/project/timeline.html', array( 'page_title' => $title, 'feedurl' => $feedurl, 'timeline' => $pag, - 'team' => $team, - 'downloads' => $downloads, + 'model_filter' => $model_filter, + 'all_model_filters' => $all_model_filters, ), $request); @@ -156,31 +190,17 @@ class IDF_Views_Project public function timelineFeed($request, $match) { $prj = $request->project; - // Need to check the rights - $rights = array(); - if (true === IDF_Precondition::accessSource($request)) { - $rights[] = '\'IDF_Commit\''; - IDF_Scm::syncTimeline($request->project); + $model_filter = @$match[2]; + + $model_filter = @$match[2]; + $all_model_filters = self::getAvailableModelFilters(); + if (!array_key_exists($model_filter, $all_model_filters)) { + $model_filter = 'all'; } - if (true === IDF_Precondition::accessIssues($request)) { - $rights[] = '\'IDF_Issue\''; - $rights[] = '\'IDF_IssueComment\''; - } - if (true === IDF_Precondition::accessDownloads($request)) { - $rights[] = '\'IDF_Upload\''; - } - if (true === IDF_Precondition::accessWiki($request)) { - $rights[] = '\'IDF_WikiPage\''; - $rights[] = '\'IDF_WikiRevision\''; - } - if (true === IDF_Precondition::accessReview($request)) { - $rights[] = '\'IDF_Review_Comment\''; - $rights[] = '\'IDF_Review_Patch\''; - } - if (count($rights) == 0) { - $rights[] = '\'IDF_Dummy\''; - } - $sqls = sprintf('model_class IN (%s)', implode(', ', $rights)); + $title = $all_model_filters[$model_filter]; + + $classes = self::determineModelClasses($request, $model_filter); + $sqls = sprintf('model_class IN (%s)', implode(', ', $classes)); $sql = new Pluf_SQL('project=%s AND '.$sqls, array($prj->id)); $params = array( 'filter' => $sql->gen(), @@ -203,7 +223,6 @@ class IDF_Views_Project } $out = Pluf_Template::markSafe(implode("\n", $out)); $tmpl = new Pluf_Template('idf/index.atom'); - $title = __('Updates'); $feedurl = Pluf::f('url_base').Pluf::f('idf_base').$request->query; $viewurl = Pluf_HTTP_URL_urlForView('IDF_Views_Project::timeline', array($prj->shortname)); diff --git a/src/IDF/conf/urls.php b/src/IDF/conf/urls.php index c01e565..1afe134 100644 --- a/src/IDF/conf/urls.php +++ b/src/IDF/conf/urls.php @@ -74,18 +74,18 @@ $ctl[] = array('regex' => '#^/p/([\-\w]+)/$#', 'model' => 'IDF_Views_Project', 'method' => 'home'); -$ctl[] = array('regex' => '#^/p/([\-\w]+)/timeline/$#', +$ctl[] = array('regex' => '#^/p/([\-\w]+)/timeline/(\w+)/$#', 'base' => $base, 'model' => 'IDF_Views_Project', 'method' => 'timeline'); -$ctl[] = array('regex' => '#^/p/([\-\w]+)/feed/timeline/$#', +$ctl[] = array('regex' => '#^/p/([\-\w]+)/feed/timeline/(\w+)/$#', 'base' => $base, 'model' => 'IDF_Views_Project', 'method' => 'timelineFeed', 'name' => 'idf_project_timeline_feed'); -$ctl[] = array('regex' => '#^/p/([\-\w]+)/feed/timeline/token/(.*)/$#', +$ctl[] = array('regex' => '#^/p/([\-\w]+)/feed/timeline/(\w+)/token/(.*)/$#', 'base' => $base, 'model' => 'IDF_Views_Project', 'method' => 'timelineFeed', diff --git a/src/IDF/templates/idf/js-hotkeys.html b/src/IDF/templates/idf/js-hotkeys.html index ee39cac..66793fb 100644 --- a/src/IDF/templates/idf/js-hotkeys.html +++ b/src/IDF/templates/idf/js-hotkeys.html @@ -3,7 +3,7 @@ // {block extraheader}{/block} {block pagetitle}{$page_title|strip_tags}{/block}{if $project} - {$project.shortdesc}{/if} +
-{if $project}

{$project}

{/if} -

-{if !$user.isAnonymous()}{aurl 'url', 'idf_dashboard'}{blocktrans}Welcome, {$user}.{/blocktrans} {trans 'Sign Out'}{else}{trans 'Sign in or create your account'}{/if} -{if $project} | {trans 'Project List'}{/if} -| {trans 'Help'} -

+ {if $project}

{$project}

{/if} + {include 'idf/main-menu.html'}
-
+
-
+
{if $user and $user.id}{getmsgs $user}{/if} -
{block body}{/block}
-
+
{block body}{/block}
+
{block foot}{/block}
- {include 'idf/js-hotkeys.html'} {block javascript}{/block} {if $project} {/if} diff --git a/src/IDF/templates/idf/base-simple.html b/src/IDF/templates/idf/base-simple.html index a88f42d..98dd8d1 100644 --- a/src/IDF/templates/idf/base-simple.html +++ b/src/IDF/templates/idf/base-simple.html @@ -29,31 +29,27 @@ {block extraheader}{/block} {block pagetitle}{$page_title|strip_tags}{/block} +
-

-{if !$user.isAnonymous()}{aurl 'url', 'idf_dashboard'}{blocktrans}Welcome, {$user}.{/blocktrans} {trans 'Sign Out'}{else}{trans 'Sign in or create your account'}{/if} - | {trans 'Project List'} {if $isAdmin}| {trans 'Forge Management'}{/if} -| {trans 'Help'} -

-

{block title}{$page_title}{/block}

+ {include 'idf/main-menu.html'} +

{block title}{$page_title}{/block}

-
+
-
+
{if $user and $user.id}{getmsgs $user}{/if} -
{block body}{/block}
-
+
{block body}{/block}
+
{block context}{/block}
{block foot}{/block}
- {include 'idf/js-hotkeys.html'} {block javascript}{/block} diff --git a/src/IDF/templates/idf/base.html b/src/IDF/templates/idf/base.html index 6a8182b..772bbd5 100644 --- a/src/IDF/templates/idf/base.html +++ b/src/IDF/templates/idf/base.html @@ -29,23 +29,19 @@ {block extraheader}{/block} {block pagetitle}{$page_title|strip_tags}{/block}{if $project} - {$project.shortdesc}{/if} +
-{if $project}

{$project}

{/if} -

-{if !$user.isAnonymous()}{aurl 'url', 'idf_dashboard'}{blocktrans}Welcome, {$user}.{/blocktrans} {trans 'Sign Out'}{else}{trans 'Sign in or create your account'}{/if} -{if $project} | {trans 'Project List'}{/if} -{if $isAdmin}| {trans 'Forge Management'}{/if} -| {trans 'Help'} -

+ {if $project}

{$project}

{/if} + {include 'idf/main-menu.html'}
-
+
-
+
{if $user and $user.id}{getmsgs $user}{/if} -
{block body}{/block}
-
+
{block body}{/block}
+
{block context}{/block}
{block foot}{/block}
- {include 'idf/js-hotkeys.html'} {block javascript}{/block} {if $project} {/if} diff --git a/src/IDF/templates/idf/gadmin/base.html b/src/IDF/templates/idf/gadmin/base.html index 1858682..b68a99d 100644 --- a/src/IDF/templates/idf/gadmin/base.html +++ b/src/IDF/templates/idf/gadmin/base.html @@ -29,16 +29,12 @@ {block extraheader}{/block} {block pagetitle}{$page_title|strip_tags}{/block} +
-

-{aurl 'url', 'IDF_Views_User::dashboard'}{blocktrans}Welcome, {$user}.{/blocktrans} {trans 'Sign Out'} -| {trans 'Project List'} -| {trans 'Forge Management'} -| {trans 'Help'} -

+ {include 'idf/main-menu.html'} - {include 'idf/js-hotkeys.html'} {block javascript}{/block} diff --git a/src/IDF/templates/idf/main-menu.html b/src/IDF/templates/idf/main-menu.html new file mode 100644 index 0000000..1afd4d2 --- /dev/null +++ b/src/IDF/templates/idf/main-menu.html @@ -0,0 +1,31 @@ + + + +{if $allProjects.count() != 0} + +{/if} + diff --git a/www/media/idf/css/style.css b/www/media/idf/css/style.css index d1e0187..1135c05 100644 --- a/www/media/idf/css/style.css +++ b/www/media/idf/css/style.css @@ -19,92 +19,92 @@ # # ***** END LICENSE BLOCK ***** */ -body { +body { font-family: arial, helvetica, sans-serif; } -.top { +.top { margin-top: 5px; } -a:link { - color: #00e; +a:link { + color: #00e; } -a:visited { +a:visited { color: #551a8b; -} - -a:active{ - color: #f00; } -.yui-g { +a:active{ + color: #f00; +} + +.yui-g { padding: 0 1em; } -.right { +.right { text-align: right; } -.a-c { +.a-c { text-align: center !important; } -.dellink { - float: right; - position: relative; +.dellink { + float: right; + position: relative; } -.dellink a { +.dellink a { color: #a00; } -a.userw { +a.userw { color: #000; } -.mono { +.mono { font-family: monospace; } -.soft { +.soft { color: #777; } -.soft a { +.soft a { color: #777; } -a.soft { +a.soft { color: #777; } -a.soft:visited { +a.soft:visited { color: #777; } -div.context { +div.context { padding-left: 1em; } /** * Form */ -form.star { +form.star { display: inline; } -table.form th, table.form td { +table.form th, table.form td { border: none; vertical-align: top; } -table.form th { +table.form th { text-align: right; font-weight: normal; } -.px-message-error { +.px-message-error { padding-left: 37px; background: url("../img/dialog-error.png"); background-repeat: no-repeat; @@ -114,12 +114,12 @@ table.form th { padding-bottom: 5px; } -ul.errorlist { +ul.errorlist { color: #c00; font-weight: bold; } -div.user-messages { +div.user-messages { border: 1px solid rgb(229, 225, 169); background-color: #fffde3; margin-bottom: 1em; @@ -127,7 +127,7 @@ div.user-messages { width: 90%; } -div.theterms { +div.theterms { border: 1px solid rgb(229, 225, 169); background-color: #fffde3; padding: 1em 1em 0 1em; @@ -137,92 +137,92 @@ div.theterms { /** * Recent issues */ -table.recent-issues { +table.recent-issues { width: 90%; } -table.minsize { +table.minsize { width: auto !important; } -table.recent-issues tr.log { - border-bottom: 1px solid #e7ebe3; +table.recent-issues tr.log { + border-bottom: 1px solid #e7ebe3; } -table.recent-issues th { - background-color: #e4e8E0; +table.recent-issues th { + background-color: #e4e8E0; vertical-align: top; border-color: #d3d7cf; } -table.recent-issues tr { +table.recent-issues tr { border-left: 1px solid #d3d7cf; border-right: 1px solid #d3d7cf; border-bottom: 1px solid #d3d7cf; } -table.recent-issues td { +table.recent-issues td { border: none; vertical-align: top; } -table.recent-issues tfoot th { +table.recent-issues tfoot th { text-align: right; } -table.recent-issues tfoot th a { +table.recent-issues tfoot th a { color: #000; font-weight: normal; } -table.recent-issues th a.px-current-page { +table.recent-issues th a.px-current-page { font-weight: bold; text-decoration: none; } -span.px-sort { +span.px-sort { font-weight: normal; font-size: 70%; - white-space: nowrap; + white-space: nowrap; padding-left: 1em; } -span.px-header-title { - white-space: nowrap; +span.px-header-title { + white-space: nowrap; } -span.px-header-title a, span.px-header-title a:link, span.px-header-title a:visited, span.px-header-title a:active { +span.px-header-title a, span.px-header-title a:link, span.px-header-title a:visited, span.px-header-title a:active { color: #000; } /** * Issue */ -a.issue-c { +a.issue-c { text-decoration: line-through; } -pre.issue-comment-text { - font-family: monospace; +pre.issue-comment-text { + font-family: monospace; line-height: 1.2; /* to be nice also with links */ } -div.issue-comment { +div.issue-comment { border-left: 3px solid #8ae234; border-bottom: 1px solid #d3d7cf; border-right: 1px solid #d3d7cf; padding: 0.5em; } -.issue-comment-focus { - border-right: 3px solid #8ae234 !important; +.issue-comment-focus { + border-right: 3px solid #8ae234 !important; } -div.issue-comment-first { +div.issue-comment-first { border-top: 1px solid #d3d7cf; } -div.issue-comment-signin { +div.issue-comment-signin { -moz-border-radius: 0 0 3px 3px; -webkit-border-radius: 3px; -webkit-border-top-left-radius: 0; @@ -231,11 +231,11 @@ div.issue-comment-signin { padding: 4px; } -div.issue-comment-signin a { +div.issue-comment-signin a { color: #000; } -div.issue-changes { +div.issue-changes { background-color: #d3d7cf; -moz-border-radius: 3px; -webkit-border-radius: 3px; @@ -243,7 +243,7 @@ div.issue-changes { width: 60%; } -div.issue-changes-timeline { +div.issue-changes-timeline { background-color: #eeeeec; -moz-border-radius: 3px; -webkit-border-radius: 3px; @@ -253,7 +253,7 @@ div.issue-changes-timeline { color: #888a85; } -div.issue-submit-info { +div.issue-submit-info { background-color: #d3d7cf; -moz-border-radius: 3px; -webkit-border-radius: 3px; @@ -261,47 +261,47 @@ div.issue-submit-info { margin-bottom: 1em; } -div.issue-submit-info h2 { +div.issue-submit-info h2 { margin-top: 0; } -span.label { +span.label { color: #204a87; padding-left: 0.5em; } -a.label { +a.label { color: #204a87; text-decoration: none; } -.label { +.label { color: #204a87; } -span.nobrk { +span.nobrk { white-space: nowrap; } hr { visibility: hidden; } -hr.attach { - visibility: visible; +hr.attach { + visibility: visible; border: 0; background-color: #d3d7cf; color: #d3d7cf; width: 40%; } -textarea { +textarea { font-family: monospace; } -h1.title { +h1.title { font-weight: normal; } -h1.project-title { +h1.project-title { font-weight: normal; float: right; z-index: 100; @@ -310,55 +310,55 @@ h1.project-title { margin-bottom: 0; } -.note { +.note { font-size: 80%; } -.smaller { +.smaller { font-size: 90%; } -span.active { +span.active { font-weight: bold; } -.helptext { +.helptext { font-size: 80%; color: #555753; } -div.container { +div.container { clear: both; } -.sep { +.sep { margin: 0 0.3em; } /** * Tabs */ -#main-tabs { +#main-tabs { line-height: normal; } -#main-tabs a { +#main-tabs a { background-color: #d3d7cf; -moz-border-radius: 3px 3px 0 0; -webkit-border-radius: 3px; -webkit-border-bottom-left-radius: 0; -webkit-border-bottom-right-radius: 0; - padding: 4px 4px 0 4px; + padding: 4px 4px 0 4px; text-decoration: none; color: #2e3436; font-weight: 600; } -#main-tabs a.active { +#main-tabs a.active { background-color: #a5e26a; } -#sub-tabs { +#sub-tabs { background-color: #a5e26a; -moz-border-radius: 0 3px 3px 3px; -webkit-border-radius: 3px; @@ -366,63 +366,63 @@ div.container { padding: 4px; } -#sub-tabs a { +#sub-tabs a { color: #2e3436; } -#sub-tabs a.active { +#sub-tabs a.active { text-decoration: none; } /** * Tree list */ -table.tree-list { +table.tree-list { width: 100%; } -table.tree-list th { - background-color: #e4e8E0; +table.tree-list th { + background-color: #e4e8E0; vertical-align: top; - border-color: #d3d7cf; + border-color: #d3d7cf; } -table.tree-list tr { +table.tree-list tr { border-left: 1px solid #d3d7cf; border-right: 1px solid #d3d7cf; border-bottom: 1px solid #d3d7cf; } -table.tree-list td { +table.tree-list td { border: none; vertical-align: top; } -table.tree-list tfoot th, table.code tfoot th { +table.tree-list tfoot th, table.code tfoot th { text-align: right; font-weight: normal; } -table.tree-list tfoot th a, table.code tfoot th a { +table.tree-list tfoot th a, table.code tfoot th a { color: #000; font-weight: normal; } -table.tree-list tfoot th ul, table.code tfoot th ul { +table.tree-list tfoot th ul, table.code tfoot th ul { text-align: left; font-size: 85%; } -table.tree-list tr.log { - border-bottom: 1px solid #e7ebe3; +table.tree-list tr.log { + border-bottom: 1px solid #e7ebe3; /* background-color: #eef2ea !important; */ } -table.tree-list tr.extra { +table.tree-list tr.extra { /* border-bottom: 1px solid #e7ebe3; */ /* background-color: #eef2ea !important; */ } -table td.fileicon { +table td.fileicon { width: 20px; } @@ -452,15 +452,15 @@ table td.fileicon { padding: 2px 5px; cursor: default; display: block; - /* - if width will be 100% horizontal scrollbar will apear + /* + if width will be 100% horizontal scrollbar will apear when scroll mode will be used */ /*width: 100%;*/ font: menu; font-size: 12px; - /* - it is very important, if line-height not setted or setted + /* + it is very important, if line-height not setted or setted in relative units scroll will be broken in firefox */ line-height: 16px; @@ -480,7 +480,7 @@ table td.fileicon { color: white; } -table.disp th, table.disp td { +table.disp th, table.disp td { border: none; vertical-align: top; } @@ -488,48 +488,48 @@ table.disp th, table.disp td { /** * Commit */ -table.commit th, table.commit td { +table.commit th, table.commit td { border: none; vertical-align: top; } -table.commit th { +table.commit th { text-align: right; font-weight: normal; } -table.commit td, table.commit th { +table.commit td, table.commit th { padding: 3px; } /** * syntax highlighting of diffs */ -table.diff { +table.diff { border-bottom: 1px solid #d3d7cf; width: 100%; } -table.diff th { - background-color: #e4e8E0; +table.diff th { + background-color: #e4e8E0; vertical-align: top; - border-color: #d3d7cf; + border-color: #d3d7cf; } -table.diff tr { +table.diff tr { border-left: 1px solid #d3d7cf; border-right: 1px solid #d3d7cf; border-bottom: none; border-top: none; } -table.diff td { +table.diff td { font-size: 90%; vertical-align: top; padding: 1px; border-color: inherit; } -table.diff td.diff-lc { +table.diff td.diff-lc { text-align: right; padding: 1px 5px; border-color: inherit; @@ -538,27 +538,27 @@ table.diff td.diff-lc { width: 3em; } -td.diff-a { +td.diff-a { background-color: #dfd; } -td.diff-r { +td.diff-r { background-color: #fdd; } -td.diff-a, td.diff-r, td.diff-c { +td.diff-a, td.diff-r, td.diff-c { border-bottom: none; border-top: none; } -table.diff tr.diff-next { - background-color: #e4e8E0; +table.diff tr.diff-next { + background-color: #e4e8E0; vertical-align: top; text-align: right; - border-color: #d3d7cf; + border-color: #d3d7cf; } -table.diff tr.diff-next td { +table.diff tr.diff-next td { padding: 1px 5px; } @@ -566,33 +566,33 @@ table.diff tr.diff-next td { /** * view file content */ -table.code { +table.code { border-bottom: 1px solid #d3d7cf; border-top: 1px solid #d3d7cf; width: 100%; } -table.code th { - background-color: #e4e8E0; +table.code th { + background-color: #e4e8E0; vertical-align: top; - border-color: #d3d7cf; + border-color: #d3d7cf; } -table.code tr { +table.code tr { border-left: 1px solid #d3d7cf; border-right: 1px solid #d3d7cf; border-bottom: none; border-top: none; } -table.code td { +table.code td { font-size: 90%; vertical-align: top; padding: 1px; border-color: inherit; } -table.code td.code { +table.code td.code { border: none; /* Whitespace hacking from: http://ln.hixie.ch/ */ white-space: pre; /* CSS2 */ @@ -601,11 +601,11 @@ table.code td.code { white-space: -o-pre-wrap; /* Opera 7 */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: pre-wrap; /* CSS 2.1 */ - word-wrap: break-word; /* IE */ + word-wrap: break-word; /* IE */ padding-left: 5px; } -table.code td.code-lc { +table.code td.code-lc { text-align: right; padding: 1px 5px; border-color: inherit; @@ -614,7 +614,7 @@ table.code td.code-lc { width: 3em; } -table.code td.code-lc a { +table.code td.code-lc a { color: #555753; text-decoration: none; } @@ -622,7 +622,7 @@ table.code td.code-lc a { /** * Download */ -div.download-file { +div.download-file { padding: 1em 1em 1em 3em; background: url("../img/down-large.png"); background-repeat: no-repeat; @@ -635,14 +635,14 @@ div.download-file { -webkit-border-radius: 5px; } -table.download { +table.download { margin-top: 1.5em; } /** * Wiki */ -p.desc { +p.desc { background-color: #eeeeec; -moz-border-radius: 3px; -webkit-border-radius: 3px; @@ -650,7 +650,7 @@ p.desc { width: 60%; } -div.old-rev { +div.old-rev { padding: 1em 1em 0.1em 1em; margin-bottom: 1em; background-color: #bbe394; @@ -659,7 +659,7 @@ div.old-rev { -webkit-border-radius: 5px; } -div.deprecated-page { +div.deprecated-page { padding: 1em 1em 0.1em 3em; margin-bottom: 1em; background: url("../img/warning-large.png"); @@ -673,16 +673,16 @@ div.deprecated-page { } -.delp { - float: right; - position: relative; +.delp { + float: right; + position: relative; } -.delp a { +.delp a { color: #a00; } -#branding { +#branding { float: right; position: relative; margin-right: -10px; @@ -692,7 +692,7 @@ div.deprecated-page { text-align: right; padding-right: 20px; padding-left: 0px; - background-color: #eeeeec; + background-color: #eeeeec; -moz-border-radius: 3px 0 0 3px; -webkit-border-radius: 3px; -webkit-border-top-right-radius: 0; @@ -704,15 +704,96 @@ div.deprecated-page { background-position: top right; } -#branding a { +#branding a { color: #777; } -#branding a:visited { +#branding a:visited { color: #777; } -#ft { +#ft { padding: 0px; margin: 0px; } + +/** + * main menu + */ +#main-menu { + padding: 0; + margin: 5px 0 13px; +} + +#main-menu > li { + list-style-type: none; + margin-left: 5px; + padding-left: 5px; + border-left: 1px solid black; + display: inline-block; + line-height: 1em; +} + +#main-menu > li:first-child { + margin-left: 0; + padding-left: 0; + border-left: none; +} + +/** + * project list popup + */ +#project-list { + position: relative; + padding-left: 0 !important; +} + +#project-list > a { + padding-left: 5px; + padding-right: 5px; + margin-top: -3px; + padding-top: 3px; +} + +#project-list + li { + margin-left: 0; +} + +#project-list ul { + display: none; + background: #A5E26A; + border-top: 0; + position: absolute; + padding: 5px 5px 5px 20px; + margin: 0; + z-index: 1000; + top: 1.1em; + -moz-border-radius: 0 3px 3px 3px; + border-radius: 0 3px 3px 3px; + -moz-box-shadow: 0 10px 20px #333; + -webkit-box-shadow: 0 10px 20px #333; + box-shadow: 0 10px 20px #333; + +} + +#project-list ul li { + padding: 5px; + padding-left: 0; + white-space: nowrap; + font-size: 0.95em; + list-style-type: square; +} + +#project-list ul li a { + text-decoration: none; +} + +#project-list:hover > a { + background: #A5E26A; + text-decoration: none; +} + +#project-list:hover a { + color: #2E3436; +} + From 1887e9effda23af41e2a91b42bc19c9cd323ddf4 Mon Sep 17 00:00:00 2001 From: Thomas Keller Date: Fri, 15 Oct 2010 12:35:50 +0000 Subject: [PATCH 12/12] Ensure that the project list popup doesn't exceed the page height when many projects are listed - instead make it scrollable. --- www/media/idf/css/style.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/www/media/idf/css/style.css b/www/media/idf/css/style.css index 1135c05..5432de4 100644 --- a/www/media/idf/css/style.css +++ b/www/media/idf/css/style.css @@ -773,7 +773,9 @@ div.deprecated-page { -moz-box-shadow: 0 10px 20px #333; -webkit-box-shadow: 0 10px 20px #333; box-shadow: 0 10px 20px #333; - + max-height: 400px; + overflow-x: hidden; + overflow-y: auto; } #project-list ul li {